[med-svn] [Git][med-team/picard-tools][upstream] New upstream version 2.18.23+dfsg

Andreas Tille gitlab at salsa.debian.org
Fri Jan 11 22:04:09 GMT 2019


Andreas Tille pushed to branch upstream at Debian Med / picard-tools


Commits:
2d8023c3 by Andreas Tille at 2019-01-11T21:51:59Z
New upstream version 2.18.23+dfsg
- - - - -


28 changed files:

- src/main/java/picard/analysis/directed/RnaSeqMetricsCollector.java
- src/main/java/picard/illumina/IlluminaBasecallsToFastq.java
- src/main/java/picard/illumina/IlluminaBasecallsToSam.java
- src/main/java/picard/illumina/NewIlluminaBasecallsConverter.java
- src/main/java/picard/illumina/parser/BaseIlluminaDataProvider.java
- src/main/java/picard/illumina/parser/CbclData.java
- src/main/java/picard/illumina/parser/FilterParser.java
- src/main/java/picard/illumina/parser/IlluminaData.java
- src/main/java/picard/illumina/parser/MultiTileFilterParser.java
- src/main/java/picard/illumina/parser/readers/CbclReader.java
- src/main/java/picard/sam/markduplicates/UmiUtil.java
- src/main/java/picard/sam/markduplicates/util/OpticalDuplicateFinder.java
- src/main/java/picard/sam/util/ReadNameParser.java
- src/main/java/picard/util/ThreadPoolExecutorWithExceptions.java
- src/test/java/picard/analysis/CollectRnaSeqMetricsTest.java
- src/test/java/picard/illumina/CollectIlluminaBasecallingMetricsTest.java
- src/test/java/picard/illumina/ExtractIlluminaBarcodesTest.java
- src/test/java/picard/illumina/parser/FilterParserTest.java
- src/test/java/picard/sam/markduplicates/AbstractMarkDuplicatesCommandLineProgramTest.java
- src/test/java/picard/sam/markduplicates/UmiUtilTest.java
- testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1101_barcode.txt.gz
- testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1102_barcode.txt.gz
- testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.1.fastq
- testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.2.fastq
- testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.barcode_1.fastq
- testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.barcode_2.fastq
- testdata/picard/illumina/151T8B8B151T_cbcl/sams/1102.NN.sam
- testdata/picard/illumina/151T8B8B151T_cbcl/sams/NN.sam


Changes:

=====================================
src/main/java/picard/analysis/directed/RnaSeqMetricsCollector.java
=====================================
@@ -40,7 +40,7 @@ public class RnaSeqMetricsCollector extends SAMRecordMultiLevelCollector<RnaSeqM
     private final OverlapDetector<Gene> geneOverlapDetector;
     private final OverlapDetector<Interval> ribosomalSequenceOverlapDetector;
     private final boolean collectCoverageStatistics;
-    
+
     public RnaSeqMetricsCollector(final Set<MetricAccumulationLevel> accumulationLevels, final List<SAMReadGroupRecord> samRgRecords,
                                   final Long ribosomalBasesInitialValue, OverlapDetector<Gene> geneOverlapDetector, OverlapDetector<Interval> ribosomalSequenceOverlapDetector,
                                   final HashSet<Integer> ignoredSequenceIndices, final int minimumLength, final StrandSpecificity strandSpecificity,
@@ -167,8 +167,7 @@ public class RnaSeqMetricsCollector extends SAMRecordMultiLevelCollector<RnaSeqM
                 }
                 if (intersectionLength/(double)fragmentInterval.length() >= rrnaFragmentPercentage) {
                     // Assume entire read is ribosomal.
-                    // TODO: Should count reads, not bases?
-                    metrics.RIBOSOMAL_BASES += rec.getReadLength();
+                    metrics.RIBOSOMAL_BASES += getNumAlignedBases(rec);
                     metrics.PF_ALIGNED_BASES += getNumAlignedBases(rec);
                     return;
                 }


=====================================
src/main/java/picard/illumina/IlluminaBasecallsToFastq.java
=====================================
@@ -281,7 +281,7 @@ public class IlluminaBasecallsToFastq extends CommandLineProgram {
                     FIRST_TILE, TILE_LIMIT, queryNameComparator,
                     new FastqRecordsForClusterCodec(readStructure.templates.length(),
                             readStructure.sampleBarcodes.length(), readStructure.molecularBarcode.length()),
-                    FastqRecordsForCluster.class, bclQualityEvaluationStrategy, INCLUDE_NON_PF_READS, IGNORE_UNEXPECTED_BARCODES);
+                    FastqRecordsForCluster.class, bclQualityEvaluationStrategy, IGNORE_UNEXPECTED_BARCODES);
         } else {
             basecallsConverter = new IlluminaBasecallsConverter<>(BASECALLS_DIR, BARCODES_DIR, LANE, readStructure,
                     sampleBarcodeFastqWriterMap, demultiplex, Math.max(1, MAX_READS_IN_RAM_PER_TILE / readsPerCluster), TMP_DIR, NUM_PROCESSORS,


=====================================
src/main/java/picard/illumina/IlluminaBasecallsToSam.java
=====================================
@@ -312,7 +312,7 @@ public class IlluminaBasecallsToSam extends CommandLineProgram {
                     TMP_DIR, NUM_PROCESSORS,
                     FIRST_TILE, TILE_LIMIT, new QueryNameComparator(),
                     new Codec(numOutputRecords),
-                    SAMRecordsForCluster.class, bclQualityEvaluationStrategy, INCLUDE_NON_PF_READS, IGNORE_UNEXPECTED_BARCODES);
+                    SAMRecordsForCluster.class, bclQualityEvaluationStrategy, IGNORE_UNEXPECTED_BARCODES);
         } else {
             basecallsConverter = new IlluminaBasecallsConverter<>(BASECALLS_DIR, BARCODES_DIR, LANE, readStructure,
                     barcodeSamWriterMap, true, MAX_READS_IN_RAM_PER_TILE / numOutputRecords, TMP_DIR, NUM_PROCESSORS, FORCE_GC,


=====================================
src/main/java/picard/illumina/NewIlluminaBasecallsConverter.java
=====================================
@@ -14,9 +14,11 @@ import picard.illumina.parser.ReadStructure;
 import picard.illumina.parser.readers.AbstractIlluminaPositionFileReader;
 import picard.illumina.parser.readers.BclQualityEvaluationStrategy;
 import picard.illumina.parser.readers.LocsFileReader;
+import picard.util.ThreadPoolExecutorUtil;
 import picard.util.ThreadPoolExecutorWithExceptions;
 
 import java.io.File;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -24,9 +26,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -36,12 +36,10 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
     private final List<AbstractIlluminaPositionFileReader.PositionInfo> locs = new ArrayList<>();
     private final File[] filterFiles;
     private final Map<String, ThreadPoolExecutorWithExceptions> barcodeWriterThreads = new HashMap<>();
+    private final Map<Integer, List<RecordWriter>> completedWork = Collections.synchronizedMap(new HashMap<>());
     private final Map<Integer, File> barcodesFiles = new HashMap<>();
-    private final boolean includeNonPfReads;
 
     /**
-     * Constructor setting includeNonPfReads to true by default.
-     *
      * @param basecallsDir             Where to read basecalls from.
      * @param barcodesDir              Where to read barcodes from (optional; use basecallsDir if not specified).
      * @param lane                     What lane to process.
@@ -73,52 +71,11 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
                                          final Class<CLUSTER_OUTPUT_RECORD> outputRecordClass,
                                          final BclQualityEvaluationStrategy bclQualityEvaluationStrategy,
                                          final boolean ignoreUnexpectedBarcodes) {
-        this(basecallsDir, barcodesDir, lane, readStructure, barcodeRecordWriterMap,
-                demultiplex, maxReadsInRamPerTile, tmpDirs, numProcessors, firstTile,
-                tileLimit, outputRecordComparator, codecPrototype, outputRecordClass,
-                bclQualityEvaluationStrategy, true, ignoreUnexpectedBarcodes);
-    }
-
-    /**
-     * @param basecallsDir             Where to read basecalls from.
-     * @param barcodesDir              Where to read barcodes from (optional; use basecallsDir if not specified).
-     * @param lane                     What lane to process.
-     * @param readStructure            How to interpret each cluster.
-     * @param barcodeRecordWriterMap   Map from barcode to CLUSTER_OUTPUT_RECORD writer.  If demultiplex is false, must contain
-     *                                 one writer stored with key=null.
-     * @param demultiplex              If true, output is split by barcode, otherwise all are written to the same output stream.
-     * @param maxReadsInRamPerTile     Configures number of reads each tile will store in RAM before spilling to disk.
-     * @param tmpDirs                  For SortingCollection spilling.
-     * @param numProcessors            Controls number of threads.  If <= 0, the number of threads allocated is
-     *                                 available cores - numProcessors.
-     * @param firstTile                (For debugging) If non-null, start processing at this tile.
-     * @param tileLimit                (For debugging) If non-null, process no more than this many tiles.
-     * @param outputRecordComparator   For sorting output records within a single tile.
-     * @param codecPrototype           For spilling output records to disk.
-     * @param outputRecordClass        Inconveniently needed to create SortingCollections.
-     * @param includeNonPfReads        If true, will include ALL reads (including those which do not have PF set)
-     * @param ignoreUnexpectedBarcodes If true, will ignore reads whose called barcode is not found in barcodeRecordWriterMap,
-     */
-    public NewIlluminaBasecallsConverter(final File basecallsDir, final File barcodesDir, final int lane,
-                                         final ReadStructure readStructure,
-                                         final Map<String, ? extends ConvertedClusterDataWriter<CLUSTER_OUTPUT_RECORD>> barcodeRecordWriterMap,
-                                         final boolean demultiplex,
-                                         final int maxReadsInRamPerTile,
-                                         final List<File> tmpDirs, final int numProcessors,
-                                         final Integer firstTile,
-                                         final Integer tileLimit,
-                                         final Comparator<CLUSTER_OUTPUT_RECORD> outputRecordComparator,
-                                         final SortingCollection.Codec<CLUSTER_OUTPUT_RECORD> codecPrototype,
-                                         final Class<CLUSTER_OUTPUT_RECORD> outputRecordClass,
-                                         final BclQualityEvaluationStrategy bclQualityEvaluationStrategy,
-                                         final boolean includeNonPfReads,
-                                         final boolean ignoreUnexpectedBarcodes) {
 
         super(barcodeRecordWriterMap, maxReadsInRamPerTile, tmpDirs, codecPrototype, ignoreUnexpectedBarcodes,
                 demultiplex, outputRecordComparator, bclQualityEvaluationStrategy,
                 outputRecordClass, numProcessors, new IlluminaDataProviderFactory(basecallsDir,
                         barcodesDir, lane, readStructure, bclQualityEvaluationStrategy));
-        this.includeNonPfReads = includeNonPfReads;
         this.tiles = new ArrayList<>();
 
         barcodeRecordWriterMap.keySet().forEach(barcode -> barcodeWriterThreads.put(barcode, new ThreadPoolExecutorWithExceptions(1)));
@@ -196,31 +153,26 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
         completedWorkExecutor.shutdown();
 
         //thread by surface tile
-        final ThreadPoolExecutor tileProcessingExecutor = new ThreadPoolExecutorWithExceptions(numThreads);
-        workChecker.setTileProcessingExecutor(tileProcessingExecutor);
+        final ThreadPoolExecutorWithExceptions tileProcessingExecutor = new ThreadPoolExecutorWithExceptions(numThreads);
 
         for (final Integer tile : tiles) {
-            tileProcessingExecutor.submit(new TileProcessor(tile, barcodesFiles.get(tile), workChecker));
+            tileProcessingExecutor.submit(new TileProcessor(tile, barcodesFiles.get(tile)));
         }
 
         tileProcessingExecutor.shutdown();
 
-        awaitThreadPoolTermination("Reading executor", tileProcessingExecutor);
-        awaitThreadPoolTermination("Tile completion executor", completedWorkExecutor);
-
-        barcodeWriterThreads.values().forEach(ThreadPoolExecutor::shutdown);
-        barcodeWriterThreads.forEach((barcode, executor) -> awaitThreadPoolTermination(barcode + " writer", executor));
-    }
-
-    private void awaitThreadPoolTermination(final String executorName, final ThreadPoolExecutor executorService) {
-        try {
-            while (!executorService.awaitTermination(1, TimeUnit.SECONDS)) {
-                log.info(String.format("%s waiting for job completion. Finished jobs - %d : Running jobs - %d : Queued jobs  - %d",
-                        executorName, executorService.getCompletedTaskCount(), executorService.getActiveCount(),
-                        executorService.getQueue().size()));
-            }
-        } catch (final InterruptedException e) {
-            e.printStackTrace();
+        ThreadPoolExecutorUtil.awaitThreadPoolTermination("Reading executor", tileProcessingExecutor, Duration.ofMinutes(5));
+
+        // if there was an exception reading then initiate an immediate shutdown.
+        if (tileProcessingExecutor.exception != null) {
+            int tasksStillRunning = completedWorkExecutor.shutdownNow().size();
+            tasksStillRunning += barcodeWriterThreads.values().stream().mapToLong(executor -> executor.shutdownNow().size()).sum();
+            throw new PicardException("Reading executor had exceptions. There were " + tasksStillRunning
+                    + " tasks were still running or queued and have been cancelled.", tileProcessingExecutor.exception);
+        } else {
+            ThreadPoolExecutorUtil.awaitThreadPoolTermination("Tile completion executor", completedWorkExecutor, Duration.ofMinutes(5));
+            barcodeWriterThreads.values().forEach(ThreadPoolExecutor::shutdown);
+            barcodeWriterThreads.forEach((barcode, executor) -> ThreadPoolExecutorUtil.awaitThreadPoolTermination(barcode + " writer", executor, Duration.ofMinutes(5)));
         }
     }
 
@@ -249,16 +201,30 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
         }
     }
 
+    private class Closer implements Runnable {
+        private final ConvertedClusterDataWriter<CLUSTER_OUTPUT_RECORD> writer;
+        private final String barcode;
+
+        private Closer(final ConvertedClusterDataWriter<CLUSTER_OUTPUT_RECORD> writer, final String barcode) {
+            this.writer = writer;
+            this.barcode = barcode;
+        }
+
+        @Override
+        public void run() {
+            log.debug("Closing writer for barcode " + barcode);
+            this.writer.close();
+        }
+    }
+
     private class TileProcessor implements Runnable {
         private final int tileNum;
         private final Map<String, SortingCollection<CLUSTER_OUTPUT_RECORD>> barcodeToRecordCollection = new HashMap<>();
         private final File barcodeFile;
-        private final CompletedWorkChecker workChecker;
 
-        TileProcessor(final int tileNum, final File barcodeFile, CompletedWorkChecker workChecker) {
+        TileProcessor(final int tileNum, final File barcodeFile) {
             this.tileNum = tileNum;
             this.barcodeFile = barcodeFile;
-            this.workChecker = workChecker;
         }
 
         @Override
@@ -268,12 +234,8 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
             while (dataProvider.hasNext()) {
                 final ClusterData cluster = dataProvider.next();
                 readProgressLogger.record(null, 0);
-                // If this cluster is passing, or we do NOT want to ONLY emit passing reads, then add it to
-                // the next
-                if (cluster.isPf() || includeNonPfReads) {
-                  final String barcode = (demultiplex ? cluster.getMatchedBarcode() : null);
-                  addRecord(barcode, converter.convertClusterToOutputRecord(cluster));
-                }
+                final String barcode = (demultiplex ? cluster.getMatchedBarcode() : null);
+                addRecord(barcode, converter.convertClusterToOutputRecord(cluster));
             }
 
             dataProvider.close();
@@ -285,8 +247,7 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
                 writerList.add(new RecordWriter(writer, value, barcode));
 
             });
-
-            workChecker.registerCompletedWork(tileNum, writerList);
+            completedWork.put(tileNum, writerList);
 
             log.info("Finished processing tile " + tileNum);
         }
@@ -314,21 +275,19 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
             final int maxRecordsInRam =
                     Math.max(1, maxReadsInRamPerTile /
                             barcodeRecordWriterMap.size());
-            return SortingCollection.newInstance(
+            return SortingCollection.newInstanceFromPaths(
                     outputRecordClass,
                     codecPrototype.clone(),
                     outputRecordComparator,
                     maxRecordsInRam,
-                    tmpDirs);
+                    IOUtil.filesToPaths(tmpDirs));
         }
     }
 
 
     private class CompletedWorkChecker implements Runnable {
 
-        private final Map<Integer, List<RecordWriter>> completedWork = new ConcurrentHashMap<>();
         private int currentTileIndex = 0;
-        private ThreadPoolExecutor tileProcessingExecutor;
 
         @Override
         public void run() {
@@ -337,30 +296,19 @@ public class NewIlluminaBasecallsConverter<CLUSTER_OUTPUT_RECORD> extends Baseca
                 if (completedWork.containsKey(currentTile)) {
                     log.info("Writing out tile " + currentTile);
                     completedWork.get(currentTile).forEach(writer -> barcodeWriterThreads.get(writer.getBarcode()).submit(writer));
-                    completedWork.remove(currentTile);
                     currentTileIndex++;
-                }
-                if(tileProcessingExecutor.isTerminated() && completedWork.size() == 0){
-                    break;
+                } else {
+                    try {
+                        Thread.sleep(5000);
+                    } catch (final InterruptedException e) {
+                        throw new PicardException(e.getMessage(), e);
+                    }
                 }
             }
 
             //we are all done scheduling work.. now schedule the closes
-            barcodeRecordWriterMap.forEach((barcode, writer) -> {
-                ThreadPoolExecutorWithExceptions executorService = barcodeWriterThreads.get(barcode);
-                executorService.shutdown();
-                awaitThreadPoolTermination( "Barcode writer ("  + barcode + ")", executorService);
-                log.debug("Closing writer for barcode " + barcode);
-                writer.close();
-            });
+            barcodeRecordWriterMap.forEach((barcode, writer) -> barcodeWriterThreads.get(barcode).submit(new Closer(writer, barcode)));
         }
 
