X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FShiftList.java;h=860a700fe1c09abfc6ea26f0da677f1f89f705d2;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=8885e2c9607706b8b2e9816a4c88fd1769a39382;hpb=7bc226b58110fa26d9dbd3f0c78095d06909ffc3;p=jalview.git diff --git a/src/jalview/util/ShiftList.java b/src/jalview/util/ShiftList.java index 8885e2c..860a700 100644 --- a/src/jalview/util/ShiftList.java +++ b/src/jalview/util/ShiftList.java @@ -1,139 +1,154 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer - * 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 - * 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.*; - -/** - * 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 -{ - public 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 < 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 - * - * @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 = ( (int[]) shifts.elementAt(sidx++)))[0] <= pos) - { - shifted += rshift[1]; - } - return shifted; - } - - /** - * clear all shifts - */ - public void clear() - { - shifts.removeAllElements(); - } - - /** - * invert the shifts - * @return ShiftList with inverse shift operations - */ - public ShiftList getInverse() - { - ShiftList inverse = new ShiftList(); - if (shifts != null) - { - for (int i = 0, j = shifts.size(); i < j; i++) - { - int[] sh = (int[]) shifts.elementAt(i); - if (sh != null) - { - inverse.shifts.addElement(new int[] - {sh[0], -sh[1]}); - } - } - } - return inverse; - } - - /** - * parse a 1d map of position 1 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; - } -} +/* + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) + * Copyright (C) 2015 The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview 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 3 + * of the License, or (at your option) any later version. + * + * Jalview 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 Jalview. If not, see . + * 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; + } +}