/**
   * Add a read to the manager
   *
   * @param read the read to add
   */
  public void addRead(final GATKRead read) {
    if (read == null)
      throw new IllegalArgumentException("read added to manager is null, which is not allowed");

    // if the new read is on a different contig or we have too many reads, then we need to flush the
    // queue and clear the map
    final boolean tooManyReads = getNReadsInQueue() >= MAX_RECORDS_IN_MEMORY;
    final boolean encounteredNewContig =
        getNReadsInQueue() > 0 && !waitingReads.peek().read.getContig().equals(read.getContig());

    if (tooManyReads || encounteredNewContig) {
      if (DEBUG)
        logger.warn(
            "Flushing queue on "
                + (tooManyReads
                    ? "too many reads"
                    : ("move to new contig: "
                        + read.getContig()
                        + " from "
                        + waitingReads.peek().read.getContig()))
                + " at "
                + read.getStart());

      final int targetQueueSize = encounteredNewContig ? 0 : MAX_RECORDS_IN_MEMORY / 2;

      // write the required number of waiting reads to disk
      while (getNReadsInQueue() > targetQueueSize) writer.addRead(waitingReads.poll().read);
    }

    final SplitRead splitRead = new SplitRead(read);

    // fix overhangs, as needed
    for (final Splice splice : splices) fixSplit(splitRead, splice);

    // add the new read to the queue
    waitingReads.add(splitRead);
  }
 /** Close out the manager stream by clearing the read cache */
 public void close() {
   // write out all of the remaining reads
   while (!waitingReads.isEmpty()) writer.addRead(waitingReads.poll().read);
 }