Formatting
[jalview.git] / src / jalview / util / MapList.java
index defa670..215ece9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Copyright (C) 2007 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
@@ -30,110 +30,151 @@ import java.util.*;
  */
 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 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;i<from.length; i+=2)
-        fromShifts.add(new int[] { from[i], from[i+1]});
+    for (int i = 0; i < from.length; i += 2)
+    {
+      fromShifts.add(new int[]
+                     {from[i], from[i + 1]});
+    }
     toShifts = new Vector();
-    for (int i=0;i<to.length; i+=2)
-        toShifts.add(new int[] { to[i], to[i+1]});
-    this.fromRatio=fromRatio;
-    this.toRatio=toRatio;
+    for (int i = 0; i < to.length; i += 2)
+    {
+      toShifts.add(new int[]
+                   {to[i], to[i + 1]});
+    }
+    this.fromRatio = fromRatio;
+    this.toRatio = toRatio;
   }
+
   /**
    * get all mapped positions from 'from' to 'to'
    * @return int[][] { int[] { fromStart, fromFinish, toStart, toFinish }, int [fromFinish-fromStart+2] { toStart..toFinish mappings}}
    */
-  public int[][] makeFromMap() {
-      return posMap(fromShifts, fromRatio, toShifts, toRatio);
+  public int[][] makeFromMap()
+  {
+    return posMap(fromShifts, fromRatio, toShifts, toRatio);
   }
+
   /**
    * get all mapped positions from 'to' to 'from'
    * @return int[to position]=position mapped in from
    */
-  public int[][] makeToMap() {
-      return posMap(toShifts,toRatio, fromShifts, fromRatio);
+  public int[][] makeToMap()
+  {
+    return posMap(toShifts, toRatio, fromShifts, fromRatio);
   }
+
   /**
    * construct an int map for intervals in intVals
    * @param intVals
    * @return int[] { from, to pos in range }, int[range.to-range.from+1] returning mapped position
    */
-  private int[][] posMap(Vector intVals, int ratio, Vector toIntVals, int toRatio) {
-      Iterator iv = intVals.iterator();
-      if (!iv.hasNext())
-          return null;
-      int[] intv=(int[]) iv.next();
-      int from=intv[0],to=intv[1];
-      if (from>to) {
-          from = intv[1];
-          to=intv[0];
+  private int[][] posMap(Vector intVals, int ratio, Vector toIntVals,
+                         int toRatio)
+  {
+    Iterator iv = intVals.iterator();
+    if (!iv.hasNext())
+    {
+      return null;
+    }
+    int[] intv = (int[]) iv.next();
+    int from = intv[0], to = intv[1];
+    if (from > to)
+    {
+      from = intv[1];
+      to = intv[0];
+    }
+    while (iv.hasNext())
+    {
+      intv = (int[]) iv.next();
+      if (intv[0] < from)
+      {
+        from = intv[0];
+      }
+      if (intv[1] < from)
+      {
+        from = intv[1];
+      }
+      if (intv[0] > to)
+      {
+        to = intv[0];
       }
-      while (iv.hasNext()) {
-          intv = (int[]) iv.next();
-          if (intv[0]<from)
-              from=intv[0];
-          if (intv[1]<from)
-              from=intv[1];
-          if (intv[0]>to)
-              to=intv[0];
-          if (intv[1]>to)
-              to=intv[1];
+      if (intv[1] > to)
+      {
+        to = intv[1];
       }
-      int tF=0,tT=0;
-      int mp[][] = new int[to-from+2][];
-      for (int i=0;i<mp.length; i++) {
-          int[] m = shift(i+from,intVals,ratio,toIntVals, toRatio);
-          if (m!=null) {
-              if (i==0) {
-                  tF=tT=m[0];
-              } else {
-                  if (m[0]<tF) {
-                      tF=m[0];
-                  }
-                  if (m[0]>tT) {
-                      tT=m[0];
-                  }
-              }
+    }
+    int tF = 0, tT = 0;
+    int mp[][] = new int[to - from + 2][];
+    for (int i = 0; i < mp.length; i++)
+    {
+      int[] m = shift(i + from, intVals, ratio, toIntVals, toRatio);
+      if (m != null)
+      {
+        if (i == 0)
+        {
+          tF = tT = m[0];
+        }
+        else
+        {
+          if (m[0] < tF)
+          {
+            tF = m[0];
           }
-          mp[i] = m;
+          if (m[0] > tT)
+          {
+            tT = m[0];
+          }
+        }
       }
-      int[][] map=new int[][] { new int[]{from, to, tF, tT}, new int[to-from+2]};
+      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<mp.length; i++) {
-          if (mp[i]!=null) {
-              map[1][i] = mp[i][0]-tF;
-          } else {
-              map[1][i] = -1; // indicates an out of range mapping
-          }
+    map[0][2] = tF;
+    map[0][3] = tT;
+
+    for (int i = 0; i < mp.length; i++)
+    {
+      if (mp[i] != null)
+      {
+        map[1][i] = mp[i][0] - tF;
+      }
+      else
+      {
+        map[1][i] = -1; // indicates an out of range mapping
       }
-      return map;
+    }
+    return map;
   }
+
   /**
    * addShift
    * @param pos start position for shift (in original reference frame)
    * @param shift length of shift
    *
-  public void addShift(int pos, int shift)
-  {
+     public void addShift(int pos, int shift)
+     {
     int sidx = 0;
     int[] rshift=null;
-    while (sidx<shifts.size() && (rshift=(int[]) shifts.elementAt(sidx))[0]<pos)
+   while (sidx<shifts.size() && (rshift=(int[]) shifts.elementAt(sidx))[0]<pos)
       sidx++;
     if (sidx==shifts.size())
       shifts.insertElementAt(new int[] { pos, shift}, sidx);
     else
       rshift[1]+=shift;
-  }
-*/
+     }
+   */
   /**
    * shift from pos to To(pos)
    *
@@ -142,7 +183,7 @@ public class MapList
    */
   public int[] shiftFrom(int pos)
   {
-      return shift(pos, fromShifts, fromRatio, toShifts, toRatio);
+    return shift(pos, fromShifts, fromRatio, toShifts, toRatio);
   }
 
   /**
@@ -150,131 +191,205 @@ public class MapList
    * @param pos (in To)
    * @return shifted position in From, frameshift in To
    */
-  public int[] shiftTo(int pos) {
-      return shift(pos, toShifts, toRatio, fromShifts, fromRatio);
+  public int[] shiftTo(int pos)
+  {
+    return shift(pos, toShifts, toRatio, fromShifts, fromRatio);
   }
+
   /**
-   * 
+   *
    * @param fromShifts
    * @param fromRatio
    * @param toShifts
    * @param toRatio
    * @return
    */
-  private int[] shift(int pos, Vector fromShifts, int fromRatio, Vector toShifts, int toRatio) {
-      int[] fromCount = countPos(fromShifts.iterator(), pos);
-      if (fromCount==null)
-          return null;
-      int fromRemainder=(fromCount[0]-1) % fromRatio;
-      int toCount = 1+(((fromCount[0]-1) / fromRatio) * toRatio);
-      int[] toPos = countToPos(toShifts.iterator(), toCount);
-      if (toPos==null)
-          return null; // throw new Error("Bad Mapping!");
-      //System.out.println(fromCount[0]+" "+fromCount[1]+" "+toCount);
-      return new int[] {toPos[0], fromRemainder};
+  private int[] shift(int pos, Vector fromShifts, int fromRatio,
+                      Vector toShifts, int toRatio)
+  {
+    int[] fromCount = countPos(fromShifts.iterator(), pos);
+    if (fromCount == null)
+    {
+      return null;
+    }
+    int fromRemainder = (fromCount[0] - 1) % fromRatio;
+    int toCount = 1 + ( ( (fromCount[0] - 1) / fromRatio) * toRatio);
+    int[] toPos = countToPos(toShifts.iterator(), toCount);
+    if (toPos == null)
+    {
+      return null; // throw new Error("Bad Mapping!");
+    }
+    //System.out.println(fromCount[0]+" "+fromCount[1]+" "+toCount);
+    return new int[]
+        {
+        toPos[0], fromRemainder};
   }
+
   /**
    * count how many positions pos is along the series of intervals.
    * @param intVals
    * @param pos
    * @return number of positions or null if pos is not within intervals
    */
-  private int[] countPos(Iterator intVals, int pos) {
-      int count=0,intv[];
-      while (intVals.hasNext()) {
-          intv = (int[])intVals.next();
-          if (intv[0] <= intv[1]) {
-              if (pos>=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;
-              }
-          }
+  private int[] countPos(Iterator intVals, int pos)
+  {
+    int count = 0, intv[];
+    while (intVals.hasNext())
+    {
+      intv = (int[]) intVals.next();
+      if (intv[0] <= intv[1])
+      {
+        if (pos >= intv[0] && pos <= intv[1])
+        {
+          return new int[]
+              {
+              count + pos - intv[0] + 1, +1};
+        }
+        else
+        {
+          count += intv[1] - intv[0] + 1;
+        }
       }
-      return null;
+      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;
-              }
-          }
+  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;
+        }
       }
-      return null;//(diff<0) ? (intv[1]-1) : (intv[0]+1);
+      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) {
-                  if (toofrom[0]!=from)
-                      System.err.println("Mapping not reflexive:"+from+" "+too[0]+"->"+toofrom[0]);
-                  System.out.println("ShiftTo("+too[0]+")=="+toofrom[0]+" % "+toofrom[1]);
-              } else
-                  System.out.println("ShiftTo("+too[0]+")=="+"NaN! - not Bijective Mapping!");
-          }
+
+  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");
       }
-      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]));
+      else
+      {
+        System.out.print(too[0] + " % " + too[1]);
+        System.out.print("\t+--+\t");
+        int[] toofrom = ml.shiftTo(too[0]);
+        if (toofrom != null)
+        {
+          if (toofrom[0] != from)
+          {
+            System.err.println("Mapping not reflexive:" + from + " " + too[0] +
+                               "->" + toofrom[0]);
           }
-          if (i % 20==0)
-              System.out.print("\n");
-          else
-              System.out.print(",");
+          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]));
       }
-      System.out.print("\n");
+      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!
+
+  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!
   }
 }