X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FShiftList.java;h=860a700fe1c09abfc6ea26f0da677f1f89f705d2;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=905b0982ce2f17912734dde620af7cbf305b8a1f;hpb=4eaa51766c1b8d2a670062696535131bc3907e07;p=jalview.git diff --git a/src/jalview/util/ShiftList.java b/src/jalview/util/ShiftList.java index 905b098..860a700 100644 --- a/src/jalview/util/ShiftList.java +++ b/src/jalview/util/ShiftList.java @@ -1,74 +1,154 @@ -package jalview.util; - -import java.util.*; - -/** - * ShiftList - * Simple way of mapping a linear series to a new linear range with new points introduced. - * Use at your own risk! - *

Title: ShiftList

- * - *

Description:

- * - *

Copyright: Copyright (c) 2004

- * - *

Company: Dundee University

- * - * @author not attributable - * @version 1.0 - */ -public class ShiftList -{ - Vector shifts; - public ShiftList() - { - shifts = new Vector(); - } - - /** - * addShift - * @param pos start position for shift (in original reference frame) - * @param shift length of shift - */ - public void addShift(int pos, int shift) - { - int sidx = 0; - int[] rshift=null; - while (sidx. + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * ShiftList Simple way of mapping a linear series to a new linear range with + * new points introduced. Use at your own risk! Now growing to be used for + * interval ranges (position, offset) storing deletions/insertions + */ +public class ShiftList +{ + private List shifts; + + public ShiftList() + { + shifts = new ArrayList(); + } + + /** + * addShift + * + * @param pos + * start position for shift (in original reference frame) + * @param shift + * length of shift + */ + public void addShift(int pos, int shift) + { + synchronized (shifts) + { + int sidx = 0; + int[] rshift = null; + while (sidx < shifts.size() && (rshift = shifts.get(sidx))[0] < pos) + { + sidx++; + } + if (sidx == shifts.size()) + { + shifts.add(sidx, new int[] { pos, shift }); + } + else + { + rshift[1] += shift; + } + } + } + + /** + * shift + * + * @param pos + * int + * @return int shifted position + */ + public int shift(int pos) + { + if (shifts.size() == 0) + { + return pos; + } + int shifted = pos; + int sidx = 0; + int rshift[]; + while (sidx < shifts.size() + && (rshift = (shifts.get(sidx++)))[0] <= pos) + { + shifted += rshift[1]; + } + return shifted; + } + + /** + * clear all shifts + */ + public synchronized void clear() + { + shifts.clear(); + } + + /** + * invert the shifts + * + * @return ShiftList with inverse shift operations + */ + public ShiftList getInverse() + { + ShiftList inverse = new ShiftList(); + synchronized (shifts) + { + if (shifts != null) + { + for (int[] sh : shifts) + { + if (sh != null) + { + inverse.shifts.add(new int[] { sh[0], -sh[1] }); + } + } + } + } + return inverse; + } + + /** + * parse a 1d map of position 1<i<n to L<pos[i]<N such as that + * returned from SequenceI.gapMap() + * + * @param gapMap + * @return shifts from map index to mapped position + */ + public static ShiftList parseMap(int[] gapMap) + { + ShiftList shiftList = null; + if (gapMap != null && gapMap.length > 0) + { + shiftList = new ShiftList(); + for (int i = 0, p = 0; i < gapMap.length; p++, i++) + { + if (p != gapMap[i]) + { + shiftList.addShift(p, gapMap[i] - p); + p = gapMap[i]; + } + } + } + return shiftList; + } + + public List getShifts() + { + return shifts; + } +}