-        void registerCompletedWork(int tileNum, List<RecordWriter> writerList) {
-            completedWork.put(tileNum, writerList);
-        }
-
-        void setTileProcessingExecutor(ThreadPoolExecutor tileProcessingExecutor) {
-            this.tileProcessingExecutor = tileProcessingExecutor;
-        }
     }
 }


=====================================
src/main/java/picard/illumina/parser/BaseIlluminaDataProvider.java
=====================================
@@ -42,7 +42,7 @@ public abstract class BaseIlluminaDataProvider implements Iterator<ClusterData>,
     }
 
     protected void addData(final ClusterData clusterData, final PfData pfData) {
-        clusterData.setPf(pfData.isPfRead());
+        clusterData.setPf(pfData.isPf());
     }
 
     protected void addData(final ClusterData clusterData, final BarcodeData barcodeData) {
@@ -72,9 +72,9 @@ public abstract class BaseIlluminaDataProvider implements Iterator<ClusterData>,
         for (int i = 0; i < numReads; i++) {
             clusterData.getRead(i).setQualities(qualities[i]);
         }
-        clusterData.setPf(cbclData.isPfRead());
-        clusterData.setX(cbclData.getXCoordinate());
-        clusterData.setY(cbclData.getYCoordinate());
+        clusterData.setPf(cbclData.isPf());
+        clusterData.setX(cbclData.getPositionInfo().xQseqCoord);
+        clusterData.setY(cbclData.getPositionInfo().yQseqCoord);
     }
 
     abstract void seekToTile(int seekAfterFirstRead);


