-
- /**
- * Add gaps into the sequences aligned to profileseq under the given
- * AlignmentView
- *
- * @param profileseq
- * @param al
- * - alignment to have gaps inserted into it
- * @param input
- * - alignment view where sequence corresponding to profileseq is
- * first entry
- * @return new HiddenColumns for new alignment view, with insertions into
- * profileseq marked as hidden.
- */
- public static HiddenColumns propagateInsertions(SequenceI profileseq,
- AlignmentI al, AlignmentView input)
- {
- int profsqpos = 0;
-
- char gc = al.getGapCharacter();
- Object[] alandhidden = input.getAlignmentAndHiddenColumns(gc);
- HiddenColumns nview = (HiddenColumns) alandhidden[1];
- SequenceI origseq = ((SequenceI[]) alandhidden[0])[profsqpos];
- nview.propagateInsertions(profileseq, al, origseq);
- return nview;
- }
-
- /**
- *
- * @param profileseq
- * - sequence in al which corresponds to origseq
- * @param al
- * - alignment which is to have gaps inserted into it
- * @param origseq
- * - sequence corresponding to profileseq which defines gap map for
- * modifying al
- */
- private void propagateInsertions(SequenceI profileseq, AlignmentI al,
- SequenceI origseq)
- {
- try
- {
- LOCK.writeLock().lock();
-
- char gc = al.getGapCharacter();
-
- // take the set of hidden columns, and the set of gaps in origseq,
- // and remove all the hidden gaps from hiddenColumns
-
- // first get the gaps as a Bitset
- BitSet gaps = origseq.gapBitset();
-
- // now calculate hidden ^ not(gap)
- BitSet hidden = new BitSet();
- markHiddenRegions(hidden);
- hidden.andNot(gaps);
- hiddenColumns = null;
- this.hideMarkedBits(hidden);
-
- // for each sequence in the alignment, except the profile sequence,
- // insert gaps corresponding to each hidden region
- // but where each hidden column region is shifted backwards by the number
- // of
- // preceding visible gaps
- // update hidden columns at the same time
- Iterator<int[]> regions = iterator();
- ArrayList<int[]> newhidden = new ArrayList<>();
-
- int numGapsBefore = 0;
- int gapPosition = 0;
- while (regions.hasNext())
- {
- // get region coordinates accounting for gaps
- // we can rely on gaps not being *in* hidden regions because we already
- // removed those
- int[] region = regions.next();
- while (gapPosition < region[0])
- {
- gapPosition++;
- if (gaps.get(gapPosition))
- {
- numGapsBefore++;
- }
- }
-
- int left = region[0] - numGapsBefore;
- int right = region[1] - numGapsBefore;
- newhidden.add(new int[] { left, right });
-
- // make a string with number of gaps = length of hidden region
- StringBuffer sb = new StringBuffer();
- for (int s = 0; s < right - left + 1; s++)
- {
- sb.append(gc);
- }
- padGaps(sb, left, profileseq, al);
-
- }
- hiddenColumns = newhidden;
- } finally
- {
- LOCK.writeLock().unlock();
- }
- }
-
- /**
- * Pad gaps in all sequences in alignment except profileseq
- *
- * @param sb
- * gap string to insert
- * @param left
- * position to insert at
- * @param profileseq
- * sequence not to pad
- * @param al
- * alignment to pad sequences in
- */
- private void padGaps(StringBuffer sb, int pos, SequenceI profileseq,
- AlignmentI al)
- {
- // loop over the sequences and pad with gaps where required
- for (int s = 0, ns = al.getHeight(); s < ns; s++)
- {
- SequenceI sqobj = al.getSequenceAt(s);
- if (sqobj != profileseq)
- {
- String sq = al.getSequenceAt(s).getSequenceAsString();
- if (sq.length() <= pos)
- {
- // pad sequence
- int diff = pos - sq.length() - 1;
- if (diff > 0)
- {
- // pad gaps
- sq = sq + sb;
- while ((diff = pos - sq.length() - 1) > 0)
- {
- if (diff >= sb.length())
- {
- sq += sb.toString();
- }
- else
- {
- char[] buf = new char[diff];
- sb.getChars(0, diff, buf, 0);
- sq += buf.toString();
- }
- }
- }
- sq += sb.toString();
- }
- else
- {
- al.getSequenceAt(s).setSequence(
- sq.substring(0, pos) + sb.toString() + sq.substring(pos));
- }
- }
- }
- }
-
- /**
- * Returns a hashCode built from hidden column ranges
- */
- @Override
- public int hashCode()
- {
- try
- {
- LOCK.readLock().lock();
- int hashCode = 1;
- if (hiddenColumns != null)
- {
- for (int[] hidden : hiddenColumns)
- {
- hashCode = HASH_MULTIPLIER * hashCode + hidden[0];
- hashCode = HASH_MULTIPLIER * hashCode + hidden[1];
- }
- }
- return hashCode;
- } finally
- {
- LOCK.readLock().unlock();
- }
- }
-
- /**
- * Hide columns corresponding to the marked bits
- *
- * @param inserts
- * - columns map to bits starting from zero
- */
- public void hideMarkedBits(BitSet inserts)
- {
- try
- {
- LOCK.writeLock().lock();
- for (int firstSet = inserts
- .nextSetBit(0), lastSet = 0; firstSet >= 0; firstSet = inserts
- .nextSetBit(lastSet))
- {
- lastSet = inserts.nextClearBit(firstSet);
- hideColumns(firstSet, lastSet - 1);
- }
- } finally
- {
- LOCK.writeLock().unlock();
- }
- }
-
- /**
- *
- * @param inserts
- * BitSet where hidden columns will be marked
- */
- public void markHiddenRegions(BitSet inserts)
- {
- try
- {
- LOCK.readLock().lock();
- if (hiddenColumns == null)
- {
- return;
- }
- for (int[] range : hiddenColumns)
- {
- inserts.set(range[0], range[1] + 1);
- }
- } finally
- {
- LOCK.readLock().unlock();
- }
- }
-
- /**
- * Calculate the visible start and end index of an alignment.
- *
- * @param width
- * full alignment width
- * @return integer array where: int[0] = startIndex, and int[1] = endIndex
- */
- public int[] getVisibleStartAndEndIndex(int width)
- {
- try
- {
- LOCK.readLock().lock();
- int[] alignmentStartEnd = new int[] { 0, width - 1 };
- int startPos = alignmentStartEnd[0];
- int endPos = alignmentStartEnd[1];
-
- int[] lowestRange = new int[] { -1, -1 };
- int[] higestRange = new int[] { -1, -1 };
-
- if (hiddenColumns == null)
- {
- return new int[] { startPos, endPos };
- }
-
- for (int[] hiddenCol : hiddenColumns)
- {
- lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange;
- higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange;
- }
-
- if (lowestRange[0] == -1 && lowestRange[1] == -1)
- {
- startPos = alignmentStartEnd[0];
- }
- else
- {
- startPos = lowestRange[1] + 1;
- }
-
- if (higestRange[0] == -1 && higestRange[1] == -1)
- {
- endPos = alignmentStartEnd[1];
- }
- else
- {
- endPos = higestRange[0] - 1;
- }
- return new int[] { startPos, endPos };
- } finally
- {
- LOCK.readLock().unlock();
- }
-
- }
-
- /**
- * Finds the hidden region (if any) which starts or ends at res
- *
- * @param res
- * visible residue position, unadjusted for hidden columns
- * @return region as [start,end] or null if no matching region is found
- */
- public int[] getRegionWithEdgeAtRes(int res)
- {
- try
- {
- LOCK.readLock().lock();
- int adjres = adjustForHiddenColumns(res);
-
- int[] reveal = null;
- if (hiddenColumns != null)
- {
- for (int[] region : hiddenColumns)
- {
- if (adjres + 1 == region[0] || adjres - 1 == region[1])
- {
- reveal = region;
- break;
- }
- }
- }
- return reveal;
- } finally
- {
- LOCK.readLock().unlock();
- }
- }
-
- /**
- * Return an iterator over the hidden regions
- */
- public Iterator<int[]> iterator()
- {
- if (hiddenColumns != null)
- {
- int last = hiddenColumns.get(hiddenColumns.size() - 1)[1];
- return new BoundedHiddenColsIterator(0, last, true);
- }
- else
- {
- return new BoundedHiddenColsIterator(0, 0, true);
- }
- }
-
- /**
- * Return a bounded iterator over the hidden regions
- *
- * @param start
- * position to start from (inclusive, absolute column position)
- * @param end
- * position to end at (inclusive, absolute column position)
- * @return
- */
- public Iterator<int[]> getBoundedIterator(int start, int end)
- {
- return new BoundedHiddenColsIterator(start, end, true);
- }
-
- /**
- * Return a bounded iterator over the *visible* start positions of hidden
- * regions
- *
- * @param start
- * position to start from (inclusive, visible column position)
- * @param end
- * position to end at (inclusive, visible column position)
- */
- public Iterator<Integer> getBoundedStartIterator(int start, int end)
- {
- return new BoundedStartRegionIterator(start, end, true);
- }
-
- /**
- * Return an iterator over visible columns between the given start and end
- * boundaries
- *
- * @param start
- * first column (inclusive)
- * @param end
- * last column (inclusive)
- */
- public Iterator<Integer> getVisibleColsIterator(int start, int end)
- {
- return new VisibleColsIterator(start, end, true);
- }
-
- /**
- * return an iterator over visible segments between the given start and end
- * boundaries
- *
- * @param start
- * (first column inclusive from 0)
- * @param end
- * (last column - not inclusive)
- */
- public Iterator<int[]> getVisContigsIterator(int start, int end)
- {
- return new VisibleContigsIterator(start, end, true);
- }
-
- /**
- * return an iterator over visible segments between the given start and end
- * boundaries
- *
- * @param start
- * (first column - inclusive from 0)
- * @param end
- * (last column - inclusive)
- * @param useVisibleCoords
- * if true, start and end are visible column positions, not absolute
- * positions
- */
- public Iterator<int[]> getVisibleBlocksIterator(int start, int end,
- boolean useVisibleCoords)
- {
- if (useVisibleCoords)
- {
- // TODO
- // we should really just convert start and end here with
- // adjustForHiddenColumns
- // and then create a VisibleBlocksIterator
- // but without a cursor this will be horribly slow in some situations
- // ... so until then...
- return new VisibleBlocksVisBoundsIterator(start, end, true);
- }
- else
- {
- return new VisibleBlocksIterator(start, end, true);
- }
- }
-
- /**
- * An iterator which iterates over hidden column regions in a range.
- */
- private class BoundedHiddenColsIterator implements Iterator<int[]>
- {
- private int start; // start position to iterate from
-
- private int end; // end position to iterate to
-
- // current index in hiddenColumns
- private int currentPosition = 0;
-
- // current column in hiddenColumns
- private int[] currentRegion;
-
- // whether to make a local copy of hiddenColumns
- private final boolean useCopy;
-
- // local copy or reference to hiddenColumns
- private List<int[]> localHidden;
-
- /**
- * Construct an iterator over hiddenColums bounded at
- * [lowerBound,upperBound]
- *
- * @param lowerBound
- * lower bound to iterate from
- * @param upperBound
- * upper bound to iterate to
- * @param useCopyCols
- * whether to make a local copy of hiddenColumns for iteration (set
- * to true if calling from outwith the HiddenColumns class)
- */
- BoundedHiddenColsIterator(int lowerBound, int upperBound,
- boolean useCopyCols)
- {
- start = lowerBound;
- end = upperBound;
- useCopy = useCopyCols;
-
- try
- {
- if (useCopy)
- {
- // assume that if useCopy is false the calling code has locked
- // hiddenColumns
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null)
- {
- localHidden = new ArrayList<>();
-
- // iterate until a region overlaps with [start,end]
- int i = 0;
- while ((i < hiddenColumns.size())
- && (hiddenColumns.get(i)[1] < start))
- {
- i++;
- }
-
- // iterate from start to end, adding each hidden region. Positions are
- // absolute, and all regions which *overlap* [start,end] are added.
- while (i < hiddenColumns.size()
- && (hiddenColumns.get(i)[0] <= end))
- {
- int[] rh;
- int[] cp;
- rh = hiddenColumns.get(i);
- if (rh != null)
- {
- cp = new int[rh.length];
- System.arraycopy(rh, 0, cp, 0, rh.length);
- localHidden.add(cp);
- }
- i++;
- }
- }
- }
- finally
- {
- if (useCopy)
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (localHidden != null)
- && (currentPosition < localHidden.size());
- }
-
- @Override
- public int[] next()
- {
- currentRegion = localHidden.get(currentPosition);
- currentPosition++;
- return currentRegion;
- }
- }
-
- /**
- * An iterator which iterates over visible start positions of hidden column
- * regions in a range.
- */
- private class BoundedStartRegionIterator implements Iterator<Integer>
- {
- // start position to iterate from
- private int start;
-
- // end position to iterate to
- private int end;
-
- // current index in hiddenColumns
- private int currentPosition = 0;
-
- // local copy or reference to hiddenColumns
- private List<Integer> positions = null;
-
- /**
- * Construct an iterator over hiddenColums bounded at
- * [lowerBound,upperBound]
- *
- * @param lowerBound
- * lower bound to iterate from
- * @param upperBound
- * upper bound to iterate to
- * @param useCopyCols
- * whether to make a local copy of hiddenColumns for iteration (set
- * to true if calling from outwith the HiddenColumns class)
- */
- BoundedStartRegionIterator(int lowerBound, int upperBound,
- boolean useCopy)
- {
- start = lowerBound;
- end = upperBound;
-
- try
- {
- if (useCopy)
- {
- // assume that if useCopy is false the calling code has locked
- // hiddenColumns
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null)
- {
- positions = new ArrayList<>(hiddenColumns.size());
-
- // navigate to start, keeping count of hidden columns
- int i = 0;
- int hiddenSoFar = 0;
- while ((i < hiddenColumns.size())
- && (hiddenColumns.get(i)[0] < start + hiddenSoFar))
- {
- int[] region = hiddenColumns.get(i);
- hiddenSoFar += region[1] - region[0] + 1;
- i++;
- }
-
- // iterate from start to end, adding start positions of each
- // hidden region. Positions are visible columns count, not absolute
- while (i < hiddenColumns.size()
- && (hiddenColumns.get(i)[0] <= end + hiddenSoFar))
- {
- int[] region = hiddenColumns.get(i);
- positions.add(region[0] - hiddenSoFar);
- hiddenSoFar += region[1] - region[0] + 1;
- i++;
- }
- }
- else
- {
- positions = new ArrayList<>();
- }
- } finally
- {
- if (useCopy)
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (currentPosition < positions.size());
- }
-
- /**
- * Get next hidden region start position
- *
- * @return the start position in *visible* coordinates
- */
- @Override
- public Integer next()
- {
- int result = positions.get(currentPosition);
- currentPosition++;
- return result;
- }
- }
-
- private class VisibleColsIterator implements Iterator<Integer>
- {
- private int last;
-
- private int current;
-
- private int next;
-
- private List<int[]> localHidden = new ArrayList<>();
-
- private int nexthiddenregion;
-
- VisibleColsIterator(int firstcol, int lastcol, boolean useCopy)
- {
- last = lastcol;
- current = firstcol;
- next = firstcol;
- nexthiddenregion = 0;
-
- try
- {
- if (useCopy)
- {
- // assume that if useCopy is false the calling code has locked
- // hiddenColumns
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null)
- {
- int i = 0;
- for (i = 0; i < hiddenColumns.size()
- && (current <= hiddenColumns.get(i)[0]); ++i)
- {
- if (current >= hiddenColumns.get(i)[0]
- && current <= hiddenColumns.get(i)[1])
- {
- // current is hidden, move to right
- current = hiddenColumns.get(i)[1] + 1;
- next = current;
- nexthiddenregion = i + 1;
- }
- }
-
- for (i = hiddenColumns.size() - 1; i >= 0
- && (last >= hiddenColumns.get(i)[1]); --i)
- {
- if (last >= hiddenColumns.get(i)[0]
- && last <= hiddenColumns.get(i)[1])
- {
- // last is hidden, move to left
- last = hiddenColumns.get(i)[0] - 1;
- }
- }
-
- // make a local copy of the bit we need
- i = nexthiddenregion;
- while (i < hiddenColumns.size()
- && hiddenColumns.get(i)[0] <= last)
- {
- int[] region = new int[] { hiddenColumns.get(i)[0],
- hiddenColumns.get(i)[1] };
- localHidden.add(region);
- i++;
- }
- }
- } finally
- {
- if (useCopy)
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return next <= last;
- }
-
- @Override
- public Integer next()
- {
- if (next > last)
- {
- throw new NoSuchElementException();
- }
- current = next;
- if ((localHidden != null)
- && (nexthiddenregion < localHidden.size()))
- {
- // still some more hidden regions
- if (next + 1 < localHidden.get(nexthiddenregion)[0])
- {
- // next+1 is still before the next hidden region
- next++;
- }
- else if ((next + 1 >= localHidden.get(nexthiddenregion)[0])
- && (next + 1 <= localHidden.get(nexthiddenregion)[1]))
- {
- // next + 1 is in the next hidden region
- next = localHidden.get(nexthiddenregion)[1] + 1;
- nexthiddenregion++;
- }
- }
- else
- {
- // finished with hidden regions, just increment normally
- next++;
- }
- return current;
- }
-
- @Override
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * An iterator which iterates over visible regions in a range.
- */
- private class VisibleContigsIterator implements Iterator<int[]>
- {
- private List<int[]> vcontigs = new ArrayList<>();
-
- private int currentPosition = 0;
-
- VisibleContigsIterator(int start, int end, boolean usecopy)
- {
- try
- {
- if (usecopy)
- {
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null && hiddenColumns.size() > 0)
- {
- int vstart = start;
- int hideStart;
- int hideEnd;
-
- for (int[] region : hiddenColumns)
- {
- hideStart = region[0];
- hideEnd = region[1];
-
- // navigate to start
- if (hideEnd < vstart)
- {
- continue;
- }
- if (hideStart > vstart)
- {
- int[] contig = new int[] { vstart, hideStart - 1 };
- vcontigs.add(contig);
- }
- vstart = hideEnd + 1;
-
- // exit if we're past the end
- if (vstart >= end)
- {
- break;
- }
- }
-
- if (vstart < end)
- {
- int[] contig = new int[] { vstart, end - 1 };
- vcontigs.add(contig);
- }
- }
- else
- {
- int[] contig = new int[] { start, end - 1 };
- vcontigs.add(contig);
- }
- } finally
- {
- if (usecopy)
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (currentPosition < vcontigs.size());
- }
-
- @Override
- public int[] next()
- {
- int[] result = vcontigs.get(currentPosition);
- currentPosition++;
- return result;
- }
- }
-
- /**
- * An iterator which iterates over visible regions in a range.
- */
- private class VisibleBlocksIterator implements Iterator<int[]>
- {
- private List<int[]> vcontigs = new ArrayList<>();
-
- private int currentPosition = 0;
-
- VisibleBlocksIterator(int start, int end, boolean usecopy)
- {
- try
- {
- if (usecopy)
- {
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null && hiddenColumns.size() > 0)
- {
- int blockStart = start;
- int blockEnd = end;
-
- // iterate until a region overlaps with [start,end]
- int i = 0;
- while ((i < hiddenColumns.size())
- && (hiddenColumns.get(i)[1] < start))
- {
- i++;
- }
-
- // iterate from start to end, adding each hidden region. Positions are
- // absolute, and all regions which *overlap* [start,end] are used.
- while (i < hiddenColumns.size()
- && (hiddenColumns.get(i)[0] <= end))
- {
- int[] region = hiddenColumns.get(i);
-
- blockStart = Math.min(blockStart, region[1] + 1);
- blockEnd = Math.min(blockEnd, region[0]);
-
- int[] contig = new int[] { blockStart, blockEnd };
- vcontigs.add(contig);
-
- blockStart = region[1] + 1;
- blockEnd = end;
-
- i++;
- }
-
- if (end > blockStart)
- {
- int[] contig = new int[] { blockStart, end };
- vcontigs.add(contig);
- }
- }
- else
- {
- int[] contig = new int[] { start, end };
- vcontigs.add(contig);
- }
- } finally
- {
- if (usecopy)
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (currentPosition < vcontigs.size());
- }
-
- @Override
- public int[] next()
- {
- int[] result = vcontigs.get(currentPosition);
- currentPosition++;
- return result;
- }
- }
-
- /**
- * An iterator which iterates over visible regions in a range. The range is
- * specified in terms of visible column positions. Provides a special
- * "endsAtHidden" indicator to allow callers to determine if the final visible
- * column is adjacent to a hidden region.
- */
- public class VisibleBlocksVisBoundsIterator implements Iterator<int[]>
- {
- private List<int[]> vcontigs = new ArrayList<>();
-
- private int currentPosition = 0;
-
- private boolean endsAtHidden = false;
-
- /**
- * Constructor for iterator over visible regions in a range.
- *
- * @param start
- * start position in terms of visible column position
- * @param end
- * end position in terms of visible column position
- * @param usecopy
- * whether to use a local copy of hidden columns
- */
- VisibleBlocksVisBoundsIterator(int start, int end, boolean usecopy)
- {
- /* actually this implementation always uses a local copy but this may change in future */
- try
- {
- if (usecopy)
- {
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null && hiddenColumns.size() > 0)
- {
- int blockStart = start;
- int blockEnd = end;
- int hiddenSoFar = 0;
- int visSoFar = 0;
-
- // iterate until a region begins within (start,end]
- int i = 0;
- while ((i < hiddenColumns.size())
- && (hiddenColumns.get(i)[0] <= blockStart + hiddenSoFar))
- {
- hiddenSoFar += hiddenColumns.get(i)[1] - hiddenColumns.get(i)[0]
- + 1;
- i++;
- }
-
- blockStart += hiddenSoFar; // convert start to absolute position
- blockEnd += hiddenSoFar; // convert end to absolute position
-
- // iterate from start to end, adding each visible region. Positions
- // are
- // absolute, and all hidden regions which overlap [start,end] are
- // used.
- while (i < hiddenColumns.size()
- && (hiddenColumns.get(i)[0] <= blockEnd))
- {
- int[] region = hiddenColumns.get(i);
-
- // end position of this visible region is either just before the
- // start of the next hidden region, or the absolute position of
- // 'end', whichever is lowest
- blockEnd = Math.min(blockEnd, region[0] - 1);
-
- vcontigs.add(new int[] { blockStart, blockEnd });
-
- visSoFar += blockEnd - blockStart + 1;
-
- // next visible region starts after this hidden region
- blockStart = region[1] + 1;
-
- hiddenSoFar += region[1] - region[0] + 1;
-
- // reset blockEnd to absolute position of 'end', assuming we've now
- // passed all hidden regions before end
- blockEnd = end + hiddenSoFar;
-
- i++;
- }
- if (visSoFar < end - start)
- {
- // the number of visible columns we've accounted for is less than
- // the number specified by end-start; work out the end position of
- // the last visible region
- blockEnd = blockStart + end - start - visSoFar;
- vcontigs.add(new int[] { blockStart, blockEnd });
-
- // if the last visible region ends at the next hidden region, set
- // endsAtHidden=true
- if (i < hiddenColumns.size()
- && hiddenColumns.get(i)[0] - 1 == blockEnd)
- {
- endsAtHidden = true;
- }
- }
- }
- else
- {
- // there are no hidden columns, return a single visible contig
- vcontigs.add(new int[] { start, end });
- endsAtHidden = false;
- }
- } finally
- {
- if (usecopy)
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (currentPosition < vcontigs.size());
- }
-
- @Override
- public int[] next()
- {
- int[] result = vcontigs.get(currentPosition);
- currentPosition++;
- return result;
- }
-
- public boolean endsAtHidden()
- {
- return endsAtHidden;
- }
- }
-