=====================================
src/main/java/picard/illumina/parser/CbclData.java
=====================================
@@ -9,27 +9,30 @@ import picard.illumina.parser.readers.AbstractIlluminaPositionFileReader;
 public class CbclData extends BclData implements PfData, PositionalData {
     private final int tile;
     private AbstractIlluminaPositionFileReader.PositionInfo positionInfo;
-    private boolean pfRead;
-
 
     public CbclData(int[] outputLengths, int tile) {
         super(outputLengths);
         this.tile = tile;
     }
 
+    //CBCLs currently only contain PF reads.
+    @Override
+    public boolean isPf() {
+        return true;
+    }
+
     public int getTile() {
         return tile;
     }
 
-    public void setPositionInfo(AbstractIlluminaPositionFileReader.PositionInfo positionInfo) {
-        this.positionInfo = positionInfo;
+    public AbstractIlluminaPositionFileReader.PositionInfo getPositionInfo() {
+        return positionInfo;
     }
 
-    public void setPfRead(boolean pfRead) {
-        this.pfRead = pfRead;
+    public void setPositionInfo(AbstractIlluminaPositionFileReader.PositionInfo positionInfo) {
+        this.positionInfo = positionInfo;
     }
 
-
     @Override
     public int getXCoordinate() {
         return this.positionInfo.xQseqCoord;
@@ -39,9 +42,4 @@ public class CbclData extends BclData implements PfData, PositionalData {
     public int getYCoordinate() {
         return this.positionInfo.yQseqCoord;
     }
-
-    @Override
-    public boolean isPfRead() {
-        return pfRead;
-    }
 }


=====================================
src/main/java/picard/illumina/parser/FilterParser.java
=====================================
@@ -65,7 +65,7 @@ class FilterParser extends PerTileParser<PfData> {
             public PfData next() {
                 final boolean nextValue = reader.next();
                 return new PfData() {
-                    public boolean isPfRead() {
+                    public boolean isPf() {
                         return nextValue;
                     }
                 };


=====================================
src/main/java/picard/illumina/parser/IlluminaData.java
=====================================
@@ -59,7 +59,7 @@ interface RawIntensityData extends IlluminaData{
 }
 
 interface PfData extends IlluminaData {
-    public boolean isPfRead();
+    public boolean isPf();
 }
 
 interface BarcodeData extends IlluminaData {


=====================================
src/main/java/picard/illumina/parser/MultiTileFilterParser.java
=====================================
@@ -46,7 +46,7 @@ public class MultiTileFilterParser extends MultiTileParser<PfData> {
         final boolean nextVal = reader.next();
         return new PfData() {
             @Override
-            public boolean isPfRead() {
+            public boolean isPf() {
                 return nextVal;
             }
         };


=====================================
src/main/java/picard/illumina/parser/readers/CbclReader.java
=====================================
@@ -200,13 +200,13 @@ public class CbclReader extends BaseBclReader implements CloseableIterator<CbclD
 
             for (final int outputLength : outputLengths) {
                 for (int cycle = 0; cycle < outputLength; cycle++) {
-                    final TileData currentCycleTileInfo = cycleData[totalCycleCount].tileInfo;
+                    final CycleData currentCycleData = cycleData[totalCycleCount];
                     try {
                         if (cachedTile[totalCycleCount] == null) {
-                            if (!cachedFilter.containsKey(currentCycleTileInfo.tileNum)) {
-                                cacheFilterAndLocs(currentCycleTileInfo, locs);
+                            if (!cachedFilter.containsKey(cycleData[totalCycleCount].tileInfo.tileNum)) {
+                                cacheFilterAndLocs(cycleData[totalCycleCount].tileInfo, locs);
                             }
-                            cacheTile(totalCycleCount, currentCycleTileInfo);
+                            cacheTile(totalCycleCount, cycleData[totalCycleCount].tileInfo, currentCycleData);
                         }
                     } catch (final IOException e) {
                         // when logging the error, increment cycle by 1, since totalCycleCount is zero-indexed but Illumina directories are 1-indexed.
@@ -269,9 +269,7 @@ public class CbclReader extends BaseBclReader implements CloseableIterator<CbclD
 
     private void advance() {
         int totalCycleCount = 0;
-        int tileNum = cycleData[totalCycleCount].tileInfo.tileNum;
-        final CbclData data = new CbclData(outputLengths, tileNum);
-        int tilePosition = cachedTilePosition[totalCycleCount];
+        final CbclData data = new CbclData(outputLengths, cycleData[totalCycleCount].tileInfo.tileNum);
 
         for (int read = 0; read < outputLengths.length; read++) {
             for (int cycle = 0; cycle < outputLengths[read]; cycle++) {
@@ -290,25 +288,31 @@ public class CbclReader extends BaseBclReader implements CloseableIterator<CbclD
                 totalCycleCount++;
             }
         }
-
         data.setPositionInfo(positionInfoIterator.next());
-        data.setPfRead(cachedFilter.get(tileNum).get(tilePosition));
         this.queue = data;
     }
 
     private void cacheFilterAndLocs(final TileData currentTileData, final List<AbstractIlluminaPositionFileReader.PositionInfo> locs) {
         final List<Boolean> filterValues = new ArrayList<>();
         final FilterFileReader reader = new FilterFileReader(filterFileMap.get(currentTileData.tileNum));
+        final Iterator<AbstractIlluminaPositionFileReader.PositionInfo> positionInfoIterator = locs.iterator();
 
         while (reader.hasNext()) {
             filterValues.add(reader.next());
         }
 
-        this.positionInfoIterator = locs.iterator();
+        final List<AbstractIlluminaPositionFileReader.PositionInfo> positions = new ArrayList<>();
+        for (final boolean filterValue : filterValues) {
+            final AbstractIlluminaPositionFileReader.PositionInfo info = positionInfoIterator.next();
+            if (filterValue) {
+                positions.add(info);
+            }
+        }
+        this.positionInfoIterator = positions.iterator();
         cachedFilter.put(currentTileData.tileNum, filterValues);
     }
 
-    private void cacheTile(final int totalCycleCount, final TileData tileData) throws IOException {
+    private void cacheTile(final int totalCycleCount, final TileData tileData, final CycleData currentCycleData) throws IOException {
         final byte[] tileByteArray = new byte[tileData.compressedBlockSize];
 
         // Read the whole compressed block into a buffer, then sanity check the length
@@ -329,11 +333,38 @@ public class CbclReader extends BaseBclReader implements CloseableIterator<CbclD
         byte[] decompressedByteArray = decompressTile(totalCycleCount, tileData, byteInputStream);
 
         // Read uncompressed data from the buffer and expand each nibble into a full byte for ease of use
-        cachedTile[totalCycleCount] = promoteNibblesToBytes(decompressedByteArray);
+        byte[] unNibbledByteArray = promoteNibblesToBytes(decompressedByteArray);
+        cachedTile[totalCycleCount] = filterNonPfReads(tileData, currentCycleData, unNibbledByteArray);
 
         cachedTilePosition[totalCycleCount] = 0;
     }
 
+    private byte[] filterNonPfReads(TileData tileData, CycleData currentCycleData, byte[] unNibbledByteArray) {
+        // Write buffer contents to cached tile array
+        // if nonPF reads are included we need to strip them out
+        if (!currentCycleData.pfExcluded) {
+            final List<Boolean> filterDatas = cachedFilter.get(tileData.tileNum);
+            int sum = 0;
+            for (final boolean b : filterDatas) {
+                sum += b ? 1 : 0;
+            }
+            final byte[] filteredByteArray = new byte[sum];
+            int filterIndex = 0;
+            int basecallIndex = 0;
+            for (final boolean filterData : filterDatas) {
+                final byte readByte = unNibbledByteArray[filterIndex];
+                if (filterData) {
+                    filteredByteArray[basecallIndex] = readByte;
+                    basecallIndex++;
+                }
+                filterIndex++;
+            }
+            return filteredByteArray;
+        } else {
+            return unNibbledByteArray;
+        }
+    }
+
     private byte[] promoteNibblesToBytes(byte[] decompressedByteArray) {
         //we are going to explode the nibbles in to bytes to make PF filtering easier
         final byte[] unNibbledByteArray = new byte[decompressedByteArray.length * 2];
@@ -376,6 +407,10 @@ public class CbclReader extends BaseBclReader implements CloseableIterator<CbclD
         return decompressedByteArray;
     }
 
+    public CycleData[] getCycleData() {
+        return cycleData;
+    }
+
     public int getHeaderSize() {
         return headerSize;
     }


=====================================
src/main/java/picard/sam/markduplicates/UmiUtil.java
=====================================
@@ -82,34 +82,49 @@ class UmiUtil {
             throw new PicardException("Duplex UMIs must be of the form X-Y where X and Y are equal length UMIs, for example AT-GA.  Found UMI, " + umi);
         }
 
-        if (isTopStrand(record)) {
-            return split[0] + DUPLEX_UMI_DELIMITER + split[1];
-        } else {
-            return split[1] + DUPLEX_UMI_DELIMITER + split[0];
+        switch (getStrand(record)) {
+            case BOTTOM:
+                return split[1] + DUPLEX_UMI_DELIMITER + split[0];
+                default:
+                    return umi;
         }
     }
 
     /**
-     * Determines if the read represented by a SAM record belongs to the top or bottom strand.
+     * Determines if the read represented by a SAM record belongs to the top or bottom strand
+     * or if it cannot determine strand position due to one of the reads being unmapped.
      * Top strand is defined as having a read 1 unclipped 5' coordinate
      * less than the read 2 unclipped 5' coordinate.  If a read is unmapped
-     * it is considered to have an unclipped 5' coordinate of 0.  If the mate
-     * belongs to a different contig from the read, then the reference
+     * we do not attempt to determine the strand to which the read or its mate belongs.
+     * If the mate belongs to a different contig from the read, then the reference
      * index for the read and its mate is used in leu of the unclipped 5' coordinate.
      * @param rec Record to determine top or bottom strand
-     * @return Top or bottom strand, true (top), false (bottom).
+     * @return Top or bottom strand, unknown if it cannot be determined.
      */
-    static boolean isTopStrand(final SAMRecord rec) {
+    static ReadStrand getStrand(final SAMRecord rec) {
+        if (rec.getReadUnmappedFlag() || rec.getMateUnmappedFlag()) {
+            return ReadStrand.UNKNOWN;
+        }
 
         // If the read pair are aligned to different contigs we use
         // the reference index to determine relative 5' coordinate ordering.
+        // Both the read and its mate should not have their unmapped flag set to true.
         if (!rec.getReferenceIndex().equals(rec.getMateReferenceIndex())) {
-            return rec.getFirstOfPairFlag() == (rec.getReferenceIndex() < rec.getMateReferenceIndex());
+            if (rec.getFirstOfPairFlag() == (rec.getReferenceIndex() < rec.getMateReferenceIndex())) {
+                return ReadStrand.TOP;
+            } else {
+                return ReadStrand.BOTTOM;
+            }
         }
 
         final int read5PrimeStart = (rec.getReadNegativeStrandFlag()) ? rec.getUnclippedEnd() : rec.getUnclippedStart();
         final int mate5PrimeStart = (rec.getMateNegativeStrandFlag()) ? SAMUtils.getMateUnclippedEnd(rec) : SAMUtils.getMateUnclippedStart(rec);
-        return rec.getFirstOfPairFlag() == (read5PrimeStart < mate5PrimeStart);
+
+        if (rec.getFirstOfPairFlag() == (read5PrimeStart <= mate5PrimeStart)) {
+            return ReadStrand.TOP;
+        } else {
+            return ReadStrand.BOTTOM;
+        }
     }
 
     /**
@@ -133,7 +148,22 @@ class UmiUtil {
         molecularIdentifier.append(assignedUmi);
 
         if (duplexUmis) {
-            molecularIdentifier.append(isTopStrand(rec) ? TOP_STRAND_DUPLEX : BOTTOM_STRAND_DUPLEX);
+            // Reads whose strand position can be determined will have their
+            // molecularIdentifier set to include an identifier appended that
+            // indicates top or bottom strand.
+            ReadStrand strand = getStrand(rec);
+            switch (strand) {
+                case TOP:
+                    molecularIdentifier.append(TOP_STRAND_DUPLEX);
+                    break;
+                case BOTTOM:
+                    molecularIdentifier.append(BOTTOM_STRAND_DUPLEX);
+                    break;
+                default:
+                    // If we can't determine strand position nothing
+                    // is appended to the molecularIdentifier.
+                    break;
+            }
         }
         rec.setAttribute(molecularIdentifierTag, molecularIdentifier.toString());
     }
@@ -146,4 +176,14 @@ class UmiUtil {
     static int getUmiLength(final String umi) {
         return umi.length() - StringUtils.countMatches(umi, UmiUtil.DUPLEX_UMI_DELIMITER);
     }
+
+    /**
+     * An enum to hold the strand position (TOP or BOTTOM) of a read.
+     */
+    public enum ReadStrand {
+        TOP,
+        BOTTOM,
+        UNKNOWN
+    }
+
 }


=====================================
src/main/java/picard/sam/markduplicates/util/OpticalDuplicateFinder.java
=====================================
@@ -126,7 +126,7 @@ public class OpticalDuplicateFinder extends ReadNameParser implements Serializab
         // If there is only one or zero reads passed in (so there are obviously no optical duplicates),
         // or if there are too many reads (so we don't want to try to run this expensive n^2 algorithm),
         // then just return an array of all false
-        if (length < 2 || length > maxDuplicateSetSize) {
+        if (this.readNameRegex == null || length < 2 || length > maxDuplicateSetSize) {
             return opticalDuplicateFlags;
         }
 


=====================================
src/main/java/picard/sam/util/ReadNameParser.java
=====================================
@@ -31,7 +31,7 @@ public class ReadNameParser implements Serializable {
 
     private final boolean useOptimizedDefaultParsing; // was the regex default?
 
-    private final String readNameRegex;
+    protected final String readNameRegex;
 
     private Pattern readNamePattern;
 
@@ -63,7 +63,7 @@ public class ReadNameParser implements Serializable {
      * @param log the log to which to write messages.
      */
     public ReadNameParser(final String readNameRegex, final Log log) {
-        this.useOptimizedDefaultParsing = readNameRegex.equals(DEFAULT_READ_NAME_REGEX);
+        this.useOptimizedDefaultParsing = DEFAULT_READ_NAME_REGEX.equals(readNameRegex);
         this.readNameRegex = readNameRegex;
         this.log = log;
     }


=====================================
src/main/java/picard/util/ThreadPoolExecutorWithExceptions.java
=====================================
@@ -1,6 +1,5 @@
 package picard.util;
 
-import htsjdk.samtools.util.Log;
 import picard.PicardException;
 
 import java.util.concurrent.CancellationException;
@@ -15,7 +14,8 @@ import java.util.concurrent.TimeUnit;
  * while executing
  */
 public class ThreadPoolExecutorWithExceptions extends ThreadPoolExecutor {
-    private static final Log log = Log.getInstance(ThreadPoolExecutorWithExceptions.class);
+    public Throwable exception = null;
+
     /**
      * Creates a fixed size thread pool executor that will rethrow exceptions from submitted jobs.
      *
@@ -42,6 +42,7 @@ public class ThreadPoolExecutorWithExceptions extends ThreadPoolExecutor {
             }
         }
         if (t != null) {
+            exception = t;
             throw new PicardException(t.getMessage(), t);
         }
     }
@@ -50,8 +51,7 @@ public class ThreadPoolExecutorWithExceptions extends ThreadPoolExecutor {
     protected void beforeExecute(Thread t, Runnable r) {
         super.beforeExecute(t, r);
         t.setUncaughtExceptionHandler((t1, e) -> {
-            log.error(e.getCause());
-            throw new PicardException("Uncaught exception in thread: " + t1.getName() +" : " + e.getCause().getMessage(), e.getCause());
+            throw new PicardException("Uncaught exception in thread: " + t1.getName() + " : " + e.getMessage(), e);
         });
     }
 }


=====================================
src/test/java/picard/analysis/CollectRnaSeqMetricsTest.java
=====================================
@@ -382,6 +382,59 @@ public class CollectRnaSeqMetricsTest extends CommandLineProgramTest {
         Assert.assertEquals(metrics.PCT_R2_TRANSCRIPT_STRAND_READS, 0.333333);
     }
 
+    @Test
+    public void testPctRibosomalBases() throws Exception {
+        final String sequence = "chr1";
+        final String ignoredSequence = "chrM";
+
+        // Create some alignments that hit the ribosomal sequence, various parts of the gene, and intergenic.
+        final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate);
+        // Set seed so that strandedness is consistent among runs.
+        builder.setRandomSeed(0);
+        final int sequenceIndex = builder.getHeader().getSequenceIndex(sequence);
+
+        builder.addPair("rrnaPair", sequenceIndex, 400, 500, false, false, "35I1M", "35I1M", true, true, -1);
+        builder.addFrag("frag1", sequenceIndex, 150, true, false, "34I2M", "*", -1);
+        builder.addFrag("frag2", sequenceIndex, 190, true, false, "35I1M", "*", -1);
+        builder.addFrag("ignoredFrag", builder.getHeader().getSequenceIndex(ignoredSequence), 1, false);
+        final File samFile = File.createTempFile("tmp.collectRnaSeqMetrics.", ".sam");
+        samFile.deleteOnExit();
+        try (SAMFileWriter samWriter = new SAMFileWriterFactory().makeSAMWriter(builder.getHeader(), false, samFile)) {
+            for (final SAMRecord rec : builder.getRecords()) {
+                samWriter.addAlignment(rec);
+            }
+        }
+
+        // Create an interval list with one ribosomal interval.
+        final Interval rRnaInterval = new Interval(sequence, 300, 520, true, "rRNA");
+        final IntervalList rRnaIntervalList = new IntervalList(builder.getHeader());
+        rRnaIntervalList.add(rRnaInterval);
+        final File rRnaIntervalsFile = File.createTempFile("tmp.rRna.", ".interval_list");
+        rRnaIntervalsFile.deleteOnExit();
+        rRnaIntervalList.write(rRnaIntervalsFile);
+
+        // Generate the metrics.
+        final File metricsFile = File.createTempFile("tmp.", ".rna_metrics");
+        metricsFile.deleteOnExit();
+
+        final String[] args = new String[]{
+                "INPUT=" + samFile.getAbsolutePath(),
+                "OUTPUT=" + metricsFile.getAbsolutePath(),
+                "REF_FLAT=" + getRefFlatFile(sequence).getAbsolutePath(),
+                "RIBOSOMAL_INTERVALS=" + rRnaIntervalsFile.getAbsolutePath(),
+                "STRAND_SPECIFICITY=SECOND_READ_TRANSCRIPTION_STRAND",
+                "IGNORE_SEQUENCE=" + ignoredSequence
+        };
+        Assert.assertEquals(runPicardCommandLine(args), 0);
+
+        final MetricsFile<RnaSeqMetrics, Comparable<?>> output = new MetricsFile<>();
+        output.read(new FileReader(metricsFile));
+
+        final RnaSeqMetrics metrics = output.getMetrics().get(0);
+
+        Assert.assertEquals(metrics.PCT_RIBOSOMAL_BASES, 0.4);
+    }
+
     public File getRefFlatFile(String sequence) throws Exception {
         // Create a refFlat file with a single gene containing two exons, one of which is overlapped by the
         // ribosomal interval.


=====================================
src/test/java/picard/illumina/CollectIlluminaBasecallingMetricsTest.java
=====================================
@@ -157,20 +157,20 @@ public class CollectIlluminaBasecallingMetricsTest {
     public void testNovaseqIndexedRun() throws Exception {
         final MetricsFile<IlluminaBasecallingMetrics, Integer> metricsFile = runIt(1, "151T8B8B151T",
                 new File("testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls"), null, true);
-        final IlluminaBasecallingMetrics laneMetric = metricsFile.getMetrics().get(metricsFile.getMetrics().size() - 1);
+        final IlluminaBasecallingMetrics laneMetric = metricsFile.getMetrics().get(0);
         Assert.assertEquals(laneMetric.LANE, "1");
-        Assert.assertNull(laneMetric.MOLECULAR_BARCODE_SEQUENCE_1);
-        Assert.assertNull(laneMetric.MOLECULAR_BARCODE_NAME);
-        Assert.assertEquals(laneMetric.MEAN_CLUSTERS_PER_TILE, 28.0);
+        Assert.assertEquals(laneMetric.MOLECULAR_BARCODE_SEQUENCE_1, "CACCTAGTACTCGAGT");
+        Assert.assertEquals(laneMetric.MOLECULAR_BARCODE_NAME, "SA_CACCTAGTACTCGAGT");
+        Assert.assertEquals(laneMetric.MEAN_CLUSTERS_PER_TILE, 1.0);
         Assert.assertEquals(laneMetric.SD_CLUSTERS_PER_TILE, 0.0);
-        Assert.assertEquals(laneMetric.MEAN_PF_CLUSTERS_PER_TILE,25.0);
+        Assert.assertEquals(laneMetric.MEAN_PF_CLUSTERS_PER_TILE,1.0);
         Assert.assertEquals(laneMetric.SD_PF_CLUSTERS_PER_TILE, 0.0);
-        Assert.assertEquals(laneMetric.MEAN_PCT_PF_CLUSTERS_PER_TILE, 89.29);
+        Assert.assertEquals(laneMetric.MEAN_PCT_PF_CLUSTERS_PER_TILE, 100.0);
         Assert.assertEquals(laneMetric.SD_PCT_PF_CLUSTERS_PER_TILE, 0.0);
-        Assert.assertEquals(laneMetric.TOTAL_BASES, 16912);
-        Assert.assertEquals(laneMetric.TOTAL_READS, 112);
-        Assert.assertEquals(laneMetric.PF_BASES, 15100);
-        Assert.assertEquals(laneMetric.PF_READS, 100);
+        Assert.assertEquals(laneMetric.TOTAL_BASES, 302);
+        Assert.assertEquals(laneMetric.TOTAL_READS, 2);
+        Assert.assertEquals(laneMetric.PF_BASES, 302);
+        Assert.assertEquals(laneMetric.PF_READS, 2);
 
 
         Assert.assertEquals(metricsFile.getMetrics().size(),6);


=====================================
src/test/java/picard/illumina/ExtractIlluminaBarcodesTest.java
=====================================
@@ -288,8 +288,8 @@ public class ExtractIlluminaBarcodesTest extends CommandLineProgramTest {
         Assert.assertEquals(runPicardCommandLine(args), 0);
         final MetricsFile<ExtractIlluminaBarcodes.BarcodeMetric, Integer> result = new MetricsFile<>();
         result.read(new FileReader(metricsFile));
-        Assert.assertEquals(result.getMetrics().get(0).PF_PERFECT_MATCHES, 1, "Got wrong number of perfect matches");
-        Assert.assertEquals(result.getMetrics().get(0).PF_ONE_MISMATCH_MATCHES, 0, "Got wrong number of one-mismatch matches");
+        Assert.assertEquals(result.getMetrics().get(0).PERFECT_MATCHES, 1, "Got wrong number of perfect matches");
+        Assert.assertEquals(result.getMetrics().get(0).ONE_MISMATCH_MATCHES, 0, "Got wrong number of one-mismatch matches");
     }
 
     /**


=====================================
src/test/java/picard/illumina/parser/FilterParserTest.java
=====================================
@@ -94,7 +94,7 @@ public class FilterParserTest {
 
         for (final boolean expectedValue : values) {
             Assert.assertTrue(fp.hasNext());
-            Assert.assertEquals(fp.next().isPfRead(), expectedValue);
+            Assert.assertEquals(fp.next().isPf(), expectedValue);
         }
 
         Assert.assertFalse(fp.hasNext());
@@ -103,7 +103,7 @@ public class FilterParserTest {
         fp.seekToTile(tiles[0]);
         for (final boolean expectedValue : values) {
             Assert.assertTrue(fp.hasNext());
-            Assert.assertEquals(fp.next().isPfRead(), expectedValue);
+            Assert.assertEquals(fp.next().isPf(), expectedValue);
         }
 
         Assert.assertFalse(fp.hasNext());
@@ -137,7 +137,7 @@ public class FilterParserTest {
             }
 
             Assert.assertTrue(fp.hasNext());
-            Assert.assertEquals(fp.next().isPfRead(), expectedValue, " Failed on read: " + read);
+            Assert.assertEquals(fp.next().isPf(), expectedValue, " Failed on read: " + read);
             ++read;
         }
 


=====================================
src/test/java/picard/sam/markduplicates/AbstractMarkDuplicatesCommandLineProgramTest.java
=====================================
@@ -652,6 +652,17 @@ public abstract class AbstractMarkDuplicatesCommandLineProgramTest {
         tester.runTest();
     }
 
+    @Test
+    public void testOpticalDuplicateBehaviorNullRegex() {
+        final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
+        tester.getSamRecordSetBuilder().setReadLength(68);
+        tester.setExpectedOpticalDuplicate(0);
+        tester.addMatePair("RUNID:1:1:15993:13361", 2, 41212324, 41212310, false, false, false, false, "33S35M", "19S49M", true, true, false, false, false, DEFAULT_BASE_QUALITY);
+        tester.addMatePair("RUNID:1:1:16020:13352", 2, 41212324, 41212319, false, false, true, true, "33S35M", "28S40M", true, true, false, false, false, DEFAULT_BASE_QUALITY);
+        tester.addArg("READ_NAME_REGEX=null");
+        tester.runTest();
+    }
+
     @DataProvider(name = "secondarySupplementaryData")
     public Object[][] secondarySupplementaryData() {
         return new Object[][] {


=====================================
src/test/java/picard/sam/markduplicates/UmiUtilTest.java
=====================================
@@ -39,44 +39,51 @@ public class UmiUtilTest {
     private Object[][] testIsTopStrandDataProvider() {
         final boolean read1 = true;
         final boolean read2 = false;
+        final UmiUtil.ReadStrand top = UmiUtil.ReadStrand.TOP;
+        final UmiUtil.ReadStrand bottom = UmiUtil.ReadStrand.BOTTOM;
+        final UmiUtil.ReadStrand unknown = UmiUtil.ReadStrand.UNKNOWN;
         return new Object[][]{
-                {0, 100, 0, 200, read1, false, true, true},    // Read 1 in F1R2 pair, reads point inwards, top strand
-                {0, 200, 0, 100, read2, true, false, true},    // Read 2 in F1R2 pair, reads point inwards, top strand
-                {0, 200, 0, 100, read1, false, true, false},   // Read 1 in F1R2 pair, reads point outwards
-                {0, 100, 0, 200, read2, true, false, false},   // Read 2 in F1R2 pair, reads point outwards
-                {0, 100, 0, 200, read1, true, false, true},    // Read 1 in F2R1 pair
-                {0, 200, 0, 100, read2, false, false, true},   // Read 2 in F2R1 pair
-                {0, 100, 0, 200, read1, false, false, true},   // Read 1 in F1F2 pair
-                {0, 200, 0, 100, read2, false, false, true},   // Read 2 in F1F2 pair
-                {0, 100, 0, 200, read1, true, true, true},     // Read 1 in R1R2 pair
-                {0, 200, 0, 100, read2, true, true, true},     // Read 2 in R1R2 pair
-                {0, 100, 1, 200, read1, false, true, true},    // Read 1 in F1R2 chimera
-                {0, 100, 1, 200, read2, true, false, false},   // Read 2 in F1R2 chimera
-                {0, 100, 1, 200, read1, true, false, true},    // Read 1 in F2R1 chimera
-                {0, 100, 1, 200, read2, false, false, false},  // Read 2 in F2R1 chimera
-                {0, 100, 1, 200, read2, false, true, false},   // Read 2 in F2R1 chimera
+                {0, 100, 0, 200, read1, false, true, true, true, top},    // Read 1 in F1R2 pair, reads point inwards, top strand
+                {0, 200, 0, 100, read2, true, false, true, true, top},    // Read 2 in F1R2 pair, reads point inwards, top strand
+                {0, 200, 0, 100, read1, false, true, true, true, bottom},   // Read 1 in F1R2 pair, reads point outwards
+                {0, 100, 0, 200, read2, true, false, true, true, bottom},   // Read 2 in F1R2 pair, reads point outwards
+                {0, 100, 0, 200, read1, true, false, true, true, top},    // Read 1 in F2R1 pair
+                {0, 200, 0, 100, read2, false, false, true, true, top},   // Read 2 in F2R1 pair
+                {0, 100, 0, 200, read1, false, false, true, true, top},   // Read 1 in F1F2 pair
+                {0, 200, 0, 100, read2, false, false, true, true, top},   // Read 2 in F1F2 pair
+                {0, 100, 0, 200, read1, true, true, true, true, top},     // Read 1 in R1R2 pair
+                {0, 200, 0, 100, read2, true, true, true, true, top},     // Read 2 in R1R2 pair
+                {0, 100, 1, 200, read1, false, true, true, true, top},    // Read 1 in F1R2 chimera
+                {0, 100, 1, 200, read2, true, false, true, true, bottom},   // Read 2 in F1R2 chimera
+                {0, 100, 1, 200, read1, true, false, true, true, top},    // Read 1 in F2R1 chimera
+                {0, 100, 1, 200, read2, false, false, true, true, bottom},  // Read 2 in F2R1 chimera
+                {0, 100, 1, 200, read2, false, true, true, true, bottom},   // Read 2 in F2R1 chimera
+                {0, 100, 0, 200, read1, false, true, false, true, unknown},   // Read 1 in F1R2 pair, top strand, read not mapped
+                {0, 100, 0, 200, read1, false, true, true, false, unknown},  // Read 1 in F1R2 pair, top strand, mate not mapped
+                {0, 100, 0, 200, read1, false, true, false, false, unknown},  // Read 1 in F1R2 pair, top strand, neither mapped
         };
     }
 
     @Test(dataProvider = "topStrandDataProvider")
     public void testIsTopStrand(final int referenceIndex, final int alignmentStart, final int mateReferenceIndex, final int mateAlignmentStart,
                                 final boolean firstOfPairFlag, final boolean negativeStrandFlag, final boolean mateNegativeStrandFlag,
-                                final boolean topStrand) {
+                                final boolean mapped, final boolean mateMapped,
+                                final UmiUtil.ReadStrand strand) {
 
         final int readLength = 15;
         final int contigLength = 500;
-        SAMFileHeader header = new SAMFileHeader();
-        SAMSequenceDictionary sequenceDictionary = new SAMSequenceDictionary();
+        final SAMFileHeader header = new SAMFileHeader();
+        final SAMSequenceDictionary sequenceDictionary = new SAMSequenceDictionary();
 
         sequenceDictionary.addSequence(new SAMSequenceRecord("chr1", contigLength));
         sequenceDictionary.addSequence(new SAMSequenceRecord("chr2", contigLength));
 
-        System.out.println(sequenceDictionary.getSequences());
-
         header.setSequenceDictionary(sequenceDictionary);
 
-        SAMRecord rec = new SAMRecord(header);
+        final SAMRecord rec = new SAMRecord(header);
 
+        rec.setReadUnmappedFlag(!mapped);
+        rec.setMateUnmappedFlag(!mateMapped);
         rec.setReadPairedFlag(true);
 
         rec.setCigarString(readLength + "M");
@@ -92,7 +99,7 @@ public class UmiUtilTest {
         rec.setReadNegativeStrandFlag(negativeStrandFlag);
         rec.setMateNegativeStrandFlag(mateNegativeStrandFlag);
 
-        Assert.assertEquals(UmiUtil.isTopStrand(rec), topStrand);
+        Assert.assertEquals(UmiUtil.getStrand(rec), strand);
     }
 
     @DataProvider(name = "brokenUmiProvider")


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1101_barcode.txt.gz
=====================================
Binary files a/testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1101_barcode.txt.gz and b/testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1101_barcode.txt.gz differ


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1102_barcode.txt.gz
=====================================
Binary files a/testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1102_barcode.txt.gz and b/testdata/picard/illumina/151T8B8B151T_cbcl/Data/Intensities/BaseCalls/s_1_1102_barcode.txt.gz differ


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.1.fastq
=====================================
@@ -6,10 +6,6 @@ TGATGGTTTCGGGNTTTAGACAGTGTCATGCCTATTCCNTGGTANTCTTTGTTAACCTACGCCTCATGCTCGAATTCGCG
 GGTGGGGCAGCTCNNGTNCTGGGTATGNTTACATGATTCAAGCATACTGCCCCTGATANTANTCGCGGNTTCTGCTANGTATTTCCCGGGAACTTCTTTCACCTATCCGAACAACAGCTTTCCCAGTCAGAGTCAGCGAACATTATAACTC
 +
 FFF!-!-!F!!!!##!F#!FF8!FF-!#8!8F-8!----F-!-F8--88-FF!-!8F-#88#-8F!8F#88-8!!FF#!F8!8!!F!F-F-F!8F8FF!8---8-FFF8---8-8--!!-F8-!8888F8F8!F8FFF--!F!-8FFF--F
- at machine1:HiMom:abcdeACXX:1:1101:1054:1000 1:Y:0:
-GTCGTACGNTCGAAGNTGAGGACGGGATTGTCTGTAAACTTGCGCGAGACCGAAATGTCAAACGGNTTCGGTAACAAGAACACAACNCTTCCGCATACACGTCGGTGTTTCCTATACCGCAACCGTTGGAGGTTCCACGGNCTAGGCTCGC
-+
-F!!!8--8#88-FF!#--FF-88-88F-!8!F-!--F8F8!FFF8-8!F8F8FF--F-!F--F-F#-8!-F-FF8888F-----F8#!F!!8F!-8F!FFF!-!!---F--88-88-F8F-F!----FFF!!8F!8FFF-#8-88-!F-88
 @machine1:HiMom:abcdeACXX:1:1101:1072:1000 1:N:0:
 CCTTGATCNCTCCGCTTGAGTTTNGTTTCAGATGCCTTNAGGAAGCGATATTCCAACTCATGGAGCGTCAGCAGCGATTGTCGTATAGCCGGGCAAATCACTAGGAATGCCNTNTGTGAACAGTGGCATTGTTGTATGGTGTGTCCCCAAG
 +
@@ -26,10 +22,6 @@ NTCTNANATTAAGTGCGGCAGNTGGGGCCCCCTGGTTTGAGTNAAATTGTGCGTCTATCTTACGCGGANGNAATGNCAGG
 TTTTCTTTGTTANGCCGTCNATGGGTCCNGGCCCACCGTACANACCCATCAGCGTCTGACGNCCGTACTTCGNTACTTATGGTGACTGTGANTGCCACGACTTGTCATNTACTTGGGGTTGTGANTANTACACCCTATCCGAACTTNAGGT
 +
 F8F-8!-!F8-8#!FFFF-#FF--F8!8#8!F-8-!!--8!-#-F-88!8-!FF!FF8F8F#F-FF8!88-8#--8!F-F8--F-!8F888#!!--8!F8888!F!8!#88-F88!!-F!F8!8#88#F-8F!-F!8!8!!8F-F8#88FF
- at machine1:HiMom:abcdeACXX:1:1101:1145:1000 1:Y:0:
-TTGTCNCCTTNGCTAAAGATCTCCGTCGCTCGTCTCCTGNCCCGTATCTACCTAAGCCTNCTGCGNGGTTCGTAGCCCGGCCTACAAGGCAGGCTTCANNTNTGCGGNGGGACNGAAACGCCACGCTAACCGCTCAGGCAGTAGAGCTAGT
-+
-!-8-F#!8--#FF8F-FF---!F!!!8-!!F88!!!--!#!8F88F!-!-F-8F-FFF!#FF!8-#!F-8!!!88F!!8!-!888F-!FF8F88-8!-##!#!!8!8#-!FF!#-F888!F-F--FFF88888F8F------FFF!!8-8!
 @machine1:HiMom:abcdeACXX:1:1101:1163:1000 1:N:0:
 TCCTNCANTCGCACCGGAGAATTCCCACGATTCCCAAGCNAANACGATCTAATCTGAGCTTAGAACGAACAGACTCGGTAGGGGGATATTGTATCGCTGCCGTCGCGTGCTATGCTACGGTCTCNGTTATAATGGCNTTTTGGTCGCTTTA
 +
@@ -86,10 +78,6 @@ F-!F-8!-!F88-8!##!!---F!--!-!#-#F8-8-FF--8F8!#--FFF8-F-8!-#8!88-8F-!F8-F8-F-8#!-
 TACTCNGTGGACTTGTATCCNGGACTTTCTCTCTGNTACTGGGTTNCGCCGAACTCCCCGTTNAGCCATCNCGGTGCTGGACCACANATCGCGTCNGACATGCGCACTAGNCGAACCCTATACTCTANTTCNCCTTCGCTTCGGCAGTTGT
 +
 -888!#8FFF-F!-8!F!F-#!8-F888F8-8F!8#!FF!!8-!-#-8F!!8F8-F88!-F!#-!8-88!#-F8F88!F8-!F-F8#F!F!F!--#8-8-!F8!8-F-F-#FF8F-F8!-!88-!8F#!!8#88-8!F!!8F8!-F88!FF
- at machine1:HiMom:abcdeACXX:1:1101:1452:1000 1:Y:0:
-TNGGGCGCAGTCCGGGGTTAAANCAGTTAGTCGGCGTCGCCTAACAAGCTCTTGAGCCATTGCGGCTTNTTATGATGCCTCAATTGTTGGGCCTGTGAGACCGGGGCGNGGGCCGCAAAGGCGNCNTAGTCTCNGAATTACAACCCTGNCG
-+
--#FF!8!8F-8!FF8-F8!--8#F88FF-FF8888!!8!-8!-F8FFF8-!F88FF-F8-!!-!-F8F#!-8-!-F-!F!8FFF8!!8F!!-!!FFF-!F!!8!F8!F#F--!F8--888888#!#-8--!-F#-888-8!------F#8!
 @machine1:HiMom:abcdeACXX:1:1101:1470:1000 1:N:0:
 NATCTTTGGGATCATGAATTAAGGATTGTCCATGCGACAAGCNATGTACNACAGCGNACAGAATTGNTACGATGAACGTCGTAGTTGCGTTACCAAGGCACTAGNATTACCCTCTNGGCCTCGATTCGNCCACCCTCTTGGNGGTCCCGAG
 +
@@ -110,10 +98,6 @@ NGGAAANGGATAANCCAGACACCCAANGGATATGTAGCATTGTTATACCGATCCTTGCCGCTTTTTGGTAAGCAGAGGAC
 CAGTGTTTGTTCGAATCCGCTCCCTTCTGCTGACGTGGGTNNNNGGNAACCGAAACGCTTTTCTCCCACNCCGGNGTCGTTCAACTCTANATGGGACAGCGCATGGTTCGTCTANGCNTGACTCGTGGCANACGTCCTACGACCGCTAAAT
 +
 F-!8--!F-F-8!F8F888!!!F8!F-8F!!F-F-F!-!F####!!#-FF8!F-F!8FF--8F-8FF-!#!--F#FF-!8FFF---F!-#8-F!!8!--F!FF8-88FF8--88#F-#!!-FF!F---!F#8F--88!F-!--!8!8F8-8
- at machine1:HiMom:abcdeACXX:1:1102:1054:1000 1:Y:0:
-CGGGNCCGCCAGATNTTCCCCGTTCCCACGGACGTTCCTTGGCAGCGCTACTGTCGGGGTTGATCATGCCGGTGTAGCAGGCGTNCCGGACAGTGAACTAANGTCTTGATTCCACCGNNCATAGCNTCTGATACACCTCAATTCGAGTTCA
-+
---8-#-8F8FF-FF#--F8!--8--F8F!!F88F-!!F8!!8--F8F888F8F!--8!88F-F88--!F88-F!--FF-8-FF!#F!-88F-8FFFF-!-F#-F8!-!8!!-88!F-##!F-88!#F-F---FF8FF8!8F-8F-F!-8!8
 @machine1:HiMom:abcdeACXX:1:1102:1072:1000 1:N:0:
 GCGCTTGTTCCGATTTGTNTGGCGCTGCGGCAGCCTGATCGGNGCGCCTTGGTNGAGAGGCGCACTTGCACTANCGNCGGGCTACCGCCANACGTTTTCTCTGCCGGNAGCCGTATCCGGTTGGATNTTCCGNCCATCCACGAACTTCATC
 +
@@ -130,10 +114,6 @@ TTANGGGGAGTGCNAAGGNCTTANAGTTCACCGAGCCCATAGCCTCNTGTTGTTGCGNGGGGGGTTCCTGTGCTGCCNTT
 GCCNAACGATCTTNTTTGCTCNNCGTGNTGCTTGGTCTTCTTGTCTCTAACTANCGTGTAGTGAGAGTNTCTCTCTCGAGCGTNTCTGGATTGCNCGACGGACGAGGAATTAGTGCTCAGTGTATCGGACCNTTTTCTGGCCGCATGCAGC
 +
 8!-#8-8!-F!-8#!8-!88-##8-FF#FFFFFF!!F-F-F-FF!F--8-8-8#!!!!!88-!F-F-!#8---88!FF8-FF-#-!8-!88-8!#!8--F-FF8FF88F!F8F8!!8!-F!88-!!-F8!F#!8---!-!F!--8--!F!8
- at machine1:HiMom:abcdeACXX:1:1102:1145:1000 1:Y:0:
-AGATTTGTCAGAGTGTNTNTCAGCGGTANCGTAGTAGGCGGTGTTGGGCCGGTTCNTNTANTGNTCGAGCAAGNNACGGGCACACTGNCCATTNATCCTNATGCAAAAGCNTGGNCCCNTGGGAGGAGCCTAGCGAGCGGGGGCGTTTTTA
-+
-8-F-8FF88F!-!F!F#!#!-F-8F!!-#8F888-F!8!8!!8!888-!F!FF!-#F#8-#!F#F-!88-8F!##-F--!--FF-8F#!8FF8#--FF-#8F!-FFFF!8#8!F#-!-#8-FFF!8-FF!8-8--FF!-!8-!!F!!-8--
 @machine1:HiMom:abcdeACXX:1:1102:1163:1000 1:N:0:
 GATACGGTGTTATTCTTCTTGATTTGACTACGNGTCCGACAACNTATTCGTGGAAACACGGCCCAATAGCGCTNGCCCNACAGCTTTATAGTGTCANCAGTGATTACGTCGNTGTCAGGGTTTACAATGNAGNGCAAGCGTTTGGCGGCGA
 +
@@ -194,10 +174,6 @@ TGACTACTTAGTAACGGNGNCCGTGGCCGCTACTGCGCCGAGGTTTTTATGTTTGNCAACTGGAAGGAGGCAATAAACTA
 CGGGGACAGTGTCATTATCGCCNCCGNGCAGGNTTAAGNCNTNCCGGNGGGGGCAGTGCTATTCCGATGTCCCCGNAATAGTCNTGGGTCAGTACCCATGCCCCTTATANAGCNATATNGTAGNCAGCGGCTTGCGGCTCAGCCCATTTTA
 +
 -8-8---F!8!-8-!!FF8!!-#8!-#8F-F8#F--8F#-#8#FF8F#-8FFF8-!8-!-8FF!-!-88F88!-!#8F8F-FF#!!-F888-F-!-888!FF!8FF8F-#88!#888!#8FF8#!888!-88!!8--8!!-8-FF-88!8F
- at machine1:HiMom:abcdeACXX:1:1102:1452:1000 1:Y:0:
-GTTCCGGACGAAGGACTGGATTGCTGCTCAGAGATCCCGGTTCCAGGGTCGGTNCAATTTGTCCGCCAGGTGGANCTTGTTCTTTCAGACTAAGGTTNNAGTGANGCCAGCATTAAGATACAGAAACAACTCGTCCCCTNTCTGACGATCA
-+
-8-FF8!---FF8!!8!-F!8F!8--FF-8F!F!F!!!F-!8F!-8F8F!8!88#FF-88FF!-!-8!F8-!!--#!!-FFF-F8F8--8-F--8!-!##-F!8F#-88F8F-!F-F8F!8-8-FFF8FF-8F-!88!8!#-8F8-8F---F
 @machine1:HiMom:abcdeACXX:1:1102:1470:1000 1:N:0:
 CAGACCGCGGCTCTGGATCACCTCCGACGGGTAGTGACANCTACCTNAATCCGTCCAAGCAATGTGCAGTTCTTAATGACTTGGCTCGAGTAGTCCTGACCAANGAACGGACGTTCTTCGANGATAGGTGGGAGNTGGCTTCACGCTTTAC
 +


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.2.fastq
=====================================
@@ -6,10 +6,6 @@ F-!F8--8F#F#88#-#-FF##F-8!-8#88-F-F-F8F-F-F8F#-8!--8F8-!F!8F!--8-8!FFFFF8F!FFF-F
 CCTCGNTAGGATCATCCTCGCGTGCCATCGCNGATACTNGCTTTATAACTTTTTAATACCACCACTTAAAGCNTTAGNTNTGCACAAGGTCGTACTAAAGGACCCGCTAGCGCGTGATCTGTGGTCCCACAGAGTACNCCGACTACTNTTA
 +
 FF!8F#F88F-!F88--FF----8-F88FF8#!88-!F#-FF-8FF--88!F!FF8FF!8-F--8-!88888#!-8!#F#88F888-!--F--888F-8F-FF8F8---88!F!-FF!-!--FF--F88!-!-!FF!#!88F-88F-#88F
- at machine1:HiMom:abcdeACXX:1:1101:1054:1000 2:Y:0:
-AANACTNCGATTTTGAGATCATGCTCTACTTNCTGGCTATGTATGGTAGTGCGCTGANNNTCTCTATTTTGTGAACATGGCTNGTCGTNGGGTGTCATCGGCTCNCCGTAACACTNTAGCCCNTGGGCCCGCGGNTGNAATTGCTGGGAGG
-+
--F#8!8#-F8---!F8888-8F-F---F888#!FF!F!--!!8FF8F8!F8FF!8--###F!F-!8!-F8F!-F--F!8!8F#88!--#!--8!-8--8-F8-8#!8---F8-88#!-FFFF#--F--!-!-!F#8!#F8F---8FFFFFF
 @machine1:HiMom:abcdeACXX:1:1101:1072:1000 2:N:0:
 NCGGNCTGGTACCTATCGCGACGTCCACATTGTTGTATTCNGTTNCACAACCGTCTAGCCTTCTNTACTACCGCTAAGCTTAAANCCAACTGGACAGTGGGACACGGCTNCTCNGTCACAAACACCNACACAGCCTGTGCNNCACCTCAAG
 +
@@ -26,10 +22,6 @@ TGTGTGNACTATCAATCGACCAGTACTTAGTTCAGCACCGCCCTACTCGGCACTGCTAGCGGGTCGACCTGGATAGCCGT
 GCTTGCCATTTNCCGGACTCTATCCGTGCTCGTAGCACACNTATCGGCACGCCTTCNATACACTCTGACGACNGGCCCCTATGGAATGANTNGTCATCTACACCCTACTCATGAGATTTTAACGGGACAGTAGGCTACATCGGGTCAAACG
 +
 F!888-FF!!!#--!F-F!F!88-F8!!!!-!---!8!F8#-8F!F-!FF!F-8-8#88F8-FFFFF-!--!#8F!F!-8F!F-F88F8#8#F88888--8-88!!F-8FF8-F!F!FFF-F-F888--8FFFFF--88-8-8--!FFF--
- at machine1:HiMom:abcdeACXX:1:1101:1145:1000 2:Y:0:
-TCACTCTTCATTNTGGTCTTGCTGAATCAGCTTATCTTGATGAGAGCGNCTCCTGACTGGGAGGNTGCCCNCCAGANTATNTGACCCCGNGACAGCTGTGACNATCAGGAGCCNNTTCCGCTCCCCCGNAGTCATGTATCGCTTTAAAGAT
-+
-!F8-F-8!F8-8#!!FF-!888F8888-888!F8!--8!FFF-F888-#8!!!-88-!-!!F!F#8F8!F#-F-!8#!8-#F8-!!8!-#F8---F8FFFFF#-F-F-F-8-!##--8!-F!!88FF8#88FF8-88F!888!!8-F8-88
 @machine1:HiMom:abcdeACXX:1:1101:1163:1000 2:N:0:
 GGNGCGCNCTCCGCACGCCANTAGCANCTTGNGTAGGCCCTTNTTTCCAGTTTCTGGTAGGTCTCGAGGCGTATCGTTTNCGGCGTCTTTCCACTGAAAGGGGGTCTTAGGATGGTATCTGGTNGCGNACGTGAGTGTATCGCACGTACCC
 +
@@ -86,10 +78,6 @@ TGGTCCTCTGGTCAGCAGTTCTAAGTGCCGTCTATGGNTGGGTNCACCANCGCTANGTNATAGGTCCCTAGGTCGGGCGT
 TTTGTTTCAGGGCCTTTGCCGTNCGCANTATTGTGTCTCTTCCCAGCAGCTGTCCTTAATGATNTAGCAGATCGCCTGTGCATTANCGCACCTCNTCGTANAGGGGTGTTCCAACGCATACANCTGCNTGGNCGTNNCAATGAATCAGATT
 +
 --!!F!8!FF-!-!88!88!-!#8-FF#F888F!!F!8--8F-!FF8-!F-8FF!FF8F8!88#8--!888!-F!FF8F8F-F-F#!F!88F-F#8!!F8#-!8!---88!--88F-F-88F#8888#-F!#FF!##!F8-!-8F8F-8F-
- at machine1:HiMom:abcdeACXX:1:1101:1452:1000 2:Y:0:
-AAGATCAATTTATGCACGGCCACTAGTGTGGTGAACACCTGTNGTAGTACTTGGTTTACGTCTCCNCTATCGTGCCGTAGAGTTCCCTGTTGGTATGTTATAGGGAACGGAGCATCTCATGCGCCAAACGAGTTTGACGNTGGAGCCNGTC
-+
--8-FFF888F--F8--!8-!--!8F-FF--88F8FF-8-!!F#!-8-!88FF!F--FF!!F8-88#!-F-8---!!F8888!FF!F8!!!8---F88F8888FF!-F--F8-8F-!8FF--FF-888F-F8F-F-8-F-#!FF-8!8#!8!
 @machine1:HiMom:abcdeACXX:1:1101:1470:1000 2:N:0:
 GGGAATTCCGGTTTTTGGCGAAGTCTCGATAACTTCCGCGCGGCACCTAACTTGCCAGCTGTGGTTCGCGTCGTGANTTAATGTTGGGNTCTCGCNCGACATAAAANTGTAAAGGGAGGCCTTGGAGGCCCNGGTGTATGCTNCCAGCTGG
 +
@@ -110,10 +98,6 @@ TTTCACCAGGCCTCCTCGTAAGTAGATCTTATTTGGATCCAGGTAGCATCGGGGGAGCCGACATTNGTCCNGTCTCAGCG
 TTCCTCGNACGTCTTTGNAGANTTTCGCCCAAGGCTTGTCCNTGCAAGACGTCCTGTCGTATAAACNGCCACGGGCGGCTAGGACTTGGANACGGACCTNATAGTTCCTGTGCCACTTNTCGNGTTTTCGTCTTGTTGNTGCGANAGGGGN
 +
 F-!--F-#-8-F!-F--#-!-#88888F-FFF-F!8F!--!#-!-88-F!!F8!88-8-!8--F88#-F--F8FF!-F!!8F8FF8FF-F#--F-F8-F#F-F!F!!FF8!!F!88!F#!-!#-!--F8--!-8!8-8#F88-F#-8-F-#
- at machine1:HiMom:abcdeACXX:1:1102:1054:1000 2:Y:0:
-GNGAGTAACNGGATTCGCCAGTAGTTGTTGCACTTGAANCTAACGCCATTTCGTCCACGGNTTTCTTCGAGNCGGAGGCCGTGGTCCCNNCGCGCAGATNGTTNNGAAGTACCGAGACTGGCCGTGACACTGCACNNCGGGANACCTCCGC
-+
-!#-8F88--#88-F8!--F8---!FF8!!FF8F8-FFF#88F8FF!!-!F!-FF!8F-8!#!8!!-!!--!#F8F-8FF!!F!-88--##!F!888F-!#-F!##!F-!--F!F8!F-F8F8FF!FFF888!88!##888-8#-!-!8F-F
 @machine1:HiMom:abcdeACXX:1:1102:1072:1000 2:N:0:
 ANGAGGCNCCGCCCCNNTTNCTCGTNGCCCTCCCAACCGTGCGACTGGNNGCGCTGGACATCGTCGCAACTTACGGCGTGTGCCCTGAAGGTGACTACACCGNTGAAAGGNCGCCTCGCCGTCCATGCCACAAGGTGGACGNTCATCGNCT
 +
@@ -130,10 +114,6 @@ TTTTCCAGTCNTTCTTGCAGGCCGGTGCATCGGCTTNACGCAATGNCCCCTCNACGTTGTGAGTGTCCCGATCAATTTGN
 CGCCGCTATTCCGGACANATNGTGTGACGCTTTCCGTCTCCCGTCGTCTCGATTTGGCGCCNATCNTCCGTCAGCCTAGAGNANTAACGAANCTGGATGCTGCNCATTGGANATGACTACCTGCTACTTGGNACGATTCTGCACGTCGTCT
 +
 !88F8FFF!8888!-8-#F8#-8!!F-!FFF!888--8FF-F-F--8-!FF8-F888-F!8#F--#!88!!-F-FF!F-8-#-#!--FFF-#8-8-8-!-!-!#88F!!8F#F!8FFF8-F---FF!-888#F8FF8------88--8F!-
- at machine1:HiMom:abcdeACXX:1:1102:1145:1000 2:Y:0:
-ATAGATCCTGTTTAGCCGTTGTTGTTAGCCCCNTCTAGCNNATACCGAATCNGCCCTNCGATCTCCTCAGAGTTCGACCTTCCTTTCNGGAGAGGGTACCTCTCAGAANGCAAGGATGCCCATGTCACTCAGATCCTANATNAGAATCTTT
-+
-8-F8F-!-!F8F-F!!8--!8F8-F-8!-8!!#88-8F!##F-FF!!FF-8#F--8F#-!FF!F-FF8-F8!-!--F8!8!!88F8-#!!F!-F-88F888--8F!FF#---FF8F8-8!!-F!F!8!-F8-8!-F8-#F!#-FFF!-F-F
 @machine1:HiMom:abcdeACXX:1:1102:1163:1000 2:N:0:
 CCTGCTCCTCGGCCGACCTGNCCCTAATGCAGTTGCTCCGGANCTGCCAACGAAAACCTTACTCNTCTANCTCGTANACTACGGCACTGAAGCANTCNGCCCNTTTGTTCNCGTCTAACCACTCTTTCTTCGCGCGATNTAAGGCCTNCTC
 +
@@ -194,10 +174,6 @@ TCGGCACGACTACTAGTAGCACNCCGCCTGGGTCACNTAGCCTCAGTTGGCTCAAATTTGGCTGGAATGACTAATCATAT
 CCCTATTGCACTTAGNGCGTGGAATCGCGGGATTNCGGCCCCCGNCAGTCGGCTATGATTCGANTCCATGCGTGCGTGTGTGCGTATCCCCACGTATAAGAGCGCGGACACTCCANCTGGGAACCAATCNCANTGACNTAGCCGACAATAT
 +
 -8F-F8!F-F8-888#F8FF!!F8F!-8!8!8F-#8F!--8F!F#-8!F!8!-F8-!8F-FF-#-8--8!!88-----F-8--!!888!-F8!-88-----!8!88!8-8-!!-F#!--8!8-!!8--F#!-#F!--#F-F!-!-!F-F88
- at machine1:HiMom:abcdeACXX:1:1102:1452:1000 2:Y:0:
-GCGNCGCTTCGNGNCCGGATGACCTGCTTTGTTNCTCAGTTTTTTTTATGNTNGTACATTCTTCCCTCGATCGAGTGTGTTTGCCTGCGGCTTAGTCGTGGGCTCGCGNCTGTNCGAGGCTGTCATTCCAGGCCTGCCAANNCGGCGGTCT
-+
-!-F#-8!-F!!#-#-!!F-88--!F8F88F--!#FF-8!8!-F8F--8F-#!#8888FF!F!!-F!F!--!!--!88F!8!8!F-!FF!F8!-FF-88-F-!F8-!F-#-8F!#FF888!!!-88-F!!F!-FF8!!F--##8F!---F!F
 @machine1:HiMom:abcdeACXX:1:1102:1470:1000 2:N:0:
 AAGCAANGANGACACCGGTGTCAGTGTTTTGGNATCGCAGCTTTNGACCTGCTTCCTNAACTTNTCTGTTTCCGAAGTCACTTATTNTAAACGAGCTCTGGACTAGGCTCTGTACTCCCAATCTCGTNNTCTCGGGTCAANGAGCCTGGCC
 +


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.barcode_1.fastq
=====================================
@@ -6,10 +6,6 @@ FF!#F-!F
 CTTCGTGT
 +
 FF-!F888
- at machine1:HiMom:abcdeACXX:1:1101:1054:1000 :Y:0:
-GGTGCGCG
-+
-!!FF8F8-
 @machine1:HiMom:abcdeACXX:1:1101:1072:1000 :N:0:
 CTTCCTTG
 +
@@ -26,10 +22,6 @@ AGCCCCCT
 CACTTTTC
 +
 FF88F!8F
- at machine1:HiMom:abcdeACXX:1:1101:1145:1000 :Y:0:
-GTAGGGAT
-+
-F--!!8-F
 @machine1:HiMom:abcdeACXX:1:1101:1163:1000 :N:0:
 TGTCTATT
 +
@@ -86,10 +78,6 @@ TAGCGTTN
 AATTTGCG
 +
 -F--8!!!
- at machine1:HiMom:abcdeACXX:1:1101:1452:1000 :Y:0:
-TCGGCAAC
-+
-8F8-8FF-
 @machine1:HiMom:abcdeACXX:1:1101:1470:1000 :N:0:
 GANCGAAC
 +
@@ -110,10 +98,6 @@ TCGTNTTG
 NCATATCT
 +
 #!FF-!!-
- at machine1:HiMom:abcdeACXX:1:1102:1054:1000 :Y:0:
-CTTATTTA
-+
-8!!---FF
 @machine1:HiMom:abcdeACXX:1:1102:1072:1000 :N:0:
 CCCATGCC
 +
@@ -130,10 +114,6 @@ CCCGNGCT
 GTGGCAGA
 +
 8F8-FF88
- at machine1:HiMom:abcdeACXX:1:1102:1145:1000 :Y:0:
-GGTAAGGT
-+
-F!8---8!
 @machine1:HiMom:abcdeACXX:1:1102:1163:1000 :N:0:
 CCGCGCNC
 +
@@ -194,10 +174,6 @@ TTAGCGTG
 TNNGAGAA
 +
 F##-F!88
- at machine1:HiMom:abcdeACXX:1:1102:1452:1000 :Y:0:
-GGGGCACT
-+
--8!-!FF-
 @machine1:HiMom:abcdeACXX:1:1102:1470:1000 :N:0:
 GGGCAAAT
 +


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/fastq/NN.barcode_2.fastq
=====================================
@@ -6,10 +6,6 @@ CCTGGTAC
 TATGCANC
 +
 F8-F!-#-
- at machine1:HiMom:abcdeACXX:1:1101:1054:1000 :Y:0:
-GTGCAGAC
-+
-FF--88F-
 @machine1:HiMom:abcdeACXX:1:1101:1072:1000 :N:0:
 GTGTCTCG
 +
@@ -26,10 +22,6 @@ F8F#-!--
 GTTGTAGG
 +
 -!!F-88!
- at machine1:HiMom:abcdeACXX:1:1101:1145:1000 :Y:0:
-AGCCGGCG
-+
-FF!F88-F
 @machine1:HiMom:abcdeACXX:1:1101:1163:1000 :N:0:
 CTGCGTAC
 +
@@ -86,10 +78,6 @@ ANCGGGCT
 AGCAGNGT
 +
 8!!88#!-
- at machine1:HiMom:abcdeACXX:1:1101:1452:1000 :Y:0:
-CCNATNCT
-+
-8-#8-#88
 @machine1:HiMom:abcdeACXX:1:1101:1470:1000 :N:0:
 AGNTGGCN
 +
@@ -110,10 +98,6 @@ CGTGGATT
 ANAGGCCG
 +
 8#88!!F!
- at machine1:HiMom:abcdeACXX:1:1102:1054:1000 :Y:0:
-GGCTNTAG
-+
--!88#888
 @machine1:HiMom:abcdeACXX:1:1102:1072:1000 :N:0:
 GATGTTTA
 +
@@ -130,10 +114,6 @@ CATCCNTG
 GAAACGAA
 +
 F-8-8-FF
- at machine1:HiMom:abcdeACXX:1:1102:1145:1000 :Y:0:
-TCCACGTT
-+
-!8-F!F8!
 @machine1:HiMom:abcdeACXX:1:1102:1163:1000 :N:0:
 NGGGATAT
 +
@@ -194,10 +174,6 @@ F-F-88F!
 TTACGCGC
 +
 !!FF!8!8
- at machine1:HiMom:abcdeACXX:1:1102:1452:1000 :Y:0:
-GGCCCGCT
-+
-!F-F--F!
 @machine1:HiMom:abcdeACXX:1:1102:1470:1000 :N:0:
 CTGGTNNN
 +


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/sams/1102.NN.sam
=====================================
@@ -6,8 +6,6 @@ HiMom:1:1102:1018:1000	77	*	0	0	*	*	0	0	.GGAAA.GGATAA.CCAGACACCCAA.GGATATGTAGCAT
 HiMom:1:1102:1018:1000	141	*	0	0	*	*	0	0	TTTCACCAGGCCTCCTCGTAAGTAGATCTTATTTGGATCCAGGTAGCATCGGGGGAGCCGACATT.GTCC.GTCTCAGCGTCGTCCACCTACTCTGACG.GTACCAGAGTGCTCCCGGTACCTCAGTGCCAAGTCGGATTAGCTTGCCAGT	88!!8-8F-F-F-8-!!-!F88F-F-8!FF-8F!8!F!8FF-FF88-F8!F!!8-F!F8FF8FFF#!8!F#8888!-8-!!F-F!F-F8!-!88!--F-#!F88!F!-!F!8-8F!!-!F!--F--F8-!8888F!!8F88!!----!888	BC:Z:TCGTNTTG-CGTGGATT	RG:Z:HiMom.1
 HiMom:1:1102:1036:1000	77	*	0	0	*	*	0	0	CAGTGTTTGTTCGAATCCGCTCCCTTCTGCTGACGTGGGT....GG.AACCGAAACGCTTTTCTCCCAC.CCGG.GTCGTTCAACTCTA.ATGGGACAGCGCATGGTTCGTCTA.GC.TGACTCGTGGCA.ACGTCCTACGACCGCTAAAT	F-!8--!F-F-8!F8F888!!!F8!F-8F!!F-F-F!-!F####!!#-FF8!F-F!8FF--8F-8FF-!#!--F#FF-!8FFF---F!-#8-F!!8!--F!FF8-88FF8--88#F-#!!-FF!F---!F#8F--88!F-!--!8!8F8-8	BC:Z:NCATATCT-ANAGGCCG	RG:Z:HiMom.1
 HiMom:1:1102:1036:1000	141	*	0	0	*	*	0	0	TTCCTCG.ACGTCTTTG.AGA.TTTCGCCCAAGGCTTGTCC.TGCAAGACGTCCTGTCGTATAAAC.GCCACGGGCGGCTAGGACTTGGA.ACGGACCT.ATAGTTCCTGTGCCACTT.TCG.GTTTTCGTCTTGTTG.TGCGA.AGGGG.	F-!--F-#-8-F!-F--#-!-#88888F-FFF-F!8F!--!#-!-88-F!!F8!88-8-!8--F88#-F--F8FF!-F!!8F8FF8FF-F#--F-F8-F#F-F!F!!FF8!!F!88!F#!-!#-!--F8--!-8!8-8#F88-F#-8-F-#	BC:Z:NCATATCT-ANAGGCCG	RG:Z:HiMom.1
-HiMom:1:1102:1054:1000	589	*	0	0	*	*	0	0	CGGG.CCGCCAGAT.TTCCCCGTTCCCACGGACGTTCCTTGGCAGCGCTACTGTCGGGGTTGATCATGCCGGTGTAGCAGGCGT.CCGGACAGTGAACTAA.GTCTTGATTCCACCG..CATAGC.TCTGATACACCTCAATTCGAGTTCA	--8-#-8F8FF-FF#--F8!--8--F8F!!F88F-!!F8!!8--F8F888F8F!--8!88F-F88--!F88-F!--FF-8-FF!#F!-88F-8FFFF-!-F#-F8!-!8!!-88!F-##!F-88!#F-F---FF8FF8!8F-8F-F!-8!8	BC:Z:CTTATTTA-GGCTNTAG	RG:Z:HiMom.1
-HiMom:1:1102:1054:1000	653	*	0	0	*	*	0	0	G.GAGTAAC.GGATTCGCCAGTAGTTGTTGCACTTGAA.CTAACGCCATTTCGTCCACGG.TTTCTTCGAG.CGGAGGCCGTGGTCCC..CGCGCAGAT.GTT..GAAGTACCGAGACTGGCCGTGACACTGCAC..CGGGA.ACCTCCGC	!#-8F88--#88-F8!--F8---!FF8!!FF8F8-FFF#88F8FF!!-!F!-FF!8F-8!#!8!!-!!--!#F8F-8FF!!F!-88--##!F!888F-!#-F!##!F-!--F!F8!F-F8F8FF!FFF888!88!##888-8#-!-!8F-F	BC:Z:CTTATTTA-GGCTNTAG	RG:Z:HiMom.1
 HiMom:1:1102:1072:1000	77	*	0	0	*	*	0	0	GCGCTTGTTCCGATTTGT.TGGCGCTGCGGCAGCCTGATCGG.GCGCCTTGGT.GAGAGGCGCACTTGCACTA.CG.CGGGCTACCGCCA.ACGTTTTCTCTGCCGG.AGCCGTATCCGGTTGGAT.TTCCG.CCATCCACGAACTTCATC	F---F!!-!8!F8F8--F#8F-8888!!--F8!-88-F88FF#!88F-F-FF-#FF-F-FF!-F-!FF!8--F#-!#F8FF-F8!FFF!-#F!F8F8!8FFF8!-88#--8!FF8F-8!F8-!8-F#8-!--#FF8!!--!!FF8FFF8!-	BC:Z:CCCATGCC-GATGTTTA	RG:Z:HiMom.1
 HiMom:1:1102:1072:1000	141	*	0	0	*	*	0	0	A.GAGGC.CCGCCCC..TT.CTCGT.GCCCTCCCAACCGTGCGACTGG..GCGCTGGACATCGTCGCAACTTACGGCGTGTGCCCTGAAGGTGACTACACCG.TGAAAGG.CGCCTCGCCGTCCATGCCACAAGGTGGACG.TCATCG.CT	8#--8F-#F8!F!F8##88#-!F-8#F!-F---FF-F8-!8-8-8F8!##--F-F-8FF-FFFF--8--!8--F--!FF!!-!888FFFF!!!-!--F-8!-#--8FF!-#FF-!8F!-F-!-!8-888FFFF-8!--8!!#-F-8F!#!8	BC:Z:CCCATGCC-GATGTTTA	RG:Z:HiMom.1
 HiMom:1:1102:1090:1000	77	*	0	0	*	*	0	0	GCCTACGCATCCGCCC.CACTG.ATGGGTGAGCC.G.ACTAAGCTGTAGTGCCTGATCCCTCCAGGAGCCCTTTA.TGAATCGGAACGCTATGCGACTTGTGATAACGAAAATTTCAGAAGTT.ATCGCCAGTGTGGTTCTTCC.AACATG	!-F-88F88!!8!--8#---8!#F8F8-!F--8!#8#8-8F-8-!-F888FF8!8F88!-F-F8!8F---!F8!-#8F-F8!F--8F!!!8-F8F8FFF!!!---8!-8FF8F!-8-!FF!F-#-FFF88-8!!8!!8-8!F-!#FF!8!-	BC:Z:TTGCCTTT-TTTCGGTA	RG:Z:HiMom.1
@@ -16,8 +14,6 @@ HiMom:1:1102:1108:1000	77	*	0	0	*	*	0	0	TTA.GGGGAGTGC.AAGG.CTTA.AGTTCACCGAGCCCAT
 HiMom:1:1102:1108:1000	141	*	0	0	*	*	0	0	TTTTCCAGTC.TTCTTGCAGGCCGGTGCATCGGCTT.ACGCAATG.CCCCTC.ACGTTGTGAGTGTCCCGATCAATTTG.GC..AAGTACCAAAGGTGCCTGTCTGTAGTTGAACATTACGTGGCGTATGG.GTAAGTTTCTATGCACGCG	8FF-8F8-88#F8--8F!F--8888F-8F!!--!8-#8-8-8--8#8-8F!F#8!F-F-8!--!8-!!8!88!-F!!8-#--##F--8-!-8-F!FFFF88!8-8FFF-!F8FF8FF-F!--F88-!-!!8#-F88!F8F!8-F-8-F---	BC:Z:CCCGNGCT-CATCCNTG	RG:Z:HiMom.1
 HiMom:1:1102:1127:1000	77	*	0	0	*	*	0	0	GCC.AACGATCTT.TTTGCTC..CGTG.TGCTTGGTCTTCTTGTCTCTAACTA.CGTGTAGTGAGAGT.TCTCTCTCGAGCGT.TCTGGATTGC.CGACGGACGAGGAATTAGTGCTCAGTGTATCGGACC.TTTTCTGGCCGCATGCAGC	8!-#8-8!-F!-8#!8-!88-##8-FF#FFFFFF!!F-F-F-FF!F--8-8-8#!!!!!88-!F-F-!#8---88!FF8-FF-#-!8-!88-8!#!8--F-FF8FF88F!F8F8!!8!-F!88-!!-F8!F#!8---!-!F!--8--!F!8	BC:Z:GTGGCAGA-GAAACGAA	RG:Z:HiMom.1
 HiMom:1:1102:1127:1000	141	*	0	0	*	*	0	0	CGCCGCTATTCCGGACA.AT.GTGTGACGCTTTCCGTCTCCCGTCGTCTCGATTTGGCGCC.ATC.TCCGTCAGCCTAGAG.A.TAACGAA.CTGGATGCTGC.CATTGGA.ATGACTACCTGCTACTTGG.ACGATTCTGCACGTCGTCT	!88F8FFF!8888!-8-#F8#-8!!F-!FFF!888--8FF-F-F--8-!FF8-F888-F!8#F--#!88!!-F-FF!F-8-#-#!--FFF-#8-8-8-!-!-!#88F!!8F#F!8FFF8-F---FF!-888#F8FF8------88--8F!-	BC:Z:GTGGCAGA-GAAACGAA	RG:Z:HiMom.1
-HiMom:1:1102:1145:1000	589	*	0	0	*	*	0	0	AGATTTGTCAGAGTGT.T.TCAGCGGTA.CGTAGTAGGCGGTGTTGGGCCGGTTC.T.TA.TG.TCGAGCAAG..ACGGGCACACTG.CCATT.ATCCT.ATGCAAAAGC.TGG.CCC.TGGGAGGAGCCTAGCGAGCGGGGGCGTTTTTA	8-F-8FF88F!-!F!F#!#!-F-8F!!-#8F888-F!8!8!!8!888-!F!FF!-#F#8-#!F#F-!88-8F!##-F--!--FF-8F#!8FF8#--FF-#8F!-FFFF!8#8!F#-!-#8-FFF!8-FF!8-8--FF!-!8-!!F!!-8--	BC:Z:GGTAAGGT-TCCACGTT	RG:Z:HiMom.1
-HiMom:1:1102:1145:1000	653	*	0	0	*	*	0	0	ATAGATCCTGTTTAGCCGTTGTTGTTAGCCCC.TCTAGC..ATACCGAATC.GCCCT.CGATCTCCTCAGAGTTCGACCTTCCTTTC.GGAGAGGGTACCTCTCAGAA.GCAAGGATGCCCATGTCACTCAGATCCTA.AT.AGAATCTTT	8-F8F-!-!F8F-F!!8--!8F8-F-8!-8!!#88-8F!##F-FF!!FF-8#F--8F#-!FF!F-FF8-F8!-!--F8!8!!88F8-#!!F!-F-88F888--8F!FF#---FF8F8-8!!-F!F!8!-F8-8!-F8-#F!#-FFF!-F-F	BC:Z:GGTAAGGT-TCCACGTT	RG:Z:HiMom.1
 HiMom:1:1102:1163:1000	77	*	0	0	*	*	0	0	GATACGGTGTTATTCTTCTTGATTTGACTACG.GTCCGACAAC.TATTCGTGGAAACACGGCCCAATAGCGCT.GCCC.ACAGCTTTATAGTGTCA.CAGTGATTACGTCG.TGTCAGGGTTTACAATG.AG.GCAAGCGTTTGGCGGCGA	!-!888F-8!!8!8--88!888---!8FF88F#--!F8-!-F8#F88F!88!!F-8F8-8!--!-F!FF!8-F#F!!8#-!F88F-!-FF!8FFFF#F-88F8F!8!!8FF#!8-!F888F8F--FF8-#88#-!--F88F!-F-!--!F-	BC:Z:CCGCGCNC-NGGGATAT	RG:Z:HiMom.1
 HiMom:1:1102:1163:1000	141	*	0	0	*	*	0	0	CCTGCTCCTCGGCCGACCTG.CCCTAATGCAGTTGCTCCGGA.CTGCCAACGAAAACCTTACTC.TCTA.CTCGTA.ACTACGGCACTGAAGCA.TC.GCCC.TTTGTTC.CGTCTAACCACTCTTTCTTCGCGCGAT.TAAGGCCT.CTC	F!-!-F88FF-!F-88F!-!#-8!8-F!88--8F!!FF--8F#-FF88FF---F8F8!88F8!-#F!!8#88!-FF#-!FF8!F-F!88F----#!-#-!F-#8!--!!8#88FFF88F8-8!!-!F888!!FF!8F8#8-F!!!-8#F!-	BC:Z:CCGCGCNC-NGGGATAT	RG:Z:HiMom.1
 HiMom:1:1102:1181:1000	77	*	0	0	*	*	0	0	TAGCATCGTAAACGGGACTTCGCTAGTCCAGTCTCTTACTAGTCCGG.T.TGGACTA..GTT.TGTA.ACCCGACTCGGA.T.CATTAGTCAC.CAGACT.CTGT.G.CATCAA.GACCC.AC.CCTCCTTCCCAGATAACCGTT.GTTTC	-F!!8F!F!F--!F-F--F!-!---8F!!F-FF-!F8F8F--F--8-#-#-8!F!!F##-88#-8F8#-!-8F--!-!!8#8#8-!F88-8--#-F--!-#!---#-#F-8FFF#8888F#8!#F-888!!!-FF-F!FFF!!!F#8!F88	BC:Z:CGCGTAGT-ATTCCGAC	RG:Z:HiMom.1
@@ -48,8 +44,6 @@ HiMom:1:1102:1416:1000	77	*	0	0	*	*	0	0	TGACTACTTAGTAACGG.G.CCGTGGCCGCTACTGCGCCG
 HiMom:1:1102:1416:1000	141	*	0	0	*	*	0	0	TCGGCACGACTACTAGTAGCAC.CCGCCTGGGTCAC.TAGCCTCAGTTGGCTCAAATTTGGCTGGAATGACTAATCATATTTTGTCCATACAATCGATCTTTGGGCCTCCC.CCCCAT.A.CCGCGGGGTACCTTGTGCCTCTCACTTGCC	-8!FF8!!8F8F8F-!!F8-8F#FF88!8-!!!FF-#-F8FF8F-FF-F-8-!8FF88!8-88-88F!-F!F888888-!!F8F!!FFFFF---!FF!-!F88--8---!F#-!8FF!#F#!-8!--!FF-!!F88!8FF--!88F88F!!	BC:Z:TTAGCGTG-GTGCCAAG	RG:Z:HiMom.1
 HiMom:1:1102:1434:1000	77	*	0	0	*	*	0	0	CGGGGACAGTGTCATTATCGCC.CCG.GCAGG.TTAAG.C.T.CCGG.GGGGGCAGTGCTATTCCGATGTCCCCG.AATAGTC.TGGGTCAGTACCCATGCCCCTTATA.AGC.ATAT.GTAG.CAGCGGCTTGCGGCTCAGCCCATTTTA	-8-8---F!8!-8-!!FF8!!-#8!-#8F-F8#F--8F#-#8#FF8F#-8FFF8-!8-!-8FF!-!-88F88!-!#8F8F-FF#!!-F888-F-!-888!FF!8FF8F-#88!#888!#8FF8#!888!-88!!8--8!!-8-FF-88!8F	BC:Z:TNNGAGAA-TTACGCGC	RG:Z:HiMom.1
 HiMom:1:1102:1434:1000	141	*	0	0	*	*	0	0	CCCTATTGCACTTAG.GCGTGGAATCGCGGGATT.CGGCCCCCG.CAGTCGGCTATGATTCGA.TCCATGCGTGCGTGTGTGCGTATCCCCACGTATAAGAGCGCGGACACTCCA.CTGGGAACCAATC.CA.TGAC.TAGCCGACAATAT	-8F-F8!F-F8-888#F8FF!!F8F!-8!8!8F-#8F!--8F!F#-8!F!8!-F8-!8F-FF-#-8--8!!88-----F-8--!!888!-F8!-88-----!8!88!8-8-!!-F#!--8!8-!!8--F#!-#F!--#F-F!-!-!F-F88	BC:Z:TNNGAGAA-TTACGCGC	RG:Z:HiMom.1
-HiMom:1:1102:1452:1000	589	*	0	0	*	*	0	0	GTTCCGGACGAAGGACTGGATTGCTGCTCAGAGATCCCGGTTCCAGGGTCGGT.CAATTTGTCCGCCAGGTGGA.CTTGTTCTTTCAGACTAAGGTT..AGTGA.GCCAGCATTAAGATACAGAAACAACTCGTCCCCT.TCTGACGATCA	8-FF8!---FF8!!8!-F!8F!8--FF-8F!F!F!!!F-!8F!-8F8F!8!88#FF-88FF!-!-8!F8-!!--#!!-FFF-F8F8--8-F--8!-!##-F!8F#-88F8F-!F-F8F!8-8-FFF8FF-8F-!88!8!#-8F8-8F---F	BC:Z:GGGGCACT-GGCCCGCT	RG:Z:HiMom.1
-HiMom:1:1102:1452:1000	653	*	0	0	*	*	0	0	GCG.CGCTTCG.G.CCGGATGACCTGCTTTGTT.CTCAGTTTTTTTTATG.T.GTACATTCTTCCCTCGATCGAGTGTGTTTGCCTGCGGCTTAGTCGTGGGCTCGCG.CTGT.CGAGGCTGTCATTCCAGGCCTGCCAA..CGGCGGTCT	!-F#-8!-F!!#-#-!!F-88--!F8F88F--!#FF-8!8!-F8F--8F-#!#8888FF!F!!-F!F!--!!--!88F!8!8!F-!FF!F8!-FF-88-F-!F8-!F-#-8F!#FF888!!!-88-F!!F!-FF8!!F--##8F!---F!F	BC:Z:GGGGCACT-GGCCCGCT	RG:Z:HiMom.1
 HiMom:1:1102:1470:1000	77	*	0	0	*	*	0	0	CAGACCGCGGCTCTGGATCACCTCCGACGGGTAGTGACA.CTACCT.AATCCGTCCAAGCAATGTGCAGTTCTTAATGACTTGGCTCGAGTAGTCCTGACCAA.GAACGGACGTTCTTCGA.GATAGGTGGGAG.TGGCTTCACGCTTTAC	8FF8-FFF!F-8--F-888-!!-!-8--8FFFF!!F8FF#!!F!!8#F8!8F8-8-8-F!--8-F!8----!F----8-8-F!!-F!F-!F-!!F-F!FFFFF#F--F----!!F-!!F--#88!F!F!8-F--#-F8-F-!-!!-!!!-F	BC:Z:GGGCAAAT-CTGGTNNN	RG:Z:HiMom.1
 HiMom:1:1102:1470:1000	141	*	0	0	*	*	0	0	AAGCAA.GA.GACACCGGTGTCAGTGTTTTGG.ATCGCAGCTTT.GACCTGCTTCCT.AACTT.TCTGTTTCCGAAGTCACTTATT.TAAACGAGCTCTGGACTAGGCTCTGTACTCCCAATCTCGT..TCTCGGGTCAA.GAGCCTGGCC	F8-888#!8#-8--F--!F--888!8F8!-F8#-F!!!--!F8-#--8--F-!8FFF#--F!-#!F-!!!F-8-FF8--F!-88!8#88-F-F-8F--!8!F!-8-F--!88FF!-8!--8-!88F!##-!8-!!FF8-F#8FF-!!!---	BC:Z:GGGCAAAT-CTGGTNNN	RG:Z:HiMom.1
 HiMom:1:1102:1488:1000	77	*	0	0	*	*	0	0	CGCTGTGCGTAACTTCCATGAATATCGAGGTGGATCTC.GTAGTGTTTG.AC.ATAGGTACAAACGTCCAACATGTCACGTCGAGAACGCCCCGATGTGCGCGAGAAGT.ATGAGCGTATGCAGGGCGTCAATTGCCCTTGAGAAGGTGGG	FF--8F88!!-8-F8!-FF!88F-!F8F!F!!F--F88#!88-F-F--F#8-#8-8-8-8!F-88!8!!FF88!FF!-8FFF--8-8F8-FF8--8FFFFF-FFF8888#F8!F!888-F!--!88-8!---FFF-!!F!FF--8F88-!!	BC:Z:CTCATACG-CTGNTCCC	RG:Z:HiMom.1


=====================================
testdata/picard/illumina/151T8B8B151T_cbcl/sams/NN.sam
=====================================
@@ -4,8 +4,6 @@ HiMom:1:1101:1000:1000	77	*	0	0	*	*	0	0	TGATGGTTTCGGG.TTTAGACAGTGTCATGCCTATTCC.T
 HiMom:1:1101:1000:1000	141	*	0	0	*	*	0	0	CCTGAAGAG.C.CA.C.CCA..GGATGA.AGTGACCACGGGATGC.AGTGCCCACGATGCGTAGGACGGGGAGCCATGATCGTCCGGGTTTGGCGT.CTATCGTGATAGGAGACGGTGCCCAGTGATGCC.CCGCGCACTG.TAACCCAGT	F-!F8--8F#F#88#-#-FF##F-8!-8#88-F-F-F8F-F-F8F#-8!--8F8-!F!8F!--8-8!FFFFF8F!FFF-F-8-FFFF!8--88!8-#88F!88-F-F-F-FFF8--8--!!-FFF-F!!!#FF8-FFF!--#FF-F!-F-!	BC:Z:GCCNAGTA-CCTGGTAC	RG:Z:HiMom.1
 HiMom:1:1101:1018:1000	77	*	0	0	*	*	0	0	GGTGGGGCAGCTC..GT.CTGGGTATG.TTACATGATTCAAGCATACTGCCCCTGATA.TA.TCGCGG.TTCTGCTA.GTATTTCCCGGGAACTTCTTTCACCTATCCGAACAACAGCTTTCCCAGTCAGAGTCAGCGAACATTATAACTC	FFF!-!-!F!!!!##!F#!FF8!FF-!#8!8F-8!----F-!-F8--88-FF!-!8F-#88#-8F!8F#88-8!!FF#!F8!8!!F!F-F-F!8F8FF!8---8-FFF8---8-8--!!-F8-!8888F8F8!F8FFF--!F!-8FFF--F	BC:Z:CTTCGTGT-TATGCANC	RG:Z:HiMom.1
 HiMom:1:1101:1018:1000	141	*	0	0	*	*	0	0	CCTCG.TAGGATCATCCTCGCGTGCCATCGC.GATACT.GCTTTATAACTTTTTAATACCACCACTTAAAGC.TTAG.T.TGCACAAGGTCGTACTAAAGGACCCGCTAGCGCGTGATCTGTGGTCCCACAGAGTAC.CCGACTACT.TTA	FF!8F#F88F-!F88--FF----8-F88FF8#!88-!F#-FF-8FF--88!F!FF8FF!8-F--8-!88888#!-8!#F#88F888-!--F--888F-8F-FF8F8---88!F!-FF!-!--FF--F88!-!-!FF!#!88F-88F-#88F	BC:Z:CTTCGTGT-TATGCANC	RG:Z:HiMom.1
-HiMom:1:1101:1054:1000	589	*	0	0	*	*	0	0	GTCGTACG.TCGAAG.TGAGGACGGGATTGTCTGTAAACTTGCGCGAGACCGAAATGTCAAACGG.TTCGGTAACAAGAACACAAC.CTTCCGCATACACGTCGGTGTTTCCTATACCGCAACCGTTGGAGGTTCCACGG.CTAGGCTCGC	F!!!8--8#88-FF!#--FF-88-88F-!8!F-!--F8F8!FFF8-8!F8F8FF--F-!F--F-F#-8!-F-FF8888F-----F8#!F!!8F!-8F!FFF!-!!---F--88-88-F8F-F!----FFF!!8F!8FFF-#8-88-!F-88	BC:Z:GGTGCGCG-GTGCAGAC	RG:Z:HiMom.1
-HiMom:1:1101:1054:1000	653	*	0	0	*	*	0	0	AA.ACT.CGATTTTGAGATCATGCTCTACTT.CTGGCTATGTATGGTAGTGCGCTGA...TCTCTATTTTGTGAACATGGCT.GTCGT.GGGTGTCATCGGCTC.CCGTAACACT.TAGCCC.TGGGCCCGCGG.TG.AATTGCTGGGAGG	-F#8!8#-F8---!F8888-8F-F---F888#!FF!F!--!!8FF8F8!F8FF!8--###F!F-!8!-F8F!-F--F!8!8F#88!--#!--8!-8--8-F8-8#!8---F8-88#!-FFFF#--F--!-!-!F#8!#F8F---8FFFFFF	BC:Z:GGTGCGCG-GTGCAGAC	RG:Z:HiMom.1
 HiMom:1:1101:1072:1000	77	*	0	0	*	*	0	0	CCTTGATC.CTCCGCTTGAGTTT.GTTTCAGATGCCTT.AGGAAGCGATATTCCAACTCATGGAGCGTCAGCAGCGATTGTCGTATAGCCGGGCAAATCACTAGGAATGCC.T.TGTGAACAGTGGCATTGTTGTATGGTGTGTCCCCAAG	-F-F88--#F8F888-!8F!F--#-!-F8--8!FF!-8#F8-F8-F88!-F8-8--!FF8FFF-F88!!F8!-!8--8-!!!-F--F!F----FFFF!-8!8-F-F-8F8!#-#--8F--88-!-!!88-!F-!FFFF8F8F8F!-88FF8	BC:Z:CTTCCTTG-GTGTCTCG	RG:Z:HiMom.1
 HiMom:1:1101:1072:1000	141	*	0	0	*	*	0	0	.CGG.CTGGTACCTATCGCGACGTCCACATTGTTGTATTC.GTT.CACAACCGTCTAGCCTTCT.TACTACCGCTAAGCTTAAA.CCAACTGGACAGTGGGACACGGCT.CTC.GTCACAAACACC.ACACAGCCTGTGC..CACCTCAAG	#FF!#F-8--8!-8FF-!-F--8!FF88-!-8-!-8-!!8#F8!#F--8-!8!--F88-F!F!!#88!8-F!----8888!-8-#88F-FFFF8!FF!!8F-8F8FF--#-F!#!!-8-88888--#FF8-FF---!!8-##-88!-F8--	BC:Z:CTTCCTTG-GTGTCTCG	RG:Z:HiMom.1
 HiMom:1:1101:1090:1000	77	*	0	0	*	*	0	0	G.ATAGG.AA.GGAGC.CCTGTAAAGTGCCGGTACATTGAATACCTCTCA.ATG.CAGAAGTAGACCAGCTTCG.CAGGACAAATTCATCATAGTTTATAGGTAATCCA.TTGAGGC.CCTTGGCTTGATATTCTCCCGTCTACCGAGTCT	F#F-F-!#-8#!8---#F8!!F8-F8F-!8-!8-!8!F!F-88F88-F--#FF-#--88-!8F--FFF!8-8!-#FFF8F88F-!!--!!F!8!--88F-F8F8--!--#88!F8-!#F!8!F88F-F-F-FF8FFF8F-!!F8-!-!F-8	BC:Z:TCTCACTC-AAGAGCAA	RG:Z:HiMom.1
@@ -14,8 +12,6 @@ HiMom:1:1101:1108:1000	77	*	0	0	*	*	0	0	.TCT.A.ATTAAGTGCGGCAG.TGGGGCCCCCTGGTTTGA
 HiMom:1:1101:1108:1000	141	*	0	0	*	*	0	0	TGTGTG.ACTATCAATCGACCAGTACTTAGTTCAGCACCGCCCTACTCGGCACTGCTAGCGGGTCGACCTGGATAGCCGTAGCGCGAC.AGCGATTGTCTTGAGTGCTCGCCAGATCCTTCTGTCCTGTATTCATACA.AGTGGGAAAGGG	88!F8F#--!-8!FF8F!FF--FF-!!!--!F8F-!-!8F--!88FF!F-F---88-88-!-!!FF8!!-FF8!----!FF--888F!#F!88-8!-FF!F88FF8--8!-!8---!-888-F!8-8-F8-!88-FFF#-8-!!--F-88-	BC:Z:AGCCCCCT-CGTNATTA	RG:Z:HiMom.1
 HiMom:1:1101:1127:1000	77	*	0	0	*	*	0	0	TTTTCTTTGTTA.GCCGTC.ATGGGTCC.GGCCCACCGTACA.ACCCATCAGCGTCTGACG.CCGTACTTCG.TACTTATGGTGACTGTGA.TGCCACGACTTGTCAT.TACTTGGGGTTGTGA.TA.TACACCCTATCCGAACTT.AGGT	F8F-8!-!F8-8#!FFFF-#FF--F8!8#8!F-8-!!--8!-#-F-88!8-!FF!FF8F8F#F-FF8!88-8#--8!F-F8--F-!8F888#!!--8!F8888!F!8!#88-F88!!-F!F8!8#88#F-8F!-F!8!8!!8F-F8#88FF	BC:Z:CACTTTTC-GTTGTAGG	RG:Z:HiMom.1
 HiMom:1:1101:1127:1000	141	*	0	0	*	*	0	0	GCTTGCCATTT.CCGGACTCTATCCGTGCTCGTAGCACAC.TATCGGCACGCCTTC.ATACACTCTGACGAC.GGCCCCTATGGAATGA.T.GTCATCTACACCCTACTCATGAGATTTTAACGGGACAGTAGGCTACATCGGGTCAAACG	F!888-FF!!!#--!F-F!F!88-F8!!!!-!---!8!F8#-8F!F-!FF!F-8-8#88F8-FFFFF-!--!#8F!F!-8F!F-F88F8#8#F88888--8-88!!F-8FF8-F!F!FFF-F-F888--8FFFFF--88-8-8--!FFF--	BC:Z:CACTTTTC-GTTGTAGG	RG:Z:HiMom.1
-HiMom:1:1101:1145:1000	589	*	0	0	*	*	0	0	TTGTC.CCTT.GCTAAAGATCTCCGTCGCTCGTCTCCTG.CCCGTATCTACCTAAGCCT.CTGCG.GGTTCGTAGCCCGGCCTACAAGGCAGGCTTCA..T.TGCGG.GGGAC.GAAACGCCACGCTAACCGCTCAGGCAGTAGAGCTAGT	!-8-F#!8--#FF8F-FF---!F!!!8-!!F88!!!--!#!8F88F!-!-F-8F-FFF!#FF!8-#!F-8!!!88F!!8!-!888F-!FF8F88-8!-##!#!!8!8#-!FF!#-F888!F-F--FFF88888F8F------FFF!!8-8!	BC:Z:GTAGGGAT-AGCCGGCG	RG:Z:HiMom.1
-HiMom:1:1101:1145:1000	653	*	0	0	*	*	0	0	TCACTCTTCATT.TGGTCTTGCTGAATCAGCTTATCTTGATGAGAGCG.CTCCTGACTGGGAGG.TGCCC.CCAGA.TAT.TGACCCCG.GACAGCTGTGAC.ATCAGGAGCC..TTCCGCTCCCCCG.AGTCATGTATCGCTTTAAAGAT	!F8-F-8!F8-8#!!FF-!888F8888-888!F8!--8!FFF-F888-#8!!!-88-!-!!F!F#8F8!F#-F-!8#!8-#F8-!!8!-#F8---F8FFFFF#-F-F-F-8-!##--8!-F!!88FF8#88FF8-88F!888!!8-F8-88	BC:Z:GTAGGGAT-AGCCGGCG	RG:Z:HiMom.1
 HiMom:1:1101:1163:1000	77	*	0	0	*	*	0	0	TCCT.CA.TCGCACCGGAGAATTCCCACGATTCCCAAGC.AA.ACGATCTAATCTGAGCTTAGAACGAACAGACTCGGTAGGGGGATATTGTATCGCTGCCGTCGCGTGCTATGCTACGGTCTC.GTTATAATGGC.TTTTGGTCGCTTTA	F8F8#-8#-8F88!F--88F8--!8!F8F8!!F!!FF-8#-F#FF--F!8888-F!--88-888-!F8F!8FF8--8!FF!888!8--F8F-F8F!-!8---88-F8F-!!F888-88F8!F88#F-FF8F-!!8-#!F!-!88-!F!888	BC:Z:TGTCTATT-CTGCGTAC	RG:Z:HiMom.1
 HiMom:1:1101:1163:1000	141	*	0	0	*	*	0	0	GG.GCGC.CTCCGCACGCCA.TAGCA.CTTG.GTAGGCCCTT.TTTCCAGTTTCTGGTAGGTCTCGAGGCGTATCGTTT.CGGCGTCTTTCCACTGAAAGGGGGTCTTAGGATGGTATCTGGT.GCG.ACGTGAGTGTATCGCACGTACCC	F8#!8-!#8!8-8!88-!!-#8-!8F#8!!!#F!F--!!---#-!---8-!-FF!8!!F!8-8!!!F!--F!888!F--#F8F8-F8!F!-!8F8!-F--8!F!F8FFF!F-!!FF-FF88F8#---#8--FF-!!F!-F8!F888-FF!!	BC:Z:TGTCTATT-CTGCGTAC	RG:Z:HiMom.1
 HiMom:1:1101:1181:1000	77	*	0	0	*	*	0	0	CGCGTGAAACGTCCACAATAG.GACGTCGCGTGATGTTGTTCTA.GGCGATAC.ACGAGGTGATCAGAAC.CCTTCAGTTTGTTGGAGTC.CTTCTGGACACC.CACCCGGATGATTAAGAGCTACGCGCTAGCCATATACGA.ATCC.TC	!8-!88888-!F8!888F!8!#8--F!F!--!-F!-F-!8!F88#!-!----F#---F-8F!8!-8-8--#8-F!F88-!-!F8!!-!!F#8F--F8FF-8!-#-FF-FF8F!FF-!FF8-8---F!F8F888!!--FFF---#888!#!-	BC:Z:TGTGTCAG-CTAGTCTC	RG:Z:HiMom.1
@@ -44,8 +40,6 @@ HiMom:1:1101:1416:1000	77	*	0	0	*	*	0	0	AACTTGGGTGCCCGC..GCTCTCGAGGCT.G.ACGTCATG
 HiMom:1:1101:1416:1000	141	*	0	0	*	*	0	0	TGGTCCTCTGGTCAGCAGTTCTAAGTGCCGTCTATGG.TGGGT.CACCA.CGCTA.GT.ATAGGTCCCTAGGTCGGGCGTGCGACTCACCGCCGGAAGGGGTGGCCGGG.TATTTCTTCCAGGCAAGCCA.CTAATGGTAAATCTGTCGCA	-8F8F-!-!--F!F8-F-!F888FF-F--F8!--888#888!!#-F-!-#F-8!F#!!#----!8-!!88F8!!F8-888!FF8!!88!8FF8!---F!F88!8-8F88#-F----F--8F-!FFF!F8-#-!-F!F88--8--!-8-F8-	BC:Z:TAGCGTTN-ANCGGGCT	RG:Z:HiMom.1
 HiMom:1:1101:1434:1000	77	*	0	0	*	*	0	0	TACTC.GTGGACTTGTATCC.GGACTTTCTCTCTG.TACTGGGTT.CGCCGAACTCCCCGTT.AGCCATC.CGGTGCTGGACCACA.ATCGCGTC.GACATGCGCACTAG.CGAACCCTATACTCTA.TTC.CCTTCGCTTCGGCAGTTGT	-888!#8FFF-F!-8!F!F-#!8-F888F8-8F!8#!FF!!8-!-#-8F!!8F8-F88!-F!#-!8-88!#-F8F88!F8-!F-F8#F!F!F!--#8-8-!F8!8-F-F-#FF8F-F8!-!88-!8F#!!8#88-8!F!!8F8!-F88!FF	BC:Z:AATTTGCG-AGCAGNGT	RG:Z:HiMom.1
 HiMom:1:1101:1434:1000	141	*	0	0	*	*	0	0	TTTGTTTCAGGGCCTTTGCCGT.CGCA.TATTGTGTCTCTTCCCAGCAGCTGTCCTTAATGAT.TAGCAGATCGCCTGTGCATTA.CGCACCTC.TCGTA.AGGGGTGTTCCAACGCATACA.CTGC.TGG.CGT..CAATGAATCAGATT	--!!F!8!FF-!-!88!88!-!#8-FF#F888F!!F!8--8F-!FF8-!F-8FF!FF8F8!88#8--!888!-F!FF8F8F-F-F#!F!88F-F#8!!F8#-!8!---88!--88F-F-88F#8888#-F!#FF!##!F8-!-8F8F-8F-	BC:Z:AATTTGCG-AGCAGNGT	RG:Z:HiMom.1
-HiMom:1:1101:1452:1000	589	*	0	0	*	*	0	0	T.GGGCGCAGTCCGGGGTTAAA.CAGTTAGTCGGCGTCGCCTAACAAGCTCTTGAGCCATTGCGGCTT.TTATGATGCCTCAATTGTTGGGCCTGTGAGACCGGGGCG.GGGCCGCAAAGGCG.C.TAGTCTC.GAATTACAACCCTG.CG	-#FF!8!8F-8!FF8-F8!--8#F88FF-FF8888!!8!-8!-F8FFF8-!F88FF-F8-!!-!-F8F#!-8-!-F-!F!8FFF8!!8F!!-!!FFF-!F!!8!F8!F#F--!F8--888888#!#-8--!-F#-888-8!------F#8!	BC:Z:TCGGCAAC-CCNATNCT	RG:Z:HiMom.1
-HiMom:1:1101:1452:1000	653	*	0	0	*	*	0	0	AAGATCAATTTATGCACGGCCACTAGTGTGGTGAACACCTGT.GTAGTACTTGGTTTACGTCTCC.CTATCGTGCCGTAGAGTTCCCTGTTGGTATGTTATAGGGAACGGAGCATCTCATGCGCCAAACGAGTTTGACG.TGGAGCC.GTC	-8-FFF888F--F8--!8-!--!8F-FF--88F8FF-8-!!F#!-8-!88FF!F--FF!!F8-88#!-F-8---!!F8888!FF!F8!!!8---F88F8888FF!-F--F8-8F-!8FF--FF-888F-F8F-F-8-F-#!FF-8!8#!8!	BC:Z:TCGGCAAC-CCNATNCT	RG:Z:HiMom.1
 HiMom:1:1101:1470:1000	77	*	0	0	*	*	0	0	.ATCTTTGGGATCATGAATTAAGGATTGTCCATGCGACAAGC.ATGTAC.ACAGCG.ACAGAATTG.TACGATGAACGTCGTAGTTGCGTTACCAAGGCACTAG.ATTACCCTCT.GGCCTCGATTCG.CCACCCTCTTGG.GGTCCCGAG	#---FF8F888-F8-8F-!8F88F88FFF-FFF-!8F!F-!!#-88F--#F8888-#F8F!FF8--#!-8F88-8FFF!F8-F!F8-FF!88--F-F888-8--#8F88--FF8F#88-8-F!-F8-F#F8-!8F!F--F8#-F8!8-8F8	BC:Z:GANCGAAC-AGNTGGCN	RG:Z:HiMom.1
 HiMom:1:1101:1470:1000	141	*	0	0	*	*	0	0	GGGAATTCCGGTTTTTGGCGAAGTCTCGATAACTTCCGCGCGGCACCTAACTTGCCAGCTGTGGTTCGCGTCGTGA.TTAATGTTGGG.TCTCGC.CGACATAAAA.TGTAAAGGGAGGCCTTGGAGGCCC.GGTGTATGCT.CCAGCTGG	--!-8F-88F-F---!8!F--8FF!8F--!---!-888--8F-F--!8FF!8-FF!8-!8-!----8-!8-88FFF#8!-8!-!-F!8#-8-!!-#8F888F8FF8#--!888!8F8!F888!!-F8-!-!#F-888F!8!-#F!F8F8!F	BC:Z:GANCGAAC-AGNTGGCN	RG:Z:HiMom.1
 HiMom:1:1101:1488:1000	77	*	0	0	*	*	0	0	GGTCCTGTTTATGCGTTCGCTGA.G.TGA.ATCACTGCCGGATGGCTT.ATAGGTTG.GT.ATCTTACTGCGGGGCACTCAAGTTCCGCCCAAGCA.GATTGGATTAAT.CAGAA..ATG.CGGT.CCGCG.GCC.TGTT.AATTTCATCT	--!F-!FF-F-8FF!!F!F!--8#8#FFF#F!!8!F88-!F8FF!-!-#-!8!F!--#!-#8-----!F8!!!F88F-F8F-8FF8!F!8---FF-#--F-FFF-8-8F#FF88-##88-#FF8F#F----#-FF#8!--#-F-F8FF88F	BC:Z:CGTCNTGT-CTTCCTCA	RG:Z:HiMom.1
@@ -56,8 +50,6 @@ HiMom:1:1102:1018:1000	77	*	0	0	*	*	0	0	.GGAAA.GGATAA.CCAGACACCCAA.GGATATGTAGCAT
 HiMom:1:1102:1018:1000	141	*	0	0	*	*	0	0	TTTCACCAGGCCTCCTCGTAAGTAGATCTTATTTGGATCCAGGTAGCATCGGGGGAGCCGACATT.GTCC.GTCTCAGCGTCGTCCACCTACTCTGACG.GTACCAGAGTGCTCCCGGTACCTCAGTGCCAAGTCGGATTAGCTTGCCAGT	88!!8-8F-F-F-8-!!-!F88F-F-8!FF-8F!8!F!8FF-FF88-F8!F!!8-F!F8FF8FFF#!8!F#8888!-8-!!F-F!F-F8!-!88!--F-#!F88!F!-!F!8-8F!!-!F!--F--F8-!8888F!!8F88!!----!888	BC:Z:TCGTNTTG-CGTGGATT	RG:Z:HiMom.1
 HiMom:1:1102:1036:1000	77	*	0	0	*	*	0	0	CAGTGTTTGTTCGAATCCGCTCCCTTCTGCTGACGTGGGT....GG.AACCGAAACGCTTTTCTCCCAC.CCGG.GTCGTTCAACTCTA.ATGGGACAGCGCATGGTTCGTCTA.GC.TGACTCGTGGCA.ACGTCCTACGACCGCTAAAT	F-!8--!F-F-8!F8F888!!!F8!F-8F!!F-F-F!-!F####!!#-FF8!F-F!8FF--8F-8FF-!#!--F#FF-!8FFF---F!-#8-F!!8!--F!FF8-88FF8--88#F-#!!-FF!F---!F#8F--88!F-!--!8!8F8-8	BC:Z:NCATATCT-ANAGGCCG	RG:Z:HiMom.1
 HiMom:1:1102:1036:1000	141	*	0	0	*	*	0	0	TTCCTCG.ACGTCTTTG.AGA.TTTCGCCCAAGGCTTGTCC.TGCAAGACGTCCTGTCGTATAAAC.GCCACGGGCGGCTAGGACTTGGA.ACGGACCT.ATAGTTCCTGTGCCACTT.TCG.GTTTTCGTCTTGTTG.TGCGA.AGGGG.	F-!--F-#-8-F!-F--#-!-#88888F-FFF-F!8F!--!#-!-88-F!!F8!88-8-!8--F88#-F--F8FF!-F!!8F8FF8FF-F#--F-F8-F#F-F!F!!FF8!!F!88!F#!-!#-!--F8--!-8!8-8#F88-F#-8-F-#	BC:Z:NCATATCT-ANAGGCCG	RG:Z:HiMom.1
-HiMom:1:1102:1054:1000	589	*	0	0	*	*	0	0	CGGG.CCGCCAGAT.TTCCCCGTTCCCACGGACGTTCCTTGGCAGCGCTACTGTCGGGGTTGATCATGCCGGTGTAGCAGGCGT.CCGGACAGTGAACTAA.GTCTTGATTCCACCG..CATAGC.TCTGATACACCTCAATTCGAGTTCA	--8-#-8F8FF-FF#--F8!--8--F8F!!F88F-!!F8!!8--F8F888F8F!--8!88F-F88--!F88-F!--FF-8-FF!#F!-88F-8FFFF-!-F#-F8!-!8!!-88!F-##!F-88!#F-F---FF8FF8!8F-8F-F!-8!8	BC:Z:CTTATTTA-GGCTNTAG	RG:Z:HiMom.1
-HiMom:1:1102:1054:1000	653	*	0	0	*	*	0	0	G.GAGTAAC.GGATTCGCCAGTAGTTGTTGCACTTGAA.CTAACGCCATTTCGTCCACGG.TTTCTTCGAG.CGGAGGCCGTGGTCCC..CGCGCAGAT.GTT..GAAGTACCGAGACTGGCCGTGACACTGCAC..CGGGA.ACCTCCGC	!#-8F88--#88-F8!--F8---!FF8!!FF8F8-FFF#88F8FF!!-!F!-FF!8F-8!#!8!!-!!--!#F8F-8FF!!F!-88--##!F!888F-!#-F!##!F-!--F!F8!F-F8F8FF!FFF888!88!##888-8#-!-!8F-F	BC:Z:CTTATTTA-GGCTNTAG	RG:Z:HiMom.1
 HiMom:1:1102:1072:1000	77	*	0	0	*	*	0	0	GCGCTTGTTCCGATTTGT.TGGCGCTGCGGCAGCCTGATCGG.GCGCCTTGGT.GAGAGGCGCACTTGCACTA.CG.CGGGCTACCGCCA.ACGTTTTCTCTGCCGG.AGCCGTATCCGGTTGGAT.TTCCG.CCATCCACGAACTTCATC	F---F!!-!8!F8F8--F#8F-8888!!--F8!-88-F88FF#!88F-F-FF-#FF-F-FF!-F-!FF!8--F#-!#F8FF-F8!FFF!-#F!F8F8!8FFF8!-88#--8!FF8F-8!F8-!8-F#8-!--#FF8!!--!!FF8FFF8!-	BC:Z:CCCATGCC-GATGTTTA	RG:Z:HiMom.1
 HiMom:1:1102:1072:1000	141	*	0	0	*	*	0	0	A.GAGGC.CCGCCCC..TT.CTCGT.GCCCTCCCAACCGTGCGACTGG..GCGCTGGACATCGTCGCAACTTACGGCGTGTGCCCTGAAGGTGACTACACCG.TGAAAGG.CGCCTCGCCGTCCATGCCACAAGGTGGACG.TCATCG.CT	8#--8F-#F8!F!F8##88#-!F-8#F!-F---FF-F8-!8-8-8F8!##--F-F-8FF-FFFF--8--!8--F--!FF!!-!888FFFF!!!-!--F-8!-#--8FF!-#FF-!8F!-F-!-!8-888FFFF-8!--8!!#-F-8F!#!8	BC:Z:CCCATGCC-GATGTTTA	RG:Z:HiMom.1
 HiMom:1:1102:1090:1000	77	*	0	0	*	*	0	0	GCCTACGCATCCGCCC.CACTG.ATGGGTGAGCC.G.ACTAAGCTGTAGTGCCTGATCCCTCCAGGAGCCCTTTA.TGAATCGGAACGCTATGCGACTTGTGATAACGAAAATTTCAGAAGTT.ATCGCCAGTGTGGTTCTTCC.AACATG	!-F-88F88!!8!--8#---8!#F8F8-!F--8!#8#8-8F-8-!-F888FF8!8F88!-F-F8!8F---!F8!-#8F-F8!F--8F!!!8-F8F8FFF!!!---8!-8FF8F!-8-!FF!F-#-FFF88-8!!8!!8-8!F-!#FF!8!-	BC:Z:TTGCCTTT-TTTCGGTA	RG:Z:HiMom.1
@@ -66,8 +58,6 @@ HiMom:1:1102:1108:1000	77	*	0	0	*	*	0	0	TTA.GGGGAGTGC.AAGG.CTTA.AGTTCACCGAGCCCAT
 HiMom:1:1102:1108:1000	141	*	0	0	*	*	0	0	TTTTCCAGTC.TTCTTGCAGGCCGGTGCATCGGCTT.ACGCAATG.CCCCTC.ACGTTGTGAGTGTCCCGATCAATTTG.GC..AAGTACCAAAGGTGCCTGTCTGTAGTTGAACATTACGTGGCGTATGG.GTAAGTTTCTATGCACGCG	8FF-8F8-88#F8--8F!F--8888F-8F!!--!8-#8-8-8--8#8-8F!F#8!F-F-8!--!8-!!8!88!-F!!8-#--##F--8-!-8-F!FFFF88!8-8FFF-!F8FF8FF-F!--F88-!-!!8#-F88!F8F!8-F-8-F---	BC:Z:CCCGNGCT-CATCCNTG	RG:Z:HiMom.1
 HiMom:1:1102:1127:1000	77	*	0	0	*	*	0	0	GCC.AACGATCTT.TTTGCTC..CGTG.TGCTTGGTCTTCTTGTCTCTAACTA.CGTGTAGTGAGAGT.TCTCTCTCGAGCGT.TCTGGATTGC.CGACGGACGAGGAATTAGTGCTCAGTGTATCGGACC.TTTTCTGGCCGCATGCAGC	8!-#8-8!-F!-8#!8-!88-##8-FF#FFFFFF!!F-F-F-FF!F--8-8-8#!!!!!88-!F-F-!#8---88!FF8-FF-#-!8-!88-8!#!8--F-FF8FF88F!F8F8!!8!-F!88-!!-F8!F#!8---!-!F!--8--!F!8	BC:Z:GTGGCAGA-GAAACGAA	RG:Z:HiMom.1
 HiMom:1:1102:1127:1000	141	*	0	0	*	*	0	0	CGCCGCTATTCCGGACA.AT.GTGTGACGCTTTCCGTCTCCCGTCGTCTCGATTTGGCGCC.ATC.TCCGTCAGCCTAGAG.A.TAACGAA.CTGGATGCTGC.CATTGGA.ATGACTACCTGCTACTTGG.ACGATTCTGCACGTCGTCT	!88F8FFF!8888!-8-#F8#-8!!F-!FFF!888--8FF-F-F--8-!FF8-F888-F!8#F--#!88!!-F-FF!F-8-#-#!--FFF-#8-8-8-!-!-!#88F!!8F#F!8FFF8-F---FF!-888#F8FF8------88--8F!-	BC:Z:GTGGCAGA-GAAACGAA	RG:Z:HiMom.1
-HiMom:1:1102:1145:1000	589	*	0	0	*	*	0	0	AGATTTGTCAGAGTGT.T.TCAGCGGTA.CGTAGTAGGCGGTGTTGGGCCGGTTC.T.TA.TG.TCGAGCAAG..ACGGGCACACTG.CCATT.ATCCT.ATGCAAAAGC.TGG.CCC.TGGGAGGAGCCTAGCGAGCGGGGGCGTTTTTA	8-F-8FF88F!-!F!F#!#!-F-8F!!-#8F888-F!8!8!!8!888-!F!FF!-#F#8-#!F#F-!88-8F!##-F--!--FF-8F#!8FF8#--FF-#8F!-FFFF!8#8!F#-!-#8-FFF!8-FF!8-8--FF!-!8-!!F!!-8--	BC:Z:GGTAAGGT-TCCACGTT	RG:Z:HiMom.1
-HiMom:1:1102:1145:1000	653	*	0	0	*	*	0	0	ATAGATCCTGTTTAGCCGTTGTTGTTAGCCCC.TCTAGC..ATACCGAATC.GCCCT.CGATCTCCTCAGAGTTCGACCTTCCTTTC.GGAGAGGGTACCTCTCAGAA.GCAAGGATGCCCATGTCACTCAGATCCTA.AT.AGAATCTTT	8-F8F-!-!F8F-F!!8--!8F8-F-8!-8!!#88-8F!##F-FF!!FF-8#F--8F#-!FF!F-FF8-F8!-!--F8!8!!88F8-#!!F!-F-88F888--8F!FF#---FF8F8-8!!-F!F!8!-F8-8!-F8-#F!#-FFF!-F-F	BC:Z:GGTAAGGT-TCCACGTT	RG:Z:HiMom.1
 HiMom:1:1102:1163:1000	77	*	0	0	*	*	0	0	GATACGGTGTTATTCTTCTTGATTTGACTACG.GTCCGACAAC.TATTCGTGGAAACACGGCCCAATAGCGCT.GCCC.ACAGCTTTATAGTGTCA.CAGTGATTACGTCG.TGTCAGGGTTTACAATG.AG.GCAAGCGTTTGGCGGCGA	!-!888F-8!!8!8--88!888---!8FF88F#--!F8-!-F8#F88F!88!!F-8F8-8!--!-F!FF!8-F#F!!8#-!F88F-!-FF!8FFFF#F-88F8F!8!!8FF#!8-!F888F8F--FF8-#88#-!--F88F!-F-!--!F-	BC:Z:CCGCGCNC-NGGGATAT	RG:Z:HiMom.1
 HiMom:1:1102:1163:1000	141	*	0	0	*	*	0	0	CCTGCTCCTCGGCCGACCTG.CCCTAATGCAGTTGCTCCGGA.CTGCCAACGAAAACCTTACTC.TCTA.CTCGTA.ACTACGGCACTGAAGCA.TC.GCCC.TTTGTTC.CGTCTAACCACTCTTTCTTCGCGCGAT.TAAGGCCT.CTC	F!-!-F88FF-!F-88F!-!#-8!8-F!88--8F!!FF--8F#-FF88FF---F8F8!88F8!-#F!!8#88!-FF#-!FF8!F-F!88F----#!-#-!F-#8!--!!8#88FFF88F8-8!!-!F888!!FF!8F8#8-F!!!-8#F!-	BC:Z:CCGCGCNC-NGGGATAT	RG:Z:HiMom.1
 HiMom:1:1102:1181:1000	77	*	0	0	*	*	0	0	TAGCATCGTAAACGGGACTTCGCTAGTCCAGTCTCTTACTAGTCCGG.T.TGGACTA..GTT.TGTA.ACCCGACTCGGA.T.CATTAGTCAC.CAGACT.CTGT.G.CATCAA.GACCC.AC.CCTCCTTCCCAGATAACCGTT.GTTTC	-F!!8F!F!F--!F-F--F!-!---8F!!F-FF-!F8F8F--F--8-#-#-8!F!!F##-88#-8F8#-!-8F--!-!!8#8#8-!F88-8--#-F--!-#!---#-#F-8FFF#8888F#8!#F-888!!!-FF-F!FFF!!!F#8!F88	BC:Z:CGCGTAGT-ATTCCGAC	RG:Z:HiMom.1
@@ -98,8 +88,6 @@ HiMom:1:1102:1416:1000	77	*	0	0	*	*	0	0	TGACTACTTAGTAACGG.G.CCGTGGCCGCTACTGCGCCG
 HiMom:1:1102:1416:1000	141	*	0	0	*	*	0	0	TCGGCACGACTACTAGTAGCAC.CCGCCTGGGTCAC.TAGCCTCAGTTGGCTCAAATTTGGCTGGAATGACTAATCATATTTTGTCCATACAATCGATCTTTGGGCCTCCC.CCCCAT.A.CCGCGGGGTACCTTGTGCCTCTCACTTGCC	-8!FF8!!8F8F8F-!!F8-8F#FF88!8-!!!FF-#-F8FF8F-FF-F-8-!8FF88!8-88-88F!-F!F888888-!!F8F!!FFFFF---!FF!-!F88--8---!F#-!8FF!#F#!-8!--!FF-!!F88!8FF--!88F88F!!	BC:Z:TTAGCGTG-GTGCCAAG	RG:Z:HiMom.1
 HiMom:1:1102:1434:1000	77	*	0	0	*	*	0	0	CGGGGACAGTGTCATTATCGCC.CCG.GCAGG.TTAAG.C.T.CCGG.GGGGGCAGTGCTATTCCGATGTCCCCG.AATAGTC.TGGGTCAGTACCCATGCCCCTTATA.AGC.ATAT.GTAG.CAGCGGCTTGCGGCTCAGCCCATTTTA	-8-8---F!8!-8-!!FF8!!-#8!-#8F-F8#F--8F#-#8#FF8F#-8FFF8-!8-!-8FF!-!-88F88!-!#8F8F-FF#!!-F888-F-!-888!FF!8FF8F-#88!#888!#8FF8#!888!-88!!8--8!!-8-FF-88!8F	BC:Z:TNNGAGAA-TTACGCGC	RG:Z:HiMom.1
 HiMom:1:1102:1434:1000	141	*	0	0	*	*	0	0	CCCTATTGCACTTAG.GCGTGGAATCGCGGGATT.CGGCCCCCG.CAGTCGGCTATGATTCGA.TCCATGCGTGCGTGTGTGCGTATCCCCACGTATAAGAGCGCGGACACTCCA.CTGGGAACCAATC.CA.TGAC.TAGCCGACAATAT	-8F-F8!F-F8-888#F8FF!!F8F!-8!8!8F-#8F!--8F!F#-8!F!8!-F8-!8F-FF-#-8--8!!88-----F-8--!!888!-F8!-88-----!8!88!8-8-!!-F#!--8!8-!!8--F#!-#F!--#F-F!-!-!F-F88	BC:Z:TNNGAGAA-TTACGCGC	RG:Z:HiMom.1
-HiMom:1:1102:1452:1000	589	*	0	0	*	*	0	0	GTTCCGGACGAAGGACTGGATTGCTGCTCAGAGATCCCGGTTCCAGGGTCGGT.CAATTTGTCCGCCAGGTGGA.CTTGTTCTTTCAGACTAAGGTT..AGTGA.GCCAGCATTAAGATACAGAAACAACTCGTCCCCT.TCTGACGATCA	8-FF8!---FF8!!8!-F!8F!8--FF-8F!F!F!!!F-!8F!-8F8F!8!88#FF-88FF!-!-8!F8-!!--#!!-FFF-F8F8--8-F--8!-!##-F!8F#-88F8F-!F-F8F!8-8-FFF8FF-8F-!88!8!#-8F8-8F---F	BC:Z:GGGGCACT-GGCCCGCT	RG:Z:HiMom.1
-HiMom:1:1102:1452:1000	653	*	0	0	*	*	0	0	GCG.CGCTTCG.G.CCGGATGACCTGCTTTGTT.CTCAGTTTTTTTTATG.T.GTACATTCTTCCCTCGATCGAGTGTGTTTGCCTGCGGCTTAGTCGTGGGCTCGCG.CTGT.CGAGGCTGTCATTCCAGGCCTGCCAA..CGGCGGTCT	!-F#-8!-F!!#-#-!!F-88--!F8F88F--!#FF-8!8!-F8F--8F-#!#8888FF!F!!-F!F!--!!--!88F!8!8!F-!FF!F8!-FF-88-F-!F8-!F-#-8F!#FF888!!!-88-F!!F!-FF8!!F--##8F!---F!F	BC:Z:GGGGCACT-GGCCCGCT	RG:Z:HiMom.1
 HiMom:1:1102:1470:1000	77	*	0	0	*	*	0	0	CAGACCGCGGCTCTGGATCACCTCCGACGGGTAGTGACA.CTACCT.AATCCGTCCAAGCAATGTGCAGTTCTTAATGACTTGGCTCGAGTAGTCCTGACCAA.GAACGGACGTTCTTCGA.GATAGGTGGGAG.TGGCTTCACGCTTTAC	8FF8-FFF!F-8--F-888-!!-!-8--8FFFF!!F8FF#!!F!!8#F8!8F8-8-8-F!--8-F!8----!F----8-8-F!!-F!F-!F-!!F-F!FFFFF#F--F----!!F-!!F--#88!F!F!8-F--#-F8-F-!-!!-!!!-F	BC:Z:GGGCAAAT-CTGGTNNN	RG:Z:HiMom.1
 HiMom:1:1102:1470:1000	141	*	0	0	*	*	0	0	AAGCAA.GA.GACACCGGTGTCAGTGTTTTGG.ATCGCAGCTTT.GACCTGCTTCCT.AACTT.TCTGTTTCCGAAGTCACTTATT.TAAACGAGCTCTGGACTAGGCTCTGTACTCCCAATCTCGT..TCTCGGGTCAA.GAGCCTGGCC	F8-888#!8#-8--F--!F--888!8F8!-F8#-F!!!--!F8-#--8--F-!8FFF#--F!-#!F-!!!F-8-FF8--F!-88!8#88-F-F-8F--!8!F!-8-F--!88FF!-8!--8-!88F!##-!8-!!FF8-F#8FF-!!!---	BC:Z:GGGCAAAT-CTGGTNNN	RG:Z:HiMom.1
 HiMom:1:1102:1488:1000	77	*	0	0	*	*	0	0	CGCTGTGCGTAACTTCCATGAATATCGAGGTGGATCTC.GTAGTGTTTG.AC.ATAGGTACAAACGTCCAACATGTCACGTCGAGAACGCCCCGATGTGCGCGAGAAGT.ATGAGCGTATGCAGGGCGTCAATTGCCCTTGAGAAGGTGGG	FF--8F88!!-8-F8!-FF!88F-!F8F!F!!F--F88#!88-F-F--F#8-#8-8-8-8!F-88!8!!FF88!FF!-8FFF--8-8F8-FF8--8FFFFF-FFF8888#F8!F!888-F!--!88-8!---FFF-!!F!FF--8F88-!!	BC:Z:CTCATACG-CTGNTCCC	RG:Z:HiMom.1



View it on GitLab: https://salsa.debian.org/med-team/picard-tools/commit/2d8023c38e442005719ef005b4a3d47b51154968

-- 
View it on GitLab: https://salsa.debian.org/med-team/picard-tools/commit/2d8023c38e442005719ef005b4a3d47b51154968
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20190111/14edc43c/attachment-0001.html>


More information about the debian-med-commit mailing list