[med-svn] [pbbam] 01/02: Imported Upstream version 0~20150813+git4e9e417
Afif Elghraoui
afif-guest at moszumanska.debian.org
Sun Sep 6 22:24:12 UTC 2015
This is an automated email from the git hooks/post-receive script.
afif-guest pushed a commit to branch master
in repository pbbam.
commit 1373631b68a46ba4fa29c34fe94ead4acb2484e2
Author: Afif Elghraoui <afif at ghraoui.name>
Date: Sun Sep 6 11:46:04 2015 -0700
Imported Upstream version 0~20150813+git4e9e417
---
.gitignore | 24 +
CHANGELOG.md | 135 +
CMakeLists.txt | 132 +
INSTALL.md | 114 +
cmake/FindCSharp.cmake | 72 +
cmake/FindDotNetFrameworkSdk.cmake | 29 +
cmake/FindMono.cmake | 167 +
cmake/FindR.cmake | 48 +
cmake/UseCSharp.cmake | 111 +
cmake/UseDotNetFrameworkSdk.cmake | 16 +
cmake/UseMono.cmake | 16 +
docs/CMakeLists.txt | 11 +
docs/Doxyfile.in | 1602 +++
include/pbbam/Accuracy.h | 98 +
include/pbbam/AlignmentPrinter.h | 83 +
include/pbbam/BamFile.h | 147 +
include/pbbam/BamHeader.h | 184 +
include/pbbam/BamReader.h | 114 +
include/pbbam/BamRecord.h | 1018 ++
include/pbbam/BamRecordBuilder.h | 268 +
include/pbbam/BamRecordImpl.h | 622 +
include/pbbam/BamTagCodec.h | 75 +
include/pbbam/BamWriter.h | 150 +
include/pbbam/Cigar.h | 116 +
include/pbbam/CigarOperation.h | 226 +
include/pbbam/Config.h | 125 +
include/pbbam/DataSet.h | 218 +
include/pbbam/DataSetTypes.h | 315 +
include/pbbam/DataSetXsd.h | 111 +
include/pbbam/EntireFileQuery.h | 60 +
include/pbbam/Frames.h | 205 +
include/pbbam/GenomicInterval.h | 214 +
include/pbbam/GenomicIntervalQuery.h | 72 +
include/pbbam/GroupQuery.h | 88 +
include/pbbam/GroupQueryBase.h | 214 +
include/pbbam/IndexedFastaReader.h | 112 +
include/pbbam/Interval.h | 212 +
include/pbbam/LocalContextFlags.h | 66 +
include/pbbam/Orientation.h | 55 +
include/pbbam/PbiBuilder.h | 121 +
include/pbbam/PbiFile.h | 88 +
include/pbbam/PbiIndex.h | 299 +
include/pbbam/PbiRawData.h | 307 +
include/pbbam/Position.h | 59 +
include/pbbam/ProgramInfo.h | 186 +
include/pbbam/QualityValue.h | 112 +
include/pbbam/QualityValues.h | 233 +
include/pbbam/QueryBase.h | 241 +
include/pbbam/ReadGroupInfo.h | 392 +
include/pbbam/SamTagCodec.h | 58 +
include/pbbam/SequenceInfo.h | 182 +
include/pbbam/Strand.h | 55 +
include/pbbam/Tag.h | 362 +
include/pbbam/TagCollection.h | 58 +
include/pbbam/UnmappedReadsQuery.h | 70 +
include/pbbam/ZmwGroupQuery.h | 67 +
include/pbbam/ZmwQuery.h | 66 +
include/pbbam/internal/BamRecordSort.h | 138 +
include/pbbam/internal/DataSet.inl | 197 +
include/pbbam/internal/DataSetBaseTypes.h | 174 +
include/pbbam/internal/DataSetBaseTypes.inl | 220 +
include/pbbam/internal/DataSetElement.h | 186 +
include/pbbam/internal/DataSetElement.inl | 371 +
include/pbbam/internal/DataSetListElement.h | 118 +
include/pbbam/internal/DataSetListElement.inl | 181 +
include/pbbam/internal/DataSetTypes.inl | 150 +
include/pbbam/internal/FilterEngine.h | 71 +
include/pbbam/internal/IBamFileIterator.h | 79 +
include/pbbam/internal/IMergeStrategy.h | 67 +
include/pbbam/internal/MergeItem.h | 77 +
include/pbbam/internal/MergeStrategy.h | 239 +
include/pbbam/internal/PbiIndex_p.h | 931 ++
include/pbbam/internal/PbiIndex_p.inl | 927 ++
include/pbbam/internal/QueryBase.h | 218 +
include/pbbam/internal/SequentialMergeStrategy.h | 79 +
include/pbbam/internal/Tag.inl | 324 +
include/pbbam/virtual/VirtualPolymeraseBamRecord.h | 136 +
include/pbbam/virtual/VirtualPolymeraseReader.h | 105 +
include/pbbam/virtual/VirtualRegion.h | 103 +
include/pbbam/virtual/VirtualRegionType.h | 58 +
include/pbbam/virtual/VirtualRegionTypeMap.h | 58 +
src/Accuracy.cpp | 43 +
src/AlignmentPrinter.cpp | 148 +
src/AssertUtils.cpp | 90 +
src/AssertUtils.h | 93 +
src/BamFile.cpp | 174 +
src/BamHeader.cpp | 400 +
src/BamRecord.cpp | 1785 +++
src/BamRecordBuilder.cpp | 393 +
src/BamRecordImpl.cpp | 426 +
src/BamTagCodec.cpp | 517 +
src/BamWriter.cpp | 171 +
src/CMakeLists.txt | 83 +
src/Cigar.cpp | 70 +
src/CigarOperation.cpp | 76 +
src/Config.cpp | 48 +
src/DataSet.cpp | 173 +
src/DataSetBaseTypes.cpp | 94 +
src/DataSetElement.cpp | 47 +
src/DataSetIO.cpp | 157 +
src/DataSetIO.h | 73 +
src/DataSetTypes.cpp | 440 +
src/DataSetUtils.h | 95 +
src/DataSetXsd.cpp | 132 +
src/EntireFileQuery.cpp | 102 +
src/FileUtils.h | 132 +
src/FilterEngine.cpp | 76 +
src/FofnReader.cpp | 52 +
src/FofnReader.h | 60 +
src/Frames.cpp | 179 +
src/GenomicInterval.cpp | 131 +
src/GenomicIntervalQuery.cpp | 140 +
src/GroupQuery.cpp | 91 +
src/IndexedFastaReader.cpp | 219 +
src/MemoryUtils.cpp | 82 +
src/MemoryUtils.h | 159 +
src/PbiBuilder.cpp | 255 +
src/PbiFile.cpp | 87 +
src/PbiIndex.cpp | 311 +
src/PbiIndexIO.cpp | 345 +
src/PbiIndexIO.h | 165 +
src/PbiRawData.cpp | 444 +
src/ProgramInfo.cpp | 161 +
src/QualityValue.cpp | 43 +
src/QueryBase.cpp | 48 +
src/ReadGroupInfo.cpp | 525 +
src/SamTagCodec.cpp | 296 +
src/SequenceInfo.cpp | 172 +
src/SequenceUtils.h | 125 +
src/StringUtils.h | 74 +
src/Tag.cpp | 101 +
src/TagCollection.cpp | 46 +
src/TimeUtils.h | 81 +
src/UnmappedReadsQuery.cpp | 133 +
src/VirtualPolymeraseBamRecord.cpp | 288 +
src/VirtualPolymeraseReader.cpp | 113 +
src/VirtualRegionTypeMap.cpp | 49 +
src/XmlReader.cpp | 154 +
src/XmlReader.h | 59 +
src/XmlWriter.cpp | 152 +
src/XmlWriter.h | 62 +
src/ZmwGroupQuery.cpp | 143 +
src/ZmwQuery.cpp | 138 +
src/files.cmake | 152 +
src/pugixml/pugiconfig.hpp | 71 +
src/pugixml/pugixml.cpp | 11525 +++++++++++++++++++
src/pugixml/pugixml.hpp | 1366 +++
src/swig/Accuracy.i | 17 +
src/swig/AlignmentPrinter.i | 11 +
src/swig/BamFile.i | 21 +
src/swig/BamHeader.i | 28 +
src/swig/BamRecord.i | 33 +
src/swig/BamRecordBuilder.i | 12 +
src/swig/BamRecordImpl.i | 16 +
src/swig/BamTagCodec.i | 11 +
src/swig/BamWriter.i | 18 +
src/swig/CMakeLists.txt | 68 +
src/swig/Cigar.i | 16 +
src/swig/CigarOperation.i | 49 +
src/swig/DataSet.i | 17 +
src/swig/DataSetTypes.i | 62 +
src/swig/EntireFileQuery.i | 17 +
src/swig/Frames.i | 19 +
src/swig/GenomicInterval.i | 11 +
src/swig/GenomicIntervalQuery.i | 15 +
src/swig/GroupQuery.i | 11 +
src/swig/GroupQueryBase.i | 32 +
src/swig/IndexedFastaReader.i | 13 +
src/swig/Interval.i | 12 +
src/swig/LocalContextFlags.i | 11 +
src/swig/Orientation.i | 11 +
src/swig/PacBio.BAM.csproj.in | 37 +
src/swig/PacBioBam.i | 166 +
src/swig/PbiFile.i | 11 +
src/swig/PbiIndex.i | 18 +
src/swig/PbiRawData.i | 29 +
src/swig/Position.i | 11 +
src/swig/ProgramInfo.i | 15 +
src/swig/QualityValue.i | 20 +
src/swig/QualityValues.i | 17 +
src/swig/QueryBase.i | 127 +
src/swig/ReadGroupInfo.i | 15 +
src/swig/SamTagCodec.i | 11 +
src/swig/SequenceInfo.i | 15 +
src/swig/Strand.i | 11 +
src/swig/Tag.i | 130 +
src/swig/TagCollection.i | 13 +
src/swig/WrapCSharp.cmake | 46 +
src/swig/WrapPython.cmake | 54 +
src/swig/WrapR.cmake | 71 +
src/swig/ZmwGroupQuery.i | 14 +
src/swig/ZmwQuery.i | 11 +
tests/CMakeLists.txt | 66 +
tests/data/aligned.bam | Bin 0 -> 593 bytes
tests/data/dataset/ali1.xml | 35 +
tests/data/dataset/ali2.xml | 35 +
tests/data/dataset/ali3.xml | 35 +
tests/data/dataset/ali4.xml | 35 +
tests/data/dataset/bam_mapping.bam | Bin 0 -> 169668 bytes
tests/data/dataset/bam_mapping.bam.bai | Bin 0 -> 184 bytes
tests/data/dataset/bam_mapping.bam.pbi | Bin 0 -> 2452 bytes
tests/data/dataset/bam_mapping_1.bam | Bin 0 -> 167530 bytes
tests/data/dataset/bam_mapping_1.bam.bai | Bin 0 -> 184 bytes
tests/data/dataset/bam_mapping_1.bam.pbi | Bin 0 -> 2437 bytes
tests/data/dataset/bam_mapping_2.bam | Bin 0 -> 165778 bytes
tests/data/dataset/bam_mapping_2.bam.bai | Bin 0 -> 184 bytes
tests/data/dataset/bam_mapping_2.bam.pbi | Bin 0 -> 2422 bytes
tests/data/dataset/bam_mapping_staggered.xml | 35 +
tests/data/dataset/barcode.dataset.xml | 11 +
tests/data/dataset/ccsread.dataset.xml | 15 +
tests/data/dataset/contig.dataset.xml | 18 +
tests/data/dataset/fofn.fofn | 3 +
tests/data/dataset/hdfsubread_dataset.xml | 72 +
tests/data/dataset/lambda_contigs.fasta | 156 +
tests/data/dataset/lambda_contigs.xml | 2 +
.../data/dataset/m150430_142051_Mon_p1_b25.sts.xml | 1 +
.../pbalchemy10kbp.pbalign.sorted.pbver1.bam | Bin 0 -> 35251 bytes
.../pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai | Bin 0 -> 632 bytes
tests/data/dataset/pbalchemy10kbp.xml | 17 +
tests/data/dataset/reference.dataset.xml | 20 +
tests/data/dataset/subread_dataset1.xml | 76 +
tests/data/dataset/subread_dataset2.xml | 76 +
tests/data/dataset/subread_dataset3.xml | 76 +
.../dataset/transformed_rs_subread_dataset.xml | 68 +
tests/data/ex2.bam | Bin 0 -> 125999 bytes
tests/data/ex2.bam.bai | Bin 0 -> 176 bytes
tests/data/ex2.sam | 3310 ++++++
tests/data/lambdaNEB.fa | 608 +
tests/data/lambdaNEB.fa.fai | 1 +
tests/data/polymerase/internal.polymerase.bam | Bin 0 -> 134303 bytes
tests/data/polymerase/internal.scraps.bam | Bin 0 -> 68735 bytes
tests/data/polymerase/internal.subreads.bam | Bin 0 -> 73590 bytes
tests/data/polymerase/internal_hq.hqregion.bam | Bin 0 -> 82035 bytes
tests/data/polymerase/internal_hq.scraps.bam | Bin 0 -> 51450 bytes
tests/data/polymerase/internal_polymerase.fasta | 2 +
tests/data/polymerase/production.polymerase.bam | Bin 0 -> 25072 bytes
tests/data/polymerase/production.scraps.bam | Bin 0 -> 13530 bytes
tests/data/polymerase/production.subreads.bam | Bin 0 -> 14655 bytes
tests/data/polymerase/production_hq.hqregion.bam | Bin 0 -> 15796 bytes
tests/data/polymerase/production_hq.scraps.bam | Bin 0 -> 10061 bytes
tests/data/segfault.bam | Bin 0 -> 262 bytes
tests/data/temp.bam | Bin 0 -> 125999 bytes
tests/data/temp.sam | 3310 ++++++
tests/data/test_group_query/group.fofn.in | 3 +
tests/data/test_group_query/test1.bam | Bin 0 -> 2165 bytes
tests/data/test_group_query/test2.bam | Bin 0 -> 13004 bytes
tests/data/test_group_query/test2.bam.pbi | Bin 0 -> 194 bytes
tests/data/test_group_query/test3.bam | Bin 0 -> 19277 bytes
tests/data/unmap1.bam | Bin 0 -> 896 bytes
tests/data/unmap1.bam.bai | Bin 0 -> 72 bytes
tests/data/unmap2.bam | Bin 0 -> 1344 bytes
tests/data/unmap2.bam.bai | Bin 0 -> 144 bytes
tests/files.cmake | 43 +
tests/src/CSharp/CheckSWIG.cs | 15 +
tests/src/CSharp/TestPbbam.cs.in | 119 +
tests/src/CSharp/buildAssembly.sh.in | 91 +
tests/src/CSharp/check_swig.sh.in | 18 +
tests/src/R/check_swig.R.in | 58 +
tests/src/R/test_pbbam.R | 23 +
tests/src/R/test_pbbam.sh.in | 45 +
tests/src/R/tests/test_Accuracy.R | 53 +
tests/src/R/tests/test_BamFile.R | 77 +
tests/src/R/tests/test_BamHeader.R | 193 +
tests/src/R/tests/test_Cigar.R | 219 +
tests/src/R/tests/test_EndToEnd.R | 102 +
tests/src/R/tests/test_Frames.R | 95 +
tests/src/R/tests/test_Intervals.R | 340 +
tests/src/R/tests/test_QualityValues.R | 113 +
tests/src/R/tests/utils.R | 307 +
tests/src/TestData.h.in | 56 +
tests/src/python/check_swig.py | 44 +
tests/src/python/test/__init__.py | 39 +
tests/src/python/test/config.py.in | 43 +
tests/src/python/test/test_Accuracy.py | 65 +
tests/src/python/test/test_BamFile.py | 63 +
tests/src/python/test/test_BamHeader.py | 157 +
tests/src/python/test/test_Cigar.py | 214 +
tests/src/python/test/test_EndToEnd.py | 89 +
tests/src/python/test/test_Frames.py | 95 +
tests/src/python/test/test_Intervals.py | 348 +
tests/src/python/test/test_QualityValues.py | 131 +
tests/src/python/test_pbbam.py | 48 +
tests/src/test_Accuracy.cpp | 63 +
tests/src/test_AlignmentPrinter.cpp | 102 +
tests/src/test_BamFile.cpp | 69 +
tests/src/test_BamHeader.cpp | 281 +
tests/src/test_BamRecord.cpp | 1993 ++++
tests/src/test_BamRecordBuilder.cpp | 274 +
tests/src/test_BamRecordClipping.cpp | 1187 ++
tests/src/test_BamRecordImplCore.cpp | 613 +
tests/src/test_BamRecordImplTags.cpp | 214 +
tests/src/test_BamRecordImplVariableData.cpp | 4542 ++++++++
tests/src/test_BamRecordMapping.cpp | 541 +
tests/src/test_BamWriter.cpp | 198 +
tests/src/test_Cigar.cpp | 198 +
tests/src/test_DataSetCore.cpp | 482 +
tests/src/test_DataSetIO.cpp | 1281 +++
tests/src/test_DataSetMetadata.cpp | 63 +
tests/src/test_DataSetQuery.cpp | 434 +
tests/src/test_DataSetXsd.cpp | 124 +
tests/src/test_EndToEnd.cpp | 252 +
tests/src/test_EntireFileQuery.cpp | 151 +
tests/src/test_Frames.cpp | 97 +
tests/src/test_GenomicIntervalQuery.cpp | 182 +
tests/src/test_GroupQuery.cpp | 149 +
tests/src/test_IndexedFastaReader.cpp | 212 +
tests/src/test_Intervals.cpp | 330 +
tests/src/test_PacBioIndex.cpp | 768 ++
tests/src/test_PolymeraseStitching.cpp | 352 +
tests/src/test_QualityValues.cpp | 120 +
tests/src/test_ReadGroupInfo.cpp | 61 +
tests/src/test_SequenceUtils.cpp | 141 +
tests/src/test_Tags.cpp | 992 ++
tests/src/test_TimeUtils.cpp | 59 +
tests/src/test_UnmappedReadsQuery.cpp | 117 +
tests/src/test_ZmwQuery.cpp | 67 +
tools/CMakeLists.txt | 3 +
tools/pbindex/CMakeLists.txt | 27 +
tools/pbindex/src/OptionParser.cpp | 562 +
tools/pbindex/src/OptionParser.h | 305 +
tools/pbindex/src/PbIndex.cpp | 78 +
tools/pbindex/src/PbIndex.h | 70 +
tools/pbindex/src/PbIndexVersion.h.in | 49 +
tools/pbindex/src/main.cpp | 102 +
324 files changed, 71310 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7f6bd79
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+*.o
+*.pico
+*.so
+*.a
+*.dylib
+*.pyc
+*~
+build/
+lib/
+third-party/htslib/bgzip
+third-party/htslib/htsfile
+third-party/htslib/tabix
+third-party/htslib/test/fieldarith
+third-party/htslib/test/hfile
+third-party/htslib/test/sam
+third-party/htslib/test/test-regidx
+third-party/htslib/test/test-vcf-api
+third-party/htslib/test/test-vcf-sweep
+third-party/htslib/test/test_view
+tests/bin/test_pbbam
+
+# Generated source files
+tests/src/TestData.h
+third-party/htslib/version.h
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..68703c1
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,135 @@
+# PacBio::BAM - change log
+
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+**NOTE:** The current series (0.y.z) is under initial development. Anything may change at any time.
+The public API should not be considered stable yet. Once we lock down a version 1.0.0, this will
+define a reference point & compatibility guarantees will be maintained within each major version
+series.
+
+
+## Active
+
+### Added
+- BamFile::PacBioIndexExists() & BamFile::StandardIndexExists() - query the existence of index files
+without auto-building them if they are missing, as in BamFile::Ensure*IndexExists().
+- GenomicInterval now accepts an htslib/samtools-style REGION string in the constructor:
+GenomicInterval("chr1:1000-2000"). Please note though, that pbbam uses 0-based coordinates throughout,
+whereas samtools expects 1-based. The above string is equivalent to "chr1:1001-2000" in samtools.
+
+## [0.1.0] - 2015-07-17
+
+### Changed
+- BAM spec v3.0b7 compliance
+ - Removal of 'M' as allowed CIGAR operation. Attempt to use such a CIGAR op will throw an exception.
+ - Addition of IPD/PulseWidth codec version info in header
+
+### Added
+- Auto-generation of UTC timestamp for DataSet objects
+- PbiBuilder - allows generation of PBI index data alongside generation/modification of BAM record
+data. This obviates the need to wait for a completed BAM, then go through the zlib decompression, etc.
+- Added DataSet::FromXml(string xml) to create DataSets from "raw" XML string, rather than building up
+using DataSet API or loading from existing file.
+- "pbindex" command line tool to generate ".pbi" files from BAM data. The executable is built by default,
+but can be disabled using the cmake option "-DPacBioBAM_build_pbindex=OFF".
+
+### Fixed
+- PBI construction failing on CCS reads
+
+## [0.0.8] - 2015-07-02
+
+### Changed
+- Build system refactoring.
+
+## [0.0.7] - 2015-07-02
+
+### Added
+- PBI index lookup API. Not so much intended for client use directly, but will enable construction of
+ higher-level semantic queries: grouping by, filtering, etc.
+- DataSet & PBI-aware queries (e.g. ZmwGroupQuery). More PBI-enabled queries to follow.
+- More flexibility in tag access. Samtools has a habit of performing a "shrink-to-fit" when it handles
+ integer-valued tag data. Thus we cannot **guarantee** the binary type that our API will have to process.
+ Safe conversions are allowed on integer-like data only. Under- or overflows in casting will trigger an
+ exception. All other tag data types must be asked for explicitly, or else an exception will be raised,
+ as before.
+- BamHeader::DeepCopy - allows creation of editable header data, without overwriting all shared instances
+
+### Fixed
+- XSD compliance for DataSet APIs.
+
+### Changed
+- The functionality provided by ZmwQuery (group by hole number), is now available using the ZmwGroupQuery
+ object. The new ZmwQuery returns a single-record iterator (a la EntireFileQuery), but limited to a whitelist
+ of requested hole numbers.
+
+### Removed
+- XSD non-compliant classes (e.g. ExternalDataReference)
+
+## [0.0.6] - 2015-06-07
+
+### Added
+
+- Accessor methods for pulse bam support:
+ - LabelQV()
+ - AltLabelQV()
+ - LabelTag()
+ - AltLabelTag()
+ - Pkmean()
+ - Pkmid()
+ - PrePulseFrames() only RC, no clipping
+ - PulseCallWidth() only RC, no clipping
+ - PulseCall() case-sensitive RC, no clipping
+ - IPDRaw() to avoid up and downscaling for stitching
+- BamRecord::ParseTagName and BamRecord::ParseTagString to convert a two
+ character tag string to a TagName enum and back. Allows a switch over tags.
+- VirtualPolymeraseReader to create VirtualPolymeraseBamRecord from a
+ subreads|hqregion+scraps.bam
+- VirtualRegion represents annotations of the polymerase reads, for adapters,
+ barcodes, lqregions, and hqregions.
+- ReadGroupInfo operator==
+
+### Fixed
+
+- Reimplemented QueryStart(int), QueryEnd(int), UpdateName(void),
+ ReadGroup(ReadGroupInfo&), ReadGroupId(std::string&);
+
+## [0.0.5] - 2015-05-29
+
+### Added
+
+- DataSet support. This includes XML I/O, basic dataset query/manipulation, and multi-BAM-file
+ queries. New classes are located in <pbbam/dataset/>. DataSet-capable queries currently reside in the
+ PacBio::BAM::staging namespace. These will be ported over to the main namespace once the support is
+ stabilized and works seamlessly with either a single BamFile or DataSet object as input. (bug 25941)
+- PBI support. This includes read/write raw data & building from a BamFile. The lookup API for
+ random-access queries is under development, but the raw data is available - for creating PBI files &
+ generating summary statistics. (bug 26025)
+- C# SWIG bindings, alongside existing Python and R wrappers.
+- LocalContextFlags support in BamRecord (bug 26623)
+
+### Fixed
+
+- BamRecord[Impl] map quality now initialized with 255 (missing) value, instead of 0. (bug 26228)
+- ReadGroupId calculation. (bug 25940)
+
+## [0.0.4] - 2015-04-22
+
+### Added
+
+- This changelog. Hope it helps.
+- Hook to set verbosity of underlying htslib warnings.
+- Grouped queries. (bug 26361)
+
+### Changed
+
+- Now using exceptions instead of return codes, output parameters, etc.
+- Removed "messy" shared_ptrs across interface (see especially BamHeader). These are now taken care of within the API, not exposed to client code.
+
+### Removed
+
+- BamReader
+
+### Fixed
+
+- ASCII tag output. (bug 26381)
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..f7a646d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,132 @@
+########################################################################
+# CMake build script for PacBioBAM library.
+########################################################################
+
+cmake_policy(SET CMP0048 NEW) # lets us set version in project()
+project(PacBioBAM VERSION 0.1.0 LANGUAGES CXX C)
+cmake_minimum_required(VERSION 3.0)
+
+# project version
+set(PacBioBAM_VERSION
+ "${PacBioBAM_VERSION_MAJOR}.${PacBioBAM_VERSION_MINOR}.${PacBioBAM_VERSION_PATCH}"
+)
+
+# list build-time options
+option(PacBioBAM_build_docs "Build PacBioBAM's API documentation." ON)
+option(PacBioBAM_build_tests "Build PacBioBAM's unit tests." ON)
+option(PacBioBAM_build_shared "Build PacBioBAM as shared library as well." OFF)
+option(PacBioBAM_build_pbindex "Build pbindex tool." ON)
+option(PacBioBAM_wrap_csharp "Build PacBioBAM with SWIG bindings for C#." OFF)
+option(PacBioBAM_wrap_python "Build PacBioBAM with SWIG bindings for Python." OFF)
+option(PacBioBAM_wrap_r "Build PacBioBAM with SWIG bindings for R." OFF)
+option(PacBioBAM_use_modbuild "Build PacBioBAM using Modular Build System." OFF)
+
+# --check build-time options --
+
+# enable testing if requested
+if(PacBioBAM_build_tests)
+ enable_testing()
+endif()
+
+# determine if we're generating SWIG bindings
+if(PacBioBAM_wrap_csharp OR PacBioBAM_wrap_r OR PacBioBAM_wrap_python)
+ set(wrapping_swig TRUE)
+else()
+ set(wrapping_swig FALSE)
+endif()
+
+# determine if we need a shared lib
+if(PacBioBAM_build_shared OR wrapping_swig)
+ set(BUILD_SHARED_LIBS ON)
+ set(htslib_build_shared ON CACHE BOOL "force htslibConfig to export proper library name")
+ set(PB_LIB_MODE SHARED)
+ set(PB_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
+else()
+ set(BUILD_SHARED_LIBS OFF)
+ set(PB_LIB_MODE STATIC)
+ set(PB_LIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX})
+endif()
+
+# main project paths
+set(PacBioBAM_RootDir ${PacBioBAM_SOURCE_DIR})
+set(PacBioBAM_DocsDir ${PacBioBAM_RootDir}/docs)
+set(PacBioBAM_IncludeDir ${PacBioBAM_RootDir}/include)
+set(PacBioBAM_SourceDir ${PacBioBAM_RootDir}/src)
+set(PacBioBAM_SwigSourceDir ${PacBioBAM_RootDir}/src/swig)
+set(PacBioBAM_TestsDir ${PacBioBAM_RootDir}/tests)
+
+if(NOT PacBioBAM_OutputDir)
+ set(PacBioBAM_OutputDir ${PacBioBAM_RootDir})
+else()
+ # if SWIG bindings requested
+ if(${wrapping_swig})
+ message(FATAL_ERROR "SWIG bindings not currently supported in modular build.")
+ endif()
+endif()
+
+set(PacBioBAM_BinDir ${PacBioBAM_OutputDir}/bin)
+set(PacBioBAM_LibDir ${PacBioBAM_OutputDir}/lib)
+set(PacBioBAM_ThirdPartyDir ${PacBioBAM_RootDir}/third-party)
+
+file(MAKE_DIRECTORY ${PacBioBAM_BinDir})
+file(MAKE_DIRECTORY ${PacBioBAM_LibDir})
+
+# use some custom Find*, Use* cmake modules
+list(APPEND CMAKE_MODULE_PATH "${PacBioBAM_RootDir}/cmake")
+
+# shared & third-party paths
+if(NOT HTSLIB_INCLUDE_DIRS OR
+ NOT HTSLIB_LIBRARIES)
+ if(HTSLIB_ROOTDIR)
+ find_package(htslib
+ PATHS ${HTSLIB_ROOTDIR}/
+ REQUIRED)
+ else()
+ find_package(htslib
+ PATHS ${PacBioBAM_SOURCE_DIR}/../htslib/
+ REQUIRED)
+ endif()
+endif()
+
+if(NOT Boost_INCLUDE_DIRS)
+ find_package(Boost REQUIRED)
+endif()
+
+if (NOT ZLIB_INCLUDE_DIRS OR
+ NOT ZLIB_LIBRARIES)
+ find_package(ZLIB REQUIRED)
+endif()
+
+# shared CXX flags for src & tests
+if (MSVC)
+ set(PacBioBAM_CXX_FLAGS "/Wall")
+else()
+ set(PacBioBAM_CXX_FLAGS "-std=c++11 -Wall -Wno-sign-compare")
+endif()
+
+# NOTE: -Wno-unused-local-typedefs used to quash clang warnings w/ Boost
+include(CheckCXXCompilerFlag)
+check_cxx_compiler_flag("-Wno-unused-local-typedefs" HAS_NO_UNUSED_LOCAL_TYPEDEFS)
+if(HAS_NO_UNUSED_LOCAL_TYPEDEFS)
+ set(PacBioBAM_CXX_FLAGS "${PacBioBAM_CXX_FLAGS} -Wno-unused-local-typedefs")
+endif()
+
+# For now, keep @rpath out of install names on OS X, as it causes SWIG
+# tests to fail.
+if(APPLE)
+ set(CMAKE_MACOSX_RPATH OFF)
+endif()
+
+# keep this order (src first, at least)
+add_subdirectory(src)
+add_subdirectory(tools)
+if(PacBioBAM_build_docs)
+ add_subdirectory(docs)
+endif()
+if(PacBioBAM_build_tests)
+ if (NOT GTEST_SRC_DIR)
+ set(GTEST_SRC_DIR ../gtest)
+ endif()
+ add_subdirectory(${GTEST_SRC_DIR} external/gtest/build)
+ add_subdirectory(tests)
+endif()
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
index 0000000..1d72d77
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,114 @@
+# PacBio::BAM - building & integration
+
+- [Dependencies](#dependencies)
+- [Build](#build)
+- [Test](#test)
+- [Integration](#integration)
+ - [CMake](#cmake)
+ - [Other](#other)
+- [SWIG](#swig)
+ - [Python](#python)
+ - [R](#r)
+ - [CSharp](#csharp)
+
+## Dependencies
+ - CMake v2.8+
+ - Boost 1.54+
+ - zlib
+ - samtools exe (*)
+
+(*) NOTE: ppbam uses samtools for some of its tests, for now at least. The current
+build system points uses a relative path to one of the "prebuilt" samtools binaries.
+If you have checked out pbbam to any path that is NOT:
+
+ ///depot/software/smrtanalysis/bioinformatics/staging/PostPrimary/pbbam
+
+then please edit the Samtools_Dir variable in pbbam/tests/CMakeLists.txt to a place
+that works for your setup. That could just be as simple as "" if you already have
+samtools somewhere in your PATH.
+
+## Build
+
+To perform a simple build of the library (and its tests):
+
+ $ cd <pbbam_root>
+ $ mkdir build
+ $ cd build
+ $ cmake ..
+ $ make
+
+## Test
+
+There are 2 options for testing the library.
+
+1) Run the test executable directly:
+
+ $ <pbbam_root>/tests/bin/test_pbbam
+
+which displays the GoogleTest-formatted results for the 250+ individual tests. This
+provides fine-grained info on any failed test.
+
+2) The other option is to use CMake/CTest-generated 'make' command:
+
+ $ cd <pbbam_root>/build
+ $ make test
+
+which collapses all of the test output into a single, CTest-formatted pass/fail display.
+
+## Integration
+
+### CMake
+
+If you are using CMake for your library or application, you can use the following steps
+to automate both the building of pbbam and its dependencies (if necessary) and importing
+the proper include paths, library paths, etc. If the pbbam library already exists, then
+the header/lib variables are simply imported.
+
+ # just for convenience
+ set(PacBioBAM_RootDir </anywhere/on/disk/path/to/pbbam>)
+
+ # add_subdirectory() sounds a bit misleading, the path can be *anywhere* on disk.
+ # the 2nd arg tells CMake where it should build pbbam if necessary
+ add_subdirectory(${PacBioBAM_RootDir} ${PacBioBAM_RootDir}/build)
+
+ # setup your client
+ add_executable(foo ....)
+
+ # PacBioBAM_INCLUDE_DIRS provides all pbbam headers, as well as dependencies
+ include_directories( .... ${PacBioBAM_INCLUDE_DIRS} )
+
+ # PacBioBAM_LIBRARIES provides libpbbam.a, as well as dependencies
+ target_link_libraries( foo ..... ${PacBioBAM_LIBRARIES} )
+
+### Other
+
+The following instructions apply to all non-CMake-based builds. In addition to Boost headers & zlib, the relevant include paths for pbbam are:
+
+ <pbbam_root>/include
+ <pbbam_root>/third-party/htslib
+
+which allows these statements:
+
+ #include <pbbam/BamRecord.h>
+ #include <htslib/sam.h>
+
+and so on in your code. And the relevant libraries to link to are:
+
+ <pbbam_root>/lib/libpbbam.a
+ <pbbam_root>/third-party/htslib/libhts.a
+
+## SWIG
+
+TODO: fill this in
+
+### Python
+
+TODO: fill this in
+
+### R
+
+TODO: fill this in
+
+### CSharp
+
+TODO: fill this in
diff --git a/cmake/FindCSharp.cmake b/cmake/FindCSharp.cmake
new file mode 100644
index 0000000..08d09a7
--- /dev/null
+++ b/cmake/FindCSharp.cmake
@@ -0,0 +1,72 @@
+#
+# A CMake Module for finding and using C# (.NET and Mono).
+#
+# The following variables are set:
+# CSHARP_FOUND - set to ON if C# is found
+# CSHARP_USE_FILE - the path to the C# use file
+# CSHARP_TYPE - the type of the C# compiler (eg. ".NET" or "Mono")
+# CSHARP_VERSION - the version of the C# compiler (eg. "v4.0" or "2.10.2")
+# CSHARP_COMPILER - the path to the C# compiler executable (eg. "C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe" or "/usr/bin/gmcs")
+# CSHARP_INTERPRETER - the path to interpreter needed to run CSharp executables
+# CSHARP_PLATFORM - the C# target platform
+# CSHARP_SDK - the SDK commandline switch (empty for .NET, for Mono eg. "/sdk:2" or "/sdk:4")
+#
+# This file is based on the work of GDCM:
+# http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindCSharp.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+# TODO: ADD ABILITY TO SELECT WHICH C# COMPILER eg. .NET or Mono (if both exist). For the moment, .NET is selected above Mono.
+
+# Make sure find package macros are included
+include( FindPackageHandleStandardArgs )
+
+unset( CSHARP_COMPILER CACHE )
+unset( CSHARP_INTERPRETER CACHE )
+unset( CSHARP_TYPE CACHE )
+unset( CSHARP_VERSION CACHE )
+unset( CSHARP_FOUND CACHE )
+
+# By default use anycpu platform, allow the user to override
+set( CSHARP_PLATFORM "anycpu" CACHE STRING "C# target platform: x86, x64, anycpu, or itanium" )
+if( NOT ${CSHARP_PLATFORM} MATCHES "x86|x64|anycpu|itanium" )
+ message( FATAL_ERROR "The C# target platform '${CSHARP_PLATFORM}' is not valid. Please enter one of the following: x86, x64, anycpu, or itanium" )
+endif( )
+
+if( WIN32 )
+ find_package( DotNetFrameworkSdk )
+ if( NOT CSHARP_DOTNET_FOUND )
+ find_package( Mono )
+ endif( )
+else( UNIX )
+ find_package( Mono )
+endif( )
+
+if( CSHARP_DOTNET_FOUND )
+ set( CSHARP_TYPE ".NET" CACHE STRING "Using the .NET compiler" )
+ set( CSHARP_VERSION ${CSHARP_DOTNET_VERSION} CACHE STRING "C# .NET compiler version" FORCE )
+ set( CSHARP_COMPILER ${CSHARP_DOTNET_COMPILER_${CSHARP_DOTNET_VERSION}} CACHE STRING "Full path to .NET compiler" FORCE )
+ set( CSHARP_INTERPRETER "" CACHE INTERNAL "Interpretor not required for .NET" FORCE )
+elseif( CSHARP_MONO_FOUND )
+ set( CSHARP_TYPE "Mono" CACHE STRING "Using the Mono compiler" )
+ set( CSHARP_VERSION ${CSHARP_MONO_VERSION} CACHE STRING "C# Mono compiler version" FORCE )
+ set( CSHARP_COMPILER ${CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION}} CACHE STRING "Full path to Mono compiler" FORCE )
+ set( CSHARP_INTERPRETER ${CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION}} CACHE STRING "Full path to Mono interpretor" FORCE )
+ set( CSHARP_SDK "/sdk:4.5" CACHE STRING "C# Mono SDK commandline switch (e.g. /sdk:2, /sdk:4, /sdk:5)" )
+endif( )
+
+# Handle WIN32 specific issues
+if ( WIN32 )
+ if ( CSHARP_COMPILER MATCHES "bat" )
+ set( CSHARP_COMPILER "call ${CSHARP_COMPILER}" )
+ endif ( )
+endif( )
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(CSharp DEFAULT_MSG CSHARP_TYPE CSHARP_VERSION CSHARP_COMPILER)
+
+mark_as_advanced( CSHARP_TYPE CSHARP_VERSION CSHARP_COMPILER CSHARP_INTERPRETER CSHARP_PLATFORM CSHARP_SDK )
+
+# Set the USE_FILE path
+# http://public.kitware.com/Bug/view.php?id=7757
+get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
+set( CSHARP_USE_FILE ${current_list_path}/UseCSharp.cmake )
diff --git a/cmake/FindDotNetFrameworkSdk.cmake b/cmake/FindDotNetFrameworkSdk.cmake
new file mode 100644
index 0000000..8e12c70
--- /dev/null
+++ b/cmake/FindDotNetFrameworkSdk.cmake
@@ -0,0 +1,29 @@
+# Set paths and vars for .NET compilers
+# This is hand-rolled because I had problems with the one from SimpleITK
+
+#
+# The following variables are set:
+# CSHARP_DOTNET_FOUND
+# CSHARP_DOTNET_COMPILER_${version} eg. "CSHARP_DOTNET_COMPILER_v4.0.30319"
+# CSHARP_DOTNET_VERSION eg. "v4.0.30319"
+# CSHARP_DOTNET_VERSIONS eg. "v2.0.50727, v3.5, v4.0.30319"
+# DotNetFrameworkSdk_USE_FILE
+#
+# CSHARP_PROJECT_BUILDER (xbuild/msbuild)
+
+set(framework_dir "C:/Windows/Microsoft.NET/Framework")
+
+set(CSHARP_DOTNET_VERSION "v4.0.30319")
+set(CSHARP_DOTNET_VERSIONS "")
+set(CSHARP_DOTNET_COMPILER_${CSHARP_DOTNET_VERSION} "${framework_dir}/${CSHARP_DOTNET_VERSION}/csc.exe")
+set(CSHARP_PROJECT_BUILDER "${framework_dir}/${CSHARP_DOTNET_VERSION}/MSBuild.exe")
+
+if(EXISTS ${CSHARP_DOTNET_COMPILER_${CSHARP_DOTNET_VERSION}})
+ set(CSHARP_DOTNET_FOUND 1)
+else()
+ set(CSHARP_DOTNET_FOUND 0)
+endif()
+
+# Set USE_FILE
+get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
+set( DotNetFrameworkSdk_USE_FILE ${current_list_path}/UseDotNetFrameworkSdk.cmake )
\ No newline at end of file
diff --git a/cmake/FindMono.cmake b/cmake/FindMono.cmake
new file mode 100644
index 0000000..0fab116
--- /dev/null
+++ b/cmake/FindMono.cmake
@@ -0,0 +1,167 @@
+#
+# A CMake Module for finding Mono.
+#
+# The following variables are set:
+# CSHARP_MONO_FOUND
+# CSHARP_MONO_COMPILER_${version} eg. "CSHARP_MONO_COMPILER_2.10.2"
+# CSHARP_MONO_INTERPRETOR_${version} eg. "CSHARP_MONO_INTERPRETOR_2.10.2"
+# CSHARP_MONO_VERSION eg. "2.10.2"
+# CSHARP_MONO_VERSIONS eg. "2.10.2, 2.6.7"
+#
+# Additional references can be found here:
+# http://www.mono-project.com/Main_Page
+# http://www.mono-project.com/CSharp_Compiler
+# http://mono-project.com/FAQ:_Technical (How can I tell where the Mono runtime is installed)
+#
+# This file is based on the work of GDCM:
+# http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+set( csharp_mono_valid 1 )
+if( DEFINED CSHARP_MONO_FOUND )
+ # The Mono compiler has already been found
+ # It may have been reset by the user, verify it is correct
+ if( NOT DEFINED CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
+ set( csharp_mono_version_user ${CSHARP_MONO_VERSION} )
+ set( csharp_mono_valid 0 )
+ set( CSHARP_MONO_FOUND 0 )
+ set( CSHARP_MONO_VERSION "CSHARP_MONO_VERSION-NOTVALID" CACHE STRING "C# Mono compiler version, choices: ${CSHARP_MONO_VERSIONS}" FORCE )
+ message( FATAL_ERROR "The C# Mono version '${csharp_mono_version_user}' is not valid. Please enter one of the following: ${CSHARP_MONO_VERSIONS}" )
+ endif( NOT DEFINED CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
+endif( DEFINED CSHARP_MONO_FOUND )
+
+unset( CSHARP_MONO_VERSIONS CACHE ) # Clear versions
+if( WIN32 )
+ # Search for Mono on Win32 systems
+ # See http://mono-project.com/OldReleases and http://www.go-mono.com/mono-downloads/download.html
+ set( csharp_mono_bin_dirs )
+ set( csharp_mono_search_hints
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.11.2;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.9;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.8;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.7;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.6;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.5;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.4;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.3;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.2;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.1;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.8;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.7;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.4;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.3;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.1;SdkInstallRoot]/bin"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6;SdkInstallRoot]/bin"
+ )
+ foreach( csharp_mono_search_hint ${csharp_mono_search_hints} )
+ get_filename_component( csharp_mono_bin_dir "${csharp_mono_search_hint}" ABSOLUTE )
+ if ( EXISTS "${csharp_mono_bin_dir}" )
+ set( csharp_mono_bin_dirs ${csharp_mono_bin_dirs} ${csharp_mono_bin_dir} )
+ endif ( EXISTS "${csharp_mono_bin_dir}" )
+ endforeach( csharp_mono_search_hint )
+ # TODO: Use HKLM_LOCAL_MACHINE\Software\Novell\Mono\DefaultCLR to specify default version
+ # get_filename_component( test "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono;DefaultCLR]" NAME )
+
+ foreach ( csharp_mono_bin_dir ${csharp_mono_bin_dirs} )
+ string( REPLACE "\\" "/" csharp_mono_bin_dir ${csharp_mono_bin_dir} )
+ if (EXISTS "${csharp_mono_bin_dir}/dmcs.bat")
+ set( csharp_mono_executable "${csharp_mono_bin_dir}/dmcs.bat")
+ elseif (EXISTS "${csharp_mono_bin_dir}/gmcs.bat")
+ set( csharp_mono_executable "${csharp_mono_bin_dir}/gmcs.bat")
+ elseif (EXISTS "${csharp_mono_bin_dir}/mcs.bat")
+ set( csharp_mono_executable "${csharp_mono_bin_dir}/mcs.bat")
+ endif (EXISTS "${csharp_mono_bin_dir}/dmcs.bat")
+
+ if( csharp_mono_valid )
+ # Extract version number (eg. 2.10.2)
+ string(REGEX MATCH "([0-9]*)([.])([0-9]*)([.]*)([0-9]*)" csharp_mono_version_temp ${csharp_mono_bin_dir})
+ set( CSHARP_MONO_VERSION ${csharp_mono_version_temp} CACHE STRING "C# Mono compiler version" )
+ mark_as_advanced( CSHARP_MONO_VERSION )
+
+ # Add variable holding executable
+ set( CSHARP_MONO_COMPILER_${csharp_mono_version_temp} ${csharp_mono_executable} CACHE STRING "C# Mono compiler ${csharp_mono_version_temp}" FORCE )
+ mark_as_advanced( CSHARP_MONO_COMPILER_${csharp_mono_version_temp} )
+
+ # Set interpreter
+ if (EXISTS "${csharp_mono_bin_dir}/mono.exe")
+ set( CSHARP_MONO_INTERPRETER_${csharp_mono_version_temp} "${csharp_mono_bin_dir}/mono.exe" CACHE STRING "C# Mono interpreter ${csharp_mono_version_temp}" FORCE )
+ mark_as_advanced( CSHARP_MONO_INTERPRETER_${csharp_mono_version_temp} )
+ endif (EXISTS "${csharp_mono_bin_dir}/mono.exe")
+ endif( csharp_mono_valid )
+
+ # Create a list of supported compiler versions
+ if( NOT DEFINED CSHARP_MONO_VERSIONS )
+ set( CSHARP_MONO_VERSIONS "${csharp_mono_version_temp}" CACHE STRING "Available C# Mono compiler versions" FORCE )
+ else( NOT DEFINED CSHARP_MONO_VERSIONS )
+ set( CSHARP_MONO_VERSIONS "${CSHARP_MONO_VERSIONS}, ${csharp_mono_version_temp}" CACHE STRING "Available C# Mono versions" FORCE )
+ endif( NOT DEFINED CSHARP_MONO_VERSIONS )
+ mark_as_advanced( CSHARP_MONO_VERSIONS )
+
+ # We found at least one Mono compiler version
+ set( CSHARP_MONO_FOUND 1 CACHE INTERNAL "Boolean indicating if C# Mono was found" )
+ endforeach( csharp_mono_bin_dir )
+
+else( UNIX )
+ # Search for Mono on non-Win32 systems
+ set( chsarp_mono_names "mcs" "mcs.exe" "dmcs" "dmcs.exe" "smcs" "smcs.exe" "gmcs" "gmcs.exe" )
+ set(
+ csharp_mono_paths
+ "/usr/bin/"
+ "/usr/local/bin/"
+ "/usr/lib/mono/2.0"
+ "/opt/novell/mono/bin"
+ )
+ find_program(
+ csharp_mono_compiler # variable is added to the cache, we removed it below
+ NAMES ${chsarp_mono_names}
+ PATHS ${csharp_mono_paths}
+ )
+
+ if( EXISTS ${csharp_mono_compiler} )
+ # Determine version
+ find_program(
+ csharp_mono_interpreter # variable is added to the cache, we removed it below
+ NAMES mono
+ PATHS ${csharp_mono_paths}
+ )
+ if ( EXISTS ${csharp_mono_interpreter} )
+ execute_process(
+ COMMAND ${csharp_mono_interpreter} -V
+ OUTPUT_VARIABLE csharp_mono_version_string
+ )
+ string( REGEX MATCH "([0-9]*)([.])([0-9]*)([.]*)([0-9]*)" csharp_mono_version_temp ${csharp_mono_version_string} )
+ set( CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION} ${csharp_mono_interpreter} CACHE STRING "C# Mono interpreter ${csharp_mono_version_temp}" FORCE )
+ mark_as_advanced( CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION} )
+ endif ( EXISTS ${csharp_mono_interpreter} )
+ unset( csharp_mono_interpreter CACHE )
+
+ # We found Mono compiler
+ set( CSHARP_MONO_VERSION ${csharp_mono_version_temp} CACHE STRING "C# Mono compiler version" )
+ mark_as_advanced( CSHARP_MONO_VERSION )
+ set( CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} ${csharp_mono_compiler} CACHE STRING "C# Mono compiler ${CSHARP_MONO_VERSION}" FORCE )
+ mark_as_advanced( CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
+ set( CSHARP_MONO_VERSIONS ${CSHARP_MONO_VERSION} CACHE STRING "Available C# Mono compiler versions" FORCE )
+ mark_as_advanced( CSHARP_MONO_VERSIONS )
+ set( CSHARP_MONO_FOUND 1 CACHE INTERNAL "Boolean indicating if C# Mono was found" )
+
+ # Assume xbuild is just xbuild.
+ set(CSHARP_PROJECT_BUILDER "xbuild")
+
+
+ endif( EXISTS ${csharp_mono_compiler} )
+
+ # Remove temp variable from cache
+ unset( csharp_mono_compiler CACHE )
+
+endif( WIN32 )
+
+if( CSHARP_MONO_FOUND )
+ # Report the found versions
+ message( STATUS "Found the following C# Mono versions: ${CSHARP_MONO_VERSIONS}" )
+endif( CSHARP_MONO_FOUND )
+
+# Set USE_FILE
+get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
+set( Mono_USE_FILE ${current_list_path}/UseMono.cmake )
diff --git a/cmake/FindR.cmake b/cmake/FindR.cmake
new file mode 100644
index 0000000..6ae4354
--- /dev/null
+++ b/cmake/FindR.cmake
@@ -0,0 +1,48 @@
+
+#
+# - This module locates an installed R distribution.
+#
+# Defines the following:
+#
+# R_INCLUDE_DIR - Path to R include directory
+# R_LIBRARIES - Path to R library
+# R_LIBRARY_BASE -
+# R_COMMAND - Path to R command
+# RSCRIPT_EXECUTABLE - Path to Rscript command
+#
+
+
+# Make sure find package macros are included
+include( FindPackageHandleStandardArgs )
+
+set(TEMP_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
+set(CMAKE_FIND_APPBUNDLE "NEVER")
+find_program(R_COMMAND R DOC "R executable.")
+if(R_COMMAND)
+ execute_process(WORKING_DIRECTORY . COMMAND ${R_COMMAND} RHOME OUTPUT_VARIABLE R_BASE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
+ set(R_HOME ${R_BASE_DIR} CACHE PATH "R home directory obtained from R RHOME")
+ mark_as_advanced(R_HOME)
+endif(R_COMMAND)
+
+find_program(RSCRIPT_EXECUTABLE Rscript DOC "Rscript executable.")
+
+set(CMAKE_FIND_APPBUNDLE ${TEMP_CMAKE_FIND_APPBUNDLE})
+
+# R.h gets installed in all sorts of places -
+# ubuntu: /usr/share/R/include, RHEL/Fedora: /usr/include/R/R.h
+find_path(R_INCLUDE_DIR R.h PATHS ${R_INCLUDE_DIR_HINT} /usr/local/lib /usr/local/lib64 /usr/share /usr/include ${R_BASE_DIR} PATH_SUFFIXES include R R/include DOC "Path to file R.h")
+find_library(R_LIBRARY_BASE R PATHS ${R_BASE_DIR} PATH_SUFFIXES /lib DOC "R library (example libR.a, libR.dylib, etc.).")
+
+set(R_LIBRARIES ${R_LIBRARY_BASE})
+mark_as_advanced(RSCRIPT_EXECUTABLE R_LIBRARIES R_INCLUDE_DIR R_COMMAND R_LIBRARY_BASE)
+
+
+set( _REQUIRED_R_VARIABLES R_INCLUDE_DIR R_COMMAND )
+
+if( APPLE )
+ # On linux platform some times the libR.so is not available, however
+ # on apple a link error results if the library is linked.
+ list( APPEND _REQUIRED_R_VARIABLES R_LIBRARIES R_LIBRARY_BASE )
+endif()
+
+find_package_handle_standard_args(R DEFAULT_MSG ${_REQUIRED_R_VARIABLES} )
diff --git a/cmake/UseCSharp.cmake b/cmake/UseCSharp.cmake
new file mode 100644
index 0000000..dac4537
--- /dev/null
+++ b/cmake/UseCSharp.cmake
@@ -0,0 +1,111 @@
+# CMake Module for finding and using C# (.NET and Mono).
+#
+# The following global variables are assumed to exist:
+# CSHARP_SOURCE_DIRECTORY - path to C# sources
+# CSHARP_BINARY_DIRECTORY - path to place resultant C# binary files
+#
+# The following variables are set:
+# CSHARP_TYPE - the type of the C# compiler (eg. ".NET" or "Mono")
+# CSHARP_COMPILER - the path to the C# compiler executable (eg. "C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe")
+# CSHARP_VERSION - the version number of the C# compiler (eg. "v4.0.30319")
+#
+# The following macros are defined:
+# CSHARP_ADD_EXECUTABLE( name references [files] [output_dir] ) - Define C# executable with the given name
+# CSHARP_ADD_LIBRARY( name references [files] [output_dir] ) - Define C# library with the given name
+#
+# Examples:
+# CSHARP_ADD_EXECUTABLE( MyExecutable "" "Program.cs" )
+# CSHARP_ADD_EXECUTABLE( MyExecutable "ref1.dll ref2.dll" "Program.cs File1.cs" )
+# CSHARP_ADD_EXECUTABLE( MyExecutable "ref1.dll;ref2.dll" "Program.cs;File1.cs" )
+#
+# This file is based on the work of GDCM:
+# http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/UseCSharp.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+# TODO: ADD SUPPORT FOR LINK LIBRARIES
+
+# Check something was found
+if( NOT CSHARP_COMPILER )
+ message( WARNING "A C# compiler executable was not found on your system" )
+endif( NOT CSHARP_COMPILER )
+
+# Include type-based USE_FILE
+if( CSHARP_TYPE MATCHES ".NET" )
+ include( ${DotNetFrameworkSdk_USE_FILE} )
+elseif ( CSHARP_TYPE MATCHES "Mono" )
+ include( ${Mono_USE_FILE} )
+endif ( CSHARP_TYPE MATCHES ".NET" )
+
+macro( CSHARP_ADD_LIBRARY name )
+ CSHARP_ADD_PROJECT( "library" ${name} ${ARGN} )
+endmacro( CSHARP_ADD_LIBRARY )
+
+macro( CSHARP_ADD_EXECUTABLE name )
+ CSHARP_ADD_PROJECT( "exe" ${name} ${ARGN} )
+endmacro( CSHARP_ADD_EXECUTABLE )
+
+# Private macro
+macro( CSHARP_ADD_PROJECT type name )
+ set( refs "/reference:System.dll" )
+ set( sources )
+ set( sources_dep )
+
+ if( ${type} MATCHES "library" )
+ set( output "dll" )
+ elseif( ${type} MATCHES "exe" )
+ set( output "exe" )
+ endif( ${type} MATCHES "library" )
+
+ # Step through each argument
+ foreach( it ${ARGN} )
+ if( ${it} MATCHES "(.*)(dll)" )
+ # Argument is a dll, add reference
+ list( APPEND refs /reference:${it} )
+ else( )
+ # Argument is a source file
+ if( EXISTS ${it} )
+ list( APPEND sources ${it} )
+ list( APPEND sources_dep ${it} )
+ elseif( EXISTS ${CSHARP_SOURCE_DIRECTORY}/${it} )
+ list( APPEND sources ${CSHARP_SOURCE_DIRECTORY}/${it} )
+ list( APPEND sources_dep ${CSHARP_SOURCE_DIRECTORY}/${it} )
+ elseif( ${it} MATCHES "[*]" )
+ # For dependencies, we need to expand wildcards
+ FILE( GLOB it_glob ${it} )
+ list( APPEND sources ${it} )
+ list( APPEND sources_dep ${it_glob} )
+ endif( )
+ endif ( )
+ endforeach( )
+
+ # Check we have at least one source
+ list( LENGTH sources_dep sources_length )
+ if ( ${sources_length} LESS 1 )
+ MESSAGE( SEND_ERROR "No C# sources were specified for ${type} ${name}" )
+ endif ()
+ list( SORT sources_dep )
+
+ # Perform platform specific actions
+ if (WIN32)
+ string( REPLACE "/" "\\" sources ${sources} )
+ else (UNIX)
+ string( REPLACE "\\" "/" sources ${sources} )
+ endif (WIN32)
+
+ # Add custom target and command
+ MESSAGE( STATUS "Adding C# ${type} ${name}: '${CSHARP_COMPILER} /t:${type} /out:${name}.${output} /platform:${CSHARP_PLATFORM} ${CSHARP_SDK} ${refs} ${sources}'" )
+ add_custom_command(
+ COMMENT "Compiling C# ${type} ${name}: '${CSHARP_COMPILER} /t:${type} /out:${name}.${output} /platform:${CSHARP_PLATFORM} ${CSHARP_SDK} ${refs} ${sources}'"
+ OUTPUT ${CSHARP_BINARY_DIRECTORY}/${name}.${output}
+ COMMAND ${CSHARP_COMPILER}
+ ARGS /t:${type} /out:${name}.${output} /platform:${CSHARP_PLATFORM} ${CSHARP_SDK} ${refs} ${sources}
+ WORKING_DIRECTORY ${CSHARP_BINARY_DIRECTORY}
+ DEPENDS ${sources_dep}
+ )
+ add_custom_target(
+ ${name} ALL
+ DEPENDS ${CSHARP_BINARY_DIRECTORY}/${name}.${output}
+ SOURCES ${sources_dep}
+ )
+endmacro( CSHARP_ADD_PROJECT )
diff --git a/cmake/UseDotNetFrameworkSdk.cmake b/cmake/UseDotNetFrameworkSdk.cmake
new file mode 100644
index 0000000..6be4027
--- /dev/null
+++ b/cmake/UseDotNetFrameworkSdk.cmake
@@ -0,0 +1,16 @@
+#
+# A CMake Module for using Mono.
+#
+# The following variables are set:
+# (none)
+#
+# Additional references can be found here:
+# http://www.mono-project.com/Main_Page
+# http://www.mono-project.com/CSharp_Compiler
+#
+# This file is based on the work of GDCM:
+# http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+message( STATUS "Using .NET compiler version ${CSHARP_DOTNET_VERSION}" )
\ No newline at end of file
diff --git a/cmake/UseMono.cmake b/cmake/UseMono.cmake
new file mode 100644
index 0000000..16a80ae
--- /dev/null
+++ b/cmake/UseMono.cmake
@@ -0,0 +1,16 @@
+#
+# A CMake Module for using Mono.
+#
+# The following variables are set:
+# (none)
+#
+# Additional references can be found here:
+# http://www.mono-project.com/Main_Page
+# http://www.mono-project.com/CSharp_Compiler
+#
+# This file is based on the work of GDCM:
+# http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+message( STATUS "Using Mono compiler version ${CSHARP_MONO_VERSION}" )
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
new file mode 100644
index 0000000..ff044b9
--- /dev/null
+++ b/docs/CMakeLists.txt
@@ -0,0 +1,11 @@
+find_package(Doxygen)
+
+if(DOXYGEN_FOUND)
+ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${PacBioBAM_DocsDir}/Doxyfile @ONLY )
+ add_custom_target(doc
+ ${DOXYGEN_EXECUTABLE} ${PacBioBAM_DocsDir}/Doxyfile
+ WORKING_DIRECTORY ${PacBioBAM_DocsDir}
+ COMMENT "Generating API documentation with Doxygen"
+ VERBATIM
+ )
+endif()
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
new file mode 100644
index 0000000..66c4de1
--- /dev/null
+++ b/docs/Doxyfile.in
@@ -0,0 +1,1602 @@
+# Doxyfile 1.6.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = @CMAKE_PROJECT_NAME@
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @PacBioBAM_VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = @PacBioBAM_DocsDir@
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 1
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+#samSpecURL=http://samtools.sourceforge.net/SAM1.pdf
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses.
+# With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this tag.
+# The format is ext=language, where ext is a file extension, and language is one of
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C. Note that for custom extensions you also need to set
+# FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page. This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# of the layout file.
+
+LAYOUT_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @PacBioBAM_IncludeDir@/pbbam @PacBioBAM_SourceDir@
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.d \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.py \
+ *.f90 \
+ *.f \
+ *.vhd \
+ *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = YES
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvances is that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
diff --git a/include/pbbam/Accuracy.h b/include/pbbam/Accuracy.h
new file mode 100644
index 0000000..03c233e
--- /dev/null
+++ b/include/pbbam/Accuracy.h
@@ -0,0 +1,98 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef ACCURACY_H
+#define ACCURACY_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief The Accuracy class represents the expected accuracy of a BamRecord.
+/// Values are clamped to [0,1000].
+///
+class PBBAM_EXPORT Accuracy
+{
+public:
+ static const int MIN;
+ static const int MAX;
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// \note This is not an 'explicit' ctor, to make it as easy to use in
+ /// numeric operations as possible. We really just want to make
+ /// sure that the acceptable range is respected.
+ Accuracy(int accuracy);
+ Accuracy(const Accuracy& other);
+ ~Accuracy(void);
+
+ /// \}
+
+public:
+
+ /// \returns Accuracy as integer
+ operator int(void) const;
+
+private:
+ int accuracy_;
+};
+
+inline Accuracy::Accuracy(int accuracy)
+{
+ if (accuracy < Accuracy::MIN)
+ accuracy = Accuracy::MIN;
+ else if (accuracy > Accuracy::MAX)
+ accuracy = Accuracy::MAX;
+ accuracy_ = accuracy;
+}
+
+inline Accuracy::Accuracy(const Accuracy &other)
+ : accuracy_(other.accuracy_)
+{ }
+
+inline Accuracy::~Accuracy(void) { }
+
+inline Accuracy::operator int(void) const
+{ return accuracy_; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ACCURACY_H
diff --git a/include/pbbam/AlignmentPrinter.h b/include/pbbam/AlignmentPrinter.h
new file mode 100644
index 0000000..6424c5f
--- /dev/null
+++ b/include/pbbam/AlignmentPrinter.h
@@ -0,0 +1,83 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#ifndef ALIGNMENTPRINTER_H
+#define ALIGNMENTPRINTER_H
+
+#include <memory>
+#include <string>
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/IndexedFastaReader.h"
+#include "pbbam/Orientation.h"
+
+namespace PacBio {
+namespace BAM {
+
+class BamRecord;
+
+class AlignmentPrinter
+{
+public:
+ AlignmentPrinter(const IndexedFastaReader& ifr)
+ : ifr_(std::unique_ptr<IndexedFastaReader>(new IndexedFastaReader(ifr)))
+ { }
+
+ AlignmentPrinter() = delete;
+ // Move constructor
+ AlignmentPrinter(AlignmentPrinter&&) = default;
+ // Copy constructor
+ AlignmentPrinter(const AlignmentPrinter&) = delete;
+ // Move assignment operator
+ AlignmentPrinter& operator=(AlignmentPrinter&&) = default;
+ // Copy assignment operator
+ AlignmentPrinter& operator=(const AlignmentPrinter&) = delete;
+ // Destructor
+ ~AlignmentPrinter() = default;
+
+public:
+ std::string Print(const BamRecord& record,
+ const Orientation orientation = Orientation::GENOMIC);
+
+private:
+ const std::unique_ptr<IndexedFastaReader> ifr_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ALIGNMENTPRINTER_H
diff --git a/include/pbbam/BamFile.h b/include/pbbam/BamFile.h
new file mode 100644
index 0000000..62da044
--- /dev/null
+++ b/include/pbbam/BamFile.h
@@ -0,0 +1,147 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMFILE_H
+#define BAMFILE_H
+
+#include "pbbam/Config.h"
+#include "pbbam/BamHeader.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamFilePrivate; }
+
+class PBBAM_EXPORT BamFile
+{
+public:
+
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// \brief Creates a BamFile object on the provided \p filename & loads header information.
+ ///
+ /// \param[in] filename BAM filename
+ /// \throws std::exception on failure
+ BamFile(const std::string& filename);
+
+ BamFile(const BamFile& other);
+ BamFile(BamFile&& other);
+ BamFile& operator=(const BamFile& other);
+ BamFile& operator=(BamFile&& other);
+ ~BamFile(void);
+
+ /// \}
+
+public:
+
+ /// \name Index & Filename Methods
+ /// \{
+
+ /// Check that ".pbi" exists and is newer than this BAM file.
+ /// If not, one will be created.
+ ///
+ /// \throws if PBI file could not be properly created and/or
+ /// written to disk
+ ///
+ void EnsurePacBioIndexExists(void) const;
+
+ /// Check that ".bai" exists and is newer than this BAM file.
+ /// If not, one will be created.
+ ///
+ /// \throws if BAI file could not be properly created (e.g. this
+ /// BAM is not coordinate-sorted) or could not be written to disk
+ ///
+ void EnsureStandardIndexExists(void) const;
+
+ /// \returns BAM filename
+ std::string Filename(void) const;
+
+ /// \returns true if ".pbi" exists and is newer than this BAM file.
+ bool PacBioIndexExists(void) const;
+
+ /// \returns filename of PacBio index file (".pbi")
+ /// \note No guarantee is made on the existence of this file.
+ /// This method simply returns the expected filename.
+ std::string PacBioIndexFilename(void) const;
+
+ /// \returns true if ".bai" exists and is newer than this BAM file.
+ bool StandardIndexExists(void) const;
+
+ /// \returns filename of standard index file (".bai")
+ /// \note No guarantee is made on the existence of this file.
+ /// This method simply returns the expected filename.
+ std::string StandardIndexFilename(void) const;
+
+
+ /// \}
+
+ /// \name Header Metadata Methods
+ /// \{
+
+ /// \returns true if header metadata has this reference name
+ bool HasReference(const std::string& name) const;
+
+ /// \returns const reference to BamHeader containing the file's metadata
+ const BamHeader& Header(void) const;
+
+ /// \returns true if BAM file is a PacBio BAM file (i.e. has non-empty version associated with header "pb" tag)
+ bool IsPacBioBAM(void) const;
+
+ /// \returns ID for reference \p name (can be used for e.g. GenomicIntervalQuery), -1 if not found
+ int ReferenceId(const std::string& name) const;
+
+ /// \return name of reference matching \p id, empty string if not found
+ std::string ReferenceName(const int id) const;
+
+ /// \returns length of requested reference \p name. 0 if not found
+ uint32_t ReferenceLength(const std::string& name) const;
+
+ /// \returns length of requested reference \p id. 0 if not found
+ uint32_t ReferenceLength(const int id) const;
+
+ /// \}
+
+private:
+ PBBAM_SHARED_PTR<internal::BamFilePrivate> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMFILE_H
diff --git a/include/pbbam/BamHeader.h b/include/pbbam/BamHeader.h
new file mode 100644
index 0000000..9dea3cc
--- /dev/null
+++ b/include/pbbam/BamHeader.h
@@ -0,0 +1,184 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMHEADER_H
+#define BAMHEADER_H
+
+#include "pbbam/Config.h"
+#include "pbbam/ProgramInfo.h"
+#include "pbbam/ReadGroupInfo.h"
+#include "pbbam/SequenceInfo.h"
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamHeaderPrivate; }
+
+class PBBAM_EXPORT BamHeader
+{
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ BamHeader(void);
+ BamHeader(const std::string& samHeaderText);
+ BamHeader(const BamHeader& other);
+ BamHeader(BamHeader&& other);
+ BamHeader& operator=(const BamHeader& other);
+ BamHeader& operator=(BamHeader&& other);
+ ~BamHeader(void);
+
+ BamHeader DeepCopy(void) const;
+
+ /// \}
+
+public:
+ /// \name General
+ /// \{
+
+ std::string PacBioBamVersion(void) const;
+ std::string SortOrder(void) const;
+ std::string Version(void) const;
+
+ /// \}
+
+ /// \name Read Groups
+ /// \{
+
+ bool HasReadGroup(const std::string& id) const;
+ ReadGroupInfo ReadGroup(const std::string& id) const;
+ std::vector<std::string> ReadGroupIds(void) const;
+ std::vector<ReadGroupInfo> ReadGroups(void) const;
+
+ /// \}
+
+ /// \name Sequences
+ /// \{
+
+ bool HasSequence(const std::string& name) const;
+ int32_t SequenceId(const std::string& name) const;
+ std::string SequenceLength(const int32_t id) const;
+ std::string SequenceName(const int32_t id) const;
+ std::vector<std::string> SequenceNames(void) const;
+ SequenceInfo Sequence(const int32_t id) const;
+ SequenceInfo Sequence(const std::string& name) const;
+ std::vector<SequenceInfo> Sequences(void) const;
+
+ /// \}
+
+ /// \name Programs
+ /// \{
+
+ bool HasProgram(const std::string& id) const;
+ ProgramInfo Program(const std::string& id) const;
+ std::vector<std::string> ProgramIds(void) const;
+ std::vector<ProgramInfo> Programs(void) const;
+
+ /// \}
+
+ /// \name Comments
+ /// \{
+
+ std::vector<std::string> Comments(void) const;
+
+ /// \}
+
+ /// \name Conversion Methods
+ /// \{
+
+ std::string ToSam(void) const;
+
+ /// \}
+
+public:
+
+ /// \name General
+ /// \{
+
+ BamHeader& PacBioBamVersion(const std::string& version);
+ BamHeader& SortOrder(const std::string& order);
+ BamHeader& Version(const std::string& version);
+
+ /// \}
+
+ /// \name Read Groups
+ /// \{
+
+ BamHeader& AddReadGroup(const ReadGroupInfo& readGroup);
+ BamHeader& ClearReadGroups(void);
+ BamHeader& ReadGroups(const std::vector<ReadGroupInfo>& readGroups);
+
+ /// \}
+
+ /// \name Sequences
+ /// \{
+
+ BamHeader& AddSequence(const SequenceInfo& sequence);
+ BamHeader& ClearSequences(void);
+ BamHeader& Sequences(const std::vector<SequenceInfo>& sequences);
+
+ /// \}
+
+ /// \name Programs
+ /// \{
+
+ BamHeader& AddProgram(const ProgramInfo& pg);
+ BamHeader& ClearPrograms(void);
+ BamHeader& Programs(const std::vector<ProgramInfo>& programs);
+
+ /// \}
+
+ /// \name Comments
+ /// \{
+
+ BamHeader& AddComment(const std::string& comment);
+ BamHeader& ClearComments(void);
+ BamHeader& Comments(const std::vector<std::string>& comments);
+
+ /// \}
+
+private:
+ PBBAM_SHARED_PTR<internal::BamHeaderPrivate> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMHEADER_H
diff --git a/include/pbbam/BamReader.h b/include/pbbam/BamReader.h
new file mode 100644
index 0000000..bd0ced6
--- /dev/null
+++ b/include/pbbam/BamReader.h
@@ -0,0 +1,114 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMREADER_H
+#define BAMREADER_H
+
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT BamReader
+{
+
+public:
+ enum ReadError
+ {
+ NoError = 0
+ , OpenFileError
+ , ReadHeaderError
+ , ReadRecordError
+ };
+
+public:
+ BamReader(void);
+ virtual ~BamReader(void);
+
+public:
+
+ /// Closes the BAM file reader.
+ void Close(void);
+
+ /// Opens a BAM file for reading.
+ ///
+ /// Prefix \p filename with "http://" or "ftp://" for remote files,
+ /// or set to "-" for stdin.
+ ///
+ /// \param[in] filename path to input BAM file
+ ///
+ /// \returns success/failure
+ bool Open(const std::string& filename);
+
+ /// \returns header as BamHeader object
+ BamHeader::SharedPtr Header(void) const;
+
+ /// \returns error status code
+ BamReader::ReadError Error(void) const;
+
+ /// \returns true if error encountered
+ bool HasError(void) const;
+
+ /// Fetches the next record in a BAM file.
+ ///
+ /// \param[out] record pointer to BamRecord object
+ ///
+ /// \returns succcess/failure
+ bool GetNext(PBBAM_SHARED_PTR<BamRecord> record);
+
+public:
+ std::string PacBioBamVersion(void) const;
+
+protected:
+ bool GetNext(PBBAM_SHARED_PTR<bam1_t> rawRecord);
+ void InitialOpen(void);
+ PBBAM_SHARED_PTR<bam_hdr_t> RawHeader(void) const;
+
+protected:
+ PBBAM_SHARED_PTR<samFile> file_;
+ PBBAM_SHARED_PTR<bam_hdr_t> header_;
+ std::string filename_;
+ BamReader::ReadError error_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMREADER_H
diff --git a/include/pbbam/BamRecord.h b/include/pbbam/BamRecord.h
new file mode 100644
index 0000000..8630e4b
--- /dev/null
+++ b/include/pbbam/BamRecord.h
@@ -0,0 +1,1018 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORD_H
+#define BAMRECORD_H
+
+#include "pbbam/Accuracy.h"
+#include "pbbam/Frames.h"
+#include "pbbam/BamRecordImpl.h"
+#include "pbbam/BamHeader.h"
+#include "pbbam/LocalContextFlags.h"
+#include "pbbam/Orientation.h"
+#include "pbbam/ReadGroupInfo.h"
+#include "pbbam/Strand.h"
+#include "pbbam/QualityValues.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamRecordMemory; }
+
+enum class ClipType
+{
+ CLIP_NONE
+ , CLIP_TO_QUERY
+ , CLIP_TO_REFERENCE
+};
+
+enum class RecordType
+{
+ POLYMERASE
+ , HQREGION
+ , SUBREAD
+ , CCS
+ , SCRAP
+ , UNKNOWN
+};
+
+enum class FrameEncodingType
+{
+ LOSSY
+ , LOSSLESS
+};
+
+class PBBAM_EXPORT BamRecord
+{
+public: // static data
+ static const float photonFactor;
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ BamRecord(void);
+ BamRecord(const BamHeader& header);
+ BamRecord(const BamRecordImpl& impl);
+ BamRecord(BamRecordImpl&& impl);
+ BamRecord(const BamRecord& other);
+ BamRecord(BamRecord&& other);
+ BamRecord& operator=(const BamRecord& other);
+ BamRecord& operator=(BamRecord&& other);
+ virtual ~BamRecord(void);
+
+ /// \}
+
+public:
+ /// \name Per-Record Data
+ /// \{
+
+ /// \note AlignedStart is in polymerase read coordinates, NOT genomic coordinates.
+ ///
+ /// \returns the record's aligned start position
+ Position AlignedStart(void) const;
+
+ /// \note AlignedEnd is in polymerase read coordinates, NOT genomic coordinates.
+ ///
+ /// \returns the record's aligned end position
+ Position AlignedEnd(void) const;
+
+ /// \returns the record's strand as a Strand enum value
+ Strand AlignedStrand(void) const;
+
+ /// \returns the record's CIGAR data as a Cigar object
+ Cigar CigarData(void) const;
+
+ /// \returns this record's full name
+ /// \sa BamRecordImpl::Name
+ std::string FullName(void) const;
+
+ /// \returns true if this record has AltLabelQV data
+ bool HasAltLabelQV(void) const;
+
+ /// \returns true if this record has LabelQV data
+ bool HasLabelQV(void) const;
+
+ /// \returns true if this record has DeletionQV data
+ bool HasDeletionQV(void) const;
+
+ /// \returns true if this record has DeletionTag data
+ bool HasDeletionTag(void) const;
+
+ /// \returns true if this record has LocalContextFlags (absent in CCS)
+ bool HasLocalContextFlags(void) const;
+
+ /// \returns true if this record has InsertionQV data
+ bool HasInsertionQV(void) const;
+
+ /// \returns true if this record has Pkmean data
+ bool HasPkmean(void) const;
+
+ /// \returns true if this record has Pkmid data
+ bool HasPkmid(void) const;
+
+ /// \returns true if this record has IPD data
+ bool HasIPD(void) const;
+
+ /// \returns true if this record has PreBaseFrames aka IPD data
+ bool HasPreBaseFrames(void) const;
+
+ /// \returns true if this record has PrePulseFrames data
+ bool HasPrePulseFrames(void) const;
+
+ /// \returns true if this record has PulseCallWidth data
+ bool HasPulseCallWidth(void) const;
+
+ /// \returns true if this record has MergeQV data
+ bool HasMergeQV(void) const;
+
+ /// \returns true if this record has PulseMergeQV data
+ bool HasPulseMergeQV(void) const;
+
+ /// \returns true if this record has PulseWidth data
+ bool HasPulseWidth(void) const;
+
+ /// \returns true if this record has signal-to-noise data (absent in POLYMERASE)
+ bool HasSignalToNoise(void) const;
+
+ /// \returns true if this record has ScrapType data (only in SCRAP)
+ bool HasScrapType(void) const;
+
+ /// \returns true if this record has SubstitutionQV data
+ bool HasSubstitutionQV(void) const;
+
+ /// \returns true if this record has SubstitutionTag data
+ bool HasSubstitutionTag(void) const;
+
+ /// \returns true if this record has AltLabelTag data
+ bool HasAltLabelTag(void) const;
+
+ /// \returns true if this record has PulseCall data
+ bool HasPulseCall(void) const;
+
+ /// \returns true if this record has ReadAccuracyTag data
+ bool HasReadAccuracy(void) const;
+
+ /// \returns true if this record has a HoleNumber
+ bool HasHoleNumber(void) const;
+
+ /// \returns true if this record has QueryStart data
+ bool HasQueryStart(void) const;
+
+ /// \returns true if this record has QueryEnd data
+ bool HasQueryEnd(void) const;
+
+ /// \returns true if this record has Barcode data
+ bool HasBarcodes(void) const;
+
+ /// \returns shared pointer to this record's associated BamHeader
+ BamHeader Header(void) const;
+
+ /// \returns ZMW hole number
+ /// \throws if missing zm tag & record name does not contain hole number
+ int32_t HoleNumber(void) const;
+
+ /// \returns true if this record was mapped by aligner
+ /// \sa BamRecordImpl::IsMapped
+ bool IsMapped(void) const;
+
+ /// \returns this record's LocalContextFlags
+ PacBio::BAM::LocalContextFlags LocalContextFlags(void) const;
+
+ /// \returns this record's mapping quality. A value of 255 indicates "unknown"
+ uint8_t MapQuality(void) const;
+
+ /// \returns this record's movie name
+ std::string MovieName(void) const;
+
+ /// \returns "number of complete passes of the insert"
+ int32_t NumPasses(void) const;
+
+ /// \note QueryStart is in polymerase read coordinates, NOT genomic coordinates.
+ ///
+ /// \returns the record's query start position, or 0 if not stored
+ Position QueryStart(void) const;
+
+ /// \note QueryEnd is in polymerase read coordinates, NOT genomic coordinates.
+ ///
+ /// \returns the record's query end position, or Sequence().length() if not stored
+ Position QueryEnd(void) const;
+
+ /// \returns the left and right barcode ids
+ std::pair<int,int> Barcodes(void) const;
+
+ /// \returns this record's expected read accuracy [0, 1000]
+ Accuracy ReadAccuracy(void) const;
+
+ /// \returns ReadGroupInfo object for this record
+ ReadGroupInfo ReadGroup(void) const;
+
+ /// \returns ID of this record's read group
+ /// \sa ReadGroupInfo::Id
+ std::string ReadGroupId(void) const;
+
+ /// \returns this record's reference ID, or -1 if unmapped.
+ /// \note This is only a valid identifier within this BAM file
+ int32_t ReferenceId(void) const;
+
+ /// \returns this record's reference name.
+ /// \throws an exception if unmapped record.
+ std::string ReferenceName(void) const;
+
+ /// \note ReferenceStart is in reference coordinates, NOT polymerase read coordinates.
+ ///
+ /// \returns the record's reference start position, or UnmappedPosition if unmapped
+ Position ReferenceStart(void) const;
+
+ /// \note ReferenceEnd is in reference coordinates, NOT polymerase read coordinates.
+ ///
+ /// \returns the record's reference end position, or UnmappedPosition if unmapped
+ Position ReferenceEnd(void) const;
+
+ /// \returns this scrap record's ScrapType
+ VirtualRegionType ScrapType(void) const;
+
+ /// \returns this record's average signal-to-noise for each of A, C, G, and T
+ std::vector<float> SignalToNoise(void) const;
+
+ /// \returns this record's type
+ /// \sa RecordType
+ RecordType Type(void) const;
+
+ /// \}
+
+public:
+ /// \name Per-Base Data
+ /// \{
+
+ /// \brief Fetch this record's AltLabelQV values ("pv" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns AltLabelQV as QualityValues object
+ ///
+ QualityValues AltLabelQV(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's AltLabelTag values ("pt" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// gap chars will be '-' and padding chars will be '*'.
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns AltLabelTags string
+ ///
+ std::string AltLabelTag(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's DeletionQV values ("dq" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns DeletionQV as QualityValues object
+ ///
+ QualityValues DeletionQV(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's DeletionTag values ("dt" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// gap chars will be '-' and padding chars will be '*'.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns DeletionTag string
+ ///
+ std::string DeletionTag(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's InsertionQV values ("iq" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns InsertionQVs as QualityValues object
+ ///
+ QualityValues InsertionQV(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's IPD values ("ip" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// frames will have a value of 0;
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns IPD as Frames object
+ ///
+ Frames IPD(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's PreBaseFrames aka IPD values ("ip" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// frames will have a value of 0;
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns IPD as Frames object
+ ///
+ Frames PreBaseFrames(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's IPD values ("ip" tag), but does not upscale.
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns IPD as Frames object
+ ///
+ Frames IPDRaw(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's LabelQV values ("pq" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns LabelQV as QualityValues object
+ ///
+ QualityValues LabelQV(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's MergeQV values ("mq" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns MergeQV as QualityValues object
+ ///
+ QualityValues MergeQV(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's PulseMergeQV values ("pg" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns PulseMergeQV as QualityValues object
+ ///
+ QualityValues PulseMergeQV(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's Pkmean values ("pa" tag).
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns Pkmean as vector<float> object
+ ///
+ std::vector<float> Pkmean(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's Pkmid values ("pm" tag).
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns Pkmid as vector<float> object
+ ///
+ std::vector<float> Pkmid(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's PrePulseFrames values ("pd" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// frames will have a value of 0;
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns PrePulseFrames as Frames object
+ ///
+ Frames PrePulseFrames(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's PulseCall values ("pc" tag).
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns PulseCalls string
+ ///
+ std::string PulseCall(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's PulseCallWidth values ("px" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// frames will have a value of 0;
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns PulseCallWidth as Frames object
+ ///
+ Frames PulseCallWidth(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's PulseWidth values ("pw" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// frames will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns PulseWidths as Frames object
+ ///
+ Frames PulseWidth(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's PulseWidth values ("pw" tag), but does not upscale.
+ ///
+ /// \param[in] orientation Orientation of output.
+ ///
+ /// \returns PulseWidth as Frames object
+ ///
+ Frames PulseWidthRaw(Orientation orientation = Orientation::NATIVE) const;
+
+ /// \brief Fetch this record's BAM quality values (QUAL field).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns BAM qualities as QualityValues object
+ ///
+ QualityValues Qualities(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's DNA sequence (SEQ field).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// gap chars will be '-' and padding chars will be '*'.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns sequence string
+ ///
+ std::string Sequence(const Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's SubstitutionQV values ("sq" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// QVs will have a value of 0.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns SubstitutionQV as QualityValues object
+ ///
+ QualityValues SubstitutionQV(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \brief Fetch this record's SubstitutionTag values ("st" tag).
+ ///
+ /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+ /// gap chars will be '-' and padding chars will be '*'.
+ ///
+ /// \param[in] orientation Orientation of output.
+ /// \param[in] aligned if true, gaps/padding will be inserted, per Cigar info.
+ /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+ ///
+ /// \returns SubstitutionTags string
+ ///
+ std::string SubstitutionTag(Orientation orientation = Orientation::NATIVE,
+ bool aligned = false,
+ bool exciseSoftClips = false) const;
+
+ /// \}
+
+public:
+ /// \name Low-Level
+ /// \{
+
+ /// \warning This method should be considered temporary and avoided as much as possible.
+ /// Direct access to the internal object is likely to disappear as BamRecord interface matures.
+ ///
+ /// \returns const reference to underlying BamRecordImpl object
+ const BamRecordImpl& Impl(void) const;
+
+ /// \warning This method should be considered temporary and avoided as much as possible.
+ /// Direct access to the internal object is likely to disappear as BamRecord interface matures.
+ ///
+ /// \returns reference to underlying BamRecordImpl object
+ BamRecordImpl& Impl(void);
+
+ /// \}
+
+public:
+ /// \name Per-Record Data
+ /// \{
+ ///
+
+ /// Sets this record's ZMW hole number.
+ ///
+ /// \param[in] numPasses
+ /// \returns reference to this record
+ BamRecord& HoleNumber(const int32_t holeNumber);
+
+ /// Sets this record's local context flags
+ ///
+ /// \param[in] flags
+ /// \returns reference to this record
+ BamRecord& LocalContextFlags(const PacBio::BAM::LocalContextFlags flags);
+
+ /// Sets this record's "number of complete passes of the insert".
+ ///
+ /// \param[in] numPasses
+ /// \returns reference to this record
+ BamRecord& NumPasses(const int32_t numPasses);
+
+ /// Sets this record's expected read accuracy [0, 1000]
+ ///
+ /// \param[in] accuracy
+ /// \returns reference to this record
+ BamRecord& ReadAccuracy(const Accuracy& accuracy);
+
+ /// Sets this record's average signal-to-noise in each of A, C, G, and T
+ ///
+ /// \param[in] average signal-to-noise of A, C, G, and T (in this order)
+ /// \returns reference to this record
+ BamRecord& SignalToNoise(const std::vector<float>& snr);
+
+ /// Sets this scrap record's ScrapType
+ ///
+ /// \param[in] ScrapType of type VirtualRegionType
+ /// \returns reference to this record
+ BamRecord& ScrapType(const VirtualRegionType type);
+
+ /// Sets this scrap record's ScrapType
+ ///
+ /// \param[in] ScrapType as char
+ /// \returns reference to this record
+ BamRecord& ScrapType(const char type);
+
+ /// \}
+
+public:
+ /// \name Per-Base Data
+ /// \{
+
+ /// Sets this record's AltLabelQV values ("pv" tag).
+ ///
+ /// \param[in] altLabelQVs
+ /// \returns reference to this record
+ BamRecord& AltLabelQV(const QualityValues& altLabelQVs);
+
+ /// Sets this record's LabelQV values ("pq" tag).
+ ///
+ /// \param[in] labelQVs
+ /// \returns reference to this record
+ BamRecord& LabelQV(const QualityValues& labelQVs);
+
+ /// Sets this record's DeletionQV values ("dq" tag).
+ ///
+ /// \param[in] deletionQVs
+ /// \returns reference to this record
+ BamRecord& DeletionQV(const QualityValues& deletionQVs);
+
+ /// Sets this record's DeletionTag values ("dt" tag).
+ ///
+ /// \param[in] tags
+ /// \returns reference to this record
+ BamRecord& DeletionTag(const std::string& tags);
+
+ /// Sets this record's InsertionQV values ("iq" tag).
+ ///
+ /// \param[in] insertionQVs
+ /// \returns reference to this record
+ BamRecord& InsertionQV(const QualityValues& insertionQVs);
+
+ /// Sets this record's Pkmid values ("pa" tag).
+ ///
+ /// \param[in] photons
+ /// \returns reference to this record
+ BamRecord& Pkmid(const std::vector<float>& photons);
+
+ /// Sets this record's Pkmid values ("pa" tag).
+ ///
+ /// \param[in] encoded photons
+ /// \returns reference to this record
+ BamRecord& Pkmid(const std::vector<uint16_t>& encodedPhotons);
+
+ /// Sets this record's Pkmean values ("pm" tag).
+ ///
+ /// \param[in] photons
+ /// \returns reference to this record
+ BamRecord& Pkmean(const std::vector<float>& photons);
+
+ /// Sets this record's Pkmean values ("pm" tag).
+ ///
+ /// \param[in] encoded photons
+ /// \returns reference to this record
+ BamRecord& Pkmean(const std::vector<uint16_t>& encodedPhotons);
+
+ /// Sets this record's IPD values ("ip" tag).
+ ///
+ /// \param[in] frames
+ /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+ /// \returns reference to this record
+ BamRecord& IPD(const Frames& frames,
+ const FrameEncodingType encoding);
+
+ /// Sets this record's PreBaseFrames aka IPD values ("ip" tag).
+ ///
+ /// \param[in] frames
+ /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+ /// \returns reference to this record
+ BamRecord& PreBaseFrames(const Frames& frames,
+ const FrameEncodingType encoding);
+
+ /// Sets this record's PrePulseFrames values ("pd" tag).
+ ///
+ /// \param[in] frames
+ /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+ /// \returns reference to this record
+ BamRecord& PrePulseFrames(const Frames& frames,
+ const FrameEncodingType encoding);
+
+ /// Sets this record's PulseCallWidth values ("px" tag).
+ ///
+ /// \param[in] frames
+ /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+ /// \returns reference to this record
+ BamRecord& PulseCallWidth(const Frames& frames,
+ const FrameEncodingType encoding);
+
+ /// Sets this record's MergeQV values ("mq" tag).
+ ///
+ /// \param[in] mergeQVs
+ /// \returns reference to this record
+ BamRecord& MergeQV(const QualityValues& mergeQVs);
+
+ /// Sets this record's PulseMergeQV values ("pg" tag).
+ ///
+ /// \param[in] pulseMergeQVs
+ /// \returns reference to this record
+ BamRecord& PulseMergeQV(const QualityValues& pulseMergeQVs);
+
+ /// Sets this record's PulseWidth values ("pw" tag).
+ ///
+ /// \param[in] frames
+ /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+ /// \returns reference to this record
+ BamRecord& PulseWidth(const Frames& frames,
+ const FrameEncodingType encoding);
+
+ /// Sets this record's SubstitutionQV values ("sq" tag).
+ ///
+ /// \param[in] substitutionQVs
+ /// \returns reference to this record
+ BamRecord& SubstitutionQV(const QualityValues& substitutionQVs);
+
+ /// Sets this record's SubstitutionTag values ("st" tag).
+ ///
+ /// \param[in] tags
+ /// \returns reference to this record
+ BamRecord& SubstitutionTag(const std::string& tags);
+
+ /// Sets this record's AltLabelTag values ("at" tag).
+ ///
+ /// \param[in] tags
+ /// \returns reference to this record
+ BamRecord& AltLabelTag(const std::string& tags);
+
+ /// Sets this record's PulseCall values ("pc" tag).
+ ///
+ /// \param[in] tags
+ /// \returns reference to this record
+ BamRecord& PulseCall(const std::string& tags);
+
+ /// \}
+
+public:
+ BamRecord& QueryEnd(const PacBio::BAM::Position pos);
+ BamRecord& QueryStart(const PacBio::BAM::Position pos);
+
+ /// Resets cached aligned start/end.
+ ///
+ /// \note This method should not be needed in most client code. It exists
+ /// primarily as a hook for internal reading loops (queries, index build, etc.)
+ /// It's essentially a workaround and will likely be removed from the API as
+ /// soon as possible.
+ ///
+ void ResetCachedPositions(void) const;
+
+ /// Resets cached aligned start/end.
+ ///
+ /// \note This method should not be needed in most client code. It exists
+ /// primarily as a hook for internal reading loops (queries, index build, etc.)
+ /// It's essentially a workaround and will likely be removed from the API as
+ /// soon as possible.
+ ///
+ void ResetCachedPositions(void);
+
+ void UpdateName(void);
+
+ static std::vector<uint16_t> EncodePhotons(const std::vector<float>& data);
+
+ BamRecord& ReadGroup(const ReadGroupInfo& rg);
+ BamRecord& ReadGroupId(const std::string& id);
+
+// BamRecord& ReferenceStart(const PacBio::BAM::Position pos);
+
+public:
+ /// \name Clipping & Mapping
+ /// \{
+
+ /// Creates a copied record from input, with clipping applied
+ static BamRecord Clipped(const BamRecord& input,
+ const ClipType clipType,
+ const PacBio::BAM::Position start,
+ const PacBio::BAM::Position end);
+
+ /// Creates a copied record from input, with mapping applied
+ static BamRecord Mapped(const BamRecord& input,
+ const int32_t referenceId,
+ const Position refStart,
+ const Strand strand,
+ const Cigar& cigar,
+ const uint8_t mappingQuality);
+
+ /// Applies clipping to this record
+ BamRecord& Clip(const ClipType clipType,
+ const PacBio::BAM::Position start,
+ const PacBio::BAM::Position end);
+
+ /// Creates a copied record from this one, with clipping applied
+ BamRecord Clipped(const ClipType clipType,
+ const PacBio::BAM::Position start,
+ const PacBio::BAM::Position end) const;
+
+ /// Applies mapping to this record
+ BamRecord& Map(const int32_t referenceId,
+ const Position refStart,
+ const Strand strand,
+ const Cigar& cigar,
+ const uint8_t mappingQuality);
+
+ /// Creates a copied record from this one, with mapping applied
+ BamRecord Mapped(const int32_t referenceId,
+ const Position refStart,
+ const Strand strand,
+ const Cigar& cigar,
+ const uint8_t mappingQuality) const;
+
+ /// \}
+private:
+ BamRecordImpl impl_;
+
+public:
+ // public & mutable so that queries can directly set the header info,
+ // even on a record that is const from client code's perspective
+ mutable BamHeader header_;
+
+private:
+ // cached positions (mutable to allow lazy-calc in const methods)
+ mutable Position alignedStart_;
+ mutable Position alignedEnd_;
+
+private:
+ std::vector<float> FetchPhotons(const std::string& tagName,
+ const Orientation orientation) const;
+ std::string FetchBasesRaw(const std::string& tagName) const;
+
+ std::string FetchBases(const std::string& tagName,
+ const Orientation orientation) const;
+
+ std::string FetchBases(const std::string& tagName,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips) const;
+
+ Frames FetchFramesRaw(const std::string& tagName) const;
+
+ Frames FetchFrames(const std::string& tagName,
+ const Orientation orientation) const;
+
+ Frames FetchFrames(const std::string& tagName,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips) const;
+
+ QualityValues FetchQualitiesRaw(const std::string& tagName) const;
+
+ QualityValues FetchQualities(const std::string& tagName,
+ const Orientation orientation) const;
+
+ QualityValues FetchQualities(const std::string& tagName,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips) const;
+
+private:
+ // marked const to allow calling from const methods
+ // but updates our mutable cached values
+ void CalculateAlignedPositions(void) const;
+
+ friend class internal::BamRecordMemory;
+};
+
+inline
+BamRecord BamRecord::Clipped(const BamRecord& input,
+ const ClipType clipType,
+ const PacBio::BAM::Position start,
+ const PacBio::BAM::Position end)
+{
+ return input.Clipped(clipType, start, end);
+}
+
+inline
+BamRecord BamRecord::Clipped(const ClipType clipType,
+ const PacBio::BAM::Position start,
+ const PacBio::BAM::Position end) const
+{
+ BamRecord result(*this);
+ result.Clip(clipType, start, end);
+ return result;
+}
+
+inline
+BamRecord BamRecord::Mapped(const BamRecord& input,
+ const int32_t referenceId,
+ const Position refStart,
+ const Strand strand,
+ const Cigar& cigar,
+ const uint8_t mappingQuality)
+{
+ return input.Mapped(referenceId, refStart, strand, cigar, mappingQuality);
+}
+
+inline
+BamRecord BamRecord::Mapped(const int32_t referenceId,
+ const Position refStart,
+ const Strand strand,
+ const Cigar& cigar,
+ const uint8_t mappingQuality) const
+{
+ BamRecord result(*this);
+ result.Map(referenceId, refStart, strand, cigar, mappingQuality);
+ return result;
+}
+
+class PBBAM_EXPORT BamRecordView
+{
+public:
+ BamRecordView(const BamRecord& record,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips)
+ : record_(record)
+ , orientation_(orientation)
+ , aligned_(aligned)
+ , exciseSoftClips_(exciseSoftClips)
+ { }
+
+public:
+ QualityValues AltLabelQVs(void) const
+ { return record_.AltLabelQV(orientation_); }
+
+ std::string AltLabelTags(void) const
+ { return record_.AltLabelTag(orientation_); }
+
+ QualityValues DeletionQVs(void) const
+ { return record_.DeletionQV(orientation_, aligned_, exciseSoftClips_); }
+
+ std::string DeletionTags(void) const
+ { return record_.DeletionTag(orientation_, aligned_, exciseSoftClips_); }
+
+ QualityValues InsertionQVs(void) const
+ { return record_.InsertionQV(orientation_, aligned_, exciseSoftClips_); }
+
+ Frames IPD(void) const
+ { return record_.IPD(orientation_, aligned_, exciseSoftClips_); }
+
+ Frames PrebaseFrames(void) const
+ { return record_.IPD(orientation_, aligned_, exciseSoftClips_); }
+
+ QualityValues LabelQVs(void) const
+ { return record_.LabelQV(orientation_); }
+
+ QualityValues MergeQVs(void) const
+ { return record_.MergeQV(orientation_, aligned_, exciseSoftClips_); }
+
+ QualityValues PulseMergeQVs(void) const
+ { return record_.PulseMergeQV(orientation_); }
+
+ std::vector<float> Pkmean(void) const
+ { return record_.Pkmean(orientation_); }
+
+ std::vector<float> Pkmid(void) const
+ { return record_.Pkmid(orientation_); }
+
+ Frames PrePulseFrames(void) const
+ { return record_.PrePulseFrames(orientation_); }
+
+ std::string PulseCalls(void) const
+ { return record_.PulseCall(orientation_); }
+
+ Frames PulseCallWidth(void) const
+ { return record_.PulseCallWidth(orientation_); }
+
+ Frames PulseWidths(void) const
+ { return record_.PulseWidth(orientation_, aligned_, exciseSoftClips_); }
+
+ QualityValues Qualities(void) const
+ { return record_.Qualities(orientation_, aligned_, exciseSoftClips_); }
+
+ std::string Sequence(void) const
+ { return record_.Sequence(orientation_, aligned_, exciseSoftClips_); }
+
+ QualityValues SubstitutionQVs(void) const
+ { return record_.SubstitutionQV(orientation_, aligned_, exciseSoftClips_); }
+
+ std::string SubstitutionTags(void) const
+ { return record_.SubstitutionTag(orientation_, aligned_, exciseSoftClips_); }
+
+private:
+ const BamRecord& record_;
+ Orientation orientation_;
+ bool aligned_;
+ bool exciseSoftClips_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORD_H
diff --git a/include/pbbam/BamRecordBuilder.h b/include/pbbam/BamRecordBuilder.h
new file mode 100644
index 0000000..81002da
--- /dev/null
+++ b/include/pbbam/BamRecordBuilder.h
@@ -0,0 +1,268 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORDBUILDER_H
+#define BAMRECORDBUILDER_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamHeader.h"
+#include "pbbam/Config.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT BamImplBuilder
+{
+
+};
+
+
+class PBBAM_EXPORT BamRecordBuilder
+{
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ BamRecordBuilder(void);
+ explicit BamRecordBuilder(const BamHeader& header);
+ BamRecordBuilder(const BamRecord& prototype);
+ BamRecordBuilder(const BamRecordBuilder& other);
+ BamRecordBuilder(BamRecordBuilder&& other);
+ BamRecordBuilder& operator=(const BamRecordBuilder& other);
+ BamRecordBuilder& operator=(BamRecordBuilder&& other);
+ ~BamRecordBuilder(void);
+
+ /// \}
+
+public:
+ /// \name Record-Building
+ /// \{
+
+ /// Builds a BamRecord from current builder attributes
+ ///
+ /// \returns BamRecord object
+ BamRecord Build(void) const;
+
+ /// Replaces an existing BamRecord's data with current builder attributes
+ ///
+ /// \param[out] record resulting record
+ /// \returns true if successful
+ bool BuildInPlace(BamRecord& record) const;
+
+ /// Resets builder attributes to default values
+ void Reset(void);
+
+ /// Resets builder attributes with existing BamRecord data
+ ///
+ /// \param[in] prototype
+ void Reset(const BamRecord& prototype);
+
+ /// Resets builder attributes with existing BamRecord data
+ ///
+ /// \param[in] prototype
+ void Reset(BamRecord&& prototype);
+
+ /// \}
+
+public:
+
+ /// \name Core Attribute Setup
+ /// \{
+
+ /// Sets the record's (BAI) index bin ID.
+ ///
+ /// \param[in] bin BAI index bin ID.
+ /// \returns reference to this builder
+ BamRecordBuilder& Bin(const uint32_t bin);
+
+ /// Sets this record's alignment flag, using a raw integer.
+ ///
+ /// \param[in] flag raw alignment flag
+ /// \returns reference to this record
+ BamRecordBuilder& Flag(const uint32_t flag);
+
+ /// Sets this record's insert size.
+ ///
+ /// \param[in] iSize insert size
+ /// \returns reference to this record
+ BamRecordBuilder& InsertSize(const int32_t iSize);
+
+ /// Sets this record's map quality.
+ ///
+ /// \param[in] mapQual mapping quality - value of 255 indicates "unknown"
+ /// \returns reference to this record
+ BamRecordBuilder& MapQuality(const uint8_t mapQual);
+
+ /// Sets this record's mate's mapped position.
+ ///
+ /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ BamRecordBuilder& MatePosition(const int32_t pos);
+
+ /// Sets this record's mate's mapped reference ID
+ ///
+ /// \param[in] id reference ID. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ BamRecordBuilder& MateReferenceId(const int32_t id);
+
+ /// Sets this record's mapped position.
+ ///
+ /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ BamRecordBuilder& Position(const int32_t pos);
+
+ /// Sets this record's mapped reference ID
+ ///
+ /// \param[in] id reference ID. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ BamRecordBuilder& ReferenceId(const int32_t id);
+
+ /// \}
+
+public:
+ /// \name Alignment Flag Setup
+ /// \{
+
+ /// Sets whether this record is a PCR/optical duplicate
+ BamRecordBuilder& SetDuplicate(bool ok);
+
+ /// Sets whether this record failed quality controls
+ BamRecordBuilder& SetFailedQC(bool ok);
+
+ /// Sets whether this record is the first mate of a pair.
+ BamRecordBuilder& SetFirstMate(bool ok);
+
+ /// Sets whether this record was aligned.
+ BamRecordBuilder& SetMapped(bool ok);
+
+ /// Sets whether this record's mate was aligned.
+ BamRecordBuilder& SetMateMapped(bool ok);
+
+ /// Sets whether this record's mate mapped to reverse strand.
+ BamRecordBuilder& SetMateReverseStrand(bool ok);
+
+ /// Sets whether this record came from paired-end sequencing.
+ BamRecordBuilder& SetPaired(bool ok);
+
+ /// Sets whether this record is a read's primary alignment.
+ BamRecordBuilder& SetPrimaryAlignment(bool ok);
+
+ /// Sets whether this record & its mate were properly mapped, per the aligner.
+ BamRecordBuilder& SetProperPair(bool ok);
+
+ /// Sets whether this record mapped to reverse strand.
+ BamRecordBuilder& SetReverseStrand(bool ok);
+
+ /// Sets whether this record is the second mate of a pair.
+ BamRecordBuilder& SetSecondMate(bool ok);
+
+ /// Sets whether this record is a supplementary alignment.
+ BamRecordBuilder& SetSupplementaryAlignment(bool ok);
+
+ /// \}
+
+public:
+ /// \name Variable-Length Data Setup
+ /// \{
+
+ BamRecordBuilder& Name(const std::string& name);
+ BamRecordBuilder& Name(std::string&& name);
+
+ BamRecordBuilder& Sequence(const std::string& sequence);
+ BamRecordBuilder& Sequence(std::string&& sequence);
+
+ BamRecordBuilder& Qualities(const std::string& qualities);
+ BamRecordBuilder& Qualities(std::string&& qualities);
+
+ BamRecordBuilder& Cigar(const PacBio::BAM::Cigar& cigar);
+ BamRecordBuilder& Cigar(PacBio::BAM::Cigar&& cigar);
+
+ BamRecordBuilder& Tags(const TagCollection& tags);
+ BamRecordBuilder& Tags(TagCollection&& tags);
+
+private:
+ BamHeader header_;
+
+ bam1_core_t core_;
+ std::string name_;
+ std::string sequence_;
+ std::string qualities_;
+ PacBio::BAM::Cigar cigar_;
+ TagCollection tags_;
+};
+
+inline BamRecordBuilder& BamRecordBuilder::Bin(const uint32_t bin)
+{ core_.bin = bin; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Flag(const uint32_t flag)
+{ core_.flag = flag; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::InsertSize(const int32_t iSize)
+{ core_.isize = iSize; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::MapQuality(const uint8_t mapQual)
+{ core_.qual = mapQual; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::MatePosition(const int32_t pos)
+{ core_.mpos = pos; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::MateReferenceId(const int32_t id)
+{ core_.mtid = id; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Position(const int32_t pos)
+{ core_.pos = pos; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Qualities(const std::string& qualities)
+{ qualities_ = qualities; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Qualities(std::string&& qualities)
+{ qualities_ = std::move(qualities); return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::ReferenceId(const int32_t id)
+{ core_.tid = id; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Tags(const TagCollection& tags)
+{ tags_ = tags; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Tags(TagCollection&& tags)
+{ tags_ = std::move(tags); return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORDBUILDER_H
diff --git a/include/pbbam/BamRecordImpl.h b/include/pbbam/BamRecordImpl.h
new file mode 100644
index 0000000..c42ef0a
--- /dev/null
+++ b/include/pbbam/BamRecordImpl.h
@@ -0,0 +1,622 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORDIMPL_H
+#define BAMRECORDIMPL_H
+
+#include "htslib/sam.h"
+#include "pbbam/Cigar.h"
+#include "pbbam/Config.h"
+#include "pbbam/Position.h"
+#include "pbbam/QualityValues.h"
+#include "pbbam/TagCollection.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamRecordMemory; }
+
+/// \brief The BamRecordImpl class holds all data necessary for creating,
+/// querying or editing a valid, generic BAM record.
+///
+/// For PacBio-specific extensions and convenience methods, see BamRecord.
+///
+class PBBAM_EXPORT BamRecordImpl
+{
+public:
+
+ /// These flags describe the alignment status of the record.
+ enum AlignmentFlag
+ {
+ PAIRED = 0x0001 ///< Record comes from paired-end sequencing
+ , PROPER_PAIR = 0x0002 ///< Each mate of a pair was properly aligned ("proper" as determined by aligner)
+ , UNMAPPED = 0x0004 ///< Record was not mapped by aligner
+ , MATE_UNMAPPED = 0x0008 ///< Record's mate was not mapped by aligner
+ , REVERSE_STRAND = 0x0010 ///< Record was aligned to reverse strand (Sequence() is reverse-complemented)
+ , MATE_REVERSE_STRAND = 0x0020 ///< Record's mate was aligned to reverse strand (mate's Sequence() is reverse-complemented)
+ , MATE_1 = 0x0040 ///< Record is first mate of pair
+ , MATE_2 = 0x0080 ///< Record is second mate of pair
+ , SECONDARY = 0x0100 ///< Record is a secondary alignment
+ , FAILED_QC = 0x0200 ///< Record failed quality controls
+ , DUPLICATE = 0x0400 ///< Record is a PCR/optical duplicate
+ , SUPPLEMENTARY = 0x0800 ///< Record is a supplementary alignment
+ };
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ BamRecordImpl(void);
+ BamRecordImpl(const BamRecordImpl& other);
+ BamRecordImpl(BamRecordImpl&& other);
+ BamRecordImpl& operator=(const BamRecordImpl& other);
+ BamRecordImpl& operator=(BamRecordImpl&& other);
+ virtual ~BamRecordImpl(void);
+
+ /// \}
+
+public:
+
+ /** @name Core Data
+ */
+ ///@{
+
+ /// \returns this record's assigned (BAI) index bin ID.
+ inline uint32_t Bin(void) const;
+
+ /// \returns this record's alignment flag, in raw integer form.
+ inline uint32_t Flag(void) const;
+
+ /// \returns this record's insert size
+ inline int32_t InsertSize(void) const;
+
+ /// \returns this record's mapping quality. A value of 255 indicates "unknown"
+ inline uint8_t MapQuality(void) const;
+
+ /// \returns this record's mate's mapped position, or -1 if unmapped
+ inline PacBio::BAM::Position MatePosition(void) const;
+
+ /// \returns this record's mate's mapped reference ID, or -1 if unmapped
+ inline int32_t MateReferenceId(void) const;
+
+ /// \returns this record's mapped position, or -1 if unmapped
+ inline PacBio::BAM::Position Position(void) const;
+
+ /// \returns this record's mate's mapped reference ID, or -1 if unmapped
+ inline int32_t ReferenceId(void) const;
+
+ /// Sets the record's (BAI) index bin ID.
+ ///
+ /// \param[in] bin BAI index bin ID.
+ /// \returns reference to this record
+ inline BamRecordImpl& Bin(uint32_t bin);
+
+ /// Sets this record's alignment flag, using a raw integer.
+ ///
+ /// \param[in] flag raw alignment flag
+ /// \returns reference to this record
+ inline BamRecordImpl& Flag(uint32_t flag);
+
+ /// Sets this record's insert size.
+ ///
+ /// \param[in] iSize insert size
+ /// \returns reference to this record
+ inline BamRecordImpl& InsertSize(int32_t iSize);
+
+ /// Sets this record's map quality.
+ ///
+ /// \param[in] mapQual mapping quality - value of 255 indicates "unknown"
+ /// \returns reference to this record
+ inline BamRecordImpl& MapQuality(uint8_t mapQual);
+
+ /// Sets this record's mate's mapped position.
+ ///
+ /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ inline BamRecordImpl& MatePosition(PacBio::BAM::Position pos);
+
+ /// Sets this record's mate's mapped reference ID
+ ///
+ /// \param[in] id reference ID. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ inline BamRecordImpl& MateReferenceId(int32_t id);
+
+ /// Sets this record's mapped position.
+ ///
+ /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ inline BamRecordImpl& Position(PacBio::BAM::Position pos);
+
+ /// Sets this record's mapped reference ID
+ ///
+ /// \param[in] id reference ID. A value of -1 indicates unmapped.
+ /// \returns reference to this record
+ inline BamRecordImpl& ReferenceId(int32_t id);
+
+ ///@}
+
+public:
+ /** @name Alignment Flags
+ */
+ ///@{
+
+ /// \returns true if this record is a PCR/optical duplicate
+ inline bool IsDuplicate(void) const;
+
+ /// \returns true if this record failed quality controls
+ inline bool IsFailedQC(void) const;
+
+ /// \returns true if this record is the first mate of a pair
+ inline bool IsFirstMate(void) const;
+
+ /// \returns true if this record was mapped by aligner
+ inline bool IsMapped(void) const;
+
+ /// \returns true if this record's mate was mapped by aligner
+ inline bool IsMateMapped(void) const;
+
+ /// \returns true if this record's mate was mapped to the reverse strand
+ inline bool IsMateReverseStrand(void) const;
+
+ /// \returns true if this record comes from paired-end sequencing
+ inline bool IsPaired(void) const;
+
+ /// \returns true if this record is a read's primary alignment
+ inline bool IsPrimaryAlignment(void) const;
+
+ /// \returns true if this record & its mate were properly aligned
+ inline bool IsProperPair(void) const;
+
+ /// \returns true if this record was mapped to the reverse strand
+ inline bool IsReverseStrand(void) const;
+
+ /// \returns true if this record is the second mate of a pair
+ inline bool IsSecondMate(void) const;
+
+ /// \returns true if this record is a supplementary alignment
+ inline bool IsSupplementaryAlignment(void) const;
+
+ /// Sets whether this record is a PCR/optical duplicate
+ inline BamRecordImpl& SetDuplicate(bool ok);
+
+ /// Sets whether this record failed quality controls
+ inline BamRecordImpl& SetFailedQC(bool ok);
+
+ /// Sets whether this record is the first mate of a pair.
+ inline BamRecordImpl& SetFirstMate(bool ok);
+
+ /// Sets whether this record was aligned.
+ inline BamRecordImpl& SetMapped(bool ok);
+
+ /// Sets whether this record's mate was aligned.
+ inline BamRecordImpl& SetMateMapped(bool ok);
+
+ /// Sets whether this record's mate mapped to reverse strand.
+ inline BamRecordImpl& SetMateReverseStrand(bool ok);
+
+ /// Sets whether this record came from paired-end sequencing.
+ inline BamRecordImpl& SetPaired(bool ok);
+
+ /// Sets whether this record is a read's primary alignment.
+ inline BamRecordImpl& SetPrimaryAlignment(bool ok);
+
+ /// Sets whether this record & its mate were properly mapped, per the aligner.
+ inline BamRecordImpl& SetProperPair(bool ok);
+
+ /// Sets whether this record mapped to reverse strand.
+ inline BamRecordImpl& SetReverseStrand(bool ok);
+
+ /// Sets whether this record is the second mate of a pair.
+ inline BamRecordImpl& SetSecondMate(bool ok);
+
+ /// Sets whether this record is a supplementary alignment.
+ inline BamRecordImpl& SetSupplementaryAlignment(bool ok);
+
+ ///@}
+
+public:
+ /** @name Variable-length Data (sequence, qualities, etc.)
+ */
+ ///@{
+
+ /// \returns the record's CIGAR data as a Cigar object
+ Cigar CigarData(void) const;
+
+ /// Sets the record's CIGAR data using a Cigar object
+ ///
+ /// \param[in] cigar PacBio::BAM::Cigar object
+ ///
+ /// \returns reference to this record
+ BamRecordImpl& CigarData(const Cigar& cigar);
+
+ /// Sets the record's CIGAR data using a CIGAR-formatted string.
+ ///
+ /// \param[in] cigarString CIGAR-formatted string
+ ///
+ /// \returns reference to this record
+ BamRecordImpl& CigarData(const std::string& cigarString);
+
+ // TODO: CIGAR iterator - Cigar only or here as well ??
+
+ /// \returns the record's query name
+ std::string Name(void) const;
+
+ /// Sets the record's "query name".
+ ///
+ /// \param name new name
+ ///
+ /// \returns reference to this record
+ BamRecordImpl& Name(const std::string& name);
+
+ /// \returns the record's quality values (phred-style ASCII)
+ ///
+ /// \note Usually Qualities().size() == Sequence.size(). However, in
+ /// some data sets, the quality values are not provided. In that
+ /// case, this method will return an empty container.
+ QualityValues Qualities(void) const;
+
+ /// \returns the record's DNA sequence.
+ std::string Sequence(void) const;
+
+ /// \brief Sets the record's DNA sequence and quality values
+ ///
+ /// This is an overloaded function. Sets the DNA sequence and quality values,
+ /// using the length of \p sequence.
+ ///
+ /// \note When using this overload (and \p qualities is non-empty), the lengths
+ /// of \p sequence and \p qualities \b must be equal.
+ ///
+ /// \todo How to handle mismatched lenths?
+ ///
+ /// \param[in] sequence std::string containing DNA sequence
+ /// \param[in] qualities std::string containing ASCII quality values
+ ///
+ /// \returns reference to this record.
+ ///
+ /// \sa SetSequenceAndQualities(const char* sequence, const size_t sequenceLength, const char* qualities)
+ ///
+ BamRecordImpl& SetSequenceAndQualities(const std::string& sequence,
+ const std::string& qualities = std::string());
+
+ /// \brief Sets the record's DNA sequence and quality values.
+ ///
+ /// The \p sequence must consist of IUPAC nucleotide codes {=ACMGRSVTWYHKDBN}.
+ /// The \p qualities, if not empty, must consist of 'phred'-style ASCII quality
+ /// values. \p qualities may be an empty string or NULL pointer in cases where
+ /// there are no such data available.
+ ///
+ /// \param[in] sequence C-string containing DNA sequence
+ /// \param[in] sequenceLength length of DNA sequence
+ /// \param[in] qualities C-string containing 'phred-style' ASCII quality values
+ ///
+ /// \note \p sequence does \b NOT have to be NULL-terminated. Length is explicitly
+ /// determined by the value of \p sequenceLength provided.
+ ///
+ /// \returns reference to this record.
+ ///
+ BamRecordImpl& SetSequenceAndQualities(const char* sequence,
+ const size_t sequenceLength,
+ const char* qualities = 0);
+
+ /// \brief Sets the record's DNA sequence and quality values.
+ ///
+ /// The \p encodedSequence should be preencoded/packed into the BAM binary format.
+ /// The \p qualities, if not empty, must consist of 'phred'-style ASCII quality values.
+ /// \p qualities may be an empty string or NULL pointer in cases where there are no
+ /// such data available.
+ ///
+ /// \param[in] encodedSequence C-string containing BAM-format-encoded DNA sequence
+ /// \param[in] rawSequenceLength length of DNA sequence (not the encoded length)
+ /// \param[in] qualities C-string containing 'phred-style' ASCII quality values
+ ///
+ /// \note \p encodedSequence does \b NOT have to be NULL-terminated. Length is explicitly
+ /// determined by the value of \p sequenceLength provided.
+ ///
+ /// \returns reference to this record.
+ ///
+ /// \sa SetSequenceAndQualities(const char* sequence, const size_t sequenceLength, const char* qualities)
+ ///
+ BamRecordImpl& SetPreencodedSequenceAndQualities(const char* encodedSequence,
+ const size_t rawSequenceLength,
+ const char* qualities = 0);
+
+public:
+ /** @name Tag Data
+ */
+ ///@{
+
+ /// \returns record's full tag data as a TagCollection object
+ TagCollection Tags(void) const;
+
+ /// Sets the record's full tag data via a TagCollection object
+ BamRecordImpl& Tags(const TagCollection& tags);
+
+ /// Adds a new tag to this record.
+ ///
+ /// \param[in] tagName 2-character tag name.
+ /// \param[in] value Tag object that describes the type & value of data to be added
+ ///
+ /// \note Any value that can be used to implicitly construct a Tag is valid.
+ /// \code
+ /// string s;
+ /// vector<uint32_t> v;
+ /// record.AddTag("XX", s); // will add a string-type tag
+ /// record.AddTag("YY", v); // will add a uint32-array-type tag
+ /// \endcode
+ ///
+ /// \returns true if tag was successfully added.
+ bool AddTag(const std::string& tagName, const Tag& value);
+
+ /// Edits an existing tag on this record.
+ ///
+ /// \param[in] tagName 2-character tag name. Name must be present (see HasTag)
+ /// \param[in] newValue Tag object that describes the type & value of new data to be added
+ ///
+ /// \note Any value that can be used to implicitly construct a Tag is valid.
+ /// \code
+ /// string s;
+ /// vector<uint32_t> v;
+ /// record.EditTag("XX", s); // will overwrite tag XX with a string-type Tag
+ /// record.EditTag("YY", v); // will overwrite tag YY with a uint32-array-type Tag
+ /// \endcode
+ ///
+ /// \returns true if tag was successfully edited.
+ bool EditTag(const std::string& tagName, const Tag& newValue);
+
+ /// \returns true if a tag with this name is present in this record.
+ bool HasTag(const std::string& tagName) const;
+
+ /// Removes an existing tag from this record.
+ ///
+ /// \param[in] tagName 2-character tag name.
+ ///
+ /// \returns true if tag was actaully removed (i.e. false if tagName previously unknown)
+ /// \sa HasTag
+ bool RemoveTag(const std::string& tagName);
+
+ /// Fetches a tag from this record.
+ ///
+ /// \param[in] tagName 2-character tag name.
+ ///
+ /// \returns Tag object for the requested name. If name is unknown, a default constructed
+ /// Tag is returned (Tag::IsNull() is true).
+ Tag TagValue(const std::string& tagName) const;
+
+ // change above to Tag();
+
+// template<typename T>
+// T TagValue(const std::string& tagName) const;
+
+
+ ///@}
+
+private:
+ // returns a BamRecordImpl object, with a deep copy of @rawData contents
+ static BamRecordImpl FromRawData(const PBBAM_SHARED_PTR<bam1_t>& rawData);
+
+ // internal memory setup/expand methods
+ void InitializeData(void);
+ void MaybeReallocData(void);
+
+ // core seq/qual logic shared by the public API
+ BamRecordImpl& SetSequenceAndQualitiesInternal(const char* sequence,
+ const size_t sequenceLength,
+ const char* qualities,
+ bool isPreencoded);
+
+private:
+
+ // data members
+ PBBAM_SHARED_PTR<bam1_t> d_;
+
+ // friends
+ friend class internal::BamRecordMemory;
+};
+
+inline uint32_t BamRecordImpl::Bin(void) const
+{ return d_->core.bin; }
+
+inline BamRecordImpl& BamRecordImpl::Bin(uint32_t bin)
+{ d_->core.bin = bin; return *this; }
+
+inline uint32_t BamRecordImpl::Flag(void) const
+{ return d_->core.flag; }
+
+inline BamRecordImpl& BamRecordImpl::Flag(uint32_t flag)
+{ d_->core.flag = flag; return *this; }
+
+inline int32_t BamRecordImpl::InsertSize(void) const
+{ return d_->core.isize; }
+
+inline BamRecordImpl& BamRecordImpl::InsertSize(int32_t iSize)
+{ d_->core.isize = iSize; return *this; }
+
+inline uint8_t BamRecordImpl::MapQuality(void) const
+{ return d_->core.qual; }
+
+inline BamRecordImpl& BamRecordImpl::MapQuality(uint8_t mapQual)
+{ d_->core.qual = mapQual; return *this; }
+
+inline PacBio::BAM::Position BamRecordImpl::MatePosition(void) const
+{ return d_->core.mpos; }
+
+inline BamRecordImpl& BamRecordImpl::MatePosition(PacBio::BAM::Position pos)
+{ d_->core.mpos = pos; return *this; }
+
+inline int32_t BamRecordImpl::MateReferenceId(void) const
+{ return d_->core.mtid; }
+
+inline BamRecordImpl& BamRecordImpl::MateReferenceId(int32_t id)
+{ d_->core.mtid = id; return *this; }
+
+inline PacBio::BAM::Position BamRecordImpl::Position(void) const
+{ return d_->core.pos; }
+
+inline BamRecordImpl& BamRecordImpl::Position(PacBio::BAM::Position pos)
+{ d_->core.pos = pos; return *this; }
+
+inline int32_t BamRecordImpl::ReferenceId(void) const
+{ return d_->core.tid; }
+
+inline BamRecordImpl& BamRecordImpl::ReferenceId(int32_t id)
+{ d_->core.tid = id; return *this; }
+
+inline bool BamRecordImpl::IsDuplicate(void) const
+{ return (d_->core.flag & BamRecordImpl::DUPLICATE) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetDuplicate(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::DUPLICATE;
+ else d_->core.flag &= ~BamRecordImpl::DUPLICATE;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsFailedQC(void) const
+{ return (d_->core.flag & BamRecordImpl::FAILED_QC) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetFailedQC(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::FAILED_QC;
+ else d_->core.flag &= ~BamRecordImpl::FAILED_QC;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsFirstMate(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_1) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetFirstMate(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::MATE_1;
+ else d_->core.flag &= ~BamRecordImpl::MATE_1;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsMapped(void) const
+{ return (d_->core.flag & BamRecordImpl::UNMAPPED) == 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetMapped(bool ok)
+{
+ if (ok) d_->core.flag &= ~BamRecordImpl::UNMAPPED;
+ else d_->core.flag |= BamRecordImpl::UNMAPPED;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsMateMapped(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_UNMAPPED) == 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetMateMapped(bool ok)
+{
+ if (ok) d_->core.flag &= ~BamRecordImpl::MATE_UNMAPPED;
+ else d_->core.flag |= BamRecordImpl::MATE_UNMAPPED;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsMateReverseStrand(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_REVERSE_STRAND) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetMateReverseStrand(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::MATE_REVERSE_STRAND;
+ else d_->core.flag &= ~BamRecordImpl::MATE_REVERSE_STRAND;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsPaired(void) const
+{ return (d_->core.flag & BamRecordImpl::PAIRED) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetPaired(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::PAIRED;
+ else d_->core.flag &= ~BamRecordImpl::PAIRED;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsPrimaryAlignment(void) const
+{ return (d_->core.flag & BamRecordImpl::SECONDARY) == 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetPrimaryAlignment(bool ok)
+{
+ if (ok) d_->core.flag &= ~BamRecordImpl::SECONDARY;
+ else d_->core.flag |= BamRecordImpl::SECONDARY;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsProperPair(void) const
+{ return (d_->core.flag & BamRecordImpl::PROPER_PAIR) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetProperPair(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::PROPER_PAIR;
+ else d_->core.flag &= ~BamRecordImpl::PROPER_PAIR;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsReverseStrand(void) const
+{ return (d_->core.flag & BamRecordImpl::REVERSE_STRAND) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetReverseStrand(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::REVERSE_STRAND;
+ else d_->core.flag &= ~BamRecordImpl::REVERSE_STRAND;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsSecondMate(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_2) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetSecondMate(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::MATE_2;
+ else d_->core.flag &= ~BamRecordImpl::MATE_2;
+ return *this;
+}
+
+inline bool BamRecordImpl::IsSupplementaryAlignment(void) const
+{ return (d_->core.flag & BamRecordImpl::SUPPLEMENTARY) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetSupplementaryAlignment(bool ok)
+{
+ if (ok) d_->core.flag |= BamRecordImpl::SUPPLEMENTARY;
+ else d_->core.flag &= ~BamRecordImpl::SUPPLEMENTARY;
+ return *this;
+}
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORDIMPL_H
diff --git a/include/pbbam/BamTagCodec.h b/include/pbbam/BamTagCodec.h
new file mode 100644
index 0000000..5aad239
--- /dev/null
+++ b/include/pbbam/BamTagCodec.h
@@ -0,0 +1,75 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMTAGCODEC_H
+#define BAMTAGCODEC_H
+
+#include "pbbam/Config.h"
+#include "pbbam/TagCollection.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT BamTagCodec
+{
+
+// high-level, operate on a full collection
+public:
+ static TagCollection Decode(const std::vector<uint8_t>& data);
+ static std::vector<uint8_t> Encode(const PacBio::BAM::TagCollection& tags);
+
+// per-tag methods
+public:
+
+ // returns the SAM/BAM single char code for tag type
+ static uint8_t TagTypeCode(const PacBio::BAM::Tag& tag);
+
+ // returns the tag value's raw data in bytes
+ // NOTE: does *NOT* encode name & tag type. It does however,
+ // include the element type of an array tag
+ static std::vector<uint8_t> ToRawData(const PacBio::BAM::Tag& tag);
+
+ // TODO: make this hidden a bit more, maybe this whole class in fact
+ // rawData should be the result of sam.h:bam_aux_get(...)
+ static PacBio::BAM::Tag FromRawData(uint8_t* rawData);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMTAGCODEC_H
diff --git a/include/pbbam/BamWriter.h b/include/pbbam/BamWriter.h
new file mode 100644
index 0000000..e66df0a
--- /dev/null
+++ b/include/pbbam/BamWriter.h
@@ -0,0 +1,150 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMWRITER_H
+#define BAMWRITER_H
+
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include <htslib/sam.h>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+namespace internal { class BamWriterPrivate; }
+
+class PBBAM_EXPORT BamWriter
+{
+public:
+ /// This enum allows you to control the compression level of the output BAM file.
+ ///
+ /// Values are equivalent to zlib compression levels. See its documentation for more details:
+ /// http://www.zlib.net/manual.html
+ enum CompressionLevel
+ {
+ CompressionLevel_0 = 0
+ , CompressionLevel_1 = 1
+ , CompressionLevel_2 = 2
+ , CompressionLevel_3 = 3
+ , CompressionLevel_4 = 4
+ , CompressionLevel_5 = 5
+ , CompressionLevel_6 = 6
+ , CompressionLevel_7 = 7
+ , CompressionLevel_8 = 8
+ , CompressionLevel_9 = 9
+
+ , DefaultCompression = -1
+ , NoCompression = CompressionLevel_0
+ , FastCompression = CompressionLevel_1
+ , BestCompression = CompressionLevel_9
+ };
+
+public:
+
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// Opens a BAM file for writing & writes the header information.
+ ///
+ /// The error status will be set if either operation fails.
+ ///
+ /// \note Set \p filename to "-" for stdout.
+ ///
+ /// \param[in] filename path to output BAM file
+ /// \param[in] header BamHeader object
+ /// \param[in] compressionLevel zlib compression level
+ /// \param[in] numThreads number of threads for compression.
+ /// If set to 0, BamWriter will attempt to determine a reasonable estimate.
+ /// If set to 1, this will force single-threaded execution.
+ /// No checks are made against an upper limit.
+ BamWriter(const std::string& filename,
+ const BamHeader& header,
+ const BamWriter::CompressionLevel compressionLevel = BamWriter::DefaultCompression,
+ const size_t numThreads = 4);
+
+ /// Fully flushes all buffered data & closes file.
+ ~BamWriter(void);
+
+ /// \}
+
+public:
+
+ /// \name Data Writing & Resource Management
+
+ /// Try to flush any buffered data to file.
+ ///
+ /// \note The underlying implementation doesn't necessarily flush buffered data
+ /// immediately, especially in a multithreaded writer situation.
+ /// Let the BamWriter go out of scope to fully ensure flushing.
+ ///
+ /// \throws
+ void TryFlush(void);
+
+ /// Write a record to the output BAM file.
+ ///
+ /// \param[in] record BamRecord object
+ /// \throws std::runtime_error on failure to write
+ void Write(const BamRecord& record);
+
+ /// Write a record to the output BAM file.
+ ///
+ /// \param[in] record BamRecord object
+ /// \param[out] vOffset BGZF virtual offset to start of \p record
+ /// \throws std::runtime_error on failure to write
+ void Write(const BamRecord& record, int64_t* vOffset);
+
+ /// Write a record to the output BAM file.
+ ///
+ /// \param[in] recordImpl BamRecordImpl object
+ /// \throws std::runtime_error on failure to write
+ void Write(const BamRecordImpl& recordImpl);
+
+ /// \}
+
+private:
+ std::unique_ptr<internal::BamWriterPrivate> d_;
+ DISABLE_MOVE_AND_COPY(BamWriter);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMWRITER_H
diff --git a/include/pbbam/Cigar.h b/include/pbbam/Cigar.h
new file mode 100644
index 0000000..1e0bc46
--- /dev/null
+++ b/include/pbbam/Cigar.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef CIGAR_H
+#define CIGAR_H
+
+#include "pbbam/CigarOperation.h"
+#include "pbbam/Config.h"
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT Cigar : public std::vector<CigarOperation>
+{
+
+public:
+ /// \name Static Constructor
+ /// \{
+
+ /// Creates a Cigar object from SAM/BAM string input
+ ///
+ /// \param [in] stdString SAM/BAM formatted CIGAR data
+ /// \returns Cigar object representing the input data
+ static Cigar FromStdString(const std::string& stdString);
+
+ /// \}
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ Cigar(void);
+ Cigar(const std::string& cigarString);
+ Cigar(const Cigar& other);
+ Cigar(Cigar&& other);
+ Cigar& operator=(const Cigar& other);
+ Cigar& operator=(Cigar&& other);
+ ~Cigar(void);
+
+ /// \}
+
+public:
+ /// \name Conversion Methods
+ /// \{
+
+ /// Converts Cigar object data to SAM/BAM formatted string
+ ///
+ /// \returns SAM/BAM formatted std::string
+ std::string ToStdString(void) const;
+
+ /// \}
+};
+
+inline Cigar::Cigar(void)
+ : std::vector<CigarOperation>()
+{ }
+
+inline Cigar::Cigar(const Cigar& other)
+ : std::vector<CigarOperation>(other)
+{ }
+
+inline Cigar::Cigar(Cigar&& other)
+ : std::vector<CigarOperation>(std::move(other))
+{ }
+
+inline Cigar& Cigar::operator=(const Cigar& other)
+{ std::vector<CigarOperation>::operator= (other); return *this; }
+
+inline Cigar& Cigar::operator=(Cigar&& other)
+{ std::vector<CigarOperation>::operator= (std::move(other)); return *this; }
+
+inline Cigar::~Cigar(void) { }
+
+inline Cigar Cigar::FromStdString(const std::string& stdString)
+{ return Cigar(stdString); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // CIGAR_H
diff --git a/include/pbbam/CigarOperation.h b/include/pbbam/CigarOperation.h
new file mode 100644
index 0000000..951128d
--- /dev/null
+++ b/include/pbbam/CigarOperation.h
@@ -0,0 +1,226 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef CIGAROPERATION_H
+#define CIGAROPERATION_H
+
+#include "pbbam/Config.h"
+#include <stdexcept>
+
+namespace PacBio {
+namespace BAM {
+
+/// Describes a CIGAR operation. Bracketed character is the corresponding SAM/BAM character code.
+///
+/// \warning ALIGNMENT_MATCH ('M') is included in this enum to maintain consistency with htslib.
+/// However, as of PacBio BAM spec version 3.0b7, this CIGAR operation \b forbidden. Attempt to
+/// read or write a record containing this operation will trigger a std::runtime_error.
+///
+enum class CigarOperationType
+{
+ UNKNOWN_OP = -1 ///< unknown/invalid CIGAR operator
+ , ALIGNMENT_MATCH = 0 ///< alignment match (can be a sequence match or mismatch) [M]
+ , INSERTION ///< insertion to the reference [I]
+ , DELETION ///< deletion from the reference [D]
+ , REFERENCE_SKIP ///< skipped region from the reference [N]
+ , SOFT_CLIP ///< soft clipping (clipped sequences present in SEQ) [S]
+ , HARD_CLIP = 5 ///< hard clipping (clipped sequences NOT present in SEQ) [H]
+ , PADDING ///< padding (silent deletion from padded reference) [P]
+ , SEQUENCE_MATCH ///< sequence match [=]
+ , SEQUENCE_MISMATCH ///< sequence mismatch [X]
+
+ // TODO: looks like there is a new 'B' type in htslib source, referring to some 'back' operation...
+ // no reference in htslib docs though yet as to what that applies to
+};
+
+class PBBAM_EXPORT CigarOperation
+{
+public:
+
+ /// \name Operation Type Conversion Methods
+ /// \{
+
+ /// Convert between CigarOperationType enum & SAM/BAM character code.
+ ///
+ /// \param[in] type CigarOperationType value
+ /// \returns SAM/BAM character code
+ static char TypeToChar(const CigarOperationType type);
+
+ /// Convert between CigarOperationType enum & SAM/BAM character code.
+ ///
+ /// \param[in] c SAM/BAM character code
+ /// \returns CigarOperationType value
+ static CigarOperationType CharToType(const char c);
+
+ /// \}
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ CigarOperation(void);
+ CigarOperation(char c, uint32_t length);
+ CigarOperation(CigarOperationType op, uint32_t length);
+ CigarOperation(const CigarOperation& other);
+ CigarOperation(CigarOperation&& other);
+ CigarOperation& operator=(const CigarOperation& other);
+ CigarOperation& operator=(CigarOperation&& other);
+ ~CigarOperation(void);
+
+ /// \}
+
+public:
+
+ /// \returns operation type as SAM/BAM char code
+ inline char Char(void) const;
+
+ /// \returns operation length
+ inline uint32_t Length(void) const;
+
+ /// \returns operation type as CigarOperationType enum value
+ inline CigarOperationType Type(void) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ /// Sets this operation type.
+ ///
+ /// \param[in] opChar SAM/BAM character code
+ /// \returns reference to this operation
+ inline CigarOperation& Char(const char opChar);
+
+ /// Sets this operation length.
+ ///
+ /// \param[in] length
+ /// \returns reference to this operation
+ inline CigarOperation& Length(const uint32_t length);
+
+ /// Sets this operation type.
+ ///
+ /// \param[in] opType CigarOperationType value
+ /// \returns reference to this operation
+ inline CigarOperation& Type(const CigarOperationType opType);
+
+ /// \}
+
+public:
+ /// \name Comparison Operators
+ /// \{
+
+ /// \returns true if both CIGAR operation type & length match
+ inline bool operator==(const CigarOperation& other) const;
+
+ /// \returns true if either CIGAR operation type or length differ
+ inline bool operator!=(const CigarOperation& other) const;
+
+ /// \}
+
+private:
+ CigarOperationType type_;
+ uint32_t length_;
+};
+
+inline CigarOperation::CigarOperation(void)
+ : type_(CigarOperationType::UNKNOWN_OP)
+ , length_(0)
+{ }
+
+inline CigarOperation::CigarOperation(char c, uint32_t length)
+ : type_(CigarOperation::CharToType(c))
+ , length_(length)
+{
+ if (type_ == CigarOperationType::ALIGNMENT_MATCH)
+ throw std::runtime_error("CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead.");
+}
+
+inline CigarOperation::CigarOperation(CigarOperationType op, uint32_t length)
+ : type_(op)
+ , length_(length)
+{
+ if (type_ == CigarOperationType::ALIGNMENT_MATCH)
+ throw std::runtime_error("CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead.");
+}
+
+inline CigarOperation::CigarOperation(const CigarOperation& other)
+ : type_(other.type_)
+ , length_(other.length_)
+{ }
+
+inline CigarOperation::CigarOperation(CigarOperation&& other)
+ : type_(std::move(other.type_))
+ , length_(std::move(other.length_))
+{ }
+
+inline CigarOperation::~CigarOperation(void) { }
+
+inline uint32_t CigarOperation::Length(void) const
+{ return length_; }
+
+inline CigarOperation& CigarOperation::Length(const uint32_t length)
+{ length_ = length; return *this; }
+
+inline CigarOperationType CigarOperation::Type(void) const
+{ return type_; }
+
+inline CigarOperation &CigarOperation::Type(const CigarOperationType opType)
+{ type_ = opType; return *this; }
+
+inline char CigarOperation::Char(void) const
+{ return CigarOperation::TypeToChar(type_); }
+
+inline CigarOperation &CigarOperation::Char(const char opChar)
+{ type_ = CigarOperation::CharToType(opChar);return *this; }
+
+inline CigarOperation& CigarOperation::operator=(const CigarOperation& other)
+{ type_ = other.type_; length_ = other.length_; return *this; }
+
+inline CigarOperation& CigarOperation::operator=(CigarOperation&& other)
+{ type_ = std::move(other.type_); length_ = std::move(other.length_); return *this; }
+
+inline bool CigarOperation::operator==(const CigarOperation& other) const
+{ return type_ == other.type_ && length_ == other.length_; }
+
+inline bool CigarOperation::operator!=(const CigarOperation& other) const
+{ return !(*this == other); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // CIGAROPERATION_H
diff --git a/include/pbbam/Config.h b/include/pbbam/Config.h
new file mode 100644
index 0000000..3d2b5d7
--- /dev/null
+++ b/include/pbbam/Config.h
@@ -0,0 +1,125 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef PBBAM_CONFIG_H
+#define PBBAM_CONFIG_H
+
+// --------------------------------
+// standard types
+// --------------------------------
+
+#include <cstdint>
+
+// -------------------------------------
+// library symbol import/export macros
+// -------------------------------------
+
+#ifndef PBBAM_LIBRARY_EXPORT
+# if defined(WIN32)
+# define PBBAM_LIBRARY_EXPORT __declspec(dllexport)
+# else
+# define PBBAM_LIBRARY_EXPORT __attribute__((visibility("default")))
+# endif
+#endif
+
+#ifndef PBBAM_LIBRARY_IMPORT
+# if defined(WIN32)
+# define PBBAM_LIBRARY_IMPORT __declspec(dllimport)
+# else
+# define PBBAM_LIBRARY_IMPORT
+# endif
+#endif
+
+#ifndef PBBAM_EXPORT
+# if defined(PBBAM_LIBRARY)
+# define PBBAM_EXPORT PBBAM_LIBRARY_EXPORT
+# else
+# define PBBAM_EXPORT PBBAM_LIBRARY_IMPORT
+# endif
+#endif
+
+// ----------------------------------------------------
+// setup the shared_ptr implementation we'll be using
+// ----------------------------------------------------
+
+// uncomment this define, or pass via command-line (-DPBBAM_USE_BOOST_SHARED_PTR),
+// to use boost::shared_ptr<T> instead of std::shared_ptr<T>
+//#define PBBAM_USE_BOOST_SHARED_PTR
+
+#ifdef PBBAM_USE_BOOST_SHARED_PTR
+# include <boost/smart_ptr/shared_ptr.hpp>
+# define PBBAM_SHARED_PTR boost::shared_ptr
+#else
+# include <memory>
+# define PBBAM_SHARED_PTR std::shared_ptr
+#endif
+
+// ----------------------------------------------------
+// htslib verbosity level
+// ----------------------------------------------------
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief Sets the desired verbosity level of htslib warnings.
+///
+/// Change this value to allow debug/warning statements from htslib.
+/// The valid range seems to be [0-3], where 0->OFF, and 3->most verbose.
+///
+extern int HtslibVerbosity;
+
+} // namespace BAM
+} // namespace PacBio
+
+// ----------------------------------------------------
+// additional helper macros
+// ----------------------------------------------------
+
+#ifndef DISABLE_COPY
+#define DISABLE_COPY(Class) \
+ Class(const Class&); \
+ Class& operator=(const Class&)
+#endif
+
+#ifndef DISABLE_MOVE_AND_COPY
+#define DISABLE_MOVE_AND_COPY(Class) \
+ Class(Class&&); \
+ Class& operator=(Class&&); \
+ DISABLE_COPY(Class)
+#endif
+
+#endif // PBBAM_CONFIG_H
diff --git a/include/pbbam/DataSet.h b/include/pbbam/DataSet.h
new file mode 100644
index 0000000..21a6aa2
--- /dev/null
+++ b/include/pbbam/DataSet.h
@@ -0,0 +1,218 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASET_H
+#define DATASET_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/Config.h"
+#include "pbbam/DataSetTypes.h"
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT DataSet
+{
+public:
+
+ /// \name DataSet Types
+ /// \{
+
+ enum TypeEnum {
+ GENERIC = 0
+ , ALIGNMENT
+ , BARCODE
+ , CONSENSUS_ALIGNMENT
+ , CONSENSUS_READ
+ , CONTIG
+ , HDF_SUBREAD
+ , REFERENCE
+ , SUBREAD
+ };
+
+ static DataSet::TypeEnum NameToType(const std::string& typeName);
+
+ static std::string TypeToName(const DataSet::TypeEnum& type);
+ /// \}
+
+public:
+
+ /// \name Constructors & Related Methods
+ /// \{
+
+ DataSet(void);
+ DataSet(const DataSet::TypeEnum type);
+ DataSet(const BamFile& bamFile);
+ DataSet(const std::string& filename);
+ DataSet(const DataSet& other);
+ DataSet(DataSet&& other);
+ DataSet& operator=(const DataSet& other);
+ DataSet& operator=(DataSet&& other);
+ ~DataSet(void);
+
+ /// Creates a DataSet from "raw" XML data.
+ static DataSet FromXml(const std::string& xml);
+
+ /// \}
+
+public:
+ /// \name Operators
+ /// \{
+
+ DataSet& operator+=(const DataSet& other);
+
+ /// \}
+
+public:
+ void Save(const std::string& outputFilename);
+ void SaveToStream(std::ostream& out);
+
+public:
+
+ /// \name Attributes
+ /// \{
+ ///
+
+ const std::string& Attribute(const std::string& name) const;
+ std::string& Attribute(const std::string& name);
+ DataSet& Attribute(const std::string& name, const std::string& value);
+
+ const std::string& CreatedAt(void) const;
+ const PacBio::BAM::Extensions& Extensions(void) const;
+ const std::string& Format(void) const;
+ const std::string& MetaType(void) const;
+ const std::string& ModifiedAt(void) const;
+ const std::string& Name(void) const;
+ const std::string& ResourceId(void) const;
+ const std::string& Tags(void) const;
+ const std::string& TimeStampedName(void) const;
+ const std::string& UniqueId(void) const;
+ const std::string& Version(void) const;
+
+ PacBio::BAM::DataSet::TypeEnum Type(void) const;
+ std::string TypeName(void) const;
+
+ /// \}
+
+public:
+ /// \name Child Elements
+ /// \{
+
+ const PacBio::BAM::ExternalResources& ExternalResources(void) const;
+ const PacBio::BAM::Filters& Filters(void) const;
+ const PacBio::BAM::DataSetMetadata& Metadata(void) const;
+ const PacBio::BAM::SubDataSets& SubDataSets(void) const;
+
+ /// \}
+
+public:
+ /// \name XML Namespace Handling
+ /// \{
+
+ const NamespaceRegistry& Namespaces(void) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ std::string& CreatedAt(void);
+ PacBio::BAM::Extensions& Extensions(void);
+ std::string& Format(void);
+ std::string& MetaType(void);
+ std::string& ModifiedAt(void);
+ std::string& Name(void);
+ std::string& ResourceId(void);
+ std::string& Tags(void);
+ std::string& TimeStampedName(void);
+ std::string& UniqueId(void);
+ std::string& Version(void);
+
+ DataSet& CreatedAt(const std::string& createdAt);
+ DataSet& Extensions(const PacBio::BAM::Extensions& extensions);
+ DataSet& Format(const std::string& format);
+ DataSet& MetaType(const std::string& metatype);
+ DataSet& ModifiedAt(const std::string& modifiedAt);
+ DataSet& Name(const std::string& name);
+ DataSet& ResourceId(const std::string& resourceId);
+ DataSet& Tags(const std::string& tags);
+ DataSet& TimeStampedName(const std::string& timeStampedName);
+ DataSet& UniqueId(const std::string& uuid);
+ DataSet& Version(const std::string& version);
+
+ DataSet& Type(const PacBio::BAM::DataSet::TypeEnum type);
+
+ /// \}
+
+public:
+ /// \name Child Elements
+ /// \{
+
+ PacBio::BAM::ExternalResources& ExternalResources(void);
+ PacBio::BAM::Filters& Filters(void);
+ PacBio::BAM::DataSetMetadata& Metadata(void);
+ PacBio::BAM::SubDataSets& SubDataSets(void);
+
+ DataSet& ExternalResources(const PacBio::BAM::ExternalResources& resources);
+ DataSet& Filters(const PacBio::BAM::Filters& filters);
+ DataSet& Metadata(const PacBio::BAM::DataSetMetadata& metadata);
+ DataSet& SubDataSets(const PacBio::BAM::SubDataSets& subdatasets);
+
+ /// \}
+
+public:
+ /// \name XML Namespace Handling
+ /// \{
+
+ NamespaceRegistry& Namespaces(void);
+
+ /// \}
+
+private:
+ std::unique_ptr<DataSetBase> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSet.inl"
+
+#endif // DATASET_H
diff --git a/include/pbbam/DataSetTypes.h b/include/pbbam/DataSetTypes.h
new file mode 100644
index 0000000..dd4c496
--- /dev/null
+++ b/include/pbbam/DataSetTypes.h
@@ -0,0 +1,315 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETTYPES_H
+#define DATASETTYPES_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/Config.h"
+#include "pbbam/DataSetXsd.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT DataSetMetadata : public internal::DataSetElement
+{
+public:
+ DataSetMetadata(const std::string& numRecords,
+ const std::string& totalLength);
+
+public:
+ DataSetMetadata& operator+=(const DataSetMetadata& other);
+
+public:
+ const std::string& NumRecords(void) const;
+ const std::string& TotalLength(void) const;
+ const PacBio::BAM::Provenance& Provenance(void) const;
+
+ std::string& NumRecords(void);
+ std::string& TotalLength(void);
+ PacBio::BAM::Provenance& Provenance(void);
+
+ DataSetMetadata& NumRecords(const std::string& numRecords);
+ DataSetMetadata& TotalLength(const std::string& totalLength);
+ DataSetMetadata& Provenance(const PacBio::BAM::Provenance& provenance);
+};
+
+class PBBAM_EXPORT ExtensionElement : public internal::DataSetElement {
+public:
+ ExtensionElement(void);
+};
+
+class PBBAM_EXPORT Extensions : public internal::DataSetListElement<ExtensionElement>
+{
+public:
+ Extensions(void);
+};
+
+class PBBAM_EXPORT ExternalResource : public internal::IndexedDataType
+{
+public:
+ ExternalResource(void);
+ ExternalResource(const BamFile& bamFile);
+ ExternalResource(const std::string& metatype,
+ const std::string& filename);
+
+public:
+ BamFile ToBamFile(void) const;
+};
+
+class PBBAM_EXPORT ExternalResources : public internal::DataSetListElement<ExternalResource>
+{
+public:
+ ExternalResources(void);
+
+ ExternalResources& operator+=(const ExternalResources& other);
+
+public:
+ void Add(const ExternalResource& ext);
+ void Remove(const ExternalResource& ext);
+
+public:
+ std::vector<BamFile> BamFiles(void) const;
+};
+
+class PBBAM_EXPORT FileIndex : public internal::InputOutputDataType
+{
+public:
+ FileIndex(void);
+};
+
+class PBBAM_EXPORT FileIndices : public internal::DataSetListElement<FileIndex>
+{
+public:
+ FileIndices(void);
+
+ void Add(const FileIndex& index);
+ void Remove(const FileIndex& index);
+};
+
+class PBBAM_EXPORT Filter : public internal::DataSetElement
+{
+public:
+ Filter(void);
+
+public:
+ const PacBio::BAM::Properties& Properties(void) const;
+ PacBio::BAM::Properties& Properties(void);
+ Filter& Properties(const PacBio::BAM::Properties& properties);
+};
+
+class PBBAM_EXPORT Filters : public internal::DataSetListElement<Filter>
+{
+public:
+ Filters(void);
+
+ Filters& operator+=(const Filters& other);
+
+ void Add(const Filter& filter);
+ void Remove(const Filter& filter);
+};
+
+class PBBAM_EXPORT ParentTool : public internal::BaseEntityType {
+public:
+ ParentTool(void);
+};
+
+class PBBAM_EXPORT Property : public internal::DataSetElement
+{
+public:
+ Property(const std::string& name,
+ const std::string& value,
+ const std::string& op);
+
+public:
+ const std::string& Name(void) const;
+ const std::string& Operator(void) const;
+ const std::string& Value(void) const;
+
+ std::string& Name(void);
+ std::string& Operator(void);
+ std::string& Value(void);
+
+ Property& Name(const std::string& name);
+ Property& Operator(const std::string& op);
+ Property& Value(const std::string& value);
+};
+
+class PBBAM_EXPORT Properties : public internal::DataSetListElement<Property>
+{
+public:
+ Properties(void);
+
+ void Add(const Property& property);
+ void Remove(const Property& property);
+};
+
+class PBBAM_EXPORT Provenance : public internal::DataSetElement
+{
+public:
+ Provenance(void);
+
+public:
+ const std::string& CreatedBy(void) const;
+ const std::string& CommonServicesInstanceId(void) const;
+ const std::string& CreatorUserId(void) const;
+ const std::string& ParentJobId(void) const;
+ const PacBio::BAM::ParentTool& ParentTool(void) const;
+
+ std::string& CreatedBy(void);
+ std::string& CommonServicesInstanceId(void);
+ std::string& CreatorUserId(void);
+ std::string& ParentJobId(void);
+ PacBio::BAM::ParentTool& ParentTool(void);
+
+ Provenance& CreatedBy(const std::string& createdBy);
+ Provenance& CommonServicesInstanceId(const std::string& id);
+ Provenance& CreatorUserId(const std::string& id);
+ Provenance& ParentJobId(const std::string& id);
+ Provenance& ParentTool(const PacBio::BAM::ParentTool& tool);
+};
+
+class SubDataSets;
+
+class PBBAM_EXPORT DataSetBase : public internal::StrictEntityType
+{
+public:
+ static std::shared_ptr<DataSetBase> Create(const std::string& typeName);
+
+public:
+ DataSetBase(void);
+
+protected:
+ DataSetBase(const std::string& label, const XsdType& xsd);
+ DataSetBase* DeepCopy(void) const;
+
+public:
+ DataSetBase& operator+=(const DataSetBase& other);
+
+public:
+ const PacBio::BAM::ExternalResources& ExternalResources(void) const;
+ const PacBio::BAM::Filters& Filters(void) const;
+ const PacBio::BAM::DataSetMetadata& Metadata(void) const;
+ const PacBio::BAM::SubDataSets& SubDataSets(void) const;
+
+ PacBio::BAM::ExternalResources& ExternalResources(void);
+ PacBio::BAM::Filters& Filters(void);
+ PacBio::BAM::DataSetMetadata& Metadata(void);
+ PacBio::BAM::SubDataSets& SubDataSets(void);
+
+ DataSetBase& ExternalResources(const PacBio::BAM::ExternalResources& resources);
+ DataSetBase& Filters(const PacBio::BAM::Filters& filters);
+ DataSetBase& Metadata(const PacBio::BAM::DataSetMetadata& metadata);
+ DataSetBase& SubDataSets(const PacBio::BAM::SubDataSets& subdatasets);
+
+
+public:
+ const NamespaceRegistry& Namespaces(void) const;
+ NamespaceRegistry& Namespaces(void);
+
+private:
+ NamespaceRegistry registry_;
+};
+
+class PBBAM_EXPORT AlignmentSet : public DataSetBase
+{
+public:
+ AlignmentSet(void);
+};
+
+class PBBAM_EXPORT BarcodeSet : public DataSetBase
+{
+public:
+ BarcodeSet(void);
+};
+
+class PBBAM_EXPORT ConsensusAlignmentSet : public DataSetBase
+{
+public:
+ ConsensusAlignmentSet(void);
+};
+
+class PBBAM_EXPORT ConsensusReadSet : public DataSetBase
+{
+public:
+ ConsensusReadSet(void);
+};
+
+class PBBAM_EXPORT ContigSet : public DataSetBase
+{
+public:
+ ContigSet(void);
+};
+
+class PBBAM_EXPORT HdfSubreadSet : public DataSetBase
+{
+public:
+ HdfSubreadSet(void);
+};
+
+class PBBAM_EXPORT ReferenceSet : public DataSetBase
+{
+public:
+ ReferenceSet(void);
+};
+
+class PBBAM_EXPORT SubDataSets : public internal::DataSetListElement<DataSetBase>
+{
+public:
+ SubDataSets(void);
+
+ SubDataSets& operator+=(const DataSetBase& other); // single
+ SubDataSets& operator+=(const SubDataSets& other); // list
+
+ void Add(const DataSetBase& subdataset);
+ void Remove(const DataSetBase& subdataset);
+};
+
+class PBBAM_EXPORT SubreadSet : public DataSetBase
+{
+public:
+ SubreadSet(void);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "internal/DataSetTypes.inl"
+
+#endif // DATASETTYPES_H
diff --git a/include/pbbam/DataSetXsd.h b/include/pbbam/DataSetXsd.h
new file mode 100644
index 0000000..29df5e1
--- /dev/null
+++ b/include/pbbam/DataSetXsd.h
@@ -0,0 +1,111 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETXSD_H
+#define DATASETXSD_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+enum class XsdType
+{
+ NONE
+
+ , AUTOMATION_CONSTRAINTS
+ , BASE_DATA_MODEL
+ , COLLECTION_METADATA
+ , COMMON_MESSAGES
+ , DATA_MODEL
+ , DATA_STORE
+ , DATASETS
+ , DECL_DATA
+ , PART_NUMBERS
+ , PRIMARY_METRICS
+ , REAGENT_KIT
+ , RIGHTS_AND_ROLES
+ , SAMPLE_INFO
+ , SEEDING_DATA
+};
+
+class PBBAM_EXPORT NamespaceInfo
+{
+public:
+ NamespaceInfo(void);
+ NamespaceInfo(const std::string& name,
+ const std::string& uri);
+
+public:
+ const std::string& Name(void) const { return name_; }
+ const std::string& Uri(void) const { return uri_; }
+
+private:
+ std::string name_;
+ std::string uri_;
+};
+
+class PBBAM_EXPORT NamespaceRegistry
+{
+public:
+ NamespaceRegistry(void);
+ NamespaceRegistry(const NamespaceRegistry& other);
+ NamespaceRegistry& operator=(const NamespaceRegistry& other);
+ ~NamespaceRegistry(void);
+
+public:
+ const NamespaceInfo& DefaultNamespace(void) const;
+ XsdType DefaultXsd(void) const;
+ const NamespaceInfo& Namespace(const XsdType& xsd) const;
+
+ XsdType XsdForUri(const std::string& uri) const;
+
+public:
+ void Register(const XsdType& xsd, const NamespaceInfo& namespaceInfo);
+ void SetDefaultXsd(const XsdType& xsd);
+
+private:
+ std::map<XsdType, NamespaceInfo> data_;
+ XsdType defaultXsdType_;
+};
+
+} // namespace PacBio
+} // namespace BAM
+
+#endif // DATASETXSD_H
diff --git a/include/pbbam/EntireFileQuery.h b/include/pbbam/EntireFileQuery.h
new file mode 100644
index 0000000..cd5809e
--- /dev/null
+++ b/include/pbbam/EntireFileQuery.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef ENTIREFILEQUERY_H
+#define ENTIREFILEQUERY_H
+
+#include "pbbam/internal/QueryBase.h"
+#include <htslib/sam.h>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+class PBBAM_EXPORT EntireFileQuery : public internal::IQuery
+{
+public:
+ EntireFileQuery(const PacBio::BAM::DataSet& dataset);
+protected:
+ FileIterPtr CreateIterator(const BamFile& bamFile);
+};
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // ENTIREFILEQUERY_H
diff --git a/include/pbbam/Frames.h b/include/pbbam/Frames.h
new file mode 100644
index 0000000..f11598c
--- /dev/null
+++ b/include/pbbam/Frames.h
@@ -0,0 +1,205 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef FRAMES_H
+#define FRAMES_H
+
+#include "pbbam/Config.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT Frames
+{
+public:
+ /// \name Conversion Methods
+ /// \{
+
+ /// Constructs a Frames object from encoded (lossy, 8-bit data).
+ ///
+ /// \note This method should probably not be needed often by client code working with frame data.
+ /// It exists primarily for (internal) parsing & interpretation of the BAM file contents. The
+ /// method is available, though, should the conversion operation be needed.
+ ///
+ /// \param[in] codedData encoded data
+ /// \returns Frames object
+ static Frames Decode(const std::vector<uint8_t>& codedData);
+
+ /// Encodes a container of (raw) frames values in our 8-bit encoding.
+ ///
+ /// \param[in] frames expanded frame data
+ /// \returns lossy, 8-bit encoded frame codes
+ static std::vector<uint8_t> Encode(const std::vector<uint16_t>& frames);
+
+ /// \}
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ Frames(void);
+ Frames(const std::vector<uint16_t>& frames);
+ Frames(std::vector<uint16_t>&& frames);
+ Frames(const Frames& other);
+ Frames(Frames&& other);
+ Frames& operator=(const Frames& other);
+ Frames& operator=(Frames&& other);
+ ~Frames(void);
+
+ /// \}
+
+public:
+ /// \name Access Data
+ /// \{
+
+ /// \returns Frame data in expanded (not encoded) form
+ std::vector<uint16_t>& DataRaw(void);
+ const std::vector<uint16_t>& Data(void) const;
+
+ /// \}
+
+public:
+ /// \name Conversion Methods
+ /// \{
+
+ /// \returns Frame data in (lossy, 8-bit) encoded form.
+ std::vector<uint8_t> Encode(void) const;
+
+ /// \}
+
+public:
+ /// \name Comparison Operators
+ /// \{
+
+ bool operator==(const Frames& other) const;
+ bool operator!=(const Frames& other) const;
+
+ /// \}
+
+public:
+ /// \name Iterators
+ /// \{
+
+ /// \returns A const_iterator to the beginning of the sequence.
+ std::vector<uint16_t>::const_iterator cbegin(void) const;
+
+ /// \returns A const_iterator to the element past the end of the sequence.
+ std::vector<uint16_t>::const_iterator cend(void) const;
+
+ /// \returns A const_iterator to the beginning of the sequence.
+ std::vector<uint16_t>::const_iterator begin(void) const;
+
+ /// \returns A const_iterator to the element past the end of the sequence.
+ std::vector<uint16_t>::const_iterator end(void) const;
+
+ /// \returns An iterator to the beginning of the sequence.
+ std::vector<uint16_t>::iterator begin(void);
+
+ /// \returns An iterator to the element past the end of the sequence.
+ std::vector<uint16_t>::iterator end(void);
+
+ /// \}
+
+public:
+ /// \name Access Data
+ /// \{
+
+ /// Sets this record's data.
+ ///
+ /// \param[in] frames data in expanded (not encoded) form
+ /// \returns reference to this object
+ Frames& Data(const std::vector<uint16_t>& frames);
+
+ /// Sets this record's data.
+ ///
+ /// This is an overloaded function, allowing move semantics
+ /// (instead of copying the data).
+ ///
+ /// \param[in] frames data in expanded (not encoded) form
+ /// \returns reference to this object
+ Frames& Data(std::vector<uint16_t>&& frames);
+
+ /// \}
+
+private:
+ std::vector<uint16_t> data_;
+};
+
+inline const std::vector<uint16_t>& Frames::Data(void) const
+{ return data_; }
+
+inline std::vector<uint16_t>& Frames::DataRaw(void)
+{ return data_; }
+
+inline std::vector<uint8_t> Frames::Encode(void) const
+{ return Frames::Encode(data_); }
+
+inline Frames& Frames::Data(const std::vector<uint16_t>& frames)
+{ data_ = frames; return *this; }
+
+inline Frames& Frames::Data(std::vector<uint16_t>&& frames)
+{ data_ = std::move(frames); return *this; }
+
+inline std::vector<uint16_t>::const_iterator Frames::cbegin(void) const
+{ return data_.cbegin(); }
+
+inline std::vector<uint16_t>::const_iterator Frames::cend(void) const
+{ return data_.cend(); }
+
+inline std::vector<uint16_t>::const_iterator Frames::begin(void) const
+{ return data_.begin(); }
+
+inline std::vector<uint16_t>::const_iterator Frames::end(void) const
+{ return data_.end(); }
+
+inline std::vector<uint16_t>::iterator Frames::begin(void)
+{ return data_.begin(); }
+
+inline std::vector<uint16_t>::iterator Frames::end(void)
+{ return data_.end(); }
+
+inline bool Frames::operator==(const Frames& other) const
+{ return data_ == other.data_; }
+
+inline bool Frames::operator!=(const Frames& other) const
+{ return !(*this == other); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FRAMES_H
diff --git a/include/pbbam/GenomicInterval.h b/include/pbbam/GenomicInterval.h
new file mode 100644
index 0000000..12ebb9a
--- /dev/null
+++ b/include/pbbam/GenomicInterval.h
@@ -0,0 +1,214 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef GENOMICINTERVAL_H
+#define GENOMICINTERVAL_H
+
+#include "pbbam/Config.h"
+#include "pbbam/Interval.h"
+#include "pbbam/Position.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+/// This class represents a genomic interval (reference name, and 0-based coordinates)
+class PBBAM_EXPORT GenomicInterval
+{
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// Default constructor; yields an empty genomic interval
+ GenomicInterval(void);
+
+ /// Constructor for interval on sequence with \p name, using range: [\p start, \p stop)
+ GenomicInterval(const std::string& name,
+ const Position& start,
+ const Position& stop);
+
+ /// Constructor for interval, using REGION string
+ ///
+ /// "<ref>:<start>-<stop>" ("chr8:200-600")
+ ///
+ /// \note The htslib/samtools REGION string expects start positions to be 1-based.
+ /// However, throughout pbbam (including the rest of this class), we stick
+ /// to 0-based start coordinates. Thus, while the syntax matches that of samtools,
+ /// we are using a 0-based start coordinate here.
+ ///
+ GenomicInterval(const std::string& zeroBasedRegionString);
+
+ GenomicInterval(const GenomicInterval& other);
+ GenomicInterval& operator=(const GenomicInterval& other);
+
+ ~GenomicInterval(void);
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ /// \returns interval reference name
+ std::string Name(void) const;
+
+ /// \returns underlying Interval object
+ PacBio::BAM::Interval<Position> Interval(void) const;
+
+ /// \returns interval start coordinate
+ Position Start(void) const;
+
+ /// \returns interval stop coordinate
+ Position Stop(void) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ /// Sets this interval's reference name.
+ ///
+ /// \param[in] name
+ /// \returns reference to this interval
+ GenomicInterval& Name(const std::string& name);
+
+ /// Sets this underlying Interval
+ ///
+ /// \param[in] interval
+ /// \returns reference to this interval
+ GenomicInterval& Interval(const PacBio::BAM::Interval<Position>& interval);
+
+ /// Sets this interval's start coordinate.
+ ///
+ /// \param[in] start
+ /// \returns reference to this interval
+ GenomicInterval& Start(const Position start);
+
+ /// Sets this interval's stop coordinate.
+ ///
+ /// \param[in] stop
+ /// \returns reference to this interval
+ GenomicInterval& Stop(const Position stop);
+
+ /// \}
+
+public:
+ /// \name Interval Operations
+ /// \{
+
+ /// \returns true if same id and underlying Interval::CoveredBy() other.
+ bool CoveredBy(const GenomicInterval& other) const;
+
+ /// \returns true if same id and underlying Interval::Covers() other.
+ bool Covers(const GenomicInterval& other) const;
+
+ /// \returns true if same id and underlying Interval::Intersects() other.
+ bool Intersects(const GenomicInterval& other) const;
+
+ /// \returns true if underlying Interval::IsValid(), and id/endpoints are non-negative.
+ bool IsValid(void) const;
+
+ /// \returns length of underlying
+ size_t Length(void) const;
+
+ /// \}
+
+public:
+ /// \name Comparison Operators
+ /// \{
+
+ /// \returns true if same id & underlying interval
+ bool operator==(const GenomicInterval& other) const;
+
+ /// \returns true if either ids or underlying intervals differ
+ bool operator!=(const GenomicInterval& other) const;
+
+ /// \}
+
+private:
+ std::string name_;
+ PacBio::BAM::Interval<Position> interval_;
+};
+
+inline GenomicInterval::~GenomicInterval(void) { }
+
+inline std::string GenomicInterval::Name(void) const
+{ return name_; }
+
+inline GenomicInterval& GenomicInterval::Name(const std::string& name)
+{ name_ = name; return *this; }
+
+inline PacBio::BAM::Interval<Position> GenomicInterval::Interval(void) const
+{ return interval_; }
+
+inline GenomicInterval& GenomicInterval::Interval(const PacBio::BAM::Interval<Position>& interval)
+{ interval_ = interval; return *this; }
+
+inline bool GenomicInterval::IsValid(void) const
+{
+ return !name_.empty() &&
+ interval_.Start() >= 0 &&
+ interval_.Stop() >= 0 &&
+ interval_.IsValid();
+}
+
+inline size_t GenomicInterval::Length(void) const
+{ return interval_.Length(); }
+
+inline Position GenomicInterval::Start(void) const
+{ return interval_.Start(); }
+
+inline GenomicInterval& GenomicInterval::Start(const Position start)
+{ interval_.Start(start); return *this; }
+
+inline Position GenomicInterval::Stop(void) const
+{ return interval_.Stop(); }
+
+inline GenomicInterval& GenomicInterval::Stop(const Position stop)
+{ interval_.Stop(stop); return *this; }
+
+inline bool GenomicInterval::operator==(const GenomicInterval& other) const
+{ return name_ == other.name_ && interval_ == other.interval_; }
+
+inline bool GenomicInterval::operator!=(const GenomicInterval& other) const
+{ return !(*this == other); }
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // GENOMICINTERVAL_H
diff --git a/include/pbbam/GenomicIntervalQuery.h b/include/pbbam/GenomicIntervalQuery.h
new file mode 100644
index 0000000..c1e10f9
--- /dev/null
+++ b/include/pbbam/GenomicIntervalQuery.h
@@ -0,0 +1,72 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef GENOMICINTERVALQUERY_H
+#define GENOMICINTERVALQUERY_H
+
+#include "pbbam/GenomicInterval.h"
+#include "pbbam/QueryBase.h"
+#include "pbbam/internal/QueryBase.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+class PBBAM_EXPORT GenomicIntervalQuery : public internal::IQuery
+{
+public:
+ GenomicIntervalQuery(const GenomicInterval& interval,
+ const DataSet& dataset);
+
+public:
+ GenomicIntervalQuery& Interval(const GenomicInterval& interval);
+ GenomicInterval Interval(void) const;
+
+protected:
+ FileIterPtr CreateIterator(const BamFile& bamFile);
+
+private:
+ GenomicInterval interval_;
+};
+
+//} // namespace staging
+} // namespace BAM
+} // namspace PacBio
+
+#endif // GENOMICINTERVALQUERY_H
diff --git a/include/pbbam/GroupQuery.h b/include/pbbam/GroupQuery.h
new file mode 100644
index 0000000..abc1f5c
--- /dev/null
+++ b/include/pbbam/GroupQuery.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Yuan Li
+
+#ifndef _GROUP_QUERY_H_
+#define _GROUP_QUERY_H_
+#include "GroupQueryBase.h"
+#include <htslib/sam.h>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT SequentialGroupQueryBase: public GroupQueryBase
+{
+public:
+ SequentialGroupQueryBase(const BamFile & bamFile);
+
+protected:
+ virtual bool InSameGroup(const BamRecord & record, const BamRecord & another) = 0;
+ bool GetNext(std::vector<BamRecord> & records);
+ PBBAM_SHARED_PTR<samFile> htsFile_;
+ PBBAM_SHARED_PTR<bam_hdr_t> htsHeader_;
+ BamRecord nextRecord_;
+};
+
+//class PBBAM_EXPORT ZmwQuery: public SequentialGroupQueryBase
+//{
+//public:
+// ZmwQuery(const BamFile & bamFile)
+// : SequentialGroupQueryBase(bamFile) { }
+
+//private:
+// bool InSameGroup(const BamRecord & record, const BamRecord & another) {
+// return (record.MovieName() == another.MovieName() &&
+// record.HoleNumber() == another.HoleNumber());
+// }
+//};
+
+class PBBAM_EXPORT QNameQuery: public SequentialGroupQueryBase
+{
+public:
+ QNameQuery(const BamFile & bamFile)
+ : SequentialGroupQueryBase(bamFile) { }
+
+private:
+ bool InSameGroup(const BamRecord & record, const BamRecord & another) {
+ return (record.Impl().Name() == another.Impl().Name());
+ }
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // _SEQUENTIAL_GROUP_QUERY_BASE_H_
diff --git a/include/pbbam/GroupQueryBase.h b/include/pbbam/GroupQueryBase.h
new file mode 100644
index 0000000..624bdb1
--- /dev/null
+++ b/include/pbbam/GroupQueryBase.h
@@ -0,0 +1,214 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Yuan Li
+// TODO: Up to Derek's decision. This class mostly references
+// QueryBase.h. We may make QueryBase a template class and make
+// GroupQueryBase a specialization of the template.
+
+#ifndef _GROUP_QUERY_BASE_H_
+#define _GROUP_QUERY_BASE_H_
+
+#include "pbbam/QueryBase.h"
+#include "pbbam/BamRecord.h"
+#include <memory>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class GroupQueryBase;
+
+class GroupQueryIterator
+{
+public:
+ std::vector<BamRecord> & operator* (void);
+ std::vector<BamRecord> * operator-> (void);
+ GroupQueryIterator& operator++ (void);
+ GroupQueryIterator operator++ (int);
+
+ bool operator== (const GroupQueryIterator & other) const;
+ bool operator!= (const GroupQueryIterator & other) const;
+
+ GroupQueryIterator(void);
+ GroupQueryIterator(GroupQueryBase & parent);
+
+private:
+ GroupQueryBase * query_;
+ std::vector<BamRecord> records_;
+ friend class GroupQueryBase;
+};
+
+class GroupQueryConstIterator
+{
+public:
+ const std::vector<BamRecord>& operator*(void) const;
+ const std::vector<BamRecord>* operator->(void) const;
+ GroupQueryConstIterator& operator++(void);
+ GroupQueryConstIterator operator++(int);
+ bool operator==(const GroupQueryConstIterator& other) const;
+ bool operator!=(const GroupQueryConstIterator& other) const;
+
+ GroupQueryConstIterator(void);
+ GroupQueryConstIterator(const GroupQueryBase& parent);
+
+private:
+ GroupQueryBase* query_;
+ std::vector<BamRecord> records_;
+ friend class GroupQueryBase;
+};
+
+
+class PBBAM_EXPORT GroupQueryBase
+{
+public:
+ typedef GroupQueryIterator iterator;
+
+protected:
+ BamFile file_;
+
+public:
+ virtual ~GroupQueryBase(void);
+
+public:
+ GroupQueryBase::iterator begin(void);
+ GroupQueryBase::iterator end(void);
+
+protected:
+ GroupQueryBase(const BamFile & file);
+ virtual bool GetNext(std::vector<BamRecord>& records) = 0;
+
+ friend class GroupQueryIterator;
+ friend class GroupQueryConstIterator;
+};
+
+inline GroupQueryBase::iterator GroupQueryBase::begin(void)
+{ return GroupQueryBase::iterator(*this); }
+
+inline GroupQueryBase::iterator GroupQueryBase::end(void)
+{ return GroupQueryBase::iterator(); }
+
+
+inline GroupQueryBase::GroupQueryBase(const BamFile & file)
+ : file_(file)
+{ }
+
+inline GroupQueryBase::~GroupQueryBase(void) { }
+
+// -------------------
+// GroupQueryIterator
+// -------------------
+
+inline GroupQueryIterator::GroupQueryIterator(void): query_(0) {}
+
+inline GroupQueryIterator::GroupQueryIterator(GroupQueryBase & parent)
+ : query_(& parent)
+ , records_()
+{
+ if (!(query_->GetNext(records_)))
+ query_ = 0;
+}
+
+inline std::vector<BamRecord>& GroupQueryIterator::operator* (void)
+{ return records_; }
+
+inline std::vector<BamRecord>* GroupQueryIterator::operator-> (void)
+{ return &(operator*()); }
+
+inline GroupQueryIterator& GroupQueryIterator::operator++ (void)
+{
+ if (!(query_->GetNext(records_)))
+ query_ = 0;
+ return *this;
+}
+
+inline GroupQueryIterator GroupQueryIterator::operator++ (int)
+{
+ GroupQueryIterator result(*this);
+ ++(*this);
+ return result;
+}
+
+inline bool GroupQueryIterator::operator==(const GroupQueryIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool GroupQueryIterator::operator!=(const GroupQueryIterator& other) const
+{ return !(*this == other); }
+
+
+// -------------------
+// GroupQueryConstIterator
+// -------------------
+
+inline const std::vector<BamRecord>& GroupQueryConstIterator::operator*(void) const
+{ return records_; }
+
+inline const std::vector<BamRecord>* GroupQueryConstIterator::operator->(void) const
+{ return &(operator*()); }
+
+inline GroupQueryConstIterator& GroupQueryConstIterator::operator++(void)
+{
+ if (!(query_->GetNext(records_)))
+ query_ = 0;
+ return *this;
+}
+
+inline GroupQueryConstIterator GroupQueryConstIterator::operator++(int)
+{
+ GroupQueryConstIterator result(*this);
+ ++(*this);
+ return result;
+}
+
+inline bool GroupQueryConstIterator::operator==(const GroupQueryConstIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool GroupQueryConstIterator::operator!=(const GroupQueryConstIterator& other) const
+{ return !(*this == other); }
+
+inline GroupQueryConstIterator::GroupQueryConstIterator(void): query_(0) { }
+
+inline GroupQueryConstIterator::GroupQueryConstIterator(const GroupQueryBase& parent)
+ : query_(const_cast<GroupQueryBase*>(&parent))
+ , records_()
+{
+ if (!(query_->GetNext(records_)))
+ query_ = 0;
+}
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // _GROUP_QUERY_BASE_H_
diff --git a/include/pbbam/IndexedFastaReader.h b/include/pbbam/IndexedFastaReader.h
new file mode 100644
index 0000000..aa485db
--- /dev/null
+++ b/include/pbbam/IndexedFastaReader.h
@@ -0,0 +1,112 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: David Alexander
+
+#ifndef INDEXEDFASTAREADER_H
+#define INDEXEDFASTAREADER_H
+
+#include "pbbam/Orientation.h"
+#include "pbbam/Position.h"
+#include "htslib/faidx.h"
+
+#include <string>
+#include <iostream>
+#include <stdexcept>
+
+namespace PacBio {
+namespace BAM {
+
+class GenomicInterval;
+class BamRecord;
+
+class IndexedFastaReader {
+
+public:
+ IndexedFastaReader() = delete;
+ IndexedFastaReader(const std::string& filename);
+ ~IndexedFastaReader();
+
+public:
+ // Copy constructor
+ IndexedFastaReader(const IndexedFastaReader& src)
+ {
+ if (!Open(src.filename_))
+ throw std::runtime_error("Cannot open file " + src.filename_);
+ }
+
+ // Copy assignment operator
+ IndexedFastaReader& operator=(const IndexedFastaReader& rhs)
+ {
+ if(&rhs == this) return *this;
+
+ Open(rhs.filename_);
+ return *this;
+ }
+
+public:
+ std::string Subsequence(const std::string& id, Position begin, Position end) const;
+ std::string Subsequence(const GenomicInterval& interval) const;
+ std::string Subsequence(const char* htslibRegion) const;
+
+public:
+ // \returns subsequence of the reference corresponding to the bamRecord,
+ // oriented and gapped as requested. For example, "native" orientation
+ // and "gapped" will return the reference sequence with gaps inserted, as
+ // would align against the read in "native" orientation
+ std::string ReferenceSubsequence(const BamRecord& bamRecord,
+ const Orientation orientation=Orientation::GENOMIC,
+ const bool gapped=false,
+ const bool exciseSoftClips=false) const;
+
+public:
+ int NumSequences() const;
+ bool HasSequence(const std::string& name) const;
+ int SequenceLength(const std::string& name) const;
+
+private:
+ std::string filename_;
+ faidx_t* handle_;
+
+private:
+ void Close(void);
+ bool Open(const std::string& filename);
+};
+
+
+
+} // PacBio
+} // BAM
+#endif // INDEXEDFASTAREADER_H
diff --git a/include/pbbam/Interval.h b/include/pbbam/Interval.h
new file mode 100644
index 0000000..6c2e91a
--- /dev/null
+++ b/include/pbbam/Interval.h
@@ -0,0 +1,212 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef INTERVAL_H
+#define INTERVAL_H
+
+#include "pbbam/Config.h"
+#include <string>
+
+#define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
+#include <boost/icl/discrete_interval.hpp>
+#include <boost/icl/interval_traits.hpp>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief Utility class for working with half-open (right-open) intervals. [start, stop)
+///
+/// \note This class is agnostic whether the values are 0-based or 1-based.
+/// \todo Should it be? Should that go here or "higher up"?
+///
+template<typename T>
+class Interval
+{
+public:
+ typedef boost::icl::discrete_interval<T> interval_type;
+
+public:
+
+ /// \name Constructors
+ /// \{
+
+ /** Default constructor; yields an empty interval [0,0) */
+ inline Interval(void);
+
+ /** Constructor for a singleton interval [val,val+1) */
+ inline Interval(const T val);
+
+ /** Constructor for interval from [start, stop) */
+ inline Interval(const T start, const T stop);
+
+ /** Copy constructor */
+ inline Interval(const Interval<T>& other);
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ /// \returns interval start coordinate
+ inline T Start(void) const;
+
+ /// Sets this interval's start coordinate.
+ ///
+ /// \param[in] start
+ /// \returns reference to this interval
+ inline Interval<T>& Start(const T& start);
+
+ /// \returns interval stop coordinate
+ inline T Stop(void) const;
+
+ /// Sets this interval's stop coordinate.
+ ///
+ /// \param[in] stop
+ /// \returns reference to this interval
+ inline Interval<T>& Stop(const T& stop);
+
+ /// \}
+
+ /// \name Interval Operations
+
+ /// \returns true if this interval is fully covered by (or contained in) \p other
+ inline bool CoveredBy(const Interval<T>& other) const;
+
+ //// \returns true if this interval covers (or contains) \p other
+ inline bool Covers(const Interval<T>& other) const;
+
+ /// \returns true if intervals interset
+ inline bool Intersects(const Interval<T>& other) const;
+
+ /// \returns true if interval is valid (e.g. start < stop)
+ inline bool IsValid(void) const;
+
+ /// \returns interval length
+ inline size_t Length(void) const;
+
+ /// \}
+
+ /// \name Comparison Operators
+ /// \{
+
+ /// \returns true if both intervals share the same endpoints
+ inline bool operator==(const Interval<T>& other) const;
+
+ /// \returns true if either interval's endpoints differ
+ inline bool operator!=(const Interval<T>& other) const;
+
+ /// \}
+
+private:
+ interval_type data_;
+};
+
+template<typename T>
+Interval<T>::Interval(void)
+ : data_(boost::icl::discrete_interval<T>::right_open(0,0))
+{ }
+
+template<typename T>
+Interval<T>::Interval(const T val)
+ : data_(boost::icl::discrete_interval<T>::right_open(val,val+1))
+{ }
+
+template<typename T>
+Interval<T>::Interval(const T start, const T stop)
+ : data_(boost::icl::discrete_interval<T>::right_open(start,stop))
+{ }
+
+template<typename T>
+Interval<T>::Interval(const Interval<T>& other)
+ : data_(boost::icl::discrete_interval<T>::right_open(other.Start(), other.Stop()))
+{ }
+
+template<typename T>
+inline bool Interval<T>::operator==(const Interval<T>& other) const
+{ return data_ == other.data_; }
+
+template<typename T>
+inline bool Interval<T>::operator!=(const Interval<T>& other) const
+{ return !(data_ == other.data_); }
+
+template<typename T>
+inline bool Interval<T>::CoveredBy(const Interval<T>& other) const
+{ return boost::icl::within(data_, other.data_); }
+
+template<typename T>
+inline bool Interval<T>::Covers(const Interval<T>& other) const
+{ return boost::icl::contains(data_, other.data_); }
+
+template<typename T>
+inline bool Interval<T>::Intersects(const Interval<T>& other) const
+{ return boost::icl::intersects(data_, other.data_); }
+
+template<typename T>
+inline bool Interval<T>::IsValid(void) const
+{ return !boost::icl::is_empty(data_); }
+
+template<typename T>
+inline size_t Interval<T>::Length(void) const
+{ return boost::icl::length(data_); }
+
+template<typename T>
+inline T Interval<T>::Start(void) const
+{ return data_.lower(); }
+
+template<typename T>
+inline Interval<T>& Interval<T>::Start(const T& start)
+{
+ data_ = boost::icl::discrete_interval<T>::right_open(start, data_.upper());
+ return *this;
+}
+
+template<typename T>
+inline T Interval<T>::Stop(void) const
+{ return data_.upper(); }
+
+template<typename T>
+inline Interval<T>& Interval<T>::Stop(const T& stop)
+{
+ data_ = boost::icl::discrete_interval<T>::right_open(data_.lower(), stop);
+ return *this;
+}
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // GENOMICINTERVAL_H
diff --git a/include/pbbam/LocalContextFlags.h b/include/pbbam/LocalContextFlags.h
new file mode 100644
index 0000000..53e8c9e
--- /dev/null
+++ b/include/pbbam/LocalContextFlags.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Lance Hepler
+
+#ifndef LOCALCONTEXTFLAGS_H
+#define LOCALCONTEXTFLAGS_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+enum LocalContextFlags : uint8_t
+{
+ NO_LOCAL_CONTEXT = 0,
+ ADAPTER_BEFORE = 1,
+ ADAPTER_AFTER = 2,
+ BARCODE_BEFORE = 4,
+ BARCODE_AFTER = 8,
+ FORWARD_PASS = 16,
+ REVERSE_PASS = 32
+};
+
+// constexpr is implicitly inline
+constexpr LocalContextFlags operator|(const LocalContextFlags lhs, const LocalContextFlags rhs)
+{
+ return static_cast<LocalContextFlags>(static_cast<int>(lhs) | static_cast<int>(rhs));
+}
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // LOCALCONTEXTFLAGS_H
diff --git a/include/pbbam/Orientation.h b/include/pbbam/Orientation.h
new file mode 100644
index 0000000..7582199
--- /dev/null
+++ b/include/pbbam/Orientation.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef ORIENTATION_H
+#define ORIENTATION_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+enum class Orientation
+{
+ NATIVE
+ , GENOMIC
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ORIENTATION_H
diff --git a/include/pbbam/PbiBuilder.h b/include/pbbam/PbiBuilder.h
new file mode 100644
index 0000000..6e99302
--- /dev/null
+++ b/include/pbbam/PbiBuilder.h
@@ -0,0 +1,121 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#ifndef PBIBUILDER_H
+#define PBIBUILDER_H
+
+#include "pbbam/Config.h"
+#include <memory>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamRecord;
+class PbiRawData;
+
+namespace internal { class PbiBuilderPrivate; }
+
+/// This class may be used to construct PBI index data while a BAM file is being
+/// written, rather than waiting to process it at the end.
+///
+class PBBAM_EXPORT PbiBuilder
+{
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// Initialize builder to write data to \p pbiFilename.
+ ///
+ /// \throws std::runtime_error if PBI file cannot be opened for writing
+ ///
+ PbiBuilder(const std::string& pbiFilename);
+
+ /// Initialize builder to write data to \p pbiFilename. Reference data-tracking
+ /// structures will be initialized to expect \p numReferenceSequences. (This is
+ /// useful so that we can mark any references that lack observed data appropriately).
+ ///
+ /// \throws std::runtime_error if PBI file cannot be opened for writing
+ ///
+ PbiBuilder(const std::string& pbiFilename, const size_t numReferenceSequences);
+
+ /// On destruction, data summaries are calculated, raw data is written to file, and
+ /// file handle closed.
+ ///
+ ~PbiBuilder(void);
+
+ /// \}
+
+public:
+ /// \name Index Building
+ /// \{
+
+ /// Adds \p record's data to underlying raw data structure. \p vOffset is the BGZF
+ /// virtual offset into the BAM file where the record begins.
+ ///
+ /// \sa BamWriter::Write(const BamRecord& record, int64_t* vOffset) for the easiest
+ /// way to retrieve this information while generating a BAM file. See example below:
+ ///
+ /// \code{.cpp}
+ /// BamWriter writer(...);
+ /// PbiBuilder pbiBuilder(...);
+ /// int64_t vOffset;
+ /// while (...) {
+ /// BamRecord record;
+ /// // ... generate record data ...
+ /// writer.Write(record, &vOffset);
+ /// pbiBuilder.AddRecord(record, &vOffset);
+ /// }
+ /// \endcode
+ ///
+ void AddRecord(const BamRecord& record, const int64_t vOffset);
+
+ /// \returns const reference to current raw index data. Mostly only used for testing;
+ /// shouldn't be needed by most client code.
+ ///
+ const PbiRawData& Index(void) const;
+
+ /// \}
+
+private:
+ std::unique_ptr<internal::PbiBuilderPrivate> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIBUILDER_H
diff --git a/include/pbbam/PbiFile.h b/include/pbbam/PbiFile.h
new file mode 100644
index 0000000..81c3de3
--- /dev/null
+++ b/include/pbbam/PbiFile.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#ifndef PBIFILE_H
+#define PBIFILE_H
+
+#include "pbbam/Config.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+// class-like namespace
+namespace PbiFile
+{
+
+ /// PBI File Sections
+ ///
+ /// See (spec/doc links) for more details.
+ ///
+ enum Section
+ {
+ SUBREAD = 0x0000 ///< SubreadData (required)
+ , MAPPED = 0x0001 ///< MappedData (always optional)
+ , REFERENCE = 0x0002 ///< ReferenceData (always optional)
+ , BARCODE = 0x0004 ///< BarcodeData (always optional)
+
+ , ALL = SUBREAD | MAPPED | REFERENCE | BARCODE ///< synonym for building
+ };
+ typedef uint16_t Sections;
+
+ /// PBI File Version
+ enum VersionEnum
+ {
+ Version_3_0_0 = 0x030000
+
+ , CurrentVersion = Version_3_0_0
+ };
+
+ /// Builds PBI index data from the supplied ".bam" file and writes a ".pbi" file.
+ ///
+ /// \param[in] bamFile The source BamFile.
+ ///
+ /// \throws std::exception if index file could not be created
+ ///
+ PBBAM_EXPORT void CreateFrom(const BamFile& bamFile);
+
+} // namespace PbiFile
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIFILE_H
diff --git a/include/pbbam/PbiIndex.h b/include/pbbam/PbiIndex.h
new file mode 100644
index 0000000..79aa880
--- /dev/null
+++ b/include/pbbam/PbiIndex.h
@@ -0,0 +1,299 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#ifndef PBIINDEX_H
+#define PBIINDEX_H
+
+#include "pbbam/Config.h"
+#include "pbbam/LocalContextFlags.h"
+#include "pbbam/PbiFile.h"
+#include "pbbam/Strand.h"
+#include <deque>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class PbiIndexPrivate; }
+
+enum class SubreadField
+{
+ RG_ID
+ , Q_START
+ , Q_END
+ , ZMW
+ , READ_QUALITY
+ , VIRTUAL_OFFSET
+};
+
+enum class MappedField
+{
+ T_ID
+ , T_START
+ , T_END
+ , A_START
+ , A_END
+ , N_M
+ , N_MM
+ , N_INS
+ , N_DEL
+ , MAP_QUALITY
+ , STRAND
+};
+
+enum class BarcodeField
+{
+ BC_LEFT
+ , BC_RIGHT
+ , BC_QUALITY
+ , CONTEXT_FLAG
+};
+
+enum class CompareType
+{
+ EQUAL
+ , LESS_THAN
+ , LESS_THAN_EQUAL
+ , GREATER_THAN
+ , GREATER_THAN_EQUAL
+ , NOT_EQUAL
+};
+
+//
+// Contiguous reads that satisfy a query will be returned as a block.
+// This is to help minimize number of seeks (or even unneccesary checks).
+//
+// An index query can iterate over the lookup result 'IndexResultBlocks' list to
+// perform a seek and fetch 'numReads' consecutive records before needing to
+// seek again.
+//
+struct PBBAM_EXPORT IndexResultBlock
+{
+public:
+ IndexResultBlock(void);
+ IndexResultBlock(size_t idx, size_t numReads);
+
+public:
+ bool operator==(const IndexResultBlock& other) const;
+ bool operator!=(const IndexResultBlock& other) const;
+
+public:
+ size_t firstIndex_;
+ size_t numReads_;
+ int64_t virtualOffset_;
+};
+
+typedef std::deque<IndexResultBlock> IndexResultBlocks;
+
+typedef std::vector<size_t> IndexList;
+typedef std::pair<size_t, size_t> IndexRange;
+
+template<typename FieldType, typename ValueType>
+struct IndexRequestBase
+{
+public:
+ FieldType field_;
+ ValueType value_;
+ CompareType compareType_;
+
+protected:
+ IndexRequestBase(const FieldType field,
+ const ValueType& value,
+ const CompareType compareType = CompareType::EQUAL);
+};
+
+// all multi-requests use CompareType::EQUAL
+template<typename FieldType, typename ValueType>
+struct IndexMultiRequestBase
+{
+public:
+ FieldType field_;
+ std::vector<ValueType> values_;
+
+protected:
+ IndexMultiRequestBase(const FieldType field,
+ const std::vector<ValueType>& values);
+};
+
+class PBBAM_EXPORT PbiIndex
+{
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ PbiIndex(const std::string& pbiFilename);
+ PbiIndex(const PbiIndex& other);
+ PbiIndex(PbiIndex&& other);
+ PbiIndex& operator=(const PbiIndex& other);
+ PbiIndex& operator=(PbiIndex&& other);
+ ~PbiIndex(void);
+
+ /// \}
+
+public:
+ // PBI attributes
+ bool HasBarcodeData(void) const;
+ bool HasMappedData(void) const;
+ bool HasReferenceData(void) const;
+ bool HasSection(const PbiFile::Section section) const;
+
+ PbiFile::Sections FileSections(void) const;
+ uint32_t NumReads(void) const;
+ PbiFile::VersionEnum Version(void) const;
+
+public:
+
+ template<typename FieldType, typename ValueType>
+ IndexList RawIndices(const IndexRequestBase<FieldType, ValueType>& request) const;
+
+ template<typename FieldType, typename ValueType>
+ IndexList RawIndices(const IndexMultiRequestBase<FieldType, ValueType>& request) const;
+
+ template<typename FieldType, typename ValueType>
+ IndexResultBlocks Lookup(const IndexRequestBase<FieldType, ValueType>& request) const;
+
+ template<typename FieldType, typename ValueType>
+ IndexResultBlocks Lookup(const IndexMultiRequestBase<FieldType, ValueType>& request) const;
+
+ IndexResultBlocks LookupReference(const int32_t tId) const;
+
+ const std::vector<int64_t>& VirtualFileOffsets(void) const;
+
+private:
+ PbiIndex(void);
+ std::unique_ptr<internal::PbiIndexPrivate> d_;
+};
+
+template<SubreadField field, typename ValueType>
+class SubreadIndexRequest : public IndexRequestBase<SubreadField, ValueType>
+{
+public:
+ SubreadIndexRequest(const ValueType& value,
+ const CompareType& compareType = CompareType::EQUAL);
+};
+
+template<SubreadField field, typename ValueType>
+class SubreadIndexMultiRequest : public IndexMultiRequestBase<SubreadField, ValueType>
+{
+public:
+ SubreadIndexMultiRequest(const std::vector<ValueType>& values);
+};
+
+typedef SubreadIndexRequest<SubreadField::RG_ID, int32_t> ReadGroupIndexRequest;
+typedef SubreadIndexRequest<SubreadField::Q_START, int32_t> QueryStartIndexRequest;
+typedef SubreadIndexRequest<SubreadField::Q_END, int32_t> QueryEndIndexRequest;
+typedef SubreadIndexRequest<SubreadField::ZMW, int32_t> ZmwIndexRequest;
+typedef SubreadIndexRequest<SubreadField::READ_QUALITY, uint16_t> ReadQualityIndexRequest;
+
+typedef SubreadIndexMultiRequest<SubreadField::RG_ID, int32_t> ReadGroupIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::Q_START, int32_t> QueryStartIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::Q_END, int32_t> QueryEndIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::ZMW, int32_t> ZmwIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::READ_QUALITY, uint16_t> ReadQualityIndexMultiRequest;
+
+template<MappedField field, typename ValueType>
+class MappedIndexRequest : public IndexRequestBase<MappedField, ValueType>
+{
+public:
+ MappedIndexRequest(const ValueType& value, const
+ CompareType& compareType = CompareType::EQUAL);
+};
+
+template<MappedField field, typename ValueType>
+class MappedIndexMultiRequest : public IndexMultiRequestBase<SubreadField, ValueType>
+{
+public:
+ MappedIndexMultiRequest(const std::vector<ValueType>& values);
+};
+
+typedef MappedIndexRequest<MappedField::T_ID, int32_t> ReferenceIdIndexRequest;
+typedef MappedIndexRequest<MappedField::T_START, int32_t> ReferenceStartIndexRequest;
+typedef MappedIndexRequest<MappedField::T_END, int32_t> ReferenceEndIndexRequest;
+typedef MappedIndexRequest<MappedField::A_START, int32_t> AlignedStartIndexRequest;
+typedef MappedIndexRequest<MappedField::A_END, int32_t> AlignedEndIndexRequest;
+typedef MappedIndexRequest<MappedField::N_M, int32_t> NumMatchesIndexRequest;
+typedef MappedIndexRequest<MappedField::N_MM, int32_t> NumMismatchesIndexRequest;
+typedef MappedIndexRequest<MappedField::N_INS, int32_t> NumInsertionsIndexRequest;
+typedef MappedIndexRequest<MappedField::N_DEL, int32_t> NumDeletionsIndexRequest;
+typedef MappedIndexRequest<MappedField::MAP_QUALITY, uint8_t> MapQualityIndexRequest;
+typedef MappedIndexRequest<MappedField::STRAND, Strand> StrandIndexRequest;
+
+typedef MappedIndexMultiRequest<MappedField::T_ID, int32_t> ReferenceIdIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::T_START, int32_t> ReferenceStartIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::T_END, int32_t> ReferenceEndIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::A_START, int32_t> AlignedStartIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::A_END, int32_t> AlignedEndIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_M, int32_t> NumMatchesIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_MM, int32_t> NumMismatchesIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_INS, int32_t> NumInsertionsIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_DEL, int32_t> NumDeletionsIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::MAP_QUALITY, uint8_t> MapQualityIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::STRAND, Strand> StrandIndexMultiRequest;
+
+template<BarcodeField field, typename ValueType>
+class BarcodeIndexRequest : public IndexRequestBase<BarcodeField, ValueType>
+{
+public:
+ BarcodeIndexRequest(const ValueType& value,
+ const CompareType& compareType = CompareType::EQUAL);
+};
+
+template<BarcodeField field, typename ValueType>
+class BarcodeIndexMultiRequest : public IndexMultiRequestBase<BarcodeField, ValueType>
+{
+public:
+ BarcodeIndexMultiRequest(const std::vector<ValueType>& values);
+};
+
+typedef BarcodeIndexRequest<BarcodeField::BC_LEFT, uint16_t> BarcodeLeftIndexRequest;
+typedef BarcodeIndexRequest<BarcodeField::BC_RIGHT, uint16_t> BarcodeRightIndexRequest;
+typedef BarcodeIndexRequest<BarcodeField::BC_QUALITY, uint8_t> BarcodeQualityIndexRequest;
+typedef BarcodeIndexRequest<BarcodeField::CONTEXT_FLAG, LocalContextFlags> ContextFlagIndexRequest;
+
+typedef BarcodeIndexMultiRequest<BarcodeField::BC_LEFT, uint16_t> BarcodeLeftIndexMultiRequest;
+typedef BarcodeIndexMultiRequest<BarcodeField::BC_RIGHT, uint16_t> BarcodeRightIndexMultiRequest;
+typedef BarcodeIndexMultiRequest<BarcodeField::BC_QUALITY, uint8_t> BarcodeQualityIndexMultiRequest;
+typedef BarcodeIndexMultiRequest<BarcodeField::CONTEXT_FLAG, LocalContextFlags> ContextFlagIndexMultiRequest;
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "internal/PbiIndex_p.inl"
+
+#endif // PBIINDEX_H
diff --git a/include/pbbam/PbiRawData.h b/include/pbbam/PbiRawData.h
new file mode 100644
index 0000000..37c7706
--- /dev/null
+++ b/include/pbbam/PbiRawData.h
@@ -0,0 +1,307 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#ifndef PBIRAWDATA_H
+#define PBIRAWDATA_H
+
+#include "pbbam/Config.h"
+#include "pbbam/PbiFile.h"
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class BamRecord;
+
+class PBBAM_EXPORT PbiRawBarcodeData
+{
+public:
+ PbiRawBarcodeData(void);
+ PbiRawBarcodeData(uint32_t numReads);
+ PbiRawBarcodeData(const PbiRawBarcodeData& other);
+ PbiRawBarcodeData(PbiRawBarcodeData&& other);
+ PbiRawBarcodeData& operator=(const PbiRawBarcodeData& other);
+ PbiRawBarcodeData& operator=(PbiRawBarcodeData&& other);
+
+public:
+ /// Maybe add barcode data for \p b, if available.
+ /// \returns true if record had barcode data
+ ///
+ bool AddRecord(const BamRecord& b);
+
+public:
+ std::vector<uint16_t> bcLeft_;
+ std::vector<uint16_t> bcRight_;
+ std::vector<uint8_t> bcQual_;
+ std::vector<uint8_t> ctxtFlag_;
+};
+
+class PBBAM_EXPORT PbiRawMappedData
+{
+public:
+ PbiRawMappedData(void);
+ PbiRawMappedData(uint32_t numReads);
+ PbiRawMappedData(const PbiRawMappedData& other);
+ PbiRawMappedData(PbiRawMappedData&& other);
+ PbiRawMappedData& operator=(const PbiRawMappedData& other);
+ PbiRawMappedData& operator=(PbiRawMappedData&& other);
+
+public:
+ /// Maybe add mapping data for \p b, if available.
+ /// \returns true if record had mapping data
+ ///
+ bool AddRecord(const BamRecord& b);
+
+public:
+ std::vector<int32_t> tId_;
+ std::vector<uint32_t> tStart_;
+ std::vector<uint32_t> tEnd_;
+ std::vector<uint32_t> aStart_;
+ std::vector<uint32_t> aEnd_;
+ std::vector<uint8_t> revStrand_;
+ std::vector<uint32_t> nM_;
+ std::vector<uint32_t> nMM_;
+ std::vector<uint8_t> mapQV_;
+};
+
+class PBBAM_EXPORT PbiReferenceEntry
+{
+public:
+ typedef uint32_t ID;
+ typedef uint32_t Row;
+
+public:
+ PbiReferenceEntry(void);
+ PbiReferenceEntry(ID id);
+ PbiReferenceEntry(const PbiReferenceEntry& other);
+ PbiReferenceEntry(PbiReferenceEntry&& other);
+ PbiReferenceEntry& operator=(const PbiReferenceEntry& other);
+ PbiReferenceEntry& operator=(PbiReferenceEntry&& other);
+
+ bool operator==(const PbiReferenceEntry& other) const
+ {
+ return tId_ == other.tId_ &&
+ beginRow_ == other.beginRow_ &&
+ endRow_ == other.endRow_;
+ }
+
+public:
+ static const ID UNMAPPED_ID;
+ static const Row UNSET_ROW;
+
+public:
+ ID tId_;
+ Row beginRow_;
+ Row endRow_;
+};
+
+class PBBAM_EXPORT PbiRawReferenceData
+{
+public:
+ PbiRawReferenceData(void);
+ PbiRawReferenceData(uint32_t numRefs);
+ PbiRawReferenceData(const PbiRawReferenceData& other);
+ PbiRawReferenceData(PbiRawReferenceData&& other);
+ PbiRawReferenceData& operator=(const PbiRawReferenceData& other);
+ PbiRawReferenceData& operator=(PbiRawReferenceData&& other);
+
+public:
+ std::vector<PbiReferenceEntry> entries_;
+};
+
+class PBBAM_EXPORT PbiRawSubreadData
+{
+public:
+ PbiRawSubreadData(void);
+ PbiRawSubreadData(uint32_t numReads);
+ PbiRawSubreadData(const PbiRawSubreadData& other);
+ PbiRawSubreadData(PbiRawSubreadData&& other);
+ PbiRawSubreadData& operator=(const PbiRawSubreadData& other);
+ PbiRawSubreadData& operator=(PbiRawSubreadData&& other);
+
+public:
+ void AddRecord(const BamRecord& b, int64_t offset);
+
+public:
+ std::vector<int32_t> rgId_;
+ std::vector<int32_t> qStart_;
+ std::vector<int32_t> qEnd_;
+ std::vector<int32_t> holeNumber_;
+ std::vector<uint16_t> readQual_;
+ std::vector<int64_t> fileOffset_;
+};
+
+class PBBAM_EXPORT PbiRawData
+{
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// Default ctor. Used in index building
+ PbiRawData(void);
+
+ /// Load raw data from \p pbiFilename.
+ ///
+ /// \param[in] pbiFilename PBI filename
+ ///
+ /// \throws if file contents cannot be loaded properly
+ ///
+ PbiRawData(const std::string& pbiFilename);
+
+ PbiRawData(const PbiRawData& other);
+ PbiRawData(PbiRawData&& other);
+ PbiRawData& operator=(const PbiRawData& other);
+ PbiRawData& operator=(PbiRawData&& other);
+ ~PbiRawData(void);
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ bool HasBarcodeData(void) const;
+ bool HasMappedData(void) const;
+ bool HasReferenceData(void) const;
+ bool HasSection(const PbiFile::Section section) const;
+
+ PbiFile::Sections FileSections(void) const;
+ uint32_t NumReads(void) const;
+ PbiFile::VersionEnum Version(void) const;
+
+ /// \}
+
+public:
+ /// \name Indexed Sections
+ /// \{
+
+ const PbiRawBarcodeData& BarcodeData(void) const;
+ const PbiRawMappedData& MappedData(void) const;
+ const PbiRawReferenceData& ReferenceData(void) const;
+ const PbiRawSubreadData& SubreadData(void) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ PbiRawData& FileSections(PbiFile::Sections sections);
+ PbiRawData& NumReads(uint32_t num);
+ PbiRawData& Version(PbiFile::VersionEnum version);
+
+ /// \}
+
+public:
+ /// \name Indexed Sections
+
+ PbiRawBarcodeData& BarcodeData(void);
+ PbiRawMappedData& MappedData(void);
+ PbiRawReferenceData& ReferenceData(void);
+ PbiRawSubreadData& SubreadData(void);
+
+ /// \}
+
+private:
+ PbiFile::VersionEnum version_;
+ PbiFile::Sections sections_;
+ uint32_t numReads_;
+ PbiRawBarcodeData barcodeData_;
+ PbiRawMappedData mappedData_;
+ PbiRawReferenceData referenceData_;
+ PbiRawSubreadData subreadData_;
+};
+
+inline const PbiRawBarcodeData& PbiRawData::BarcodeData(void) const
+{ return barcodeData_; }
+
+inline PbiRawBarcodeData& PbiRawData::BarcodeData(void)
+{ return barcodeData_; }
+
+inline PbiFile::Sections PbiRawData::FileSections(void) const
+{ return sections_; }
+
+inline PbiRawData& PbiRawData::FileSections(PbiFile::Sections sections)
+{ sections_ = sections; return *this; }
+
+inline bool PbiRawData::HasBarcodeData(void) const
+{ return HasSection(PbiFile::BARCODE); }
+
+inline bool PbiRawData::HasMappedData(void) const
+{ return HasSection(PbiFile::MAPPED); }
+
+inline bool PbiRawData::HasReferenceData(void) const
+{ return HasSection(PbiFile::REFERENCE); }
+
+inline bool PbiRawData::HasSection(const PbiFile::Section section) const
+{ return (sections_ & section) != 0; }
+
+inline uint32_t PbiRawData::NumReads(void) const
+{ return numReads_; }
+
+inline PbiRawData& PbiRawData::NumReads(uint32_t num)
+{ numReads_ = num; return *this; }
+
+inline const PbiRawMappedData& PbiRawData::MappedData(void) const
+{ return mappedData_; }
+
+inline PbiRawMappedData& PbiRawData::MappedData(void)
+{ return mappedData_; }
+
+inline const PbiRawReferenceData& PbiRawData::ReferenceData(void) const
+{ return referenceData_; }
+
+inline PbiRawReferenceData& PbiRawData::ReferenceData(void)
+{ return referenceData_; }
+
+inline const PbiRawSubreadData& PbiRawData::SubreadData(void) const
+{ return subreadData_; }
+
+inline PbiRawSubreadData& PbiRawData::SubreadData(void)
+{ return subreadData_; }
+
+inline PbiFile::VersionEnum PbiRawData::Version(void) const
+{ return version_; }
+
+inline PbiRawData& PbiRawData::Version(PbiFile::VersionEnum version)
+{ version_ = version; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIRAWDATA_H
diff --git a/include/pbbam/Position.h b/include/pbbam/Position.h
new file mode 100644
index 0000000..110d7ed
--- /dev/null
+++ b/include/pbbam/Position.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#ifndef POSITION_H
+#define POSITION_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+/// \typedef typedef int32_t PacBio::BAM::Position
+///
+/// This type refers to all genomic positions. We use signed
+/// because SAM/BAM uses the -1 value to indicate unknown, unmapped, etc.
+/// positions.
+///
+typedef int32_t Position;
+
+static const Position UnmappedPosition = Position(-1);
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // POSITION_H
diff --git a/include/pbbam/ProgramInfo.h b/include/pbbam/ProgramInfo.h
new file mode 100644
index 0000000..d1bbcfe
--- /dev/null
+++ b/include/pbbam/ProgramInfo.h
@@ -0,0 +1,186 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef PROGRAMINFO_H
+#define PROGRAMINFO_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT ProgramInfo
+{
+public:
+ /// \name Conversion & Validation
+ ///
+
+ static ProgramInfo FromSam(const std::string& sam);
+
+ static std::string ToSam(const ProgramInfo& prog);
+
+ /// \}
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ ProgramInfo(void);
+ ProgramInfo(const std::string& id);
+ ProgramInfo(const ProgramInfo& other);
+ ProgramInfo(ProgramInfo&& other);
+ ProgramInfo& operator=(const ProgramInfo& other);
+ ProgramInfo& operator=(ProgramInfo&& other);
+ ~ProgramInfo(void);
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ std::string CommandLine(void) const;
+
+ std::map<std::string, std::string> CustomTags(void) const;
+
+ std::string Description(void) const;
+
+ std::string Id(void) const;
+
+ std::string Name(void) const;
+
+ std::string PreviousProgramId(void) const;
+
+ std::string Version(void) const;
+
+ /// \}
+
+ /// \name Conversion & Validation
+ ///
+
+ bool IsValid(void) const;
+
+ std::string ToSam(void) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ ProgramInfo& CommandLine(const std::string& cmd);
+
+ ProgramInfo& CustomTags(const std::map<std::string, std::string>& custom);
+
+ ProgramInfo& Description(const std::string& description);
+
+ ProgramInfo& Id(const std::string& id);
+
+ ProgramInfo& Name(const std::string& name);
+
+ ProgramInfo& PreviousProgramId(const std::string& id);
+
+ ProgramInfo& Version(const std::string& version);
+
+ /// \}
+
+private:
+ std::string commandLine_; // CL:<CommandLine>
+ std::string description_; // DS:<Description>
+ std::string id_; // ID:<ID> * Unique ID required for valid SAM header*
+ std::string name_; // PN:<Name>
+ std::string previousProgramId_; // PP:<PreviousProgramID>
+ std::string version_; // VN:<Version>
+
+ // custom attributes
+ std::map<std::string, std::string> custom_; // tag => value
+};
+
+inline std::string ProgramInfo::CommandLine(void) const
+{ return commandLine_; }
+
+inline ProgramInfo& ProgramInfo::CommandLine(const std::string& cmd)
+{ commandLine_ = cmd; return *this; }
+
+inline std::map<std::string, std::string> ProgramInfo::CustomTags(void) const
+{ return custom_; }
+
+inline ProgramInfo& ProgramInfo::CustomTags(const std::map<std::string, std::string>& custom)
+{ custom_ = custom; return *this; }
+
+inline std::string ProgramInfo::Description(void) const
+{ return description_; }
+
+inline ProgramInfo& ProgramInfo::Description(const std::string& description)
+{ description_ = description; return *this; }
+
+inline std::string ProgramInfo::Id(void) const
+{ return id_; }
+
+inline ProgramInfo& ProgramInfo::Id(const std::string& id)
+{ id_ = id; return *this; }
+
+inline bool ProgramInfo::IsValid(void) const
+{ return !id_.empty(); }
+
+inline std::string ProgramInfo::Name(void) const
+{ return name_; }
+
+inline ProgramInfo& ProgramInfo::Name(const std::string& name)
+{ name_ = name; return *this; }
+
+inline std::string ProgramInfo::PreviousProgramId(void) const
+{ return previousProgramId_; }
+
+inline ProgramInfo& ProgramInfo::PreviousProgramId(const std::string& id)
+{ previousProgramId_ = id; return *this; }
+
+inline std::string ProgramInfo::ToSam(const ProgramInfo& prog)
+{ return prog.ToSam(); }
+
+inline std::string ProgramInfo::Version(void) const
+{ return version_; }
+
+inline ProgramInfo& ProgramInfo::Version(const std::string& version)
+{ version_ = version; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PROGRAMINFO_H
diff --git a/include/pbbam/QualityValue.h b/include/pbbam/QualityValue.h
new file mode 100644
index 0000000..7eecc12
--- /dev/null
+++ b/include/pbbam/QualityValue.h
@@ -0,0 +1,112 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef QUALITYVALUE_H
+#define QUALITYVALUE_H
+
+#include "pbbam/Config.h"
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief The QualityValue class represents a FASTQ-compatible quality value.
+///
+/// Integers are clamped to [0, 93] (corresponding to ASCII printable chars [!-~]).
+///
+/// Use the explicitly-named static method for constructing QualityValue entries from
+/// FASTQ encoding characters. Otherwise, the value will be interpreted as the actual
+/// integer value.
+///
+class PBBAM_EXPORT QualityValue
+{
+public:
+ static const uint8_t MAX;
+
+public:
+ /// Creates a QualityValue from a FASTQ encoding character.
+ static QualityValue FromFastq(const char c);
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ QualityValue(const uint8_t value = 0);
+ QualityValue(const QualityValue& other);
+ ~QualityValue(void);
+
+ /// \}
+
+public:
+ /// \returns the FASTQ encoding char for this QualityValue
+ char Fastq(void) const;
+
+ /// \returns the integer value of this QualityValue
+ operator uint8_t(void) const;
+
+private:
+ uint8_t value_;
+};
+
+inline QualityValue::QualityValue(const uint8_t value)
+ : value_(value)
+{
+ // clamp QV
+ if (value_ > QualityValue::MAX)
+ value_ = QualityValue::MAX;
+}
+
+inline QualityValue::QualityValue(const QualityValue& other)
+ : value_(other.value_)
+{ }
+
+inline QualityValue::~QualityValue(void) { }
+
+inline char QualityValue::Fastq(void) const
+{ return static_cast<char>(value_ + 33); }
+
+inline QualityValue::operator uint8_t(void) const
+{ return value_; }
+
+inline QualityValue QualityValue::FromFastq(const char c)
+{ return QualityValue(static_cast<uint8_t>(c-33)); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // QUALITYVALUE_H
diff --git a/include/pbbam/QualityValues.h b/include/pbbam/QualityValues.h
new file mode 100644
index 0000000..240b96f
--- /dev/null
+++ b/include/pbbam/QualityValues.h
@@ -0,0 +1,233 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef QUALITYVALUES_H
+#define QUALITYVALUES_H
+
+#include "pbbam/QualityValue.h"
+#include <algorithm>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief The QualityValues class represents a sequence of FASTQ-compatible
+/// quality values. See QualityValue documentation for details.
+///
+class PBBAM_EXPORT QualityValues : public std::vector<QualityValue>
+{
+public:
+ /// Creates a QualityValues collection from a FASTQ-encoded string.
+ static QualityValues FromFastq(const std::string& fastq);
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ QualityValues(void);
+ explicit QualityValues(const std::string& fastqString);
+ explicit QualityValues(const std::vector<QualityValue>& quals);
+ explicit QualityValues(const std::vector<uint8_t>& quals);
+
+ QualityValues(const std::vector<uint8_t>::const_iterator first,
+ const std::vector<uint8_t>::const_iterator last);
+ QualityValues(const QualityValues::const_iterator first,
+ const QualityValues::const_iterator last);
+
+ QualityValues(const QualityValues& other);
+ QualityValues(QualityValues&& other);
+
+ QualityValues(std::vector<QualityValue>&& quals);
+
+ QualityValues& operator=(const QualityValues& other);
+ QualityValues& operator=(QualityValues&& other);
+
+ QualityValues& operator=(const std::vector<QualityValue>& quals);
+ QualityValues& operator=(std::vector<QualityValue>&& quals);
+
+ ~QualityValues(void);
+
+ /// \}
+
+public:
+ /// \name Comparison Operators
+ /// \{
+
+ bool operator==(const std::string& other) const;
+ bool operator!=(const std::string& other) const;
+
+ /// \}
+
+public:
+ /// \name Iterators
+ /// \{
+
+ /// \returns A const_iterator to the beginning of the sequence.
+ std::vector<QualityValue>::const_iterator cbegin(void) const;
+
+ /// \returns A const_iterator to the element past the end of the sequence.
+ std::vector<QualityValue>::const_iterator cend(void) const;
+
+ /// \returns A const_iterator to the beginning of the sequence.
+ std::vector<QualityValue>::const_iterator begin(void) const;
+
+ /// \returns A const_iterator to the element past the end of the sequence.
+ std::vector<QualityValue>::const_iterator end(void) const;
+
+ /// \returns An iterator to the beginning of the sequence.
+ std::vector<QualityValue>::iterator begin(void);
+
+ /// \returns An iterator to the element past the end of the sequence.
+ std::vector<QualityValue>::iterator end(void);
+
+ /// \}
+
+public:
+ /// \returns the FASTQ-encoded string for this collection
+ std::string Fastq(void) const;
+};
+
+inline QualityValues::QualityValues(void)
+ : std::vector<QualityValue>()
+{ }
+
+inline QualityValues::QualityValues(const std::string& fastqString)
+ : std::vector<QualityValue>()
+{
+ resize(fastqString.size());
+ std::transform(fastqString.cbegin(), fastqString.cend(),
+ begin(), QualityValue::FromFastq);
+}
+
+inline QualityValues::QualityValues(const std::vector<QualityValue>& quals)
+ : std::vector<QualityValue>(quals)
+{ }
+
+inline QualityValues::QualityValues(const std::vector<uint8_t>& quals)
+ : std::vector<QualityValue>()
+{
+ resize(quals.size());
+ std::copy(quals.cbegin(), quals.cend(), begin());
+}
+
+inline QualityValues::QualityValues(const std::vector<uint8_t>::const_iterator first,
+ const std::vector<uint8_t>::const_iterator last)
+ : std::vector<QualityValue>(first, last)
+{ }
+
+inline QualityValues::QualityValues(const QualityValues::const_iterator first,
+ const QualityValues::const_iterator last)
+ : std::vector<QualityValue>()
+{
+ assign(first, last);
+}
+
+inline QualityValues::QualityValues(const QualityValues& other)
+ : std::vector<QualityValue>(other)
+{ }
+
+inline QualityValues::QualityValues(std::vector<QualityValue>&& quals)
+ : std::vector<QualityValue>(std::move(quals))
+{ }
+
+inline QualityValues::QualityValues(QualityValues&& other)
+ : std::vector<QualityValue>(std::move(other))
+{ }
+
+inline QualityValues& QualityValues::operator=(const QualityValues& other)
+{ std::vector<QualityValue>::operator=(other); return *this; }
+
+inline QualityValues& QualityValues::operator=(const std::vector<QualityValue>& quals)
+{ std::vector<QualityValue>::operator=(quals); return *this; }
+
+inline QualityValues& QualityValues::operator=(QualityValues&& other)
+{ std::vector<QualityValue>::operator=(std::move(other)); return *this; }
+
+inline QualityValues& QualityValues::operator=(std::vector<QualityValue>&& quals)
+{ std::vector<QualityValue>::operator=(std::move(quals)); return *this; }
+
+inline QualityValues::~QualityValues(void) { }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::cbegin(void) const
+{ return std::vector<QualityValue>::cbegin(); }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::cend(void) const
+{ return std::vector<QualityValue>::cend(); }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::begin(void) const
+{ return std::vector<QualityValue>::begin(); }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::end(void) const
+{ return std::vector<QualityValue>::end(); }
+
+inline std::vector<QualityValue>::iterator QualityValues::begin(void)
+{ return std::vector<QualityValue>::begin(); }
+
+inline std::vector<QualityValue>::iterator QualityValues::end(void)
+{ return std::vector<QualityValue>::end(); }
+
+inline QualityValues QualityValues::FromFastq(const std::string& fastq)
+{
+ return QualityValues(fastq);
+// QualityValues result;
+// result.resize(fastq.size());
+// std::transform(fastq.cbegin(), fastq.cend(), result.begin(), QualityValue::FromFastq);
+// return result;
+}
+
+inline std::string QualityValues::Fastq(void) const
+{
+ std::string result;
+ result.reserve(size());
+ auto iter = cbegin();
+ const auto end = cend();
+ for (; iter != end; ++iter)
+ result.push_back((*iter).Fastq());
+ return result;
+}
+
+inline bool QualityValues::operator==(const std::string& fastq) const
+{ return *this == QualityValues(fastq); }
+
+inline bool QualityValues::operator!=(const std::string& fastq) const
+{ return *this != QualityValues(fastq); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // QUALITYVALUES_H
diff --git a/include/pbbam/QueryBase.h b/include/pbbam/QueryBase.h
new file mode 100644
index 0000000..6106a4a
--- /dev/null
+++ b/include/pbbam/QueryBase.h
@@ -0,0 +1,241 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef QUERYBASE_H
+#define QUERYBASE_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamFile.h"
+
+namespace PacBio {
+namespace BAM {
+
+class QueryBase;
+
+class QueryIterator
+{
+public:
+ BamRecord& operator*(void);
+ BamRecord* operator->(void);
+ QueryIterator& operator++(void);
+ QueryIterator operator++(int);
+ bool operator==(const QueryIterator& other) const;
+ bool operator!=(const QueryIterator& other) const;
+
+ QueryIterator(void);
+ QueryIterator(QueryBase& parent);
+
+private:
+ QueryBase* query_;
+ BamRecord record_;
+ friend class QueryBase;
+};
+
+class QueryConstIterator
+{
+public:
+ const BamRecord& operator*(void) const;
+ const BamRecord* operator->(void) const;
+ QueryConstIterator& operator++(void);
+ QueryConstIterator operator++(int);
+ bool operator==(const QueryConstIterator& other) const;
+ bool operator!=(const QueryConstIterator& other) const;
+
+ QueryConstIterator(void);
+ QueryConstIterator(const QueryBase& parent);
+
+private:
+ QueryBase* query_;
+ BamRecord record_;
+ friend class QueryBase;
+};
+
+/// This class provides the base functionality and iterators for querying BAM files.
+class PBBAM_EXPORT QueryBase {
+
+public:
+ typedef QueryIterator iterator;
+ typedef QueryConstIterator const_iterator;
+
+public:
+ virtual ~QueryBase(void);
+
+public:
+
+ /// \name Iterators
+ /// \{
+
+ /// \returns an iterator to the beginning of the query results.
+ QueryBase::iterator begin(void);
+
+ /// \returns a const_iterator to the beginning of the query results.
+ QueryBase::const_iterator begin(void) const;
+
+ /// \returns a const_iterator to the beginning of the query results.
+ QueryBase::const_iterator cbegin(void) const;
+
+ /// \returns an iterator marking the end of query results.
+ QueryBase::iterator end(void);
+
+ /// \returns a const_iterator marking the end of query results.
+ QueryBase::const_iterator end(void) const;
+
+ /// \returns a const_iterator marking the end of query results.
+ QueryBase::const_iterator cend(void) const;
+
+ /// \}
+
+protected:
+ QueryBase(const BamFile& file);
+
+ /// Primary method for iterating through a query. Derived classes will implement this
+ /// method to return
+ virtual bool GetNext(BamRecord& x) =0;
+
+protected:
+ const BamFile& file_;
+
+ friend class QueryIterator;
+ friend class QueryConstIterator;
+};
+
+inline QueryBase::iterator QueryBase::begin(void)
+{ return QueryBase::iterator(*this); }
+
+inline QueryBase::const_iterator QueryBase::begin(void) const
+{ return QueryBase::const_iterator(*this); }
+
+inline QueryBase::const_iterator QueryBase::cbegin(void) const
+{ return QueryBase::const_iterator(*this); }
+
+inline QueryBase::iterator QueryBase::end(void)
+{ return QueryBase::iterator(); }
+
+inline QueryBase::const_iterator QueryBase::end(void) const
+{ return QueryBase::const_iterator(); }
+
+inline QueryBase::const_iterator QueryBase::cend(void) const
+{ return QueryBase::const_iterator(); }
+
+// ---------------
+// QueryIterator
+// ---------------
+
+inline QueryIterator::QueryIterator(void)
+ : query_(0)
+{ }
+
+inline QueryIterator::QueryIterator(QueryBase& parent)
+ : query_(&parent)
+ , record_(parent.file_.Header())
+{
+ if (!(query_->GetNext(record_)))
+ query_ = 0;
+}
+
+inline BamRecord& QueryIterator::operator*(void)
+{ return record_; }
+
+inline BamRecord* QueryIterator::operator->(void)
+{ return &(operator*()); }
+
+inline QueryIterator& QueryIterator::operator++(void)
+{
+ if (!(query_->GetNext(record_)))
+ query_ = 0;
+ return *this;
+}
+
+inline QueryIterator QueryIterator::operator++(int)
+{
+ QueryIterator result(*this);
+ ++(*this);
+ return result;
+}
+
+inline bool QueryIterator::operator==(const QueryIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool QueryIterator::operator!=(const QueryIterator& other) const
+{ return !(*this == other); }
+
+// --------------------
+// QueryConstIterator
+// --------------------
+
+inline const BamRecord& QueryConstIterator::operator*(void) const
+{ return record_; }
+
+inline const BamRecord* QueryConstIterator::operator->(void) const
+{ return &(operator*()); }
+
+inline QueryConstIterator& QueryConstIterator::operator++(void)
+{
+ if (!(query_->GetNext(record_)))
+ query_ = 0;
+ return *this;
+}
+
+inline QueryConstIterator QueryConstIterator::operator++(int)
+{
+ QueryConstIterator result(*this);
+ ++(*this);
+ return result;
+}
+
+inline bool QueryConstIterator::operator==(const QueryConstIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool QueryConstIterator::operator!=(const QueryConstIterator& other) const
+{ return !(*this == other); }
+
+inline QueryConstIterator::QueryConstIterator(void)
+ : query_(0)
+{ }
+
+inline QueryConstIterator::QueryConstIterator(const QueryBase& parent)
+ : record_(parent.file_.Header())
+{
+ query_ = const_cast<QueryBase*>(&parent);
+ if (!(query_->GetNext(record_)))
+ query_ = 0;
+}
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // QUERYBASE_H
diff --git a/include/pbbam/ReadGroupInfo.h b/include/pbbam/ReadGroupInfo.h
new file mode 100644
index 0000000..86372ee
--- /dev/null
+++ b/include/pbbam/ReadGroupInfo.h
@@ -0,0 +1,392 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef READGROUPINFO_H
+#define READGROUPINFO_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+enum class BaseFeature
+{
+ DELETION_QV
+ , DELETION_TAG
+ , INSERTION_QV
+ , MERGE_QV
+ , SUBSTITUTION_QV
+ , SUBSTITUTION_TAG
+ , IPD
+ , PULSE_WIDTH
+ , PKMID
+ , PKMEAN
+ , LABEL
+ , LABEL_QV
+ , ALT_LABEL
+ , ALT_LABEL_QV
+ , PULSE_MERGE_QV
+ , PULSE_CALL
+ , PRE_PULSE_FRAMES
+ , PULSE_CALL_WIDTH
+};
+
+enum class FrameCodec
+{
+ RAW
+ , V1
+};
+
+class PBBAM_EXPORT ReadGroupInfo
+{
+public:
+ /// \name Conversion & Validation
+ ///
+
+ static ReadGroupInfo FromSam(const std::string& sam);
+
+ static std::string ToSam(const ReadGroupInfo& rg);
+
+ /// \}
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ ReadGroupInfo(void);
+ ReadGroupInfo(const std::string& id);
+ ReadGroupInfo(const std::string& movieName, const std::string& readType);
+ ReadGroupInfo(const ReadGroupInfo& other);
+ ReadGroupInfo(ReadGroupInfo&& other);
+ ReadGroupInfo& operator=(const ReadGroupInfo& other);
+ ReadGroupInfo& operator=(ReadGroupInfo&& other);
+ ~ReadGroupInfo(void);
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ const std::string& BasecallerVersion(void) const;
+
+ bool HasBaseFeature(const BaseFeature& feature) const;
+
+ std::string BaseFeatureTag(const BaseFeature& feature) const;
+
+ std::string BindingKit(void) const;
+
+ bool Control(void) const;
+
+ std::map<std::string, std::string> CustomTags(void) const;
+
+ std::string Date(void) const;
+
+ std::string FlowOrder(void) const;
+
+ std::string FrameRateHz(void) const;
+
+ std::string Id(void) const;
+
+ FrameCodec IpdCodec(void) const;
+
+ std::string KeySequence(void) const;
+
+ std::string Library(void) const;
+
+ std::string MovieName(void) const;
+
+ std::string Platform(void) const;
+
+ std::string PredictedInsertSize(void) const;
+
+ std::string Programs(void) const;
+
+ FrameCodec PulseWidthCodec(void) const;
+
+ std::string ReadType(void) const;
+
+ std::string Sample(void) const;
+
+ std::string SequencingCenter(void) const;
+
+ std::string SequencingKit(void) const;
+
+ /// \}
+
+ /// \name Conversion & Validation
+ /// \{
+
+ bool IsValid(void) const;
+
+ std::string ToSam(void) const;
+
+ /// \}
+
+ /// \name Comparison
+ /// \{
+
+ bool operator==(const ReadGroupInfo& other) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ ReadGroupInfo& BasecallerVersion(const std::string& versionNumber);
+
+ ReadGroupInfo& BaseFeatureTag(const BaseFeature& feature,
+ const std::string& tag);
+
+ ReadGroupInfo& BindingKit(const std::string& kitNumber);
+
+ ReadGroupInfo& Control(const bool ctrl);
+
+ ReadGroupInfo& CustomTags(const std::map<std::string, std::string>& custom);
+
+ ReadGroupInfo& Date(const std::string& date);
+
+ ReadGroupInfo& FlowOrder(const std::string& order);
+
+ ReadGroupInfo& FrameRateHz(const std::string& frameRateHz);
+
+ ReadGroupInfo& Id(const std::string& id);
+
+ ReadGroupInfo& Id(const std::string& movieName, const std::string& readType);
+
+ ReadGroupInfo& IpdCodec(const FrameCodec& codec, const std::string& tag = std::string());
+
+ ReadGroupInfo& KeySequence(const std::string& sequence);
+
+ ReadGroupInfo& Library(const std::string& library);
+
+ ReadGroupInfo& MovieName(const std::string& id);
+
+ ReadGroupInfo& PredictedInsertSize(const std::string& size);
+
+ ReadGroupInfo& Programs(const std::string& programs);
+
+ ReadGroupInfo& PulseWidthCodec(const FrameCodec& codec, const std::string& tag = std::string());
+
+ ReadGroupInfo& ReadType(const std::string& type);
+
+ ReadGroupInfo& Sample(const std::string& sample);
+
+ ReadGroupInfo& SequencingCenter(const std::string& center);
+
+ ReadGroupInfo& SequencingKit(const std::string& kitNumber);
+
+ /// \}
+
+private:
+ std::string id_; // ID * Unique ID required for valid SAM/BAM header *
+ std::string sequencingCenter_; // CN
+ std::string date_; // DT * (ISO 8601) *
+ std::string flowOrder_; // FO
+ std::string keySequence_; // KS
+ std::string library_; // LB
+ std::string programs_; // PG
+ std::string predictedInsertSize_; // PI
+ std::string movieName_; // PU * more explicit, in place of "platform unit" *
+ std::string sample_; // SM
+
+ // DS:<Description> components
+ std::string readType_;
+ std::string bindingKit_;
+ std::string sequencingKit_;
+ std::string basecallerVersion_;
+ std::string frameRateHz_;
+ bool control_ = false;
+ FrameCodec ipdCodec_;
+ FrameCodec pulseWidthCodec_;
+ std::map<BaseFeature, std::string> features_;
+
+ // custom attributes
+ std::map<std::string, std::string> custom_; // tag => value
+
+private:
+ std::string EncodeSamDescription(void) const;
+ void DecodeSamDescription(const std::string& description);
+};
+
+PBBAM_EXPORT
+std::string MakeReadGroupId(const std::string& movieName,
+ const std::string& readType);
+
+inline const std::string& ReadGroupInfo::BasecallerVersion(void) const
+{ return basecallerVersion_; }
+
+inline ReadGroupInfo& ReadGroupInfo::BasecallerVersion(const std::string& versionNumber)
+{ basecallerVersion_ = versionNumber; return *this; }
+
+inline std::string ReadGroupInfo::BaseFeatureTag(const BaseFeature& feature) const
+{
+ const auto iter = features_.find(feature);
+ if (iter == features_.end())
+ return std::string();
+ return iter->second;
+}
+
+inline ReadGroupInfo& ReadGroupInfo::BaseFeatureTag(const BaseFeature& feature,
+ const std::string& tag)
+{ features_[feature] = tag; return *this; }
+
+inline std::string ReadGroupInfo::BindingKit(void) const
+{ return bindingKit_; }
+
+inline ReadGroupInfo& ReadGroupInfo::BindingKit(const std::string& kitNumber)
+{ bindingKit_ = kitNumber; return *this; }
+
+inline bool ReadGroupInfo::Control(void) const
+{ return control_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Control(const bool ctrl)
+{ control_ = ctrl; return *this; }
+
+inline std::map<std::string, std::string> ReadGroupInfo::CustomTags(void) const
+{ return custom_; }
+
+inline ReadGroupInfo& ReadGroupInfo::CustomTags(const std::map<std::string, std::string>& custom)
+{ custom_ = custom; return *this; }
+
+inline std::string ReadGroupInfo::Date(void) const
+{ return date_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Date(const std::string& date)
+{ date_ = date; return *this; }
+
+inline std::string ReadGroupInfo::FlowOrder(void) const
+{ return flowOrder_; }
+
+inline ReadGroupInfo& ReadGroupInfo::FlowOrder(const std::string& order)
+{ flowOrder_ = order; return *this; }
+
+inline std::string ReadGroupInfo::FrameRateHz(void) const
+{ return frameRateHz_; }
+
+inline ReadGroupInfo& ReadGroupInfo::FrameRateHz(const std::string& frameRateHz)
+{ frameRateHz_ = frameRateHz; return *this; }
+
+inline bool ReadGroupInfo::HasBaseFeature(const BaseFeature& feature) const
+{ return features_.find(feature) != features_.end(); }
+
+inline std::string ReadGroupInfo::Id(void) const
+{ return id_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Id(const std::string& id)
+{ id_ = id; return *this; }
+
+inline ReadGroupInfo& ReadGroupInfo::Id(const std::string& movieName,
+ const std::string& readType)
+{ id_ = MakeReadGroupId(movieName, readType); return *this; }
+
+inline FrameCodec ReadGroupInfo::IpdCodec(void) const
+{ return ipdCodec_; }
+
+inline bool ReadGroupInfo::IsValid(void) const
+{ return !id_.empty(); }
+
+inline std::string ReadGroupInfo::KeySequence(void) const
+{ return keySequence_; }
+
+inline ReadGroupInfo& ReadGroupInfo::KeySequence(const std::string& sequence)
+{ keySequence_ = sequence; return *this; }
+
+inline std::string ReadGroupInfo::Library(void) const
+{ return library_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Library(const std::string& library)
+{ library_ = library; return *this; }
+
+inline std::string ReadGroupInfo::MovieName(void) const
+{ return movieName_; }
+
+inline ReadGroupInfo& ReadGroupInfo::MovieName(const std::string& movieName)
+{ movieName_ = movieName; return *this; }
+
+inline std::string ReadGroupInfo::Platform(void) const
+{ return std::string("PACBIO"); }
+
+inline std::string ReadGroupInfo::PredictedInsertSize(void) const
+{ return predictedInsertSize_; }
+
+inline ReadGroupInfo& ReadGroupInfo::PredictedInsertSize(const std::string& size)
+{ predictedInsertSize_ = size; return *this; }
+
+inline std::string ReadGroupInfo::Programs(void) const
+{ return programs_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Programs(const std::string& programs)
+{ programs_ = programs; return *this; }
+
+inline FrameCodec ReadGroupInfo::PulseWidthCodec(void) const
+{ return pulseWidthCodec_; }
+
+inline std::string ReadGroupInfo::ReadType(void) const
+{ return readType_; }
+
+inline ReadGroupInfo& ReadGroupInfo::ReadType(const std::string& type)
+{ readType_ = type; return *this; }
+
+inline std::string ReadGroupInfo::Sample(void) const
+{ return sample_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Sample(const std::string& sample)
+{ sample_ = sample; return *this; }
+
+inline std::string ReadGroupInfo::SequencingCenter(void) const
+{ return sequencingCenter_; }
+
+inline ReadGroupInfo& ReadGroupInfo::SequencingCenter(const std::string& center)
+{ sequencingCenter_ = center; return *this; }
+
+inline std::string ReadGroupInfo::SequencingKit(void) const
+{ return sequencingKit_; }
+
+inline ReadGroupInfo& ReadGroupInfo::SequencingKit(const std::string& kitNumber)
+{ sequencingKit_ = kitNumber; return *this; }
+
+inline std::string ReadGroupInfo::ToSam(const ReadGroupInfo& rg)
+{ return rg.ToSam(); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // READGROUPINFO_H
diff --git a/include/pbbam/SamTagCodec.h b/include/pbbam/SamTagCodec.h
new file mode 100644
index 0000000..b0b6796
--- /dev/null
+++ b/include/pbbam/SamTagCodec.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef SAMTAGCODEC_H
+#define SAMTAGCODEC_H
+
+#include "pbbam/Config.h"
+#include "pbbam/TagCollection.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT SamTagCodec
+{
+public:
+ static TagCollection Decode(const std::string& tagString);
+ static std::string Encode(const PacBio::BAM::TagCollection& tags);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SAMTAGCODEC_H
diff --git a/include/pbbam/SequenceInfo.h b/include/pbbam/SequenceInfo.h
new file mode 100644
index 0000000..0cf9d04
--- /dev/null
+++ b/include/pbbam/SequenceInfo.h
@@ -0,0 +1,182 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef SEQUENCEINFO_H
+#define SEQUENCEINFO_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT SequenceInfo
+{
+public:
+ /// \name Conversion & Validation
+ ///
+
+ static SequenceInfo FromSam(const std::string& sam);
+
+ static std::string ToSam(const SequenceInfo& seq);
+
+ /// \}
+
+public:
+ /// \name Constructors & Related Methods
+ /// \{
+
+ SequenceInfo(void);
+ SequenceInfo(const std::string& name, const std::string& length = "0");
+ SequenceInfo(const SequenceInfo& other);
+ SequenceInfo(SequenceInfo&& other);
+ SequenceInfo& operator=(const SequenceInfo& other);
+ SequenceInfo& operator=(SequenceInfo&& other);
+ ~SequenceInfo(void);
+
+ /// \}
+
+public:
+ /// \name Attributes
+ /// \{
+
+ std::string AssemblyId(void) const;
+
+ std::string Checksum(void) const;
+
+ std::map<std::string, std::string> CustomTags(void) const;
+
+ std::string Length(void) const;
+
+ std::string Name(void) const;
+
+ std::string Species(void) const;
+
+ std::string Uri(void) const;
+
+ /// \}
+
+ /// \name Conversion & Validation
+ ///
+
+ bool IsValid(void) const;
+
+ std::string ToSam(void) const;
+
+ /// \}
+
+public:
+ /// \name Attributes
+
+ SequenceInfo& AssemblyId(const std::string& id);
+
+ SequenceInfo& Checksum(const std::string& checksum);
+
+ SequenceInfo& CustomTags(const std::map<std::string, std::string>& custom);
+
+ SequenceInfo& Length(const std::string& length);
+
+ SequenceInfo& Name(const std::string& name);
+
+ SequenceInfo& Species(const std::string& species);
+
+ SequenceInfo& Uri(const std::string& uri);
+
+ /// \}
+
+private:
+ std::string name_; // SN:<Name> * Unique Name required for valid SAM header*
+ std::string length_; // LN:<Length> * [0 - 2^31-1]
+ std::string assemblyId_; // AS:<AssemblyId>
+ std::string checksum_; // M5:<Checksum>
+ std::string species_; // SP:<Species>
+ std::string uri_; // UR:<URI>
+
+ // custom attributes
+ std::map<std::string, std::string> custom_; // tag => value
+};
+
+inline std::string SequenceInfo::AssemblyId(void) const
+{ return assemblyId_; }
+
+inline SequenceInfo& SequenceInfo::AssemblyId(const std::string& id)
+{ assemblyId_ = id; return *this; }
+
+inline std::string SequenceInfo::Checksum(void) const
+{ return checksum_; }
+
+inline SequenceInfo& SequenceInfo::Checksum(const std::string& checksum)
+{ checksum_ = checksum; return *this; }
+
+inline std::map<std::string, std::string> SequenceInfo::CustomTags(void) const
+{ return custom_; }
+
+inline SequenceInfo& SequenceInfo::CustomTags(const std::map<std::string, std::string>& custom)
+{ custom_ = custom; return *this; }
+
+inline std::string SequenceInfo::Length(void) const
+{ return length_; }
+
+inline SequenceInfo& SequenceInfo::Length(const std::string& length)
+{ length_ = length; return *this; }
+
+inline std::string SequenceInfo::Name(void) const
+{ return name_; }
+
+inline SequenceInfo& SequenceInfo::Name(const std::string& name)
+{ name_ = name; return *this; }
+
+inline std::string SequenceInfo::Species(void) const
+{ return species_; }
+
+inline SequenceInfo& SequenceInfo::Species(const std::string& species)
+{ species_ = species; return *this; }
+
+inline std::string SequenceInfo::ToSam(const SequenceInfo& seq)
+{ return seq.ToSam(); }
+
+inline std::string SequenceInfo::Uri(void) const
+{ return uri_; }
+
+inline SequenceInfo& SequenceInfo::Uri(const std::string& uri)
+{ uri_ = uri; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SEQUENCEINFO_H
diff --git a/include/pbbam/Strand.h b/include/pbbam/Strand.h
new file mode 100644
index 0000000..aa8535f
--- /dev/null
+++ b/include/pbbam/Strand.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef STRAND_H
+#define STRAND_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+enum class Strand
+{
+ FORWARD
+ , REVERSE
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // STRAND_H
diff --git a/include/pbbam/Tag.h b/include/pbbam/Tag.h
new file mode 100644
index 0000000..c7f3d94
--- /dev/null
+++ b/include/pbbam/Tag.h
@@ -0,0 +1,362 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef TAG_H
+#define TAG_H
+
+#include "pbbam/Config.h"
+#include <boost/variant.hpp>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief Provides information on the exact (C++) data type held by a Tag.
+enum class TagDataType
+{
+ INVALID = 0 ///< boost::blank
+ , INT8 ///< int8_t
+ , UINT8 ///< uint8_t
+ , INT16 ///< int16_t
+ , UINT16 ///< uint16_t
+ , INT32 = 5 ///< int32_t
+ , UINT32 ///< uint32_t
+ , FLOAT ///< float
+ , STRING ///< std::string
+ , INT8_ARRAY ///< std::vector<int8_t>
+ , UINT8_ARRAY = 10 ///< std::vector<uint8_t>
+ , INT16_ARRAY ///< std::vector<int16_t>
+ , UINT16_ARRAY ///< std::vector<uint16_t>
+ , INT32_ARRAY ///< std::vector<int32_t>
+ , UINT32_ARRAY ///< std::vector<uint32_t>
+ , FLOAT_ARRAY = 15 ///< std::vector<float>
+};
+
+/// \brief Provides additional instructions on interpreting the tag's value.
+///
+/// Some C++ data types (e.g. std::string) may represent more than one BAM tag type
+/// ('H' vs 'Z'). These modifiers indicate how to properly interpret those shared
+/// data types.
+enum class TagModifier
+{
+ /// \brief This indicates the tag has no modifiers set.
+ NONE = 0,
+
+ /// \brief This modifier marks an integer as ASCII.
+ ///
+ /// SAM/BAM has the concept of an ASCII character that is distinct from an 8-bit
+ /// integer. However, there is no such pure separation in C++
+ /// (int8_t/uint8_t are likely implemented as typedefs around char/unsigned char).
+ /// Thus this modifier can be used to indicate a tag's integer data should be
+ /// interpreted as a printable, ASCII character.
+ ASCII_CHAR,
+
+ /// \brief This modifier marks std::string data as "hex string", rather than a regular string.
+ ///
+ /// SAM/BAM has a distinction between regular strings and "Hex format" strings.
+ /// However, they are both manipulated in C++ via std::string. Thus this modifier
+ /// can be used to indicate that a tag's string data should be interpreted as
+ /// "Hex format" rather than a regular, literal string.
+ HEX_STRING
+};
+
+// Inspired by (but greatly simplified & modified from) the boost::variant
+// wrapper approach taken by DynamicCpp (https://code.google.com/p/dynamic-cpp)
+class PBBAM_EXPORT Tag
+{
+public:
+
+ /// \name Constructors & Related Methods
+ /// \{
+
+ /// Constructs a null tag.
+ /// \sa IsNull()
+ Tag(void);
+
+ Tag(int8_t value);
+ Tag(uint8_t value);
+ Tag(int16_t value);
+ Tag(uint16_t value);
+ Tag(int32_t value);
+ Tag(uint32_t value);
+ Tag(float value);
+ Tag(const std::string& value);
+ Tag(const std::vector<int8_t>& value);
+ Tag(const std::vector<uint8_t>& value);
+ Tag(const std::vector<int16_t>& value);
+ Tag(const std::vector<uint16_t>& value);
+ Tag(const std::vector<int32_t>& value);
+ Tag(const std::vector<uint32_t>& value);
+ Tag(const std::vector<float>& value);
+
+ Tag(const Tag& other);
+ Tag(Tag&& other);
+
+ ~Tag(void);
+
+ Tag& operator=(boost::blank value);
+ Tag& operator=(int8_t value);
+ Tag& operator=(uint8_t value);
+ Tag& operator=(int16_t value);
+ Tag& operator=(uint16_t value);
+ Tag& operator=(int32_t value);
+ Tag& operator=(uint32_t value);
+ Tag& operator=(float value);
+ Tag& operator=(const std::string& value);
+ Tag& operator=(const std::vector<int8_t>& value);
+ Tag& operator=(const std::vector<uint8_t>& value);
+ Tag& operator=(const std::vector<int16_t>& value);
+ Tag& operator=(const std::vector<uint16_t>& value);
+ Tag& operator=(const std::vector<int32_t>& value);
+ Tag& operator=(const std::vector<uint32_t>& value);
+ Tag& operator=(const std::vector<float>& value);
+ Tag& operator=(const Tag& other);
+ Tag& operator=(Tag&& other);
+
+ bool operator== (const Tag& other) const;
+ bool operator!= (const Tag& other) const;
+
+ /// \}
+
+public:
+ /// \name Data Conversion & Validation
+ /// \{
+
+ /// Converts the tag value to an ASCII character
+ ///
+ /// Tag must hold an integer type, within the valid ASCII range [33-127].
+ ///
+ /// \returns ASCII character if valid
+ /// \throws if not ASCII-compatible
+ char ToAscii(void) const;
+
+ /// \returns tag data as signed 8-bit (casting if needed)
+ /// \throws if not integral data, or out of valid range
+ int8_t ToInt8(void) const;
+
+ /// \returns tag data as unsigned 8-bit (casting if needed)
+ /// \throws if not integral data, or out of valid range
+ uint8_t ToUInt8(void) const;
+
+ /// \returns tag data as signed 16-bit (casting if needed)
+ /// \throws if not integral data, or out of valid range
+ int16_t ToInt16(void) const;
+
+ /// \returns tag data as unsigned 16-bit (casting if needed)
+ /// \throws if not integral data, or out of valid range
+ uint16_t ToUInt16(void) const;
+
+ /// \returns tag data as signed 32-bit (casting if needed)
+ /// \throws if not integral data, or out of valid range
+ int32_t ToInt32(void) const;
+
+ /// \returns tag data as unsigned 32-bit (casting if needed)
+ /// \throws if not integral data, or out of valid range
+ uint32_t ToUInt32(void) const;
+
+ /// \returns tag data as float
+ /// \throws if tag does not contain a value of explicit type: float
+ float ToFloat(void) const;
+
+ /// \returns tag data as std::string
+ /// \throws if tag does not contain a value of explicit type: std::string
+ std::string ToString(void) const;
+
+ /// \returns tag data as std::vector<int8_t>
+ /// \throws if tag does not contain a value of explicit type: std::vector<int8_t>
+ std::vector<int8_t> ToInt8Array(void) const;
+
+ /// \returns tag data as std::vector<uint8_t>
+ /// \throws if tag does not contain a value of explicit type: std::vector<uint8_t>
+ std::vector<uint8_t> ToUInt8Array(void) const;
+
+ /// \returns tag data as std::vector<int16_t>
+ /// \throws if tag does not contain a value of explicit type: std::vector<int16_t>
+ std::vector<int16_t> ToInt16Array(void) const;
+
+ /// \returns tag data as std::vector<uint16_t>
+ /// \throws if tag does not contain a value of explicit type: std::vector<uint16_t>
+ std::vector<uint16_t> ToUInt16Array(void) const;
+
+ /// \returns tag data as std::vector<int32_t>
+ /// \throws if tag does not contain a value of explicit type: std::vector<int32_t>
+ std::vector<int32_t> ToInt32Array(void) const;
+
+ /// \returns tag data as std::vector<uint32_t>
+ /// \throws if tag does not contain a value of explicit type: std::vector<uint32_t>
+ std::vector<uint32_t> ToUInt32Array(void) const;
+
+ /// \returns tag data as std::vector<float>
+ /// \throws if tag does not contain a value of explicit type: std::vector<float>
+ std::vector<float> ToFloatArray(void) const;
+
+ /// \}
+
+public:
+
+ /// \name Data Conversion & Validation
+ ///
+
+ /// \returns true if tag is null (e.g. default-constructed)
+ bool IsNull(void) const;
+
+ /// \returns true if tag contains a value of type: int8_t
+ bool IsInt8(void) const;
+
+ /// \returns true if tag contains a value of type: uint8_t
+ bool IsUInt8(void) const;
+
+ /// \returns true if tag contains a value of type: int16_t
+ bool IsInt16(void) const;
+
+ /// \returns true if tag contains a value of type: uint16_t
+ bool IsUInt16(void) const;
+
+ /// \returns true if tag contains a value of type: int32_t
+ bool IsInt32(void) const;
+
+ /// \returns true if tag contains a value of type: uint32_t
+ bool IsUInt32(void) const;
+
+ /// \returns true if tag contains a value of type: float
+ bool IsFloat(void) const;
+
+ /// \returns true if tag contains a value of type: std::string
+ bool IsString(void) const;
+
+ /// \returns true if tag contains a value of type: std::string \b AND has a TagModifier of HEX_STRING
+ bool IsHexString(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<int8_t>
+ bool IsInt8Array(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<uint8_t>
+ bool IsUInt8Array(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<int16_t>
+ bool IsInt16Array(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<uint16_t>
+ bool IsUInt16Array(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<int32_t>
+ bool IsInt32Array(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<uint32_t>
+ bool IsUInt32Array(void) const;
+
+ /// \returns true if tag contains a value of type: std::vector<float>
+ bool IsFloatArray(void) const;
+
+ /// \returns true if tag contains a value with any signed integer type
+ bool IsSignedInt(void) const;
+
+ /// \returns true if tag contains a value with any unsigned integer type
+ bool IsUnsignedInt(void) const;
+
+ /// \returns true if tag contains a value with any integer type
+ bool IsIntegral(void) const;
+
+ /// \returns true if tag contains a value with any integer or float type
+ bool IsNumeric(void) const;
+
+ /// \returns true if tag contains a vector containing signed integers
+ bool IsSignedArray(void) const;
+
+ /// \returns true if tag contains a vector containing unsigned integers
+ bool IsUnsignedArray(void) const;
+
+ /// \returns true if tag contains a vector containing integers
+ bool IsIntegralArray(void) const;
+
+ /// \returns true if tag contains a vector (integers or floats)
+ bool IsArray(void) const;
+
+ /// \}
+
+public:
+ /// \name Type & Modifier Attributes
+ /// \{
+
+ /// \returns enum value for current tag data
+ TagDataType Type(void) const;
+
+ /// \returns printable type name for current tag data
+ std::string Typename(void) const;
+
+ /// \returns true if tag data modifier \p m is set
+ bool HasModifier(const TagModifier m) const;
+
+ /// \returns current tag data modifier
+ TagModifier Modifier(void) const;
+
+ /// Sets tag data modifier
+ /// \returns reference to this tag
+ Tag& Modifier(const TagModifier m);
+
+ /// \}
+
+private :
+ // NOTE - keep this synced with TagDataType enum ordering
+ typedef boost::variant<boost::blank, // <-- default constructor creates variant of this type
+ int8_t,
+ uint8_t,
+ int16_t,
+ uint16_t,
+ int32_t,
+ uint32_t,
+ float,
+ std::string,
+ std::vector<int8_t>,
+ std::vector<uint8_t>,
+ std::vector<int16_t>,
+ std::vector<uint16_t>,
+ std::vector<int32_t>,
+ std::vector<uint32_t>,
+ std::vector<float> > var_t;
+
+ var_t data_;
+ TagModifier modifier_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "internal/Tag.inl"
+
+#endif // TAG_H
diff --git a/include/pbbam/TagCollection.h b/include/pbbam/TagCollection.h
new file mode 100644
index 0000000..42b4018
--- /dev/null
+++ b/include/pbbam/TagCollection.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef TAGCOLLECTION_H
+#define TAGCOLLECTION_H
+
+#include "pbbam/Config.h"
+#include "pbbam/Tag.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT TagCollection : public std::map<std::string, Tag>
+{
+public:
+ bool Contains(const std::string& name) const;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // TAGCOLLECTION_H
diff --git a/include/pbbam/UnmappedReadsQuery.h b/include/pbbam/UnmappedReadsQuery.h
new file mode 100644
index 0000000..1623dc9
--- /dev/null
+++ b/include/pbbam/UnmappedReadsQuery.h
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef UNMAPPEDREADSQUERY_H
+#define UNMAPPEDREADSQUERY_H
+
+// TODO: Not yet implemented.
+// Can't get bam_itr_queryi(idx, HTS_IDX_NOCOOR, -1, -1) to work reliably at the moment.
+
+//#include "pbbam/QueryBase.h"
+//#include <string>
+
+//namespace PacBio {
+//namespace BAM {
+
+//class BamFile;
+
+//class PBBAM_EXPORT UnmappedReadsQuery : public QueryBase
+//{
+//public:
+// UnmappedReadsQuery(const BamFile& file);
+
+//protected:
+// bool GetNext(BamRecord& record);
+
+//private:
+// std::shared_ptr<samFile> file_;
+// std::shared_ptr<bam_hdr_t> header_;
+// std::shared_ptr<hts_idx_t> index_;
+// std::shared_ptr<hts_itr_t> iterator_;
+//};
+
+//} // namespace BAM
+//} // namspace PacBio
+
+#endif // UNMAPPEDREADSQUERY_H
diff --git a/include/pbbam/ZmwGroupQuery.h b/include/pbbam/ZmwGroupQuery.h
new file mode 100644
index 0000000..8b88113
--- /dev/null
+++ b/include/pbbam/ZmwGroupQuery.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef ZMWGROUPQUERY_H
+#define ZMWGROUPQUERY_H
+
+#include "pbbam/Config.h"
+#include "pbbam/internal/QueryBase.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+//namespace staging {
+
+class PBBAM_EXPORT ZmwGroupQuery : public internal::IGroupQuery
+{
+public:
+ ZmwGroupQuery(const DataSet& dataset);
+ ZmwGroupQuery(const std::vector<int32_t>& zmwWhitelist,
+ const DataSet& dataset);
+
+protected:
+ FileIterPtr CreateIterator(const BamFile& file);
+
+private:
+ std::vector<int> whitelist_;
+};
+
+//} // namespace staging
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ZMWGROUPQUERY_H
diff --git a/include/pbbam/ZmwQuery.h b/include/pbbam/ZmwQuery.h
new file mode 100644
index 0000000..fdd1d1d
--- /dev/null
+++ b/include/pbbam/ZmwQuery.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef ZMWQUERY_H
+#define ZMWQUERY_H
+
+#include "pbbam/Config.h"
+#include "pbbam/internal/QueryBase.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+//namespace staging {
+
+class PBBAM_EXPORT ZmwQuery : public internal::IQuery
+{
+public:
+ ZmwQuery(const std::vector<int32_t>& zmwWhitelist,
+ const DataSet& dataset);
+
+protected:
+ FileIterPtr CreateIterator(const BamFile& bamFile);
+
+private:
+ std::vector<int> whitelist_;
+};
+
+//} // namespace staging
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ZMWQUERY_H
diff --git a/include/pbbam/internal/BamRecordSort.h b/include/pbbam/internal/BamRecordSort.h
new file mode 100644
index 0000000..53dab05
--- /dev/null
+++ b/include/pbbam/internal/BamRecordSort.h
@@ -0,0 +1,138 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORDSORT_H
+#define BAMRECORDSORT_H
+
+#include "pbbam/BamRecord.h"
+#include <functional>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+enum class SortOrder {
+ Ascending = 0
+ , Descending
+};
+
+template<typename ElemType>
+inline bool sort_helper(const SortOrder& order,
+ const ElemType& lhs,
+ const ElemType& rhs)
+{
+ switch ( order ) {
+ case SortOrder::Ascending : { std::less<ElemType> comp; return comp(lhs, rhs); }
+ case SortOrder::Descending : { std::greater<ElemType> comp; return comp(lhs, rhs); }
+ default :
+ assert(false);
+ }
+ return false; // <-- unreachable
+}
+
+typedef std::binary_function<BamRecord, BamRecord, bool> BamRecordSortBase;
+
+struct Unsorted : public BamRecordSortBase
+{
+public:
+ Unsorted(const SortOrder& order = SortOrder::Ascending)
+ { (void)order; }
+
+ bool operator()(const BamRecord& lhs, const BamRecord& rhs)
+ { (void)lhs; (void)rhs; return false; }
+};
+
+struct ByQName : public BamRecordSortBase
+{
+public:
+ ByQName(const SortOrder& order = SortOrder::Ascending)
+ : m_order(order)
+ { }
+
+ bool operator()(const BamRecord& lhs, const BamRecord& rhs)
+ { return sort_helper(m_order, lhs.FullName(), rhs.FullName()); }
+
+private:
+ const SortOrder m_order;
+};
+
+struct ByPosition : public BamRecordSortBase
+{
+public:
+ ByPosition(const SortOrder& order = SortOrder::Ascending)
+ : m_order(order)
+ { }
+
+ // comparison function
+ bool operator()(const BamRecord& lhs, const BamRecord& rhs) {
+
+ const int32_t lhsId = lhs.ReferenceId();
+ const int32_t rhsId = rhs.ReferenceId();
+
+ // force unmapped aligmnents to end
+ if ( lhsId == -1 ) return false;
+ if ( rhsId == -1 ) return true;
+
+ // if on same reference, sort on position
+ if ( lhsId == rhsId )
+ return sort_helper(m_order, lhs.ReferenceStart(), rhs.ReferenceStart());
+
+ // otherwise sort on reference ID
+ return sort_helper(m_order, lhsId, rhsId);
+ }
+
+private:
+ const SortOrder m_order;
+};
+
+struct ByZmw : public BamRecordSortBase {
+public:
+ ByZmw(const SortOrder& order = SortOrder::Ascending) : m_order(order) { }
+
+ bool operator()(const BamRecord& lhs, const BamRecord& rhs)
+ { return sort_helper(m_order, lhs.HoleNumber(), rhs.HoleNumber()); }
+
+private:
+ const SortOrder m_order;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORDSORT_H
diff --git a/include/pbbam/internal/DataSet.inl b/include/pbbam/internal/DataSet.inl
new file mode 100644
index 0000000..34f4af3
--- /dev/null
+++ b/include/pbbam/internal/DataSet.inl
@@ -0,0 +1,197 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSet.h"
+
+namespace PacBio {
+namespace BAM {
+
+inline const std::string& DataSet::Attribute(const std::string& name) const
+{ return d_->Attribute(name); }
+
+inline std::string& DataSet::Attribute(const std::string& name)
+{ return d_->Attribute(name); }
+
+inline DataSet& DataSet::Attribute(const std::string& name, const std::string& value)
+{ d_->Attribute(name, value); return *this; }
+
+inline const std::string& DataSet::CreatedAt(void) const
+{ return d_->CreatedAt(); }
+
+inline std::string& DataSet::CreatedAt(void)
+{ return d_->CreatedAt(); }
+
+inline DataSet& DataSet::CreatedAt(const std::string& createdAt)
+{ d_->CreatedAt(createdAt); return *this; }
+
+inline const PacBio::BAM::Extensions& DataSet::Extensions(void) const
+{ return d_->Extensions(); }
+
+inline PacBio::BAM::Extensions& DataSet::Extensions(void)
+{ return d_->Extensions(); }
+
+inline DataSet& DataSet::Extensions(const PacBio::BAM::Extensions& extensions)
+{ d_->Extensions(extensions); return *this; }
+
+inline const PacBio::BAM::ExternalResources& DataSet::ExternalResources(void) const
+{ return d_->ExternalResources(); }
+
+inline PacBio::BAM::ExternalResources& DataSet::ExternalResources(void)
+{ return d_->ExternalResources(); }
+
+inline DataSet& DataSet::ExternalResources(const PacBio::BAM::ExternalResources& resources)
+{ d_->ExternalResources(resources); return *this; }
+
+inline const PacBio::BAM::Filters& DataSet::Filters(void) const
+{ return d_->Filters(); }
+
+inline PacBio::BAM::Filters& DataSet::Filters(void)
+{ return d_->Filters(); }
+
+inline DataSet& DataSet::Filters(const PacBio::BAM::Filters& filters)
+{ d_->Filters(filters); return *this; }
+
+inline const std::string& DataSet::Format(void) const
+{ return d_->Format(); }
+
+inline std::string& DataSet::Format(void)
+{ return d_->Format(); }
+
+inline DataSet& DataSet::Format(const std::string& format)
+{ d_->Format(format); return *this; }
+
+inline const PacBio::BAM::DataSetMetadata& DataSet::Metadata(void) const
+{ return d_->Metadata(); }
+
+inline PacBio::BAM::DataSetMetadata& DataSet::Metadata(void)
+{ return d_->Metadata(); }
+
+inline DataSet& DataSet::Metadata(const PacBio::BAM::DataSetMetadata& metadata)
+{ d_->Metadata(metadata); return *this; }
+
+inline const std::string& DataSet::MetaType(void) const
+{ return d_->MetaType(); }
+
+inline std::string& DataSet::MetaType(void)
+{ return d_->MetaType(); }
+
+inline DataSet& DataSet::MetaType(const std::string& metatype)
+{ d_->MetaType(metatype); return *this; }
+
+inline const std::string& DataSet::ModifiedAt(void) const
+{ return d_->ModifiedAt(); }
+
+inline std::string& DataSet::ModifiedAt(void)
+{ return d_->ModifiedAt(); }
+
+inline DataSet& DataSet::ModifiedAt(const std::string& modifiedAt)
+{ d_->ModifiedAt(modifiedAt); return *this; }
+
+inline const std::string& DataSet::Name(void) const
+{ return d_->Name(); }
+
+inline std::string& DataSet::Name(void)
+{ return d_->Name(); }
+
+inline DataSet& DataSet::Name(const std::string& name)
+{ d_->Name(name); return *this; }
+
+inline const std::string& DataSet::ResourceId(void) const
+{ return d_->ResourceId(); }
+
+inline std::string& DataSet::ResourceId(void)
+{ return d_->ResourceId(); }
+
+inline DataSet& DataSet::ResourceId(const std::string& resourceId)
+{ d_->ResourceId(resourceId); return *this; }
+
+inline const PacBio::BAM::SubDataSets& DataSet::SubDataSets(void) const
+{ return d_->SubDataSets(); }
+
+inline PacBio::BAM::SubDataSets& DataSet::SubDataSets(void)
+{ return d_->SubDataSets(); }
+
+inline DataSet& DataSet::SubDataSets(const PacBio::BAM::SubDataSets& subdatasets)
+{ d_->SubDataSets(subdatasets); return *this; }
+
+inline const std::string& DataSet::Tags(void) const
+{ return d_->Tags(); }
+
+inline std::string& DataSet::Tags(void)
+{ return d_->Tags(); }
+
+inline DataSet& DataSet::Tags(const std::string& tags)
+{ d_->Tags(tags); return *this; }
+
+inline const std::string& DataSet::TimeStampedName(void) const
+{ return d_->TimeStampedName(); }
+
+inline std::string& DataSet::TimeStampedName(void)
+{ return d_->TimeStampedName(); }
+
+inline DataSet& DataSet::TimeStampedName(const std::string& timeStampedName)
+{ d_->TimeStampedName(timeStampedName); return *this; }
+
+inline PacBio::BAM::DataSet::TypeEnum DataSet::Type(void) const
+{ return DataSet::NameToType(TypeName()); }
+
+inline DataSet& DataSet::Type(const DataSet::TypeEnum type)
+{ d_->Label(DataSet::TypeToName(type)); return *this; }
+
+inline std::string DataSet::TypeName(void) const
+{ return d_->LocalNameLabel().to_string(); }
+
+inline const std::string& DataSet::UniqueId(void) const
+{ return d_->UniqueId(); }
+
+inline std::string& DataSet::UniqueId(void)
+{ return d_->UniqueId(); }
+
+inline DataSet& DataSet::UniqueId(const std::string& uuid)
+{ d_->UniqueId(uuid); return *this; }
+
+inline const std::string& DataSet::Version(void) const
+{ return d_->Version(); }
+
+inline std::string& DataSet::Version(void)
+{ return d_->Version(); }
+
+inline DataSet& DataSet::Version(const std::string& version)
+{ d_->Version(version); return *this; }
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetBaseTypes.h b/include/pbbam/internal/DataSetBaseTypes.h
new file mode 100644
index 0000000..98fae1f
--- /dev/null
+++ b/include/pbbam/internal/DataSetBaseTypes.h
@@ -0,0 +1,174 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETBASETYPES_H
+#define DATASETBASETYPES_H
+
+#include "pbbam/Config.h"
+#include "pbbam/internal/DataSetElement.h"
+#include "pbbam/internal/DataSetListElement.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class DataSetMetadata;
+class Extensions;
+class ExternalResources;
+class FileIndices;
+class Filters;
+class Properties;
+class Provenance;
+
+namespace internal {
+
+class BaseEntityType : public DataSetElement
+{
+protected:
+ BaseEntityType(const std::string& label,
+ const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+ const std::string& CreatedAt(void) const;
+ const std::string& Description(void) const;
+ const PacBio::BAM::Extensions& Extensions(void) const;
+ const std::string& Format(void) const;
+ const std::string& ModifiedAt(void) const;
+ const std::string& Name(void) const;
+ const std::string& ResourceId(void) const;
+ const std::string& Tags(void) const;
+ const std::string& Version(void) const;
+
+ std::string& CreatedAt(void);
+ std::string& Description(void);
+ PacBio::BAM::Extensions& Extensions(void);
+ std::string& Format(void);
+ std::string& ModifiedAt(void);
+ std::string& Name(void);
+ std::string& ResourceId(void);
+ std::string& Tags(void);
+ std::string& Version(void);
+
+ BaseEntityType& CreatedAt(const std::string& createdAt);
+ BaseEntityType& Description(const std::string& description);
+ BaseEntityType& Extensions(const PacBio::BAM::Extensions& extensions);
+ BaseEntityType& Format(const std::string& format);
+ BaseEntityType& ModifiedAt(const std::string& modifiedAt);
+ BaseEntityType& Name(const std::string& name);
+ BaseEntityType& ResourceId(const std::string& resourceId);
+ BaseEntityType& Tags(const std::string& tags);
+ BaseEntityType& Version(const std::string& version);
+};
+
+class DataEntityType : public BaseEntityType
+{
+protected:
+ DataEntityType(const std::string& label,
+ const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+ const std::string& Checksum(void) const;
+ const std::string& EncodedValue(void) const;
+ const std::string& MetaType(void) const;
+ const std::string& SimpleValue(void) const;
+ const std::string& TimeStampedName(void) const;
+ const std::string& UniqueId(void) const;
+ const std::string& ValueDataType(void) const;
+
+ std::string& Checksum(void);
+ std::string& EncodedValue(void);
+ std::string& MetaType(void);
+ std::string& SimpleValue(void);
+ std::string& TimeStampedName(void);
+ std::string& UniqueId(void);
+ std::string& ValueDataType(void);
+
+ DataEntityType& Checksum(const std::string& checksum);
+ DataEntityType& EncodedValue(const std::string& encodedValue);
+ DataEntityType& MetaType(const std::string& metatype);
+ DataEntityType& SimpleValue(const std::string& simpleValue);
+ DataEntityType& TimeStampedName(const std::string& timeStampedName);
+ DataEntityType& UniqueId(const std::string& uuid);
+ DataEntityType& ValueDataType(const std::string& valueDataType);
+};
+
+class StrictEntityType : public BaseEntityType
+{
+protected:
+ StrictEntityType(const std::string& label,
+ const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+ const std::string& MetaType(void) const;
+ const std::string& TimeStampedName(void) const;
+ const std::string& UniqueId(void) const;
+
+ std::string& MetaType(void);
+ std::string& TimeStampedName(void);
+ std::string& UniqueId(void);
+
+ StrictEntityType& MetaType(const std::string& metatype);
+ StrictEntityType& TimeStampedName(const std::string& timeStampedName);
+ StrictEntityType& UniqueId(const std::string& uuid);
+};
+
+class InputOutputDataType : public StrictEntityType
+{
+protected:
+ InputOutputDataType(const std::string& label,
+ const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+};
+
+class IndexedDataType : public InputOutputDataType
+{
+protected:
+ IndexedDataType(const std::string& label,
+ const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+ const PacBio::BAM::FileIndices& FileIndices(void) const;
+ PacBio::BAM::FileIndices& FileIndices(void);
+ IndexedDataType& FileIndices(const PacBio::BAM::FileIndices& indices);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSetBaseTypes.inl"
+
+#endif // DATASETBASETYPES_H
diff --git a/include/pbbam/internal/DataSetBaseTypes.inl b/include/pbbam/internal/DataSetBaseTypes.inl
new file mode 100644
index 0000000..c1d2f43
--- /dev/null
+++ b/include/pbbam/internal/DataSetBaseTypes.inl
@@ -0,0 +1,220 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetBaseTypes.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// ----------------
+// BaseEntityType
+// ----------------
+
+inline const std::string& BaseEntityType::CreatedAt(void) const
+{ return Attribute("CreatedAt"); }
+
+inline std::string& BaseEntityType::CreatedAt(void)
+{ return Attribute("CreatedAt"); }
+
+inline BaseEntityType& BaseEntityType::CreatedAt(const std::string& createdAt)
+{ Attribute("CreatedAt", createdAt); return *this; }
+
+inline const std::string& BaseEntityType::Description(void) const
+{ return Attribute("Description"); }
+
+inline std::string& BaseEntityType::Description(void)
+{ return Attribute("Description"); }
+
+inline BaseEntityType& BaseEntityType::Description(const std::string& description)
+{ Attribute("Description", description); return *this; }
+
+inline const std::string& BaseEntityType::Format(void) const
+{ return Attribute("Format"); }
+
+inline std::string& BaseEntityType::Format(void)
+{ return Attribute("Format"); }
+
+inline BaseEntityType& BaseEntityType::Format(const std::string& format)
+{ Attribute("Format", format); return *this; }
+
+inline const std::string& BaseEntityType::ModifiedAt(void) const
+{ return Attribute("ModifiedAt"); }
+
+inline std::string& BaseEntityType::ModifiedAt(void)
+{ return Attribute("ModifiedAt"); }
+
+inline BaseEntityType& BaseEntityType::ModifiedAt(const std::string& modifiedAt)
+{ Attribute("ModifiedAt", modifiedAt); return *this; }
+
+inline const std::string& BaseEntityType::Name(void) const
+{ return Attribute("Name"); }
+
+inline std::string& BaseEntityType::Name(void)
+{ return Attribute("Name"); }
+
+inline BaseEntityType& BaseEntityType::Name(const std::string& name)
+{ Attribute("Name", name); return *this; }
+
+inline const std::string& BaseEntityType::ResourceId(void) const
+{ return Attribute("ResourceId"); }
+
+inline std::string& BaseEntityType::ResourceId(void)
+{ return Attribute("ResourceId"); }
+
+inline BaseEntityType& BaseEntityType::ResourceId(const std::string& resourceId)
+{ Attribute("ResourceId", resourceId); return *this; }
+
+inline const std::string& BaseEntityType::Tags(void) const
+{ return Attribute("Tags"); }
+
+inline std::string& BaseEntityType::Tags(void)
+{ return Attribute("Tags"); }
+
+inline BaseEntityType& BaseEntityType::Tags(const std::string& tags)
+{ Attribute("Tags", tags); return *this; }
+
+inline const std::string& BaseEntityType::Version(void) const
+{ return Attribute("Version"); }
+
+inline std::string& BaseEntityType::Version(void)
+{ return Attribute("Version"); }
+
+inline BaseEntityType& BaseEntityType::Version(const std::string& version)
+{ Attribute("Version", version); return *this; }
+
+// ----------------
+// DataEntityType
+// ----------------
+
+inline const std::string& DataEntityType::Checksum(void) const
+{ return ChildText("Checksum"); }
+
+inline std::string& DataEntityType::Checksum(void)
+{ return ChildText("Checksum"); }
+
+inline DataEntityType& DataEntityType::Checksum(const std::string& checksum)
+{ ChildText("Checksum", checksum); return *this; }
+
+inline const std::string& DataEntityType::EncodedValue(void) const
+{ return ChildText("EncodedValue"); }
+
+inline std::string& DataEntityType::EncodedValue(void)
+{ return ChildText("EncodedValue"); }
+
+inline DataEntityType& DataEntityType::EncodedValue(const std::string& encodedValue)
+{ ChildText("EncodedValue", encodedValue); return *this; }
+
+inline const std::string& DataEntityType::MetaType(void) const
+{ return Attribute("MetaType"); }
+
+inline std::string& DataEntityType::MetaType(void)
+{ return Attribute("MetaType"); }
+
+inline DataEntityType& DataEntityType::MetaType(const std::string& metatype)
+{ Attribute("MetaType", metatype); return *this; }
+
+inline const std::string& DataEntityType::SimpleValue(void) const
+{ return Attribute("SimpleValue"); }
+
+inline std::string& DataEntityType::SimpleValue(void)
+{ return Attribute("SimpleValue"); }
+
+inline DataEntityType& DataEntityType::SimpleValue(const std::string& simpleValue)
+{ Attribute("SimpleValue", simpleValue); return *this; }
+
+inline const std::string& DataEntityType::TimeStampedName(void) const
+{ return Attribute("TimeStampedName"); }
+
+inline std::string& DataEntityType::TimeStampedName(void)
+{ return Attribute("TimeStampedName"); }
+
+inline DataEntityType& DataEntityType::TimeStampedName(const std::string& timeStampedName)
+{ Attribute("TimeStampedName", timeStampedName); return *this; }
+
+inline const std::string& DataEntityType::UniqueId(void) const
+{ return Attribute("UniqueId"); }
+
+inline std::string& DataEntityType::UniqueId(void)
+{ return Attribute("UniqueId"); }
+
+inline DataEntityType& DataEntityType::UniqueId(const std::string& uuid)
+{ Attribute("UniqueId", uuid); return *this; }
+
+inline const std::string& DataEntityType::ValueDataType(void) const
+{ return Attribute("ValueDataType"); }
+
+inline std::string& DataEntityType::ValueDataType(void)
+{ return Attribute("ValueDataType"); }
+
+inline DataEntityType& DataEntityType::ValueDataType(const std::string& valueDataType)
+{ Attribute("ValueDataType", valueDataType); return *this; }
+
+// ----------------
+// StrictEntityType
+// ----------------
+
+inline const std::string& StrictEntityType::MetaType(void) const
+{ return Attribute("MetaType"); }
+
+inline std::string& StrictEntityType::MetaType(void)
+{ return Attribute("MetaType"); }
+
+inline StrictEntityType& StrictEntityType::MetaType(const std::string& metatype)
+{ Attribute("MetaType", metatype); return *this; }
+
+inline const std::string& StrictEntityType::TimeStampedName(void) const
+{ return Attribute("TimeStampedName"); }
+
+inline std::string& StrictEntityType::TimeStampedName(void)
+{ return Attribute("TimeStampedName"); }
+
+inline StrictEntityType& StrictEntityType::TimeStampedName(const std::string& timeStampedName)
+{ Attribute("TimeStampedName", timeStampedName); return *this; }
+
+inline const std::string& StrictEntityType::UniqueId(void) const
+{ return Attribute("UniqueId"); }
+
+inline std::string& StrictEntityType::UniqueId(void)
+{ return Attribute("UniqueId"); }
+
+inline StrictEntityType& StrictEntityType::UniqueId(const std::string& uuid)
+{ Attribute("UniqueId", uuid); return *this; }
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetElement.h b/include/pbbam/internal/DataSetElement.h
new file mode 100644
index 0000000..e80e55e
--- /dev/null
+++ b/include/pbbam/internal/DataSetElement.h
@@ -0,0 +1,186 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETELEMENT_H
+#define DATASETELEMENT_H
+
+#include "pbbam/DataSetXsd.h"
+
+#include <boost/utility/string_ref.hpp>
+#include <algorithm>
+#include <map>
+#include <stdexcept>
+#include <string>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class XmlName
+{
+ // qualified name
+ // |
+ // --------------
+ // <pbns:node_name >
+ // ---- ---------
+ // | |
+ // prefix local name
+
+public:
+ XmlName(const std::string& fullName);
+ XmlName(const std::string& localName, const std::string& prefix);
+ XmlName(const XmlName& other);
+ XmlName(XmlName&& other);
+ XmlName& operator=(const XmlName& other);
+ XmlName& operator=(XmlName&& other);
+ ~XmlName(void);
+
+public:
+ bool operator==(const XmlName& other) const;
+ bool operator!=(const XmlName& other) const;
+
+public:
+ const boost::string_ref LocalName(void) const;
+ const boost::string_ref Prefix(void) const;
+ const std::string& QualifiedName(void) const;
+
+private:
+ std::string qualifiedName_;
+ size_t prefixSize_;
+ size_t localNameOffset_;
+ size_t localNameSize_;
+};
+
+class DataSetElement
+{
+public:
+ DataSetElement(const std::string& label, const XsdType& xsd = XsdType::NONE);
+ DataSetElement(const DataSetElement& other);
+ DataSetElement(DataSetElement&& other);
+ DataSetElement& operator=(const DataSetElement& other);
+ DataSetElement& operator=(DataSetElement&& other);
+ virtual ~DataSetElement(void);
+
+public:
+ bool operator==(const DataSetElement& other) const;
+ bool operator!=(const DataSetElement& other) const;
+
+public:
+ const std::string& Attribute(const std::string& name) const;
+ std::string& Attribute(const std::string& name);
+ const std::map<std::string, std::string>& Attributes(void) const;
+ std::map<std::string, std::string>& Attributes(void);
+ bool HasAttribute(const std::string& name) const;
+
+ const std::vector<DataSetElement>& Children(void) const;
+ std::vector<DataSetElement>& Children(void);
+ bool HasChild(const std::string& label) const;
+
+ const boost::string_ref LocalNameLabel(void) const;
+ const boost::string_ref PrefixLabel(void) const;
+ const std::string& QualifiedNameLabel(void) const;
+
+ const std::string& Text(void) const;
+ std::string& Text(void);
+
+ const XsdType& Xsd(void) const;
+
+public:
+ void Attribute(const std::string& name, const std::string& value);
+ void Label(const std::string& label);
+ void Text(const std::string& text);
+
+public:
+ size_t NumAttributes(void) const;
+ size_t NumChildren(void) const;
+
+public:
+ void AddChild(const DataSetElement& e);
+ void RemoveChild(const DataSetElement& e);
+
+ template<typename T>
+ const T& Child(size_t index) const;
+
+ template<typename T>
+ T& Child(size_t index);
+
+ template<typename T>
+ const T& Child(const std::string& label) const;
+
+ template<typename T>
+ T& Child(const std::string& label);
+
+ template<typename T>
+ const T& operator[](size_t index) const;
+
+ template<typename T>
+ T& operator[](size_t index);
+
+ template<typename T = DataSetElement>
+ const T& operator[](const std::string& label) const;
+
+ template<typename T = DataSetElement>
+ T& operator[](const std::string& label);
+
+protected:
+ static const std::string& SharedNullString(void);
+
+public:
+ const std::string& ChildText(const std::string& label) const;
+ std::string& ChildText(const std::string& label);
+ void ChildText(const std::string& label, const std::string& text);
+
+protected:
+ XsdType xsd_;
+ XmlName label_;
+ std::string text_;
+ std::map<std::string, std::string> attributes_;
+ std::vector<DataSetElement> children_;
+
+private:
+ int IndexOf(const std::string& label) const;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSetElement.inl"
+
+#endif // DATASETELEMENT_H
diff --git a/include/pbbam/internal/DataSetElement.inl b/include/pbbam/internal/DataSetElement.inl
new file mode 100644
index 0000000..08f15b1
--- /dev/null
+++ b/include/pbbam/internal/DataSetElement.inl
@@ -0,0 +1,371 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetElement.h"
+
+#include <iostream>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// ----------------
+// DataSetElement
+// ----------------
+
+inline DataSetElement::DataSetElement(const std::string& label, const XsdType& xsd)
+ : xsd_(xsd)
+ , label_(label)
+{ }
+
+inline DataSetElement::DataSetElement(const DataSetElement& other)
+ : xsd_(other.xsd_)
+ , label_(other.label_)
+ , text_(other.text_)
+ , attributes_(other.attributes_)
+ , children_(other.children_)
+{ }
+
+inline DataSetElement::DataSetElement(DataSetElement&& other)
+ : xsd_(std::move(other.xsd_))
+ , label_(std::move(other.label_))
+ , text_(std::move(other.text_))
+ , attributes_(std::move(other.attributes_))
+ , children_(std::move(other.children_))
+{ }
+
+inline DataSetElement& DataSetElement::operator=(const DataSetElement& other)
+{
+ xsd_ = other.xsd_;
+ label_ = other.label_;
+ text_ = other.text_;
+ attributes_ = other.attributes_;
+ children_ = other.children_;
+ return *this;
+}
+
+inline DataSetElement& DataSetElement::operator=(DataSetElement&& other)
+{
+ xsd_ = std::move(other.xsd_);
+ label_ = std::move(other.label_);
+ text_ = std::move(other.text_);
+ attributes_ = std::move(other.attributes_);
+ children_ = std::move(other.children_);
+ return *this;
+}
+
+inline DataSetElement::~DataSetElement(void) { }
+
+inline bool DataSetElement::operator==(const DataSetElement& other) const
+{
+ return xsd_ == other.xsd_ &&
+ label_ == other.label_ &&
+ text_ == other.text_ &&
+ attributes_ == other.attributes_ &&
+ children_ == other.children_;
+}
+
+inline bool DataSetElement::operator!=(const DataSetElement& other) const
+{ return !(*this == other); }
+
+template<typename T>
+const T& DataSetElement::operator[](size_t index) const
+{ return Child<T>(index); }
+
+template<typename T>
+T& DataSetElement::operator[](size_t index)
+{ return Child<T>(index); }
+
+template<typename T>
+const T& DataSetElement::operator[](const std::string& label) const
+{ return Child<T>(label); }
+
+template<typename T>
+T& DataSetElement::operator[](const std::string& label)
+{ return Child<T>(label); }
+
+inline void DataSetElement::AddChild(const DataSetElement& e)
+{ children_.push_back(e); }
+
+inline std::string& DataSetElement::Attribute(const std::string& name)
+{ return attributes_[name]; }
+
+inline const std::string& DataSetElement::Attribute(const std::string& name) const
+{
+ auto iter = attributes_.find(name);
+ if (iter == attributes_.cend())
+ return SharedNullString();
+ return iter->second;
+}
+
+inline void DataSetElement::Attribute(const std::string& name, const std::string& value)
+{ attributes_[name] = value; }
+
+inline const std::map<std::string, std::string>& DataSetElement::Attributes(void) const
+{ return attributes_; }
+
+inline std::map<std::string, std::string>& DataSetElement::Attributes(void)
+{ return attributes_; }
+
+template<typename T>
+inline const T& DataSetElement::Child(size_t index) const
+{ return static_cast<const T&>(children_.at(index)); }
+
+template<typename T>
+inline T& DataSetElement::Child(size_t index)
+{ return static_cast<T&>(children_.at(index)); }
+
+template<typename T>
+inline const T& DataSetElement::Child(const std::string& label) const
+{ return Child<T>(IndexOf(label)); }
+
+template<typename T>
+inline T& DataSetElement::Child(const std::string& label)
+{
+ const int i = IndexOf(label);
+ if (i >= 0) {
+ assert(static_cast<size_t>(i) < NumChildren());
+ return Child<T>(i);
+ } else {
+ AddChild(DataSetElement(label));
+ return Child<T>(NumChildren()-1);
+ }
+}
+
+inline const std::vector<DataSetElement>& DataSetElement::Children(void) const
+{ return children_; }
+
+inline std::vector<DataSetElement>& DataSetElement::Children(void)
+{ return children_; }
+
+inline const std::string& DataSetElement::ChildText(const std::string& label) const
+{
+ if (!HasChild(label))
+ return SharedNullString();
+ return Child<DataSetElement>(label).Text();
+}
+
+inline std::string& DataSetElement::ChildText(const std::string& label)
+{
+ if (!HasChild(label))
+ AddChild(DataSetElement(label));
+ return Child<DataSetElement>(label).Text();
+}
+
+inline bool DataSetElement::HasAttribute(const std::string& name) const
+{ return attributes_.find(name) != attributes_.cend(); }
+
+inline bool DataSetElement::HasChild(const std::string& label) const
+{ return IndexOf(label) != -1; }
+
+inline int DataSetElement::IndexOf(const std::string& label) const
+{
+ const size_t count = NumChildren();
+ for (size_t i = 0; i < count; ++i) {
+ const DataSetElement& child = children_.at(i);
+ if (child.LocalNameLabel() == label || child.label_ == label)
+ return i;
+ }
+ return -1;
+}
+
+inline const boost::string_ref DataSetElement::LocalNameLabel(void) const
+{ return label_.LocalName(); }
+
+inline const boost::string_ref DataSetElement::PrefixLabel(void) const
+{ return label_.Prefix(); }
+
+inline const std::string& DataSetElement::QualifiedNameLabel(void) const
+{ return label_.QualifiedName(); }
+
+//inline std::string& DataSetElement::Label(void)
+//{ return label_.QualifiedName(); }
+
+inline void DataSetElement::Label(const std::string& label)
+{ label_ = XmlName(label); }
+
+inline size_t DataSetElement::NumAttributes(void) const
+{ return attributes_.size(); }
+
+inline size_t DataSetElement::NumChildren(void) const
+{ return children_.size(); }
+
+inline void DataSetElement::RemoveChild(const DataSetElement& e)
+{
+ children_.erase(
+ std::remove(children_.begin(),
+ children_.end(),
+ e),
+ children_.end()
+ );
+}
+
+inline void DataSetElement::ChildText(const std::string& label,
+ const std::string& text)
+{
+ if (!HasChild(label)) {
+ DataSetElement e(label);
+ e.Text(text);
+ AddChild(e);
+ } else {
+ Child<DataSetElement>(label).Text(text);
+ }
+}
+
+inline const std::string& DataSetElement::Text(void) const
+{ return text_; }
+
+inline std::string& DataSetElement::Text(void)
+{ return text_; }
+
+inline void DataSetElement::Text(const std::string& text)
+{ text_ = text; }
+
+inline const XsdType& DataSetElement::Xsd(void) const
+{ return xsd_; }
+
+// ----------------
+// XmlName
+// ----------------
+
+inline XmlName::XmlName(const std::string& fullName)
+ : qualifiedName_(fullName)
+ , prefixSize_(0)
+ , localNameOffset_(0)
+ , localNameSize_(0)
+{
+// std::cerr << "Creating XmlName from fullName: " << fullName << std::endl;
+
+ const size_t colonFound = qualifiedName_.find(':');
+ if (colonFound == std::string::npos || colonFound == 0)
+ localNameSize_ = qualifiedName_.size();
+ else {
+ prefixSize_ = colonFound;
+ localNameSize_ = (qualifiedName_.size() - colonFound) - 1;
+ }
+
+ // adjust for colon if prefix present
+ localNameOffset_ = prefixSize_;
+ if (prefixSize_ != 0)
+ ++localNameOffset_;
+
+// std::cerr << " qualName: " << qualifiedName_ << std::endl;
+// std::cerr << " prefix: " << Prefix() << std::endl;
+// std::cerr << " localName: " << LocalName() << std::endl;
+}
+
+inline XmlName::XmlName(const std::string& localName,
+ const std::string& prefix)
+ : prefixSize_(prefix.size())
+ , localNameOffset_(prefixSize_)
+ , localNameSize_(localName.size())
+{
+ qualifiedName_.clear();
+ qualifiedName_.reserve(localNameSize_+ prefixSize_ + 1);
+ qualifiedName_.append(prefix);
+ if (!qualifiedName_.empty())
+ qualifiedName_.append(1, ':');
+ qualifiedName_.append(localName);
+
+ // adjust for colon if prefix present
+ if (prefixSize_ != 0)
+ ++localNameOffset_;
+}
+
+inline XmlName::XmlName(const XmlName& other)
+ : qualifiedName_(other.qualifiedName_)
+ , prefixSize_(other.prefixSize_)
+ , localNameOffset_(other.localNameOffset_)
+ , localNameSize_(other.localNameSize_)
+{ }
+
+inline XmlName::XmlName(XmlName&& other)
+ : qualifiedName_(std::move(other.qualifiedName_))
+ , prefixSize_(std::move(other.prefixSize_))
+ , localNameOffset_(std::move(other.localNameOffset_))
+ , localNameSize_(std::move(other.localNameSize_))
+{ }
+
+inline XmlName& XmlName::operator=(const XmlName& other)
+{
+ qualifiedName_ = other.qualifiedName_;
+ prefixSize_ = other.prefixSize_;
+ localNameOffset_ = other.localNameOffset_;
+ localNameSize_ = other.localNameSize_;
+ return *this;
+}
+
+inline XmlName& XmlName::operator=(XmlName&& other)
+{
+ qualifiedName_ = std::move(other.qualifiedName_);
+ prefixSize_ = std::move(other.prefixSize_);
+ localNameOffset_ = std::move(other.localNameOffset_);
+ localNameSize_ = std::move(other.localNameSize_);
+ return *this;
+}
+
+inline XmlName::~XmlName(void) { }
+
+inline bool XmlName::operator==(const XmlName& other) const
+{ return qualifiedName_ == other.qualifiedName_; }
+
+inline bool XmlName::operator!=(const XmlName& other) const
+{ return !(*this == other); }
+
+//inline void XmlName::CalculateSizes(const size_t localNameSize,
+// const size_t prefixSize)
+//{
+// size_t offset = prefixSize;
+// if (offset != 0)
+// ++offset;
+
+// localName_ = boost::string_ref(qualifiedName_.data() + offset, localNameSize);
+// prefix_ = boost::string_ref(qualifiedName_.data(), prefixSize);
+//}
+
+inline const boost::string_ref XmlName::LocalName(void) const
+{ return boost::string_ref(qualifiedName_.data() + localNameOffset_, localNameSize_); }
+
+inline const boost::string_ref XmlName::Prefix(void) const
+{ return boost::string_ref(qualifiedName_.data(), prefixSize_); }
+
+inline const std::string& XmlName::QualifiedName(void) const
+{ return qualifiedName_; }
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetListElement.h b/include/pbbam/internal/DataSetListElement.h
new file mode 100644
index 0000000..5c44d25
--- /dev/null
+++ b/include/pbbam/internal/DataSetListElement.h
@@ -0,0 +1,118 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETLISTELEMENT_H
+#define DATASETLISTELEMENT_H
+
+#include "pbbam/internal/DataSetElement.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+//
+// adds iterators for convenience
+//
+template<class T> class DataSetListElement;
+
+template<class T>
+class DataSetListIteratorBase
+{
+public:
+ bool operator==(const DataSetListIteratorBase<T>& other) const;
+ bool operator!=(const DataSetListIteratorBase<T>& other) const;
+
+protected:
+ DataSetListIteratorBase(const DataSetListElement<T>* parent, size_t i);
+ void ReadNext(void);
+
+protected:
+ const DataSetListElement<T>* parent_;
+ size_t index_;
+};
+
+template<class T>
+class DataSetListIterator : public DataSetListIteratorBase<T>
+{
+public:
+ DataSetListIterator(const DataSetListElement<T>* parent, size_t i);
+ T& operator*(void);
+ T* operator->(void);
+ DataSetListIterator<T>& operator++(void);
+ DataSetListIterator<T> operator++(int);
+};
+
+template<class T>
+class DataSetListConstIterator : public DataSetListIteratorBase<T>
+{
+public:
+ DataSetListConstIterator(const DataSetListElement<T>* parent, size_t i);
+ const T& operator*(void) const;
+ const T* operator->(void) const;
+ DataSetListConstIterator<T>& operator++(void);
+ DataSetListConstIterator<T> operator++(int);
+};
+
+template<class T>
+class DataSetListElement : public DataSetElement
+{
+public:
+ DataSetListElement(const std::string& label, const XsdType& xsd = XsdType::NONE);
+
+// child access through index
+public:
+ const T& operator[](size_t index) const;
+ T& operator[](size_t index);
+ size_t Size(void) const;
+
+// child access through iterators
+public:
+ DataSetListIterator<T> begin(void);
+ DataSetListConstIterator<T> begin(void) const;
+ DataSetListConstIterator<T> cbegin(void) const;
+ DataSetListIterator<T> end(void);
+ DataSetListConstIterator<T> end(void) const;
+ DataSetListConstIterator<T> cend(void) const;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSetListElement.inl"
+
+#endif // DATASETLISTELEMENT_H
diff --git a/include/pbbam/internal/DataSetListElement.inl b/include/pbbam/internal/DataSetListElement.inl
new file mode 100644
index 0000000..1479fa5
--- /dev/null
+++ b/include/pbbam/internal/DataSetListElement.inl
@@ -0,0 +1,181 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetListElement.h"
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// --------------------
+// DataSetListElement
+// --------------------
+
+template<class T>
+inline DataSetListElement<T>::DataSetListElement(const std::string& label,
+ const XsdType& xsd)
+ : DataSetElement(label, xsd)
+{ }
+
+template<class T>
+inline const T& DataSetListElement<T>::operator[](size_t index) const
+{ return static_cast<const T&>(children_.at(index)); }
+
+template<class T>
+inline T& DataSetListElement<T>::operator[](size_t index)
+{ return static_cast<T&>(children_.at(index)); }
+
+template<class T>
+inline size_t DataSetListElement<T>::Size(void) const
+{ return NumChildren(); }
+
+template<class T>
+inline DataSetListIterator<T> DataSetListElement<T>::begin(void)
+{ return DataSetListIterator<T>(this, 0); }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListElement<T>::begin(void) const
+{ return DataSetListConstIterator<T>(this, 0); }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListElement<T>::cbegin(void) const
+{ return DataSetListConstIterator<T>(this, 0); }
+
+template<class T>
+inline DataSetListIterator<T> DataSetListElement<T>::end(void)
+{ return DataSetListIterator<T>(this, NumChildren()); }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListElement<T>::end(void) const
+{ return DataSetListConstIterator<T>(this, NumChildren()); }
+
+template<class T>
+inline DataSetListConstIterator<T>DataSetListElement<T>::cend(void) const
+{ return DataSetListConstIterator<T>(this, NumChildren()); }
+
+// -------------------------
+// DataSetListIteratorBase
+// -------------------------
+
+template<class T>
+inline bool DataSetListIteratorBase<T>::operator==(const DataSetListIteratorBase<T>& other) const
+{ return parent_ == other.parent_ &&
+ index_ == other.index_;
+}
+
+template<class T>
+inline bool DataSetListIteratorBase<T>::operator!=(const DataSetListIteratorBase<T>& other) const
+{ return !(*this == other); }
+
+template<class T>
+inline DataSetListIteratorBase<T>::DataSetListIteratorBase(const DataSetListElement<T>* parent, size_t i)
+ : parent_(parent)
+ , index_(i)
+{ }
+
+template<class T>
+inline void DataSetListIteratorBase<T>::ReadNext(void)
+{
+ if (index_ >= parent_->NumChildren()) {
+ parent_ = nullptr;
+ return;
+ }
+ ++index_;
+}
+
+// ---------------------
+// DataSetListIterator
+// ---------------------
+
+template<class T>
+inline DataSetListIterator<T>::DataSetListIterator(const DataSetListElement<T>* parent, size_t i)
+ : DataSetListIteratorBase<T>(parent, i)
+{ }
+
+template<class T>
+inline T& DataSetListIterator<T>::operator*(void)
+{ return DataSetListIteratorBase<T>::parent_->template Child<T>(DataSetListIteratorBase<T>::index_); }
+
+template<class T>
+inline T* DataSetListIterator<T>::operator->(void)
+{ return &(operator*()); }
+
+template<class T>
+inline DataSetListIterator<T>& DataSetListIterator<T>::operator++(void)
+{ DataSetListIteratorBase<T>::ReadNext(); return *this; }
+
+template<class T>
+inline DataSetListIterator<T> DataSetListIterator<T>::operator++(int)
+{
+ DataSetListIterator<T> result(*this);
+ ++(*this);
+ return result;
+}
+
+// --------------------------
+// DataSetListConstIterator
+// --------------------------
+
+template<class T>
+inline DataSetListConstIterator<T>::DataSetListConstIterator(const DataSetListElement<T>* parent, size_t i)
+ : DataSetListIteratorBase<T>(parent, i)
+{ }
+
+template<class T>
+inline const T& DataSetListConstIterator<T>::operator*(void) const
+{ return DataSetListIteratorBase<T>::parent_->template Child<T>(DataSetListIteratorBase<T>::index_); }
+
+template<class T>
+inline const T* DataSetListConstIterator<T>::operator->(void) const
+{ return &(operator*()); }
+
+template<class T>
+inline DataSetListConstIterator<T>& DataSetListConstIterator<T>::operator++(void)
+{ DataSetListIteratorBase<T>::ReadNext(); return *this; }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListConstIterator<T>::operator++(int)
+{
+ DataSetListConstIterator<T> result(*this);
+ ++(*this);
+ return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetTypes.inl b/include/pbbam/internal/DataSetTypes.inl
new file mode 100644
index 0000000..105dffb
--- /dev/null
+++ b/include/pbbam/internal/DataSetTypes.inl
@@ -0,0 +1,150 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetTypes.h"
+
+namespace PacBio {
+namespace BAM {
+
+// -------------
+// DataSetBase
+// --------------
+
+inline const NamespaceRegistry& DataSetBase::Namespaces(void) const
+{ return registry_; }
+
+inline NamespaceRegistry& DataSetBase::Namespaces(void)
+{ return registry_; }
+
+// ---------------------
+// DataSetMetadata
+// ---------------------
+
+inline const std::string& DataSetMetadata::NumRecords(void) const
+{ return ChildText("NumRecords"); }
+
+inline std::string& DataSetMetadata::NumRecords(void)
+{ return ChildText("NumRecords"); }
+
+inline DataSetMetadata& DataSetMetadata::NumRecords(const std::string& numRecords)
+{ ChildText("NumRecords", numRecords); return *this; }
+
+inline const std::string& DataSetMetadata::TotalLength(void) const
+{ return ChildText("TotalLength"); }
+
+inline std::string& DataSetMetadata::TotalLength(void)
+{ return ChildText("TotalLength"); }
+
+inline DataSetMetadata& DataSetMetadata::TotalLength(const std::string& totalLength)
+{ ChildText("TotalLength", totalLength); return *this; }
+
+// ----------
+// Property
+// ----------
+
+inline const std::string& Property::Name(void) const
+{ return Attribute("Name"); }
+
+inline std::string& Property::Name(void)
+{ return Attribute("Name"); }
+
+inline Property& Property::Name(const std::string& name)
+{ Attribute("Name", name); return *this; }
+
+inline const std::string& Property::Operator(void) const
+{ return Attribute("Operator"); }
+
+inline std::string& Property::Operator(void)
+{ return Attribute("Operator"); }
+
+inline Property& Property::Operator(const std::string& op)
+{ Attribute("Operator", op); return *this; }
+
+inline const std::string& Property::Value(void) const
+{ return Attribute("Value"); }
+
+inline std::string& Property::Value(void)
+{ return Attribute("Value"); }
+
+inline Property& Property::Value(const std::string& value)
+{ Attribute("Value", value); return *this; }
+
+// ------------
+// Provenance
+// ------------
+
+inline const std::string& Provenance::CreatedBy(void) const
+{ return Attribute("CreatedBy"); }
+
+inline std::string& Provenance::CreatedBy(void)
+{ return Attribute("CreatedBy"); }
+
+inline Provenance& Provenance::CreatedBy(const std::string& createdBy)
+{ Attribute("CreatedBy", createdBy); return *this; }
+
+inline const std::string& Provenance::CommonServicesInstanceId(void) const
+{ return ChildText("CommonServicesInstanceId"); }
+
+inline std::string& Provenance::CommonServicesInstanceId(void)
+{ return ChildText("CommonServicesInstanceId"); }
+
+inline Provenance& Provenance::CommonServicesInstanceId(const std::string& id)
+{ ChildText("CommonServicesInstanceId", id); return *this; }
+
+inline const std::string& Provenance::CreatorUserId(void) const
+{ return ChildText("CreatorUserId"); }
+
+inline std::string& Provenance::CreatorUserId(void)
+{ return ChildText("CreatorUserId"); }
+
+inline Provenance& Provenance::CreatorUserId(const std::string& id)
+{ ChildText("CreatorUserId", id); return *this; }
+
+inline const std::string& Provenance::ParentJobId(void) const
+{ return ChildText("ParentJobId"); }
+
+inline std::string& Provenance::ParentJobId(void)
+{ return ChildText("ParentJobId"); }
+
+inline Provenance& Provenance::ParentJobId(const std::string& id)
+{ ChildText("ParentJobId", id); return *this; }
+
+inline Provenance& Provenance::ParentTool(const PacBio::BAM::ParentTool& tool)
+{ ParentTool() = tool; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/FilterEngine.h b/include/pbbam/internal/FilterEngine.h
new file mode 100644
index 0000000..bc4b88b
--- /dev/null
+++ b/include/pbbam/internal/FilterEngine.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef FILTERENGINE_H
+#define FILTERENGINE_H
+
+#include "pbbam/BamRecord.h"
+#include <memory>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+
+
+class FilterEngine {
+
+public:
+ FilterEngine(void);
+
+public:
+ // returns true if record passes filter
+ bool Accepts(const BamRecord& r) const;
+
+ // removes records that do not pass filter, returns true if !empty()
+ bool Accepts(std::vector<BamRecord>& r) const;
+
+private:
+
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FILTERENGINE_H
diff --git a/include/pbbam/internal/IBamFileIterator.h b/include/pbbam/internal/IBamFileIterator.h
new file mode 100644
index 0000000..5ea34f3
--- /dev/null
+++ b/include/pbbam/internal/IBamFileIterator.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef IBAMFILEITERATOR_H
+#define IBAMFILEITERATOR_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include <memory>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+class IBamFileIteratorBase
+{
+public:
+ typedef std::shared_ptr< IBamFileIteratorBase<T> > Ptr;
+
+protected:
+ IBamFileIteratorBase(const BamFile& file)
+ : header_(file.Header().DeepCopy())
+ { }
+public:
+ virtual ~IBamFileIteratorBase(void) { }
+
+public:
+ virtual bool GetNext(T& result) =0;
+ virtual bool InSameGroup(const BamRecord& lhs, const BamRecord& rhs) const
+ { (void)lhs; (void)rhs; return true; }
+
+protected:
+ const BamHeader header_;
+};
+
+typedef IBamFileIteratorBase<BamRecord> IBamFileIterator;
+typedef IBamFileIteratorBase<std::vector<BamRecord> > IBamFileGroupIterator;
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // IBAMFILEITERATOR_H
diff --git a/include/pbbam/internal/IMergeStrategy.h b/include/pbbam/internal/IMergeStrategy.h
new file mode 100644
index 0000000..0677f31
--- /dev/null
+++ b/include/pbbam/internal/IMergeStrategy.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef IMERGESTRATEGY_H
+#define IMERGESTRATEGY_H
+
+#include "pbbam/internal/IBamFileIterator.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+class IMergeStrategyBase
+{
+public:
+ typedef typename IBamFileIteratorBase<T>::Ptr FileIterPtr;
+protected:
+ IMergeStrategyBase(void) { }
+public:
+ virtual ~IMergeStrategyBase(void) { }
+public:
+ virtual bool GetNext(T& result) =0;
+};
+
+typedef IMergeStrategyBase<BamRecord> IMergeStrategy;
+typedef IMergeStrategyBase<std::vector<BamRecord> > IGroupMergeStrategy;
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // IMERGESTRATEGY_H
diff --git a/include/pbbam/internal/MergeItem.h b/include/pbbam/internal/MergeItem.h
new file mode 100644
index 0000000..f3d2347
--- /dev/null
+++ b/include/pbbam/internal/MergeItem.h
@@ -0,0 +1,77 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef MERGEITEM_H
+#define MERGEITEM_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/internal/IBamFileIterator.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+struct MergeItemBase
+{
+public:
+ typedef typename IBamFileIteratorBase<T>::Ptr FileIterPtr;
+
+public:
+ MergeItemBase(void) { }
+ MergeItemBase(const T& r, const FileIterPtr& iter)
+ : record_(r), iter_(iter)
+ { }
+
+public:
+ bool IsNull(void) const
+ { return !iter_; }
+
+public:
+ T record_;
+ FileIterPtr iter_;
+};
+
+typedef MergeItemBase<BamRecord> MergeItem;
+typedef MergeItemBase<std::vector<BamRecord> > GroupMergeItem;
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // MERGEITEM_H
diff --git a/include/pbbam/internal/MergeStrategy.h b/include/pbbam/internal/MergeStrategy.h
new file mode 100644
index 0000000..1a8a564
--- /dev/null
+++ b/include/pbbam/internal/MergeStrategy.h
@@ -0,0 +1,239 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef MERGESTRATEGY_H
+#define MERGESTRATEGY_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/internal/IMergeStrategy.h"
+#include "pbbam/internal/MergeItem.h"
+#include <functional>
+#include <set>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename Compare>
+struct MergeItemSorter : public std::binary_function<MergeItem, MergeItem, bool>
+{
+public:
+ MergeItemSorter(const Compare& comp = Compare())
+ : comp_(comp)
+ { }
+
+ bool operator()(const MergeItem& lhs, const MergeItem& rhs) {
+ const BamRecord& l = lhs.record_;
+ const BamRecord& r = rhs.record_;
+ return comp_(l, r);
+ }
+
+private:
+ Compare comp_;
+};
+
+template<typename Compare>
+struct GroupMergeItemSorter : public std::binary_function<GroupMergeItem, GroupMergeItem, bool>
+{
+public:
+ GroupMergeItemSorter(const Compare& comp = Compare())
+ : comp_(comp)
+ { }
+
+ bool operator()(const GroupMergeItem& lhs, const GroupMergeItem& rhs) {
+ if ( lhs.record_.empty())
+ return false;
+ if ( rhs.record_.empty())
+ return true;
+ assert(!lhs.record_.empty());
+ assert(!rhs.record_.empty());
+ const BamRecord& l = lhs.record_.front();
+ const BamRecord& r = rhs.record_.front();
+ return comp_(l, r);
+ }
+
+private:
+ Compare comp_;
+};
+
+template<typename Compare>
+class MergeStrategy : public IMergeStrategy
+{
+public:
+ MergeStrategy(const std::vector<FileIterPtr>& iters);
+ bool GetNext(BamRecord& record);
+private:
+ std::multiset<MergeItem, MergeItemSorter<Compare> > mergeItems_;
+};
+
+template<typename Compare>
+class GroupMergeStrategy : public IGroupMergeStrategy
+{
+public:
+ GroupMergeStrategy(const std::vector<FileIterPtr>& iters);
+ bool GetNext(std::vector<BamRecord>& records);
+private:
+ GroupMergeItem nextItem_;
+ std::multiset<GroupMergeItem, GroupMergeItemSorter<Compare> > mergeItems_;
+};
+
+// -----------------------
+// MergeStrategy
+// -----------------------
+
+template<typename Compare>
+inline MergeStrategy<Compare>::MergeStrategy(const std::vector<FileIterPtr>& iters)
+ : IMergeStrategy()
+{
+ BamRecord r;
+ for (FileIterPtr iter : iters) {
+ if (iter->GetNext(r)) {
+ MergeItem item(r, iter);
+ mergeItems_.insert(item);
+ }
+ }
+}
+
+template<typename Compare>
+inline bool MergeStrategy<Compare>::GetNext(BamRecord& record)
+{
+ if (mergeItems_.empty())
+ return false;
+
+ // pop first merge item & record
+ auto firstIter = mergeItems_.begin();
+ MergeItem firstItem = (*firstIter);
+ mergeItems_.erase(firstIter);
+ record = firstItem.record_;
+
+ // try fetch iter's next (if failed, do not replace)
+ if (firstItem.iter_->GetNext(firstItem.record_))
+ mergeItems_.insert(firstItem);
+ return true;
+}
+
+// -----------------------
+// GroupMergeStrategy
+// -----------------------
+
+template<typename Compare>
+inline GroupMergeStrategy<Compare>::GroupMergeStrategy(const std::vector<FileIterPtr>& iters)
+ : IGroupMergeStrategy()
+{
+ std::vector<BamRecord> r;
+ for (FileIterPtr iter : iters) {
+ if (iter->GetNext(r)) {
+ GroupMergeItem item(r, iter);
+ mergeItems_.insert(item);
+ }
+ }
+ if (!mergeItems_.empty()) {
+ auto firstIter = mergeItems_.begin();
+ nextItem_ = (*firstIter);
+ mergeItems_.erase(firstIter);
+ }
+}
+
+template<typename Compare>
+inline bool GroupMergeStrategy<Compare>::GetNext(std::vector<BamRecord>& records)
+{
+ records.clear();
+ if (nextItem_.IsNull())
+ return false;
+
+ // append "nextItem" records
+ records = nextItem_.record_;
+
+ // try fetch iter's next (if failed, do not replace)
+ if (nextItem_.iter_->GetNext(nextItem_.record_))
+ mergeItems_.insert(nextItem_);
+ else
+ nextItem_ = GroupMergeItem();
+
+ while (!mergeItems_.empty()) {
+
+ // pop first merge item
+ auto firstIter = mergeItems_.begin();
+ GroupMergeItem firstItem = (*firstIter);
+ mergeItems_.erase(firstIter);
+
+ // if first item has records
+ if (!firstItem.record_.empty()) {
+
+ // if first block to store
+ if (records.empty())
+ records = firstItem.record_;
+
+ // else see if we match current group
+ else {
+ const BamRecord& lhs = records.front();
+ const BamRecord& rhs = firstItem.record_.front();
+
+ // if match, append to output & fetch next
+ if (firstItem.iter_->InSameGroup(lhs, rhs)) {
+
+ for (const BamRecord& r : firstItem.record_)
+ records.push_back(r);
+ if (firstItem.iter_->GetNext(firstItem.record_))
+ mergeItems_.insert(firstItem);
+ }
+
+ // no match, item becomes the "next item" to use
+ else {
+ nextItem_ = firstItem;
+ break;
+ }
+ }
+ }
+
+ // first item has no records, try fetch next
+ else {
+ if (firstItem.iter_->GetNext(firstItem.record_))
+ mergeItems_.insert(firstItem);
+ }
+ }
+
+ return true;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // MERGESTRATEGY_H
diff --git a/include/pbbam/internal/PbiIndex_p.h b/include/pbbam/internal/PbiIndex_p.h
new file mode 100644
index 0000000..5f0db35
--- /dev/null
+++ b/include/pbbam/internal/PbiIndex_p.h
@@ -0,0 +1,931 @@
+//// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+////
+//// All rights reserved.
+////
+//// Redistribution and use in source and binary forms, with or without
+//// modification, are permitted (subject to the limitations in the
+//// disclaimer below) provided that the following conditions are met:
+////
+//// * Redistributions of source code must retain the above copyright
+//// notice, this list of conditions and the following disclaimer.
+////
+//// * Redistributions in binary form must reproduce the above
+//// copyright notice, this list of conditions and the following
+//// disclaimer in the documentation and/or other materials provided
+//// with the distribution.
+////
+//// * Neither the name of Pacific Biosciences nor the names of its
+//// contributors may be used to endorse or promote products derived
+//// from this software without specific prior written permission.
+////
+//// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+//// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+//// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+//// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+//// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+//// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+//// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+//// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+//// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+//// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+//// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+//// SUCH DAMAGE.
+////
+//// Author: Derek Barnett
+
+//#ifndef PBIINDEX_P_H
+//#define PBIINDEX_P_H
+
+//#include "pbbam/BamRecord.h"
+//#include "pbbam/PbiFile.h"
+//#include "pbbam/PbiIndex.h"
+//#include "pbbam/PbiRawData.h"
+
+//#include <algorithm>
+//#include <map>
+//#include <memory>
+//#include <unordered_map>
+//#include <utility>
+//#include <vector>
+//#include <cassert>
+
+//namespace PacBio {
+//namespace BAM {
+//namespace internal {
+
+//// --------------------------
+//// Ordered Lookup Container (e.g. map)
+//// --------------------------
+
+//template<typename T>
+//class OrderedLookup
+//{
+//public:
+// typedef T KeyType;
+// typedef IndexList ValueType;
+// typedef std::map<KeyType, ValueType> ContainerType;
+// typedef typename ContainerType::const_iterator IterType;
+
+//public:
+// OrderedLookup(void);
+// OrderedLookup(size_t n);
+// OrderedLookup(const ContainerType& data);
+// OrderedLookup(ContainerType&& data);
+// OrderedLookup(const std::vector<T>& rawData);
+// OrderedLookup(std::vector<T>&& rawData);
+
+//public:
+// bool operator==(const OrderedLookup<T>& other) const;
+// bool operator!=(const OrderedLookup<T>& other) const;
+
+//public:
+// IndexList LookupIndices(const KeyType& key,
+// const CompareType& compare) const;
+
+//private:
+// IndexList LookupInclusiveRange(const IterType& begin,
+// const IterType& end) const;
+
+// IndexList LookupExclusiveRange(const IterType& begin,
+// const IterType& end,
+// const KeyType& key) const;
+
+//private:
+// ContainerType data_;
+//};
+
+//// --------------------------
+//// Unordered Lookup Container (e.g. hash)
+//// --------------------------
+
+//template<typename T>
+//class UnorderedLookup
+//{
+//public:
+// typedef T KeyType;
+// typedef IndexList ValueType;
+// typedef std::unordered_map<KeyType, ValueType> ContainerType;
+
+//public:
+// UnorderedLookup(void);
+// UnorderedLookup(size_t n);
+// UnorderedLookup(const ContainerType& data);
+// UnorderedLookup(ContainerType&& data);
+// UnorderedLookup(const std::vector<T>& rawData);
+// UnorderedLookup(std::vector<T>&& rawData);
+
+//public:
+// bool operator==(const UnorderedLookup<T>& other) const;
+// bool operator!=(const UnorderedLookup<T>& other) const;
+
+//public:
+// IndexList LookupIndices(const KeyType& key,
+// const CompareType& compare) const;
+
+//private:
+// template<typename Compare>
+// IndexList LookupHelper(const KeyType& key, const Compare& cmp) const;
+
+//private:
+// ContainerType data_;
+//};
+
+//// ----------------
+//// Subread Data
+//// ----------------
+
+//struct SubreadLookupData
+//{
+// // ctors
+// SubreadLookupData(void);
+// SubreadLookupData(const PbiRawSubreadData& rawData);
+//// SubreadLookupData(PbiRawSubreadData&& rawData);
+
+// // add offset data to index result blocks
+// void ApplyOffsets(IndexResultBlocks& blocks) const;
+
+// template<typename T>
+// IndexList Indices(const SubreadField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexList IndicesMulti(const SubreadField& field,
+// const std::vector<T>& values) const;
+
+// // map ordering doesn't make sense, optimize for direct lookup
+// UnorderedLookup<int32_t> rgId_;
+
+// // numeric comparisons make sense, keep key ordering preserved
+// OrderedLookup<int32_t> qStart_;
+// OrderedLookup<int32_t> qEnd_;
+// OrderedLookup<int32_t> holeNumber_;
+// OrderedLookup<uint16_t> readQual_;
+
+// // offsets
+// std::vector<int64_t> fileOffset_;
+//};
+
+//// -----------------
+//// Mapped Data
+//// -----------------
+
+//struct MappedLookupData
+//{
+// // ctors
+// MappedLookupData(void);
+// MappedLookupData(const PbiRawMappedData& rawData);
+//// MappedLookupData(PbiRawMappedData&& rawData);
+
+// template<typename T>
+// IndexList Indices(const MappedField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexList IndicesMulti(const MappedField& field,
+// const std::vector<T>& values) const;
+
+// // numeric comparisons make sense, keep key ordering preserved
+// OrderedLookup<int32_t> tId_;
+// OrderedLookup<uint32_t> tStart_;
+// OrderedLookup<uint32_t> tEnd_;
+// OrderedLookup<uint32_t> aStart_;
+// OrderedLookup<uint32_t> aEnd_;
+// OrderedLookup<uint32_t> nM_;
+// OrderedLookup<uint32_t> nMM_;
+// OrderedLookup<uint8_t> mapQV_;
+
+// // generated, not stored in PBI
+// OrderedLookup<uint32_t> nIns_;
+// OrderedLookup<uint32_t> nDel_;
+
+// // no need for map overhead, just store direct indices
+// IndexList reverseStrand_;
+// IndexList forwardStrand_;
+//};
+
+//// ------------------
+//// Reference Data
+//// ------------------
+
+//struct ReferenceLookupData
+//{
+// // ctors
+// ReferenceLookupData(void);
+// ReferenceLookupData(const PbiRawReferenceData& rawData);
+//// ReferenceLookupData(PbiRawReferenceData&& rawData);
+
+// IndexRange Indices(const int32_t tId) const;
+
+// // references_[tId] = (begin, end) indices
+// // into SubreadLookupData::fileOffset_
+// std::unordered_map<int32_t, IndexRange> references_;
+//};
+
+//// ---------------
+//// Barcode Data
+//// ---------------
+
+//struct BarcodeLookupData
+//{
+// // ctors
+// BarcodeLookupData(void);
+// BarcodeLookupData(const PbiRawBarcodeData& rawData);
+//// BarcodeLookupData(PbiRawBarcodeData&& rawData);
+
+// template<typename T>
+// IndexList Indices(const BarcodeField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexList IndicesMulti(const BarcodeField& field,
+// const std::vector<T>& values) const;
+
+// // numeric comparisons make sense, keep key ordering preserved
+// OrderedLookup<uint16_t> bcLeft_;
+// OrderedLookup<uint16_t> bcRight_;
+// OrderedLookup<uint8_t> bcQual_;
+
+// // see if this works, or if can use unordered, 'direct' query
+// OrderedLookup<uint8_t> ctxtFlag_;
+//};
+
+//// --------------------------
+//// Pbi Lookup Aggregate
+//// --------------------------
+
+//class PbiIndexPrivate
+//{
+//public:
+// PbiIndexPrivate(void);
+// PbiIndexPrivate(const PbiRawData& rawIndex);
+// PbiIndexPrivate(PbiRawData&& rawIndex);
+
+// std::unique_ptr<PbiIndexPrivate> DeepCopy(void) const;
+
+//public:
+// bool HasSection(const PbiFile::Section flag) const;
+// void SetSection(const PbiFile::Section flag, bool ok = true);
+
+//public:
+
+// template<typename T>
+// IndexList Indices(const SubreadField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexList Indices(const MappedField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexList Indices(const BarcodeField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexList IndicesMulti(const SubreadField& field,
+// const T& value) const;
+
+// template<typename T>
+// IndexList IndicesMulti(const MappedField& field,
+// const T& value) const;
+
+// template<typename T>
+// IndexList IndicesMulti(const BarcodeField& field,
+// const T& value) const;
+
+// template<typename T>
+// IndexResultBlocks Lookup(const SubreadField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexResultBlocks Lookup(const MappedField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexResultBlocks Lookup(const BarcodeField& field,
+// const T& value,
+// const CompareType& compareType) const;
+
+// template<typename T>
+// IndexResultBlocks LookupMulti(const SubreadField& field,
+// const std::vector<T>& values) const;
+
+// template<typename T>
+// IndexResultBlocks LookupMulti(const MappedField& field,
+// const std::vector<T>& values) const;
+
+// template<typename T>
+// IndexResultBlocks LookupMulti(const BarcodeField& field,
+// const std::vector<T>& values) const;
+
+// IndexResultBlocks LookupReference(const int32_t tId) const;
+
+//private:
+// IndexResultBlocks MergeBlocksWithOffsets(const IndexList& indices) const;
+
+//public:
+// PbiFile::VersionEnum version_;
+// PbiFile::Sections sections_;
+// uint32_t numReads_;
+
+// // lookup structures
+// SubreadLookupData subreadData_;
+// MappedLookupData mappedData_;
+// ReferenceLookupData referenceData_;
+// BarcodeLookupData barcodeData_;
+
+//private:
+// // not-implemented - ensure no copy
+// PbiIndexPrivate(const PbiIndexPrivate& other);
+// PbiIndexPrivate& operator=(const PbiIndexPrivate& other);
+//};
+
+//// ----------------
+//// helper methods
+//// ----------------
+
+//inline IndexResultBlocks mergedIndexBlocks(IndexList&& indices)
+//{
+// if (indices.empty())
+// return IndexResultBlocks();
+// std::sort(indices.begin(), indices.end());
+
+// IndexResultBlocks result;
+// result.push_back(IndexResultBlock(indices.at(0), 1));
+// const size_t numIndices = indices.size();
+// for (size_t i = 1; i < numIndices; ++i) {
+// if (indices.at(i) == indices.at(i-1)+1)
+// ++result.back().numReads_;
+// else
+// result.push_back(IndexResultBlock(indices.at(i), 1));
+// }
+// return result;
+//}
+
+//inline IndexResultBlocks mergedIndexBlocks(const IndexList& indices)
+//{
+// IndexList copy = indices;
+// return mergedIndexBlocks(std::move(copy));
+//}
+
+//inline size_t nullIndex(void)
+//{ return static_cast<size_t>(-1); }
+
+//inline
+//void pushBackIndices(IndexList& result,
+// const IndexList& toAppend)
+//{
+// result.reserve(result.size() + toAppend.size());
+// for (auto element : toAppend)
+// result.push_back(element);
+//}
+
+//// -----------------
+//// OrderedLookup
+//// -----------------
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(void) { }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(size_t n)
+//{ data_.reserve(n); }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(const ContainerType& data)
+// : data_(data)
+//{ }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(ContainerType&& data)
+// : data_(std::move(data))
+//{ }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(const std::vector<T>& rawData)
+//{
+// const size_t numElements = rawData.size();
+// for (size_t i = 0; i < numElements; ++i)
+// data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(std::vector<T>&& rawData)
+//{
+// const size_t numElements = rawData.size();
+// for (size_t i = 0; i < numElements; ++i)
+// data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline bool OrderedLookup<T>::operator==(const OrderedLookup<T>& other) const
+//{ return data_ == other.data_; }
+
+//template<typename T>
+//inline bool OrderedLookup<T>::operator!=(const OrderedLookup<T>& other) const
+//{ return !(*this == other); }
+
+//template<typename T>
+//inline IndexList
+//OrderedLookup<T>::LookupInclusiveRange(const IterType& begin,
+// const IterType& end) const
+//{
+// IndexList result;
+// for ( auto iter = begin; iter != end; ++iter )
+// pushBackIndices(result, iter->second);
+// std::sort(result.begin(), result.end());
+// return result;
+//}
+
+//template<typename T>
+//inline IndexList
+//OrderedLookup<T>::LookupExclusiveRange(const IterType& begin,
+// const IterType& end,
+// const KeyType& key) const
+//{
+// IndexList result;
+// for ( auto iter = begin; iter != end; ++iter ) {
+// if (iter->first != key)
+// pushBackIndices(result, iter->second);
+// }
+// std::sort(result.begin(), result.end());
+// return result;
+//}
+
+//template<typename T>
+//inline IndexList
+//OrderedLookup<T>::LookupIndices(const OrderedLookup::KeyType& key,
+// const CompareType& compare) const
+//{
+// const IterType begin = data_.cbegin();
+// const IterType end = data_.cend();
+// switch(compare)
+// {
+// case CompareType::EQUAL:
+// {
+// const auto found = data_.find(key);
+// if (found != end)
+// return found->second;
+// return IndexList();
+// }
+// case CompareType::LESS_THAN: return LookupExclusiveRange(begin, data_.upper_bound(key), key);
+// case CompareType::LESS_THAN_EQUAL: return LookupInclusiveRange(begin, data_.upper_bound(key));
+// case CompareType::GREATER_THAN: return LookupExclusiveRange(data_.lower_bound(key), end, key);
+// case CompareType::GREATER_THAN_EQUAL: return LookupInclusiveRange(data_.lower_bound(key), end);
+// case CompareType::NOT_EQUAL: return LookupExclusiveRange(begin, end, key);
+// default:
+// assert(false);
+// }
+// return IndexList();
+//}
+
+//// -----------------
+//// UnorderedLookup
+//// -----------------
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(void) { }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(size_t n)
+//{ data_.reserve(n); }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(const ContainerType& data)
+// : data_(data)
+//{ }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(ContainerType&& data)
+// : data_(std::move(data))
+//{ }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(const std::vector<T> &rawData)
+//{
+// const size_t numElements = rawData.size();
+// for (size_t i = 0; i < numElements; ++i)
+// data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(std::vector<T>&& rawData)
+//{
+// const size_t numElements = rawData.size();
+// for (size_t i = 0; i < numElements; ++i)
+// data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline bool UnorderedLookup<T>::operator==(const UnorderedLookup<T>& other) const
+//{ return data_ == other.data_; }
+
+//template<typename T>
+//inline bool UnorderedLookup<T>::operator!=(const UnorderedLookup<T>& other) const
+//{ return !(*this == other); }
+
+//template<typename T>
+//template<typename Compare>
+//inline IndexList
+//UnorderedLookup<T>::LookupHelper(const UnorderedLookup::KeyType& key,
+// const Compare& cmp) const
+//{
+// auto iter = data_.cbegin();
+// const auto end = data_.cend();
+// IndexList result; // init with some avg size ??
+// for ( ; iter != end; ++iter ) {
+// const auto e = (iter->first);
+// if (cmp(e, key))
+// pushBackIndices(result, iter->second);
+// }
+// std::sort(result.begin(), result.end());
+// return result;
+//}
+
+//template<typename T>
+//inline IndexList
+//UnorderedLookup<T>::LookupIndices(const UnorderedLookup::KeyType& key,
+// const CompareType& compare) const
+//{
+// switch (compare) {
+// case CompareType::EQUAL:
+// {
+// const auto found = data_.find(key);
+// if (found != data_.cend())
+// return found->second;
+// else
+// return IndexList();
+// }
+// case CompareType::LESS_THAN: return LookupHelper(key, std::less<KeyType>());
+// case CompareType::LESS_THAN_EQUAL: return LookupHelper(key, std::less_equal<KeyType>());
+// case CompareType::GREATER_THAN: return LookupHelper(key, std::greater<KeyType>());
+// case CompareType::GREATER_THAN_EQUAL: return LookupHelper(key, std::greater_equal<KeyType>());
+// case CompareType::NOT_EQUAL: return LookupHelper(key, std::not_equal_to<KeyType>());
+// default:
+// assert(false);
+// }
+// return IndexList();
+//}
+
+//// -------------------
+//// SubreadLookupData
+//// -------------------
+
+//inline
+//void SubreadLookupData::ApplyOffsets(IndexResultBlocks& blocks) const
+//{
+// for (IndexResultBlock& block : blocks)
+// block.virtualOffset_ = fileOffset_.at(block.firstIndex_);
+//}
+
+//template<typename T>
+//inline IndexList SubreadLookupData::Indices(const SubreadField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{
+// switch(field) {
+// case SubreadField::RG_ID: return rgId_.LookupIndices(value, compareType);
+// case SubreadField::Q_START: return qStart_.LookupIndices(value, compareType);
+// case SubreadField::Q_END: return qEnd_.LookupIndices(value, compareType);
+// case SubreadField::ZMW: return holeNumber_.LookupIndices(value, compareType);
+// case SubreadField::READ_QUALITY: return readQual_.LookupIndices(value, compareType);
+
+// case SubreadField::VIRTUAL_OFFSET : // fall-through, not supported this way
+// default:
+// assert(false);
+// }
+// return IndexList();
+//}
+
+//template<typename T>
+//inline IndexList SubreadLookupData::IndicesMulti(const SubreadField& field,
+// const std::vector<T>& values) const
+//{
+// IndexList result;
+// for (auto value : values) {
+// const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+// result.reserve(result.size() + valueIndices.size());
+// for (auto i : valueIndices)
+// result.push_back(i);
+// }
+// return result;
+//}
+
+//// -------------------
+//// MappedLookupData
+//// -------------------
+
+//template<typename T>
+//inline IndexList MappedLookupData::Indices(const MappedField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{
+// switch(field) {
+// case MappedField::T_ID: return tId_.LookupIndices(value, compareType);
+// case MappedField::T_START: return tStart_.LookupIndices(value, compareType);
+// case MappedField::T_END: return tEnd_.LookupIndices(value, compareType);
+// case MappedField::A_START: return aStart_.LookupIndices(value, compareType);
+// case MappedField::A_END: return aEnd_.LookupIndices(value, compareType);
+// case MappedField::N_M: return nM_.LookupIndices(value, compareType);
+// case MappedField::N_MM: return nM_.LookupIndices(value, compareType);
+// case MappedField::MAP_QUALITY: return mapQV_.LookupIndices(value, compareType);
+
+// // MappedField::STRAND has its own specialization
+
+// default:
+// assert(false);
+// }
+// return IndexList();
+//}
+
+//template<>
+//inline IndexList MappedLookupData::Indices(const MappedField& field,
+// const Strand& strand,
+// const CompareType& compareType) const
+//{
+// assert(field == MappedField::STRAND);
+
+// if (compareType == CompareType::EQUAL) {
+// if (strand == Strand::FORWARD)
+// return forwardStrand_;
+// else
+// return reverseStrand_;
+// } else if (compareType == CompareType::NOT_EQUAL) {
+// if (strand == Strand::FORWARD)
+// return reverseStrand_;
+// else
+// return forwardStrand_;
+// }
+
+// // only EQUAL/NOT_EQUAL supported
+// assert(false);
+// return IndexList();
+//}
+
+//template<typename T>
+//inline IndexList MappedLookupData::IndicesMulti(const MappedField& field,
+// const std::vector<T>& values) const
+//{
+// IndexList result;
+// for (auto value : values) {
+// const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+// result.reserve(result.size() + valueIndices.size());
+// for (auto i : valueIndices)
+// result.push_back(i);
+// }
+// return result;
+//}
+
+
+//// ---------------------
+//// ReferenceLookupData
+//// ---------------------
+
+//inline IndexRange ReferenceLookupData::Indices(const int32_t tId) const
+//{
+// auto found = references_.find(tId);
+// if (found == references_.cend())
+// return IndexRange(nullIndex(), nullIndex());
+// return found->second;
+//}
+
+//// -------------------
+//// BarcodeLookupData
+//// -------------------
+
+//template<typename T>
+//inline IndexList BarcodeLookupData::Indices(const BarcodeField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{
+// switch(field) {
+// case BarcodeField::BC_LEFT: return bcLeft_.LookupIndices(value, compareType);
+// case BarcodeField::BC_RIGHT: return bcRight_.LookupIndices(value, compareType);
+// case BarcodeField::BC_QUALITY: return bcQual_.LookupIndices(value, compareType);
+// case BarcodeField::CONTEXT_FLAG: return ctxtFlag_.LookupIndices(value, compareType);
+// default:
+// assert(false);
+// }
+// return IndexList();
+//}
+
+//template<typename T>
+//inline IndexList BarcodeLookupData::IndicesMulti(const BarcodeField& field,
+// const std::vector<T>& values) const
+//{
+// IndexList result;
+// for (auto value : values) {
+// const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+// result.reserve(result.size() + valueIndices.size());
+// for (auto i : valueIndices)
+// result.push_back(i);
+// }
+// return result;
+//}
+
+
+//// -----------------
+//// PbiIndexPrivate
+//// -----------------
+
+//inline bool PbiIndexPrivate::HasSection(const PbiFile::Section flag) const
+//{ return (sections_ & flag) != 0; }
+
+//inline void PbiIndexPrivate::SetSection(const PbiFile::Section flag, bool ok)
+//{ if (ok) sections_ |= flag; else sections_ &= ~flag; }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::Indices(const SubreadField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{ return subreadData_.Indices(field, value, compareType); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::Indices(const MappedField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{ return mappedData_.Indices(field, value, compareType); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::Indices(const BarcodeField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{ return barcodeData_.Indices(field, value, compareType); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::IndicesMulti(const SubreadField& field,
+// const T& value) const
+//{ return subreadData_.IndicesMulti(field, value); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::IndicesMulti(const MappedField& field,
+// const T& value) const
+//{ return mappedData_.IndicesMulti(field, value); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::IndicesMulti(const BarcodeField& field,
+// const T& value) const
+//{ return barcodeData_.IndicesMulti(field, value); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::Lookup(const SubreadField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{ return MergeBlocksWithOffsets(subreadData_.Indices(field, value, compareType)); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::Lookup(const MappedField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{
+// if (!HasSection(PbiFile::MAPPED))
+// return IndexResultBlocks();
+// return MergeBlocksWithOffsets(mappedData_.Indices(field, value, compareType));
+//}
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::Lookup(const BarcodeField& field,
+// const T& value,
+// const CompareType& compareType) const
+//{
+// if (!HasSection(PbiFile::BARCODE))
+// return IndexResultBlocks();
+// return MergeBlocksWithOffsets(barcodeData_.Indices(field, value, compareType));
+//}
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupMulti(const SubreadField& field,
+// const std::vector<T>& values) const
+//{ return MergeBlocksWithOffsets(subreadData_.IndicesMulti(field, values)); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupMulti(const MappedField& field,
+// const std::vector<T>& values) const
+//{ return MergeBlocksWithOffsets(mappedData_.IndicesMulti(field, values)); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupMulti(const BarcodeField& field,
+// const std::vector<T>& values) const
+//{ return MergeBlocksWithOffsets(barcodeData_.IndicesMulti(field, values)); }
+
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupReference(const int32_t tId) const
+//{
+// if (!HasSection(PbiFile::REFERENCE))
+// return IndexResultBlocks();
+// const IndexRange& indexRange = referenceData_.Indices(tId);
+// if (indexRange.first == nullIndex() && indexRange.second == nullIndex())
+// return IndexResultBlocks();
+// const size_t numReads = indexRange.second - indexRange.first;
+// IndexResultBlocks blocks(1, IndexResultBlock(indexRange.first, numReads));
+// subreadData_.ApplyOffsets(blocks);
+// return blocks;
+//}
+
+//inline IndexResultBlocks
+//PbiIndexPrivate::MergeBlocksWithOffsets(const IndexList& indices) const
+//{
+// IndexResultBlocks blocks = mergedIndexBlocks(indices);
+// subreadData_.ApplyOffsets(blocks);
+// return blocks;
+//}
+
+//} // namespace internal
+
+//template<typename FieldType, typename ValueType>
+//inline IndexRequestBase<FieldType, ValueType>::IndexRequestBase(const FieldType field,
+// const ValueType& value,
+// const CompareType compareType)
+// : field_(field)
+// , value_(value)
+// , compareType_(compareType)
+//{ }
+
+//template<typename FieldType, typename ValueType>
+//inline IndexMultiRequestBase<FieldType, ValueType>::IndexMultiRequestBase(const FieldType field,
+// const std::vector<ValueType>& values)
+// : field_(field)
+// , values_(values)
+//{ }
+
+//template<SubreadField field, typename ValueType>
+//inline SubreadIndexRequest<field, ValueType>::SubreadIndexRequest(const ValueType& value,
+// const CompareType& compareType)
+// : IndexRequestBase<SubreadField, ValueType>(field, value, compareType)
+//{ }
+
+//template<SubreadField field, typename ValueType>
+//inline SubreadIndexMultiRequest<field, ValueType>::SubreadIndexMultiRequest(const std::vector<ValueType>& values)
+// : IndexMultiRequestBase<SubreadField, ValueType>(field, values)
+//{ }
+
+//template<MappedField field, typename ValueType>
+//inline MappedIndexRequest<field, ValueType>::MappedIndexRequest(const ValueType& value,
+// const CompareType& compareType)
+// : IndexRequestBase<MappedField, ValueType>(field, value, compareType)
+//{ }
+
+//template<MappedField field, typename ValueType>
+//inline MappedIndexMultiRequest<field, ValueType>::MappedIndexMultiRequest(const std::vector<ValueType>& values)
+// : IndexMultiRequestBase<MappedField, ValueType>(field, values)
+//{ }
+
+//template<BarcodeField field, typename ValueType>
+//inline BarcodeIndexRequest<field, ValueType>::BarcodeIndexRequest(const ValueType& value,
+// const CompareType& compareType)
+// : IndexRequestBase<BarcodeField, ValueType>(field, value, compareType)
+//{ }
+
+//template<BarcodeField field, typename ValueType>
+//inline BarcodeIndexMultiRequest<field, ValueType>::BarcodeIndexMultiRequest(const std::vector<ValueType>& values)
+// : IndexMultiRequestBase<BarcodeField, ValueType>(field, values)
+//{ }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexList
+//PbiIndex::RawIndices(const IndexRequestBase<FieldType, ValueType>& request) const
+//{ return d_->Indices(request.field_, request.value_, request.compareType_); }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexList
+//PbiIndex::RawIndices(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+//{ return d_->Indices(request.field_, request.values_); }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexResultBlocks
+//PbiIndex::Lookup(const IndexRequestBase<FieldType, ValueType>& request) const
+//{ return d_->Lookup(request.field_, request.value_, request.compareType_); }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexResultBlocks
+//PbiIndex::Lookup(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+//{ return d_->LookupMulti(request.field_, request.values_); }
+
+//inline IndexResultBlocks PbiIndex::LookupReference(const int32_t tId) const
+//{ return d_->LookupReference(tId); }
+
+//} // namespace BAM
+//} // namespace PacBio
+
+//#endif // PACBIOINDEX_P_H
diff --git a/include/pbbam/internal/PbiIndex_p.inl b/include/pbbam/internal/PbiIndex_p.inl
new file mode 100644
index 0000000..41dc831
--- /dev/null
+++ b/include/pbbam/internal/PbiIndex_p.inl
@@ -0,0 +1,927 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/PbiFile.h"
+#include "pbbam/PbiIndex.h"
+#include "pbbam/PbiRawData.h"
+
+#include <algorithm>
+#include <map>
+#include <memory>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// --------------------------
+// Ordered Lookup Container (e.g. map)
+// --------------------------
+
+template<typename T>
+class OrderedLookup
+{
+public:
+ typedef T KeyType;
+ typedef IndexList ValueType;
+ typedef std::map<KeyType, ValueType> ContainerType;
+ typedef typename ContainerType::const_iterator IterType;
+
+public:
+ OrderedLookup(void);
+ OrderedLookup(size_t n);
+ OrderedLookup(const ContainerType& data);
+ OrderedLookup(ContainerType&& data);
+ OrderedLookup(const std::vector<T>& rawData);
+ OrderedLookup(std::vector<T>&& rawData);
+
+public:
+ bool operator==(const OrderedLookup<T>& other) const;
+ bool operator!=(const OrderedLookup<T>& other) const;
+
+public:
+ IndexList LookupIndices(const KeyType& key,
+ const CompareType& compare) const;
+
+private:
+ IndexList LookupInclusiveRange(const IterType& begin,
+ const IterType& end) const;
+
+ IndexList LookupExclusiveRange(const IterType& begin,
+ const IterType& end,
+ const KeyType& key) const;
+
+private:
+ ContainerType data_;
+};
+
+// --------------------------
+// Unordered Lookup Container (e.g. hash)
+// --------------------------
+
+template<typename T>
+class UnorderedLookup
+{
+public:
+ typedef T KeyType;
+ typedef IndexList ValueType;
+ typedef std::unordered_map<KeyType, ValueType> ContainerType;
+
+public:
+ UnorderedLookup(void);
+ UnorderedLookup(size_t n);
+ UnorderedLookup(const ContainerType& data);
+ UnorderedLookup(ContainerType&& data);
+ UnorderedLookup(const std::vector<T>& rawData);
+ UnorderedLookup(std::vector<T>&& rawData);
+
+public:
+ bool operator==(const UnorderedLookup<T>& other) const;
+ bool operator!=(const UnorderedLookup<T>& other) const;
+
+public:
+ IndexList LookupIndices(const KeyType& key,
+ const CompareType& compare) const;
+
+private:
+ template<typename Compare>
+ IndexList LookupHelper(const KeyType& key, const Compare& cmp) const;
+
+private:
+ ContainerType data_;
+};
+
+// ----------------
+// Subread Data
+// ----------------
+
+struct SubreadLookupData
+{
+ // ctors
+ SubreadLookupData(void);
+ SubreadLookupData(const PbiRawSubreadData& rawData);
+// SubreadLookupData(PbiRawSubreadData&& rawData);
+
+ // add offset data to index result blocks
+ void ApplyOffsets(IndexResultBlocks& blocks) const;
+
+ template<typename T>
+ IndexList Indices(const SubreadField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexList IndicesMulti(const SubreadField& field,
+ const std::vector<T>& values) const;
+
+ // map ordering doesn't make sense, optimize for direct lookup
+ UnorderedLookup<int32_t> rgId_;
+
+ // numeric comparisons make sense, keep key ordering preserved
+ OrderedLookup<int32_t> qStart_;
+ OrderedLookup<int32_t> qEnd_;
+ OrderedLookup<int32_t> holeNumber_;
+ OrderedLookup<uint16_t> readQual_;
+
+ // offsets
+ std::vector<int64_t> fileOffset_;
+};
+
+// -----------------
+// Mapped Data
+// -----------------
+
+struct MappedLookupData
+{
+ // ctors
+ MappedLookupData(void);
+ MappedLookupData(const PbiRawMappedData& rawData);
+// MappedLookupData(PbiRawMappedData&& rawData);
+
+ template<typename T>
+ IndexList Indices(const MappedField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexList IndicesMulti(const MappedField& field,
+ const std::vector<T>& values) const;
+
+ // numeric comparisons make sense, keep key ordering preserved
+ OrderedLookup<int32_t> tId_;
+ OrderedLookup<uint32_t> tStart_;
+ OrderedLookup<uint32_t> tEnd_;
+ OrderedLookup<uint32_t> aStart_;
+ OrderedLookup<uint32_t> aEnd_;
+ OrderedLookup<uint32_t> nM_;
+ OrderedLookup<uint32_t> nMM_;
+ OrderedLookup<uint8_t> mapQV_;
+
+ // generated, not stored in PBI
+ OrderedLookup<uint32_t> nIns_;
+ OrderedLookup<uint32_t> nDel_;
+
+ // no need for map overhead, just store direct indices
+ IndexList reverseStrand_;
+ IndexList forwardStrand_;
+};
+
+// ------------------
+// Reference Data
+// ------------------
+
+struct ReferenceLookupData
+{
+ // ctors
+ ReferenceLookupData(void);
+ ReferenceLookupData(const PbiRawReferenceData& rawData);
+// ReferenceLookupData(PbiRawReferenceData&& rawData);
+
+ IndexRange Indices(const int32_t tId) const;
+
+ // references_[tId] = (begin, end) indices
+ // into SubreadLookupData::fileOffset_
+ std::unordered_map<int32_t, IndexRange> references_;
+};
+
+// ---------------
+// Barcode Data
+// ---------------
+
+struct BarcodeLookupData
+{
+ // ctors
+ BarcodeLookupData(void);
+ BarcodeLookupData(const PbiRawBarcodeData& rawData);
+// BarcodeLookupData(PbiRawBarcodeData&& rawData);
+
+ template<typename T>
+ IndexList Indices(const BarcodeField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexList IndicesMulti(const BarcodeField& field,
+ const std::vector<T>& values) const;
+
+ // numeric comparisons make sense, keep key ordering preserved
+ OrderedLookup<uint16_t> bcLeft_;
+ OrderedLookup<uint16_t> bcRight_;
+ OrderedLookup<uint8_t> bcQual_;
+
+ // see if this works, or if can use unordered, 'direct' query
+ OrderedLookup<uint8_t> ctxtFlag_;
+};
+
+// --------------------------
+// Pbi Lookup Aggregate
+// --------------------------
+
+class PbiIndexPrivate
+{
+public:
+ PbiIndexPrivate(void);
+ PbiIndexPrivate(const PbiRawData& rawIndex);
+ PbiIndexPrivate(PbiRawData&& rawIndex);
+
+ std::unique_ptr<PbiIndexPrivate> DeepCopy(void) const;
+
+public:
+ bool HasSection(const PbiFile::Section flag) const;
+ void SetSection(const PbiFile::Section flag, bool ok = true);
+
+public:
+
+ template<typename T>
+ IndexList Indices(const SubreadField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexList Indices(const MappedField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexList Indices(const BarcodeField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexList IndicesMulti(const SubreadField& field,
+ const T& value) const;
+
+ template<typename T>
+ IndexList IndicesMulti(const MappedField& field,
+ const T& value) const;
+
+ template<typename T>
+ IndexList IndicesMulti(const BarcodeField& field,
+ const T& value) const;
+
+ template<typename T>
+ IndexResultBlocks Lookup(const SubreadField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexResultBlocks Lookup(const MappedField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexResultBlocks Lookup(const BarcodeField& field,
+ const T& value,
+ const CompareType& compareType) const;
+
+ template<typename T>
+ IndexResultBlocks LookupMulti(const SubreadField& field,
+ const std::vector<T>& values) const;
+
+ template<typename T>
+ IndexResultBlocks LookupMulti(const MappedField& field,
+ const std::vector<T>& values) const;
+
+ template<typename T>
+ IndexResultBlocks LookupMulti(const BarcodeField& field,
+ const std::vector<T>& values) const;
+
+ IndexResultBlocks LookupReference(const int32_t tId) const;
+
+private:
+ IndexResultBlocks MergeBlocksWithOffsets(const IndexList& indices) const;
+
+public:
+ PbiFile::VersionEnum version_;
+ PbiFile::Sections sections_;
+ uint32_t numReads_;
+
+ // lookup structures
+ SubreadLookupData subreadData_;
+ MappedLookupData mappedData_;
+ ReferenceLookupData referenceData_;
+ BarcodeLookupData barcodeData_;
+
+private:
+ // not-implemented - ensure no copy
+ PbiIndexPrivate(const PbiIndexPrivate& other);
+ PbiIndexPrivate& operator=(const PbiIndexPrivate& other);
+};
+
+// ----------------
+// helper methods
+// ----------------
+
+inline IndexResultBlocks mergedIndexBlocks(IndexList&& indices)
+{
+ if (indices.empty())
+ return IndexResultBlocks();
+ std::sort(indices.begin(), indices.end());
+
+ IndexResultBlocks result;
+ result.push_back(IndexResultBlock(indices.at(0), 1));
+ const size_t numIndices = indices.size();
+ for (size_t i = 1; i < numIndices; ++i) {
+ if (indices.at(i) == indices.at(i-1)+1)
+ ++result.back().numReads_;
+ else
+ result.push_back(IndexResultBlock(indices.at(i), 1));
+ }
+ return result;
+}
+
+inline IndexResultBlocks mergedIndexBlocks(const IndexList& indices)
+{
+ IndexList copy = indices;
+ return mergedIndexBlocks(std::move(copy));
+}
+
+inline size_t nullIndex(void)
+{ return static_cast<size_t>(-1); }
+
+inline
+void pushBackIndices(IndexList& result,
+ const IndexList& toAppend)
+{
+ result.reserve(result.size() + toAppend.size());
+ for (auto element : toAppend)
+ result.push_back(element);
+}
+
+// -----------------
+// OrderedLookup
+// -----------------
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(void) { }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(size_t n)
+{ data_.reserve(n); }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(const ContainerType& data)
+ : data_(data)
+{ }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(ContainerType&& data)
+ : data_(std::move(data))
+{ }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(const std::vector<T>& rawData)
+{
+ const size_t numElements = rawData.size();
+ for (size_t i = 0; i < numElements; ++i)
+ data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(std::vector<T>&& rawData)
+{
+ const size_t numElements = rawData.size();
+ for (size_t i = 0; i < numElements; ++i)
+ data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline bool OrderedLookup<T>::operator==(const OrderedLookup<T>& other) const
+{ return data_ == other.data_; }
+
+template<typename T>
+inline bool OrderedLookup<T>::operator!=(const OrderedLookup<T>& other) const
+{ return !(*this == other); }
+
+template<typename T>
+inline IndexList
+OrderedLookup<T>::LookupInclusiveRange(const IterType& begin,
+ const IterType& end) const
+{
+ IndexList result;
+ for ( auto iter = begin; iter != end; ++iter )
+ pushBackIndices(result, iter->second);
+ std::sort(result.begin(), result.end());
+ return result;
+}
+
+template<typename T>
+inline IndexList
+OrderedLookup<T>::LookupExclusiveRange(const IterType& begin,
+ const IterType& end,
+ const KeyType& key) const
+{
+ IndexList result;
+ for ( auto iter = begin; iter != end; ++iter ) {
+ if (iter->first != key)
+ pushBackIndices(result, iter->second);
+ }
+ std::sort(result.begin(), result.end());
+ return result;
+}
+
+template<typename T>
+inline IndexList
+OrderedLookup<T>::LookupIndices(const OrderedLookup::KeyType& key,
+ const CompareType& compare) const
+{
+ const IterType begin = data_.cbegin();
+ const IterType end = data_.cend();
+ switch(compare)
+ {
+ case CompareType::EQUAL:
+ {
+ const auto found = data_.find(key);
+ if (found != end)
+ return found->second;
+ return IndexList();
+ }
+ case CompareType::LESS_THAN: return LookupExclusiveRange(begin, data_.upper_bound(key), key);
+ case CompareType::LESS_THAN_EQUAL: return LookupInclusiveRange(begin, data_.upper_bound(key));
+ case CompareType::GREATER_THAN: return LookupExclusiveRange(data_.lower_bound(key), end, key);
+ case CompareType::GREATER_THAN_EQUAL: return LookupInclusiveRange(data_.lower_bound(key), end);
+ case CompareType::NOT_EQUAL: return LookupExclusiveRange(begin, end, key);
+ default:
+ assert(false);
+ }
+ return IndexList();
+}
+
+// -----------------
+// UnorderedLookup
+// -----------------
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(void) { }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(size_t n)
+{ data_.reserve(n); }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(const ContainerType& data)
+ : data_(data)
+{ }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(ContainerType&& data)
+ : data_(std::move(data))
+{ }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(const std::vector<T> &rawData)
+{
+ const size_t numElements = rawData.size();
+ for (size_t i = 0; i < numElements; ++i)
+ data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(std::vector<T>&& rawData)
+{
+ const size_t numElements = rawData.size();
+ for (size_t i = 0; i < numElements; ++i)
+ data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline bool UnorderedLookup<T>::operator==(const UnorderedLookup<T>& other) const
+{ return data_ == other.data_; }
+
+template<typename T>
+inline bool UnorderedLookup<T>::operator!=(const UnorderedLookup<T>& other) const
+{ return !(*this == other); }
+
+template<typename T>
+template<typename Compare>
+inline IndexList
+UnorderedLookup<T>::LookupHelper(const UnorderedLookup::KeyType& key,
+ const Compare& cmp) const
+{
+ auto iter = data_.cbegin();
+ const auto end = data_.cend();
+ IndexList result; // init with some avg size ??
+ for ( ; iter != end; ++iter ) {
+ const auto e = (iter->first);
+ if (cmp(e, key))
+ pushBackIndices(result, iter->second);
+ }
+ std::sort(result.begin(), result.end());
+ return result;
+}
+
+template<typename T>
+inline IndexList
+UnorderedLookup<T>::LookupIndices(const UnorderedLookup::KeyType& key,
+ const CompareType& compare) const
+{
+ switch (compare) {
+ case CompareType::EQUAL:
+ {
+ const auto found = data_.find(key);
+ if (found != data_.cend())
+ return found->second;
+ else
+ return IndexList();
+ }
+ case CompareType::LESS_THAN: return LookupHelper(key, std::less<KeyType>());
+ case CompareType::LESS_THAN_EQUAL: return LookupHelper(key, std::less_equal<KeyType>());
+ case CompareType::GREATER_THAN: return LookupHelper(key, std::greater<KeyType>());
+ case CompareType::GREATER_THAN_EQUAL: return LookupHelper(key, std::greater_equal<KeyType>());
+ case CompareType::NOT_EQUAL: return LookupHelper(key, std::not_equal_to<KeyType>());
+ default:
+ assert(false);
+ }
+ return IndexList();
+}
+
+// -------------------
+// SubreadLookupData
+// -------------------
+
+inline
+void SubreadLookupData::ApplyOffsets(IndexResultBlocks& blocks) const
+{
+ for (IndexResultBlock& block : blocks)
+ block.virtualOffset_ = fileOffset_.at(block.firstIndex_);
+}
+
+template<typename T>
+inline IndexList SubreadLookupData::Indices(const SubreadField& field,
+ const T& value,
+ const CompareType& compareType) const
+{
+ switch(field) {
+ case SubreadField::RG_ID: return rgId_.LookupIndices(value, compareType);
+ case SubreadField::Q_START: return qStart_.LookupIndices(value, compareType);
+ case SubreadField::Q_END: return qEnd_.LookupIndices(value, compareType);
+ case SubreadField::ZMW: return holeNumber_.LookupIndices(value, compareType);
+ case SubreadField::READ_QUALITY: return readQual_.LookupIndices(value, compareType);
+
+ case SubreadField::VIRTUAL_OFFSET : // fall-through, not supported this way
+ default:
+ assert(false);
+ }
+ return IndexList();
+}
+
+template<typename T>
+inline IndexList SubreadLookupData::IndicesMulti(const SubreadField& field,
+ const std::vector<T>& values) const
+{
+ IndexList result;
+ for (auto value : values) {
+ const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+ result.reserve(result.size() + valueIndices.size());
+ for (auto i : valueIndices)
+ result.push_back(i);
+ }
+ return result;
+}
+
+// -------------------
+// MappedLookupData
+// -------------------
+
+template<typename T>
+inline IndexList MappedLookupData::Indices(const MappedField& field,
+ const T& value,
+ const CompareType& compareType) const
+{
+ switch(field) {
+ case MappedField::T_ID: return tId_.LookupIndices(value, compareType);
+ case MappedField::T_START: return tStart_.LookupIndices(value, compareType);
+ case MappedField::T_END: return tEnd_.LookupIndices(value, compareType);
+ case MappedField::A_START: return aStart_.LookupIndices(value, compareType);
+ case MappedField::A_END: return aEnd_.LookupIndices(value, compareType);
+ case MappedField::N_M: return nM_.LookupIndices(value, compareType);
+ case MappedField::N_MM: return nM_.LookupIndices(value, compareType);
+ case MappedField::MAP_QUALITY: return mapQV_.LookupIndices(value, compareType);
+
+ // MappedField::STRAND has its own specialization
+
+ default:
+ assert(false);
+ }
+ return IndexList();
+}
+
+template<>
+inline IndexList MappedLookupData::Indices(const MappedField& field,
+ const Strand& strand,
+ const CompareType& compareType) const
+{
+ assert(field == MappedField::STRAND);
+
+ if (compareType == CompareType::EQUAL) {
+ if (strand == Strand::FORWARD)
+ return forwardStrand_;
+ else
+ return reverseStrand_;
+ } else if (compareType == CompareType::NOT_EQUAL) {
+ if (strand == Strand::FORWARD)
+ return reverseStrand_;
+ else
+ return forwardStrand_;
+ }
+
+ // only EQUAL/NOT_EQUAL supported
+ assert(false);
+ return IndexList();
+}
+
+template<typename T>
+inline IndexList MappedLookupData::IndicesMulti(const MappedField& field,
+ const std::vector<T>& values) const
+{
+ IndexList result;
+ for (auto value : values) {
+ const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+ result.reserve(result.size() + valueIndices.size());
+ for (auto i : valueIndices)
+ result.push_back(i);
+ }
+ return result;
+}
+
+
+// ---------------------
+// ReferenceLookupData
+// ---------------------
+
+inline IndexRange ReferenceLookupData::Indices(const int32_t tId) const
+{
+ auto found = references_.find(tId);
+ if (found == references_.cend())
+ return IndexRange(nullIndex(), nullIndex());
+ return found->second;
+}
+
+// -------------------
+// BarcodeLookupData
+// -------------------
+
+template<typename T>
+inline IndexList BarcodeLookupData::Indices(const BarcodeField& field,
+ const T& value,
+ const CompareType& compareType) const
+{
+ switch(field) {
+ case BarcodeField::BC_LEFT: return bcLeft_.LookupIndices(value, compareType);
+ case BarcodeField::BC_RIGHT: return bcRight_.LookupIndices(value, compareType);
+ case BarcodeField::BC_QUALITY: return bcQual_.LookupIndices(value, compareType);
+ case BarcodeField::CONTEXT_FLAG: return ctxtFlag_.LookupIndices(value, compareType);
+ default:
+ assert(false);
+ }
+ return IndexList();
+}
+
+template<typename T>
+inline IndexList BarcodeLookupData::IndicesMulti(const BarcodeField& field,
+ const std::vector<T>& values) const
+{
+ IndexList result;
+ for (auto value : values) {
+ const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+ result.reserve(result.size() + valueIndices.size());
+ for (auto i : valueIndices)
+ result.push_back(i);
+ }
+ return result;
+}
+
+
+// -----------------
+// PbiIndexPrivate
+// -----------------
+
+inline bool PbiIndexPrivate::HasSection(const PbiFile::Section flag) const
+{ return (sections_ & flag) != 0; }
+
+inline void PbiIndexPrivate::SetSection(const PbiFile::Section flag, bool ok)
+{ if (ok) sections_ |= flag; else sections_ &= ~flag; }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::Indices(const SubreadField& field,
+ const T& value,
+ const CompareType& compareType) const
+{ return subreadData_.Indices(field, value, compareType); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::Indices(const MappedField& field,
+ const T& value,
+ const CompareType& compareType) const
+{ return mappedData_.Indices(field, value, compareType); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::Indices(const BarcodeField& field,
+ const T& value,
+ const CompareType& compareType) const
+{ return barcodeData_.Indices(field, value, compareType); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::IndicesMulti(const SubreadField& field,
+ const T& value) const
+{ return subreadData_.IndicesMulti(field, value); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::IndicesMulti(const MappedField& field,
+ const T& value) const
+{ return mappedData_.IndicesMulti(field, value); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::IndicesMulti(const BarcodeField& field,
+ const T& value) const
+{ return barcodeData_.IndicesMulti(field, value); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::Lookup(const SubreadField& field,
+ const T& value,
+ const CompareType& compareType) const
+{ return MergeBlocksWithOffsets(subreadData_.Indices(field, value, compareType)); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::Lookup(const MappedField& field,
+ const T& value,
+ const CompareType& compareType) const
+{
+ if (!HasSection(PbiFile::MAPPED))
+ return IndexResultBlocks();
+ return MergeBlocksWithOffsets(mappedData_.Indices(field, value, compareType));
+}
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::Lookup(const BarcodeField& field,
+ const T& value,
+ const CompareType& compareType) const
+{
+ if (!HasSection(PbiFile::BARCODE))
+ return IndexResultBlocks();
+ return MergeBlocksWithOffsets(barcodeData_.Indices(field, value, compareType));
+}
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::LookupMulti(const SubreadField& field,
+ const std::vector<T>& values) const
+{ return MergeBlocksWithOffsets(subreadData_.IndicesMulti(field, values)); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::LookupMulti(const MappedField& field,
+ const std::vector<T>& values) const
+{ return MergeBlocksWithOffsets(mappedData_.IndicesMulti(field, values)); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::LookupMulti(const BarcodeField& field,
+ const std::vector<T>& values) const
+{ return MergeBlocksWithOffsets(barcodeData_.IndicesMulti(field, values)); }
+
+inline IndexResultBlocks
+PbiIndexPrivate::LookupReference(const int32_t tId) const
+{
+ if (!HasSection(PbiFile::REFERENCE))
+ return IndexResultBlocks();
+ const IndexRange& indexRange = referenceData_.Indices(tId);
+ if (indexRange.first == nullIndex() && indexRange.second == nullIndex())
+ return IndexResultBlocks();
+ const size_t numReads = indexRange.second - indexRange.first;
+ IndexResultBlocks blocks(1, IndexResultBlock(indexRange.first, numReads));
+ subreadData_.ApplyOffsets(blocks);
+ return blocks;
+}
+
+inline IndexResultBlocks
+PbiIndexPrivate::MergeBlocksWithOffsets(const IndexList& indices) const
+{
+ IndexResultBlocks blocks = mergedIndexBlocks(indices);
+ subreadData_.ApplyOffsets(blocks);
+ return blocks;
+}
+
+} // namespace internal
+
+template<typename FieldType, typename ValueType>
+inline IndexRequestBase<FieldType, ValueType>::IndexRequestBase(const FieldType field,
+ const ValueType& value,
+ const CompareType compareType)
+ : field_(field)
+ , value_(value)
+ , compareType_(compareType)
+{ }
+
+template<typename FieldType, typename ValueType>
+inline IndexMultiRequestBase<FieldType, ValueType>::IndexMultiRequestBase(const FieldType field,
+ const std::vector<ValueType>& values)
+ : field_(field)
+ , values_(values)
+{ }
+
+template<SubreadField field, typename ValueType>
+inline SubreadIndexRequest<field, ValueType>::SubreadIndexRequest(const ValueType& value,
+ const CompareType& compareType)
+ : IndexRequestBase<SubreadField, ValueType>(field, value, compareType)
+{ }
+
+template<SubreadField field, typename ValueType>
+inline SubreadIndexMultiRequest<field, ValueType>::SubreadIndexMultiRequest(const std::vector<ValueType>& values)
+ : IndexMultiRequestBase<SubreadField, ValueType>(field, values)
+{ }
+
+template<MappedField field, typename ValueType>
+inline MappedIndexRequest<field, ValueType>::MappedIndexRequest(const ValueType& value,
+ const CompareType& compareType)
+ : IndexRequestBase<MappedField, ValueType>(field, value, compareType)
+{ }
+
+template<MappedField field, typename ValueType>
+inline MappedIndexMultiRequest<field, ValueType>::MappedIndexMultiRequest(const std::vector<ValueType>& values)
+ : IndexMultiRequestBase<MappedField, ValueType>(field, values)
+{ }
+
+template<BarcodeField field, typename ValueType>
+inline BarcodeIndexRequest<field, ValueType>::BarcodeIndexRequest(const ValueType& value,
+ const CompareType& compareType)
+ : IndexRequestBase<BarcodeField, ValueType>(field, value, compareType)
+{ }
+
+template<BarcodeField field, typename ValueType>
+inline BarcodeIndexMultiRequest<field, ValueType>::BarcodeIndexMultiRequest(const std::vector<ValueType>& values)
+ : IndexMultiRequestBase<BarcodeField, ValueType>(field, values)
+{ }
+
+template <typename FieldType, typename ValueType>
+inline IndexList
+PbiIndex::RawIndices(const IndexRequestBase<FieldType, ValueType>& request) const
+{ return d_->Indices(request.field_, request.value_, request.compareType_); }
+
+template <typename FieldType, typename ValueType>
+inline IndexList
+PbiIndex::RawIndices(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+{ return d_->Indices(request.field_, request.values_); }
+
+template <typename FieldType, typename ValueType>
+inline IndexResultBlocks
+PbiIndex::Lookup(const IndexRequestBase<FieldType, ValueType>& request) const
+{ return d_->Lookup(request.field_, request.value_, request.compareType_); }
+
+template <typename FieldType, typename ValueType>
+inline IndexResultBlocks
+PbiIndex::Lookup(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+{ return d_->LookupMulti(request.field_, request.values_); }
+
+inline IndexResultBlocks PbiIndex::LookupReference(const int32_t tId) const
+{ return d_->LookupReference(tId); }
+
+} // namespace BAM
+} // namespace PacBio
+
diff --git a/include/pbbam/internal/QueryBase.h b/include/pbbam/internal/QueryBase.h
new file mode 100644
index 0000000..7c16f87
--- /dev/null
+++ b/include/pbbam/internal/QueryBase.h
@@ -0,0 +1,218 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef QUERYBASE2_H
+#define QUERYBASE2_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/DataSet.h"
+#include "pbbam/internal/FilterEngine.h"
+#include "pbbam/internal/IBamFileIterator.h"
+#include "pbbam/internal/IMergeStrategy.h"
+#include <memory>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+class QueryBase;
+
+template<typename T>
+class QueryIteratorBase
+{
+protected:
+ QueryIteratorBase(void);
+ QueryIteratorBase(QueryBase<T>& query);
+
+public:
+ virtual ~QueryIteratorBase(void) { }
+
+protected:
+ void ReadNext(void);
+
+public:
+ bool operator==(const QueryIteratorBase<T>& other) const
+ { return query_ == other.query_; }
+
+ bool operator!=(const QueryIteratorBase<T>& other) const
+ { return !(*this == other); }
+
+protected:
+ QueryBase<T>* query_;
+ T record_;
+};
+
+template<typename T>
+class QueryIterator : public QueryIteratorBase<T>
+{
+public:
+ QueryIterator(void) : QueryIteratorBase<T>() { }
+ QueryIterator(QueryBase<T>& query)
+ : QueryIteratorBase<T>(query)
+ { }
+
+ T& operator*(void) { return QueryIteratorBase<T>::record_; }
+ T* operator->(void) { return &(operator*()); }
+
+ QueryIterator<T>& operator++(void)
+ { QueryIteratorBase<T>::ReadNext(); return *this; }
+
+ QueryIterator<T> operator++(int)
+ {
+ QueryIterator<T> result(*this);
+ ++(*this);
+ return result;
+ }
+};
+
+template<typename T>
+class QueryConstIterator : public QueryIteratorBase<T>
+{
+public:
+ QueryConstIterator(void) : QueryIteratorBase<T>() { }
+ QueryConstIterator(const QueryBase<T>& query)
+ : QueryIteratorBase<T>(const_cast<QueryBase<T>&>(query))
+ { }
+
+ const T& operator*(void) const { return QueryIteratorBase<T>::record_; }
+ const T* operator->(void) const { return &(operator*()); }
+
+ QueryConstIterator<T>& operator++(void)
+ { QueryIteratorBase<T>::ReadNext(); return *this; }
+
+ QueryConstIterator<T> operator++(int)
+ {
+ QueryConstIterator<T> result(*this);
+ ++(*this);
+ return result;
+ }
+};
+
+template<typename T>
+class QueryBase {
+
+public:
+ typedef QueryIterator<T> iterator;
+ typedef QueryConstIterator<T> const_iterator;
+
+ typedef typename IBamFileIteratorBase<T>::Ptr FileIterPtr;
+
+protected:
+ QueryBase(const DataSet& dataset);
+public:
+ virtual ~QueryBase(void) { }
+
+ QueryConstIterator<T> begin(void) const { return QueryConstIterator<T>(*this); }
+ QueryConstIterator<T> cbegin(void) const { return QueryConstIterator<T>(*this); }
+ QueryIterator<T> begin(void) { return QueryIterator<T>(*this); }
+
+ QueryConstIterator<T> end(void) const { return QueryConstIterator<T>(); }
+ QueryConstIterator<T> cend(void) const { return QueryConstIterator<T>(); }
+ QueryIterator<T> end(void) { return QueryIterator<T>(); }
+
+public:
+ bool GetNext(T& r);
+
+ std::vector<BamFile> GetBamFiles(void) const
+ { return dataset_.ExternalResources().BamFiles(); }
+
+public:
+ std::vector<FileIterPtr> CreateIterators(void)
+ {
+ const std::vector<BamFile>& bamFiles = dataset_.ExternalResources().BamFiles();
+ std::vector<FileIterPtr> result;
+ result.reserve(bamFiles.size());
+ for (const BamFile& bamFile : bamFiles)
+ result.push_back(CreateIterator(bamFile));
+ return result;
+ }
+
+protected:
+ virtual FileIterPtr CreateIterator(const BamFile& bamFile) = 0;
+
+protected:
+ const DataSet dataset_;
+ std::unique_ptr<IMergeStrategyBase<T> > mergeStrategy_;
+ FilterEngine filterEngine_;
+};
+
+typedef QueryBase<BamRecord> IQuery;
+typedef QueryBase<std::vector<BamRecord> > IGroupQuery;
+
+template<typename T>
+inline QueryIteratorBase<T>::QueryIteratorBase(void)
+ : query_(nullptr)
+{ }
+
+template<typename T>
+inline QueryIteratorBase<T>::QueryIteratorBase(QueryBase<T> &query)
+ : query_(&query)
+{ ReadNext(); }
+
+template<typename T>
+inline QueryBase<T>::QueryBase(const DataSet& dataset)
+ : dataset_(dataset)
+ , mergeStrategy_(nullptr)
+{ }
+
+template<typename T>
+inline bool QueryBase<T>::GetNext(T& r)
+{
+ while (mergeStrategy_->GetNext(r)) {
+ if (filterEngine_.Accepts(r))
+ return true;
+ }
+ return false;
+}
+
+template<typename T>
+inline void QueryIteratorBase<T>::ReadNext(void)
+{
+ assert(query_);
+ if (!query_->GetNext(record_))
+ query_ = nullptr;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // QUERYBASE2_H
diff --git a/include/pbbam/internal/SequentialMergeStrategy.h b/include/pbbam/internal/SequentialMergeStrategy.h
new file mode 100644
index 0000000..cf8e591
--- /dev/null
+++ b/include/pbbam/internal/SequentialMergeStrategy.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef SEQUENTIALMERGESTRATEGY_H
+#define SEQUENTIALMERGESTRATEGY_H
+
+#include "pbbam/internal/IMergeStrategy.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class SequentialMergeStrategy : public IMergeStrategy
+{
+public:
+ SequentialMergeStrategy(const std::vector<FileIterPtr>& iters);
+ bool GetNext(BamRecord& r);
+private:
+ std::vector<FileIterPtr> iters_;
+};
+
+inline SequentialMergeStrategy::SequentialMergeStrategy(const std::vector<FileIterPtr>& iters)
+ : IMergeStrategy()
+ , iters_(iters)
+{ }
+
+inline bool SequentialMergeStrategy::GetNext(BamRecord& r)
+{
+ if (iters_.empty())
+ return false;
+
+ FileIterPtr iter = iters_.front();
+ if (iter->GetNext(r))
+ return true;
+ else {
+ iters_.erase(iters_.begin());
+ return GetNext(r);
+ }
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SEQUENCTIALMERGESTRATEGY_H
diff --git a/include/pbbam/internal/Tag.inl b/include/pbbam/internal/Tag.inl
new file mode 100644
index 0000000..cf9f60a
--- /dev/null
+++ b/include/pbbam/internal/Tag.inl
@@ -0,0 +1,324 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/Tag.h"
+#include <boost/numeric/conversion/cast.hpp>
+#include <iostream>
+
+#ifndef TAG_INL
+#define TAG_INL
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+inline bool InAsciiRange(const T& x)
+{ return (x >=33 && x <= 127); }
+
+struct AsciiConvertVisitor : public boost::static_visitor<char>
+{
+ // only valid for numeric types - maybe even more restrictive?
+ char operator() (const int8_t& x) const { return Helper(x); }
+ char operator() (const uint8_t& x) const { return Helper(x); }
+ char operator() (const int16_t& x) const { return Helper(x); }
+ char operator() (const uint16_t& x) const { return Helper(x); }
+ char operator() (const int32_t& x) const { return Helper(x); }
+ char operator() (const uint32_t& x) const { return Helper(x); }
+
+ // anything else always throws
+ template<typename T>
+ char operator()(const T&) const
+ { throw std::runtime_error("conversion not supported"); return 0; }
+
+private:
+ template<typename T>
+ char Helper(const T& x) const
+ {
+ if (!InAsciiRange(x))
+ throw std::runtime_error("not valid ASCII");
+ return static_cast<char>(x);
+ }
+};
+
+template<typename DesiredType>
+struct NumericConvertVisitor : public boost::static_visitor<DesiredType>
+{
+ // only valid for integral types
+ DesiredType operator() (const int8_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+ DesiredType operator() (const uint8_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+ DesiredType operator() (const int16_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+ DesiredType operator() (const uint16_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+ DesiredType operator() (const int32_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+ DesiredType operator() (const uint32_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+
+ // anything else always throws
+ template<typename T> DesiredType operator()(const T& t) const
+ {
+ const std::string from = typeid(t).name();
+ const std::string to = typeid(DesiredType).name();
+ const std::string msg = std::string("conversion not supported: ") + from + " -> " + to;
+ throw std::runtime_error(msg);
+ return 0;
+ }
+};
+
+typedef NumericConvertVisitor<int8_t> ToInt8ConvertVisitor;
+typedef NumericConvertVisitor<uint8_t> ToUInt8ConvertVisitor;
+typedef NumericConvertVisitor<int16_t> ToInt16ConvertVisitor;
+typedef NumericConvertVisitor<uint16_t> ToUInt16ConvertVisitor;
+typedef NumericConvertVisitor<int32_t> ToInt32ConvertVisitor;
+typedef NumericConvertVisitor<uint32_t> ToUInt32ConvertVisitor;
+
+struct IsEqualVisitor : public boost::static_visitor<bool>
+{
+ template <typename T, typename U>
+ bool operator() (const T&, const U&) const
+ {
+ // maybe allow conversions down the road?
+ // but for now, just fail if types are different
+ return false;
+ }
+
+ bool operator()(const boost::blank&, const boost::blank&) const
+ { return true; }
+
+ template <typename T>
+ bool operator() (const T& lhs, const T& rhs) const
+ { return lhs == rhs; }
+};
+
+struct TypenameVisitor : public boost::static_visitor<std::string>
+{
+ std::string operator() (const boost::blank&) const { return "none"; }
+ std::string operator() (const int8_t&) const { return "int8_t"; }
+ std::string operator() (const uint8_t&) const { return "uint8_t"; }
+ std::string operator() (const int16_t&) const { return "int16_t"; }
+ std::string operator() (const uint16_t&) const { return "uint16_t"; }
+ std::string operator() (const int32_t&) const { return "int32_t"; }
+ std::string operator() (const uint32_t&) const { return "uint32_t"; }
+ std::string operator() (const float&) const { return "float"; }
+ std::string operator() (const std::string&) const { return "string"; }
+ std::string operator() (const std::vector<int8_t>&) const { return "vector<int8_t>"; }
+ std::string operator() (const std::vector<uint8_t>&) const { return "vector<uint8_t>"; }
+ std::string operator() (const std::vector<int16_t>&) const { return "vector<int16_t>"; }
+ std::string operator() (const std::vector<uint16_t>&) const { return "vector<uint16_t>"; }
+ std::string operator() (const std::vector<int32_t>&) const { return "vector<int32_t>"; }
+ std::string operator() (const std::vector<uint32_t>&) const { return "vector<uint32_t>"; }
+ std::string operator() (const std::vector<float>&) const { return "vector<float>"; }
+};
+
+} // namespace internal
+
+inline bool Tag::operator== (const Tag& other) const
+{
+ return boost::apply_visitor(internal::IsEqualVisitor(), data_, other.data_) &&
+ (modifier_ == other.modifier_) ;
+}
+
+inline bool Tag::operator!= (const Tag& other) const
+{ return !(*this == other); }
+
+inline bool Tag::HasModifier(const TagModifier m) const
+{
+ // we just allow one at a time (for now at least)
+ return modifier_ == m;
+}
+
+inline bool Tag::IsNull(void) const
+{ return Type() == TagDataType::INVALID; }
+
+inline bool Tag::IsInt8(void) const
+{ return Type() == TagDataType::INT8; }
+
+inline bool Tag::IsUInt8(void) const
+{ return Type() == TagDataType::UINT8; }
+
+inline bool Tag::IsInt16(void) const
+{ return Type() == TagDataType::INT16; }
+
+inline bool Tag::IsUInt16(void) const
+{ return Type() == TagDataType::UINT16; }
+
+inline bool Tag::IsInt32(void) const
+{ return Type() == TagDataType::INT32; }
+
+inline bool Tag::IsUInt32(void) const
+{ return Type() == TagDataType::UINT32; }
+
+inline bool Tag::IsFloat(void) const
+{ return Type() == TagDataType::FLOAT; }
+
+inline bool Tag::IsString(void) const
+{ return Type() == TagDataType::STRING; }
+
+inline bool Tag::IsHexString(void) const
+{ return IsString() && modifier_ == TagModifier::HEX_STRING; }
+
+inline bool Tag::IsInt8Array(void) const
+{ return Type() == TagDataType::INT8_ARRAY; }
+
+inline bool Tag::IsUInt8Array(void) const
+{ return Type() == TagDataType::UINT8_ARRAY; }
+
+inline bool Tag::IsInt16Array(void) const
+{ return Type() == TagDataType::INT16_ARRAY; }
+
+inline bool Tag::IsUInt16Array(void) const
+{ return Type() == TagDataType::UINT16_ARRAY; }
+
+inline bool Tag::IsInt32Array(void) const
+{ return Type() == TagDataType::INT32_ARRAY; }
+
+inline bool Tag::IsUInt32Array(void) const
+{ return Type() == TagDataType::UINT32_ARRAY; }
+
+inline bool Tag::IsFloatArray(void) const
+{ return Type() == TagDataType::FLOAT_ARRAY; }
+
+inline bool Tag::IsSignedInt(void) const
+{ return IsInt8() || IsInt16() || IsInt32(); }
+
+inline bool Tag::IsUnsignedInt(void) const
+{ return IsUInt8() || IsUInt16() || IsUInt32(); }
+
+inline bool Tag::IsIntegral(void) const
+{ return IsSignedInt() || IsUnsignedInt(); }
+
+inline bool Tag::IsNumeric(void) const
+{ return IsIntegral() || IsFloat(); }
+
+inline bool Tag::IsSignedArray(void) const
+{ return IsInt8Array() || IsInt16Array() || IsInt32Array(); }
+
+inline bool Tag::IsUnsignedArray(void) const
+{ return IsUInt8Array() || IsUInt16Array() || IsUInt32Array(); }
+
+inline bool Tag::IsIntegralArray(void) const
+{ return IsSignedArray() || IsUnsignedArray(); }
+
+inline bool Tag::IsArray(void) const
+{ return IsIntegralArray() || IsFloatArray(); }
+
+inline TagModifier Tag::Modifier(void) const
+{ return modifier_; }
+
+inline Tag& Tag::Modifier(const TagModifier m)
+{ modifier_ = m; return *this; }
+
+inline char Tag::ToAscii(void) const
+{ return boost::apply_visitor(internal::AsciiConvertVisitor(), data_); }
+
+inline int8_t Tag::ToInt8(void) const
+{
+ if (IsInt8())
+ return boost::get<int8_t>(data_);
+ return boost::apply_visitor(internal::ToInt8ConvertVisitor(), data_);
+}
+
+inline uint8_t Tag::ToUInt8(void) const
+{
+ if (IsUInt8())
+ return boost::get<uint8_t>(data_);
+ return boost::apply_visitor(internal::ToUInt8ConvertVisitor(), data_);
+}
+
+inline int16_t Tag::ToInt16(void) const
+{
+ if (IsInt16())
+ return boost::get<int16_t>(data_);
+ return boost::apply_visitor(internal::ToInt16ConvertVisitor(), data_);
+}
+
+inline uint16_t Tag::ToUInt16(void) const
+{
+ if (IsUInt16())
+ return boost::get<uint16_t>(data_);
+ return boost::apply_visitor(internal::ToUInt16ConvertVisitor(), data_);
+}
+
+inline int32_t Tag::ToInt32(void) const
+{
+// if (IsInt32())
+// return boost::get<int32_t>(data_);
+ return boost::apply_visitor(internal::ToInt32ConvertVisitor(), data_);
+}
+
+inline uint32_t Tag::ToUInt32(void) const
+{
+ if (IsUInt32())
+ return boost::get<uint32_t>(data_);
+ return boost::apply_visitor(internal::ToUInt32ConvertVisitor(), data_);
+}
+
+inline float Tag::ToFloat(void) const
+{ return boost::get<float>(data_); }
+
+inline std::string Tag::ToString(void) const
+{ return boost::get<std::string>(data_); }
+
+inline std::vector<int8_t> Tag::ToInt8Array(void) const
+{ return boost::get< std::vector<int8_t> >(data_); }
+
+inline std::vector<uint8_t> Tag::ToUInt8Array(void) const
+{ return boost::get< std::vector<uint8_t> >(data_); }
+
+inline std::vector<int16_t> Tag::ToInt16Array(void) const
+{ return boost::get< std::vector<int16_t> >(data_); }
+
+inline std::vector<uint16_t> Tag::ToUInt16Array(void) const
+{ return boost::get< std::vector<uint16_t> >(data_); }
+
+inline std::vector<int32_t> Tag::ToInt32Array(void) const
+{ return boost::get< std::vector<int32_t> >(data_); }
+
+inline std::vector<uint32_t> Tag::ToUInt32Array(void) const
+{ return boost::get< std::vector<uint32_t> >(data_); }
+
+inline std::vector<float> Tag::ToFloatArray(void) const
+{ return boost::get< std::vector<float> >(data_); }
+
+inline TagDataType Tag::Type(void) const
+{ return TagDataType(data_.which() ); }
+
+inline std::string Tag::Typename(void) const
+{ return boost::apply_visitor(internal::TypenameVisitor(), data_); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // TAG_INL
diff --git a/include/pbbam/virtual/VirtualPolymeraseBamRecord.h b/include/pbbam/virtual/VirtualPolymeraseBamRecord.h
new file mode 100644
index 0000000..86f3ef8
--- /dev/null
+++ b/include/pbbam/virtual/VirtualPolymeraseBamRecord.h
@@ -0,0 +1,136 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#ifndef POLYMERASEBAMRECORD_H
+#define POLYMERASEBAMRECORD_H
+
+#include <vector>
+#include <sstream>
+
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include "pbbam/virtual/VirtualRegion.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+
+namespace PacBio {
+namespace BAM {
+
+/// This class represents a polymerase read stitched on the fly
+/// from subreads|hqregion+scraps.
+class VirtualPolymeraseBamRecord : public BamRecord
+{
+public:
+ VirtualPolymeraseBamRecord(std::vector<BamRecord>&& unorderedSources,
+ const BamHeader& header);
+
+ VirtualPolymeraseBamRecord() = delete;
+ // Move constructor
+ VirtualPolymeraseBamRecord(VirtualPolymeraseBamRecord&&) = default;
+ // Copy constructor
+ VirtualPolymeraseBamRecord(const VirtualPolymeraseBamRecord&) = delete;
+ // Move assignment operator
+ VirtualPolymeraseBamRecord& operator=(VirtualPolymeraseBamRecord&&) = default;
+ // Copy assignment operator
+ VirtualPolymeraseBamRecord& operator=(const VirtualPolymeraseBamRecord&) = delete;
+ // Destructor
+ virtual ~VirtualPolymeraseBamRecord() = default;
+
+public:
+ /// Provides bool if a given VirtualRegionType has been annotated
+ bool HasVirtualRegionType(const VirtualRegionType type) const
+ { return virtualRegionsMap_.find(type) != virtualRegionsMap_.end(); }
+
+ /// Provides annotations of the polymerase read for a given VirtualRegionType
+ std::vector<VirtualRegion> VirtualRegionsTable(const VirtualRegionType type) const
+ { return virtualRegionsMap_.at(type); }
+
+ /// Provides all annotations of the polymerase read as a map
+ std::map<VirtualRegionType, std::vector<VirtualRegion>> VirtualRegionsMap() const
+ { return virtualRegionsMap_; }
+
+public: // New BamRecord functionality.
+ Frames IPDV1Frames(Orientation orientation = Orientation::NATIVE) const;
+
+private:
+ std::vector<BamRecord> sources_;
+ std::map<VirtualRegionType, std::vector<VirtualRegion>> virtualRegionsMap_;
+
+private:
+ void StitchSources();
+
+ /// \brief Appends content of src vector to dst vector using move semantics.
+ /// \param[in] src Input vector that will be empty after execution
+ /// \param[in,out] dest Output vector that will be appended to
+ template <typename T>
+ inline void MoveAppend(std::vector<T>& src, std::vector<T>& dst) noexcept
+ {
+ if (dst.empty())
+ {
+ dst = std::move(src);
+ }
+ else
+ {
+ dst.reserve(dst.size() + src.size());
+ std::move(src.begin(), src.end(), std::back_inserter(dst));
+ src.clear();
+ }
+ }
+
+ /// \brief Appends content of src vector to dst vector using move semantics.
+ /// \param[in] src Input vector via perfect forwarding
+ /// \param[in,out] dest Output vector that will be appended to
+ template <typename T>
+ inline void MoveAppend(std::vector<T>&& src, std::vector<T>& dst) noexcept
+ {
+ if (dst.empty())
+ {
+ dst = std::move(src);
+ }
+ else
+ {
+ dst.reserve(dst.size() + src.size());
+ std::move(src.begin(), src.end(), std::back_inserter(dst));
+ src.clear();
+ }
+ }
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // POLYMERASEBAMRECORD_H
diff --git a/include/pbbam/virtual/VirtualPolymeraseReader.h b/include/pbbam/virtual/VirtualPolymeraseReader.h
new file mode 100644
index 0000000..e166482
--- /dev/null
+++ b/include/pbbam/virtual/VirtualPolymeraseReader.h
@@ -0,0 +1,105 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#ifndef VIRTUALPOLYMERASEREADER_H
+#define VIRTUALPOLYMERASEREADER_H
+
+#include <memory>
+
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/virtual/VirtualPolymeraseBamRecord.h"
+
+namespace PacBio {
+namespace BAM {
+
+class VirtualPolymeraseReader
+{
+public:
+ /// Constructor takes two input bam file paths.
+ /// \param[in] primaryBamFilePath hqregion.bam or subreads.bam file path
+ /// \param[in] scrapsBamFilePath scraps.bam file path
+ VirtualPolymeraseReader(const std::string& primaryBamFilePath,
+ const std::string& scrapsBamFilePath);
+
+ VirtualPolymeraseReader() = delete;
+ // Move constructor
+ VirtualPolymeraseReader(VirtualPolymeraseReader&&) = delete;
+ // Copy constructor
+ VirtualPolymeraseReader(const VirtualPolymeraseReader&) = delete;
+ // Move assignment operator
+ VirtualPolymeraseReader& operator=(VirtualPolymeraseReader&&) = delete;
+ // Copy assignment operator
+ VirtualPolymeraseReader& operator=(const VirtualPolymeraseReader&) = delete;
+ // Destructor
+ ~VirtualPolymeraseReader() = default;
+
+public:
+ /// Provides the next stitched polymerase read
+ VirtualPolymeraseBamRecord Next();
+
+ /// Provides the next set of reads that belong to one ZMW.
+ /// Enables stitching records in a distinct thread.
+ std::vector<BamRecord> NextRaw();
+
+ /// Returns true if more ZMWs are available for reading.
+ bool HasNext();
+
+ BamHeader PrimaryHeader();
+ BamHeader ScrapsHeader();
+
+private:
+ const std::string primaryBamFilePath_;
+ const std::string scrapsBamFilePath_;
+
+ std::unique_ptr<BamFile> primaryBamFile_;
+ std::unique_ptr<BamFile> scrapsBamFile_;
+ std::unique_ptr<EntireFileQuery> primaryQuery_;
+ std::unique_ptr<EntireFileQuery> scrapsQuery_;
+
+ EntireFileQuery::iterator primaryIt_;
+ EntireFileQuery::iterator scrapsIt_;
+
+ std::unique_ptr<BamHeader> polyHeader_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // VIRTUALPOLYMERASEREADER_H
diff --git a/include/pbbam/virtual/VirtualRegion.h b/include/pbbam/virtual/VirtualRegion.h
new file mode 100644
index 0000000..69c16df
--- /dev/null
+++ b/include/pbbam/virtual/VirtualRegion.h
@@ -0,0 +1,103 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#ifndef VIRTUALREGION_H
+#define VIRTUALREGION_H
+
+#include "pbbam/Config.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+#include "pbbam/LocalContextFlags.h"
+
+namespace PacBio {
+namespace BAM {
+/// Represents annotation of a polymerase region.
+struct VirtualRegion
+{
+public:
+ VirtualRegionType type;
+ int beginPos;
+ int endPos;
+ LocalContextFlags cxTag = LocalContextFlags::NO_LOCAL_CONTEXT;
+ int barcodeLeft = -1;
+ int barcodeRight = -1;
+
+public:
+ VirtualRegion(const VirtualRegionType type,
+ const int beginPos,
+ const int endPos)
+ : type(type)
+ , beginPos(beginPos)
+ , endPos(endPos), cxTag()
+ {}
+ VirtualRegion(const VirtualRegionType type,
+ const int beginPos,
+ const int endPos,
+ const LocalContextFlags cxTag,
+ const int barcodeLeft,
+ const int barcodeRight)
+ : type(type)
+ , beginPos(beginPos)
+ , endPos(endPos)
+ , cxTag(cxTag)
+ , barcodeLeft(barcodeLeft)
+ , barcodeRight(barcodeRight)
+ {}
+ VirtualRegion() = default;
+ // Move constructor
+ VirtualRegion(VirtualRegion&&) = default;
+ // Copy constructor
+ VirtualRegion(const VirtualRegion&) = default;
+ // Move assignment operator
+ VirtualRegion& operator=(VirtualRegion&&) = default;
+ // Copy assignment operator
+ VirtualRegion& operator=(const VirtualRegion&) = delete;
+ // Destructor
+ ~VirtualRegion() = default;
+
+public:
+ bool operator==(const VirtualRegion &v1) const
+ {
+ return (v1.type == this->type &&
+ v1.beginPos == this->beginPos &&
+ v1.endPos == this->endPos);
+ }
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // VIRTUALREGION_H
diff --git a/include/pbbam/virtual/VirtualRegionType.h b/include/pbbam/virtual/VirtualRegionType.h
new file mode 100644
index 0000000..6b917bf
--- /dev/null
+++ b/include/pbbam/virtual/VirtualRegionType.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef REGIONTYPE_H
+#define REGIONTYPE_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+/// Type of annotated region.
+enum class VirtualRegionType : char
+{
+ ADAPTER = 'A',
+ BARCODE = 'B',
+ SUBREAD = 'S',
+ HQREGION = 'H',
+ LQREGION = 'L' // Outside the HQ region
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // REGIONTYPE_H
diff --git a/include/pbbam/virtual/VirtualRegionTypeMap.h b/include/pbbam/virtual/VirtualRegionTypeMap.h
new file mode 100644
index 0000000..105696c
--- /dev/null
+++ b/include/pbbam/virtual/VirtualRegionTypeMap.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef VIRTUALREGIONTYPEMAP_H
+#define VIRTUALREGIONTYPEMAP_H
+
+#include <map>
+
+#include "pbbam/Config.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+
+namespace PacBio {
+namespace BAM {
+/// Allows mapping of char 'A', 'B', 'H', and 'L' to the respective enum keys.
+class VirtualRegionTypeMap
+{
+public:
+ static std::map<char, VirtualRegionType> ParseChar;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // VIRTUALREGIONTYPEMAP_H
diff --git a/src/Accuracy.cpp b/src/Accuracy.cpp
new file mode 100644
index 0000000..0c8114a
--- /dev/null
+++ b/src/Accuracy.cpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/Accuracy.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+const int Accuracy::MIN = 0;
+const int Accuracy::MAX = 1000;
diff --git a/src/AlignmentPrinter.cpp b/src/AlignmentPrinter.cpp
new file mode 100644
index 0000000..6692021
--- /dev/null
+++ b/src/AlignmentPrinter.cpp
@@ -0,0 +1,148 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#include <cmath>
+#include <iostream>
+#include <iomanip>
+#include <stdexcept>
+#include <sstream>
+
+#include "pbbam/AlignmentPrinter.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+std::string AlignmentPrinter::Print(const BamRecord& record,
+ const Orientation orientation)
+{
+
+ std::string seq = record.Sequence(orientation, true, true);
+ std::string ref = ifr_->ReferenceSubsequence(record, orientation, true, true);
+
+ if (seq.size() != ref.size())
+ throw std::runtime_error("Sequence and reference parts are of different size");
+
+ int seqLength = 0;
+ float matches = 0;
+ std::string pretty;
+ Position refCoord = record.ReferenceStart();
+ Position seqCoord = record.QueryStart();
+
+ for (size_t i = 0; i < seq.size();)
+ {
+ std::string refCoordStr = std::to_string(refCoord);
+ std::string seqCoordStr = std::to_string(seqCoord);
+
+ size_t maxCoordLength = std::max(refCoordStr.size(), seqCoordStr.size());
+ while (refCoordStr.size() < maxCoordLength)
+ refCoordStr = " "+refCoordStr;
+ while (seqCoordStr.size() < maxCoordLength)
+ seqCoordStr = " "+seqCoordStr;
+
+ std::string seqWrap = seqCoordStr + " : ";
+ std::string refWrap = refCoordStr + " : ";
+ std::string prettyWrap(maxCoordLength+3, ' ');
+ prettyWrap.reserve(seq.size());
+ for (int j = 0; i < seq.size() && j < 40; ++i, ++j)
+ {
+ refWrap += ref[i];
+
+ if (seq[i] == ref[i])
+ {
+ ++matches;
+ if (refCoord == 0 || refCoord % 10)
+ prettyWrap += '|';
+ else
+ {
+ prettyWrap += "\033[1m\x1b[31m";
+ prettyWrap += '|';
+ prettyWrap += "\033[0m\x1b[39;49m";
+ }
+ seqWrap += seq[i];
+ }
+ else if (seq[i] == '-' || ref[i] == '-')
+ {
+ prettyWrap += ' ';
+ seqWrap += seq[i];
+ }
+ else
+ {
+ prettyWrap += '.';
+ seqWrap += "\033[1m\x1b[31m";
+ seqWrap += seq[i];
+ seqWrap += "\033[0m\x1b[39;49m";
+ }
+ if (seq[i] != '-')
+ {
+ ++seqLength;
+ ++seqCoord;
+ }
+ if (ref[i] != '-')
+ {
+ ++refCoord;
+ }
+ }
+
+ refCoordStr = std::to_string(refCoord);
+ seqCoordStr = std::to_string(seqCoord);
+
+ maxCoordLength = std::max(refCoordStr.size(), seqCoordStr.size());
+ while (refCoordStr.size() < maxCoordLength)
+ refCoordStr = " "+refCoordStr;
+ while (seqCoordStr.size() < maxCoordLength)
+ seqCoordStr = " "+seqCoordStr;
+
+ seqWrap += " : " + seqCoordStr;
+ refWrap += " : " + refCoordStr;
+
+ pretty += refWrap + '\n' + prettyWrap + '\n' + seqWrap + "\n\n";
+ }
+ float similarity = matches/seq.size();
+
+ std::stringstream output;
+
+ output << "Read : " << record.FullName() << std::endl;
+ output << "Reference : " << record.ReferenceName() << std::endl;
+ output << std::endl;
+ output << "Read-length : " << seqLength << std::endl;
+ output << "Concordance : " << std::setprecision(3) << (similarity);
+ output << std::endl;
+ output << std::endl;
+ output << pretty;
+
+ return output.str();
+}
diff --git a/src/AssertUtils.cpp b/src/AssertUtils.cpp
new file mode 100644
index 0000000..42f4ea8
--- /dev/null
+++ b/src/AssertUtils.cpp
@@ -0,0 +1,90 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "AssertUtils.h"
+#include <cstdarg>
+#include <cstdio>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static inline
+void message_out(FILE* stream,
+ const char* format,
+ const char* msg)
+{
+ fprintf(stream, format, msg);
+ fprintf(stream, "\n");
+ fflush(stream);
+}
+
+void printInfo(const char* msg, ...) {
+
+ va_list ap;
+ va_start(ap, msg);
+
+ char buffer[256] = {'\0' };
+ buffer[255] = '\0';
+ if (msg)
+ vsnprintf(buffer, 255, msg, ap);
+ va_end(ap);
+
+ message_out(stdout, "%s", buffer);
+}
+
+void printError(const char* msg, ...) {
+
+ va_list ap;
+ va_start(ap, msg);
+
+ char buffer[256] = {'\0' };
+ buffer[255] = '\0';
+ if (msg)
+ vsnprintf(buffer, 255, msg, ap);
+ va_end(ap);
+
+ message_out(stderr, "%s", buffer);
+}
+
+void printFailedAssert(const char* msg) {
+ printError("ASSERT FAILED: %s", msg);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/AssertUtils.h b/src/AssertUtils.h
new file mode 100644
index 0000000..d098964
--- /dev/null
+++ b/src/AssertUtils.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef ASSERTUTILS_H
+#define ASSERTUTILS_H
+
+// ---------------------------------------------------
+// This file contains dev/debugging helper utilities
+// ---------------------------------------------------
+
+#ifndef PBBAM_UNUSED
+# define PBBAM_UNUSED(x) (void)x;
+#endif
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline void pbbam_noop(void) { }
+
+// a la fprintf(...). Auto-adds a newline
+void printError(const char* msg, ...);
+void printInfo(const char* msg, ...);
+void printFailedAssert(const char* msg);
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+//
+// This assert construct below allows us to report failures as well as take some
+// fallback action (return, break, continue, etc) so as not to crash at runtime.
+// In other words, it's basically a 'weak' assert with customized information &
+// failure response.
+//
+// PB_VERIFY(cond) if condition fails, print message
+// PB_ASSERT(cond, action) if condition fails, print message & perform action
+// PB_ASSERT_OR_BREAK overload of ASSERT where action is 'break'
+// PB_ASSERT_OR_CONTINUE overload of ASSERT where action is 'continue'
+// PB_ASSERT_OR_RETURN overload of ASSERT where action is 'return'
+// PB_ASSERT_OR_RETURN_VALUE overload of ASSERT where action is 'return <value>'
+// PB_ASSERT_UNREACHABLE overload of ASSERT(false) where action is a no-op. Used as a visual marker for
+// unreachable code-paths (e.g. invalid values in a switch statement)
+//
+#define PB_ASSERT_STRINGIFY2(x) #x
+#define PB_ASSERT_STRINGIFY(x) PB_ASSERT_STRINGIFY2(x)
+#define PB_ASSERT_STRING(cond) ::PacBio::BAM::internal::printFailedAssert( \
+ "\"" cond"\" in file " __FILE__ ", line " PB_ASSERT_STRINGIFY(__LINE__))
+
+#define PB_VERIFY(cond) if (cond) {} else { PB_ASSERT_STRING(#cond); } do {} while (0)
+#define PB_ASSERT(cond, action) if (cond) {} else { PB_ASSERT_STRING(#cond); action; } do {} while (0)
+#define PB_ASSERT_OR_BREAK(cond) PB_ASSERT(cond, break)
+#define PB_ASSERT_OR_CONTINUE(cond) PB_ASSERT(cond, continue)
+#define PB_ASSERT_OR_RETURN(cond) PB_ASSERT(cond, return)
+#define PB_ASSERT_OR_RETURN_VALUE(cond, value) PB_ASSERT(cond, return value)
+
+#define PB_ASSERT_UNREACHABLE PB_ASSERT(false, ::PacBio::BAM::internal::pbbam_noop())
+
+#endif // ASSERTUTILS_H
diff --git a/src/BamFile.cpp b/src/BamFile.cpp
new file mode 100644
index 0000000..f75bc9d
--- /dev/null
+++ b/src/BamFile.cpp
@@ -0,0 +1,174 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamFile.h"
+#include "pbbam/PbiFile.h"
+#include "FileUtils.h"
+#include "MemoryUtils.h"
+#include <htslib/sam.h>
+#include <memory>
+#include <sys/stat.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class BamFilePrivate
+{
+public:
+ BamFilePrivate(const string& fn)
+ : filename_(fn)
+ {
+ // update verbosity
+ hts_verbose = PacBio::BAM::HtslibVerbosity;
+
+ // attempt open
+ std::unique_ptr<samFile, internal::HtslibFileDeleter> f(sam_open(filename_.c_str(), "rb"));
+ if (!f)
+ throw std::runtime_error("could not open file");
+ if (f->format.format != bam)
+ throw std::runtime_error("expected BAM, unknown format");
+
+ // attempt fetch header
+ std::unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> hdr(sam_hdr_read(f.get()));
+ header_ = internal::BamHeaderMemory::FromRawData(hdr.get());
+ }
+
+public:
+ std::string filename_;
+ BamHeader header_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+// ------------------------
+// BamFile implementation
+// ------------------------
+
+BamFile::BamFile(const std::string& filename)
+ : d_(new internal::BamFilePrivate(filename))
+{ }
+
+BamFile::BamFile(const BamFile& other)
+ : d_(other.d_)
+{ }
+
+BamFile::BamFile(BamFile&& other)
+ : d_(std::move(other.d_))
+{ }
+
+BamFile& BamFile::operator=(const BamFile& other)
+{ d_ = other.d_; return *this; }
+
+BamFile& BamFile::operator=(BamFile&& other)
+{ d_ = std::move(other.d_); return *this; }
+
+BamFile::~BamFile(void) { }
+
+void BamFile::EnsurePacBioIndexExists(void) const
+{
+ if (!PacBioIndexExists())
+ PbiFile::CreateFrom(*this);
+}
+
+void BamFile::EnsureStandardIndexExists(void) const
+{
+ if (!StandardIndexExists()) {
+ if (bam_index_build(d_->filename_.c_str(), 0) != 0)
+ throw std::runtime_error("could not build BAI index");
+ }
+}
+
+std::string BamFile::Filename(void) const
+{ return d_->filename_; }
+
+bool BamFile::HasReference(const std::string& name) const
+{ return d_->header_.HasSequence(name); }
+
+const BamHeader& BamFile::Header(void) const
+{ return d_->header_; }
+
+bool BamFile::IsPacBioBAM(void) const
+{ return !d_->header_.PacBioBamVersion().empty(); }
+
+bool BamFile::PacBioIndexExists(void) const
+{
+ const string pbiFn = PacBioIndexFilename();
+ if (internal::FileUtils::Exists(pbiFn)) {
+ const time_t bamTimestamp = internal::FileUtils::LastModified(Filename());
+ const time_t pbiTimestamp = internal::FileUtils::LastModified(pbiFn);
+ if (bamTimestamp <= pbiTimestamp)
+ return true;
+ }
+ return false;
+}
+
+std::string BamFile::PacBioIndexFilename(void) const
+{ return d_->filename_ + ".pbi"; }
+
+int BamFile::ReferenceId(const std::string& name) const
+{ return d_->header_.SequenceId(name); }
+
+uint32_t BamFile::ReferenceLength(const std::string& name) const
+{ return ReferenceLength(ReferenceId(name)); }
+
+uint32_t BamFile::ReferenceLength(const int id) const
+{ return std::stoul(d_->header_.SequenceLength(id)); }
+
+std::string BamFile::ReferenceName(const int id) const
+{ return d_->header_.SequenceName(id); }
+
+bool BamFile::StandardIndexExists(void) const
+{
+ const string bamFn = Filename();
+ const string baiFn = StandardIndexFilename();
+ if (internal::FileUtils::Exists(baiFn)) {
+ const time_t bamTimestamp = internal::FileUtils::LastModified(bamFn);
+ const time_t baiTimestamp = internal::FileUtils::LastModified(baiFn);
+ if (bamTimestamp <= baiTimestamp)
+ return true;
+ }
+ return false;
+}
+
+std::string BamFile::StandardIndexFilename(void) const
+{ return d_->filename_ + ".bai"; }
diff --git a/src/BamHeader.cpp b/src/BamHeader.cpp
new file mode 100644
index 0000000..7caa62d
--- /dev/null
+++ b/src/BamHeader.cpp
@@ -0,0 +1,400 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamHeader.h"
+#include "SequenceUtils.h"
+#include <htslib/hts.h>
+#include <sstream>
+#include <set>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static const string prefix_HD = string("@HD");
+static const string prefix_SQ = string("@SQ");
+static const string prefix_RG = string("@RG");
+static const string prefix_PG = string("@PG");
+static const string prefix_CO = string("@CO");
+
+static const string token_VN = string("VN");
+static const string token_SO = string("SO");
+static const string token_pb = string("pb");
+
+static const string current_version = string("3.0b7");
+
+class BamHeaderPrivate
+{
+public:
+ std::string version_;
+ std::string pacbioBamVersion_;
+ std::string sortOrder_;
+ std::map<std::string, std::string> headerLineCustom_;
+
+ std::map<std::string, ReadGroupInfo> readGroups_; // id => read group info
+ std::map<std::string, ProgramInfo> programs_; // id => program info
+ std::vector<std::string> comments_;
+
+ // we need to preserve insertion order, use lookup for access by name
+ std::vector<SequenceInfo> sequences_;
+ std::map<std::string, int32_t> sequenceIdLookup_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+BamHeader::BamHeader(void)
+ : d_(new internal::BamHeaderPrivate)
+{ }
+
+BamHeader::BamHeader(const string& samHeaderText)
+ : d_(new internal::BamHeaderPrivate)
+{
+ istringstream s(samHeaderText);
+ string line("");
+ string firstToken;
+ while (getline(s, line)) {
+
+ // skip if line is not long enough to contain true values
+ if (line.length() < 5)
+ continue;
+
+ // determine token at beginning of line
+ firstToken = line.substr(0,3);
+
+ if (firstToken == internal::prefix_HD) {
+
+ // pop off '@HD\t', then split HD lines into tokens
+ const vector<string>& tokens = internal::Split(line.substr(4), '\t');
+ for (const string& token : tokens) {
+ const string& tokenTag = token.substr(0,2);
+ const string& tokenValue = token.substr(3);
+
+ // set header contents
+ if (tokenTag == internal::token_VN) Version(tokenValue);
+ else if (tokenTag == internal::token_SO) SortOrder(tokenValue);
+ else if (tokenTag == internal::token_pb) PacBioBamVersion(tokenValue);
+ }
+
+ // check for required tags
+ if (Version().empty())
+ Version(string(hts_version()));
+ }
+
+ else if (firstToken == internal::prefix_SQ)
+ AddSequence(SequenceInfo::FromSam(line));
+
+ else if (firstToken == internal::prefix_RG)
+ AddReadGroup(ReadGroupInfo::FromSam(line));
+
+ else if (firstToken == internal::prefix_PG)
+ AddProgram(ProgramInfo::FromSam(line));
+
+ else if (firstToken == internal::prefix_CO)
+ AddComment(line.substr(4));
+ }
+}
+
+BamHeader::BamHeader(const BamHeader& other)
+ : d_(other.d_)
+{ }
+
+BamHeader::BamHeader(BamHeader&& other)
+ : d_(std::move(other.d_))
+{ }
+
+BamHeader& BamHeader::operator=(const BamHeader& other)
+{ d_ = other.d_; return *this; }
+
+BamHeader& BamHeader::operator=(BamHeader&& other)
+{ d_ = std::move(other.d_); return *this; }
+
+BamHeader::~BamHeader(void) { }
+
+BamHeader& BamHeader::AddComment(const std::string& comment)
+{ d_->comments_.push_back(comment); return *this; }
+
+BamHeader& BamHeader::AddProgram(const ProgramInfo& pg)
+{ d_->programs_[pg.Id()] = pg; return *this; }
+
+BamHeader& BamHeader::AddReadGroup(const ReadGroupInfo& readGroup)
+{ d_->readGroups_[readGroup.Id()] = readGroup; return *this; }
+
+BamHeader& BamHeader::AddSequence(const SequenceInfo& sequence)
+{
+ d_->sequences_.push_back(sequence);
+ d_->sequenceIdLookup_[sequence.Name()] = d_->sequences_.size() - 1;
+ return *this;
+}
+
+BamHeader& BamHeader::ClearComments(void)
+{ d_->comments_.clear(); return* this; }
+
+BamHeader& BamHeader::ClearPrograms(void)
+{ d_->programs_.clear(); return *this; }
+
+BamHeader& BamHeader::ClearReadGroups(void)
+{ d_->readGroups_.clear(); return *this; }
+
+BamHeader& BamHeader::ClearSequences(void)
+{
+ d_->sequenceIdLookup_.clear();
+ d_->sequences_.clear();
+ return *this;
+}
+
+std::vector<std::string> BamHeader::Comments(void) const
+{ return d_->comments_; }
+
+BamHeader& BamHeader::Comments(const std::vector<std::string>& comments)
+{ d_->comments_ = comments; return *this; }
+
+BamHeader BamHeader::DeepCopy(void) const
+{
+ BamHeader result;
+ result.d_->version_ = d_->version_;
+ result.d_->pacbioBamVersion_ = d_->pacbioBamVersion_;
+ result.d_->sortOrder_ = d_->sortOrder_;
+ result.d_->headerLineCustom_ = d_->headerLineCustom_;
+ result.d_->readGroups_ = d_->readGroups_;
+ result.d_->programs_ = d_->programs_;
+ result.d_->comments_ = d_->comments_;
+ result.d_->sequences_ = d_->sequences_;
+ result.d_->sequenceIdLookup_ = d_->sequenceIdLookup_;
+ return result;
+}
+
+bool BamHeader::HasProgram(const std::string& id) const
+{ return d_->programs_.find(id) != d_->programs_.cend(); }
+
+bool BamHeader::HasReadGroup(const std::string& id) const
+{ return d_->readGroups_.find(id) != d_->readGroups_.cend(); }
+
+bool BamHeader::HasSequence(const std::string& name) const
+{ return d_->sequenceIdLookup_.find(name) != d_->sequenceIdLookup_.cend(); }
+
+std::string BamHeader::PacBioBamVersion(void) const
+{ return d_->pacbioBamVersion_; }
+
+BamHeader& BamHeader::PacBioBamVersion(const std::string& version)
+{ d_->pacbioBamVersion_ = version; return *this; }
+
+ProgramInfo BamHeader::Program(const std::string& id) const
+{
+ const auto iter = d_->programs_.find(id);
+ if (iter == d_->programs_.cend())
+ throw std::runtime_error("program ID not found");
+ return iter->second;
+}
+
+vector<string> BamHeader::ProgramIds(void) const
+{
+ vector<string> result;
+ result.reserve(d_->programs_.size());
+ const auto end = d_->programs_.cend();
+ auto iter = d_->programs_.cbegin();
+ for ( ; iter != end; ++iter )
+ result.push_back(iter->first);
+ return result;
+}
+
+vector<ProgramInfo> BamHeader::Programs(void) const
+{
+ vector<ProgramInfo> result;
+ result.reserve(d_->programs_.size());
+ const auto end = d_->programs_.cend();
+ auto iter = d_->programs_.cbegin();
+ for ( ; iter != end; ++iter )
+ result.push_back(iter->second);
+ return result;
+}
+
+BamHeader& BamHeader::Programs(const vector<ProgramInfo>& programs)
+{
+ d_->programs_.clear();
+ for (const ProgramInfo& pg : programs)
+ d_->programs_[pg.Id()] = pg;
+ return *this;
+}
+
+ReadGroupInfo BamHeader::ReadGroup(const std::string& id) const
+{
+ const auto iter = d_->readGroups_.find(id);
+ if (iter == d_->readGroups_.cend())
+ throw std::runtime_error("read group ID not found");
+ return iter->second;
+}
+
+vector<string> BamHeader::ReadGroupIds(void) const
+{
+ vector<string> result;
+ result.reserve(d_->readGroups_.size());
+ const auto end = d_->readGroups_.cend();
+ auto iter = d_->readGroups_.cbegin();
+ for ( ; iter != end; ++iter )
+ result.push_back(iter->first);
+ return result;
+}
+
+vector<ReadGroupInfo> BamHeader::ReadGroups(void) const
+{
+ vector<ReadGroupInfo> result;
+ result.reserve(d_->readGroups_.size());
+ const auto end = d_->readGroups_.cend();
+ auto iter = d_->readGroups_.cbegin();
+ for ( ; iter != end; ++iter )
+ result.push_back(iter->second);
+ return result;
+}
+
+BamHeader& BamHeader::ReadGroups(const vector<ReadGroupInfo>& readGroups)
+{
+ d_->readGroups_.clear();
+ for (const ReadGroupInfo& rg : readGroups)
+ d_->readGroups_[rg.Id()] = rg;
+ return *this;
+}
+
+SequenceInfo BamHeader::Sequence(const int32_t id) const
+{
+ // throws out of range
+ return d_->sequences_.at(id);
+}
+
+SequenceInfo BamHeader::Sequence(const std::string& name) const
+{
+ const auto iter = d_->sequenceIdLookup_.find(name);
+ if (iter == d_->sequenceIdLookup_.cend())
+ return SequenceInfo();
+ const int index = iter->second;
+ assert(index >= 0 && (size_t)index < d_->sequences_.size());
+ return d_->sequences_.at(index);
+}
+
+int32_t BamHeader::SequenceId(const std::string& name) const
+{
+ const auto iter = d_->sequenceIdLookup_.find(name);
+ if (iter == d_->sequenceIdLookup_.cend())
+ throw std::runtime_error("sequence not found");
+ return iter->second;
+}
+
+std::string BamHeader::SequenceLength(const int32_t id) const
+{ return Sequence(id).Length(); }
+
+std::string BamHeader::SequenceName(const int32_t id) const
+{ return Sequence(id).Name(); }
+
+vector<string> BamHeader::SequenceNames(void) const
+{
+ vector<string> result;
+ result.reserve(d_->sequences_.size());
+ const auto end = d_->sequences_.cend();
+ auto iter = d_->sequences_.cbegin();
+ for ( ; iter != end; ++iter )
+ result.push_back(iter->Name());
+ return result;
+}
+
+std::vector<SequenceInfo> BamHeader::Sequences(void) const
+{ return d_->sequences_; }
+
+BamHeader& BamHeader::Sequences(const vector<SequenceInfo>& sequences)
+{
+ d_->sequences_.clear();
+ for (const SequenceInfo& seq : sequences)
+ AddSequence(seq);
+ return *this;
+}
+
+std::string BamHeader::SortOrder(void) const
+{ return d_->sortOrder_; }
+
+BamHeader& BamHeader::SortOrder(const std::string& order)
+{ d_->sortOrder_ = order; return *this; }
+
+string BamHeader::ToSam(void) const
+{
+ // clear out stream
+ stringstream out("");
+
+ // @HD
+ const string& outputVersion = (d_->version_.empty() ? string(hts_version()) : d_->version_);
+ const string& outputSortOrder = (d_->sortOrder_.empty() ? string("unknown") : d_->sortOrder_);
+ const string& outputPbBamVersion = (d_->pacbioBamVersion_.empty() ? internal::current_version : d_->pacbioBamVersion_);
+
+ out << internal::prefix_HD
+ << internal::MakeSamTag(internal::token_VN, outputVersion)
+ << internal::MakeSamTag(internal::token_SO, outputSortOrder)
+ << internal::MakeSamTag(internal::token_pb, outputPbBamVersion)
+ << endl;
+
+// if (!d_->pacbioBamVersion_.empty())
+// out << internal::MakeSamTag(internal::token_pb, d_->pacbioBamVersion_);
+// out << endl;
+
+ // @SQ
+ for (const SequenceInfo& seq : d_->sequences_)
+ out << seq.ToSam() << endl;
+
+ // @RG
+ for (const auto& rgIter : d_->readGroups_)
+ out << rgIter.second.ToSam() << endl;
+
+ // @PG
+ for (const auto& progIter : d_->programs_)
+ out << progIter.second.ToSam() << endl;
+
+ // @CO
+ for (const string& comment : d_->comments_)
+ out << internal::prefix_CO << '\t' << comment << endl;
+
+ // return result
+ return out.str();
+}
+
+std::string BamHeader::Version(void) const
+{ return d_->version_; }
+
+BamHeader& BamHeader::Version(const std::string& version)
+{ d_->version_ = version; return *this; }
+
diff --git a/src/BamRecord.cpp b/src/BamRecord.cpp
new file mode 100644
index 0000000..11387ae
--- /dev/null
+++ b/src/BamRecord.cpp
@@ -0,0 +1,1785 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/virtual/VirtualRegionTypeMap.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include "SequenceUtils.h"
+#include <htslib/sam.h>
+
+#include <iostream>
+#include <stdexcept>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// BAM record tag names
+static const string tagName_readAccuracy = "rq";
+static const string tagName_holeNumber = "zm";
+static const string tagName_numPasses = "np";
+static const string tagName_contextFlags = "cx";
+static const string tagName_snr = "sn";
+static const string tagName_deletionQV = "dq";
+static const string tagName_deletionTag = "dt";
+static const string tagName_insertionQV = "iq";
+static const string tagName_ipd = "ip";
+static const string tagName_mergeQV = "mq";
+static const string tagName_pulseWidth = "pw";
+static const string tagName_readGroup = "RG";
+static const string tagName_queryStart = "qs";
+static const string tagName_queryEnd = "qe";
+static const string tagName_substitutionQV = "sq";
+static const string tagName_substitutionTag = "st";
+static const string tagName_pkmean = "pa";
+static const string tagName_pkmid = "pm";
+static const string tagName_pre_pulse_frames = "pd";
+static const string tagName_pulse_call_width = "px";
+static const string tagName_labelQV = "pq";
+static const string tagName_alternative_labelQV = "pv";
+static const string tagName_alternative_labelTag = "pt";
+static const string tagName_pulse_call = "pc";
+static const string tagName_scrap_type = "sc";
+static const string tagName_barcodes = "bc";
+static const string tagName_pulseMergeQV = "pg";
+
+// faux (helper) tag names
+static const string tagName_QUAL = "QUAL";
+static const string tagName_SEQ = "SEQ";
+
+// record type names
+static const string recordTypeName_Polymerase = "POLYMERASE";
+static const string recordTypeName_HqRegion = "HQREGION";
+static const string recordTypeName_Subread = "SUBREAD";
+static const string recordTypeName_CCS = "CCS";
+static const string recordTypeName_Scrap = "SCRAP";
+static const string recordTypeName_Unknown = "UNKNOWN";
+
+static
+int32_t HoleNumberFromName(const string& fullName)
+{
+ const vector<string> mainTokens = std::move(Split(fullName, '/'));
+ if (mainTokens.size() != 3)
+ throw std::runtime_error("malformed record name");
+ return stoi(mainTokens.at(1));
+}
+
+static
+Position QueryEndFromName(const string& fullName)
+{
+ const vector<string> mainTokens = std::move(Split(fullName, '/'));
+ if (mainTokens.size() != 3)
+ throw std::runtime_error("malformed record name");
+ const vector<string> queryTokens = std::move(Split(mainTokens.at(2), '_'));
+ if (queryTokens.size() != 2)
+ throw std::runtime_error("malformed record name");
+ return stoi(queryTokens.at(1));
+}
+
+static
+Position QueryStartFromName(const string& fullName)
+{
+ const vector<string> mainTokens = std::move(Split(fullName, '/'));
+ if (mainTokens.size() != 3)
+ throw std::runtime_error("malformed record name");
+ const vector<string> queryTokens = std::move(Split(mainTokens.at(2), '_'));
+ if (queryTokens.size() != 2)
+ throw std::runtime_error("malformed record name");
+ return stoi(queryTokens.at(0));
+}
+
+static
+BamRecordImpl* CreateOrEdit(const string& tagName,
+ const Tag& value,
+ BamRecordImpl* impl)
+{
+ if (impl->HasTag(tagName))
+ impl->EditTag(tagName, value);
+ else
+ impl->AddTag(tagName, value);
+ return impl;
+}
+
+static
+int32_t AlignedEndOffset(const Cigar& cigar,
+ const int seqLength)
+{
+ int32_t endOffset = seqLength;
+
+ if (!cigar.empty()) {
+ Cigar::const_reverse_iterator cigarIter = cigar.crbegin();
+ Cigar::const_reverse_iterator cigarEnd = cigar.crend();
+ for (; cigarIter != cigarEnd; ++cigarIter) {
+ const CigarOperation& op = (*cigarIter);
+ if (op.Type() == CigarOperationType::HARD_CLIP) {
+ if (endOffset != 0 && endOffset != seqLength)
+ return -1;
+ }
+ else if (op.Type() == CigarOperationType::SOFT_CLIP)
+ endOffset -= op.Length();
+ else
+ break;
+ }
+ }
+
+ if (endOffset == 0)
+ endOffset = seqLength;
+ return endOffset;
+}
+
+static
+int32_t AlignedStartOffset(const Cigar& cigar,
+ const int seqLength)
+{
+ int32_t startOffset = 0;
+
+ if (!cigar.empty()) {
+ Cigar::const_iterator cigarIter = cigar.cbegin();
+ Cigar::const_iterator cigarEnd = cigar.cend();
+ for (; cigarIter != cigarEnd; ++cigarIter) {
+ const CigarOperation& op = (*cigarIter);
+ if (op.Type() == CigarOperationType::HARD_CLIP) {
+ if (startOffset != 0 && startOffset != seqLength)
+ return -1;
+ }
+ else if (op.Type() == CigarOperationType::SOFT_CLIP)
+ startOffset += op.Length();
+ else
+ break;
+ }
+ }
+ return startOffset;
+}
+
+template<typename T>
+T Clip(const T& input,
+ const size_t pos,
+ const size_t len)
+{
+ return T(input.cbegin() + pos,
+ input.cbegin() + pos + len);
+}
+
+static
+void MaybeClipAndGapifyBases(const BamRecordImpl& impl,
+ const bool aligned,
+ const bool exciseSoftClips,
+ string& seq)
+{
+ if (impl.IsMapped() && (aligned || exciseSoftClips)) {
+
+ size_t seqIndex = 0;
+ const Cigar& cigar = impl.CigarData();
+ Cigar::const_iterator cigarIter = cigar.cbegin();
+ Cigar::const_iterator cigarEnd = cigar.cend();
+ for (; cigarIter != cigarEnd; ++cigarIter) {
+ const CigarOperation& op = (*cigarIter);
+ const CigarOperationType& type = op.Type();
+
+ // do nothing for hard clips
+ if (type != CigarOperationType::HARD_CLIP) {
+ const size_t opLength = op.Length();
+
+ // maybe remove soft clips
+ if (type == CigarOperationType::SOFT_CLIP && exciseSoftClips)
+ seq.erase(seqIndex, opLength);
+
+ // for non-clipping operations
+ else {
+
+ // maybe add gaps/padding
+ if (aligned) {
+ if (type == CigarOperationType::DELETION) {
+ seq.reserve(seq.size() + opLength);
+ seq.insert(seqIndex, opLength, '-');
+ }
+ else if (type == CigarOperationType::PADDING) {
+ seq.reserve(seq.size() + opLength);
+ seq.insert(seqIndex, opLength, '*');
+ }
+ }
+
+ // update index
+ seqIndex += opLength;
+ }
+ }
+ }
+ }
+}
+
+static
+void MaybeClipAndGapifyFrames(const BamRecordImpl& impl,
+ const bool aligned,
+ const bool exciseSoftClips,
+ Frames& frames)
+{
+ if (impl.IsMapped() && (aligned || exciseSoftClips)) {
+
+ vector<uint16_t> data = std::move(frames.Data()); // we're going to put it back
+ size_t frameIndex = 0;
+ const Cigar& cigar = impl.CigarData();
+ Cigar::const_iterator cigarIter = cigar.cbegin();
+ Cigar::const_iterator cigarEnd = cigar.cend();
+ for (; cigarIter != cigarEnd; ++cigarIter) {
+ const CigarOperation& op = (*cigarIter);
+ const CigarOperationType& type = op.Type();
+
+ // do nothing for hard clips
+ if (type != CigarOperationType::HARD_CLIP) {
+ const size_t opLength = op.Length();
+
+ // maybe remove soft clips
+ if (type == CigarOperationType::SOFT_CLIP && exciseSoftClips)
+ data.erase(data.begin() + frameIndex, data.begin() + frameIndex + opLength);
+
+ // for non-clipping operations
+ else {
+
+ // maybe add gaps/padding
+ if (aligned) {
+ if (type == CigarOperationType::DELETION || type == CigarOperationType::PADDING) {
+ data.reserve(data.size() + opLength);
+ data.insert(data.begin() + frameIndex, opLength, 0);
+ }
+ }
+
+ // update index
+ frameIndex += opLength;
+ }
+ }
+ }
+ frames.Data(data);
+ }
+}
+
+static
+void MaybeClipAndGapifyQualities(const BamRecordImpl& impl,
+ const bool aligned,
+ const bool exciseSoftClips,
+ QualityValues& qualities)
+{
+ if (impl.IsMapped() && (aligned || exciseSoftClips)) {
+
+ size_t qualIndex = 0;
+ const Cigar& cigar = impl.CigarData();
+ Cigar::const_iterator cigarIter = cigar.cbegin();
+ Cigar::const_iterator cigarEnd = cigar.cend();
+ for (; cigarIter != cigarEnd; ++cigarIter) {
+
+ const CigarOperation& op = (*cigarIter);
+ const CigarOperationType& type = op.Type();
+
+ // do nothing for hard clips
+ if (type != CigarOperationType::HARD_CLIP) {
+ const size_t opLength = op.Length();
+
+ // maybe remove soft clips
+ if (type == CigarOperationType::SOFT_CLIP && exciseSoftClips)
+ qualities.erase(qualities.begin() + qualIndex, qualities.begin() + qualIndex + opLength);
+
+ // for non-clipping operations
+ else {
+
+ // maybe add gaps/padding
+ if (aligned) {
+ if (type == CigarOperationType::DELETION || type == CigarOperationType::PADDING) {
+ qualities.reserve(qualities.size() + opLength);
+ qualities.insert(qualities.begin() + qualIndex, opLength, QualityValue(0));
+ }
+ }
+
+ // update index
+ qualIndex += opLength;
+ }
+ }
+ }
+ }
+}
+
+static inline
+void MaybeReverseFrames(const bool isReverseStrand,
+ const Orientation orientation,
+ std::vector<uint16_t>* data)
+{
+ const bool shouldReverse = isReverseStrand && orientation == Orientation::GENOMIC;
+ if (shouldReverse)
+ std::reverse(data->begin(), data->end());
+}
+
+static inline
+void MaybeReverseFrames(const bool isReverseStrand,
+ const Orientation orientation,
+ Frames& frames)
+{
+ const bool shouldReverse = isReverseStrand && orientation == Orientation::GENOMIC;
+ if (shouldReverse)
+ std::reverse(frames.begin(), frames.end());
+}
+
+static inline
+void MaybeReverseQuals(const bool isBamQual,
+ const bool isReverseStrand,
+ const Orientation orientation,
+ QualityValues& quals)
+{
+ const bool shouldReverse = (isBamQual ? isReverseStrand && orientation == Orientation::NATIVE
+ : isReverseStrand && orientation == Orientation::GENOMIC);
+ if (shouldReverse)
+ std::reverse(quals.begin(), quals.end());
+}
+
+static inline
+void MaybeReverseComplementSeq(const bool isPulse,
+ const bool isBamSeq,
+ const bool isReverseStrand,
+ const Orientation orientation,
+ string& seq)
+{
+ const bool shouldReverse = (isBamSeq ? isReverseStrand && orientation == Orientation::NATIVE
+ : isReverseStrand && orientation == Orientation::GENOMIC);
+ if (shouldReverse)
+ {
+ if (isPulse)
+ internal::ReverseComplementCaseSens(seq);
+ else
+ internal::ReverseComplement(seq);
+ }
+}
+
+static
+RecordType NameToType(const string& name)
+{
+ if (name == recordTypeName_Subread)
+ return RecordType::SUBREAD;
+ if (name == recordTypeName_Polymerase)
+ return RecordType::POLYMERASE;
+ if (name == recordTypeName_HqRegion)
+ return RecordType::HQREGION;
+ if (name == recordTypeName_CCS)
+ return RecordType::CCS;
+ if (name == recordTypeName_Scrap)
+ return RecordType::SCRAP;
+ return RecordType::UNKNOWN;
+}
+
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+const float BamRecord::photonFactor = 10.0;
+
+BamRecord::BamRecord(void)
+ : alignedStart_(PacBio::BAM::UnmappedPosition)
+ , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(const BamHeader& header)
+ : header_(header)
+ , alignedStart_(PacBio::BAM::UnmappedPosition)
+ , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(const BamRecordImpl& impl)
+ : impl_(impl)
+ , alignedStart_(PacBio::BAM::UnmappedPosition)
+ , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(BamRecordImpl&& impl)
+ : impl_(std::move(impl))
+ , alignedStart_(PacBio::BAM::UnmappedPosition)
+ , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(const BamRecord& other)
+ : impl_(other.impl_)
+ , header_(other.header_)
+ , alignedStart_(other.alignedStart_)
+ , alignedEnd_(other.alignedEnd_)
+{ }
+
+BamRecord::BamRecord(BamRecord&& other)
+ : impl_(std::move(other.impl_))
+ , header_(std::move(other.header_))
+ , alignedStart_(std::move(other.alignedStart_))
+ , alignedEnd_(std::move(other.alignedEnd_))
+{ }
+
+BamRecord& BamRecord::operator=(const BamRecord& other)
+{
+ impl_ = other.impl_;
+ header_ = other.header_;
+ alignedStart_ = other.alignedStart_;
+ alignedEnd_ = other.alignedEnd_;
+ return *this;
+}
+
+BamRecord& BamRecord::operator=(BamRecord&& other)
+{
+ impl_ = std::move(other.impl_);
+ header_ = std::move(other.header_);
+ alignedStart_ = std::move(other.alignedStart_);
+ alignedEnd_ = std::move(other.alignedEnd_);
+ return *this;
+}
+
+BamRecord::~BamRecord(void) { }
+
+Position BamRecord::AlignedEnd(void) const
+{
+ if (alignedEnd_ == PacBio::BAM::UnmappedPosition)
+ CalculateAlignedPositions();
+ return alignedEnd_;
+}
+
+Position BamRecord::AlignedStart(void) const
+{
+ if (alignedStart_ == PacBio::BAM::UnmappedPosition)
+ CalculateAlignedPositions();
+ return alignedStart_;
+}
+
+Strand BamRecord::AlignedStrand(void) const
+{ return impl_.IsReverseStrand() ? Strand::REVERSE : Strand::FORWARD; }
+
+QualityValues BamRecord::AltLabelQV(Orientation orientation) const
+{
+ return FetchQualities(internal::tagName_alternative_labelQV,
+ orientation);
+}
+
+BamRecord& BamRecord::AltLabelQV(const QualityValues& altLabelQVs)
+{
+ internal::CreateOrEdit(internal::tagName_alternative_labelQV,
+ altLabelQVs.Fastq(), &impl_);
+ return *this;
+}
+
+std::string BamRecord::AltLabelTag(Orientation orientation) const
+{
+ return FetchBases(internal::tagName_alternative_labelTag,
+ orientation);
+}
+
+BamRecord& BamRecord::AltLabelTag(const std::string& tags)
+{
+ internal::CreateOrEdit(internal::tagName_alternative_labelTag, tags, &impl_);
+ return *this;
+}
+
+std::pair<int,int> BamRecord::Barcodes(void) const
+{
+ const Tag& bc = impl_.TagValue(internal::tagName_barcodes);
+ if (bc.IsNull())
+ return std::make_pair(-1, -1);
+
+ if (!bc.IsUInt16Array())
+ throw std::runtime_error("Barcode tag bc is not of type uint16_t array.");
+
+ const auto bcArray = bc.ToUInt16Array();
+ if (bcArray.size() != 2)
+ throw std::runtime_error("Barcode array is not of size 2");
+
+ return std::make_pair(bcArray[0], bcArray[1]);
+}
+
+void BamRecord::CalculateAlignedPositions(void) const
+{
+ // reset
+ ResetCachedPositions();
+
+ // skip if unmapped, or has no queryStart/End
+ if (!impl_.IsMapped())
+ return;
+ const Position qStart = QueryStart();
+ const Position qEnd = QueryEnd();
+ if (qStart == PacBio::BAM::UnmappedPosition || qEnd == PacBio::BAM::UnmappedPosition)
+ return;
+
+ // determine clipped end ranges
+ const Cigar& cigar = impl_.CigarData();
+ const size_t seqLength = impl_.Sequence().size();
+ const int32_t startOffset = internal::AlignedStartOffset(cigar, seqLength);
+ const int32_t endOffset = internal::AlignedEndOffset(cigar, seqLength);
+ if (endOffset == -1 || startOffset == -1)
+ return; // TODO: handle error more??
+
+ // store aligned positions (polymerase read coordinates)
+ if (impl_.IsReverseStrand()) {
+ alignedStart_ = qStart + (seqLength - endOffset);
+ alignedEnd_ = qEnd - startOffset;
+ }
+ else {
+ alignedStart_ = qStart + startOffset;
+ alignedEnd_ = qEnd - (seqLength - endOffset);
+ }
+}
+
+Cigar BamRecord::CigarData(void) const
+{ return impl_.CigarData(); }
+
+BamRecord& BamRecord::Clip(const ClipType clipType,
+ const Position start,
+ const Position end)
+{
+ // skip if no clip requested
+ if (clipType == ClipType::CLIP_NONE)
+ return *this;
+ const bool clipToQuery = (clipType == ClipType::CLIP_TO_QUERY);
+
+ // cache original coords
+ const Position origQStart = QueryStart();
+ const Position origQEnd = QueryEnd();
+ const Position origAStart = AlignedStart();
+ const Position origAEnd = AlignedEnd();
+
+ // only used on mapped records
+ Position origTStart;
+ Position origTEnd;
+ bool isForwardStrand = (AlignedStrand() == Strand::FORWARD);
+
+ // cache any add'l coords, skip out if clip not needed (or not possible)
+ if (clipToQuery) {
+ if (start <= origQStart && end >= origQEnd)
+ return *this;
+ } else {
+
+ assert(clipType == ClipType::CLIP_TO_REFERENCE);
+ if (!IsMapped())
+ return *this;
+
+ origTStart = ReferenceStart();
+ origTEnd = ReferenceEnd();
+ if (start <= origTStart && end >= origTEnd)
+ return *this;
+
+ assert(origAStart >= origQStart);
+ assert(origAEnd <= origQEnd);
+ }
+
+ // determine new offsets into data
+ size_t startOffset;
+ size_t endOffset;
+
+ if (clipToQuery) {
+ startOffset = start - origQStart;
+ endOffset = origQEnd - end;
+ } else {
+
+ const size_t alignedStartOffset = (origAStart - origQStart);
+ const size_t alignedEndOffset = (origQEnd - origAEnd);
+ const size_t tStartDiff = start - origTStart;
+ const size_t tEndDiff = origTEnd - end;
+
+ if (isForwardStrand) {
+ startOffset = alignedStartOffset + tStartDiff;
+ endOffset = alignedEndOffset + tEndDiff;
+ } else {
+ startOffset = alignedEndOffset + tStartDiff;
+ endOffset = alignedStartOffset + tEndDiff;
+ }
+ }
+
+ size_t queryPosRemovedFront = 0;
+ size_t queryPosRemovedBack = 0;
+ size_t refPosRemovedFront = 0;
+ size_t refPosRemovedBack = 0;
+
+ // if mapped
+ if (IsMapped()) {
+
+ // update CIGAR - clip front ops, then clip back ops
+ Cigar cigar = std::move(impl_.CigarData());
+ size_t offsetRemaining = startOffset;
+ while (offsetRemaining > 0 && !cigar.empty()) {
+ CigarOperation& firstOp = cigar.front();
+ const CigarOperationType firstOpType = firstOp.Type();
+ const size_t firstOpLength = firstOp.Length();
+
+ const bool shouldUpdateQueryPos = ((bam_cigar_type(static_cast<int>(firstOpType)) & 0x1) != 0);
+ const bool shouldUpdateRefPos = ((bam_cigar_type(static_cast<int>(firstOpType)) & 0x2) != 0);
+
+ if (firstOpLength <= offsetRemaining) {
+
+ cigar.erase(cigar.begin());
+
+ if (shouldUpdateQueryPos)
+ queryPosRemovedFront += firstOpLength;
+ if (shouldUpdateRefPos)
+ refPosRemovedFront += firstOpLength;
+
+ offsetRemaining -= firstOpLength;
+
+ } else {
+
+ firstOp.Length(firstOpLength - offsetRemaining);
+
+ if (shouldUpdateQueryPos)
+ queryPosRemovedFront += offsetRemaining;
+ if (shouldUpdateRefPos)
+ refPosRemovedFront += offsetRemaining;
+
+ offsetRemaining = 0;
+ }
+ }
+
+ offsetRemaining = endOffset;
+ while (offsetRemaining > 0 && !cigar.empty()) {
+ CigarOperation& lastOp = cigar.back();
+ const CigarOperationType lastOpType = lastOp.Type();
+ const size_t lastOpLength = lastOp.Length();
+
+ const bool shouldUpdateQueryPos = ((bam_cigar_type(static_cast<int>(lastOpType)) & 0x1) != 0);
+ const bool shouldUpdateRefPos = ((bam_cigar_type(static_cast<int>(lastOpType)) & 0x2) != 0);
+
+ if (lastOpLength <= offsetRemaining) {
+ cigar.pop_back();
+
+ if (shouldUpdateQueryPos)
+ queryPosRemovedBack += lastOpLength;
+ if (shouldUpdateRefPos)
+ refPosRemovedBack += lastOpLength;
+
+ offsetRemaining -= lastOpLength;
+
+ } else {
+ lastOp.Length(lastOpLength - offsetRemaining);
+
+ if (shouldUpdateQueryPos)
+ queryPosRemovedBack += offsetRemaining;
+ if (shouldUpdateRefPos)
+ refPosRemovedBack += offsetRemaining;
+
+ offsetRemaining = 0;
+ }
+ }
+ impl_.CigarData(cigar);
+
+ // update aligned reference position
+ if (clipToQuery) {
+ const Position origPosition = impl_.Position();
+ impl_.Position(origPosition + refPosRemovedFront);
+ } else {
+ impl_.Position(start);
+ }
+ }
+
+ const string origSequence = std::move(Sequence(Orientation::GENOMIC));
+ const QualityValues origQualities = std::move(Qualities(Orientation::GENOMIC));
+
+ size_t clipIndex;
+ size_t clipLength;
+ if (clipToQuery) {
+ clipIndex = startOffset;
+ clipLength = (end - start);
+ } else {
+ const size_t origSeqLength = origSequence.length();
+ const size_t newSeqLength = (origSeqLength - queryPosRemovedBack) - queryPosRemovedFront;
+ clipIndex = queryPosRemovedFront;
+ clipLength = newSeqLength;
+ }
+
+ // clip seq, quals
+ const string sequence = std::move(internal::Clip(origSequence, clipIndex, clipLength));
+ const QualityValues qualities = std::move(internal::Clip(origQualities, clipIndex, clipLength));
+ impl_.SetSequenceAndQualities(sequence, qualities.Fastq());
+
+ // clip PacBio tags
+ QualityValues altLabelQV = AltLabelQV(Orientation::GENOMIC);
+ QualityValues labelQV = LabelQV(Orientation::GENOMIC);
+ QualityValues deletionQV = std::move(internal::Clip(DeletionQV(Orientation::GENOMIC), clipIndex, clipLength));
+ QualityValues insertionQV = std::move(internal::Clip(InsertionQV(Orientation::GENOMIC), clipIndex, clipLength));
+ QualityValues mergeQV = std::move(internal::Clip(MergeQV(Orientation::GENOMIC), clipIndex, clipLength));
+ QualityValues pulseMergeQV = std::move(PulseMergeQV(Orientation::GENOMIC));
+ QualityValues substitutionQV = std::move(internal::Clip(SubstitutionQV(Orientation::GENOMIC), clipIndex, clipLength));
+ Frames ipd = std::move(internal::Clip(IPD(Orientation::GENOMIC).Data(), clipIndex, clipLength));
+ Frames pulseWidth = std::move(internal::Clip(PulseWidth(Orientation::GENOMIC).Data(), clipIndex, clipLength));
+ string deletionTag = std::move(internal::Clip(DeletionTag(Orientation::GENOMIC), clipIndex, clipLength));
+ string substitutionTag = std::move(internal::Clip(SubstitutionTag(Orientation::GENOMIC), clipIndex, clipLength));
+ string altLabelTag = AltLabelTag(Orientation::GENOMIC);
+ string pulseCall = std::move(PulseCall(Orientation::GENOMIC));
+ std::vector<float> pkmean = std::move(Pkmean(Orientation::GENOMIC));
+ std::vector<float> pkmid = std::move(Pkmid(Orientation::GENOMIC));
+ Frames prePulseFrames = std::move(PrePulseFrames(Orientation::GENOMIC).Data());
+ Frames pulseCallWidth = std::move(PulseCallWidth(Orientation::GENOMIC).Data());
+
+ // restore native orientation
+ if (!isForwardStrand) {
+ internal::Reverse(altLabelQV);
+ internal::Reverse(labelQV);
+ internal::Reverse(deletionQV);
+ internal::Reverse(insertionQV);
+ internal::Reverse(mergeQV);
+ internal::Reverse(pulseMergeQV);
+ internal::Reverse(substitutionQV);
+ internal::Reverse(ipd);
+ internal::Reverse(pulseWidth);
+ internal::ReverseComplement(deletionTag);
+ internal::ReverseComplement(substitutionTag);
+ internal::ReverseComplement(altLabelTag);
+ internal::ReverseComplementCaseSens(pulseCall);
+ internal::Reverse(pkmean);
+ internal::Reverse(pkmid);
+ internal::Reverse(prePulseFrames);
+ internal::Reverse(pulseCallWidth);
+ }
+
+ // update BAM tags
+ TagCollection tags = impl_.Tags();
+ tags[internal::tagName_alternative_labelQV] = altLabelQV.Fastq();
+ tags[internal::tagName_labelQV] = labelQV.Fastq();
+ tags[internal::tagName_deletionQV] = deletionQV.Fastq();
+ tags[internal::tagName_insertionQV] = insertionQV.Fastq();
+ tags[internal::tagName_mergeQV] = mergeQV.Fastq();
+ tags[internal::tagName_pulseMergeQV] = pulseMergeQV.Fastq();
+ tags[internal::tagName_substitutionQV] = substitutionQV.Fastq();
+ tags[internal::tagName_ipd] = ipd.Data();
+ tags[internal::tagName_pulseWidth] = pulseWidth.Data();
+ tags[internal::tagName_deletionTag] = deletionTag;
+ tags[internal::tagName_substitutionTag] = substitutionTag;
+ tags[internal::tagName_alternative_labelTag]= altLabelTag;
+ tags[internal::tagName_pulse_call] = pulseCall;
+ tags[internal::tagName_pkmean] = EncodePhotons(pkmean);
+ tags[internal::tagName_pkmid] = EncodePhotons(pkmid);
+ tags[internal::tagName_pre_pulse_frames] = prePulseFrames.Data();
+ tags[internal::tagName_pulse_call_width] = pulseCallWidth.Data();
+ impl_.Tags(tags);
+
+ // update query start/end
+ if (clipToQuery) {
+ internal::CreateOrEdit(internal::tagName_queryStart, start, &impl_);
+ internal::CreateOrEdit(internal::tagName_queryEnd, end, &impl_);
+ } else {
+ if (isForwardStrand) {
+ const Position qStart = origQStart + queryPosRemovedFront;
+ const Position qEnd = origQEnd - queryPosRemovedBack;
+ internal::CreateOrEdit(internal::tagName_queryStart, qStart, &impl_);
+ internal::CreateOrEdit(internal::tagName_queryEnd, qEnd, &impl_);
+ } else {
+ const Position qStart = origQStart + queryPosRemovedBack;
+ const Position qEnd = origQEnd - queryPosRemovedFront;
+ internal::CreateOrEdit(internal::tagName_queryStart, qStart, &impl_);
+ internal::CreateOrEdit(internal::tagName_queryEnd, qEnd, &impl_);
+ }
+ }
+
+ // reset any cached aligned start/end
+ ResetCachedPositions();
+ return *this;
+}
+
+QualityValues BamRecord::DeletionQV(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchQualities(internal::tagName_deletionQV,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::DeletionQV(const QualityValues& deletionQVs)
+{
+ internal::CreateOrEdit(internal::tagName_deletionQV, deletionQVs.Fastq(), &impl_);
+ return *this;
+}
+
+
+string BamRecord::DeletionTag(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchBases(internal::tagName_deletionTag,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::DeletionTag(const std::string& tags)
+{
+ internal::CreateOrEdit(internal::tagName_deletionTag, tags, &impl_);
+ return *this;
+}
+
+std::vector<uint16_t>
+BamRecord::EncodePhotons(const std::vector<float>& data)
+{
+ std::vector<uint16_t> encoded;
+ encoded.reserve(data.size());
+ for (const auto& d : data)
+ encoded.emplace_back(d * photonFactor);
+ return encoded;
+}
+
+string BamRecord::FetchBasesRaw(const string& tagName) const
+{
+ const Tag& seqTag = impl_.TagValue(tagName);
+ string seq = seqTag.ToString();
+ return seq;
+}
+
+string BamRecord::FetchBases(const string& tagName,
+ const Orientation orientation) const
+{
+ const bool isBamSeq = (tagName == internal::tagName_SEQ);
+ const bool isPulse = (tagName == internal::tagName_pulse_call);
+ string seq = FetchBasesRaw(tagName);
+
+ // rev-comp
+ internal::MaybeReverseComplementSeq(isPulse,
+ isBamSeq,
+ impl_.IsReverseStrand(),
+ orientation,
+ seq);
+ return seq;
+}
+
+string BamRecord::FetchBases(const string& tagName,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips) const
+{
+ const bool isPulse = (tagName == internal::tagName_pulse_call);
+ const bool isBamSeq = (tagName == internal::tagName_SEQ);
+
+ // fetch SAM/BAM SEQ field
+ if (isBamSeq) {
+ string seq = std::move(impl_.Sequence());
+
+ // clip / gapify
+ internal::MaybeClipAndGapifyBases(impl_,
+ aligned,
+ exciseSoftClips,
+ seq);
+ // rev-comp
+ internal::MaybeReverseComplementSeq(isPulse,
+ isBamSeq,
+ impl_.IsReverseStrand(),
+ orientation,
+ seq);
+ return seq;
+ }
+
+ // other tags of 'bases' type
+ else {
+
+ string seq = FetchBasesRaw(tagName);
+
+ // rev-comp
+ internal::MaybeReverseComplementSeq(isPulse,
+ isBamSeq,
+ impl_.IsReverseStrand(),
+ orientation,
+ seq);
+ // clip / gapify
+ internal::MaybeClipAndGapifyBases(impl_,
+ aligned,
+ exciseSoftClips,
+ seq);
+ return seq;
+ }
+}
+
+Frames BamRecord::FetchFramesRaw(const string& tagName) const
+{
+ Frames frames;
+ const Tag& frameTag = impl_.TagValue(tagName);
+ if (frameTag.IsNull())
+ return frames;
+
+ // lossy frame codes
+ if (frameTag.IsUInt8Array()) {
+ const vector<uint8_t> codes = std::move(frameTag.ToUInt8Array());
+ frames = std::move(Frames::Decode(codes));
+ }
+
+ // lossless frame data
+ else {
+ assert(frameTag.IsUInt16Array());
+ const vector<uint16_t> losslessFrames = std::move(frameTag.ToUInt16Array());
+ frames.Data(std::move(losslessFrames));
+ }
+
+ return frames;
+}
+
+Frames BamRecord::FetchFrames(const string& tagName,
+ const Orientation orientation) const
+{
+ Frames frames = FetchFramesRaw(tagName);
+
+ // reverse, if needed
+ internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+ orientation,
+ frames);
+
+ return frames;
+}
+
+Frames BamRecord::FetchFrames(const string& tagName,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips) const
+{
+ Frames frames = FetchFramesRaw(tagName);
+
+ // reverse, if needed
+ internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+ orientation,
+ frames);
+
+ // clip / gapify
+ internal::MaybeClipAndGapifyFrames(impl_,
+ aligned,
+ exciseSoftClips,
+ frames);
+
+ return frames;
+}
+
+vector<float> BamRecord::FetchPhotons(const string& tagName,
+ const Orientation orientation) const
+{
+ const Tag& frameTag = impl_.TagValue(tagName);
+ if (frameTag.IsNull())
+ return vector<float>();
+
+ if(!frameTag.IsUInt16Array())
+ throw std::runtime_error("Photons are not a uint16_t array, tag " + tagName);
+ vector<uint16_t> data = std::move(frameTag.ToUInt16Array());
+
+ // reverse, if needed
+ internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+ orientation,
+ &data);
+
+ vector<float> photons;
+ photons.reserve(data.size());
+
+ for (const auto& d : data)
+ photons.emplace_back(d / photonFactor);
+
+ return photons;
+}
+
+QualityValues BamRecord::FetchQualitiesRaw(const string& tagName) const
+{
+ const Tag& qvsTag = impl_.TagValue(tagName);
+ return QualityValues::FromFastq(qvsTag.ToString());
+}
+
+QualityValues BamRecord::FetchQualities(const string& tagName,
+ const Orientation orientation) const
+{
+ const bool isBamQual = (tagName == internal::tagName_QUAL);
+ // fetch data
+ QualityValues quals = FetchQualitiesRaw(tagName);
+
+ // rev-comp
+ internal::MaybeReverseQuals(isBamQual,
+ impl_.IsReverseStrand(),
+ orientation,
+ quals);
+
+ return quals;
+}
+
+QualityValues BamRecord::FetchQualities(const string& tagName,
+ const Orientation orientation,
+ const bool aligned,
+ const bool exciseSoftClips) const
+{
+ const bool isBamQual = (tagName == internal::tagName_QUAL);
+
+ // fetch SAM/BAM QUAL field
+ if (isBamQual) {
+
+ // fetch data
+ QualityValues quals = std::move(impl_.Qualities());
+
+ // clip / gapify
+ internal::MaybeClipAndGapifyQualities(impl_,
+ aligned,
+ exciseSoftClips,
+ quals);
+
+ // rev-comp
+ internal::MaybeReverseQuals(isBamQual,
+ impl_.IsReverseStrand(),
+ orientation,
+ quals);
+ return quals;
+ }
+
+ // other tags of 'qualities' type
+ else {
+
+ // fetch data
+ QualityValues quals = FetchQualitiesRaw(tagName);
+
+ // rev-comp
+ internal::MaybeReverseQuals(isBamQual,
+ impl_.IsReverseStrand(),
+ orientation,
+ quals);
+ // clip / gapify
+ internal::MaybeClipAndGapifyQualities(impl_,
+ aligned,
+ exciseSoftClips,
+ quals);
+ return quals;
+ }
+}
+
+string BamRecord::FullName(void) const
+{ return impl_.Name(); }
+
+bool BamRecord::HasAltLabelQV(void) const
+{ return impl_.HasTag(internal::tagName_alternative_labelQV); }
+
+bool BamRecord::HasAltLabelTag(void) const
+{ return impl_.HasTag(internal::tagName_alternative_labelTag); }
+
+bool BamRecord::HasBarcodes(void) const
+{ return impl_.HasTag(internal::tagName_barcodes); }
+
+bool BamRecord::HasLabelQV(void) const
+{ return impl_.HasTag(internal::tagName_labelQV); }
+
+bool BamRecord::HasDeletionQV(void) const
+{ return impl_.HasTag(internal::tagName_deletionQV); }
+
+bool BamRecord::HasDeletionTag(void) const
+{ return impl_.HasTag(internal::tagName_deletionTag); }
+
+bool BamRecord::HasHoleNumber(void) const
+{ return impl_.HasTag(internal::tagName_holeNumber)
+ && !impl_.TagValue(internal::tagName_holeNumber).IsNull();
+}
+
+bool BamRecord::HasInsertionQV(void) const
+{ return impl_.HasTag(internal::tagName_insertionQV); }
+
+bool BamRecord::HasPreBaseFrames(void) const
+{ return HasIPD(); }
+
+bool BamRecord::HasIPD(void) const
+{ return impl_.HasTag(internal::tagName_ipd); }
+
+bool BamRecord::HasLocalContextFlags(void) const
+{ return impl_.HasTag(internal::tagName_contextFlags); }
+
+bool BamRecord::HasMergeQV(void) const
+{ return impl_.HasTag(internal::tagName_mergeQV); }
+
+bool BamRecord::HasPulseMergeQV(void) const
+{ return impl_.HasTag(internal::tagName_pulseMergeQV); }
+
+bool BamRecord::HasPkmean(void) const
+{ return impl_.HasTag(internal::tagName_pkmean); }
+
+bool BamRecord::HasPkmid(void) const
+{ return impl_.HasTag(internal::tagName_pkmid); }
+
+bool BamRecord::HasPrePulseFrames(void) const
+{ return impl_.HasTag(internal::tagName_pre_pulse_frames); }
+
+bool BamRecord::HasPulseCall(void) const
+{ return impl_.HasTag(internal::tagName_pulse_call)
+ && !impl_.TagValue(internal::tagName_pulse_call).IsNull();
+}
+
+bool BamRecord::HasPulseCallWidth(void) const
+{ return impl_.HasTag(internal::tagName_pulse_call_width); }
+
+bool BamRecord::HasPulseWidth(void) const
+{ return impl_.HasTag(internal::tagName_pulseWidth); }
+
+bool BamRecord::HasQueryEnd(void) const
+{ return impl_.HasTag(internal::tagName_queryEnd); }
+
+bool BamRecord::HasQueryStart(void) const
+{ return impl_.HasTag(internal::tagName_queryStart); }
+
+bool BamRecord::HasReadAccuracy(void) const
+{ return impl_.HasTag(internal::tagName_readAccuracy)
+ && !impl_.TagValue(internal::tagName_readAccuracy).IsNull();
+}
+
+bool BamRecord::HasScrapType(void) const
+{ return impl_.HasTag(internal::tagName_scrap_type)
+ && !impl_.TagValue(internal::tagName_scrap_type).IsNull();
+}
+
+bool BamRecord::HasSignalToNoise(void) const
+{ return impl_.HasTag(internal::tagName_snr); }
+
+bool BamRecord::HasSubstitutionQV(void) const
+{ return impl_.HasTag(internal::tagName_substitutionQV); }
+
+bool BamRecord::HasSubstitutionTag(void) const
+{ return impl_.HasTag(internal::tagName_substitutionTag); }
+
+BamHeader BamRecord::Header(void) const
+{ return header_; }
+
+int32_t BamRecord::HoleNumber(void) const
+{
+ const Tag& holeNumber = impl_.TagValue(internal::tagName_holeNumber);
+ if (!holeNumber.IsNull())
+ return holeNumber.ToInt32();
+
+ // missing zm tag - try to pull from name
+ return internal::HoleNumberFromName(FullName());
+}
+
+BamRecord& BamRecord::HoleNumber(const int32_t holeNumber)
+{
+ internal::CreateOrEdit(internal::tagName_holeNumber,
+ holeNumber,
+ &impl_);
+ return *this;
+}
+
+BamRecordImpl& BamRecord::Impl(void)
+{ return impl_; }
+
+const BamRecordImpl& BamRecord::Impl(void) const
+{ return impl_; }
+
+QualityValues BamRecord::InsertionQV(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchQualities(internal::tagName_insertionQV,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::InsertionQV(const QualityValues& insertionQVs)
+{
+ internal::CreateOrEdit(internal::tagName_insertionQV, insertionQVs.Fastq(), &impl_);
+ return *this;
+}
+
+Frames BamRecord::IPD(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchFrames(internal::tagName_ipd,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::IPD(const Frames& frames,
+ const FrameEncodingType encoding)
+{
+ if (encoding == FrameEncodingType::LOSSY)
+ internal::CreateOrEdit(internal::tagName_ipd, frames.Encode(), &impl_);
+ else
+ internal::CreateOrEdit(internal::tagName_ipd, frames.Data(), &impl_);
+ return *this;
+}
+
+Frames BamRecord::PreBaseFrames(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{ return IPD(orientation,aligned,exciseSoftClips); }
+
+BamRecord& BamRecord::PreBaseFrames(const Frames& frames,
+ const FrameEncodingType encoding)
+{ return IPD(frames, encoding); }
+
+Frames BamRecord::IPDRaw(Orientation orientation) const
+{
+ const auto tagName = internal::tagName_ipd;
+
+ Frames frames;
+ const Tag& frameTag = impl_.TagValue(tagName);
+ if (frameTag.IsNull())
+ return frames;
+
+ // lossy frame codes
+ if (frameTag.IsUInt8Array()) {
+ const vector<uint8_t> codes = std::move(frameTag.ToUInt8Array());
+ const vector<uint16_t> codes16(codes.begin(), codes.end());
+ frames.Data(std::move(codes16));
+ }
+
+ // lossless frame data
+ else {
+ assert(frameTag.IsUInt16Array());
+ const vector<uint16_t> losslessFrames = std::move(frameTag.ToUInt16Array());
+ frames.Data(std::move(losslessFrames));
+ }
+
+ // reverse, if needed
+ internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+ orientation,
+ frames);
+
+ return frames;
+}
+
+Frames BamRecord::PulseWidthRaw(Orientation orientation) const
+{
+ const auto tagName = internal::tagName_pulseWidth;
+
+ Frames frames;
+ const Tag& frameTag = impl_.TagValue(tagName);
+ if (frameTag.IsNull())
+ return frames;
+
+ // lossy frame codes
+ if (frameTag.IsUInt8Array()) {
+ const vector<uint8_t> codes = std::move(frameTag.ToUInt8Array());
+ const vector<uint16_t> codes16(codes.begin(), codes.end());
+ frames.Data(std::move(codes16));
+ }
+
+ // lossless frame data
+ else {
+ assert(frameTag.IsUInt16Array());
+ const vector<uint16_t> losslessFrames = std::move(frameTag.ToUInt16Array());
+ frames.Data(std::move(losslessFrames));
+ }
+
+ // reverse, if needed
+ internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+ orientation,
+ frames);
+
+ return frames;
+}
+
+bool BamRecord::IsMapped(void) const
+{ return impl_.IsMapped(); }
+
+QualityValues BamRecord::LabelQV(Orientation orientation) const
+{
+ return FetchQualities(internal::tagName_labelQV,
+ orientation);
+}
+
+BamRecord& BamRecord::LabelQV(const QualityValues& labelQVs)
+{
+ internal::CreateOrEdit(internal::tagName_labelQV, labelQVs.Fastq(), &impl_);
+ return *this;
+}
+
+LocalContextFlags BamRecord::LocalContextFlags(void) const
+{
+ const Tag& cxTag = impl_.TagValue(internal::tagName_contextFlags);
+ return static_cast<PacBio::BAM::LocalContextFlags>(cxTag.ToUInt8());
+}
+
+BamRecord& BamRecord::LocalContextFlags(const PacBio::BAM::LocalContextFlags flags)
+{
+ internal::CreateOrEdit(internal::tagName_contextFlags,
+ static_cast<uint8_t>(flags),
+ &impl_);
+ return *this;
+}
+
+BamRecord& BamRecord::Map(const int32_t referenceId,
+ const Position refStart,
+ const Strand strand,
+ const Cigar& cigar,
+ const uint8_t mappingQuality)
+{
+ impl_.Position(refStart);
+ impl_.ReferenceId(referenceId);
+ impl_.CigarData(cigar);
+ impl_.MapQuality(mappingQuality);
+ impl_.SetMapped(true);
+
+ if (strand == Strand::FORWARD)
+ impl_.SetReverseStrand(false);
+
+ else {
+ assert(strand == Strand::REVERSE);
+ impl_.SetReverseStrand(true);
+
+ // switch seq & qual
+ string sequence = impl_.Sequence();
+ QualityValues qualities = impl_.Qualities();
+
+ internal::ReverseComplement(sequence);
+ internal::Reverse(qualities);
+
+ impl_.SetSequenceAndQualities(sequence, qualities.Fastq());
+ }
+
+ // reset any cached aligned start/end
+ alignedStart_ = PacBio::BAM::UnmappedPosition;
+ alignedEnd_ = PacBio::BAM::UnmappedPosition;
+
+ return *this;
+}
+
+uint8_t BamRecord::MapQuality(void) const
+{ return impl_.MapQuality(); }
+
+QualityValues BamRecord::MergeQV(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchQualities(internal::tagName_mergeQV,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::MergeQV(const QualityValues& mergeQVs)
+{
+ internal::CreateOrEdit(internal::tagName_mergeQV, mergeQVs.Fastq(), &impl_);
+ return *this;
+}
+
+QualityValues BamRecord::PulseMergeQV(Orientation orientation) const
+{
+ return FetchQualities(internal::tagName_pulseMergeQV, orientation);
+}
+
+BamRecord& BamRecord::PulseMergeQV(const QualityValues& mergeQVs)
+{
+ internal::CreateOrEdit(internal::tagName_pulseMergeQV, mergeQVs.Fastq(), &impl_);
+ return *this;
+}
+
+string BamRecord::MovieName(void) const
+{ return ReadGroup().MovieName(); }
+
+int32_t BamRecord::NumPasses(void) const
+{
+ const Tag& numPasses = impl_.TagValue(internal::tagName_numPasses);
+ return numPasses.ToInt32();
+}
+
+BamRecord& BamRecord::NumPasses(const int32_t numPasses)
+{
+ internal::CreateOrEdit(internal::tagName_numPasses, numPasses, &impl_);
+ return *this;
+}
+
+std::vector<float> BamRecord::Pkmean(Orientation orientation) const
+{
+ return FetchPhotons(internal::tagName_pkmean, orientation);
+}
+
+BamRecord& BamRecord::Pkmean(const std::vector<float>& photons)
+{
+ Pkmean(EncodePhotons(photons));
+ return *this;
+}
+
+BamRecord& BamRecord::Pkmean(const std::vector<uint16_t>& encodedPhotons)
+{
+ internal::CreateOrEdit(internal::tagName_pkmean, encodedPhotons, &impl_);
+ return *this;
+}
+
+std::vector<float> BamRecord::Pkmid(Orientation orientation) const
+{
+ return FetchPhotons(internal::tagName_pkmid, orientation);
+}
+
+BamRecord& BamRecord::Pkmid(const std::vector<float>& photons)
+{
+ Pkmid(EncodePhotons(photons));
+ return *this;
+}
+
+BamRecord& BamRecord::Pkmid(const std::vector<uint16_t>& encodedPhotons)
+{
+ internal::CreateOrEdit(internal::tagName_pkmid, encodedPhotons, &impl_);
+ return *this;
+}
+
+Frames BamRecord::PrePulseFrames(Orientation orientation) const
+{
+ return FetchFrames(internal::tagName_pre_pulse_frames, orientation);
+}
+
+BamRecord& BamRecord::PrePulseFrames(const Frames& frames,
+ const FrameEncodingType encoding)
+{
+ if (encoding == FrameEncodingType::LOSSY)
+ internal::CreateOrEdit(internal::tagName_pre_pulse_frames, frames.Encode(), &impl_);
+ else
+ internal::CreateOrEdit(internal::tagName_pre_pulse_frames, frames.Data(), &impl_);
+ return *this;
+}
+
+std::string BamRecord::PulseCall(Orientation orientation) const
+{
+ return FetchBases(internal::tagName_pulse_call, orientation);
+}
+
+BamRecord& BamRecord::PulseCall(const std::string& tags)
+{
+ internal::CreateOrEdit(internal::tagName_pulse_call, tags, &impl_);
+ return *this;
+}
+
+Frames BamRecord::PulseCallWidth(Orientation orientation) const
+{
+ return FetchFrames(internal::tagName_pulse_call_width, orientation);
+}
+
+BamRecord& BamRecord::PulseCallWidth(const Frames& frames,
+ const FrameEncodingType encoding)
+{
+ if (encoding == FrameEncodingType::LOSSY)
+ internal::CreateOrEdit(internal::tagName_pulse_call_width, frames.Encode(), &impl_);
+ else
+ internal::CreateOrEdit(internal::tagName_pulse_call_width, frames.Data(), &impl_);
+ return *this;
+}
+
+Frames BamRecord::PulseWidth(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchFrames(internal::tagName_pulseWidth,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::PulseWidth(const Frames& frames,
+ const FrameEncodingType encoding)
+{
+ if (encoding == FrameEncodingType::LOSSY)
+ internal::CreateOrEdit(internal::tagName_pulseWidth, frames.Encode(), &impl_);
+ else
+ internal::CreateOrEdit(internal::tagName_pulseWidth, frames.Data(), &impl_);
+ return *this;
+}
+
+QualityValues BamRecord::Qualities(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchQualities("QUAL",
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+Position BamRecord::QueryEnd(void) const
+{
+ // try 'qe' tag
+ const Tag& qe = impl_.TagValue(internal::tagName_queryEnd);
+ if (!qe.IsNull())
+ return qe.ToInt32();
+
+ // tag missing, need to check movie name (fallback for non-PB BAMs, but ignore for CCS reads)
+ RecordType type;
+ try {
+ type = Type();
+ } catch (std::exception&) {
+ return Position(0);
+ }
+ if (type == RecordType::CCS)
+ throw std::runtime_error("no query end for CCS read type");
+
+ // PacBio BAM, non-CCS
+ try {
+ return internal::QueryEndFromName(FullName());
+ } catch (std::exception&) {
+ // return fallback position
+ return Position(0);
+ }
+}
+
+BamRecord& BamRecord::QueryEnd(const Position pos)
+{
+ internal::CreateOrEdit(internal::tagName_queryEnd,
+ (int32_t)pos,
+ &impl_);
+ UpdateName();
+ return *this;
+}
+
+Position BamRecord::QueryStart(void) const
+{
+ // try 'qs' tag
+ const Tag& qs = impl_.TagValue(internal::tagName_queryStart);
+ if (!qs.IsNull())
+ return qs.ToInt32();
+
+ // tag missing, need to check movie name (fallback for non-PB BAMs, but ignore for CCS reads)
+ RecordType type;
+ try {
+ type = Type();
+ } catch (std::exception&) {
+ return Position(0);
+ }
+ if (type == RecordType::CCS)
+ throw std::runtime_error("no query start for CCS read type");
+
+ // PacBio BAM, non-CCS
+ try {
+ return internal::QueryStartFromName(FullName());
+ } catch (std::exception&) {
+ // return fallback position
+ return Position(0);
+ }
+}
+
+BamRecord& BamRecord::QueryStart(const Position pos)
+{
+ internal::CreateOrEdit(internal::tagName_queryStart,
+ (int32_t)pos,
+ &impl_);
+ UpdateName();
+ return *this;
+}
+
+
+Accuracy BamRecord::ReadAccuracy(void) const
+{
+ const Tag& readAccuracy = impl_.TagValue(internal::tagName_readAccuracy);
+ return Accuracy(readAccuracy.ToInt32());
+}
+
+BamRecord& BamRecord::ReadAccuracy(const Accuracy& accuracy)
+{
+ internal::CreateOrEdit(internal::tagName_readAccuracy,
+ static_cast<int32_t>(accuracy),
+ &impl_);
+ return *this;
+}
+
+ReadGroupInfo BamRecord::ReadGroup(void) const
+{ return header_.ReadGroup(ReadGroupId()); }
+
+BamRecord& BamRecord::ReadGroup(const ReadGroupInfo& rg)
+{
+ internal::CreateOrEdit(internal::tagName_readGroup, rg.Id(), &impl_);
+ UpdateName();
+ return *this;
+}
+
+string BamRecord::ReadGroupId(void) const
+{
+ const Tag& rgTag = impl_.TagValue(internal::tagName_readGroup);
+ if (rgTag.IsNull())
+ return string();
+ return rgTag.ToString();
+}
+
+BamRecord& BamRecord::ReadGroupId(const std::string& id)
+{
+ internal::CreateOrEdit(internal::tagName_readGroup,
+ id,
+ &impl_);
+ UpdateName();
+ return *this;
+}
+
+Position BamRecord::ReferenceEnd(void) const
+{
+ if (!impl_.IsMapped())
+ return PacBio::BAM::UnmappedPosition;
+ PBBAM_SHARED_PTR<bam1_t> htsData = internal::BamRecordMemory::GetRawData(impl_);
+ if (!htsData)
+ return PacBio::BAM::UnmappedPosition;
+ return bam_endpos(htsData.get());
+}
+
+int32_t BamRecord::ReferenceId(void) const
+{ return impl_.ReferenceId(); }
+
+std::string BamRecord::ReferenceName(void) const
+{
+ if (IsMapped())
+ return Header().SequenceName(ReferenceId());
+ else
+ throw std::runtime_error("unmapped record has no associated reference name");
+}
+
+Position BamRecord::ReferenceStart(void) const
+{ return impl_.Position(); }
+
+void BamRecord::ResetCachedPositions(void) const
+{
+ alignedEnd_ = PacBio::BAM::UnmappedPosition;
+ alignedStart_ = PacBio::BAM::UnmappedPosition;
+}
+
+void BamRecord::ResetCachedPositions(void)
+{
+ alignedEnd_ = PacBio::BAM::UnmappedPosition;
+ alignedStart_ = PacBio::BAM::UnmappedPosition;
+}
+
+VirtualRegionType BamRecord::ScrapType(void) const
+{
+ const Tag& scTag = impl_.TagValue(internal::tagName_scrap_type);
+ return VirtualRegionTypeMap::ParseChar[scTag.ToUInt8()];
+}
+
+BamRecord& BamRecord::ScrapType(const VirtualRegionType type)
+{
+ internal::CreateOrEdit(internal::tagName_scrap_type,
+ static_cast<uint8_t>(type), &impl_);
+ return *this;
+}
+
+BamRecord& BamRecord::ScrapType(const char type)
+{
+ internal::CreateOrEdit(internal::tagName_scrap_type, type, &impl_);
+ return *this;
+}
+
+std::string BamRecord::Sequence(const Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchBases("SEQ",
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+vector<float> BamRecord::SignalToNoise(void) const
+{
+ const Tag& snTag = impl_.TagValue(internal::tagName_snr);
+ return snTag.ToFloatArray();
+}
+
+BamRecord& BamRecord::SignalToNoise(const vector<float>& snr)
+{
+ internal::CreateOrEdit(internal::tagName_snr, snr, &impl_);
+ return *this;
+}
+
+QualityValues BamRecord::SubstitutionQV(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchQualities(internal::tagName_substitutionQV,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::SubstitutionQV(const QualityValues& substitutionQVs)
+{
+ internal::CreateOrEdit(internal::tagName_substitutionQV, substitutionQVs.Fastq(), &impl_);
+ return *this;
+}
+
+
+
+std::string BamRecord::SubstitutionTag(Orientation orientation,
+ bool aligned,
+ bool exciseSoftClips) const
+{
+ return FetchBases(internal::tagName_substitutionTag,
+ orientation,
+ aligned,
+ exciseSoftClips);
+}
+
+BamRecord& BamRecord::SubstitutionTag(const std::string& tags)
+{
+ internal::CreateOrEdit(internal::tagName_substitutionTag, tags, &impl_);
+ return *this;
+}
+
+RecordType BamRecord::Type(void) const
+{
+ try {
+ const string& typeName = ReadGroup().ReadType();
+ return internal::NameToType(typeName);
+ } catch (std::exception&) {
+
+ // read group not found
+ // peek at name to see if we're CCS
+ if (FullName().find("ccs") != string::npos)
+ return RecordType::CCS;
+
+ // otherwise unknown
+ else
+ return RecordType::UNKNOWN;
+ }
+}
+
+void BamRecord::UpdateName()
+{
+ std::string newName;
+ newName.reserve(100);
+
+ newName += MovieName();
+ newName += "/";
+
+ if (HasHoleNumber())
+ newName += std::to_string(HoleNumber());
+ else
+ newName += "?";
+
+ newName += "/";
+
+ if (Type() == RecordType::CCS)
+ newName += "ccs";
+ else {
+ if (HasQueryStart())
+ newName += std::to_string(QueryStart());
+ else
+ newName += "?";
+
+ newName += '_';
+
+ if (HasQueryEnd())
+ newName += std::to_string(QueryEnd());
+ else
+ newName += "?";
+ }
+
+ impl_.Name(newName);
+}
diff --git a/src/BamRecordBuilder.cpp b/src/BamRecordBuilder.cpp
new file mode 100644
index 0000000..b37f7ba
--- /dev/null
+++ b/src/BamRecordBuilder.cpp
@@ -0,0 +1,393 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamRecordBuilder.h"
+#include "pbbam/BamTagCodec.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <htslib/sam.h>
+#include <cstring>
+#include <memory>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+BamRecordBuilder::BamRecordBuilder(void)
+{
+ // ensure proper clean slate
+ Reset();
+
+ // initialize with some space for data
+ name_.reserve(256);
+ sequence_.reserve(2096);
+ qualities_.reserve(2096);
+ cigar_.reserve(256);
+}
+
+BamRecordBuilder::BamRecordBuilder(const BamHeader& header)
+ : header_(header)
+{
+ // ensure proper clean slate
+ Reset();
+
+ // initialize with some space for data
+ name_.reserve(256);
+ sequence_.reserve(2096);
+ qualities_.reserve(2096);
+ cigar_.reserve(256);
+}
+
+BamRecordBuilder::BamRecordBuilder(const BamRecord& prototype)
+ : header_(prototype.Header())
+{
+ Reset(prototype);
+}
+
+BamRecordBuilder::BamRecordBuilder(const BamRecordBuilder& other)
+ : core_(other.core_)
+ , name_(other.name_)
+ , sequence_(other.sequence_)
+ , qualities_(other.qualities_)
+ , cigar_(other.cigar_)
+ , tags_(other.tags_)
+{ }
+
+BamRecordBuilder::BamRecordBuilder(BamRecordBuilder&& other)
+ : core_(std::move(other.core_))
+ , name_(std::move(other.name_))
+ , sequence_(std::move(other.sequence_))
+ , qualities_(std::move(other.qualities_))
+ , cigar_(std::move(other.cigar_))
+ , tags_(std::move(other.tags_))
+{ }
+
+BamRecordBuilder& BamRecordBuilder::operator=(const BamRecordBuilder& other)
+{
+ core_ = other.core_;
+ name_ = other.name_;
+ sequence_ = other.sequence_;
+ qualities_ = other.qualities_;
+ cigar_ = other.cigar_;
+ tags_ = other.tags_;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::operator=(BamRecordBuilder&& other)
+{
+ core_ = std::move(other.core_);
+ name_ = std::move(other.name_);
+ sequence_ = std::move(other.sequence_);
+ qualities_ = std::move(other.qualities_);
+ cigar_ = std::move(other.cigar_);
+ tags_ = std::move(other.tags_);
+ return *this;
+}
+
+BamRecordBuilder::~BamRecordBuilder(void) { }
+
+BamRecord BamRecordBuilder::Build(void) const
+{
+ BamRecord result(header_);
+ BuildInPlace(result);
+ return result;
+}
+
+bool BamRecordBuilder::BuildInPlace(BamRecord& record) const
+{
+ // initialize with basic 'core data'
+ PBBAM_SHARED_PTR<bam1_t> recordRawData = internal::BamRecordMemory::GetRawData(record); /* record.impl_.RawData().get();*/
+ PB_ASSERT_OR_RETURN_VALUE(recordRawData, false);
+ PB_ASSERT_OR_RETURN_VALUE(recordRawData->data, false);
+ recordRawData->core = core_;
+
+ // setup variable length data
+ const vector<uint8_t> encodedTags = std::move(BamTagCodec::Encode(tags_));
+
+ const size_t nameLength = name_.size() + 1;
+ const size_t numCigarOps = cigar_.size();
+ const size_t cigarLength = numCigarOps * sizeof(uint32_t);
+ const size_t seqLength = sequence_.size();
+ const size_t qualLength = seqLength;
+ const size_t tagLength = encodedTags.size();
+ const size_t dataLength = nameLength + cigarLength + seqLength + qualLength + tagLength;
+
+ // realloc if necessary
+ uint8_t* varLengthDataBlock = recordRawData->data;
+ PB_ASSERT_OR_RETURN_VALUE(varLengthDataBlock, false);
+ size_t allocatedDataLength = recordRawData->m_data;
+ if (allocatedDataLength < dataLength) {
+ allocatedDataLength = dataLength;
+ kroundup32(allocatedDataLength);
+ varLengthDataBlock = (uint8_t*)realloc(varLengthDataBlock, allocatedDataLength);
+ }
+ recordRawData->data = varLengthDataBlock;
+ recordRawData->l_data = dataLength;
+ recordRawData->m_data = allocatedDataLength;
+
+ size_t index = 0;
+
+ // name
+ memcpy(&varLengthDataBlock[index], name_.c_str(), nameLength);
+ index += nameLength;
+
+ // cigar
+ if (cigarLength > 0) {
+ vector<uint32_t> encodedCigar(numCigarOps);
+ for (size_t i = 0; i < numCigarOps; ++i) {
+ const CigarOperation& op = cigar_.at(i);
+ encodedCigar[i] = op.Length() << BAM_CIGAR_SHIFT;
+ const uint8_t type = static_cast<uint8_t>(op.Type());
+ PB_ASSERT_OR_RETURN_VALUE(type >= 0 && type < 8, false);
+ encodedCigar[i] |= type;
+ }
+ memcpy(&varLengthDataBlock[index], &encodedCigar[0], cigarLength);
+ index += cigarLength;
+
+ // update bin after we've calculated cigar info
+ const int32_t endPosition = bam_cigar2rlen(recordRawData->core.n_cigar, &encodedCigar[0]);
+ recordRawData->core.bin = hts_reg2bin(core_.pos, endPosition, 14, 5);
+ }
+
+ // seq & qual
+ if (seqLength > 0) {
+
+ uint8_t* s = &varLengthDataBlock[index];
+ for (size_t i = 0; i < seqLength; ++i)
+ s[i>>1] |= ( seq_nt16_table[static_cast<int>(sequence_.at(i))] << ((~i&1)<<2) );
+ index += seqLength;
+
+ uint8_t* q = &varLengthDataBlock[index];
+ if (!qualities_.empty())
+ memset(q, 0xFF, seqLength);
+ else {
+ for (size_t i = 0; i < seqLength; ++i)
+ q[i] = qualities_.at(i) - 33;
+ }
+ index += seqLength;
+ }
+
+ // tags
+ if (tagLength > 0) {
+ PB_ASSERT_OR_RETURN_VALUE(!encodedTags.empty(), false);
+ memcpy(&varLengthDataBlock[index], &encodedTags[0], tagLength);
+ index += tagLength;
+ }
+
+ // sanity check
+ PB_ASSERT_OR_RETURN_VALUE(index == dataLength, false);
+ return true;
+}
+
+BamRecordBuilder& BamRecordBuilder::Cigar(const PacBio::BAM::Cigar& cigar)
+{
+ core_.n_cigar = cigar.size();
+ cigar_ = cigar;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Cigar(PacBio::BAM::Cigar&& cigar)
+{
+ core_.n_cigar = cigar.size();
+ cigar_ = std::move(cigar);
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Name(const std::string& name)
+{
+ core_.l_qname = name.size() + 1; // (NULL-term)
+ name_ = name;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Name(std::string&& name)
+{
+ core_.l_qname = name.size() + 1; // (NULL-term)
+ name_ = std::move(name);
+ return *this;
+}
+
+void BamRecordBuilder::Reset(void)
+{
+ // zeroize fixed-length data
+ memset(&core_, 0, sizeof(bam1_core_t));
+ core_.l_qname = 1; // always has a NULL-term
+
+ // reset variable-length data
+ name_.clear();
+ sequence_.clear();
+ qualities_.clear();
+ cigar_.clear();
+ tags_.clear();
+}
+
+void BamRecordBuilder::Reset(const BamRecord& prototype)
+{
+ // ensure clean slate
+ Reset();
+ header_ = prototype.Header();
+
+ // reset core data
+ const PBBAM_SHARED_PTR<bam1_t> rawData = internal::BamRecordMemory::GetRawData(prototype); // prototype.impl_.RawData().get();
+ PB_ASSERT_OR_RETURN(rawData);
+ core_ = rawData->core;
+
+ // reset variable-length data
+ const BamRecordImpl& impl = internal::BamRecordMemory::GetImpl(prototype);
+ name_ = impl.Name();
+ sequence_ = impl.Sequence();
+ qualities_ = impl.Qualities().Fastq();
+ cigar_ = impl.CigarData();
+ tags_ = impl.Tags();
+}
+
+void BamRecordBuilder::Reset(BamRecord&& prototype)
+{
+ // ensure clean slate
+ Reset();
+ header_ = std::move(prototype.Header());
+
+ // reset core data
+ const PBBAM_SHARED_PTR<bam1_t> rawData = internal::BamRecordMemory::GetRawData(prototype); // prototype.impl_.RawData().get();
+ PB_ASSERT_OR_RETURN(rawData);
+ core_ = std::move(rawData->core);
+
+ // reset variable-length data
+ const BamRecordImpl& impl = internal::BamRecordMemory::GetImpl(prototype);
+ name_ = std::move(impl.Name());
+ sequence_ = std::move(impl.Sequence());
+ qualities_ = std::move(impl.Qualities().Fastq());
+ cigar_ = std::move(impl.CigarData());
+ tags_ = std::move(impl.Tags());
+}
+
+BamRecordBuilder& BamRecordBuilder::Sequence(const std::string& sequence)
+{
+ core_.l_qseq = sequence.size();
+ sequence_ = sequence;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Sequence(std::string&& sequence)
+{
+ core_.l_qseq = sequence.size();
+ sequence_ = std::move(sequence);
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetDuplicate(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::DUPLICATE;
+ else core_.flag &= ~BamRecordImpl::DUPLICATE;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetFailedQC(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::FAILED_QC;
+ else core_.flag &= ~BamRecordImpl::FAILED_QC;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetFirstMate(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::MATE_1;
+ else core_.flag &= ~BamRecordImpl::MATE_1;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetMapped(bool ok)
+{
+ if (ok) core_.flag &= ~BamRecordImpl::UNMAPPED;
+ else core_.flag |= BamRecordImpl::UNMAPPED;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetMateMapped(bool ok)
+{
+ if (ok) core_.flag &= ~BamRecordImpl::MATE_UNMAPPED;
+ else core_.flag |= BamRecordImpl::MATE_UNMAPPED;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetMateReverseStrand(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::MATE_REVERSE_STRAND;
+ else core_.flag &= ~BamRecordImpl::MATE_REVERSE_STRAND;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetPaired(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::PAIRED;
+ else core_.flag &= ~BamRecordImpl::PAIRED;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetPrimaryAlignment(bool ok)
+{
+ if (ok) core_.flag &= ~BamRecordImpl::SECONDARY;
+ else core_.flag |= BamRecordImpl::SECONDARY;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetProperPair(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::PROPER_PAIR;
+ else core_.flag &= ~BamRecordImpl::PROPER_PAIR;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetReverseStrand(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::REVERSE_STRAND;
+ else core_.flag &= ~BamRecordImpl::REVERSE_STRAND;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetSecondMate(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::MATE_2;
+ else core_.flag &= ~BamRecordImpl::MATE_2;
+ return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetSupplementaryAlignment(bool ok)
+{
+ if (ok) core_.flag |= BamRecordImpl::SUPPLEMENTARY;
+ else core_.flag &= ~BamRecordImpl::SUPPLEMENTARY;
+ return *this;
+}
diff --git a/src/BamRecordImpl.cpp b/src/BamRecordImpl.cpp
new file mode 100644
index 0000000..46632b3
--- /dev/null
+++ b/src/BamRecordImpl.cpp
@@ -0,0 +1,426 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamRecordImpl.h"
+#include "pbbam/BamTagCodec.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <algorithm>
+#include <iostream>
+#include <utility>
+#include <cstdlib>
+#include <cstring>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+BamRecordImpl::BamRecordImpl(void)
+ : d_(nullptr)
+{
+ InitializeData();
+}
+
+BamRecordImpl::BamRecordImpl(const BamRecordImpl& other)
+ : d_(bam_dup1(other.d_.get()), internal::HtslibRecordDeleter())
+{ }
+
+BamRecordImpl::BamRecordImpl(BamRecordImpl&& other)
+ : d_(nullptr)
+{
+ d_.swap(other.d_);
+ other.d_.reset();
+}
+
+BamRecordImpl& BamRecordImpl::operator=(const BamRecordImpl& other)
+{
+ if (this != & other) {
+ if (d_ == nullptr)
+ InitializeData();
+ bam_copy1(d_.get(), other.d_.get());
+ }
+ return *this;
+}
+
+BamRecordImpl& BamRecordImpl::operator=(BamRecordImpl&& other)
+{
+ if (this != & other) {
+ d_.swap(other.d_);
+ other.d_.reset();
+ }
+ return *this;
+}
+
+BamRecordImpl::~BamRecordImpl(void) { }
+
+bool BamRecordImpl::AddTag(const string& tagName, const Tag &value)
+{
+ if (tagName.size() != 2 || HasTag(tagName))
+ return false;
+
+ const vector<uint8_t> rawData = std::move(BamTagCodec::ToRawData(value));
+ if (rawData.empty())
+ return false;
+
+ bam_aux_append(d_.get(),
+ tagName.c_str(),
+ BamTagCodec::TagTypeCode(value),
+ rawData.size(),
+ const_cast<uint8_t*>(rawData.data()));
+
+ return true;
+}
+
+Cigar BamRecordImpl::CigarData(void) const
+{
+ Cigar result;
+ result.reserve(d_->core.n_cigar);
+ uint32_t* cigarData = bam_get_cigar(d_);
+ for (uint32_t i = 0; i < d_->core.n_cigar; ++i) {
+ const uint32_t length = bam_cigar_oplen(cigarData[i]);
+ const char type = bam_cigar_opchr(cigarData[i]);
+ result.push_back(CigarOperation(type, length));
+ }
+
+ return result;
+}
+
+BamRecordImpl& BamRecordImpl::CigarData(const Cigar& cigar)
+{
+ // determine change in memory needed
+ // diffNumBytes: pos -> growing, neg -> shrinking
+ const size_t numCigarOps = cigar.size();
+ const int diffNumCigars = numCigarOps - d_->core.n_cigar;
+ const int diffNumBytes = diffNumCigars * sizeof(uint32_t);
+ const int oldLengthData = d_->l_data;
+ d_->l_data += diffNumBytes;
+ MaybeReallocData();
+
+ // shift trailing data (seq, qual, tags) as needed
+ const uint8_t* oldSequenceStart = bam_get_seq(d_);
+ const size_t trailingDataLength = oldLengthData - (oldSequenceStart - d_->data);
+ d_->core.n_cigar = numCigarOps;
+ uint8_t* newSequenceStart = bam_get_seq(d_);
+ memmove(newSequenceStart, oldSequenceStart, trailingDataLength);
+
+ // fill in new CIGAR data
+ uint32_t* cigarDataStart = bam_get_cigar(d_);
+ for (size_t i = 0; i < numCigarOps; ++i) {
+ const CigarOperation& cigarOp = cigar.at(i);
+ cigarDataStart[i] = bam_cigar_gen(cigarOp.Length(), static_cast<int>(cigarOp.Type()));
+ }
+
+ return *this;
+}
+
+BamRecordImpl& BamRecordImpl::CigarData(const std::string& cigarString)
+{
+ return CigarData(Cigar::FromStdString(cigarString));
+}
+
+bool BamRecordImpl::EditTag(const string& tagName, const Tag &newValue)
+{
+ return RemoveTag(tagName) && AddTag(tagName, newValue);
+}
+
+BamRecordImpl BamRecordImpl::FromRawData(const PBBAM_SHARED_PTR<bam1_t>& rawData)
+{
+ BamRecordImpl result;
+ bam_copy1(result.d_.get(), rawData.get());
+ return result;
+}
+
+bool BamRecordImpl::HasTag(const string& tagName) const
+{
+ if (tagName.size() != 2)
+ return false;
+ return bam_aux_get(d_.get(), tagName.c_str()) != 0;
+}
+
+void BamRecordImpl::InitializeData(void)
+{
+ d_.reset(bam_init1(), internal::HtslibRecordDeleter());
+ d_->data = (uint8_t*)(calloc(0x800, sizeof(uint8_t))); // maybe make this value tune-able later?
+
+ // init unmapped
+ Position(PacBio::BAM::UnmappedPosition);
+ MatePosition(PacBio::BAM::UnmappedPosition);
+ ReferenceId(-1);
+ MateReferenceId(-1);
+ SetMapped(false);
+ MapQuality(255);
+
+ // initialized with NULL term for qname
+ d_->core.l_qname = 1;
+ d_->l_data = 1;
+ d_->m_data = 0x800;
+}
+
+void BamRecordImpl::MaybeReallocData(void)
+{
+ // about to grow data contents to l_data size, but m_data is our current max.
+ // so we may need to grow. if so, use kroundup to double to next power of 2
+ if (d_->m_data < d_->l_data) {
+ d_->m_data = d_->l_data;
+ kroundup32(d_->m_data);
+ d_->data = static_cast<uint8_t*>(realloc(d_->data, d_->m_data));
+ }
+}
+
+string BamRecordImpl::Name(void) const
+{
+ return string(bam_get_qname(d_));
+}
+
+BamRecordImpl& BamRecordImpl::Name(const std::string& name)
+{
+ // determine change in memory needed
+ // diffNumBytes: pos -> growing, neg -> shrinking
+ const size_t numChars = name.size() + 1; // +1 for NULL-term
+ const int diffNumBytes = numChars - d_->core.l_qname;
+ const int oldLengthData = d_->l_data;
+ d_->l_data += diffNumBytes;
+ MaybeReallocData();
+
+ // shift trailing data (cigar, seq, qual, tags) as needed
+ const uint32_t* oldCigarStart = bam_get_cigar(d_);
+ const size_t trailingDataLength = oldLengthData - ((uint8_t*)oldCigarStart - d_->data);
+ d_->core.l_qname = numChars;
+ uint32_t* newCigarStart = bam_get_cigar(d_);
+ memmove(newCigarStart, oldCigarStart, trailingDataLength);
+
+ // fill in new name
+ memcpy(d_->data, name.c_str(), numChars);
+ return *this;
+}
+
+QualityValues BamRecordImpl::Qualities(void) const
+{
+ if (d_->core.l_qseq == 0)
+ return QualityValues();
+
+ uint8_t* qualData = bam_get_qual(d_);
+ if (qualData[0] == 0xff)
+ return QualityValues();
+
+ const size_t numQuals = d_->core.l_qseq;
+ QualityValues result;
+ result.reserve(numQuals);
+ for (size_t i = 0; i < numQuals; ++i)
+ result.push_back(QualityValue(qualData[i]));
+ return result;
+
+// string result;
+// result.reserve(d_->core.l_qseq);
+// for (int i = 0; i < d_->core.l_qseq; ++i)
+// result.push_back(qualData[i] + 33);
+// return result;
+}
+
+bool BamRecordImpl::RemoveTag(const string& tagName)
+{
+ if (tagName.size() != 2)
+ return false;
+ uint8_t* data = bam_aux_get(d_.get(), tagName.c_str());
+ if (data == 0)
+ return false;
+ return bam_aux_del(d_.get(), data) == 0;
+}
+
+string BamRecordImpl::Sequence(void) const
+{
+ string result;
+ result.reserve(d_->core.l_qseq);
+ static const string DnaLookup = string("=ACMGRSVTWYHKDBN");
+ const uint8_t* seqData = bam_get_seq(d_);
+ for (int i = 0; i < d_->core.l_qseq; ++i)
+ result.append(1, DnaLookup[bam_seqi(seqData, i)]);
+ return result;
+}
+
+BamRecordImpl& BamRecordImpl::SetSequenceAndQualities(const std::string& sequence,
+ const std::string& qualities)
+{
+ // TODO: I'm ok with the assert for now, but how to handle at runtime?
+ if (!qualities.empty()) {
+ PB_ASSERT_OR_RETURN_VALUE(sequence.size() == qualities.size(), *this);
+ }
+
+ return SetSequenceAndQualitiesInternal(sequence.c_str(),
+ sequence.size(),
+ qualities.c_str(),
+ false);
+}
+
+BamRecordImpl& BamRecordImpl::SetSequenceAndQualities(const char* sequence,
+ const size_t sequenceLength,
+ const char* qualities)
+{
+ return SetSequenceAndQualitiesInternal(sequence,
+ sequenceLength,
+ qualities,
+ false);
+}
+
+BamRecordImpl& BamRecordImpl::SetPreencodedSequenceAndQualities(const char* encodedSequence,
+ const size_t rawSequenceLength,
+ const char* qualities)
+{
+ return SetSequenceAndQualitiesInternal(encodedSequence,
+ rawSequenceLength,
+ qualities,
+ true);
+}
+
+BamRecordImpl& BamRecordImpl::SetSequenceAndQualitiesInternal(const char* sequence,
+ const size_t sequenceLength,
+ const char* qualities,
+ bool isPreencoded)
+{
+ // determine change in memory needed
+ // diffNumBytes: pos -> growing, neg -> shrinking
+ const int encodedSequenceLength = static_cast<int>((sequenceLength+1)/2);
+ const int oldSeqAndQualLength = static_cast<int>((d_->core.l_qseq+1)/2) + d_->core.l_qseq; // encoded seq + qual
+ const int newSeqAndQualLength = encodedSequenceLength + sequenceLength; // encoded seq + qual
+ const int diffNumBytes = newSeqAndQualLength - oldSeqAndQualLength;
+ const int oldLengthData = d_->l_data;
+ d_->l_data += diffNumBytes;
+ MaybeReallocData();
+
+ // shift trailing data (tags) as needed
+ const uint8_t* oldTagStart = bam_get_aux(d_);
+ const size_t trailingDataLength = oldLengthData - ((uint8_t*)oldTagStart - d_->data);
+ d_->core.l_qseq = sequenceLength;
+ uint8_t* newTagStart = bam_get_aux(d_);
+ memmove(newTagStart, oldTagStart, trailingDataLength);
+
+ // fill in new sequence
+ uint8_t* pEncodedSequence = bam_get_seq(d_);
+ if (isPreencoded) {
+ memcpy(pEncodedSequence, sequence, encodedSequenceLength);
+ } else {
+ memset(pEncodedSequence, 0, encodedSequenceLength);
+ for (size_t i = 0; i < sequenceLength; ++i)
+ pEncodedSequence[i>>1] |= seq_nt16_table[(int)sequence[i]] << ((~i&1)<<2);
+
+
+
+// const char* pRawSequence = sequence;
+// uint8_t nucleotideCode;
+// bool useHighWord = true;
+// for (size_t i = 0; i < sequenceLength; ++i) {
+// switch (*pRawSequence) {
+// case '=' : nucleotideCode = 0; break;
+// case 'A' : nucleotideCode = 1; break;
+// case 'C' : nucleotideCode = 2; break;
+// case 'M' : nucleotideCode = 3; break;
+// case 'G' : nucleotideCode = 4; break;
+// case 'R' : nucleotideCode = 5; break;
+// case 'S' : nucleotideCode = 6; break;
+// case 'V' : nucleotideCode = 7; break;
+// case 'T' : nucleotideCode = 8; break;
+// case 'W' : nucleotideCode = 9; break;
+// case 'Y' : nucleotideCode = 10; break;
+// case 'H' : nucleotideCode = 11; break;
+// case 'K' : nucleotideCode = 12; break;
+// case 'D' : nucleotideCode = 13; break;
+// case 'B' : nucleotideCode = 14; break;
+// case 'N' : nucleotideCode = 15; break;
+// default :
+// PB_ASSERT_UNREACHABLE; // graceful way to handle?
+// break;
+// }
+
+// // pack the nucleotide code
+// if (useHighWord) {
+// *pEncodedSequence = nucleotideCode << 4;
+// useHighWord = false;
+// } else {
+// *pEncodedSequence |= nucleotideCode;
+// ++pEncodedSequence;
+// useHighWord = true;
+// }
+// ++pRawSequence;
+// }
+ }
+
+ // fill in quality values
+ uint8_t* encodedQualities = bam_get_qual(d_);
+ if ( (qualities == 0 ) || (::strlen(qualities) == 0) )
+ memset(encodedQualities, 0xff, sequenceLength);
+ else {
+ for (size_t i = 0; i < sequenceLength; ++i)
+ encodedQualities[i] = qualities[i] - 33; // FASTQ ASCII -> int conversion
+ }
+ return *this;
+}
+
+BamRecordImpl& BamRecordImpl::Tags(const TagCollection& tags)
+{
+ // convert tags to binary
+ const vector<uint8_t>& tagData = BamTagCodec::Encode(tags);
+ const size_t numBytes = tagData.size();
+ const uint8_t* data = tagData.data();
+
+ // determine change in memory needed
+ uint8_t* tagStart = bam_get_aux(d_);
+ const size_t oldNumBytes = d_->l_data - (tagStart - d_->data);
+ const int diffNumBytes = numBytes - oldNumBytes;
+ d_->l_data += diffNumBytes;
+ MaybeReallocData();
+ tagStart = bam_get_aux(d_);
+
+ // fill in new tag data
+ memcpy((void*)tagStart, data, numBytes);
+ return *this;
+}
+
+TagCollection BamRecordImpl::Tags(void) const
+{
+ const uint8_t* tagDataStart = bam_get_aux(d_);
+ const size_t numBytes = d_->l_data - (tagDataStart - d_->data);
+ return BamTagCodec::Decode(vector<uint8_t>(tagDataStart, tagDataStart+numBytes));
+}
+
+Tag BamRecordImpl::TagValue(const string& tagName) const
+{
+ if (tagName.size() != 2)
+ return Tag();
+ uint8_t* data = bam_aux_get(d_.get(), tagName.c_str());
+ if (data == 0)
+ return Tag();
+ return BamTagCodec::FromRawData(data);
+}
diff --git a/src/BamTagCodec.cpp b/src/BamTagCodec.cpp
new file mode 100644
index 0000000..522e41d
--- /dev/null
+++ b/src/BamTagCodec.cpp
@@ -0,0 +1,517 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamTagCodec.h"
+#include "AssertUtils.h"
+#include <htslib/kstring.h>
+#include <cstring>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+template<typename T>
+inline void appendBamValue(const T& value, kstring_t* str /*vector<uint8_t>& result*/)
+{
+ kputsn_((char*)&value, sizeof(value), str);
+// const size_t initialResultSize = result.size();
+// result.resize(initialResultSize + sizeof(T));
+// memcpy((uint8_t*)&result[initialResultSize],
+// (uint8_t*)&value,
+// sizeof(T));
+}
+
+template<typename T>
+inline void appendBamMultiValue(const vector<T>& container, kstring_t* str /*vector<uint8_t>& result*/)
+{
+ const uint32_t n = container.size();
+ kputsn_(&n, sizeof(n), str);
+ kputsn_((char*)&container[0], n*sizeof(T), str);
+
+// const size_t initialResultSize = result.size();
+// const uint32_t numValues = container.size();
+// result.resize(initialResultSize + 4 + numValues*sizeof(T));
+// memcpy((uint8_t*)&result[initialResultSize], (uint32_t*)&numValues, sizeof(numValues));
+// memcpy((uint8_t*)&result[initialResultSize + 4],
+// (uint8_t*)&container[0],
+// numValues*sizeof(T));
+}
+
+template<typename T>
+inline T readBamValue(const uint8_t* src, size_t& offset)
+{
+ T value;
+ memcpy(&value, &src[offset], sizeof(value));
+ offset += sizeof(value);
+ return value;
+}
+
+template<typename T>
+vector<T> readBamMultiValue(const uint8_t* src, size_t& offset)
+{
+ uint32_t numElements;
+ memcpy(&numElements, &src[offset], sizeof(uint32_t));
+ offset += 4;
+
+ vector<T> result;
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i) {
+ const T& value = readBamValue<T>(src, offset);
+ result.push_back(value);
+ }
+ return result;
+}
+
+TagCollection BamTagCodec::Decode(const vector<uint8_t>& data)
+{
+ TagCollection tags;
+
+ // NOTE: not completely safe - no real bounds-checking yet on input data
+
+ const uint8_t* pData = data.data();
+ const size_t numBytes = data.size();
+ size_t i = 0;
+ while (i < numBytes) {
+
+ string tagName;
+ tagName.reserve(2);
+ tagName.append(1, pData[i++]);
+ tagName.append(1, pData[i++]);
+
+ const char tagType = static_cast<char>(pData[i++]);
+ switch (tagType) {
+ case 'A' :
+ case 'a' :
+ {
+ tags[tagName] = readBamValue<uint8_t>(pData, i);
+ tags[tagName].Modifier(TagModifier::ASCII_CHAR);
+ break;
+ }
+
+ case 'c' : tags[tagName] = readBamValue<int8_t>(pData, i); break;
+ case 'C' : tags[tagName] = readBamValue<uint8_t>(pData, i); break;
+ case 's' : tags[tagName] = readBamValue<int16_t>(pData, i); break;
+ case 'S' : tags[tagName] = readBamValue<uint16_t>(pData, i); break;
+ case 'i' : tags[tagName] = readBamValue<int32_t>(pData, i); break;
+ case 'I' : tags[tagName] = readBamValue<uint32_t>(pData, i); break;
+ case 'f' : tags[tagName] = readBamValue<float>(pData, i); break;
+
+ case 'Z' :
+ case 'H' :
+ {
+ const size_t dataLength = strlen((const char*)&pData[i]);
+ string value;
+ value.resize(dataLength);
+ memcpy((char*)value.data(), &pData[i], dataLength);
+ tags[tagName] = value;
+ if (tagType == 'H')
+ tags[tagName].Modifier(TagModifier::HEX_STRING);
+ i += dataLength + 1;
+ break;
+ }
+
+ case 'B' :
+ {
+ const char subTagType = pData[i++];
+ switch (subTagType) {
+
+ case 'c' : tags[tagName] = readBamMultiValue<int8_t>(pData, i); break;
+ case 'C' : tags[tagName] = readBamMultiValue<uint8_t>(pData, i); break;
+ case 's' : tags[tagName] = readBamMultiValue<int16_t>(pData, i); break;
+ case 'S' : tags[tagName] = readBamMultiValue<uint16_t>(pData, i); break;
+ case 'i' : tags[tagName] = readBamMultiValue<int32_t>(pData, i); break;
+ case 'I' : tags[tagName] = readBamMultiValue<uint32_t>(pData, i); break;
+ case 'f' : tags[tagName] = readBamMultiValue<float>(pData, i); break;
+
+ // unknown subTagType
+ default:
+ PB_ASSERT_OR_RETURN_VALUE(false, TagCollection());
+ }
+ break;
+ }
+
+ // unknown tagType
+ default:
+ PB_ASSERT_OR_RETURN_VALUE(false, TagCollection());
+ }
+ }
+
+ return tags;
+}
+
+vector<uint8_t> BamTagCodec::Encode(const TagCollection& tags)
+{
+ kstring_t str = { 0, 0, NULL };
+
+ vector<uint8_t> result;
+
+ const auto tagEnd = tags.cend();
+ for (auto tagIter = tags.cbegin(); tagIter != tagEnd; ++tagIter) {
+ const string& name = (*tagIter).first;
+ const Tag& tag = (*tagIter).second;
+ PB_ASSERT_OR_CONTINUE(name.size() == 2);
+ if (tag.IsNull())
+ continue;
+
+ // "<TAG>:"
+ kputsn_(name.c_str(), 2, &str);
+
+ // "<TYPE>:<DATA>" for printable, ASCII char
+ if (tag.HasModifier(TagModifier::ASCII_CHAR)) {
+ char c = tag.ToAscii();
+ if (c != '\0') {
+ kputc_('A', &str);
+ kputc_(c, &str);
+ continue;
+ }
+ }
+
+ // "<TYPE>:<DATA>" for all other data
+ switch ( tag.Type() ) {
+ case TagDataType::INT8 :
+ {
+ kputc_('c', &str);
+ appendBamValue(tag.ToInt8(), &str);
+ break;
+ }
+ case TagDataType::UINT8 :
+ {
+ kputc_('C', &str);
+ appendBamValue(tag.ToUInt8(), &str);
+ break;
+ }
+ case TagDataType::INT16 :
+ {
+ kputc_('s', &str);
+ appendBamValue(tag.ToInt16(), &str);
+ break;
+ }
+ case TagDataType::UINT16 :
+ {
+ kputc_('S', &str);
+ appendBamValue(tag.ToUInt16(), &str);
+ break;
+ }
+ case TagDataType::INT32 :
+ {
+ kputc_('i', &str);
+ appendBamValue(tag.ToInt32(), &str);
+ break;
+ }
+ case TagDataType::UINT32 :
+ {
+ kputc_('I', &str);
+ appendBamValue(tag.ToUInt32(), &str);
+ break;
+ }
+ case TagDataType::FLOAT :
+ {
+ kputc_('f', &str);
+ appendBamValue(tag.ToFloat(), &str);
+ break;
+ }
+
+ case TagDataType::STRING :
+ {
+ if (tag.HasModifier(TagModifier::HEX_STRING))
+ kputc_('H', &str);
+ else
+ kputc_('Z', &str);
+ const string& s = tag.ToString();
+ kputsn_(s.c_str(), s.size()+1, &str); // this adds the null-term
+ break;
+ }
+
+ case TagDataType::INT8_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('c', &str);
+ appendBamMultiValue(tag.ToInt8Array(), &str);
+ break;
+ }
+ case TagDataType::UINT8_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('C', &str);
+ appendBamMultiValue(tag.ToUInt8Array(), &str);
+ break;
+ }
+ case TagDataType::INT16_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('s', &str);
+ appendBamMultiValue(tag.ToInt16Array(), &str);
+ break;
+ }
+ case TagDataType::UINT16_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('S', &str);
+ appendBamMultiValue(tag.ToUInt16Array(), &str);
+ break;
+ }
+ case TagDataType::INT32_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('i', &str);
+ appendBamMultiValue(tag.ToInt32Array(), &str);
+ break;
+ }
+ case TagDataType::UINT32_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('I', &str);
+ appendBamMultiValue(tag.ToUInt32Array(), &str);
+ break;
+ }
+ case TagDataType::FLOAT_ARRAY :
+ {
+ kputc_('B', &str);
+ kputc_('f', &str);
+ appendBamMultiValue(tag.ToFloatArray(), &str);
+ break;
+ }
+
+ default :
+ free(str.s);
+ PB_ASSERT_OR_RETURN_VALUE(false, vector<uint8_t>());
+ }
+ }
+
+ result.resize(str.l);
+ memcpy((char*)&result[0], str.s, str.l);
+ free(str.s);
+ return result;
+}
+
+Tag BamTagCodec::FromRawData(uint8_t* rawData)
+{
+ size_t offset = 0;
+ const char tagType = static_cast<char>(*rawData++);
+ switch (tagType) {
+ case 'A' :
+ case 'a' :
+ {
+ Tag t = Tag(readBamValue<uint8_t>(rawData, offset));
+ t.Modifier(TagModifier::ASCII_CHAR);
+ return t;
+ }
+
+ case 'c' : return Tag(readBamValue<int8_t>(rawData, offset));
+ case 'C' : return Tag(readBamValue<uint8_t>(rawData, offset));
+ case 's' : return Tag(readBamValue<int16_t>(rawData, offset));
+ case 'S' : return Tag(readBamValue<uint16_t>(rawData, offset));
+ case 'i' : return Tag(readBamValue<int32_t>(rawData, offset));
+ case 'I' : return Tag(readBamValue<uint32_t>(rawData, offset));
+ case 'f' : return Tag(readBamValue<float>(rawData, offset));
+
+ case 'Z' :
+ case 'H' :
+ {
+ const size_t dataLength = strlen((const char*)&rawData[0]);
+ string value;
+ value.resize(dataLength);
+ memcpy( (char*)value.data(), &rawData[0], dataLength );
+ Tag t(value);
+ if (tagType == 'H')
+ t.Modifier(TagModifier::HEX_STRING);
+ return t;
+ }
+
+ case 'B' :
+ {
+ const char subTagType = *rawData++;
+ switch (subTagType) {
+
+ case 'c' : return Tag(readBamMultiValue<int8_t>(rawData, offset));
+ case 'C' : return Tag(readBamMultiValue<uint8_t>(rawData, offset));
+ case 's' : return Tag(readBamMultiValue<int16_t>(rawData, offset));
+ case 'S' : return Tag(readBamMultiValue<uint16_t>(rawData, offset));
+ case 'i' : return Tag(readBamMultiValue<int32_t>(rawData, offset));
+ case 'I' : return Tag(readBamMultiValue<uint32_t>(rawData, offset));
+ case 'f' : return Tag(readBamMultiValue<float>(rawData, offset));
+
+ // unknown subTagType
+ default:
+ PB_ASSERT_OR_RETURN_VALUE(false, Tag());
+ }
+ break;
+ }
+
+ // unknown tagType
+ default:
+ PB_ASSERT_OR_RETURN_VALUE(false, Tag());
+ }
+}
+
+vector<uint8_t> BamTagCodec::ToRawData(const Tag& tag)
+{
+ kstring_t str = { 0, 0, NULL };
+
+ // "<TYPE>:<DATA>" for printable, ASCII char
+ if (tag.HasModifier(TagModifier::ASCII_CHAR)) {
+ char c = tag.ToAscii();
+ if (c != '\0') {
+ kputc_(c, &str);
+ }
+ }
+
+ // for all others
+ else {
+ switch ( tag.Type() ) {
+
+ // single, numeric values
+ case TagDataType::INT8 : appendBamValue(tag.ToInt8(), &str); break;
+ case TagDataType::UINT8 : appendBamValue(tag.ToUInt8(), &str); break;
+ case TagDataType::INT16 : appendBamValue(tag.ToInt16(), &str); break;
+ case TagDataType::UINT16 : appendBamValue(tag.ToUInt16(), &str); break;
+ case TagDataType::INT32 : appendBamValue(tag.ToInt32(), &str); break;
+ case TagDataType::UINT32 : appendBamValue(tag.ToUInt32(), &str); break;
+ case TagDataType::FLOAT : appendBamValue(tag.ToFloat(), &str); break;
+
+ // string (& hex-string) values
+ case TagDataType::STRING :
+ {
+ const string& s = tag.ToString();
+ kputsn_(s.c_str(), s.size()+1, &str); // this adds the null-term
+ break;
+ }
+
+ // array-type values
+ case TagDataType::INT8_ARRAY :
+ {
+ kputc_('c', &str);
+ appendBamMultiValue(tag.ToInt8Array(), &str);
+ break;
+ }
+ case TagDataType::UINT8_ARRAY :
+ {
+ kputc_('C', &str);
+ appendBamMultiValue(tag.ToUInt8Array(), &str);
+ break;
+ }
+ case TagDataType::INT16_ARRAY :
+ {
+ kputc_('s', &str);
+ appendBamMultiValue(tag.ToInt16Array(), &str);
+ break;
+ }
+ case TagDataType::UINT16_ARRAY :
+ {
+ kputc_('S', &str);
+ appendBamMultiValue(tag.ToUInt16Array(), &str);
+ break;
+ }
+ case TagDataType::INT32_ARRAY :
+ {
+ kputc_('i', &str);
+ appendBamMultiValue(tag.ToInt32Array(), &str);
+ break;
+ }
+ case TagDataType::UINT32_ARRAY :
+ {
+ kputc_('I', &str);
+ appendBamMultiValue(tag.ToUInt32Array(), &str);
+ break;
+ }
+ case TagDataType::FLOAT_ARRAY :
+ {
+ kputc_('f', &str);
+ appendBamMultiValue(tag.ToFloatArray(), &str);
+ break;
+ }
+
+ default :
+ free(str.s);
+ PB_ASSERT_OR_RETURN_VALUE(false, vector<uint8_t>());
+ }
+ }
+
+ vector<uint8_t> result;
+ result.resize(str.l);
+ memcpy((char*)&result[0], str.s, str.l);
+ free(str.s);
+ return result;
+}
+
+uint8_t BamTagCodec::TagTypeCode(const Tag &tag)
+{
+ if ( tag.HasModifier(TagModifier::ASCII_CHAR) ) {
+ int64_t value = 0;
+ switch ( tag.Type() ) {
+ case TagDataType::INT8 : value = static_cast<int64_t>(tag.ToInt8()); break;
+ case TagDataType::UINT8 : value = static_cast<int64_t>(tag.ToUInt8()); break;
+ case TagDataType::INT16 : value = static_cast<int64_t>(tag.ToInt16()); break;
+ case TagDataType::UINT16 : value = static_cast<int64_t>(tag.ToUInt16()); break;
+ case TagDataType::INT32 : value = static_cast<int64_t>(tag.ToInt32()); break;
+ case TagDataType::UINT32 : value = static_cast<int64_t>(tag.ToUInt32()); break;
+ default:
+ // non integers not
+ PB_ASSERT_OR_RETURN_VALUE(false, 0);
+ }
+ // printable range
+ PB_ASSERT_OR_RETURN_VALUE(value >= 33, 0);
+ PB_ASSERT_OR_RETURN_VALUE(value <= 126, 0);
+ return static_cast<uint8_t>('A');
+ }
+
+ switch ( tag.Type() ) {
+ case TagDataType::INT8 : return static_cast<uint8_t>('c');
+ case TagDataType::UINT8 : return static_cast<uint8_t>('C');
+ case TagDataType::INT16 : return static_cast<uint8_t>('s');
+ case TagDataType::UINT16 : return static_cast<uint8_t>('S');
+ case TagDataType::INT32 : return static_cast<uint8_t>('i');
+ case TagDataType::UINT32 : return static_cast<uint8_t>('I');
+ case TagDataType::FLOAT : return static_cast<uint8_t>('f');
+
+ case TagDataType::STRING :
+ {
+ return tag.HasModifier(TagModifier::HEX_STRING) ? static_cast<uint8_t>('H')
+ : static_cast<uint8_t>('Z');
+ }
+
+ case TagDataType::INT8_ARRAY : // fall through
+ case TagDataType::UINT8_ARRAY : // .
+ case TagDataType::INT16_ARRAY : // .
+ case TagDataType::UINT16_ARRAY : // .
+ case TagDataType::INT32_ARRAY : // .
+ case TagDataType::UINT32_ARRAY : // .
+ case TagDataType::FLOAT_ARRAY : return static_cast<uint8_t>('B');
+
+ default:
+ PB_ASSERT_OR_RETURN_VALUE(false, 0);
+ }
+}
diff --git a/src/BamWriter.cpp b/src/BamWriter.cpp
new file mode 100644
index 0000000..0abd6e6
--- /dev/null
+++ b/src/BamWriter.cpp
@@ -0,0 +1,171 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamWriter.h"
+#include "pbbam/BamFile.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <htslib/bgzf.h>
+#include <htslib/hfile.h>
+#include <htslib/hts.h>
+#include <thread>
+#include <iostream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class BamWriterPrivate
+{
+public:
+ BamWriterPrivate(void)
+ : file_(nullptr)
+ , header_(nullptr)
+ { }
+
+public:
+ void Open(const std::string& filename,
+ const PBBAM_SHARED_PTR<bam_hdr_t> rawHeader,
+ const BamWriter::CompressionLevel compressionLevel = BamWriter::DefaultCompression,
+ size_t numThreads = 4);
+ void Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord);
+ void Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord, int64_t* vOffset);
+
+public:
+ std::unique_ptr<samFile, internal::HtslibFileDeleter> file_;
+ PBBAM_SHARED_PTR<bam_hdr_t> header_;
+ std::string filename_;
+};
+
+void BamWriterPrivate::Open(const string& filename,
+ const PBBAM_SHARED_PTR<bam_hdr_t> rawHeader,
+ const BamWriter::CompressionLevel compressionLevel,
+ size_t numThreads)
+{
+ // store filename
+ filename_ = filename;
+
+ // store header
+ header_ = rawHeader;
+ if (!header_)
+ throw std::runtime_error("null header");
+
+ // open file
+ const string& mode = string("wb") + to_string(static_cast<int>(compressionLevel));
+ file_.reset(sam_open(filename_.c_str(), mode.c_str()));
+ if (!file_)
+ throw std::runtime_error("could not open file for writing");
+
+ // if no explicit thread count given, attempt built-in check
+ if (numThreads == 0) {
+ numThreads = thread::hardware_concurrency();
+
+ // if still unknown, default to single-threaded
+ if (numThreads == 0)
+ numThreads = 1;
+ }
+
+ // if multithreading requested, enable it
+ if (numThreads > 1)
+ hts_set_threads(file_.get(), numThreads);
+
+ // write header
+ const int ret = sam_hdr_write(file_.get(), header_.get());
+ if (ret != 0)
+ throw std::runtime_error("could not write header");
+}
+
+void BamWriterPrivate::Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord)
+{
+ const int ret = sam_write1(file_.get(), header_.get(), rawRecord.get());
+ if (ret <= 0)
+ throw std::runtime_error("could not write record");
+}
+
+void BamWriterPrivate::Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord, int64_t* vOffset)
+{
+ BGZF* bgzf = file_.get()->fp.bgzf;
+ assert(bgzf);
+ assert(vOffset);
+
+ const off_t rawTell = htell(bgzf->fp);
+ const int length = bgzf->block_offset;
+
+ *vOffset = (rawTell << 16) | length ;
+ Write(rawRecord);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+BamWriter::BamWriter(const std::string& filename,
+ const BamHeader& header,
+ const BamWriter::CompressionLevel compressionLevel,
+ const size_t numThreads)
+ : d_(new internal::BamWriterPrivate)
+{
+ d_->Open(filename,
+ internal::BamHeaderMemory::MakeRawHeader(header),
+ compressionLevel,
+ numThreads);
+}
+
+BamWriter::~BamWriter(void)
+{
+ bgzf_flush(d_->file_.get()->fp.bgzf);
+}
+
+void BamWriter::TryFlush(void)
+{
+ // TODO: sanity checks on file_ & fp
+ const int ret = bgzf_flush(d_->file_.get()->fp.bgzf);
+ if (ret != 0)
+ throw std::runtime_error("could not flush output buffer contents");
+}
+
+void BamWriter::Write(const BamRecord& record)
+{ d_->Write(internal::BamRecordMemory::GetRawData(record)); }
+
+void BamWriter::Write(const BamRecord& record, int64_t* vOffset)
+{ d_->Write(internal::BamRecordMemory::GetRawData(record), vOffset); }
+
+void BamWriter::Write(const BamRecordImpl& recordImpl)
+{ d_->Write(internal::BamRecordMemory::GetRawData(recordImpl)); }
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..a7dfb2f
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,83 @@
+find_package(Threads)
+
+if(WIN32)
+ # Need winsock on windows
+ set(SOCKET_LIBRARIES "ws2_32")
+
+ # Limit the number of DLLs we will have to bundle
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
+endif()
+
+# define PacBioBAM library dependencies
+set(PacBioBAM_DependencyIncludes
+ ${Boost_INCLUDE_DIRS}
+ ${HTSLIB_INCLUDE_DIRS}
+ ${ZLIB_INCLUDE_DIRS}
+)
+set(PacBioBAM_DependencyLibraries
+ ${HTSLIB_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${CMAKE_THREAD_LIBS_INIT}
+ ${SOCKET_LIBRARIES}
+)
+
+# set up library include dirs
+include_directories(SYSTEM
+ ${PacBioBAM_DependencyIncludes}
+)
+
+include_directories(
+ ${PacBioBAM_IncludeDir}
+)
+
+# grab library source files
+include(files.cmake)
+set(SOURCES
+ ${PacBioBAM_H}
+ ${PacBioBAM_CPP}
+)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PacBioBAM_CXX_FLAGS}")
+
+# define actual library
+add_definitions(-DPBBAM_LIBRARY)
+if(PacBioBAM_wrap_r)
+ # SWIG R does not support PBBAM_SHARED_PTR, but it does support boost::shared_ptr
+ # So force boost if we're wrapping for R.
+ add_definitions(-DPBBAM_USE_BOOST_SHARED_PTR)
+endif()
+
+add_library(pbbam ${SOURCES})
+set_target_properties(pbbam PROPERTIES
+ ARCHIVE_OUTPUT_DIRECTORY ${PacBioBAM_LibDir}
+ RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_LibDir}
+ LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_LibDir}
+)
+
+# link dependency libs to pbbam
+target_link_libraries(pbbam ${PacBioBAM_DependencyLibraries})
+target_include_directories(pbbam
+ PUBLIC
+ ${PacBioBAM_IncludeDir}
+ ${PacBioBAM_DependencyIncludes}
+)
+
+# define symbols for projects that use PacBioBAM
+set(PacBioBAM_INCLUDE_DIRS
+ ${PacBioBAM_IncludeDir} ${PacBioBAM_DependencyIncludes}
+ CACHE INTERNAL
+ "${PROJECT_NAME}: Include Directories"
+ FORCE
+)
+
+set(PacBioBAM_LIBRARIES
+ ${PacBioBAM_LibDir}/libpbbam${PB_LIB_SUFFIX} ${PacBioBAM_DependencyLibraries}
+ CACHE INTERNAL
+ "${PROJECT_NAME}: Libraries"
+ FORCE
+)
+
+if(${wrapping_swig})
+ # add SWIG directory
+ add_subdirectory(swig)
+endif() # swig
diff --git a/src/Cigar.cpp b/src/Cigar.cpp
new file mode 100644
index 0000000..8c7efa7
--- /dev/null
+++ b/src/Cigar.cpp
@@ -0,0 +1,70 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/Cigar.h"
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+Cigar::Cigar(const string& cigarString)
+ : vector<CigarOperation>()
+{
+ size_t numberStart = 0;
+ const size_t numChars = cigarString.size();
+ for (size_t i = 0; i < numChars; ++i) {
+ const char c = cigarString.at(i);
+ if (!::isdigit(c)) {
+ const size_t distance = i - numberStart;
+ const uint32_t length = stoul(cigarString.substr(numberStart, distance));
+ push_back(CigarOperation(c, length));
+ numberStart = i+1;
+ }
+ }
+}
+
+string Cigar::ToStdString(void) const
+{
+ stringstream s;
+ const auto end = this->cend();
+ for (auto iter = this->cbegin(); iter != end; ++iter) {
+ const CigarOperation& cigar = (*iter);
+ s << cigar.Length()
+ << cigar.Char();
+ }
+ return s.str();
+}
diff --git a/src/CigarOperation.cpp b/src/CigarOperation.cpp
new file mode 100644
index 0000000..50dc4c2
--- /dev/null
+++ b/src/CigarOperation.cpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/CigarOperation.h"
+#include <htslib/sam.h>
+#include <array>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace internal {
+
+typedef array<CigarOperationType, 128> CigarLookup;
+
+static
+CigarLookup InitCigarLookup(void)
+{
+ CigarLookup cl;
+ cl.fill(CigarOperationType::UNKNOWN_OP);
+ cl['M'] = CigarOperationType::ALIGNMENT_MATCH;
+ cl['I'] = CigarOperationType::INSERTION;
+ cl['D'] = CigarOperationType::DELETION;
+ cl['N'] = CigarOperationType::REFERENCE_SKIP;
+ cl['S'] = CigarOperationType::SOFT_CLIP;
+ cl['H'] = CigarOperationType::HARD_CLIP;
+ cl['P'] = CigarOperationType::PADDING;
+ cl['='] = CigarOperationType::SEQUENCE_MATCH;
+ cl['X'] = CigarOperationType::SEQUENCE_MISMATCH;
+ return cl;
+}
+
+const static CigarLookup cigarLookup_ = InitCigarLookup();
+
+} // namespace internal
+
+CigarOperationType CigarOperation::CharToType(const char c)
+{ return (static_cast<uint8_t>(c) >= 128 ? CigarOperationType::UNKNOWN_OP
+ : internal::cigarLookup_[c] );
+}
+
+char CigarOperation::TypeToChar(const CigarOperationType type)
+{ return bam_cigar_opchr(static_cast<int>(type)); }
diff --git a/src/Config.cpp b/src/Config.cpp
new file mode 100644
index 0000000..677ad08
--- /dev/null
+++ b/src/Config.cpp
@@ -0,0 +1,48 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/Config.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+namespace PacBio {
+namespace BAM {
+
+int HtslibVerbosity = 0;
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/DataSet.cpp b/src/DataSet.cpp
new file mode 100644
index 0000000..ee43e9f
--- /dev/null
+++ b/src/DataSet.cpp
@@ -0,0 +1,173 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSet.h"
+#include "pbbam/DataSetTypes.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include "DataSetIO.h"
+#include "TimeUtils.h"
+#include <unordered_map>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+DataSet::DataSet(void)
+ : d_(new DataSetBase)
+{
+ CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+}
+
+DataSet::DataSet(const DataSet::TypeEnum type)
+ : d_(nullptr)
+{
+ switch(type) {
+ case DataSet::GENERIC : d_.reset(new DataSetBase); break;
+ case DataSet::ALIGNMENT : d_.reset(new AlignmentSet); break;
+ case DataSet::BARCODE : d_.reset(new BarcodeSet); break;
+ case DataSet::CONSENSUS_ALIGNMENT : d_.reset(new ConsensusAlignmentSet); break;
+ case DataSet::CONSENSUS_READ : d_.reset(new ConsensusReadSet); break;
+ case DataSet::CONTIG : d_.reset(new ContigSet); break;
+ case DataSet::HDF_SUBREAD : d_.reset(new HdfSubreadSet); break;
+ case DataSet::REFERENCE : d_.reset(new ReferenceSet); break;
+ case DataSet::SUBREAD : d_.reset(new SubreadSet); break;
+ default:
+ throw std::runtime_error("unsupported dataset type"); // unknown type
+ }
+
+ CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+}
+
+DataSet::DataSet(const BamFile& bamFile)
+ : d_(internal::DataSetIO::FromUri(bamFile.Filename()))
+{
+ CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+}
+
+DataSet::DataSet(const string& filename)
+ : d_(internal::DataSetIO::FromUri(filename))
+{ }
+
+DataSet::DataSet(const DataSet& other)
+{
+ DataSetBase* otherDataset = other.d_.get();
+ DataSetElement* copyDataset = new DataSetElement(*otherDataset);
+ d_.reset(static_cast<DataSetBase*>(copyDataset));
+}
+
+DataSet::DataSet(DataSet&& other)
+ : d_(std::move(other.d_))
+{
+ assert(other.d_.get() == nullptr);
+}
+
+DataSet& DataSet::operator=(const DataSet& other)
+{
+ DataSetBase* otherDataset = other.d_.get();
+ DataSetElement* copyDataset = new DataSetElement(*otherDataset);
+ d_.reset(static_cast<DataSetBase*>(copyDataset));
+ return *this;
+}
+
+DataSet& DataSet::operator=(DataSet&& other)
+{
+ d_ = std::move(other.d_);
+ return *this;
+}
+
+DataSet::~DataSet(void) { }
+
+DataSet& DataSet::operator+=(const DataSet& other)
+{
+ *d_.get() += *other.d_.get();
+ return *this;
+}
+
+DataSet DataSet::FromXml(const string& xml)
+{
+ DataSet result;
+ result.d_ = internal::DataSetIO::FromXmlString(xml);
+ if (result.CreatedAt().empty())
+ result.CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+ return result;
+}
+
+const NamespaceRegistry& DataSet::Namespaces(void) const
+{ return d_->Namespaces(); }
+
+NamespaceRegistry& DataSet::Namespaces(void)
+{ return d_->Namespaces(); }
+
+DataSet::TypeEnum DataSet::NameToType(const string& typeName)
+{
+ static std::unordered_map<std::string, DataSet::TypeEnum> lookup;
+ if (lookup.empty()) {
+ lookup["DataSet"] = DataSet::GENERIC;
+ lookup["AlignmentSet"] = DataSet::ALIGNMENT;
+ lookup["BarcodeSet"] = DataSet::BARCODE;
+ lookup["ConsensusAlignmentSet"] = DataSet::CONSENSUS_ALIGNMENT;
+ lookup["ConsensusReadSet"] = DataSet::CONSENSUS_READ;
+ lookup["ContigSet"] = DataSet::CONTIG;
+ lookup["HdfSubreadSet"] = DataSet::HDF_SUBREAD;
+ lookup["ReferenceSet"] = DataSet::REFERENCE;
+ lookup["SubreadSet"] = DataSet::SUBREAD;
+ }
+ return lookup.at(typeName); // throws if unknown typename
+}
+
+void DataSet::Save(const std::string& outputFilename)
+{ internal::DataSetIO::ToFile(d_, outputFilename); }
+
+void DataSet::SaveToStream(ostream& out)
+{ internal::DataSetIO::ToStream(d_, out); }
+
+string DataSet::TypeToName(const DataSet::TypeEnum& type)
+{
+ switch(type) {
+ case DataSet::GENERIC : return "DataSet";
+ case DataSet::ALIGNMENT : return "AlignmentSet";
+ case DataSet::BARCODE : return "BarcodeSet";
+ case DataSet::CONSENSUS_ALIGNMENT : return "ConsensusAlignmentSet";
+ case DataSet::CONSENSUS_READ : return "ConsensusReadSet";
+ case DataSet::CONTIG : return "ContigSet";
+ case DataSet::HDF_SUBREAD : return "HdfSubreadSet";
+ case DataSet::REFERENCE : return "ReferenceSet";
+ case DataSet::SUBREAD : return "SubreadSet";
+ default:
+ throw std::runtime_error("unsupported dataset type"); // unknown type
+ }
+}
diff --git a/src/DataSetBaseTypes.cpp b/src/DataSetBaseTypes.cpp
new file mode 100644
index 0000000..cc133e3
--- /dev/null
+++ b/src/DataSetBaseTypes.cpp
@@ -0,0 +1,94 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetTypes.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include "DataSetUtils.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// ----------------
+// BaseEntityType
+// ----------------
+
+BaseEntityType::BaseEntityType(const std::string& label, const XsdType& xsd)
+ : DataSetElement(label, xsd)
+{ }
+
+DEFINE_ACCESSORS(BaseEntityType, Extensions, Extensions)
+
+BaseEntityType& BaseEntityType::Extensions(const PacBio::BAM::Extensions& extensions)
+{ Extensions() = extensions; return *this; }
+
+// ----------------
+// DataEntityType
+// ----------------
+
+DataEntityType::DataEntityType(const std::string& label, const XsdType& xsd)
+ : BaseEntityType(label, xsd)
+{ }
+
+// -----------------
+// IndexedDataType
+// -----------------
+
+IndexedDataType::IndexedDataType(const std::string& label, const XsdType &xsd)
+ : InputOutputDataType(label, xsd)
+{ }
+
+DEFINE_ACCESSORS(IndexedDataType, FileIndices, FileIndices)
+
+IndexedDataType& IndexedDataType::FileIndices(const PacBio::BAM::FileIndices& indices)
+{ FileIndices() = indices; return *this; }
+
+// ---------------------
+// InputOutputDataType
+// ---------------------
+
+InputOutputDataType::InputOutputDataType(const std::string& label, const XsdType &xsd)
+ : StrictEntityType(label, xsd)
+{ }
+
+// ----------------
+// StrictEntityType
+// ----------------
+
+StrictEntityType::StrictEntityType(const std::string& label, const XsdType& xsd)
+ : BaseEntityType(label, xsd)
+{ }
diff --git a/src/DataSetElement.cpp b/src/DataSetElement.cpp
new file mode 100644
index 0000000..26c0bb6
--- /dev/null
+++ b/src/DataSetElement.cpp
@@ -0,0 +1,47 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetElement.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+
+const std::string& DataSetElement::SharedNullString(void)
+{
+ static const std::string empty = std::string("");
+ return empty;
+}
diff --git a/src/DataSetIO.cpp b/src/DataSetIO.cpp
new file mode 100644
index 0000000..d618210
--- /dev/null
+++ b/src/DataSetIO.cpp
@@ -0,0 +1,157 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "DataSetIO.h"
+#include "FofnReader.h"
+#include "StringUtils.h"
+#include "XmlReader.h"
+#include "XmlWriter.h"
+#include <boost/algorithm/string.hpp>
+#include <exception>
+#include <fstream>
+#include <iostream>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+typedef std::shared_ptr<DataSetBase> DataSetPtr;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static
+unique_ptr<DataSetBase> FromXml(const string& xmlFn)
+{
+ ifstream in(xmlFn);
+ if (!in)
+ throw std::runtime_error("could not open XML file for reading");
+ return XmlReader::FromStream(in);
+}
+
+static
+unique_ptr<DataSetBase> FromBam(const string& bamFn)
+{
+ unique_ptr<DataSetBase> dataset(new SubreadSet);
+ ExternalResources& resources = dataset->ExternalResources();
+ resources.Add(ExternalResource(BamFile(bamFn)));
+ return dataset;
+}
+
+static
+unique_ptr<DataSetBase> FromFofn(const string& fofn)
+{
+ ifstream in(fofn);
+ if (!in)
+ throw std::runtime_error("could not open FOFN for reading");
+ const vector<string> filenames = std::move(FofnReader::Files(in));
+ return DataSetIO::FromUris(filenames);
+}
+
+static
+unique_ptr<DataSetBase> FromUri(const string& uri)
+{
+ // NOTE: this says URI, but we're not quite handling filenames as true URIs
+ // basically just treating as a regular filename for now
+
+ // handle on extension
+ if (boost::algorithm::iends_with(uri, ".xml"))
+ return FromXml(uri);
+ else if (boost::algorithm::iends_with(uri, ".bam"))
+ return FromBam(uri);
+ else if (boost::algorithm::iends_with(uri, ".fofn"))
+ return FromFofn(uri);
+
+ // unknown filename extension
+ throw std::runtime_error("unsupported input file extension");
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+std::unique_ptr<DataSetBase> DataSetIO::FromUri(const std::string& uri)
+{
+ return FromUris(vector<string>(1, uri));
+}
+
+std::unique_ptr<DataSetBase> DataSetIO::FromUris(const std::vector<std::string>& uris)
+{
+ if (uris.empty())
+ throw std::runtime_error("empty input URI list"); // or just return empty, generic DataSet?
+
+ // create dataset(s) from URI(s)
+ vector< unique_ptr<DataSetBase> > datasets;
+ datasets.reserve(uris.size());
+ for ( const auto& uri : uris )
+ datasets.push_back(internal::FromUri(uri));
+ assert(!datasets.empty());
+
+ // if only 1, just return
+ if (datasets.size() == 1)
+ return std::unique_ptr<DataSetBase>(datasets.front().release());
+
+ // else merge
+ else {
+ unique_ptr<DataSetBase>& result = datasets.front();
+ for (size_t i = 1; i < datasets.size(); ++i)
+ *result += *datasets.at(i);
+ return unique_ptr<DataSetBase>(result.release());
+ }
+}
+
+std::unique_ptr<DataSetBase> DataSetIO::FromXmlString(const string& xml)
+{
+ if (xml.empty())
+ throw std::runtime_error("empty XML string");
+ stringstream s(xml);
+ return XmlReader::FromStream(s);
+}
+
+void DataSetIO::ToFile(const std::unique_ptr<DataSetBase>& dataset,
+ const string& fn)
+{
+ ofstream out(fn);
+ if (!out)
+ throw std::runtime_error("could not open XML for writing");
+ XmlWriter::ToStream(dataset, out);
+}
+
+void DataSetIO::ToStream(const std::unique_ptr<DataSetBase>& dataset, ostream &out)
+{ XmlWriter::ToStream(dataset, out); }
diff --git a/src/DataSetIO.h b/src/DataSetIO.h
new file mode 100644
index 0000000..b03c23b
--- /dev/null
+++ b/src/DataSetIO.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETIO_H
+#define DATASETIO_H
+
+#include "pbbam/DataSet.h"
+#include <iosfwd>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class DataSetIO
+{
+public:
+
+ // input
+ static std::unique_ptr<DataSetBase> FromUri(const std::string& uri);
+ static std::unique_ptr<DataSetBase> FromUris(const std::vector<std::string>& uris);
+
+ static std::unique_ptr<DataSetBase> FromXmlString(const std::string& xml);
+
+// static DataSetBase FromUri(const std::string& uri);
+// static DataSetBase FromUris(const std::vector<std::string>& uris);
+
+// // output
+ static void ToFile(const std::unique_ptr<DataSetBase>& dataset, const std::string& fn);
+ static void ToStream(const std::unique_ptr<DataSetBase>& dataset, std::ostream& out);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // DATASETIO_H
diff --git a/src/DataSetTypes.cpp b/src/DataSetTypes.cpp
new file mode 100644
index 0000000..3144adc
--- /dev/null
+++ b/src/DataSetTypes.cpp
@@ -0,0 +1,440 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetTypes.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include "DataSetUtils.h"
+#include <set>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// -------------------
+// AlignmentSet
+// -------------------
+
+AlignmentSet::AlignmentSet(void)
+ : DataSetBase("AlignmentSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// BarcodeSet
+// -------------------
+
+BarcodeSet::BarcodeSet(void)
+ : DataSetBase("BarcodeSet", XsdType::DATASETS)
+{ }
+
+// -----------------------
+// ConsensusAlignmentSet
+// -----------------------
+
+ConsensusAlignmentSet::ConsensusAlignmentSet(void)
+ : DataSetBase("ConsensusAlignmentSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// ConsensusReadSet
+// -------------------
+
+ConsensusReadSet::ConsensusReadSet(void)
+ : DataSetBase("ConsensusReadSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// ContigSet
+// -------------------
+
+ContigSet::ContigSet(void)
+ : DataSetBase("ContigSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// DataSetBase
+// -------------------
+
+DataSetBase::DataSetBase(void)
+ : StrictEntityType("DataSet", XsdType::DATASETS)
+{ }
+
+DataSetBase::DataSetBase(const string& label, const XsdType& xsd)
+ : StrictEntityType(label, xsd)
+{ }
+
+DEFINE_ACCESSORS(DataSetBase, ExternalResources, ExternalResources)
+
+DataSetBase& DataSetBase::ExternalResources(const PacBio::BAM::ExternalResources& resources)
+{ ExternalResources() = resources; return *this; }
+
+DEFINE_ACCESSORS(DataSetBase, Filters, Filters)
+
+DataSetBase& DataSetBase::Filters(const PacBio::BAM::Filters& filters)
+{ Filters() = filters; return *this; }
+
+DEFINE_ACCESSORS(DataSetBase, DataSetMetadata, Metadata)
+
+DataSetBase& DataSetBase::Metadata(const PacBio::BAM::DataSetMetadata& metadata)
+{ Metadata() = metadata; return *this; }
+
+const PacBio::BAM::SubDataSets& DataSetBase::SubDataSets(void) const
+{
+ try {
+ return Child<PacBio::BAM::SubDataSets>("DataSets");
+ } catch (std::exception&) {
+ return internal::NullObject<PacBio::BAM::SubDataSets>();
+ }
+}
+
+PacBio::BAM::SubDataSets& DataSetBase::SubDataSets(void)
+{
+ if (!HasChild("DataSets"))
+ AddChild(internal::NullObject<PacBio::BAM::SubDataSets>());
+ return Child<PacBio::BAM::SubDataSets>("DataSets");
+}
+
+DataSetBase& DataSetBase::SubDataSets(const PacBio::BAM::SubDataSets &subdatasets)
+{ SubDataSets() = subdatasets; return *this; }
+
+DataSetBase* DataSetBase::DeepCopy(void) const
+{
+ DataSetElement* copyDataset = new DataSetElement(*this);
+ DataSetBase* result = static_cast<DataSetBase*>(copyDataset);
+ result->registry_ = registry_;
+ return result;
+}
+
+DataSetBase& DataSetBase::operator+=(const DataSetBase& other)
+{
+ // must be same dataset types (or 'other' must be generic)
+ if (other.QualifiedNameLabel() != QualifiedNameLabel() && other.LocalNameLabel() != "DataSet")
+ throw std::runtime_error("cannot merge incompatible dataset types");
+
+ // check filter match
+ // check object metadata
+ Metadata() += other.Metadata();
+ ExternalResources() += other.ExternalResources();
+ Filters() += other.Filters();
+ SubDataSets() += other;
+
+ return *this;
+}
+
+std::shared_ptr<DataSetBase> DataSetBase::Create(const string& typeName)
+{
+ if (typeName == string("DataSet")) return make_shared<DataSetBase>();
+ if (typeName == string("SubreadSet")) return make_shared<SubreadSet>();
+ if (typeName == string("AlignmentSet")) return make_shared<AlignmentSet>();
+ if (typeName == string("BarcodeSet")) return make_shared<BarcodeSet>();
+ if (typeName == string("ConsensusAlignmentSet")) return make_shared<ConsensusAlignmentSet>();
+ if (typeName == string("ConsensusReadSet")) return make_shared<ConsensusReadSet>();
+ if (typeName == string("ContigSet")) return make_shared<ContigSet>();
+ if (typeName == string("HdfSubreadSet")) return make_shared<HdfSubreadSet>();
+ if (typeName == string("ReferenceSet")) return make_shared<ReferenceSet>();
+
+ // unknown typename
+ throw std::runtime_error("unsupported dataset type");
+}
+
+// -------------------
+// DataSetMetadata
+// -------------------
+
+DataSetMetadata::DataSetMetadata(const std::string& numRecords,
+ const std::string& totalLength)
+ : DataSetElement("DataSetMetadata", XsdType::DATASETS)
+{
+ NumRecords(numRecords);
+ TotalLength(totalLength);
+}
+
+DEFINE_ACCESSORS(DataSetMetadata, Provenance, Provenance)
+
+DataSetMetadata& DataSetMetadata::Provenance(const PacBio::BAM::Provenance& provenance)
+{ Provenance() = provenance; return *this; }
+
+DataSetMetadata& DataSetMetadata::operator+=(const DataSetMetadata& other)
+{
+ NumRecords() = NumRecords() + other.NumRecords();
+ TotalLength() = TotalLength() + other.TotalLength();
+ // merge add'l
+ return *this;
+}
+
+// -------------------
+// ExtensionElement
+// -------------------
+
+ExtensionElement::ExtensionElement(void)
+ : DataSetElement("ExtensionElement", XsdType::BASE_DATA_MODEL)
+{ }
+
+// -------------------
+// Extensions
+// -------------------
+
+Extensions::Extensions(void)
+ : DataSetListElement<ExtensionElement>("Extensions", XsdType::BASE_DATA_MODEL)
+{ }
+
+ExternalResource::ExternalResource(void)
+ : IndexedDataType("ExternalResource", XsdType::BASE_DATA_MODEL)
+{ }
+
+// -------------------
+// ExternalResource
+// -------------------
+
+ExternalResource::ExternalResource(const BamFile &bamFile)
+ : IndexedDataType("ExternalResource", XsdType::BASE_DATA_MODEL)
+{
+ MetaType("SubreadFile.SubreadBamFile");
+ ResourceId(bamFile.Filename());
+}
+
+ExternalResource::ExternalResource(const string& metatype, const string& filename)
+ : IndexedDataType("ExternalResource", XsdType::BASE_DATA_MODEL)
+{
+ MetaType(metatype);
+ ResourceId(filename);
+}
+
+BamFile ExternalResource::ToBamFile(void) const
+{ return BamFile(ResourceId()); }
+
+// -------------------
+// ExternalResources
+// -------------------
+
+ExternalResources::ExternalResources(void)
+ : DataSetListElement<ExternalResource>("ExternalResources", XsdType::BASE_DATA_MODEL)
+{ }
+
+ExternalResources& ExternalResources::operator+=(const ExternalResources& other)
+{
+ // only keep unique resource ids
+
+ set<std::string> myResourceIds;
+ for (size_t i = 0; i < Size(); ++i) {
+ const ExternalResource& resource = this->operator[](i);
+ myResourceIds.insert(resource.ResourceId());
+ }
+
+ vector<size_t> newResourceIndices;
+ const size_t numOtherResourceIds = other.Size();
+ for (size_t i = 0; i < numOtherResourceIds; ++i) {
+ const string& resourceId = other[i].ResourceId();
+ auto found = myResourceIds.find(resourceId);
+ if (found == myResourceIds.cend())
+ newResourceIndices.push_back(i);
+ }
+
+ for (size_t index : newResourceIndices)
+ Add(other[index]);
+
+ return *this;
+}
+
+void ExternalResources::Add(const ExternalResource& ext)
+{ AddChild(ext); }
+
+vector<BamFile> ExternalResources::BamFiles(void) const
+{
+ vector<BamFile> result;
+ const int numResources = Size();
+ result.reserve(numResources);
+ for( const ExternalResource& ext : *this ) {
+ result.push_back(ext.ToBamFile());
+ }
+ return result;
+}
+
+void ExternalResources::Remove(const ExternalResource& ext)
+{ RemoveChild(ext); }
+
+// -------------------
+// FileIndex
+// -------------------
+
+FileIndex::FileIndex(void)
+ : InputOutputDataType("FileIndex", XsdType::BASE_DATA_MODEL)
+{ }
+
+// -------------------
+// FileIndices
+// -------------------
+
+FileIndices::FileIndices(void)
+ : DataSetListElement<FileIndex>("FileIndices", XsdType::BASE_DATA_MODEL)
+{ }
+
+void FileIndices::Add(const FileIndex& index)
+{ AddChild(index); }
+
+void FileIndices::Remove(const FileIndex& index)
+{ RemoveChild(index); }
+
+// -------------------
+// Filter
+// -------------------
+
+Filter::Filter(void)
+ : DataSetElement("Filter", XsdType::DATASETS)
+{ }
+
+DEFINE_ACCESSORS(Filter, Properties, Properties)
+
+Filter& Filter::Properties(const PacBio::BAM::Properties& properties)
+{ Properties() = properties; return *this; }
+
+// -------------------
+// Filters
+// -------------------
+
+Filters::Filters(void)
+ : DataSetListElement<Filter>("Filters", XsdType::DATASETS)
+{ }
+
+Filters& Filters::operator+=(const Filters& other)
+{
+ for (auto& newFilter : other)
+ AddChild(newFilter);
+ return *this;
+}
+
+void Filters::Add(const Filter& filter)
+{ AddChild(filter); }
+
+void Filters::Remove(const Filter& filter)
+{ RemoveChild(filter); }
+
+// -------------------
+// HdfSubreadSet
+// -------------------
+
+HdfSubreadSet::HdfSubreadSet(void)
+ : DataSetBase("HdfSubreadSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// ParentTool
+// -------------------
+
+ParentTool::ParentTool(void)
+ : BaseEntityType("ParentTool", XsdType::DATASETS)
+{ }
+
+// -------------------
+// Properties
+// -------------------
+
+Properties::Properties(void)
+ : DataSetListElement<Property>("Properties", XsdType::BASE_DATA_MODEL)
+{ }
+
+void Properties::Add(const Property &property)
+{ AddChild(property); }
+
+void Properties::Remove(const Property& property)
+{ RemoveChild(property); }
+
+// -------------------
+// Property
+// -------------------
+
+Property::Property(const std::string& name,
+ const std::string& value,
+ const std::string& op)
+ : DataSetElement("Property", XsdType::BASE_DATA_MODEL)
+{
+ Name(name);
+ Value(value);
+ Operator(op);
+}
+
+// -------------------
+// Provenance
+// -------------------
+
+Provenance::Provenance(void)
+ : DataSetElement("Provenance", XsdType::DATASETS)
+{ }
+
+DEFINE_ACCESSORS(Provenance, ParentTool, ParentTool)
+
+// -------------------
+// ReferenceSet
+// -------------------
+
+ReferenceSet::ReferenceSet(void)
+ : DataSetBase("ReferenceSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// SubDataSets
+// -------------------
+
+SubDataSets::SubDataSets(void)
+ : internal::DataSetListElement<DataSetBase>("DataSets", XsdType::DATASETS)
+{ }
+
+SubDataSets& SubDataSets::operator+=(const DataSetBase& other)
+{
+ AddChild(other);
+ return *this;
+}
+
+SubDataSets& SubDataSets::operator+=(const SubDataSets& other)
+{
+ for (auto& newSubDataset : other)
+ AddChild(newSubDataset);
+ return *this;
+}
+
+void SubDataSets::Add(const DataSetBase& subdataset)
+{ AddChild(subdataset); }
+
+void SubDataSets::Remove(const DataSetBase& subdataset)
+{ RemoveChild(subdataset); }
+
+// -------------------
+// SubreadSet
+// -------------------
+
+SubreadSet::SubreadSet(void)
+ : DataSetBase("SubreadSet", XsdType::DATASETS)
+{ }
diff --git a/src/DataSetUtils.h b/src/DataSetUtils.h
new file mode 100644
index 0000000..2fa1f8c
--- /dev/null
+++ b/src/DataSetUtils.h
@@ -0,0 +1,95 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef DATASETUTILS_H
+#define DATASETUTILS_H
+
+#include "pbbam/DataSetTypes.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+inline const T& NullObject(void)
+{
+ static const T empty;
+ return empty;
+}
+
+template<>
+inline const PacBio::BAM::DataSetMetadata& NullObject(void)
+{
+ static const PacBio::BAM::DataSetMetadata empty("", "");
+ return empty;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#ifndef FETCH_CHILD_CONST_REF
+#define FETCH_CHILD_CONST_REF(Class, Type, Method) \
+ \
+ const PacBio::BAM::Type& Class::Method(void) const \
+ { \
+ try { \
+ return Child<PacBio::BAM::Type>(#Type); \
+ } catch (std::exception&) { \
+ return internal::NullObject<PacBio::BAM::Type>(); \
+ } \
+ }
+#endif
+
+#ifndef FETCH_CHILD_REF
+#define FETCH_CHILD_REF(Class, Type, Method) \
+ \
+ PacBio::BAM::Type& Class::Method(void) \
+ { \
+ if (!HasChild(#Type)) \
+ AddChild(internal::NullObject<PacBio::BAM::Type>()); \
+ return Child<PacBio::BAM::Type>(#Type); \
+ }
+#endif
+
+#ifndef DEFINE_ACCESSORS
+#define DEFINE_ACCESSORS(Class, Type, Method) \
+ FETCH_CHILD_CONST_REF(Class, Type, Method) \
+ FETCH_CHILD_REF(Class, Type, Method)
+#endif
+
+#endif // DATASETUTILS_H
diff --git a/src/DataSetXsd.cpp b/src/DataSetXsd.cpp
new file mode 100644
index 0000000..0474691
--- /dev/null
+++ b/src/DataSetXsd.cpp
@@ -0,0 +1,132 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetXsd.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static map<XsdType, NamespaceInfo> DefaultRegistry(void)
+{
+ map<XsdType, NamespaceInfo> result;
+ result[XsdType::NONE] = NamespaceInfo();
+ result[XsdType::AUTOMATION_CONSTRAINTS] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioAutomationConstraints.xsd");
+ result[XsdType::BASE_DATA_MODEL] = NamespaceInfo("pbbase", "http://pacificbiosciences.com/PacBioBaseDataModel.xsd");
+ result[XsdType::COLLECTION_METADATA] = NamespaceInfo("pbmeta", "http://pacificbiosciences.com/PacBioCollectionMetadata.xsd");
+ result[XsdType::COMMON_MESSAGES] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioCommonMessages.xsd");
+ result[XsdType::DATA_MODEL] = NamespaceInfo("pbdm", "http://pacificbiosciences.com/PacBioDataModel.xsd");
+ result[XsdType::DATA_STORE] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioDataStore.xsd");
+ result[XsdType::DATASETS] = NamespaceInfo("pbds", "http://pacificbiosciences.com/PacBioDatasets.xsd");
+ result[XsdType::DECL_DATA] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioDeclData.xsd");
+ result[XsdType::PART_NUMBERS] = NamespaceInfo("pbpn", "http://pacificbiosciences.com/PacBioPartNumbers.xsd");
+ result[XsdType::PRIMARY_METRICS] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioPrimaryMetrics.xsd");
+ result[XsdType::REAGENT_KIT] = NamespaceInfo("pbrk", "http://pacificbiosciences.com/PacBioReagentKit.xsd");
+ result[XsdType::RIGHTS_AND_ROLES] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioRightsAndRoles.xsd");
+ result[XsdType::SAMPLE_INFO] = NamespaceInfo("pbsample", "http://pacificbiosciences.com/PacBioSampleInfo.xsd");
+ result[XsdType::SEEDING_DATA] = NamespaceInfo("", "http://pacificbiosciences.com/PacBioSeedingData.xsd");
+ return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+// ---------------
+// NamespaceInfo
+// ---------------
+
+NamespaceInfo::NamespaceInfo(void) { }
+
+NamespaceInfo::NamespaceInfo(const string& name,
+ const string& uri)
+ : name_(name)
+ , uri_(uri)
+{ }
+
+// -------------------
+// NamespaceRegistry
+// -------------------
+
+NamespaceRegistry::NamespaceRegistry(void)
+ : data_(std::move(internal::DefaultRegistry()))
+ , defaultXsdType_(XsdType::DATASETS)
+{ }
+
+NamespaceRegistry::NamespaceRegistry(const NamespaceRegistry &other)
+ : data_(other.data_)
+ , defaultXsdType_(other.defaultXsdType_)
+{ }
+
+NamespaceRegistry& NamespaceRegistry::operator=(const NamespaceRegistry& other)
+{
+ data_ = other.data_;
+ defaultXsdType_ = other.defaultXsdType_;
+ return *this;
+}
+
+NamespaceRegistry::~NamespaceRegistry(void) { }
+
+const NamespaceInfo& NamespaceRegistry::DefaultNamespace(void) const
+{ return Namespace(DefaultXsd()); }
+
+XsdType NamespaceRegistry::DefaultXsd(void) const
+{ return defaultXsdType_; }
+
+const NamespaceInfo& NamespaceRegistry::Namespace(const XsdType& xsd) const
+{ return data_.at(xsd); }
+
+XsdType NamespaceRegistry::XsdForUri(const std::string& uri) const
+{
+ map<XsdType, NamespaceInfo>::const_iterator iter = data_.cbegin();
+ map<XsdType, NamespaceInfo>::const_iterator end = data_.cend();
+ for ( ; iter != end; ++iter ) {
+ const NamespaceInfo& info = iter->second;
+ if (info.Uri() == uri)
+ return iter->first;
+ }
+ return XsdType::NONE;
+}
+
+void NamespaceRegistry::Register(const XsdType& xsd, const NamespaceInfo& namespaceInfo)
+{ data_[xsd] = namespaceInfo; }
+
+void NamespaceRegistry::SetDefaultXsd(const XsdType& xsd)
+{ defaultXsdType_ = xsd; }
diff --git a/src/EntireFileQuery.cpp b/src/EntireFileQuery.cpp
new file mode 100644
index 0000000..814dc51
--- /dev/null
+++ b/src/EntireFileQuery.cpp
@@ -0,0 +1,102 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/BamFile.h"
+
+#include "pbbam/internal/SequentialMergeStrategy.h"
+
+#include "MemoryUtils.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+class EntireFileIterator : public internal::IBamFileIterator
+{
+public:
+ EntireFileIterator(const BamFile& bamFile)
+ : internal::IBamFileIterator(bamFile)
+ {
+ htsFile_.reset(sam_open(bamFile.Filename().c_str(), "rb"));
+ if (!htsFile_)
+ throw std::runtime_error("could not open BAM file for reading");
+
+ htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+ if (!htsHeader_)
+ throw std::runtime_error("could not read BAM header");
+ }
+
+public:
+ bool GetNext(BamRecord& record) {
+
+// record = BamRecord(/*fileData_.Header()*/);
+ const int result = sam_read1(htsFile_.get(),
+ htsHeader_.get(),
+ internal::BamRecordMemory::GetRawData(record).get());
+ record.header_ = header_;
+
+ // success
+ if (result >= 0)
+ return true;
+
+ // normal EOF
+ else if (result == -1)
+ return false;
+
+ // error (truncated file, etc)
+ else
+ throw std::runtime_error("corrupted file, may be truncated");
+ }
+
+private:
+ unique_ptr<samFile, internal::HtslibFileDeleter> htsFile_;
+ unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+};
+
+EntireFileQuery::EntireFileQuery(const DataSet& dataset)
+ : internal::IQuery(dataset)
+{
+ // check files
+ // if SO all coordinate
+ // else if SO all queryname
+ // else SO unsorted/unknown
+ mergeStrategy_.reset(new internal::SequentialMergeStrategy(CreateIterators()));
+}
+
+EntireFileQuery::FileIterPtr EntireFileQuery::CreateIterator(const BamFile& bamFile)
+{ return FileIterPtr(new EntireFileIterator(bamFile)); }
+
diff --git a/src/FileUtils.h b/src/FileUtils.h
new file mode 100644
index 0000000..5cf7c72
--- /dev/null
+++ b/src/FileUtils.h
@@ -0,0 +1,132 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef FILEUTILS_H
+#define FILEUTILS_H
+
+#include <exception>
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <ctime>
+#include <sys/stat.h>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+struct FileUtils
+{
+public:
+ static bool Exists(const char* fn);
+ static bool Exists(const std::string& fn);
+
+ // throws if can't read
+ static time_t LastModified(const char* fn);
+ static time_t LastModified(const std::string& fn);
+
+ // throws if can't read
+ static off_t Size(const char* fn);
+ static off_t Size(const std::string& fn);
+};
+
+inline bool FileUtils::Exists(const char* fn)
+{ return Exists(std::string(fn)); }
+
+inline bool FileUtils::Exists(const std::string& fn)
+{
+ std::ifstream stream(fn);
+ return !stream.fail();
+}
+
+inline time_t FileUtils::LastModified(const char* fn)
+{
+ struct stat s;
+ if (stat(fn, &s) != 0)
+ throw std::runtime_error("could not get file timestamp");
+
+#ifdef __DARWIN_64_BIT_INO_T
+ return s.st_mtimespec.tv_sec; // 64-bit OSX has a modified stat struct
+#else
+ return s.st_mtime; // all others?
+#endif
+}
+
+inline time_t FileUtils::LastModified(const std::string& fn)
+{ return LastModified(fn.c_str()); }
+
+inline off_t FileUtils::Size(const char* fn)
+{
+ struct stat s;
+ if (stat(fn, &s) != 0)
+ throw std::runtime_error("could not determine file size");
+ return s.st_size;
+}
+
+inline off_t FileUtils::Size(const std::string& fn)
+{ return Size(fn.c_str()); }
+
+//inline std::string FilenameExtension(const std::string& fn)
+//{
+// const size_t lastDot = fn.find_last_of(".");
+// return (lastDot != std::string::npos ? fn.substr(lastDot+1) : std::string());
+//}
+
+////
+//// -- examples --
+////
+//// input: /path/to/file.ext result: file.ext
+//// input: /path/to/file.ext.zip result: file.ext.zip
+//// input: file.ext result: file.ext
+////
+//inline std::string FilenameFromPath(const std::string& fullPath)
+//{
+// struct MatchesPathSeparator {
+// bool operator()(char c) const { return c == '/'; }
+// };
+
+// const auto lastSeparator = std::find_if(fullPath.rbegin(),
+// fullPath.rend(),
+// MatchesPathSeparator()).base();
+// return std::string(lastSeparator,fullPath.end());
+//}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FILEUTILS_H
diff --git a/src/FilterEngine.cpp b/src/FilterEngine.cpp
new file mode 100644
index 0000000..1f47967
--- /dev/null
+++ b/src/FilterEngine.cpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/FilterEngine.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+
+FilterEngine::FilterEngine(void) { }
+
+bool FilterEngine::Accepts(const BamRecord& r) const
+{
+// foreach ( const FilterParameter& param, parameters_ ) {
+// if (!param.Accepts(r))
+// return false;
+// }
+// return true;
+ (void)r;
+ return true;
+}
+
+bool FilterEngine::Accepts(vector<BamRecord>& r) const
+{
+ size_t i = 0;
+ while (i < r.size()) {
+ if (!Accepts(r.at(i)))
+ r.erase(r.begin() + i);
+ else
+ ++i;
+ }
+ return !r.empty();
+}
diff --git a/src/FofnReader.cpp b/src/FofnReader.cpp
new file mode 100644
index 0000000..a0d9280
--- /dev/null
+++ b/src/FofnReader.cpp
@@ -0,0 +1,52 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "FofnReader.h"
+#include <iostream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+vector<string> FofnReader::Files(istream& in)
+{
+ vector<string> files;
+ string fn;
+ while (getline(in, fn))
+ files.push_back(fn);
+ return files;
+}
diff --git a/src/FofnReader.h b/src/FofnReader.h
new file mode 100644
index 0000000..ee09fc5
--- /dev/null
+++ b/src/FofnReader.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef FOFNREADER_H
+#define FOFNREADER_H
+
+#include "pbbam/DataSet.h"
+#include <iosfwd>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class FofnReader
+{
+public:
+ static std::vector<std::string> Files(std::istream& in);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FOFNREADER_H
diff --git a/src/Frames.cpp b/src/Frames.cpp
new file mode 100644
index 0000000..36e49d9
--- /dev/null
+++ b/src/Frames.cpp
@@ -0,0 +1,179 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/Frames.h"
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static vector<uint16_t> framepoints;
+static vector<uint8_t> frameToCode;
+static uint16_t maxFramepoint;
+
+static
+void InitIpdDownsampling(void)
+{
+ if (!framepoints.empty())
+ return;
+
+ // liftover from Dave's python code:
+ // .../bioinformatics/tools/kineticsTools/kineticsTools/_downsampling.py
+ //
+ // TODO: move this conversion functionality to pbbam
+
+ const int B = 2;
+ const int t = 6;
+ const double T = pow(B, t);
+
+ int next = 0;
+ double grain;
+ const int end = 256/T;
+ for (int i = 0; i < end; ++i) {
+ grain = pow(B, i);
+ vector<uint16_t> nextOnes;
+ for (double j = 0; j < T; ++j)
+ nextOnes.push_back(j*grain + next);
+ next = nextOnes.back() + grain;
+ framepoints.insert(framepoints.end(), nextOnes.cbegin(), nextOnes.cend());
+ }
+ assert(framepoints.size()-1 <= UINT8_MAX);
+
+ const uint16_t maxElement = (*max_element(framepoints.cbegin(), framepoints.cend()));
+ frameToCode.assign(maxElement+1, 0);
+
+ const int fpEnd = framepoints.size() - 1;
+ uint8_t i = 0;
+ uint16_t fl = 0;
+ uint16_t fu = 0;
+ for (; i < fpEnd; ++i) {
+ fl = framepoints[i];
+ fu = framepoints[i+1];
+ if (fu > fl+1) {
+ const int middle = (fl+fu)/2;
+ for (int f = fl; f < middle; ++f)
+ frameToCode[f] = i;
+ for (int f = middle; f < fu; ++f)
+ frameToCode[f] = i+1;
+ } else
+ frameToCode[fl] = i;
+ }
+
+ // this next line differs from the python implementation (there, it's "i+1")
+ // our C++ for loop has incremented our index counter one more time than the indexes from python enumerate(...)
+ frameToCode[fu] = i;
+ maxFramepoint = fu;
+}
+
+static inline
+uint16_t CodeToFrames(const uint8_t code)
+{
+ return framepoints[code];
+}
+
+static
+vector<uint16_t> CodeToFrames(const vector<uint8_t>& codedData)
+{
+ InitIpdDownsampling();
+
+ const size_t length = codedData.size();
+ vector<uint16_t> frames(length, 0);
+ for (size_t i = 0; i < length; ++i)
+ frames[i] = CodeToFrames(codedData[i]);
+ return frames;
+}
+
+static inline
+uint8_t FramesToCode(const uint16_t frame)
+{
+ return frameToCode[std::min(maxFramepoint, frame)];
+}
+
+static
+vector<uint8_t> FramesToCode(const vector<uint16_t>& frames)
+{
+ InitIpdDownsampling();
+
+ const size_t length = frames.size();
+ vector<uint8_t> result(length, 0);
+ for (size_t i = 0; i < length; ++i)
+ result[i] = FramesToCode(frames[i]);
+ return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+Frames::Frames(void)
+{ }
+
+Frames::Frames(const std::vector<uint16_t>& frames)
+ : data_(frames)
+{ }
+
+Frames::Frames(std::vector<uint16_t>&& frames)
+ : data_(std::move(frames))
+{ }
+
+Frames::Frames(const Frames& other)
+ : data_(other.data_)
+{ }
+
+Frames::Frames(Frames&& other)
+ : data_(std::move(other.data_))
+{ }
+
+Frames::~Frames(void) { }
+
+Frames& Frames::operator=(const Frames& other)
+{ data_ = other.data_; return *this; }
+
+Frames& Frames::operator=(Frames&& other)
+{ data_ = std::move(other.data_); return *this; }
+
+Frames Frames::Decode(const std::vector<uint8_t>& codedData)
+{ return Frames(std::move(internal::CodeToFrames(codedData))); }
+
+std::vector<uint8_t> Frames::Encode(const std::vector<uint16_t>& frames)
+{ return internal::FramesToCode(frames); }
diff --git a/src/GenomicInterval.cpp b/src/GenomicInterval.cpp
new file mode 100644
index 0000000..7cf0b73
--- /dev/null
+++ b/src/GenomicInterval.cpp
@@ -0,0 +1,131 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/GenomicInterval.h"
+#include "AssertUtils.h"
+#include "StringUtils.h"
+#include <cstdlib>
+#include <cstring>
+#include <ctype.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// returns sequence name & sets begin/end, from input regionString
+string parseRegionString(const string& reg,
+ PacBio::BAM::Position* begin,
+ PacBio::BAM::Position* end)
+{
+ const vector<string> parts = internal::Split(reg, ':');
+ if (parts.empty() || parts.size() > 2)
+ throw std::runtime_error("malformed region string");
+
+ // given name only, default min,max intervals
+ if (parts.size() == 1) {
+ *begin = 0;
+ *end = 1<<29;
+ }
+
+ // parse interval from input
+ else if (parts.size() == 2) {
+ const vector<string> intervalParts = internal::Split(parts.at(1), '-');
+ if (intervalParts.empty() || intervalParts.size() >2 )
+ throw std::runtime_error("malformed region string");
+ *begin = std::stoi(intervalParts.at(0));
+ *end = std::stoi(intervalParts.at(1));
+ }
+
+ return parts.at(0);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+GenomicInterval::GenomicInterval(void) { }
+
+GenomicInterval::GenomicInterval(const std::string& name,
+ const Position& start,
+ const Position& stop)
+ : name_(name)
+ , interval_(start, stop)
+{ }
+
+GenomicInterval::GenomicInterval(const string& samtoolsRegionString)
+{
+ Position begin;
+ Position end;
+ name_ = internal::parseRegionString(samtoolsRegionString, &begin, &end);
+ interval_ = PacBio::BAM::Interval<Position>(begin, end);
+}
+
+GenomicInterval::GenomicInterval(const GenomicInterval& other)
+ : name_(other.name_)
+ , interval_(other.interval_)
+{ }
+
+GenomicInterval& GenomicInterval::operator=(const GenomicInterval& other)
+{
+ name_ = other.name_;
+ interval_ = other.interval_;
+ return *this;
+}
+
+bool GenomicInterval::CoveredBy(const GenomicInterval& other) const
+{
+ if (name_ != other.name_)
+ return false;
+ return interval_.CoveredBy(other.interval_);
+}
+
+bool GenomicInterval::Covers(const GenomicInterval& other) const
+{
+ if (name_ != other.name_)
+ return false;
+ return interval_.Covers(other.interval_);
+}
+
+bool GenomicInterval::Intersects(const GenomicInterval& other) const
+{
+ if (name_ != other.name_)
+ return false;
+ return interval_.Intersects(other.interval_);
+}
diff --git a/src/GenomicIntervalQuery.cpp b/src/GenomicIntervalQuery.cpp
new file mode 100644
index 0000000..087c626
--- /dev/null
+++ b/src/GenomicIntervalQuery.cpp
@@ -0,0 +1,140 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/GenomicIntervalQuery.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/internal/BamRecordSort.h"
+#include "pbbam/internal/MergeStrategy.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+class GenomicIntervalIterator : public internal::IBamFileIterator
+{
+public:
+ GenomicIntervalIterator(const GenomicInterval& interval,
+ const BamFile& bamFile)
+ : internal::IBamFileIterator(bamFile)
+ , interval_(interval)
+ {
+ // open file
+ htsFile_.reset(sam_open(bamFile.Filename().c_str(), "rb"));
+ if (!htsFile_)
+ throw std::runtime_error("could not open BAM file for reading");
+
+ // load header info
+ htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+ if (!htsHeader_)
+ throw std::runtime_error("could not read BAM header data");
+
+ // open index
+ htsIndex_.reset(bam_index_load(bamFile.Filename().c_str()));
+ if (!htsIndex_)
+ throw std::runtime_error("could not load BAI index data");
+
+ // initialize iterator
+ if (bamFile.Header().HasSequence(interval_.Name())) {
+ const int id = bamFile.ReferenceId(interval_.Name());
+ if (id >= 0 && id < htsHeader_->n_targets) {
+ htsIterator_.reset(sam_itr_queryi(htsIndex_.get(),
+ id,
+ interval.Start(),
+ interval.Stop()));
+ }
+ }
+ if (!htsIterator_)
+ throw std::runtime_error("could not create iterator for requested region");
+ }
+
+public:
+ bool GetNext(BamRecord& record) {
+
+ assert(htsFile_);
+ assert(htsIterator_);
+ const int result = sam_itr_next(htsFile_.get(),
+ htsIterator_.get(),
+ internal::BamRecordMemory::GetRawData(record).get());
+ record.header_ = header_;
+
+ // success
+ if (result >= 0)
+ return true;
+
+ // normal EOF
+ else if (result == -1)
+ return false;
+
+ // error (truncated file, etc)
+ else
+ throw std::runtime_error("corrupted file, may be truncated");
+ }
+
+private:
+ GenomicInterval interval_;
+ unique_ptr<samFile, internal::HtslibFileDeleter> htsFile_;
+ unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+ unique_ptr<hts_idx_t, internal::HtslibIndexDeleter> htsIndex_;
+ unique_ptr<hts_itr_t, internal::HtslibIteratorDeleter> htsIterator_;
+};
+
+GenomicIntervalQuery::GenomicIntervalQuery(const GenomicInterval& interval,
+ const DataSet& dataset)
+ : internal::IQuery(dataset)
+ , interval_(interval)
+{
+ Interval(interval_);
+}
+
+GenomicIntervalQuery::FileIterPtr GenomicIntervalQuery::CreateIterator(const BamFile& bamFile)
+{ return FileIterPtr(new GenomicIntervalIterator(interval_, bamFile)); }
+
+GenomicIntervalQuery& GenomicIntervalQuery::Interval(const GenomicInterval& interval)
+{
+ interval_ = interval;
+ // check files
+ // if SO all coordinate
+ // else if SO all queryname
+ // else SO unsorted/unknown
+ mergeStrategy_.reset(new internal::MergeStrategy<internal::ByPosition>(CreateIterators()));
+ return *this;
+}
+
+GenomicInterval GenomicIntervalQuery::Interval(void) const
+{ return interval_; }
diff --git a/src/GroupQuery.cpp b/src/GroupQuery.cpp
new file mode 100644
index 0000000..4b72b4f
--- /dev/null
+++ b/src/GroupQuery.cpp
@@ -0,0 +1,91 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Yuan Li
+
+#include "pbbam/GroupQuery.h"
+#include "MemoryUtils.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+SequentialGroupQueryBase::SequentialGroupQueryBase(const BamFile & file)
+ : GroupQueryBase(file)
+ , htsFile_(nullptr)
+ , htsHeader_(nullptr)
+ , nextRecord_()
+{
+ htsFile_.reset(sam_open(file.Filename().c_str(), "rb"), internal::HtslibFileDeleter());
+ if (!htsFile_)
+ throw std::runtime_error("could not open BAM file for reading");
+
+ htsHeader_.reset(sam_hdr_read(htsFile_.get()), internal::HtslibHeaderDeleter());
+ if (!htsHeader_)
+ throw std::runtime_error("could not read BAM header data");
+}
+
+bool SequentialGroupQueryBase::GetNext(vector<BamRecord> & records)
+{
+ records.clear();
+
+ if (nextRecord_.Impl().Name() != "") {
+ records.push_back(nextRecord_);
+ nextRecord_ = BamRecord();
+ }
+
+ while(true) {
+ BamRecord record(file_.Header());
+ const int result = sam_read1(htsFile_.get(),
+ htsHeader_.get(),
+ internal::BamRecordMemory::GetRawData(record).get());
+ if (result >= 0) { // get next record
+ if (records.size() == 0) {
+ records.push_back(record); // add the first record
+ } else {
+ if (InSameGroup(record, records[0])) {
+ records.push_back(record); // add remaining record
+ } else {
+ nextRecord_ = record; // store record from another zmw
+ return true;
+ }
+ }
+ } else { // unable to get next record
+ if (records.size() > 0) return true; // Has records to return
+ else return false; // Has no records to return
+ }
+ }
+ assert(false); // Should not reach here.
+ return false;
+}
diff --git a/src/IndexedFastaReader.cpp b/src/IndexedFastaReader.cpp
new file mode 100644
index 0000000..fffe44b
--- /dev/null
+++ b/src/IndexedFastaReader.cpp
@@ -0,0 +1,219 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: David Alexander
+
+#include "htslib/faidx.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/GenomicInterval.h"
+#include "pbbam/IndexedFastaReader.h"
+#include "pbbam/Orientation.h"
+#include "SequenceUtils.h"
+
+#include <cstdlib>
+#include <iostream>
+
+namespace PacBio {
+namespace BAM {
+
+
+IndexedFastaReader::IndexedFastaReader(const std::string& filename)
+{
+ Open(filename);
+}
+
+IndexedFastaReader::~IndexedFastaReader()
+{
+ Close();
+}
+
+bool IndexedFastaReader::Open(const std::string &filename)
+{
+ faidx_t* handle = fai_load(filename.c_str());
+ if (handle == nullptr)
+ return false;
+ else
+ {
+ filename_ = filename;
+ handle_ = handle;
+ return true;
+ }
+}
+
+void IndexedFastaReader::Close()
+{
+ filename_ = "";
+ if (handle_ != nullptr)
+ fai_destroy(handle_);
+ handle_ = nullptr;
+}
+
+#define REQUIRE_FAIDX_LOADED if (handle_ == nullptr) throw std::exception()
+
+std::string IndexedFastaReader::Subsequence(const std::string& id,
+ Position begin,
+ Position end) const
+{
+ REQUIRE_FAIDX_LOADED;
+
+ int len;
+ // Derek: *Annoyingly* htslib seems to interpret "end" as inclusive in
+ // faidx_fetch_seq, whereas it considers it exclusive in the region spec in
+ // fai_fetch. Can you please verify?
+ char* rawSeq = faidx_fetch_seq(handle_, id.c_str(), begin, end - 1, &len);
+ if (rawSeq == nullptr)
+ throw std::runtime_error("could not fetch FASTA sequence");
+ else {
+ std::string seq(rawSeq);
+ free(rawSeq);
+ return seq;
+ }
+}
+
+std::string IndexedFastaReader::Subsequence(const GenomicInterval& interval) const
+{
+ REQUIRE_FAIDX_LOADED;
+ return Subsequence(interval.Name(), interval.Start(), interval.Stop());
+}
+
+std::string IndexedFastaReader::Subsequence(const char *htslibRegion) const
+{
+ REQUIRE_FAIDX_LOADED;
+
+ int len;
+ char* rawSeq = fai_fetch(handle_, htslibRegion, &len);
+ if (rawSeq == nullptr)
+ throw std::runtime_error("could not fetch FASTA sequence");
+ else {
+ std::string seq(rawSeq);
+ free(rawSeq);
+ return seq;
+ }
+}
+
+
+std::string
+IndexedFastaReader::ReferenceSubsequence(const BamRecord& bamRecord,
+ const Orientation orientation,
+ const bool gapped,
+ const bool exciseSoftClips) const
+{
+ REQUIRE_FAIDX_LOADED;
+
+ std::string subseq = Subsequence(bamRecord.ReferenceName(),
+ bamRecord.ReferenceStart(),
+ bamRecord.ReferenceEnd());
+ const auto reverse = orientation != Orientation::GENOMIC &&
+ bamRecord.Impl().IsReverseStrand();
+
+ if (bamRecord.Impl().IsMapped() && gapped)
+ {
+ size_t seqIndex = 0;
+ const Cigar& cigar = bamRecord.Impl().CigarData();
+ Cigar::const_iterator cigarIter = cigar.cbegin();
+ Cigar::const_iterator cigarEnd = cigar.cend();
+ for (; cigarIter != cigarEnd; ++cigarIter)
+ {
+ const CigarOperation& op = (*cigarIter);
+ const CigarOperationType& type = op.Type();
+
+ // do nothing for hard clips
+ if (type != CigarOperationType::HARD_CLIP)
+ {
+ const size_t opLength = op.Length();
+
+ // maybe remove soft clips
+ if (type == CigarOperationType::SOFT_CLIP)
+ {
+ if (!exciseSoftClips)
+ {
+ subseq.reserve(subseq.size() + opLength);
+ subseq.insert(seqIndex, opLength, '-');
+ seqIndex += opLength;
+ }
+ }
+
+ // for non-clipping operations
+ else {
+
+ // maybe add gaps/padding
+ if (type == CigarOperationType::INSERTION)
+ {
+ subseq.reserve(subseq.size() + opLength);
+ subseq.insert(seqIndex, opLength, '-');
+ }
+ else if (type == CigarOperationType::PADDING)
+ {
+ subseq.reserve(subseq.size() + opLength);
+ subseq.insert(seqIndex, opLength, '*');
+ }
+
+ // update index
+ seqIndex += opLength;
+ }
+ }
+ }
+ }
+
+ if (reverse)
+ internal::ReverseComplementCaseSens(subseq);
+
+ return subseq;
+}
+
+
+int IndexedFastaReader::NumSequences() const
+{
+ REQUIRE_FAIDX_LOADED;
+ return faidx_nseq(handle_);
+}
+
+bool IndexedFastaReader::HasSequence(const std::string& name) const
+{
+ REQUIRE_FAIDX_LOADED;
+ return (faidx_has_seq(handle_, name.c_str()) != 0);
+}
+
+int IndexedFastaReader::SequenceLength(const std::string& name) const
+{
+ REQUIRE_FAIDX_LOADED;
+ int len = faidx_seq_len(handle_, name.c_str());
+ if (len < 0)
+ throw std::runtime_error("could not determine FASTA sequence length");
+ else return len;
+}
+
+
+}} // PacBio::BAM
diff --git a/src/MemoryUtils.cpp b/src/MemoryUtils.cpp
new file mode 100644
index 0000000..e3ec6a2
--- /dev/null
+++ b/src/MemoryUtils.cpp
@@ -0,0 +1,82 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "MemoryUtils.h"
+#include <string>
+#include <cstdlib>
+#include <cstring>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// -----------------
+// BamHeaderMemory
+// -----------------
+
+BamHeader BamHeaderMemory::FromRawData(bam_hdr_t* hdr)
+{
+ // null input - error
+ if (hdr == nullptr)
+ throw std::runtime_error("invalid BAM header");
+
+ // empty text input - ok
+ if (hdr->text == nullptr || hdr->l_text == 0)
+ return BamHeader();
+
+ // parse normal SAM text input
+ return BamHeader(string(hdr->text, hdr->l_text));
+}
+
+PBBAM_SHARED_PTR<bam_hdr_t> BamHeaderMemory::MakeRawHeader(const BamHeader& header)
+{
+ const string& text = header.ToSam();
+ PBBAM_SHARED_PTR<bam_hdr_t> rawData(sam_hdr_parse(text.size(), text.c_str()), internal::HtslibHeaderDeleter());
+ rawData->ignore_sam_err = 0;
+ rawData->cigar_tab = NULL;
+ rawData->l_text = text.size();
+ rawData->text = (char*)calloc(rawData->l_text + 1, 1);
+ memcpy(rawData->text, text.c_str(), rawData->l_text);
+ return rawData;
+}
+
+//PBBAM_SHARED_PTR<bam_hdr_t> BamHeaderMemory::MakeRawHeader(const BamHeader& header)
+//{
+// if (!header)
+// return PBBAM_SHARED_PTR<bam_hdr_t>(nullptr);
+// return MakeRawHeader(*header.get());
+//}
diff --git a/src/MemoryUtils.h b/src/MemoryUtils.h
new file mode 100644
index 0000000..dc4be84
--- /dev/null
+++ b/src/MemoryUtils.h
@@ -0,0 +1,159 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef MEMORYUTILS_H
+#define MEMORYUTILS_H
+
+#include "pbbam/Config.h"
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamRecordImpl.h"
+#include <htslib/bgzf.h>
+#include <htslib/sam.h>
+#include <memory>
+
+namespace PacBio {
+namespace BAM {
+
+class BamHeader;
+
+namespace internal {
+
+// intended for use with PBBAM_SHARED_PTR<T>, std::unique_ptr<T>, etc
+
+struct HtslibBgzfDeleter
+{
+ void operator()(BGZF* bgzf)
+ {
+ if (bgzf)
+ bgzf_close(bgzf);
+ bgzf = nullptr;
+ }
+};
+
+struct HtslibFileDeleter
+{
+ void operator()(samFile* file)
+ {
+ if (file)
+ sam_close(file);
+ file = nullptr;
+ }
+};
+
+struct HtslibHeaderDeleter
+{
+ void operator()(bam_hdr_t* hdr)
+ {
+ if (hdr)
+ bam_hdr_destroy(hdr);
+ hdr = nullptr;
+ }
+};
+
+struct HtslibIndexDeleter
+{
+ void operator()(hts_idx_t* index)
+ {
+ if (index)
+ hts_idx_destroy(index);
+ index = nullptr;
+ }
+};
+
+struct HtslibIteratorDeleter
+{
+ void operator()(hts_itr_t* iter)
+ {
+ if (iter)
+ hts_itr_destroy(iter);
+ iter = nullptr;
+ }
+};
+
+struct HtslibRecordDeleter
+{
+ void operator()(bam1_t* b)
+ {
+ if (b)
+ bam_destroy1(b);
+ b = nullptr;
+ }
+};
+
+class BamHeaderMemory
+{
+public:
+ static BamHeader FromRawData(bam_hdr_t* header);
+ static PBBAM_SHARED_PTR<bam_hdr_t> MakeRawHeader(const BamHeader& header);
+// static PBBAM_SHARED_PTR<bam_hdr_t> MakeRawHeader(const BamHeader& header);
+};
+
+class BamRecordMemory
+{
+public:
+ static const BamRecordImpl& GetImpl(const BamRecord& r);
+ static const BamRecordImpl& GetImpl(const BamRecord* r);
+ static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecord& r);
+ static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecord* r);
+ static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecordImpl& impl);
+ static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecordImpl* impl);
+};
+
+inline const BamRecordImpl& BamRecordMemory::GetImpl(const BamRecord& r)
+{ return r.impl_; }
+
+inline const BamRecordImpl& BamRecordMemory::GetImpl(const BamRecord* r)
+{ return r->impl_; }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecord& r)
+{ return GetRawData(r.impl_); }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecord* r)
+{ return GetRawData(r->impl_); }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecordImpl& impl)
+{ return impl.d_; }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecordImpl* impl)
+{ return impl->d_; }
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // MEMORYUTILS_H
diff --git a/src/PbiBuilder.cpp b/src/PbiBuilder.cpp
new file mode 100644
index 0000000..65c87bd
--- /dev/null
+++ b/src/PbiBuilder.cpp
@@ -0,0 +1,255 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiBuilder.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/PbiRawData.h"
+#include "MemoryUtils.h"
+#include "PbiIndexIO.h"
+#include <htslib/bgzf.h>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// -------------------------------------------
+// PbiRawReferenceDataBuilder implementation
+// -------------------------------------------
+
+// helper for reference data
+class PbiRawReferenceDataBuilder
+{
+public:
+ PbiRawReferenceDataBuilder(const size_t numReferenceSequences);
+
+public:
+ bool AddRecord(const BamRecord& record,
+ const PbiReferenceEntry::Row rowNumber);
+ PbiRawReferenceData Result(void) const;
+
+private:
+ int32_t lastRefId_;
+ Position lastPos_;
+ map<uint32_t, PbiReferenceEntry> rawReferenceEntries_;
+};
+
+PbiRawReferenceDataBuilder::PbiRawReferenceDataBuilder(const size_t numReferenceSequences)
+ : lastRefId_(-1)
+ , lastPos_(-1)
+{
+// const BamHeader& header = bam.Header();
+// const size_t numReferences = header.Sequences().size();
+ for (size_t i = 0; i < numReferenceSequences; ++i)
+ rawReferenceEntries_[i] = PbiReferenceEntry(i);
+ rawReferenceEntries_[PbiReferenceEntry::UNMAPPED_ID] = PbiReferenceEntry();
+}
+
+bool PbiRawReferenceDataBuilder::AddRecord(const BamRecord& record,
+ const PbiReferenceEntry::Row rowNumber)
+{
+ // fetch ref ID & pos for record
+ const int32_t tId = record.ReferenceId();
+ const int32_t pos = record.ReferenceStart();
+
+ // sanity checks to protect against non-coordinate-sorted BAMs
+ if (lastRefId_ != tId || (lastRefId_ >= 0 && tId < 0)) {
+ if (tId >= 0) {
+
+ // if we've already seen unmapped reads, but our current tId is valid
+ //
+ // error: unmapped reads should all be at the end (can stop checking refs)
+ //
+ PbiReferenceEntry& unmappedEntry =
+ rawReferenceEntries_[PbiReferenceEntry::UNMAPPED_ID];
+ if (unmappedEntry.beginRow_ != PbiReferenceEntry::UNSET_ROW)
+ return false;
+
+ // if we've already seen data for this new tId
+ // (remember we're coming from another tId)
+ //
+ // error: refs are out of order (can stop checking refs)
+ //
+ PbiReferenceEntry& currentEntry =
+ rawReferenceEntries_[(uint32_t)tId];
+ if (currentEntry.beginRow_ != PbiReferenceEntry::UNSET_ROW)
+ return false;
+ }
+ lastRefId_ = tId;
+ }
+ else if (tId >= 0 && lastPos_ > pos)
+ return false; //error: positions out of order
+
+ // update row numbers
+ PbiReferenceEntry& entry = rawReferenceEntries_[(uint32_t)tId];
+ if (entry.beginRow_ == PbiReferenceEntry::UNSET_ROW)
+ entry.beginRow_ = rowNumber;
+ entry.endRow_ = rowNumber+1;
+
+ // update pos (for sorting check next go-round)
+ lastPos_ = pos;
+ return true;
+}
+
+PbiRawReferenceData PbiRawReferenceDataBuilder::Result(void) const {
+ // PbiReferenceEntries will be sorted thanks to std::map
+ // tId will be at end since we're sorting on the uint cast of -1
+ PbiRawReferenceData result;
+ result.entries_.reserve(rawReferenceEntries_.size());
+ auto refIter = rawReferenceEntries_.cbegin();
+ const auto refEnd = rawReferenceEntries_.cend();
+ for ( ; refIter != refEnd; ++refIter )
+ result.entries_.push_back(refIter->second);
+ return result;
+}
+
+// ----------------------------------
+// PbiBuilderPrivate implementation
+// ----------------------------------
+
+class PbiBuilderPrivate
+{
+public:
+ PbiBuilderPrivate(const string& filename, const size_t numReferenceSequences);
+ ~PbiBuilderPrivate(void);
+
+public:
+ void AddRecord(const BamRecord& record, const int64_t vOffset);
+
+public:
+ unique_ptr<BGZF, HtslibBgzfDeleter> bgzf_;
+ PbiRawData rawData_;
+ PbiReferenceEntry::Row currentRow_;
+ bool hasMappedData_;
+ bool hasBarcodeData_;
+ bool hasReferenceData_;
+ unique_ptr<PbiRawReferenceDataBuilder> refDataBuilder_;
+};
+
+PbiBuilderPrivate::PbiBuilderPrivate(const string& filename, const size_t numReferenceSequences)
+ : bgzf_(bgzf_open(filename.c_str(), "wb"))
+ , currentRow_(0)
+ , hasMappedData_(true)
+ , hasBarcodeData_(true)
+ , hasReferenceData_(true)
+ , refDataBuilder_(nullptr)
+{
+ if (bgzf_.get()== 0)
+ throw std::runtime_error("could not open PBI file for writing");
+
+ if (numReferenceSequences > 0)
+ refDataBuilder_.reset(new PbiRawReferenceDataBuilder(numReferenceSequences));
+ else
+ hasReferenceData_ = false;
+}
+
+PbiBuilderPrivate::~PbiBuilderPrivate(void)
+{
+ rawData_.NumReads(currentRow_);
+
+ // fetch reference data, if available
+ if (hasReferenceData_) {
+ assert(refDataBuilder_);
+ rawData_.ReferenceData() = std::move(refDataBuilder_->Result());
+ }
+
+ // determine flags
+ PbiFile::Sections sections = PbiFile::SUBREAD;
+ if (hasMappedData_) sections |= PbiFile::MAPPED;
+ if (hasBarcodeData_) sections |= PbiFile::BARCODE;
+ if (hasReferenceData_) sections |= PbiFile::REFERENCE;
+ rawData_.FileSections(sections);
+
+ // write index contents to file
+ BGZF* fp = bgzf_.get();
+ PbiIndexIO::WriteHeader(rawData_, fp);
+ const uint32_t numReads = rawData_.NumReads();
+ if (numReads > 0) {
+ PbiIndexIO::WriteSubreadData(rawData_.SubreadData(), numReads, fp);
+ if (rawData_.HasMappedData())
+ PbiIndexIO::WriteMappedData(rawData_.MappedData(), numReads, fp);
+ if (rawData_.HasReferenceData())
+ PbiIndexIO::WriteReferenceData(rawData_.ReferenceData(), fp);
+ if (rawData_.HasBarcodeData())
+ PbiIndexIO::WriteBarcodeData(rawData_.BarcodeData(), numReads, fp);
+ }
+}
+
+void PbiBuilderPrivate::AddRecord(const BamRecord& record, const int64_t vOffset)
+{
+ record.ResetCachedPositions();
+
+ rawData_.SubreadData().AddRecord(record, vOffset);
+
+ if (hasMappedData_)
+ hasMappedData_ &= rawData_.MappedData().AddRecord(record);
+
+ if (hasReferenceData_)
+ hasBarcodeData_ &= rawData_.BarcodeData().AddRecord(record);
+
+ if (hasReferenceData_)
+ hasReferenceData_ &= refDataBuilder_->AddRecord(record, currentRow_);
+
+ ++currentRow_;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+// ---------------------------
+// PbiBuilder implementation
+// ---------------------------
+
+PbiBuilder::PbiBuilder(const string& pbiFilename)
+ : d_(new internal::PbiBuilderPrivate(pbiFilename, 0))
+{ }
+
+PbiBuilder::PbiBuilder(const string& pbiFilename, const size_t numReferenceSequences)
+ : d_(new internal::PbiBuilderPrivate(pbiFilename, numReferenceSequences))
+{ }
+
+PbiBuilder::~PbiBuilder(void) { }
+
+void PbiBuilder::AddRecord(const BamRecord& record, const int64_t vOffset)
+{ d_->AddRecord(record, vOffset); }
+
+const PbiRawData& PbiBuilder::Index(void) const
+{ return d_->rawData_; }
diff --git a/src/PbiFile.cpp b/src/PbiFile.cpp
new file mode 100644
index 0000000..0318e42
--- /dev/null
+++ b/src/PbiFile.cpp
@@ -0,0 +1,87 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiFile.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/PbiBuilder.h"
+#include "MemoryUtils.h"
+#include <htslib/sam.h>
+#include <cassert>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::PbiFile;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace PbiFile {
+
+void CreateFrom(const BamFile& bamFile)
+{
+ // open input file for file handle & header
+ unique_ptr<samFile,internal::HtslibFileDeleter> htsFile(sam_open(bamFile.Filename().c_str(), "rb"));
+ if (!htsFile)
+ throw std::runtime_error("could not open BAM file for reading");
+
+ unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader(sam_hdr_read(htsFile.get()));
+ if (!htsHeader)
+ throw std::runtime_error("could not read BAM header data");
+
+ samFile* fp = htsFile.get();
+ bam_hdr_t* hdr = htsHeader.get();
+ assert(fp);
+ assert(hdr);
+
+ // setup our record object
+ BamRecord record;
+ bam1_t* b = internal::BamRecordMemory::GetRawData(record).get();
+ if (b == 0)
+ throw std::runtime_error("could not allocate BAM record");
+
+ // iterate through file, building index data
+ PbiBuilder builder(bamFile.PacBioIndexFilename(), bamFile.Header().Sequences().size());
+ int64_t offset = bgzf_tell(fp->fp.bgzf);
+ while (sam_read1(fp, hdr, b) >= 0) {
+ builder.AddRecord(record, offset);
+ offset = bgzf_tell(fp->fp.bgzf);
+ }
+}
+
+} // namespace PbiFile
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/PbiIndex.cpp b/src/PbiIndex.cpp
new file mode 100644
index 0000000..2225a6c
--- /dev/null
+++ b/src/PbiIndex.cpp
@@ -0,0 +1,311 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiIndex.h"
+#include "PbiIndexIO.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// ----------------------------------
+// IndexResultBlock implementation
+// ----------------------------------
+
+IndexResultBlock::IndexResultBlock(void)
+ : firstIndex_(0)
+ , numReads_(0)
+ , virtualOffset_(-1)
+{ }
+
+IndexResultBlock::IndexResultBlock(size_t idx, size_t numReads)
+ : firstIndex_(idx)
+ , numReads_(numReads)
+ , virtualOffset_(-1)
+{ }
+
+bool IndexResultBlock::operator==(const IndexResultBlock& other) const
+{
+ return firstIndex_ == other.firstIndex_ &&
+ numReads_ == other.numReads_ &&
+ virtualOffset_ == other.virtualOffset_;
+}
+
+bool IndexResultBlock::operator!=(const IndexResultBlock& other) const
+{ return !(*this == other); }
+
+// ----------------------------------
+// SubreadLookupData implementation
+// ----------------------------------
+
+SubreadLookupData::SubreadLookupData(void) { }
+
+SubreadLookupData::SubreadLookupData(const PbiRawSubreadData& rawData)
+ : rgId_(rawData.rgId_)
+ , qStart_(rawData.qStart_)
+ , qEnd_(rawData.qEnd_)
+ , holeNumber_(rawData.holeNumber_)
+ , readQual_(rawData.readQual_)
+ , fileOffset_(rawData.fileOffset_)
+{ }
+
+//SubreadLookupData::SubreadLookupData(PbiRawSubreadData&& rawData)
+// : rgId_(std::move(rawData.rgId_))
+// , qStart_(std::move(rawData.qStart_))
+// , qEnd_(std::move(rawData.qEnd_))
+// , holeNumber_(std::move(rawData.holeNumber_))
+// , readQual_(std::move(rawData.readQual_))
+// , fileOffset_(std::move(rawData.fileOffset_))
+//{ }
+
+// ----------------------------------
+// MappedLookupData implementation
+// ----------------------------------
+
+MappedLookupData::MappedLookupData(void) { }
+
+MappedLookupData::MappedLookupData(const PbiRawMappedData& rawData)
+ : tId_(rawData.tId_)
+ , tStart_(rawData.tStart_)
+ , tEnd_(rawData.tEnd_)
+ , aStart_(rawData.aStart_)
+ , aEnd_(rawData.aEnd_)
+ , nM_(rawData.nM_)
+ , nMM_(rawData.nMM_)
+ , mapQV_(rawData.mapQV_)
+{
+ const size_t numElements = rawData.revStrand_.size();
+ reverseStrand_.reserve(numElements/2);
+ forwardStrand_.reserve(numElements/2);
+
+ std::map<uint32_t, IndexList> insRawData;
+ std::map<uint32_t, IndexList> delRawData;
+ for (size_t i = 0; i < numElements; ++i) {
+
+ // nIns, nDel
+ const uint32_t aStart = rawData.aStart_.at(i);
+ const uint32_t aEnd = rawData.aEnd_.at(i);
+ const uint32_t tStart = rawData.tStart_.at(i);
+ const uint32_t tEnd = rawData.tEnd_.at(i);
+ const uint32_t nM = rawData.nM_.at(i);
+ const uint32_t nMM = rawData.nMM_.at(i);
+ const uint32_t numIns = (aEnd - aStart - nM - nMM);
+ const uint32_t numDel = (tEnd - tStart - nM - nMM);
+ insRawData[numIns].push_back(i);
+ delRawData[numDel].push_back(i);
+
+ // strand
+ if (rawData.revStrand_.at(i) == 0)
+ forwardStrand_.push_back(i);
+ else
+ reverseStrand_.push_back(i);
+ }
+
+ nIns_ = OrderedLookup<uint32_t>(std::move(insRawData));
+ nDel_ = OrderedLookup<uint32_t>(std::move(delRawData));
+}
+
+//MappedLookupData::MappedLookupData(PbiRawMappedData&& rawData)
+// : tId_(std::move(rawData.tId_))
+// , tStart_(std::move(rawData.tStart_))
+// , tEnd_(std::move(rawData.tEnd_))
+// , aStart_(std::move(rawData.aStart_))
+// , aEnd_(std::move(rawData.aEnd_))
+// , nM_(std::move(rawData.nM_))
+// , nMM_(std::move(rawData.nMM_))
+// , mapQV_(std::move(rawData.mapQV_))
+//{
+// const size_t numElements = rawData.revStrand_.size();
+// reverseStrand_.reserve(numElements/2);
+// forwardStrand_.reserve(numElements/2);
+// for (size_t i = 0; i < numElements; ++i) {
+// if (rawData.revStrand_.at(i) == 0)
+// forwardStrand_.push_back(i);
+// else
+// reverseStrand_.push_back(i);
+// }
+//}
+
+// ----------------------------------
+// BarcodeLookupData implementation
+// ----------------------------------
+
+BarcodeLookupData::BarcodeLookupData(void) { }
+
+BarcodeLookupData::BarcodeLookupData(const PbiRawBarcodeData& rawData)
+ : bcLeft_(rawData.bcLeft_)
+ , bcRight_(rawData.bcRight_)
+ , bcQual_(rawData.bcQual_)
+ , ctxtFlag_(rawData.ctxtFlag_)
+{ }
+
+//BarcodeLookupData::BarcodeLookupData(PbiRawBarcodeData&& rawData)
+// : bcLeft_(std::move(rawData.bcLeft_))
+// , bcRight_(std::move(rawData.bcRight_))
+// , bcQual_(std::move(rawData.bcQual_))
+// , ctxtFlag_(std::move(rawData.ctxtFlag_))
+//{ }
+
+// ----------------------------------
+// ReferenceLookupData implementation
+// ----------------------------------
+
+ReferenceLookupData::ReferenceLookupData(void) { }
+
+ReferenceLookupData::ReferenceLookupData(const PbiRawReferenceData& rawData)
+{
+ const size_t numEntries = rawData.entries_.size();
+ references_.reserve(numEntries);
+ for (size_t i = 0; i < numEntries; ++i) {
+ const PbiReferenceEntry& entry = rawData.entries_.at(i);
+ references_[entry.tId_] = IndexRange(entry.beginRow_, entry.endRow_);
+ }
+}
+
+//ReferenceLookupData::ReferenceLookupData(PbiRawReferenceData&& rawData)
+//{
+// const size_t numEntries = rawData.entries_.size();
+// references_.reserve(numEntries);
+// for (size_t i = 0; i < numEntries; ++i) {
+// const PbiReferenceEntry& entry = rawData.entries_.at(i);
+// references_[entry.tId_] = IndexRange(entry.beginRow_, entry.endRow_);
+// }
+//}
+
+// --------------------------------
+// PbiIndexPrivate implementation
+// --------------------------------
+
+PbiIndexPrivate::PbiIndexPrivate(void)
+ : version_(PbiFile::CurrentVersion)
+ , sections_(PbiFile::SUBREAD)
+ , numReads_(0)
+{ }
+
+PbiIndexPrivate::PbiIndexPrivate(const PbiRawData& rawIndex)
+ : version_(rawIndex.Version())
+ , sections_(rawIndex.FileSections())
+ , numReads_(rawIndex.NumReads())
+ , subreadData_(rawIndex.SubreadData())
+ , mappedData_(rawIndex.MappedData())
+ , referenceData_(rawIndex.ReferenceData())
+ , barcodeData_(rawIndex.BarcodeData())
+{ }
+
+PbiIndexPrivate::PbiIndexPrivate(PbiRawData&& rawIndex)
+ : version_(std::move(rawIndex.Version()))
+ , sections_(std::move(rawIndex.FileSections()))
+ , numReads_(std::move(rawIndex.NumReads()))
+ , subreadData_(std::move(rawIndex.SubreadData()))
+ , mappedData_(std::move(rawIndex.MappedData()))
+ , referenceData_(std::move(rawIndex.ReferenceData()))
+ , barcodeData_(std::move(rawIndex.BarcodeData()))
+{ }
+
+unique_ptr<PbiIndexPrivate> PbiIndexPrivate::DeepCopy(void) const
+{
+ std::unique_ptr<PbiIndexPrivate> copy(new PbiIndexPrivate);
+ copy->version_ = version_;
+ copy->sections_ = sections_;
+ copy->numReads_ = numReads_;
+ copy->subreadData_ = subreadData_;
+ copy->mappedData_ = mappedData_;
+ copy->referenceData_ = referenceData_;
+ copy->barcodeData_ = barcodeData_;
+ return copy;
+}
+
+// -------------------------
+// PbiIndex implementation
+// -------------------------
+
+PbiIndex::PbiIndex(void)
+ : d_(new PbiIndexPrivate)
+{ }
+
+PbiIndex::PbiIndex(const string& pbiFilename)
+ : d_(new PbiIndexPrivate(PbiRawData(pbiFilename)))
+{ }
+
+PbiIndex::PbiIndex(const PbiIndex& other)
+ : d_(std::move(other.d_->DeepCopy()))
+{
+ // move is ok, since it's a deep-copied, new object
+}
+
+PbiIndex::PbiIndex(PbiIndex&& other)
+ : d_(std::move(other.d_))
+{ }
+
+PbiIndex& PbiIndex::operator=(const PbiIndex& other)
+{
+ // move is ok, since it's a deep-copied, new object
+ d_ = std::move(other.d_->DeepCopy());
+ return *this;
+}
+
+PbiIndex& PbiIndex::operator=(PbiIndex&& other)
+{
+ d_ = std::move(other.d_);
+ return *this;
+}
+
+PbiIndex::~PbiIndex(void) { }
+
+PbiFile::Sections PbiIndex::FileSections(void) const
+{ return d_->sections_; }
+
+bool PbiIndex::HasBarcodeData(void) const
+{ return d_->HasSection(PbiFile::BARCODE); }
+
+bool PbiIndex::HasMappedData(void) const
+{ return d_->HasSection(PbiFile::MAPPED); }
+
+bool PbiIndex::HasReferenceData(void) const
+{ return d_->HasSection(PbiFile::REFERENCE); }
+
+bool PbiIndex::HasSection(const PbiFile::Section section) const
+{ return d_->HasSection(section); }
+
+uint32_t PbiIndex::NumReads(void) const
+{ return d_->numReads_; }
+
+PbiFile::VersionEnum PbiIndex::Version(void) const
+{ return d_->version_; }
+
+const vector<int64_t>& PbiIndex::VirtualFileOffsets(void) const
+{ return d_->subreadData_.fileOffset_; }
diff --git a/src/PbiIndexIO.cpp b/src/PbiIndexIO.cpp
new file mode 100644
index 0000000..9d0d4e7
--- /dev/null
+++ b/src/PbiIndexIO.cpp
@@ -0,0 +1,345 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#include "PbiIndexIO.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/PbiBuilder.h"
+#include "MemoryUtils.h"
+#include <boost/algorithm/string.hpp>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// ---------------------------
+// PbiIndexIO implementation
+// ---------------------------
+
+PbiRawData PbiIndexIO::Load(const std::string& pbiFilename)
+{
+ PbiRawData rawData;
+ Load(rawData, pbiFilename);
+ return rawData;
+}
+
+void PbiIndexIO::Load(PbiRawData& rawData,
+ const string &filename)
+{
+ // open file for reading
+ if (!boost::algorithm::iends_with(filename, ".pbi"))
+ throw std::runtime_error("unsupported file extension");
+ std::unique_ptr<BGZF, HtslibBgzfDeleter> bgzf(bgzf_open(filename.c_str(), "rb"));
+ BGZF* fp = bgzf.get();
+ if (fp == 0)
+ throw std::runtime_error("could not open PBI file for reading");
+
+ // load data
+ LoadHeader(rawData, fp);
+ const uint32_t numReads = rawData.NumReads();
+ if (numReads > 0) {
+ LoadSubreadData(rawData.SubreadData(), numReads, fp);
+ LoadMappedData(rawData.MappedData(), numReads, fp);
+ LoadReferenceData(rawData.ReferenceData(), fp);
+ LoadBarcodeData(rawData.BarcodeData(), numReads, fp);
+ }
+}
+
+void PbiIndexIO::LoadBarcodeData(PbiRawBarcodeData& barcodeData,
+ const uint32_t numReads,
+ BGZF* fp)
+{
+ assert(numReads > 0);
+
+ LoadBgzfVector(fp, barcodeData.bcLeft_, numReads);
+ LoadBgzfVector(fp, barcodeData.bcRight_, numReads);
+ LoadBgzfVector(fp, barcodeData.bcQual_, numReads);
+ LoadBgzfVector(fp, barcodeData.ctxtFlag_, numReads);
+
+ assert(barcodeData.bcLeft_.size() == numReads);
+ assert(barcodeData.bcRight_.size() == numReads);
+ assert(barcodeData.bcQual_.size() == numReads);
+ assert(barcodeData.ctxtFlag_.size() == numReads);
+}
+
+void PbiIndexIO::LoadHeader(PbiRawData& index,
+ BGZF* fp)
+{
+ size_t bytesRead = 0;
+
+ // 'magic' string
+ char magic[4];
+ bytesRead = bgzf_read(fp, magic, 4);
+ if (bytesRead != 4 || strncmp(magic, "PBI\1", 4))
+ throw std::runtime_error("expected PBI file, found unknown format instead");
+
+ // version, pbi_flags, & n_reads
+ uint32_t version;
+ uint16_t sections;
+ uint32_t numReads;
+ bgzf_read(fp, &version, sizeof(version));
+ bgzf_read(fp, §ions, sizeof(sections));
+ bgzf_read(fp, &numReads, sizeof(numReads));
+ if (fp->is_be) {
+ version = ed_swap_4(version);
+ sections = ed_swap_2(sections);
+ numReads = ed_swap_4(numReads);
+ }
+
+ index.Version(PbiFile::VersionEnum(version));
+ index.FileSections(PbiFile::Sections(sections));
+ index.NumReads(numReads);
+
+ // skip reserved section
+ size_t reservedLength = 18;
+ // adjust depending on version
+ char reserved[18];
+ bytesRead = bgzf_read(fp, &reserved, reservedLength);
+}
+
+void PbiIndexIO::LoadMappedData(PbiRawMappedData& mappedData,
+ const uint32_t numReads,
+ BGZF* fp)
+{
+ assert(numReads > 0);
+
+ LoadBgzfVector(fp, mappedData.tId_, numReads);
+ LoadBgzfVector(fp, mappedData.tStart_, numReads);
+ LoadBgzfVector(fp, mappedData.tEnd_, numReads);
+ LoadBgzfVector(fp, mappedData.aStart_, numReads);
+ LoadBgzfVector(fp, mappedData.aEnd_, numReads);
+ LoadBgzfVector(fp, mappedData.revStrand_, numReads);
+ LoadBgzfVector(fp, mappedData.nM_, numReads);
+ LoadBgzfVector(fp, mappedData.nMM_, numReads);
+ LoadBgzfVector(fp, mappedData.mapQV_, numReads);
+
+ assert(mappedData.tId_.size() == numReads);
+ assert(mappedData.tStart_.size() == numReads);
+ assert(mappedData.tEnd_.size() == numReads);
+ assert(mappedData.aStart_.size() == numReads);
+ assert(mappedData.aEnd_.size() == numReads);
+ assert(mappedData.revStrand_.size() == numReads);
+ assert(mappedData.nM_.size() == numReads);
+ assert(mappedData.nMM_.size() == numReads);
+ assert(mappedData.mapQV_.size() == numReads);
+}
+
+void PbiIndexIO::LoadReferenceData(PbiRawReferenceData& referenceData,
+ BGZF* fp)
+{
+ assert(sizeof(PbiReferenceEntry::ID) == 4);
+ assert(sizeof(PbiReferenceEntry::Row) == 4);
+
+ // num refs
+ uint32_t numRefs;
+ bgzf_read(fp, &numRefs, 4);
+ if (fp->is_be)
+ numRefs = ed_swap_4(numRefs);
+
+ // reference entries
+ referenceData.entries_.clear();
+ referenceData.entries_.resize(numRefs);
+ for (size_t i = 0; i < numRefs; ++i) {
+ PbiReferenceEntry& entry = referenceData.entries_[i];
+ bgzf_read(fp, &entry.tId_, 4);
+ bgzf_read(fp, &entry.beginRow_, 4);
+ bgzf_read(fp, &entry.endRow_, 4);
+ if (fp->is_be) {
+ entry.tId_ = ed_swap_4(entry.tId_);
+ entry.beginRow_ = ed_swap_4(entry.beginRow_);
+ entry.endRow_ = ed_swap_4(entry.endRow_);
+ }
+ }
+}
+
+void PbiIndexIO::LoadSubreadData(PbiRawSubreadData& subreadData,
+ const uint32_t numReads,
+ BGZF* fp)
+{
+ assert(numReads > 0);
+
+ LoadBgzfVector(fp, subreadData.rgId_, numReads);
+ LoadBgzfVector(fp, subreadData.qStart_, numReads);
+ LoadBgzfVector(fp, subreadData.qEnd_, numReads);
+ LoadBgzfVector(fp, subreadData.holeNumber_, numReads);
+ LoadBgzfVector(fp, subreadData.readQual_, numReads);
+ LoadBgzfVector(fp, subreadData.fileOffset_, numReads);
+
+ assert(subreadData.rgId_.size() == numReads);
+ assert(subreadData.qStart_.size() == numReads);
+ assert(subreadData.qEnd_.size() == numReads);
+ assert(subreadData.holeNumber_.size() == numReads);
+ assert(subreadData.readQual_.size() == numReads);
+ assert(subreadData.fileOffset_.size() == numReads);
+}
+
+void PbiIndexIO::Save(const PbiRawData& index,
+ const std::string& filename)
+{
+ std::unique_ptr<BGZF, HtslibBgzfDeleter> bgzf(bgzf_open(filename.c_str(), "wb"));
+ BGZF* fp = bgzf.get();
+ if (fp == 0)
+ throw std::runtime_error("could not open PBI file for writing");
+
+ WriteHeader(index, fp);
+ const uint32_t numReads = index.NumReads();
+ if (numReads > 0) {
+ WriteSubreadData(index.SubreadData(), numReads, fp);
+
+ if (index.HasMappedData())
+ WriteMappedData(index.MappedData(), numReads, fp);
+ if (index.HasReferenceData())
+ WriteReferenceData(index.ReferenceData(), fp);
+ if (index.HasBarcodeData())
+ WriteBarcodeData(index.BarcodeData(), numReads, fp);
+ }
+}
+
+void PbiIndexIO::WriteBarcodeData(const PbiRawBarcodeData& barcodeData,
+ const uint32_t numReads,
+ BGZF* fp)
+{
+ assert(numReads > 0);
+ assert(barcodeData.bcLeft_.size() == numReads);
+ assert(barcodeData.bcRight_.size() == numReads);
+ assert(barcodeData.bcQual_.size() == numReads);
+ assert(barcodeData.ctxtFlag_.size() == numReads);
+
+ WriteBgzfVector(fp, barcodeData.bcLeft_);
+ WriteBgzfVector(fp, barcodeData.bcRight_);
+ WriteBgzfVector(fp, barcodeData.bcQual_);
+ WriteBgzfVector(fp, barcodeData.ctxtFlag_);
+}
+
+void PbiIndexIO::WriteHeader(const PbiRawData& index,
+ BGZF* fp)
+{
+ // 'magic' string
+ char magic[4];
+ strncpy(magic, "PBI\1", 4);
+ bgzf_write(fp, magic, 4);
+
+ // version, pbi_flags, & n_reads
+ uint32_t version = static_cast<uint32_t>(index.Version());
+ uint16_t pbi_flags = static_cast<uint16_t>(index.FileSections());
+ uint32_t numReads = index.NumReads();
+ if (fp->is_be) {
+ version = ed_swap_4(version);
+ pbi_flags = ed_swap_2(pbi_flags);
+ numReads = ed_swap_4(numReads);
+ }
+ bgzf_write(fp, &version, 4);
+ bgzf_write(fp, &pbi_flags, 2);
+ bgzf_write(fp, &numReads, 4);
+
+ // reserved space
+ char reserved[18];
+ memset(reserved, 0, 18);
+ bgzf_write(fp, reserved, 18);
+}
+
+void PbiIndexIO::WriteMappedData(const PbiRawMappedData& mappedData,
+ const uint32_t numReads,
+ BGZF* fp)
+{
+ assert(mappedData.tId_.size() == numReads);
+ assert(mappedData.tStart_.size() == numReads);
+ assert(mappedData.tEnd_.size() == numReads);
+ assert(mappedData.aStart_.size() == numReads);
+ assert(mappedData.aEnd_.size() == numReads);
+ assert(mappedData.revStrand_.size() == numReads);
+ assert(mappedData.nM_.size() == numReads);
+ assert(mappedData.nMM_.size() == numReads);
+ assert(mappedData.mapQV_.size() == numReads);
+
+ WriteBgzfVector(fp, mappedData.tId_);
+ WriteBgzfVector(fp, mappedData.tStart_);
+ WriteBgzfVector(fp, mappedData.tEnd_);
+ WriteBgzfVector(fp, mappedData.aStart_);
+ WriteBgzfVector(fp, mappedData.aEnd_);
+ WriteBgzfVector(fp, mappedData.revStrand_);
+ WriteBgzfVector(fp, mappedData.nM_);
+ WriteBgzfVector(fp, mappedData.nMM_);
+ WriteBgzfVector(fp, mappedData.mapQV_);
+}
+
+void PbiIndexIO::WriteReferenceData(const PbiRawReferenceData& referenceData,
+ BGZF* fp)
+{
+ // num_refs
+ uint32_t numRefs = referenceData.entries_.size();
+ if (fp->is_be)
+ numRefs = ed_swap_4(numRefs);
+ bgzf_write(fp, &numRefs, 4);
+
+ // reference entries
+ numRefs = referenceData.entries_.size(); // need to reset after maybe endian-swapping
+ for (size_t i = 0; i < numRefs; ++i) {
+ const PbiReferenceEntry& entry = referenceData.entries_[i];
+ uint32_t tId = entry.tId_;
+ uint32_t beginRow = entry.beginRow_;
+ uint32_t endRow = entry.endRow_;
+ if (fp->is_be) {
+ tId = ed_swap_4(tId);
+ beginRow = ed_swap_4(beginRow);
+ endRow = ed_swap_4(endRow);
+ }
+ bgzf_write(fp, &tId, 4);
+ bgzf_write(fp, &beginRow, 4);
+ bgzf_write(fp, &endRow, 4);
+ }
+}
+
+void PbiIndexIO::WriteSubreadData(const PbiRawSubreadData& subreadData,
+ const uint32_t numReads,
+ BGZF* fp)
+{
+ assert(subreadData.rgId_.size() == numReads);
+ assert(subreadData.qStart_.size() == numReads);
+ assert(subreadData.qEnd_.size() == numReads);
+ assert(subreadData.holeNumber_.size() == numReads);
+ assert(subreadData.readQual_.size() == numReads);
+ assert(subreadData.fileOffset_.size() == numReads);
+
+ WriteBgzfVector(fp, subreadData.rgId_);
+ WriteBgzfVector(fp, subreadData.qStart_);
+ WriteBgzfVector(fp, subreadData.qEnd_);
+ WriteBgzfVector(fp, subreadData.holeNumber_);
+ WriteBgzfVector(fp, subreadData.readQual_);
+ WriteBgzfVector(fp, subreadData.fileOffset_);
+}
diff --git a/src/PbiIndexIO.h b/src/PbiIndexIO.h
new file mode 100644
index 0000000..9ec001d
--- /dev/null
+++ b/src/PbiIndexIO.h
@@ -0,0 +1,165 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#ifndef PBIINDEXIO_H
+#define PBIINDEXIO_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/PbiFile.h"
+#include "pbbam/PbiRawData.h"
+#include <htslib/bgzf.h>
+#include <htslib/sam.h>
+#include <memory>
+#include <string>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class PbiIndexIO
+{
+public:
+ // top-level entry points
+ static PbiRawData Load(const std::string& filename);
+ static void Load(PbiRawData& rawData,
+ const std::string& filename);
+ static void Save(const PbiRawData& rawData,
+ const std::string& filename);
+
+public:
+ // per-component load
+ static void LoadBarcodeData(PbiRawBarcodeData& barcodeData,
+ const uint32_t numReads,
+ BGZF* fp);
+ static void LoadHeader(PbiRawData& index,
+ BGZF* fp);
+ static void LoadMappedData(PbiRawMappedData& mappedData,
+ const uint32_t numReads,
+ BGZF* fp);
+ static void LoadReferenceData(PbiRawReferenceData& referenceData,
+ BGZF* fp);
+ static void LoadSubreadData(PbiRawSubreadData& subreadData,
+ const uint32_t numReads,
+ BGZF* fp);
+
+ // per-data-field load
+ template<typename T>
+ static void LoadBgzfVector(BGZF* fp,
+ std::vector<T>& data,
+ const uint32_t numReads);
+
+public:
+ // per-component write
+ static void WriteBarcodeData(const PbiRawBarcodeData& barcodeData,
+ const uint32_t numReads,
+ BGZF* fp);
+ static void WriteHeader(const PbiRawData& index,
+ BGZF* fp);
+ static void WriteMappedData(const PbiRawMappedData& mappedData,
+ const uint32_t numReads,
+ BGZF* fp);
+ static void WriteReferenceData(const PbiRawReferenceData& referenceData,
+ BGZF* fp);
+ static void WriteSubreadData(const PbiRawSubreadData& subreadData,
+ const uint32_t numReads,
+ BGZF* fp);
+
+ // per-data-field write
+ template<typename T>
+ static void WriteBgzfVector(BGZF* fp,
+ const std::vector<T>& data);
+
+private:
+ // helper functions
+ template<typename T>
+ static void SwapEndianness(std::vector<T>& data);
+};
+
+template<typename T>
+inline void PbiIndexIO::LoadBgzfVector(BGZF* fp,
+ std::vector<T>& data,
+ const uint32_t numReads)
+{
+ assert(fp);
+ data.resize(numReads);
+ bgzf_read(fp, &data[0], numReads*sizeof(T));
+ if (fp->is_be)
+ SwapEndianness(data);
+}
+
+template<typename T>
+inline void PbiIndexIO::SwapEndianness(std::vector<T>& data)
+{
+ const size_t elementSize = sizeof(T);
+ const size_t numReads = data.size();
+ switch (elementSize) {
+ case 1 : break; // no swapping necessary
+ case 2 :
+ for (size_t i = 0; i < numReads; ++i)
+ ed_swap_2p(&data[i]);
+ break;
+ case 4:
+ for (size_t i = 0; i < numReads; ++i)
+ ed_swap_4p(&data[i]);
+ break;
+ case 8:
+ for (size_t i = 0; i < numReads; ++i)
+ ed_swap_8p(&data[i]);
+ break;
+ default:
+ throw std::runtime_error("unsupported element size");
+ }
+}
+
+template<typename T>
+inline void PbiIndexIO::WriteBgzfVector(BGZF* fp,
+ const std::vector<T>& data)
+{
+ assert(fp);
+ std::vector<T> output = data;
+ if (fp->is_be)
+ SwapEndianness(output);
+ bgzf_write(fp, &output[0], data.size()*sizeof(T));
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIINDEXIO_H
diff --git a/src/PbiRawData.cpp b/src/PbiRawData.cpp
new file mode 100644
index 0000000..edcb6d0
--- /dev/null
+++ b/src/PbiRawData.cpp
@@ -0,0 +1,444 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiRawData.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "PbiIndexIO.h"
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+// ----------------------------------
+// PbiRawBarcodeData implementation
+// ----------------------------------
+
+PbiRawBarcodeData::PbiRawBarcodeData(void) { }
+
+PbiRawBarcodeData::PbiRawBarcodeData(uint32_t numReads)
+{
+ bcLeft_.reserve(numReads);
+ bcRight_.reserve(numReads);
+ bcQual_.reserve(numReads);
+ ctxtFlag_.reserve(numReads);
+}
+
+PbiRawBarcodeData::PbiRawBarcodeData(const PbiRawBarcodeData& other)
+ : bcLeft_(other.bcLeft_)
+ , bcRight_(other.bcRight_)
+ , bcQual_(other.bcQual_)
+ , ctxtFlag_(other.ctxtFlag_)
+{ }
+
+PbiRawBarcodeData::PbiRawBarcodeData(PbiRawBarcodeData&& other)
+ : bcLeft_(std::move(other.bcLeft_))
+ , bcRight_(std::move(other.bcRight_))
+ , bcQual_(std::move(other.bcQual_))
+ , ctxtFlag_(std::move(other.ctxtFlag_))
+{ }
+
+PbiRawBarcodeData& PbiRawBarcodeData::operator=(const PbiRawBarcodeData& other)
+{
+ bcLeft_ = other.bcLeft_;
+ bcRight_ = other.bcRight_;
+ bcQual_ = other.bcQual_;
+ ctxtFlag_ =other.ctxtFlag_;
+ return *this;
+}
+
+PbiRawBarcodeData& PbiRawBarcodeData::operator=(PbiRawBarcodeData&& other)
+{
+ bcLeft_ = std::move(other.bcLeft_);
+ bcRight_ = std::move(other.bcRight_);
+ bcQual_ = std::move(other.bcQual_);
+ ctxtFlag_ = std::move(other.ctxtFlag_);
+ return *this;
+}
+
+bool PbiRawBarcodeData::AddRecord(const BamRecord& b)
+{
+ const BamRecordImpl& impl = b.Impl();
+ const bool hasBcTag = impl.HasTag("bc");
+ const bool hasBqTag = impl.HasTag("bq");
+ const bool hasCxTag = impl.HasTag("cx");
+ const bool hasBarcodeInfo = hasBcTag && hasBqTag && hasCxTag;
+ if (!hasBarcodeInfo)
+ return false;
+
+ const vector<uint16_t> bcValue = impl.TagValue("bc").ToUInt16Array();
+ assert(bcValue.size() == 2);
+ bcLeft_.push_back(bcValue[0]);
+ bcRight_.push_back(bcValue[1]);
+
+ bcQual_.push_back(impl.TagValue("bq").ToUInt8());
+ ctxtFlag_.push_back(impl.TagValue("cx").ToUInt8());
+
+ return true;
+}
+
+// ----------------------------------
+// PbiRawMappedData implementation
+// ----------------------------------
+
+PbiRawMappedData::PbiRawMappedData(void) { }
+
+PbiRawMappedData::PbiRawMappedData(uint32_t numReads)
+{
+ tId_.reserve(numReads);
+ tStart_.reserve(numReads);
+ tEnd_.reserve(numReads);
+ aStart_.reserve(numReads);
+ aEnd_.reserve(numReads);
+ revStrand_.reserve(numReads);
+ nM_.reserve(numReads);
+ nMM_.reserve(numReads);
+ mapQV_.reserve(numReads);
+}
+
+PbiRawMappedData::PbiRawMappedData(const PbiRawMappedData& other)
+ : tId_(other.tId_)
+ , tStart_(other.tStart_)
+ , tEnd_(other.tEnd_)
+ , aStart_(other.aStart_)
+ , aEnd_(other.aEnd_)
+ , revStrand_(other.revStrand_)
+ , nM_(other.nM_)
+ , nMM_(other.nMM_)
+ , mapQV_(other.mapQV_)
+{ }
+
+PbiRawMappedData::PbiRawMappedData(PbiRawMappedData&& other)
+ : tId_(std::move(other.tId_))
+ , tStart_(std::move(other.tStart_))
+ , tEnd_(std::move(other.tEnd_))
+ , aStart_(std::move(other.aStart_))
+ , aEnd_(std::move(other.aEnd_))
+ , revStrand_(std::move(other.revStrand_))
+ , nM_(std::move(other.nM_))
+ , nMM_(std::move(other.nMM_))
+ , mapQV_(std::move(other.mapQV_))
+{ }
+
+PbiRawMappedData& PbiRawMappedData::operator=(const PbiRawMappedData& other)
+{
+ tId_ = other.tId_;
+ tStart_ = other.tStart_;
+ tEnd_ = other.tEnd_;
+ aStart_ = other.aStart_;
+ aEnd_ = other.aEnd_;
+ revStrand_ = other.revStrand_;
+ nM_ = other.nM_;
+ nMM_ = other.nMM_;
+ mapQV_ = other.mapQV_;
+ return *this;
+}
+
+PbiRawMappedData& PbiRawMappedData::operator=(PbiRawMappedData&& other)
+{
+ tId_ = std::move(other.tId_);
+ tStart_ = std::move(other.tStart_);
+ tEnd_ = std::move(other.tEnd_);
+ aStart_ = std::move(other.aStart_);
+ aEnd_ = std::move(other.aEnd_);
+ revStrand_ = std::move(other.revStrand_);
+ nM_ = std::move(other.nM_);
+ nMM_ = std::move(other.nMM_);
+ mapQV_ = std::move(other.mapQV_);
+ return *this;
+}
+
+bool PbiRawMappedData::AddRecord(const BamRecord& b)
+{
+ if (!b.IsMapped())
+ return false;
+
+ tId_.push_back(b.ReferenceId());
+ tStart_.push_back(b.ReferenceStart());
+ tEnd_.push_back(b.ReferenceEnd());
+ aStart_.push_back(b.AlignedStart());
+ aEnd_.push_back(b.AlignedEnd());
+ revStrand_.push_back( (b.AlignedStrand() == Strand::REVERSE ? 1 : 0) );
+ mapQV_.push_back(b.MapQuality());
+
+ uint32_t nM = 0;
+ uint32_t nMM = 0;
+ const Cigar& cigar = b.CigarData();
+ auto cigarIter = cigar.cbegin();
+ auto cigarEnd = cigar.cend();
+ for (; cigarIter != cigarEnd; ++cigarIter) {
+ const CigarOperation& op = (*cigarIter);
+ if (op.Type() == CigarOperationType::SEQUENCE_MATCH)
+ nM += op.Length();
+ else if (op.Type() == CigarOperationType::SEQUENCE_MISMATCH)
+ nMM += op.Length();
+ else if (op.Type() == CigarOperationType::ALIGNMENT_MATCH)
+ throw std::runtime_error("CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead.");
+ }
+ nM_.push_back(nM);
+ nMM_.push_back(nMM);
+
+ return true;
+}
+// ------------------------------------
+// PbiReferenceEntry implementation
+// ------------------------------------
+
+const PbiReferenceEntry::ID PbiReferenceEntry::UNMAPPED_ID = static_cast<PbiReferenceEntry::ID>(-1);
+const PbiReferenceEntry::Row PbiReferenceEntry::UNSET_ROW = static_cast<PbiReferenceEntry::Row>(-1);
+
+PbiReferenceEntry::PbiReferenceEntry(void)
+ : tId_(UNMAPPED_ID)
+ , beginRow_(UNSET_ROW)
+ , endRow_(UNSET_ROW)
+{ }
+
+PbiReferenceEntry::PbiReferenceEntry(ID id)
+ : tId_(id)
+ , beginRow_(UNSET_ROW)
+ , endRow_(UNSET_ROW)
+{ }
+
+PbiReferenceEntry::PbiReferenceEntry(const PbiReferenceEntry& other)
+ : tId_(other.tId_)
+ , beginRow_(other.beginRow_)
+ , endRow_(other.endRow_)
+{ }
+
+PbiReferenceEntry::PbiReferenceEntry(PbiReferenceEntry&& other)
+ : tId_(std::move(other.tId_))
+ , beginRow_(std::move(other.beginRow_))
+ , endRow_(std::move(other.endRow_))
+{ }
+
+PbiReferenceEntry& PbiReferenceEntry::operator=(const PbiReferenceEntry& other)
+{
+ tId_ = other.tId_;
+ beginRow_ = other.beginRow_;
+ endRow_ = other.endRow_;
+ return *this;
+}
+
+PbiReferenceEntry& PbiReferenceEntry::operator=(PbiReferenceEntry&& other)
+{
+ tId_ = std::move(other.tId_);
+ beginRow_ = std::move(other.beginRow_);
+ endRow_ = std::move(other.endRow_);
+ return *this;
+}
+
+// ------------------------------------
+// PbiRawReferenceData implementation
+// ------------------------------------
+
+PbiRawReferenceData::PbiRawReferenceData(void) { }
+
+PbiRawReferenceData::PbiRawReferenceData(uint32_t numRefs)
+{ entries_.reserve(numRefs); }
+
+PbiRawReferenceData::PbiRawReferenceData(const PbiRawReferenceData& other)
+ : entries_(other.entries_)
+{ }
+
+PbiRawReferenceData::PbiRawReferenceData(PbiRawReferenceData&& other)
+ : entries_(std::move(other.entries_))
+{ }
+
+PbiRawReferenceData& PbiRawReferenceData::operator=(const PbiRawReferenceData& other)
+{
+ entries_ = other.entries_;
+ return *this;
+}
+
+PbiRawReferenceData& PbiRawReferenceData::operator=(PbiRawReferenceData&& other)
+{
+ entries_ = std::move(other.entries_);
+ return *this;
+}
+
+// ----------------------------------
+// PbiRawSubreadData implementation
+// ----------------------------------
+
+PbiRawSubreadData::PbiRawSubreadData(void) { }
+
+PbiRawSubreadData::PbiRawSubreadData(uint32_t numReads)
+{
+ rgId_.reserve(numReads);
+ qStart_.reserve(numReads);
+ qEnd_.reserve(numReads);
+ holeNumber_.reserve(numReads);
+ readQual_.reserve(numReads);
+ fileOffset_.reserve(numReads);
+}
+
+PbiRawSubreadData::PbiRawSubreadData(const PbiRawSubreadData& other)
+ : rgId_(other.rgId_)
+ , qStart_(other.qStart_)
+ , qEnd_(other.qEnd_)
+ , holeNumber_(other.holeNumber_)
+ , readQual_(other.readQual_)
+ , fileOffset_(other.fileOffset_)
+{ }
+
+PbiRawSubreadData::PbiRawSubreadData(PbiRawSubreadData&& other)
+ : rgId_(std::move(other.rgId_))
+ , qStart_(std::move(other.qStart_))
+ , qEnd_(std::move(other.qEnd_))
+ , holeNumber_(std::move(other.holeNumber_))
+ , readQual_(std::move(other.readQual_))
+ , fileOffset_(std::move(other.fileOffset_))
+{ }
+
+PbiRawSubreadData& PbiRawSubreadData::operator=(const PbiRawSubreadData& other)
+{
+ rgId_ = other.rgId_;
+ qStart_ = other.qStart_;
+ qEnd_ = other.qEnd_;
+ holeNumber_ = other.holeNumber_;
+ readQual_ = other.readQual_;
+ fileOffset_ = other.fileOffset_;
+ return *this;
+}
+
+PbiRawSubreadData& PbiRawSubreadData::operator=(PbiRawSubreadData&& other)
+{
+ rgId_ = std::move(other.rgId_);
+ qStart_ = std::move(other.qStart_);
+ qEnd_ = std::move(other.qEnd_);
+ holeNumber_ = std::move(other.holeNumber_);
+ readQual_ = std::move(other.readQual_);
+ fileOffset_ = std::move(other.fileOffset_);
+ return *this;
+}
+
+void PbiRawSubreadData::AddRecord(const BamRecord& b, int64_t offset)
+{
+
+ string rgId = b.ReadGroupId();
+ if (rgId.empty()) {
+ // calculate
+ }
+ const uint32_t rawid = std::stoul(rgId, nullptr, 16);
+ const int32_t id = static_cast<int32_t>(rawid);
+
+ rgId_.push_back(id);
+
+ if (b.Type() == RecordType::CCS) {
+ qStart_.push_back(-1);
+ qEnd_.push_back(-1);
+ } else {
+ qStart_.push_back(b.QueryStart());
+ qEnd_.push_back(b.QueryEnd());
+ }
+
+ if (b.HasHoleNumber())
+ holeNumber_.push_back(b.HoleNumber());
+ else
+ holeNumber_.push_back(0); // TODO: what to do?
+
+ if (b.HasReadAccuracy())
+ readQual_.push_back(b.ReadAccuracy());
+ else
+ readQual_.push_back(0); // TODO: what to do?
+
+ fileOffset_.push_back(offset);
+}
+
+// ----------------------------------
+// PbiRawData implementation
+// ----------------------------------
+
+PbiRawData::PbiRawData(void)
+ : version_(PbiFile::CurrentVersion)
+ , sections_(PbiFile::ALL)
+ , numReads_(0)
+{ }
+
+PbiRawData::PbiRawData(const string& pbiFilename)
+ : version_(PbiFile::CurrentVersion)
+ , sections_(PbiFile::ALL)
+ , numReads_(0)
+{
+ internal::PbiIndexIO::Load(*this, pbiFilename);
+}
+
+PbiRawData::PbiRawData(const PbiRawData& other)
+ : version_(other.version_)
+ , sections_(other.sections_)
+ , numReads_(other.numReads_)
+ , barcodeData_(other.barcodeData_)
+ , mappedData_(other.mappedData_)
+ , referenceData_(other.referenceData_)
+ , subreadData_(other.subreadData_)
+{ }
+
+PbiRawData::PbiRawData(PbiRawData&& other)
+ : version_(std::move(other.version_))
+ , sections_(std::move(other.sections_))
+ , numReads_(std::move(other.numReads_))
+ , barcodeData_(std::move(other.barcodeData_))
+ , mappedData_(std::move(other.mappedData_))
+ , referenceData_(std::move(other.referenceData_))
+ , subreadData_(std::move(other.subreadData_))
+{ }
+
+PbiRawData& PbiRawData::operator=(const PbiRawData& other)
+{
+ version_ = other.version_;
+ sections_ = other.sections_;
+ numReads_ = other.numReads_;
+ barcodeData_ = other.barcodeData_;
+ mappedData_ = other.mappedData_;
+ referenceData_ = other.referenceData_;
+ subreadData_ = other.subreadData_;
+ return *this;
+}
+
+PbiRawData& PbiRawData::operator=(PbiRawData&& other)
+{
+ version_ = std::move(other.version_);
+ sections_ = std::move(other.sections_);
+ numReads_ = std::move(other.numReads_);
+ barcodeData_ = std::move(other.barcodeData_);
+ mappedData_ = std::move(other.mappedData_);
+ referenceData_ = std::move(other.referenceData_);
+ subreadData_ = std::move(other.subreadData_);
+ return *this;
+}
+
+PbiRawData::~PbiRawData(void) { }
diff --git a/src/ProgramInfo.cpp b/src/ProgramInfo.cpp
new file mode 100644
index 0000000..45c8680
--- /dev/null
+++ b/src/ProgramInfo.cpp
@@ -0,0 +1,161 @@
+
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/ProgramInfo.h"
+#include "SequenceUtils.h"
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static string token_ID = string("ID");
+static string token_CL = string("CL");
+static string token_DS = string("DS");
+static string token_PN = string("PN");
+static string token_PP = string("PP");
+static string token_VN = string("VN");
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+ProgramInfo::ProgramInfo(void) { }
+
+ProgramInfo::ProgramInfo(const std::string& id)
+ : id_(id)
+{ }
+
+ProgramInfo::ProgramInfo(const ProgramInfo& other)
+ : commandLine_(other.commandLine_)
+ , description_(other.description_)
+ , id_(other.id_)
+ , name_(other.name_)
+ , previousProgramId_(other.previousProgramId_)
+ , version_(other.version_)
+{ }
+
+ProgramInfo::ProgramInfo(ProgramInfo&& other)
+ : commandLine_(std::move(other.commandLine_))
+ , description_(std::move(other.description_))
+ , id_(std::move(other.id_))
+ , name_(std::move(other.name_))
+ , previousProgramId_(std::move(other.previousProgramId_))
+ , version_(std::move(other.version_))
+{ }
+
+ProgramInfo::~ProgramInfo(void) { }
+
+ProgramInfo& ProgramInfo::operator=(const ProgramInfo& other)
+{
+ commandLine_ = other.commandLine_;
+ description_ = other.description_;
+ id_ = other.id_;
+ name_ = other.name_;
+ previousProgramId_ = other.previousProgramId_;
+ version_ = other.version_;
+ return *this;
+}
+
+ProgramInfo& ProgramInfo::operator=(ProgramInfo&& other)
+{
+ commandLine_ = std::move(other.commandLine_);
+ description_ = std::move(other.description_);
+ id_ = std::move(other.id_);
+ name_ = std::move(other.name_);
+ previousProgramId_ = std::move(other.previousProgramId_);
+ version_ = std::move(other.version_);
+ return *this;
+}
+
+ProgramInfo ProgramInfo::FromSam(const string& sam)
+{
+ // pop off '@PG\t', then split rest of line into tokens
+ const vector<string>& tokens = internal::Split(sam.substr(4), '\t');
+ if (tokens.empty())
+ return ProgramInfo();
+
+ ProgramInfo prog;
+ map<string, string> custom;
+
+ // iterate over tokens
+ for (const string& token : tokens) {
+ const string& tokenTag = token.substr(0,2);
+ const string& tokenValue = token.substr(3);
+
+ // set program contents
+ if (tokenTag == internal::token_ID) prog.Id(tokenValue);
+ else if (tokenTag == internal::token_CL) prog.CommandLine(tokenValue);
+ else if (tokenTag == internal::token_DS) prog.Description(tokenValue);
+ else if (tokenTag == internal::token_PN) prog.Name(tokenValue);
+ else if (tokenTag == internal::token_PP) prog.PreviousProgramId(tokenValue);
+ else if (tokenTag == internal::token_VN) prog.Version(tokenValue);
+
+ // otherwise, "custom" tag
+ else
+ custom[tokenTag] = tokenValue;
+ }
+
+ prog.CustomTags(custom);
+ return prog;
+}
+
+string ProgramInfo::ToSam(void) const
+{
+ stringstream out;
+ out << "@PG"
+ << internal::MakeSamTag(internal::token_ID, id_);
+
+ if (!name_.empty()) out << internal::MakeSamTag(internal::token_PN, name_);
+ if (!version_.empty()) out << internal::MakeSamTag(internal::token_VN, version_);
+ if (!description_.empty()) out << internal::MakeSamTag(internal::token_DS, description_);
+ if (!previousProgramId_.empty()) out << internal::MakeSamTag(internal::token_PP, previousProgramId_);
+ if (!commandLine_.empty()) out << internal::MakeSamTag(internal::token_CL, commandLine_);
+
+ // append any custom tags
+ map<string, string>::const_iterator customIter = custom_.cbegin();
+ map<string, string>::const_iterator customEnd = custom_.cend();
+ for ( ; customIter != customEnd; ++customIter )
+ out << internal::MakeSamTag(customIter->first, customIter->second);
+
+ return out.str();
+}
+
diff --git a/src/QualityValue.cpp b/src/QualityValue.cpp
new file mode 100644
index 0000000..200b96b
--- /dev/null
+++ b/src/QualityValue.cpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/QualityValue.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const uint8_t QualityValue::MAX = 93;
diff --git a/src/QueryBase.cpp b/src/QueryBase.cpp
new file mode 100644
index 0000000..8bd2a53
--- /dev/null
+++ b/src/QueryBase.cpp
@@ -0,0 +1,48 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/QueryBase.h"
+#include "pbbam/BamRecord.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+QueryBase::QueryBase(const BamFile& file)
+ : file_(file)
+{ }
+
+QueryBase::~QueryBase(void) { }
diff --git a/src/ReadGroupInfo.cpp b/src/ReadGroupInfo.cpp
new file mode 100644
index 0000000..b48c602
--- /dev/null
+++ b/src/ReadGroupInfo.cpp
@@ -0,0 +1,525 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/ReadGroupInfo.h"
+#include "SequenceUtils.h"
+#include <cram/md5.h>
+#include <cstdio>
+#include <set>
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static const string token_ID = string("ID");
+static const string token_CN = string("CN");
+static const string token_DS = string("DS");
+static const string token_DT = string("DT");
+static const string token_FO = string("FO");
+static const string token_KS = string("KS");
+static const string token_LB = string("LB");
+static const string token_PG = string("PG");
+static const string token_PI = string("PI");
+static const string token_PL = string("PL");
+static const string token_PU = string("PU");
+static const string token_SM = string("SM");
+
+static const string feature_DQ = string("DeletionQV");
+static const string feature_DT = string("DeletionTag");
+static const string feature_IQ = string("InsertionQV");
+static const string feature_MQ = string("MergeQV");
+static const string feature_SQ = string("SubstitutionQV");
+static const string feature_ST = string("SubstitutionTag");
+static const string feature_IP = string("Ipd");
+static const string feature_PW = string("PulseWidth");
+static const string feature_PM = string("PkMid");
+static const string feature_PA = string("PkMean");
+static const string feature_LT = string("Label");
+static const string feature_PQ = string("LabelQV");
+static const string feature_PT = string("AltLabel");
+static const string feature_PV = string("AltLabelQV");
+static const string feature_PG = string("PulseMergeQV");
+static const string feature_PC = string("PulseCall");
+static const string feature_PD = string("PrePulseFrames");
+static const string feature_PX = string("PulseCallWidth");
+
+static const string token_RT = string("READTYPE");
+static const string token_BK = string("BINDINGKIT");
+static const string token_SK = string("SEQUENCINGKIT");
+static const string token_BV = string("BASECALLERVERSION");
+static const string token_FR = string("FRAMERATEHZ");
+static const string token_CT = string("CONTROL");
+
+static const string codec_RAW = string("Frames");
+static const string codec_V1 = string("CodecV1");
+
+static
+string BaseFeatureName(const BaseFeature& feature)
+{
+ switch(feature) {
+ case BaseFeature::DELETION_QV : return feature_DQ;
+ case BaseFeature::DELETION_TAG : return feature_DT;
+ case BaseFeature::INSERTION_QV : return feature_IQ;
+ case BaseFeature::MERGE_QV : return feature_MQ;
+ case BaseFeature::SUBSTITUTION_QV : return feature_SQ;
+ case BaseFeature::SUBSTITUTION_TAG : return feature_ST;
+ case BaseFeature::IPD : return feature_IP;
+ case BaseFeature::PULSE_WIDTH : return feature_PW;
+ case BaseFeature::PKMID : return feature_PM;
+ case BaseFeature::PKMEAN : return feature_PA;
+ case BaseFeature::LABEL_QV : return feature_PQ;
+ case BaseFeature::ALT_LABEL : return feature_PT;
+ case BaseFeature::ALT_LABEL_QV : return feature_PV;
+ case BaseFeature::PULSE_MERGE_QV : return feature_PG;
+ case BaseFeature::PULSE_CALL : return feature_PC;
+ case BaseFeature::PRE_PULSE_FRAMES : return feature_PD;
+ case BaseFeature::PULSE_CALL_WIDTH : return feature_PX;
+ default:
+ throw std::runtime_error("unrecognized base feature");
+ }
+ return string();
+}
+
+static
+string FrameCodecName(const FrameCodec& codec)
+{
+ switch (codec) {
+ case FrameCodec::RAW : return codec_RAW;
+ case FrameCodec::V1 : return codec_V1;
+ default:
+ throw std::runtime_error("unrecognized frame codec");
+ }
+ return string();
+}
+
+static map<string, BaseFeature> nameToFeature;
+static map<string, FrameCodec> nameToCodec;
+
+static inline
+void InitNameToFeature(void)
+{
+ if (nameToFeature.empty()) {
+ nameToFeature[feature_DQ] = BaseFeature::DELETION_QV;
+ nameToFeature[feature_DT] = BaseFeature::DELETION_TAG;
+ nameToFeature[feature_IQ] = BaseFeature::INSERTION_QV;
+ nameToFeature[feature_MQ] = BaseFeature::MERGE_QV;
+ nameToFeature[feature_SQ] = BaseFeature::SUBSTITUTION_QV;
+ nameToFeature[feature_ST] = BaseFeature::SUBSTITUTION_TAG;
+ nameToFeature[feature_IP] = BaseFeature::IPD;
+ nameToFeature[feature_PW] = BaseFeature::PULSE_WIDTH;
+ nameToFeature[feature_PM] = BaseFeature::PKMID;
+ nameToFeature[feature_PA] = BaseFeature::PKMEAN;
+ nameToFeature[feature_PQ] = BaseFeature::LABEL_QV;
+ nameToFeature[feature_PT] = BaseFeature::ALT_LABEL;
+ nameToFeature[feature_PV] = BaseFeature::ALT_LABEL_QV;
+ nameToFeature[feature_PC] = BaseFeature::PULSE_CALL;
+ nameToFeature[feature_PG] = BaseFeature::PULSE_MERGE_QV;
+ nameToFeature[feature_PD] = BaseFeature::PRE_PULSE_FRAMES;
+ nameToFeature[feature_PX] = BaseFeature::PULSE_CALL_WIDTH;
+ }
+}
+
+static inline
+void InitNameToCodec(void)
+{
+ if (nameToCodec.empty()) {
+ nameToCodec[codec_RAW] = FrameCodec::RAW;
+ nameToCodec[codec_V1] = FrameCodec::V1;
+ }
+}
+
+static inline
+bool IsBaseFeature(const std::string& name)
+{
+ InitNameToFeature();
+ return nameToFeature.find(name) != nameToFeature.cend();
+}
+
+static inline
+BaseFeature BaseFeatureFromName(const std::string& name)
+{
+ InitNameToFeature();
+ return nameToFeature.at(name);
+}
+
+static inline
+FrameCodec FrameCodecFromName(const string& name)
+{
+ InitNameToCodec();
+ return nameToCodec.at(name);
+}
+
+} // namespace internal
+
+ReadGroupInfo::ReadGroupInfo(void)
+ : readType_("UNKNOWN")
+ , ipdCodec_(FrameCodec::V1)
+ , pulseWidthCodec_(FrameCodec::V1)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(const std::string& id)
+ : id_(id)
+ , readType_("UNKNOWN")
+ , ipdCodec_(FrameCodec::V1)
+ , pulseWidthCodec_(FrameCodec::V1)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(const std::string& movieName,
+ const std::string& readType)
+ : id_(MakeReadGroupId(movieName, readType))
+ , movieName_(movieName)
+ , readType_(readType)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(const ReadGroupInfo& other)
+ : id_(other.id_)
+ , sequencingCenter_(other.sequencingCenter_)
+ , date_(other.date_)
+ , flowOrder_(other.flowOrder_)
+ , keySequence_(other.keySequence_)
+ , library_(other.library_)
+ , programs_(other.programs_)
+ , predictedInsertSize_(other.predictedInsertSize_)
+ , movieName_(other.movieName_)
+ , sample_(other.sample_)
+ , readType_(other.readType_)
+ , bindingKit_(other.bindingKit_)
+ , sequencingKit_(other.sequencingKit_)
+ , basecallerVersion_(other.basecallerVersion_)
+ , frameRateHz_(other.frameRateHz_)
+ , control_(other.control_)
+ , ipdCodec_(other.ipdCodec_)
+ , pulseWidthCodec_(other.pulseWidthCodec_)
+ , features_(other.features_)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(ReadGroupInfo&& other)
+ : id_(std::move(other.id_))
+ , sequencingCenter_(std::move(other.sequencingCenter_))
+ , date_(std::move(other.date_))
+ , flowOrder_(std::move(other.flowOrder_))
+ , keySequence_(std::move(other.keySequence_))
+ , library_(std::move(other.library_))
+ , programs_(std::move(other.programs_))
+ , predictedInsertSize_(std::move(other.predictedInsertSize_))
+ , movieName_(std::move(other.movieName_))
+ , sample_(std::move(other.sample_))
+ , readType_(std::move(other.readType_))
+ , bindingKit_(std::move(other.bindingKit_))
+ , sequencingKit_(std::move(other.sequencingKit_))
+ , basecallerVersion_(std::move(other.basecallerVersion_))
+ , frameRateHz_(std::move(other.frameRateHz_))
+ , control_(std::move(other.control_))
+ , ipdCodec_(std::move(other.ipdCodec_))
+ , pulseWidthCodec_(std::move(other.pulseWidthCodec_))
+ , features_(std::move(other.features_))
+{ }
+
+ReadGroupInfo::~ReadGroupInfo(void) { }
+
+ReadGroupInfo& ReadGroupInfo::operator=(const ReadGroupInfo& other)
+{
+ id_ = other.id_;
+ sequencingCenter_ = other.sequencingCenter_;
+ date_ = other.date_;
+ flowOrder_ = other.flowOrder_;
+ keySequence_ = other.keySequence_;
+ library_ = other.library_;
+ programs_ = other.programs_;
+ predictedInsertSize_ = other.predictedInsertSize_;
+ movieName_ = other.movieName_;
+ sample_ = other.sample_;
+ readType_ = other.readType_;
+ bindingKit_ = other.bindingKit_;
+ sequencingKit_ = other.sequencingKit_;
+ basecallerVersion_ = other.basecallerVersion_;
+ frameRateHz_ = other.frameRateHz_;
+ control_ = other.control_;
+ ipdCodec_ = other.ipdCodec_;
+ pulseWidthCodec_ = other.pulseWidthCodec_;
+ features_ = other.features_;
+ return *this;
+}
+
+ReadGroupInfo& ReadGroupInfo::operator=(ReadGroupInfo&& other)
+{
+ id_ = std::move(other.id_);
+ sequencingCenter_ = std::move(other.sequencingCenter_);
+ date_ = std::move(other.date_);
+ flowOrder_ = std::move(other.flowOrder_);
+ keySequence_ = std::move(other.keySequence_);
+ library_ = std::move(other.library_);
+ programs_ = std::move(other.programs_);
+ predictedInsertSize_ = std::move(other.predictedInsertSize_);
+ movieName_ = std::move(other.movieName_);
+ sample_ = std::move(other.sample_);
+ readType_ = std::move(other.readType_);
+ bindingKit_ = std::move(other.bindingKit_);
+ sequencingKit_ = std::move(other.sequencingKit_);
+ basecallerVersion_ = std::move(other.basecallerVersion_);
+ frameRateHz_ = std::move(other.frameRateHz_);
+ control_ = std::move(other.control_);
+ ipdCodec_ = std::move(other.ipdCodec_);
+ pulseWidthCodec_ = std::move(other.pulseWidthCodec_);
+ features_ = std::move(other.features_);
+ return *this;
+}
+
+void ReadGroupInfo::DecodeSamDescription(const std::string& description)
+{
+ // split on semicolons
+ // for each, split on equal
+ // determine name ->
+
+ const vector<string>& tokens = internal::Split(description, ';');
+ if (tokens.empty())
+ return;
+
+ // iterate over tokens
+ auto tokenEnd = tokens.cend();
+ for (auto tokenIter = tokens.cbegin(); tokenIter != tokenEnd; ++tokenIter) {
+
+ const string& token = *tokenIter;
+
+ const size_t foundEqual = token.find('=');
+ if (foundEqual == string::npos)
+ continue;
+
+ const string& key = token.substr(0,foundEqual);
+ const string& value = token.substr(foundEqual+1);
+
+ if (key == internal::token_RT) readType_ = value;
+ else if (key == internal::token_BK) bindingKit_ = value;
+ else if (key == internal::token_BV) basecallerVersion_ = value;
+ else if (key == internal::token_SK) sequencingKit_ = value;
+ else if (key == internal::token_FR) frameRateHz_ = value;
+ else if (key == internal::token_CT) control_ = value == "TRUE";
+ else if (internal::IsBaseFeature(key)) {
+ features_[internal::BaseFeatureFromName(key)] = value;
+ }
+ else {
+ const vector<string> keyParts = internal::Split(key, ':');
+ if (keyParts.size() == 2) {
+ const string& subkey = keyParts.at(0);
+ if (subkey == internal::feature_IP) {
+ ipdCodec_ = internal::FrameCodecFromName(keyParts.at(1));
+ features_[BaseFeature::IPD] = value;
+ }
+ else if (subkey == internal::feature_PW) {
+ pulseWidthCodec_ = internal::FrameCodecFromName(keyParts.at(1));
+ features_[BaseFeature::PULSE_WIDTH] = value;
+ }
+ }
+ }
+ }
+}
+
+std::string ReadGroupInfo::EncodeSamDescription(void) const
+{
+ string result;
+ result.reserve(256);
+ result.append(std::string(internal::token_RT+"=" + readType_));
+
+ string featureName;
+ const auto featureEnd = features_.cend();
+ auto featureIter = features_.cbegin();
+ for ( ; featureIter != featureEnd; ++featureIter ) {
+ featureName = internal::BaseFeatureName(featureIter->first);
+ if (featureName.empty() || featureIter->second.empty())
+ continue;
+ else if (featureName == internal::feature_IP) {
+ featureName.append(":");
+ featureName.append(internal::FrameCodecName(ipdCodec_));
+ }
+ else if (featureName == internal::feature_PW) {
+ featureName.append(":");
+ featureName.append(internal::FrameCodecName(pulseWidthCodec_));
+ }
+ result.append(string(';' + featureName + '=' + featureIter->second));
+ }
+
+ if (!bindingKit_.empty()) result.append(";"+internal::token_BK+"="+bindingKit_);
+ if (!sequencingKit_.empty()) result.append(";"+internal::token_SK+"="+sequencingKit_);
+ if (!basecallerVersion_.empty()) result.append(";"+internal::token_BV+"="+basecallerVersion_);
+ if (!frameRateHz_.empty()) result.append(";"+internal::token_FR+"="+frameRateHz_);
+ if (control_) result.append(";"+internal::token_CT+"="+ (control_ ? "TRUE" : "FALSE"));
+
+ return result;
+}
+
+ReadGroupInfo ReadGroupInfo::FromSam(const string& sam)
+{
+ // pop off '@RG\t', then split rest of line into tokens
+ const vector<string>& tokens = internal::Split(sam.substr(4), '\t');
+ if (tokens.empty())
+ return ReadGroupInfo();
+
+ ReadGroupInfo rg;
+ map<string, string> custom;
+
+ for (const string& token : tokens) {
+ const string& tokenTag = token.substr(0,2);
+ const string& tokenValue = token.substr(3);
+
+ // set read group info
+ if (tokenTag == internal::token_ID) rg.Id(tokenValue);
+ else if (tokenTag == internal::token_CN) rg.SequencingCenter(tokenValue);
+ else if (tokenTag == internal::token_DT) rg.Date(tokenValue);
+ else if (tokenTag == internal::token_FO) rg.FlowOrder(tokenValue);
+ else if (tokenTag == internal::token_KS) rg.KeySequence(tokenValue);
+ else if (tokenTag == internal::token_LB) rg.Library(tokenValue);
+ else if (tokenTag == internal::token_PG) rg.Programs(tokenValue);
+ else if (tokenTag == internal::token_PI) rg.PredictedInsertSize(tokenValue);
+ else if (tokenTag == internal::token_PU) rg.MovieName(tokenValue);
+ else if (tokenTag == internal::token_SM) rg.Sample(tokenValue);
+ else if (tokenTag == internal::token_DS) rg.DecodeSamDescription(tokenValue);
+
+ // otherwise, "custom" tag
+ else
+ custom[tokenTag] = tokenValue;
+ }
+ rg.CustomTags(custom);
+
+ return rg;
+}
+
+ReadGroupInfo& ReadGroupInfo::IpdCodec(const FrameCodec& codec, const string& tag)
+{
+ // store desired codec type
+ ipdCodec_ = codec;
+
+ // update base features map
+ string actualTag = tag;
+ if (actualTag.empty())
+ actualTag = "ip";
+ BaseFeatureTag(BaseFeature::IPD, actualTag);
+ return *this;
+}
+
+ReadGroupInfo& ReadGroupInfo::PulseWidthCodec(const FrameCodec& codec, const string& tag)
+{
+ // store desired codec type
+ pulseWidthCodec_ = codec;
+
+ // update base features map
+ string actualTag = tag;
+ if (actualTag.empty())
+ actualTag = "pw";
+ BaseFeatureTag(BaseFeature::PULSE_WIDTH, actualTag);
+ return *this;
+}
+
+std::string ReadGroupInfo::ToSam(void) const
+{
+ stringstream out;
+ out << "@RG"
+ << internal::MakeSamTag(internal::token_ID, id_)
+ << internal::MakeSamTag(internal::token_PL, Platform());
+
+ const string& description = EncodeSamDescription();
+ if (!description.empty())
+ out << internal::MakeSamTag(internal::token_DS, description);
+
+ if (!sequencingCenter_.empty()) out << internal::MakeSamTag(internal::token_CN, sequencingCenter_);
+ if (!date_.empty()) out << internal::MakeSamTag(internal::token_DT, date_);
+ if (!flowOrder_.empty()) out << internal::MakeSamTag(internal::token_FO, flowOrder_);
+ if (!keySequence_.empty()) out << internal::MakeSamTag(internal::token_KS, keySequence_);
+ if (!library_.empty()) out << internal::MakeSamTag(internal::token_LB, library_);
+ if (!programs_.empty()) out << internal::MakeSamTag(internal::token_PG, programs_);
+ if (!predictedInsertSize_.empty()) out << internal::MakeSamTag(internal::token_PI, predictedInsertSize_);
+ if (!movieName_.empty()) out << internal::MakeSamTag(internal::token_PU, movieName_);
+ if (!sample_.empty()) out << internal::MakeSamTag(internal::token_SM, sample_);
+
+ // append any custom tags
+ map<string, string>::const_iterator customIter = custom_.cbegin();
+ map<string, string>::const_iterator customEnd = custom_.cend();
+ for ( ; customIter != customEnd; ++customIter )
+ out << internal::MakeSamTag(customIter->first, customIter->second);
+
+ return out.str();
+}
+
+std::string MakeReadGroupId(const std::string& movieName,
+ const std::string& readType)
+{
+ MD5_CTX md5;
+ unsigned char digest[16];
+ char hexdigest[9];
+
+ MD5_Init(&md5);
+ MD5_Update(&md5, reinterpret_cast<void*>(const_cast<char*>(movieName.c_str())), movieName.size());
+ MD5_Update(&md5, reinterpret_cast<void*>(const_cast<char*>("//")), 2);
+ MD5_Update(&md5, reinterpret_cast<void*>(const_cast<char*>(readType.c_str())), readType.size());
+ MD5_Final(digest, &md5);
+
+ for (int i = 0; i < 4; ++i)
+ sprintf(&hexdigest[2*i], "%02x", digest[i]);
+
+ return std::string(hexdigest, 8);
+}
+
+bool ReadGroupInfo::operator==(const ReadGroupInfo& other) const
+{
+ return id_ == other.id_
+ && sequencingCenter_ == other.sequencingCenter_
+ && date_ == other.date_
+ && flowOrder_ == other.flowOrder_
+ && keySequence_ == other.keySequence_
+ && library_ == other.library_
+ && programs_ == other.programs_
+ && predictedInsertSize_ == other.predictedInsertSize_
+ && movieName_ == other.movieName_
+ && sample_ == other.sample_
+ && readType_ == other.readType_
+ && bindingKit_ == other.bindingKit_
+ && sequencingKit_ == other.sequencingKit_
+ && basecallerVersion_ == other.basecallerVersion_
+ && frameRateHz_ == other.frameRateHz_
+ && control_ == other.control_
+ && ipdCodec_ == other.ipdCodec_
+ && pulseWidthCodec_ == other.pulseWidthCodec_
+ && features_.size() == other.features_.size()
+ && std::equal(features_.begin(), features_.end(),
+ other.features_.begin());
+}
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/SamTagCodec.cpp b/src/SamTagCodec.cpp
new file mode 100644
index 0000000..532998f
--- /dev/null
+++ b/src/SamTagCodec.cpp
@@ -0,0 +1,296 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/SamTagCodec.h"
+#include "AssertUtils.h"
+#include <boost/lexical_cast.hpp>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+template<typename T>
+inline void appendSamValue(const T& value,
+ string& result,
+ bool force8BitInt = false)
+{
+ if (force8BitInt)
+ result.append(boost::lexical_cast<string>(static_cast<int>(value)));
+ else
+ result.append(boost::lexical_cast<string>(value));
+}
+
+template<typename T>
+void appendSamMultiValue(const T& container,
+ string& result,
+ bool force8BitInt = false)
+{
+ auto end = container.cend();
+ for (auto iter = container.cbegin(); iter != end; ++iter) {
+ result.append(1, ',');
+ if ( force8BitInt )
+ result.append(boost::lexical_cast<string>(static_cast<int>(*iter)));
+ else
+ result.append(boost::lexical_cast<string>(*iter));
+ }
+}
+
+static
+vector<string>& split(const string& s, char delim, vector<string>& elems)
+{
+ stringstream ss(s);
+ string item;
+ while (getline(ss, item, delim))
+ elems.push_back(item);
+ return elems;
+}
+
+static
+vector<string> split(const string& s, char delim) {
+ vector<string> elems;
+ split(s, delim, elems);
+ return elems;
+}
+
+vector<float> readFloatSamMultiValue(const string& data)
+{
+ vector<float> result;
+ char* c = (char*)data.c_str();
+ const char* end = c + data.length();
+ while (c+1 < end) {
+ const float value = strtof(c+1, &c); // c+1 to skip comma
+ result.push_back(value);
+ }
+ return result;
+}
+
+template<typename T>
+vector<T> readSignedSamMultiValue(const string& data)
+{
+ vector<T> result;
+ char* c = (char*)data.c_str();
+ const char* end = c + data.length();
+ while (c+1 < end) {
+ const T value = strtol(c+1, &c, 0); // c+1 to skip comma
+ result.push_back(value);
+ }
+
+ return result;
+}
+
+template<typename T>
+vector<T> readUnsignedSamMultiValue(const string& data)
+{
+ vector<T> result;
+ char* c = (char*)data.c_str();
+ const char* end = c + data.length();
+ while (c+1 < end) {
+ const T value = strtoul(c+1, &c, 0); // c+1 to skip comma
+ result.push_back(value);
+ }
+ return result;
+}
+
+TagCollection SamTagCodec::Decode(const string& tagString)
+{
+ TagCollection tags;
+
+ const vector<string>& tokens = split(tagString, '\t');
+ const auto end = tokens.cend();
+ for (auto iter = tokens.cbegin(); iter != end; ++iter ) {
+ const string& token = (*iter);
+ if (token.size() < 6) // TT:t:X
+ continue;
+
+ const string& name = token.substr(0, 2);
+ const char type = token.at(3);
+ const string& remainder = token.substr(5);
+ PB_ASSERT_OR_CONTINUE(!remainder.empty());
+
+ switch (type) {
+
+ // technically only 'A' is allowed in SAM chars, but we'll be a little permissive
+ case 'A' :
+ case 'a' :
+ {
+ tags[name] = static_cast<char>(remainder.at(0));
+ tags[name].Modifier(TagModifier::ASCII_CHAR);
+ break;
+ }
+
+ // technically only 'i' is allowed in SAM ints, but we'll be a little permissive
+ // since SAM might be a bit more "user-edited" than BAM
+ case 'c' :
+ case 'C' :
+ case 's' :
+ case 'S' :
+ case 'i' :
+ case 'I' :
+ {
+ // negative value (force signed int)
+ if (remainder.at(0) == '-') {
+ const int32_t x = boost::lexical_cast<int32_t>(remainder);
+ if ( x >= INT8_MIN )
+ tags[name] = static_cast<int8_t>(x); // check out boost::numeric cast
+ else if ( x >= INT16_MIN )
+ tags[name] = static_cast<int16_t>(x);
+ else
+ tags[name] = x;
+ }
+
+ // unsigned int
+ else {
+ const uint32_t x = boost::lexical_cast<uint32_t>(remainder);
+ if ( x <= UINT8_MAX )
+ tags[name] = static_cast<uint8_t>(x);
+ else if ( x <= UINT16_MAX )
+ tags[name] = static_cast<uint16_t>(x);
+ else
+ tags[name] = x;
+ }
+ break;
+ }
+
+ case 'f' :
+ {
+ tags[name] = boost::lexical_cast<float>(remainder);
+ break;
+ }
+
+ case 'Z' :
+ {
+ tags[name] = remainder;
+ break;
+ }
+
+ case 'H' :
+ {
+ tags[name] = remainder;
+ tags[name].Modifier(TagModifier::HEX_STRING);
+ break;
+ }
+
+ case 'B' :
+ {
+ const char elementType = remainder.at(0);
+ const string& arrayData = remainder.substr(1);
+ switch (elementType) {
+ case 'c' : tags[name] = readSignedSamMultiValue<int8_t>(arrayData); break;
+ case 'C' : tags[name] = readUnsignedSamMultiValue<uint8_t>(arrayData); break;
+ case 's' : tags[name] = readSignedSamMultiValue<int16_t>(arrayData); break;
+ case 'S' : tags[name] = readUnsignedSamMultiValue<uint16_t>(arrayData); break;
+ case 'i' : tags[name] = readSignedSamMultiValue<int32_t>(arrayData); break;
+ case 'I' : tags[name] = readUnsignedSamMultiValue<uint32_t>(arrayData); break;
+ case 'f' : tags[name] = readFloatSamMultiValue(arrayData); break;
+ default:
+ PB_ASSERT_OR_CONTINUE(false);
+ }
+ break;
+ }
+
+ // unsupported SAM tag type
+ default :
+ PB_ASSERT_OR_CONTINUE(false);
+ }
+ }
+
+ return tags;
+}
+
+
+string SamTagCodec::Encode(const TagCollection& tags)
+{
+ string result;
+ result.reserve(1024);
+
+ const auto tagEnd = tags.cend();
+ for (auto tagIter = tags.cbegin(); tagIter != tagEnd; ++tagIter) {
+ const string& name = (*tagIter).first;
+ const Tag& tag = (*tagIter).second;
+ PB_ASSERT_OR_CONTINUE(name.size() == 2);
+ if (tag.IsNull())
+ continue;
+
+ // tab separator
+ if (!result.empty())
+ result.append(1, '\t');
+
+ // "<TAG>:"
+ result.append(name);
+ result.append(1, ':');
+
+ // "<TYPE>:<DATA>" for printable, ASCII char
+ if (tag.HasModifier(TagModifier::ASCII_CHAR)) {
+ char c = tag.ToAscii();
+ if (c != '\0') {
+ result.append("A:");
+ result.append(1, c);
+ continue;
+ }
+ }
+
+ // "<TYPE>:<DATA>" for all other data
+ switch ( tag.Type() ) {
+ case TagDataType::INT8 : result.append("i:"); appendSamValue(tag.ToInt8(), result, true); break;
+ case TagDataType::UINT8 : result.append("i:"); appendSamValue(tag.ToUInt8(), result, true); break;
+ case TagDataType::INT16 : result.append("i:"); appendSamValue(tag.ToInt16(), result); break;
+ case TagDataType::UINT16 : result.append("i:"); appendSamValue(tag.ToUInt16(), result); break;
+ case TagDataType::INT32 : result.append("i:"); appendSamValue(tag.ToInt32(), result); break;
+ case TagDataType::UINT32 : result.append("i:"); appendSamValue(tag.ToUInt32(), result); break;
+ case TagDataType::FLOAT : result.append("f:"); appendSamValue(tag.ToFloat(), result); break;
+
+ case TagDataType::STRING :
+ {
+ result.append(tag.HasModifier(TagModifier::HEX_STRING) ? "H:" : "Z:");
+ result.append(tag.ToString());
+ break;
+ }
+
+ case TagDataType::INT8_ARRAY : result.append("B:c"); appendSamMultiValue(tag.ToInt8Array(), result, true); break;
+ case TagDataType::UINT8_ARRAY : result.append("B:C"); appendSamMultiValue(tag.ToUInt8Array(), result, true); break;
+ case TagDataType::INT16_ARRAY : result.append("B:s"); appendSamMultiValue(tag.ToInt16Array(), result); break;
+ case TagDataType::UINT16_ARRAY : result.append("B:S"); appendSamMultiValue(tag.ToUInt16Array(), result); break;
+ case TagDataType::INT32_ARRAY : result.append("B:i"); appendSamMultiValue(tag.ToInt32Array(), result); break;
+ case TagDataType::UINT32_ARRAY : result.append("B:I"); appendSamMultiValue(tag.ToUInt32Array(), result); break;
+ case TagDataType::FLOAT_ARRAY : result.append("B:f"); appendSamMultiValue(tag.ToFloatArray(), result); break;
+
+ default :
+ PB_ASSERT_OR_RETURN_VALUE(false, string());
+ }
+ }
+
+ return result;
+}
diff --git a/src/SequenceInfo.cpp b/src/SequenceInfo.cpp
new file mode 100644
index 0000000..fa7837d
--- /dev/null
+++ b/src/SequenceInfo.cpp
@@ -0,0 +1,172 @@
+
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/SequenceInfo.h"
+#include "SequenceUtils.h"
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static string token_SN = string("SN");
+static string token_LN = string("LN");
+static string token_AS = string("AS");
+static string token_M5 = string("M5");
+static string token_SP = string("SP");
+static string token_UR = string("UR");
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+SequenceInfo::SequenceInfo(void) { }
+
+SequenceInfo::SequenceInfo(const std::string& name,
+ const std::string& length)
+ : name_(name)
+ , length_(length)
+{ }
+
+SequenceInfo::SequenceInfo(const SequenceInfo& other)
+ : name_(other.name_)
+ , length_(other.length_)
+ , assemblyId_(other.assemblyId_)
+ , checksum_(other.checksum_)
+ , species_(other.species_)
+ , uri_(other.uri_)
+{ }
+
+SequenceInfo::SequenceInfo(SequenceInfo&& other)
+ : name_(std::move(other.name_))
+ , length_(std::move(other.length_))
+ , assemblyId_(std::move(other.assemblyId_))
+ , checksum_(std::move(other.checksum_))
+ , species_(std::move(other.species_))
+ , uri_(std::move(other.uri_))
+{ }
+
+SequenceInfo::~SequenceInfo(void) { }
+
+SequenceInfo& SequenceInfo::operator=(const SequenceInfo& other)
+{
+ name_ = other.name_;
+ length_ = other.length_;
+ assemblyId_ = other.assemblyId_;
+ checksum_ = other.checksum_;
+ species_ = other.species_;
+ uri_ = other.uri_;
+ return *this;
+}
+
+SequenceInfo& SequenceInfo::operator=(SequenceInfo&& other)
+{
+ name_ = std::move(other.name_);
+ length_ = std::move(other.length_);
+ assemblyId_ = std::move(other.assemblyId_);
+ checksum_ = std::move(other.checksum_);
+ species_ = std::move(other.species_);
+ uri_ = std::move(other.uri_);
+ return *this;
+}
+
+SequenceInfo SequenceInfo::FromSam(const std::string& sam)
+{
+ // pop off '@SQ\t', then split rest of line into tokens
+ const vector<string>& tokens = internal::Split(sam.substr(4), '\t');
+ if (tokens.empty())
+ return SequenceInfo();
+
+ SequenceInfo seq;
+ map<string, string> custom;
+
+ // iterate over tokens
+ for (const string& token : tokens) {
+ const string& tokenTag = token.substr(0,2);
+ const string& tokenValue = token.substr(3);
+
+ // set sequence info
+ if (tokenTag == internal::token_SN) seq.Name(tokenValue);
+ else if (tokenTag == internal::token_LN) seq.Length(tokenValue);
+ else if (tokenTag == internal::token_AS) seq.AssemblyId(tokenValue);
+ else if (tokenTag == internal::token_M5) seq.Checksum(tokenValue);
+ else if (tokenTag == internal::token_SP) seq.Species(tokenValue);
+ else if (tokenTag == internal::token_UR) seq.Uri(tokenValue);
+
+ // otherwise, "custom" tag
+ else
+ custom[tokenTag] = tokenValue;
+ }
+
+ seq.CustomTags(custom);
+ return seq;
+}
+
+bool SequenceInfo::IsValid(void) const
+{
+ if (name_.empty())
+ return false;
+
+ // use long instead of int32_t, just to make sure we can catch overflow
+ const long l = atol(length_.c_str());
+ return l >= 0 && l <= INT32_MAX;
+}
+
+std::string SequenceInfo::ToSam(void) const
+{
+ stringstream out;
+ out << "@SQ"
+ << internal::MakeSamTag(internal::token_SN, name_);
+
+ if (!length_.empty()) out << internal::MakeSamTag(internal::token_LN, length_);
+ if (!assemblyId_.empty()) out << internal::MakeSamTag(internal::token_AS, assemblyId_);
+ if (!checksum_.empty()) out << internal::MakeSamTag(internal::token_M5, checksum_);
+ if (!species_.empty()) out << internal::MakeSamTag(internal::token_SP, species_);
+ if (!uri_.empty()) out << internal::MakeSamTag(internal::token_UR, uri_);
+
+ // append any custom tags
+ map<string, string>::const_iterator customIter = custom_.cbegin();
+ map<string, string>::const_iterator customEnd = custom_.cend();
+ for ( ; customIter != customEnd; ++customIter )
+ out << internal::MakeSamTag(customIter->first, customIter->second);
+
+ return out.str();
+}
diff --git a/src/SequenceUtils.h b/src/SequenceUtils.h
new file mode 100644
index 0000000..23bf5ac
--- /dev/null
+++ b/src/SequenceUtils.h
@@ -0,0 +1,125 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef SEQUENCEUTILS_H
+#define SEQUENCEUTILS_H
+
+#include "StringUtils.h"
+#include <algorithm>
+#include <string>
+#include <ctype.h>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline char Complement(const char character)
+{
+ static char const complementLookup[] =
+ {
+ '\0', 'T', 'V', 'G', 'H',
+ '\0', '\0', 'C', 'D', '\0',
+ '\0', 'M', '\0', 'K', 'N',
+ '\0', '\0', '\0', 'Y', 'S',
+ 'A', 'A', 'B', 'W', '\0', 'R'
+ };
+ if (character == '-' || character == '*')
+ return character;
+ return complementLookup[toupper(character) & 0x1f];
+}
+
+//inline void Reverse(std::string& s)
+//{ std::reverse(s.begin(), s.end()); }
+
+template<typename T>
+void Reverse(T& input)
+{ std::reverse(input.begin(), input.end()); }
+
+template<typename T>
+T Reversed(const T& input)
+{
+ T result = input;
+ Reverse(result);
+ return result;
+}
+
+//inline std::string Reversed(const std::string& input)
+//{
+// std::string result = input;
+// Reverse(result);
+// return result;
+//}
+
+inline void ReverseComplement(std::string& seq) {
+
+ std::string::iterator sIter = seq.begin();
+ std::string::iterator sEnd = seq.end();
+ for ( ; sIter != sEnd; ++sIter )
+ *sIter = Complement(*sIter);
+ Reverse(seq);
+}
+
+/// Reverse complement a DNA sequence case-sensitive
+inline void ReverseComplementCaseSens(std::string& seq)
+{
+ const std::string original = seq;
+ int8_t rc_table[128] = {
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 32, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 45, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 84, 4, 71, 4, 4, 4, 67, 4, 4, 4, 4,
+ 4, 4, 78, 4, 4, 4, 4, 4, 65, 65, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 116, 4, 103, 4, 4, 4, 99, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 97, 97, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
+ std::string reverseCompl(original.length(), 'N');
+ for (uint32_t i = 0; i < original.length(); ++i)
+ reverseCompl[original.length()-i-1] = (char)rc_table[(int8_t)original[i]];
+ seq = reverseCompl;
+}
+
+inline std::string ReverseComplemented(const std::string& input)
+{
+ std::string result = input;
+ ReverseComplement(result);
+ return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SEQUENCEUTILS_H
diff --git a/src/StringUtils.h b/src/StringUtils.h
new file mode 100644
index 0000000..24562fb
--- /dev/null
+++ b/src/StringUtils.h
@@ -0,0 +1,74 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef STRINGUTILS_H
+#define STRINGUTILS_H
+
+#include <algorithm>
+#include <exception>
+#include <ios>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline std::string MakeSamTag(const std::string& tag,
+ const std::string& value)
+{
+ return std::string('\t' + tag + ':' + value);
+}
+
+inline std::vector<std::string> Split(const std::string& line,
+ const char delim = '\t')
+{
+ std::vector<std::string> tokens;
+ std::stringstream lineStream(line);
+ std::string token;
+ while (std::getline(lineStream, token, delim))
+ tokens.push_back(token);
+ return tokens;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // STRINGUTILS_H
diff --git a/src/Tag.cpp b/src/Tag.cpp
new file mode 100644
index 0000000..7f0a10c
--- /dev/null
+++ b/src/Tag.cpp
@@ -0,0 +1,101 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/Tag.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+Tag::Tag(void) : data_(), modifier_(TagModifier::NONE) { }
+Tag::Tag(int8_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(uint8_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(int16_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(uint16_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(int32_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(uint32_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(float value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const std::string& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<int8_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<uint8_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<int16_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<uint16_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<int32_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<uint32_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<float>& value) : data_(value), modifier_(TagModifier::NONE) { }
+
+Tag::Tag(const Tag& other)
+ : data_(other.data_)
+ , modifier_(other.modifier_)
+{ }
+
+Tag::Tag(Tag&& other)
+ : data_(std::move(other.data_))
+ , modifier_(std::move(other.modifier_))
+{ }
+
+Tag::~Tag(void) { }
+
+Tag& Tag::operator=(boost::blank value) { data_ = value; return *this; }
+Tag& Tag::operator=(int8_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(uint8_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(int16_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(uint16_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(int32_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(uint32_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(float value) { data_ = value; return *this; }
+Tag& Tag::operator=(const std::string& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<int8_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<uint8_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<int16_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<uint16_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<int32_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<uint32_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<float>& value) { data_ = value; return *this; }
+
+Tag& Tag::operator=(const Tag& other)
+{
+ data_ = other.data_;
+ modifier_ = other.modifier_;
+ return *this;
+}
+
+Tag& Tag::operator=(Tag&& other)
+{
+ data_ = std::move(other.data_);
+ modifier_ = std::move(other.modifier_);
+ return *this;
+}
diff --git a/src/TagCollection.cpp b/src/TagCollection.cpp
new file mode 100644
index 0000000..7f50126
--- /dev/null
+++ b/src/TagCollection.cpp
@@ -0,0 +1,46 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/TagCollection.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+bool TagCollection::Contains(const string& name) const
+{
+ return count(name) != 0;
+}
diff --git a/src/TimeUtils.h b/src/TimeUtils.h
new file mode 100644
index 0000000..615295d
--- /dev/null
+++ b/src/TimeUtils.h
@@ -0,0 +1,81 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef TIMEUTILS_H
+#define TIMEUTILS_H
+
+#include <chrono>
+#include <stdexcept>
+#include <string>
+#include <cassert>
+#include <ctime>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline
+std::string ToIso8601(const std::chrono::system_clock::time_point& tp)
+{
+ // get time info
+ const time_t ttime_t = std::chrono::system_clock::to_time_t(tp);
+ const std::chrono::system_clock::time_point tp_sec = std::chrono::system_clock::from_time_t(ttime_t);
+ const std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(tp - tp_sec);
+ const std::tm* ttm = gmtime(&ttime_t); // static obj, no free needed (may not be thread-safe though)
+
+ // format output
+ char date_time_format[] = "%FT%T";
+ char date_time_str[50];
+ strftime(date_time_str, sizeof(date_time_str), date_time_format, ttm);
+ std::string result(date_time_str);
+ if (ms.count() > 0) {
+ result.append(".");
+ result.append(std::to_string(ms.count()));
+ }
+ result.append("Z");
+ return result;
+}
+
+inline
+std::chrono::system_clock::time_point CurrentTime(void)
+{ return std::chrono::system_clock::now(); }
+
+} // namespace PacBio
+} // namespace BAM
+} // namespace internal
+
+#endif // TIMEUTILS_H
diff --git a/src/UnmappedReadsQuery.cpp b/src/UnmappedReadsQuery.cpp
new file mode 100644
index 0000000..9b60657
--- /dev/null
+++ b/src/UnmappedReadsQuery.cpp
@@ -0,0 +1,133 @@
+// Copyright (c) 2014, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+//#include "pbbam/UnmappedReadsQuery.h"
+//#include "pbbam/BamFile.h"
+//#include "MemoryUtils.h"
+
+//#include <iostream>
+
+//using namespace PacBio;
+//using namespace PacBio::BAM;
+//using namespace std;
+
+//UnmappedReadsQuery::UnmappedReadsQuery(const BamFile& file)
+// : QueryBase()
+//{
+// // open file
+// file_.reset(sam_open(file.Filename().c_str(), "rb"), internal::HtslibFileDeleter());
+// if (!file_) {
+// error_ = UnmappedReadsQuery::FileOpenError;
+// return;
+// }
+
+// // open index
+// index_.reset(bam_index_load(file.Filename().c_str()), internal::HtslibIndexDeleter());
+// if (!index_) {
+// error_ = UnmappedReadsQuery::IndexFileOpenError;
+// return;
+// }
+
+// // initialize query
+// iterator_.reset(bam_itr_queryi(index_.get(), HTS_IDX_NOCOOR, 0, 0), internal::HtslibIteratorDeleter());
+// if (iterator_) {
+
+// cerr << endl
+// << "UnmappedQueryReads::iterator" << endl
+// << "read_rest: " << iterator_->read_rest << endl
+// << "finished: " << iterator_->finished << endl
+// << "dummy: " << iterator_->dummy << endl
+// << "tid: " << iterator_->tid << endl
+// << "beg: " << iterator_->beg << endl
+// << "end: " << iterator_->end << endl
+// << "n_off: " << iterator_->n_off << endl
+// << "i: " << iterator_->i << endl
+// << "curr_off: " << iterator_->curr_off << endl
+// << endl;
+
+
+//// uint32_t read_rest:1, finished:1, dummy:29;
+//// int tid, beg, end, n_off, i;
+//// uint64_t curr_off;
+//// hts_pair64_t *off;
+//// hts_readrec_func *readrec;
+//// struct {
+//// int n, m;
+//// int *a;
+//// } bins;
+
+// }
+//}
+
+//bool UnmappedReadsQuery::GetNext(BamRecord& record)
+//{
+// if (error_ == UnmappedReadsQuery::NoError && iterator_) {
+// const int result = bam_itr_next(file_.get(), iterator_.get(), record.RawData().get());
+// if ( result > 0 )
+// return true;
+// else {
+// cerr << "ERROR - result: " << result << endl;
+// if ( result == -4 ) {
+
+// bam1_t* b = record.RawData().get();
+// bam1_core_t* c = &b->core;
+// bool nonBgzfErrorFound = false;
+
+// if (b->l_data < 0) {
+// cerr << "ERROR: bam1_t::l_data < 0" << endl;
+// nonBgzfErrorFound = true;
+// }
+// if (c->l_qseq < 0) {
+// cerr << "ERROR: bam1_t::core::l_qseq < 0" << endl;
+// nonBgzfErrorFound = true;
+// }
+// if (!b->data) {
+// cerr << "ERROR: bam1_t::data is null" << endl;
+// nonBgzfErrorFound = true;
+// }
+// if (!nonBgzfErrorFound)
+// cerr << "ERROR: in bam_read1(), bgzf_read(fp, b->data, b->l_data) returned unexpected value" << endl;
+// }
+// }
+// }
+// else {
+// cerr << "UnmappedReadsQuery::HasError() - " << Error() << endl;
+// }
+
+
+// return false;
+//}
diff --git a/src/VirtualPolymeraseBamRecord.cpp b/src/VirtualPolymeraseBamRecord.cpp
new file mode 100644
index 0000000..7b3bf7b
--- /dev/null
+++ b/src/VirtualPolymeraseBamRecord.cpp
@@ -0,0 +1,288 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <vector>
+
+#include "pbbam/virtual/VirtualPolymeraseBamRecord.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+#include "pbbam/virtual/VirtualRegionTypeMap.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+VirtualPolymeraseBamRecord::VirtualPolymeraseBamRecord(
+ std::vector<BamRecord>&& unorderedSources, const BamHeader& header)
+ : BamRecord(header)
+ , sources_(std::forward<std::vector<BamRecord>>(unorderedSources))
+{
+ // Sort sources by queryStart
+ std::sort(sources_.begin(), sources_.end(),
+ [](const BamRecord& l1, const BamRecord& l2)
+ { return l1.QueryStart() < l2.QueryStart(); });
+ StitchSources();
+}
+
+void VirtualPolymeraseBamRecord::StitchSources()
+{
+ const auto& firstRecord = sources_[0];
+ const auto& lastRecord = sources_[sources_.size() - 1];
+
+ // Temporary variables used for stitching
+ int accuracy = 0;
+ int accuracyCounter = 0;
+
+ std::string sequence;
+ std::string deletionTag;
+ std::string substitutionTag;
+ std::string alternativeLabelTag;
+ std::string pulseCall;
+
+ QualityValues qualities;
+ QualityValues deletionQv;
+ QualityValues insertionQv;
+ QualityValues mergeQv;
+ QualityValues pulseMergeQv;
+ QualityValues substitutionQv;
+ QualityValues labelQv;
+ QualityValues alternativeLabelQv;
+
+ Frames ipd;
+ Frames pw;
+ Frames pd;
+ Frames px;
+ std::vector<float> pa;
+ std::vector<float> pm;
+
+ // Stitch using tmp vars
+ for(auto& b : sources_)
+ {
+ sequence.append(b.Sequence());
+
+ MoveAppend(b.Qualities(), qualities);
+
+ if (b.HasReadAccuracy())
+ {
+ accuracy += b.ReadAccuracy();
+ ++accuracyCounter;
+ }
+
+ if (b.HasDeletionQV())
+ MoveAppend(std::move(b.DeletionQV()), deletionQv);
+
+ if (b.HasInsertionQV())
+ MoveAppend(std::move(b.InsertionQV()), insertionQv);
+
+ if (b.HasMergeQV())
+ MoveAppend(std::move(b.MergeQV()), mergeQv);
+
+ if (b.HasPulseMergeQV())
+ MoveAppend(std::move(b.PulseMergeQV()), pulseMergeQv);
+
+ if (b.HasSubstitutionQV())
+ MoveAppend(std::move(b.SubstitutionQV()), substitutionQv);
+
+ if (b.HasLabelQV())
+ MoveAppend(std::move(b.LabelQV()), labelQv);
+
+ if (b.HasAltLabelQV())
+ MoveAppend(std::move(b.AltLabelQV()), alternativeLabelQv);
+
+ if (b.HasDeletionTag())
+ deletionTag.append(std::move(b.DeletionTag()));
+
+ if (b.HasSubstitutionTag())
+ substitutionTag.append(std::move(b.SubstitutionTag()));
+
+ if (b.HasAltLabelTag())
+ alternativeLabelTag.append(std::move(b.AltLabelTag()));
+
+ if (b.HasPulseCall())
+ pulseCall.append(std::move(b.PulseCall()));
+
+ if (b.HasIPD())
+ MoveAppend(b.IPDRaw().DataRaw(), ipd.DataRaw());
+
+ if (b.HasPulseWidth())
+ MoveAppend(b.PulseWidthRaw().DataRaw(), pw.DataRaw());
+
+ if (b.HasPulseCallWidth())
+ MoveAppend(b.PulseCallWidth().DataRaw(), px.DataRaw());
+
+ if (b.HasPrePulseFrames())
+ MoveAppend(b.PrePulseFrames().DataRaw(), pd.DataRaw());
+
+ if (b.HasPkmid())
+ MoveAppend(b.Pkmid(), pm);
+
+ if (b.HasPkmean())
+ MoveAppend(b.Pkmean(), pa);
+
+ if (b.HasScrapType())
+ {
+ const auto regionType = b.ScrapType();
+
+ if (!HasVirtualRegionType(regionType))
+ virtualRegionsMap_[regionType] = std::vector<VirtualRegion>();
+
+ virtualRegionsMap_[regionType].emplace_back(
+ regionType, b.QueryStart(), b.QueryEnd());
+ }
+
+ if (b.HasLocalContextFlags())
+ {
+ std::pair<int, int> barcodes{-1, -1};
+ if (b.HasBarcodes())
+ barcodes = b.Barcodes();
+
+ constexpr auto regionType = VirtualRegionType::SUBREAD;
+ if (!HasVirtualRegionType(regionType))
+ virtualRegionsMap_[regionType] = std::vector<VirtualRegion>();
+
+ virtualRegionsMap_[regionType].emplace_back(
+ regionType, b.QueryStart(), b.QueryEnd(), b.LocalContextFlags(),
+ barcodes.first, barcodes.second);
+ }
+ }
+
+ // ReadGroup
+ this->ReadGroup(this->header_.ReadGroups()[0]);
+
+ // Avoid division by 0
+ if (accuracyCounter > 0)
+ this->ReadAccuracy(accuracy / accuracyCounter);
+
+ this->NumPasses(1);
+
+ // All records should contain the same SNR and hole number
+ if (firstRecord.HasSignalToNoise())
+ this->SignalToNoise(firstRecord.SignalToNoise());
+ this->HoleNumber(firstRecord.HoleNumber());
+
+ // QueryStart
+ this->QueryStart(firstRecord.QueryStart());
+ this->QueryEnd(lastRecord.QueryEnd());
+ this->UpdateName();
+
+ std::string qualitiesStr = qualities.Fastq();
+ if (sequence.size() == qualitiesStr.size())
+ this->Impl().SetSequenceAndQualities(sequence, qualitiesStr);
+ else
+ this->Impl().SetSequenceAndQualities(sequence);
+
+ // Tags as strings
+ if (!deletionTag.empty())
+ this->DeletionTag(deletionTag);
+ if (!substitutionTag.empty())
+ this->SubstitutionTag(substitutionTag);
+ if (!alternativeLabelTag.empty())
+ this->AltLabelTag(alternativeLabelTag);
+ if (!pulseCall.empty())
+ this->PulseCall(pulseCall);
+
+ // QVs
+ if (!deletionQv.empty())
+ this->DeletionQV(deletionQv);
+ if (!insertionQv.empty())
+ this->InsertionQV(insertionQv);
+ if (!mergeQv.empty())
+ this->MergeQV(mergeQv);
+ if (!pulseMergeQv.empty())
+ this->PulseMergeQV(pulseMergeQv);
+ if (!substitutionQv.empty())
+ this->SubstitutionQV(substitutionQv);
+ if (!labelQv.empty())
+ this->LabelQV(labelQv);
+ if (!alternativeLabelQv.empty())
+ this->AltLabelQV(alternativeLabelQv);
+
+ // 16 bit arrays
+ if (!ipd.Data().empty())
+ this->IPD(ipd, FrameEncodingType::LOSSLESS);
+ if (!pw.Data().empty())
+ this->PulseWidth(pw, FrameEncodingType::LOSSLESS);
+ if (!pa.empty())
+ this->Pkmean(pa);
+ if (!pm.empty())
+ this->Pkmid(pm);
+ if (!pd.Data().empty())
+ this->PrePulseFrames(pd, FrameEncodingType::LOSSLESS);
+ if (!px.Data().empty())
+ this->PulseCallWidth(px, FrameEncodingType::LOSSLESS);
+
+ // Determine HQREGION bases on LQREGIONS
+ if (HasVirtualRegionType(VirtualRegionType::LQREGION))
+ {
+ if (virtualRegionsMap_[VirtualRegionType::LQREGION].size() == 1)
+ {
+ const auto lq = virtualRegionsMap_[VirtualRegionType::LQREGION][0];
+ if (lq.beginPos == 0)
+ virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+ VirtualRegionType::HQREGION, lq.endPos, sequence.size());
+ else if (lq.endPos == static_cast<int>(sequence.size()))
+ virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+ VirtualRegionType::HQREGION, 0, lq.beginPos);
+ else
+ throw std::runtime_error("Unknown HQREGION");
+ }
+ else
+ {
+ int beginPos = 0;
+ for (const auto& lqregion : virtualRegionsMap_[VirtualRegionType::LQREGION])
+ {
+ if (lqregion.beginPos - beginPos > 0)
+ virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+ VirtualRegionType::HQREGION, beginPos, lqregion.beginPos);
+ beginPos = lqregion.endPos;
+ }
+ }
+ }
+ else
+ {
+ virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+ VirtualRegionType::HQREGION, 0, sequence.size());
+ }
+}
+
+Frames VirtualPolymeraseBamRecord::IPDV1Frames(Orientation orientation) const
+{
+ const auto rawFrames = this->IPDRaw(orientation);
+ const std::vector<uint8_t> rawData(rawFrames.Data().begin(), rawFrames.Data().end());
+ return Frames::Decode(rawData);
+}
\ No newline at end of file
diff --git a/src/VirtualPolymeraseReader.cpp b/src/VirtualPolymeraseReader.cpp
new file mode 100644
index 0000000..271a96e
--- /dev/null
+++ b/src/VirtualPolymeraseReader.cpp
@@ -0,0 +1,113 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#include <stdexcept>
+
+#include "pbbam/virtual/VirtualPolymeraseReader.h"
+#include "pbbam/ReadGroupInfo.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+VirtualPolymeraseReader::VirtualPolymeraseReader(
+ const std::string& primaryBamFilePath, const std::string& scrapsBamFilePath)
+ : primaryBamFilePath_(primaryBamFilePath)
+ , scrapsBamFilePath_(scrapsBamFilePath)
+{
+ primaryBamFile_ = std::unique_ptr<BamFile>(new BamFile(primaryBamFilePath_));
+ primaryQuery_ = std::unique_ptr<EntireFileQuery>(new EntireFileQuery(*primaryBamFile_));
+ primaryIt_ = primaryQuery_->begin();
+
+ scrapsBamFile_ = std::unique_ptr<BamFile>(new BamFile(scrapsBamFilePath_));
+ scrapsQuery_ = std::unique_ptr<EntireFileQuery>(new EntireFileQuery(*scrapsBamFile_));
+ scrapsIt_ = scrapsQuery_->begin();
+
+ polyHeader_ = std::unique_ptr<BamHeader>(
+ new BamHeader(primaryBamFile_->Header().ToSam()));
+
+ auto readGroups = polyHeader_->ReadGroups();
+ if (readGroups.empty())
+ throw std::runtime_error("Bam header of the primary bam has no read groups.");
+ readGroups[0].ReadType("POLYMERASE");
+ readGroups[0].Id(readGroups[0].MovieName(), "POLYMERASE");
+ if (readGroups.size() > 1)
+ {
+ std::vector<ReadGroupInfo> singleGroup;
+ singleGroup.emplace_back(std::move(readGroups[0]));
+ readGroups = std::move(singleGroup);
+ polyHeader_->ClearReadGroups();
+ }
+ polyHeader_->ReadGroups(readGroups);
+}
+
+// This method is not thread safe
+VirtualPolymeraseBamRecord VirtualPolymeraseReader::Next()
+{
+ auto bamRecordVec = NextRaw();
+ VirtualPolymeraseBamRecord stitched(std::move(bamRecordVec), *polyHeader_);
+ return std::move(stitched);
+}
+
+std::vector<BamRecord> VirtualPolymeraseReader::NextRaw()
+{
+ std::vector<BamRecord> bamRecordVec;
+
+ // Current hole number, the smallest of scraps and primary.
+ // It can be that the next ZMW is scrap only.
+ int currentHoleNumber = std::min((*primaryIt_).HoleNumber(), (*scrapsIt_).HoleNumber());
+ // collect subreads or hqregions
+ while (primaryIt_ != primaryQuery_->end() && currentHoleNumber == (*primaryIt_).HoleNumber())
+ bamRecordVec.push_back(*primaryIt_++);
+
+ // collect scraps
+ while (scrapsIt_ != scrapsQuery_->end() && currentHoleNumber == (*scrapsIt_).HoleNumber())
+ bamRecordVec.push_back(*scrapsIt_++);
+
+ return bamRecordVec;
+}
+
+bool VirtualPolymeraseReader::HasNext()
+{
+ // Return true until both iterators are at the end of the query
+ return primaryIt_ != primaryQuery_->end() || scrapsIt_ != scrapsQuery_->end();
+}
+
+BamHeader VirtualPolymeraseReader::PrimaryHeader()
+{ return primaryBamFile_->Header(); }
+
+BamHeader VirtualPolymeraseReader::ScrapsHeader()
+{ return scrapsBamFile_->Header(); }
diff --git a/src/VirtualRegionTypeMap.cpp b/src/VirtualRegionTypeMap.cpp
new file mode 100644
index 0000000..4839b35
--- /dev/null
+++ b/src/VirtualRegionTypeMap.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#include "pbbam/virtual/VirtualRegionTypeMap.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+std::map<char, VirtualRegionType> VirtualRegionTypeMap::ParseChar
+{
+ { 'A' , VirtualRegionType::ADAPTER },
+ { 'B' , VirtualRegionType::BARCODE },
+ { 'H' , VirtualRegionType::HQREGION },
+ { 'L' , VirtualRegionType::LQREGION }
+};
\ No newline at end of file
diff --git a/src/XmlReader.cpp b/src/XmlReader.cpp
new file mode 100644
index 0000000..5e88e47
--- /dev/null
+++ b/src/XmlReader.cpp
@@ -0,0 +1,154 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "XmlReader.h"
+#include "StringUtils.h"
+#include "pugixml/pugixml.hpp"
+#include <iostream>
+#include <fstream>
+#include <memory>
+#include <vector>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static
+void UpdateRegistry(const string& attributeName,
+ const string& attributeValue,
+ NamespaceRegistry& registry)
+{
+ vector<string> nameParts = Split(attributeName, ':');
+ assert(!nameParts.empty());
+ if (nameParts.size() > 2)
+ throw std::runtime_error("malformed xmlns attribute: " + attributeName);
+
+ const bool isDefault = (nameParts.size() == 1);
+ const XsdType& xsd = registry.XsdForUri(attributeValue);
+
+ if (isDefault)
+ registry.SetDefaultXsd(xsd);
+ else {
+ assert(nameParts.size() == 2);
+ const string& name = nameParts.at(1);
+ const string& uri = attributeValue;
+ NamespaceInfo namespaceInfo(name, uri);
+ registry.Register(xsd, namespaceInfo);
+ }
+}
+
+static
+void FromXml(const pugi::xml_node& xmlNode, DataSetElement& parent)
+{
+ // ignore non-named XML nodes
+ //
+ // pugi::xml separates XML parts into more node types than we use
+ //
+ const string& label = xmlNode.name();
+ if (label.empty())
+ return;
+
+ // label & text
+ DataSetElement e(xmlNode.name());
+ e.Text(xmlNode.text().get());
+
+ // iterate attributes
+ auto attrIter = xmlNode.attributes_begin();
+ auto attrEnd = xmlNode.attributes_end();
+ for ( ; attrIter != attrEnd; ++attrIter )
+ e.Attribute(attrIter->name(), attrIter->value());
+
+ // iterate children, recursively building up subtree
+ auto childIter = xmlNode.begin();
+ auto childEnd = xmlNode.end();
+ for ( ; childIter != childEnd; ++childIter ) {
+ pugi::xml_node childNode = *childIter;
+ FromXml(childNode, e);
+ }
+
+ // add our element to its parent
+ parent.AddChild(e);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+std::unique_ptr<DataSetBase> XmlReader::FromStream(istream& in)
+{
+ pugi::xml_document doc;
+ const pugi::xml_parse_result& loadResult = doc.load(in);
+ if (loadResult.status != pugi::status_ok)
+ throw std::runtime_error(string("could not read XML file, error code:") + to_string(loadResult.status) );
+
+ // parse top-level attributes
+ pugi::xml_node rootNode = doc.document_element();
+ if (rootNode == pugi::xml_node())
+ throw std::runtime_error("could not fetch XML root node");
+
+ // create dataset matching type strings
+ std::unique_ptr<DataSetBase> dataset(new DataSetBase);
+ dataset->Label(rootNode.name());
+
+ // iterate attributes, capture namespace info
+ const string xmlnsPrefix("xmlns");
+ auto attrIter = rootNode.attributes_begin();
+ auto attrEnd = rootNode.attributes_end();
+ for ( ; attrIter != attrEnd; ++attrIter ) {
+ const string& name = attrIter->name();
+ const string& value = attrIter->value();
+ dataset->Attribute(name, value);
+
+ if (name.find(xmlnsPrefix) == 0)
+ UpdateRegistry(name, value, dataset->Namespaces());
+ }
+
+ // iterate children, recursively building up subtree
+ auto childIter = rootNode.begin();
+ auto childEnd = rootNode.end();
+ for ( ; childIter != childEnd; ++childIter ) {
+ pugi::xml_node childNode = *childIter;
+ internal::FromXml(childNode, *dataset.get());
+ }
+
+ return dataset;
+}
diff --git a/src/XmlReader.h b/src/XmlReader.h
new file mode 100644
index 0000000..f5830a3
--- /dev/null
+++ b/src/XmlReader.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef XMLREADER_H
+#define XMLREADER_H
+
+#include "pbbam/DataSet.h"
+#include <iosfwd>
+#include <memory>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class XmlReader
+{
+public:
+ static std::unique_ptr<DataSetBase> FromStream(std::istream& in);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // XMLREADER_H
diff --git a/src/XmlWriter.cpp b/src/XmlWriter.cpp
new file mode 100644
index 0000000..bf42e36
--- /dev/null
+++ b/src/XmlWriter.cpp
@@ -0,0 +1,152 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "XmlWriter.h"
+#include "pbbam/DataSet.h"
+#include "pugixml/pugixml.hpp"
+#include <fstream>
+#include <iostream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static
+string OutputName(const DataSetElement& node,
+ const NamespaceRegistry& registry)
+{
+ if (node.PrefixLabel().empty())
+ return registry.Namespace(node.Xsd()).Name() + ":" + node.LocalNameLabel().to_string();
+ else
+ return node.QualifiedNameLabel(); // is this correct? what if node's contents don't match registry
+ // who gets priority?
+}
+
+static
+void ToXml(const DataSetElement& node,
+ const NamespaceRegistry& registry,
+ pugi::xml_node& parentXml)
+{
+ // create child of parent, w/ label & text
+ const string& label = OutputName(node, registry);
+ if (label.empty())
+ return; // error?
+ pugi::xml_node xmlNode = parentXml.append_child(label.c_str());
+
+ if (!node.Text().empty())
+ xmlNode.text().set(node.Text().c_str());
+
+ // add attributes
+ auto attrIter = node.Attributes().cbegin();
+ auto attrEnd = node.Attributes().cend();
+ for ( ; attrIter != attrEnd; ++attrIter) {
+ const string& name = attrIter->first;
+ if (name.empty())
+ continue;
+ pugi::xml_attribute attr = xmlNode.append_attribute(name.c_str());
+ attr.set_value(attrIter->second.c_str());
+ }
+
+ // additional stuff later? (e.g. comments)
+
+ // iterate children, recursively building up subtree
+ auto childIter = node.Children().cbegin();
+ auto childEnd = node.Children().cend();
+ for ( ; childIter != childEnd; ++childIter) {
+ const DataSetElement& child = (*childIter);
+ ToXml(child, registry, xmlNode);
+ }
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+void XmlWriter::ToStream(const DataSetBase& dataset,
+ ostream& out)
+{
+ pugi::xml_document doc;
+
+ const NamespaceRegistry& registry = dataset.Namespaces();
+
+ // create top-level dataset XML node
+ const string& label = OutputName(dataset, registry);
+ if (label.empty())
+ throw std::runtime_error("could not convert dataset node to XML");
+ pugi::xml_node root = doc.append_child(label.c_str());
+
+ const string& text = dataset.Text();
+ if (!text.empty())
+ root.text().set(text.c_str());
+
+ // add top-level attributes
+ auto attrIter = dataset.Attributes().cbegin();
+ auto attrEnd = dataset.Attributes().cend();
+ for ( ; attrIter != attrEnd; ++attrIter) {
+ const string name = attrIter->first;
+ const string value = attrIter->second;
+ if (name.empty())
+ continue;
+ pugi::xml_attribute attr = root.append_attribute(name.c_str());
+ attr.set_value(value.c_str());
+ }
+
+ // iterate children, recursively building up subtree
+ auto childIter = dataset.Children().cbegin();
+ auto childEnd = dataset.Children().cend();
+ for ( ; childIter != childEnd; ++childIter) {
+ const DataSetElement& child = (*childIter);
+ ToXml(child, registry, root);
+ }
+
+ // write XML to stream
+ pugi::xml_node decl = doc.prepend_child(pugi::node_declaration);
+ decl.append_attribute("version") = "1.0";
+ decl.append_attribute("encoding") = "utf-8";
+
+ // "no escapes" to allow explicit ">" "<" comparison operators in filter parameters
+ // we may remove this if/when comparison is separated from the value
+ doc.save(out, "\t", pugi::format_default | pugi::format_no_escapes, pugi::encoding_utf8);
+}
+
+void XmlWriter::ToStream(const unique_ptr<DataSetBase>& dataset,
+ ostream& out)
+{ ToStream(*dataset.get(), out); }
diff --git a/src/XmlWriter.h b/src/XmlWriter.h
new file mode 100644
index 0000000..7fc457d
--- /dev/null
+++ b/src/XmlWriter.h
@@ -0,0 +1,62 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef XMLWRITER_H
+#define XMLWRITER_H
+
+#include <iosfwd>
+#include <memory>
+
+namespace PacBio {
+namespace BAM {
+
+class DataSetBase;
+
+namespace internal {
+
+class XmlWriter
+{
+public:
+ static void ToStream(const DataSetBase& dataset, std::ostream& out);
+ static void ToStream(const std::unique_ptr<DataSetBase>& dataset, std::ostream& out);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // XMLWRITER_H
diff --git a/src/ZmwGroupQuery.cpp b/src/ZmwGroupQuery.cpp
new file mode 100644
index 0000000..bf76ce3
--- /dev/null
+++ b/src/ZmwGroupQuery.cpp
@@ -0,0 +1,143 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/ZmwGroupQuery.h"
+#include "pbbam/PbiIndex.h"
+#include "pbbam/internal/BamRecordSort.h"
+#include "pbbam/internal/MergeStrategy.h"
+#include "MemoryUtils.h"
+#include <algorithm>
+#include <map>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+//using namespace PacBio::BAM::staging;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class ZmwQueryGroupIterator : public IBamFileGroupIterator
+{
+public:
+ ZmwQueryGroupIterator(const std::vector<int32_t>& zmwWhitelist,
+ const BamFile& file)
+ : IBamFileGroupIterator(file)
+ {
+ // init BAM file for reading
+ htsFile_.reset(sam_open(file.Filename().c_str(), "rb"));
+ if (!htsFile_)
+ throw std::runtime_error("could not open BAM file for reading");
+
+ htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+ if (!htsHeader_)
+ throw std::runtime_error("could not read BAM header data");
+
+ // open index & query for ZMWs
+ PbiIndex index(file.PacBioIndexFilename());
+ for (int32_t zmw : zmwWhitelist)
+ zmwGroups_[zmw] = index.Lookup(ZmwIndexRequest(zmw));
+ }
+
+public:
+ bool GetNext(std::vector<BamRecord>& r)
+ {
+ r.clear();
+ if (zmwGroups_.empty())
+ return false;
+
+ BamRecord record(header_);
+ const IndexResultBlocks& blocks = zmwGroups_.cbegin()->second;
+ for (const IndexResultBlock& block : blocks) {
+
+ // seek to first record in block
+ const int seekResult = bgzf_seek(htsFile_.get()->fp.bgzf, block.virtualOffset_, SEEK_SET);
+ if (seekResult == -1)
+ throw std::runtime_error("could not seek in BAM file");
+
+ // read block records
+ for (size_t i = 0; i < block.numReads_; ++i) {
+ const int readResult = sam_read1(htsFile_.get(),
+ htsHeader_.get(),
+ internal::BamRecordMemory::GetRawData(record).get());
+// record.header_ = fileData_.Header();
+
+ if (readResult >= 0) // success
+ r.push_back(record);
+ else if (readResult == -1) // normal EOF
+ break;
+ else // error (truncated file, etc)
+ throw std::runtime_error("corrupted file, may be truncated");
+ }
+ }
+
+ // pop zmw info & return success
+ zmwGroups_.erase(zmwGroups_.begin());
+ return !r.empty();
+ }
+
+ bool InSameGroup(const BamRecord& lhs, const BamRecord& rhs) const
+ { return lhs.HoleNumber() == rhs.HoleNumber(); }
+
+private:
+ unique_ptr<samFile, internal::HtslibFileDeleter> htsFile_;
+ unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+ map<int32_t, IndexResultBlocks> zmwGroups_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+ZmwGroupQuery::ZmwGroupQuery(const DataSet& dataset)
+ : IGroupQuery(dataset)
+ , whitelist_(/* all dataset ZMWs */)
+{
+ mergeStrategy_.reset(new GroupMergeStrategy<ByZmw>(CreateIterators()));
+}
+
+ZmwGroupQuery::ZmwGroupQuery(const std::vector<int32_t>& zmwWhitelist,
+ const DataSet& dataset)
+ : IGroupQuery(dataset)
+ , whitelist_(zmwWhitelist)
+{
+ mergeStrategy_.reset(new GroupMergeStrategy<ByZmw>(CreateIterators()));
+}
+
+ZmwGroupQuery::FileIterPtr ZmwGroupQuery::CreateIterator(const BamFile& file)
+{ return FileIterPtr(new ZmwQueryGroupIterator(whitelist_, file)); }
diff --git a/src/ZmwQuery.cpp b/src/ZmwQuery.cpp
new file mode 100644
index 0000000..2b25723
--- /dev/null
+++ b/src/ZmwQuery.cpp
@@ -0,0 +1,138 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "pbbam/ZmwQuery.h"
+#include "pbbam/PbiIndex.h"
+#include "pbbam/internal/BamRecordSort.h"
+#include "pbbam/internal/MergeStrategy.h"
+#include "MemoryUtils.h"
+#include <htslib/bgzf.h>
+#include <htslib/sam.h>
+#include <algorithm>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+//using namespace PacBio::BAM::staging;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class ZmwQueryIterator : public IBamFileIterator
+{
+public:
+ ZmwQueryIterator(const std::vector<int32_t>& zmwWhitelist,
+ const BamFile& bamFile)
+ : internal::IBamFileIterator(bamFile)
+ , currentBlockReadCount_(0)
+ , htsFile_(nullptr)
+ , htsHeader_(nullptr)
+ {
+ // init BAM file for reading
+ htsFile_.reset(sam_open(bamFile.Filename().c_str(), "rb"));
+ if (!htsFile_)
+ throw std::runtime_error("could not open BAM file for reading");
+
+ htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+ if (!htsHeader_)
+ throw std::runtime_error("could not read BAM header data");
+
+ // open index & query for ZMWs
+ PbiIndex index(bamFile.PacBioIndexFilename());
+ blocks_ = index.Lookup(ZmwIndexMultiRequest(zmwWhitelist));
+ }
+
+public:
+ bool GetNext(BamRecord& r){
+
+ // no data to fetch, return false
+ if (blocks_.empty())
+ return false;
+
+ // maybe seek to block
+ if (currentBlockReadCount_ == 0) {
+ const int seekResult = bgzf_seek(htsFile_.get()->fp.bgzf, blocks_.at(0).virtualOffset_, SEEK_SET);
+ if (seekResult == -1)
+ throw std::runtime_error("could not seek in BAM file");
+ }
+
+ // read next record
+// r = BamRecord(fileData_.Header());
+ const int readResult = sam_read1(htsFile_.get(),
+ htsHeader_.get(),
+ internal::BamRecordMemory::GetRawData(r).get());
+// r.header_ = fileData_.Header();
+ r.header_ = header_;
+
+ // update counters
+ ++currentBlockReadCount_;
+ if (currentBlockReadCount_ == blocks_.at(0).numReads_) {
+ blocks_.pop_front();
+ currentBlockReadCount_ = 0;
+ }
+
+ // return result of reading
+ if (readResult >= 0) // success
+ return true;
+ else if (readResult == -1) // normal EOF
+ return false;
+ else // error (truncated file, etc)
+ throw std::runtime_error("corrupted file, may be truncated");
+ }
+
+private:
+ IndexResultBlocks blocks_;
+ size_t currentBlockReadCount_;
+ unique_ptr<samFile, internal::HtslibFileDeleter> htsFile_;
+ unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+ZmwQuery::ZmwQuery(const std::vector<int32_t> &zmwWhitelist,
+ const DataSet& dataset)
+ : internal::IQuery(dataset)
+ , whitelist_(zmwWhitelist)
+{
+ mergeStrategy_.reset(new MergeStrategy<ByZmw>(CreateIterators()));
+}
+
+ZmwQuery::FileIterPtr ZmwQuery::CreateIterator(const BamFile& bamFile)
+{ return FileIterPtr(new ZmwQueryIterator(whitelist_, bamFile)); }
diff --git a/src/files.cmake b/src/files.cmake
new file mode 100644
index 0000000..3a399d0
--- /dev/null
+++ b/src/files.cmake
@@ -0,0 +1,152 @@
+
+# headers
+set( PacBioBAM_H
+
+ # API headers
+ ${PacBioBAM_IncludeDir}/pbbam/Accuracy.h
+ ${PacBioBAM_IncludeDir}/pbbam/AlignmentPrinter.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamFile.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamHeader.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamRecord.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamRecordBuilder.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamRecordImpl.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamTagCodec.h
+ ${PacBioBAM_IncludeDir}/pbbam/BamWriter.h
+ ${PacBioBAM_IncludeDir}/pbbam/Cigar.h
+ ${PacBioBAM_IncludeDir}/pbbam/CigarOperation.h
+ ${PacBioBAM_IncludeDir}/pbbam/Config.h
+ ${PacBioBAM_IncludeDir}/pbbam/DataSet.h
+ ${PacBioBAM_IncludeDir}/pbbam/DataSetTypes.h
+ ${PacBioBAM_IncludeDir}/pbbam/DataSetXsd.h
+ ${PacBioBAM_IncludeDir}/pbbam/EntireFileQuery.h
+ ${PacBioBAM_IncludeDir}/pbbam/Frames.h
+ ${PacBioBAM_IncludeDir}/pbbam/GenomicInterval.h
+ ${PacBioBAM_IncludeDir}/pbbam/GenomicIntervalQuery.h
+ ${PacBioBAM_IncludeDir}/pbbam/GroupQuery.h
+ ${PacBioBAM_IncludeDir}/pbbam/GroupQueryBase.h
+ ${PacBioBAM_IncludeDir}/pbbam/IndexedFastaReader.h
+ ${PacBioBAM_IncludeDir}/pbbam/Interval.h
+ ${PacBioBAM_IncludeDir}/pbbam/LocalContextFlags.h
+ ${PacBioBAM_IncludeDir}/pbbam/Orientation.h
+ ${PacBioBAM_IncludeDir}/pbbam/PbiBuilder.h
+ ${PacBioBAM_IncludeDir}/pbbam/PbiFile.h
+ ${PacBioBAM_IncludeDir}/pbbam/PbiIndex.h
+ ${PacBioBAM_IncludeDir}/pbbam/PbiRawData.h
+ ${PacBioBAM_IncludeDir}/pbbam/Position.h
+ ${PacBioBAM_IncludeDir}/pbbam/ProgramInfo.h
+ ${PacBioBAM_IncludeDir}/pbbam/QualityValue.h
+ ${PacBioBAM_IncludeDir}/pbbam/QualityValues.h
+ ${PacBioBAM_IncludeDir}/pbbam/QueryBase.h
+ ${PacBioBAM_IncludeDir}/pbbam/ReadGroupInfo.h
+ ${PacBioBAM_IncludeDir}/pbbam/SamTagCodec.h
+ ${PacBioBAM_IncludeDir}/pbbam/SequenceInfo.h
+ ${PacBioBAM_IncludeDir}/pbbam/Strand.h
+ ${PacBioBAM_IncludeDir}/pbbam/Tag.h
+ ${PacBioBAM_IncludeDir}/pbbam/TagCollection.h
+# ${PacBioBAM_IncludeDir}/pbbam/UnmappedReadsQuery.h
+ ${PacBioBAM_IncludeDir}/pbbam/ZmwGroupQuery.h
+ ${PacBioBAM_IncludeDir}/pbbam/ZmwQuery.h
+
+ # internal headers
+ ${PacBioBAM_IncludeDir}/pbbam/internal/BamRecordSort.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSet.inl
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetBaseTypes.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetBaseTypes.inl
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetElement.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetElement.inl
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetListElement.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetListElement.inl
+ ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetTypes.inl
+ ${PacBioBAM_IncludeDir}/pbbam/internal/FilterEngine.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/IBamFileIterator.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/IMergeStrategy.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/MergeItem.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/MergeStrategy.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/PbiIndex_p.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/PbiIndex_p.inl
+ ${PacBioBAM_IncludeDir}/pbbam/internal/QueryBase.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/SequentialMergeStrategy.h
+ ${PacBioBAM_IncludeDir}/pbbam/internal/Tag.inl
+
+ # virtual headers
+ ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualPolymeraseBamRecord.h
+ ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualPolymeraseReader.h
+ ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualRegion.h
+ ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualRegionType.h
+ ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualRegionTypeMap.h
+
+ ${PacBioBAM_SourceDir}/AssertUtils.h
+ ${PacBioBAM_SourceDir}/DataSetIO.h
+ ${PacBioBAM_SourceDir}/DataSetUtils.h
+ ${PacBioBAM_SourceDir}/FileUtils.h
+ ${PacBioBAM_SourceDir}/FofnReader.h
+ ${PacBioBAM_SourceDir}/MemoryUtils.h
+ ${PacBioBAM_SourceDir}/PbiIndexIO.h
+ ${PacBioBAM_SourceDir}/SequenceUtils.h
+ ${PacBioBAM_SourceDir}/StringUtils.h
+ ${PacBioBAM_SourceDir}/TimeUtils.h
+ ${PacBioBAM_SourceDir}/XmlReader.h
+ ${PacBioBAM_SourceDir}/XmlWriter.h
+ ${PacBioBAM_SourceDir}/pugixml/pugiconfig.hpp
+ ${PacBioBAM_SourceDir}/pugixml/pugixml.hpp
+)
+
+# sources
+set( PacBioBAM_CPP
+
+ # main API headers
+ ${PacBioBAM_SourceDir}/Accuracy.cpp
+ ${PacBioBAM_SourceDir}/AlignmentPrinter.cpp
+ ${PacBioBAM_SourceDir}/AssertUtils.cpp
+ ${PacBioBAM_SourceDir}/BamFile.cpp
+ ${PacBioBAM_SourceDir}/BamHeader.cpp
+ ${PacBioBAM_SourceDir}/BamRecord.cpp
+ ${PacBioBAM_SourceDir}/BamRecordBuilder.cpp
+ ${PacBioBAM_SourceDir}/BamRecordImpl.cpp
+ ${PacBioBAM_SourceDir}/BamTagCodec.cpp
+ ${PacBioBAM_SourceDir}/BamWriter.cpp
+ ${PacBioBAM_SourceDir}/Cigar.cpp
+ ${PacBioBAM_SourceDir}/CigarOperation.cpp
+ ${PacBioBAM_SourceDir}/Config.cpp
+ ${PacBioBAM_SourceDir}/DataSet.cpp
+ ${PacBioBAM_SourceDir}/DataSetBaseTypes.cpp
+ ${PacBioBAM_SourceDir}/DataSetElement.cpp
+ ${PacBioBAM_SourceDir}/DataSetIO.cpp
+ ${PacBioBAM_SourceDir}/DataSetTypes.cpp
+ ${PacBioBAM_SourceDir}/DataSetXsd.cpp
+ ${PacBioBAM_SourceDir}/EntireFileQuery.cpp
+ ${PacBioBAM_SourceDir}/FilterEngine.cpp
+ ${PacBioBAM_SourceDir}/FofnReader.cpp
+ ${PacBioBAM_SourceDir}/Frames.cpp
+ ${PacBioBAM_SourceDir}/GenomicInterval.cpp
+ ${PacBioBAM_SourceDir}/GenomicIntervalQuery.cpp
+ ${PacBioBAM_SourceDir}/GroupQuery.cpp
+ ${PacBioBAM_SourceDir}/IndexedFastaReader.cpp
+ ${PacBioBAM_SourceDir}/MemoryUtils.cpp
+ ${PacBioBAM_SourceDir}/PbiBuilder.cpp
+ ${PacBioBAM_SourceDir}/PbiFile.cpp
+ ${PacBioBAM_SourceDir}/PbiIndex.cpp
+ ${PacBioBAM_SourceDir}/PbiIndexIO.cpp
+ ${PacBioBAM_SourceDir}/PbiRawData.cpp
+ ${PacBioBAM_SourceDir}/ProgramInfo.cpp
+ ${PacBioBAM_SourceDir}/QualityValue.cpp
+ ${PacBioBAM_SourceDir}/QueryBase.cpp
+ ${PacBioBAM_SourceDir}/ReadGroupInfo.cpp
+ ${PacBioBAM_SourceDir}/SamTagCodec.cpp
+ ${PacBioBAM_SourceDir}/SequenceInfo.cpp
+ ${PacBioBAM_SourceDir}/Tag.cpp
+ ${PacBioBAM_SourceDir}/TagCollection.cpp
+# ${PacBioBAM_SourceDir}/UnmappedReadsQuery.cpp
+ ${PacBioBAM_SourceDir}/XmlReader.cpp
+ ${PacBioBAM_SourceDir}/XmlWriter.cpp
+ ${PacBioBAM_SourceDir}/ZmwGroupQuery.cpp
+ ${PacBioBAM_SourceDir}/ZmwQuery.cpp
+
+ # virtual
+ ${PacBioBAM_SourceDir}/VirtualPolymeraseBamRecord.cpp
+ ${PacBioBAM_SourceDir}/VirtualPolymeraseReader.cpp
+ ${PacBioBAM_SourceDir}/VirtualRegionTypeMap.cpp
+
+ # XML I/O
+ ${PacBioBAM_SourceDir}/pugixml/pugixml.cpp
+)
diff --git a/src/pugixml/pugiconfig.hpp b/src/pugixml/pugiconfig.hpp
new file mode 100644
index 0000000..6219dbe
--- /dev/null
+++ b/src/pugixml/pugiconfig.hpp
@@ -0,0 +1,71 @@
+/**
+ * pugixml parser - version 1.5
+ * --------------------------------------------------------
+ * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine at gmail.com)
+ * Report bugs and download new versions at http://pugixml.org/
+ *
+ * This library is distributed under the MIT License. See notice at the end
+ * of this file.
+ *
+ * This work is based on the pugxml parser, which is:
+ * Copyright (C) 2003, by Kristen Wegner (kristen at tima.net)
+ */
+
+#ifndef HEADER_PUGICONFIG_HPP
+#define HEADER_PUGICONFIG_HPP
+
+// Uncomment this to enable wchar_t mode
+// #define PUGIXML_WCHAR_MODE
+
+// Uncomment this to disable XPath
+// #define PUGIXML_NO_XPATH
+
+// Uncomment this to disable STL
+// #define PUGIXML_NO_STL
+
+// Uncomment this to disable exceptions
+// #define PUGIXML_NO_EXCEPTIONS
+
+// Set this to control attributes for public classes/functions, i.e.:
+// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL
+// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL
+// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall
+// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead
+
+// Tune these constants to adjust memory-related behavior
+// #define PUGIXML_MEMORY_PAGE_SIZE 32768
+// #define PUGIXML_MEMORY_OUTPUT_STACK 10240
+// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096
+
+// Uncomment this to switch to header-only version
+// #define PUGIXML_HEADER_ONLY
+
+// Uncomment this to enable long long support
+// #define PUGIXML_HAS_LONG_LONG
+
+#endif
+
+/**
+ * Copyright (c) 2006-2014 Arseny Kapoulkine
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
diff --git a/src/pugixml/pugixml.cpp b/src/pugixml/pugixml.cpp
new file mode 100644
index 0000000..0f696ab
--- /dev/null
+++ b/src/pugixml/pugixml.cpp
@@ -0,0 +1,11525 @@
+/**
+ * pugixml parser - version 1.5
+ * --------------------------------------------------------
+ * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine at gmail.com)
+ * Report bugs and download new versions at http://pugixml.org/
+ *
+ * This library is distributed under the MIT License. See notice at the end
+ * of this file.
+ *
+ * This work is based on the pugxml parser, which is:
+ * Copyright (C) 2003, by Kristen Wegner (kristen at tima.net)
+ */
+
+#ifndef SOURCE_PUGIXML_CPP
+#define SOURCE_PUGIXML_CPP
+
+#include "pugixml.hpp"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#ifdef PUGIXML_WCHAR_MODE
+# include <wchar.h>
+#endif
+
+#ifndef PUGIXML_NO_XPATH
+# include <math.h>
+# include <float.h>
+# ifdef PUGIXML_NO_EXCEPTIONS
+# include <setjmp.h>
+# endif
+#endif
+
+#ifndef PUGIXML_NO_STL
+# include <istream>
+# include <ostream>
+# include <string>
+#endif
+
+// For placement new
+#include <new>
+
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4127) // conditional expression is constant
+# pragma warning(disable: 4324) // structure was padded due to __declspec(align())
+# pragma warning(disable: 4611) // interaction between '_setjmp' and C++ object destruction is non-portable
+# pragma warning(disable: 4702) // unreachable code
+# pragma warning(disable: 4996) // this function or variable may be unsafe
+# pragma warning(disable: 4793) // function compiled as native: presence of '_setjmp' makes a function unmanaged
+#endif
+
+#ifdef __INTEL_COMPILER
+# pragma warning(disable: 177) // function was declared but never referenced
+# pragma warning(disable: 279) // controlling expression is constant
+# pragma warning(disable: 1478 1786) // function was declared "deprecated"
+# pragma warning(disable: 1684) // conversion from pointer to same-sized integral type
+#endif
+
+#if defined(__BORLANDC__) && defined(PUGIXML_HEADER_ONLY)
+# pragma warn -8080 // symbol is declared but never used; disabling this inside push/pop bracket does not make the warning go away
+#endif
+
+#ifdef __BORLANDC__
+# pragma option push
+# pragma warn -8008 // condition is always false
+# pragma warn -8066 // unreachable code
+#endif
+
+#ifdef __SNC__
+// Using diag_push/diag_pop does not disable the warnings inside templates due to a compiler bug
+# pragma diag_suppress=178 // function was declared but never referenced
+# pragma diag_suppress=237 // controlling expression is constant
+#endif
+
+// Inlining controls
+#if defined(_MSC_VER) && _MSC_VER >= 1300
+# define PUGI__NO_INLINE __declspec(noinline)
+#elif defined(__GNUC__)
+# define PUGI__NO_INLINE __attribute__((noinline))
+#else
+# define PUGI__NO_INLINE
+#endif
+
+// Branch weight controls
+#if defined(__GNUC__)
+# define PUGI__UNLIKELY(cond) __builtin_expect(cond, 0)
+#else
+# define PUGI__UNLIKELY(cond) (cond)
+#endif
+
+// Simple static assertion
+#define PUGI__STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; }
+
+// Digital Mars C++ bug workaround for passing char loaded from memory via stack
+#ifdef __DMC__
+# define PUGI__DMC_VOLATILE volatile
+#else
+# define PUGI__DMC_VOLATILE
+#endif
+
+// Borland C++ bug workaround for not defining ::memcpy depending on header include order (can't always use std::memcpy because some compilers don't have it at all)
+#if defined(__BORLANDC__) && !defined(__MEM_H_USING_LIST)
+using std::memcpy;
+using std::memmove;
+#endif
+
+// In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features
+#if defined(_MSC_VER) && !defined(__S3E__)
+# define PUGI__MSVC_CRT_VERSION _MSC_VER
+#endif
+
+#ifdef PUGIXML_HEADER_ONLY
+# define PUGI__NS_BEGIN namespace pugi { namespace impl {
+# define PUGI__NS_END } }
+# define PUGI__FN inline
+# define PUGI__FN_NO_INLINE inline
+#else
+# if defined(_MSC_VER) && _MSC_VER < 1300 // MSVC6 seems to have an amusing bug with anonymous namespaces inside namespaces
+# define PUGI__NS_BEGIN namespace pugi { namespace impl {
+# define PUGI__NS_END } }
+# else
+# define PUGI__NS_BEGIN namespace pugi { namespace impl { namespace {
+# define PUGI__NS_END } } }
+# endif
+# define PUGI__FN
+# define PUGI__FN_NO_INLINE PUGI__NO_INLINE
+#endif
+
+// uintptr_t
+#if !defined(_MSC_VER) || _MSC_VER >= 1600
+# include <stdint.h>
+#else
+# ifndef _UINTPTR_T_DEFINED
+// No native uintptr_t in MSVC6 and in some WinCE versions
+typedef size_t uintptr_t;
+#define _UINTPTR_T_DEFINED
+# endif
+PUGI__NS_BEGIN
+ typedef unsigned __int8 uint8_t;
+ typedef unsigned __int16 uint16_t;
+ typedef unsigned __int32 uint32_t;
+PUGI__NS_END
+#endif
+
+// Memory allocation
+PUGI__NS_BEGIN
+ PUGI__FN void* default_allocate(size_t size)
+ {
+ return malloc(size);
+ }
+
+ PUGI__FN void default_deallocate(void* ptr)
+ {
+ free(ptr);
+ }
+
+ template <typename T>
+ struct xml_memory_management_function_storage
+ {
+ static allocation_function allocate;
+ static deallocation_function deallocate;
+ };
+
+ // Global allocation functions are stored in class statics so that in header mode linker deduplicates them
+ // Without a template<> we'll get multiple definitions of the same static
+ template <typename T> allocation_function xml_memory_management_function_storage<T>::allocate = default_allocate;
+ template <typename T> deallocation_function xml_memory_management_function_storage<T>::deallocate = default_deallocate;
+
+ typedef xml_memory_management_function_storage<int> xml_memory;
+PUGI__NS_END
+
+// String utilities
+PUGI__NS_BEGIN
+ // Get string length
+ PUGI__FN size_t strlength(const char_t* s)
+ {
+ assert(s);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return wcslen(s);
+ #else
+ return strlen(s);
+ #endif
+ }
+
+ // Compare two strings
+ PUGI__FN bool strequal(const char_t* src, const char_t* dst)
+ {
+ assert(src && dst);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return wcscmp(src, dst) == 0;
+ #else
+ return strcmp(src, dst) == 0;
+ #endif
+ }
+
+ // Compare lhs with [rhs_begin, rhs_end)
+ PUGI__FN bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count)
+ {
+ for (size_t i = 0; i < count; ++i)
+ if (lhs[i] != rhs[i])
+ return false;
+
+ return lhs[count] == 0;
+ }
+
+ // Get length of wide string, even if CRT lacks wide character support
+ PUGI__FN size_t strlength_wide(const wchar_t* s)
+ {
+ assert(s);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return wcslen(s);
+ #else
+ const wchar_t* end = s;
+ while (*end) end++;
+ return static_cast<size_t>(end - s);
+ #endif
+ }
+
+#ifdef PUGIXML_WCHAR_MODE
+ // Convert string to wide string, assuming all symbols are ASCII
+ PUGI__FN void widen_ascii(wchar_t* dest, const char* source)
+ {
+ for (const char* i = source; *i; ++i) *dest++ = *i;
+ *dest = 0;
+ }
+#endif
+PUGI__NS_END
+
+#if !defined(PUGIXML_NO_STL) || !defined(PUGIXML_NO_XPATH)
+// auto_ptr-like buffer holder for exception recovery
+PUGI__NS_BEGIN
+ struct buffer_holder
+ {
+ void* data;
+ void (*deleter)(void*);
+
+ buffer_holder(void* data_, void (*deleter_)(void*)): data(data_), deleter(deleter_)
+ {
+ }
+
+ ~buffer_holder()
+ {
+ if (data) deleter(data);
+ }
+
+ void* release()
+ {
+ void* result = data;
+ data = 0;
+ return result;
+ }
+ };
+PUGI__NS_END
+#endif
+
+PUGI__NS_BEGIN
+ static const size_t xml_memory_page_size =
+ #ifdef PUGIXML_MEMORY_PAGE_SIZE
+ PUGIXML_MEMORY_PAGE_SIZE
+ #else
+ 32768
+ #endif
+ ;
+
+ static const uintptr_t xml_memory_page_alignment = 64;
+ static const uintptr_t xml_memory_page_pointer_mask = ~(xml_memory_page_alignment - 1);
+ static const uintptr_t xml_memory_page_contents_shared_mask = 32;
+ static const uintptr_t xml_memory_page_name_allocated_mask = 16;
+ static const uintptr_t xml_memory_page_value_allocated_mask = 8;
+ static const uintptr_t xml_memory_page_type_mask = 7;
+ static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask;
+ static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask;
+
+ #define PUGI__NODETYPE(n) static_cast<xml_node_type>(((n)->header & impl::xml_memory_page_type_mask) + 1)
+
+ struct xml_allocator;
+
+ struct xml_memory_page
+ {
+ static xml_memory_page* construct(void* memory)
+ {
+ xml_memory_page* result = static_cast<xml_memory_page*>(memory);
+
+ result->allocator = 0;
+ result->prev = 0;
+ result->next = 0;
+ result->busy_size = 0;
+ result->freed_size = 0;
+
+ return result;
+ }
+
+ xml_allocator* allocator;
+
+ xml_memory_page* prev;
+ xml_memory_page* next;
+
+ size_t busy_size;
+ size_t freed_size;
+ };
+
+ struct xml_memory_string_header
+ {
+ uint16_t page_offset; // offset from page->data
+ uint16_t full_size; // 0 if string occupies whole page
+ };
+
+ struct xml_allocator
+ {
+ xml_allocator(xml_memory_page* root): _root(root), _busy_size(root->busy_size)
+ {
+ }
+
+ xml_memory_page* allocate_page(size_t data_size)
+ {
+ size_t size = sizeof(xml_memory_page) + data_size;
+
+ // allocate block with some alignment, leaving memory for worst-case padding
+ void* memory = xml_memory::allocate(size + xml_memory_page_alignment);
+ if (!memory) return 0;
+
+ // align to next page boundary (note: this guarantees at least 1 usable byte before the page)
+ char* page_memory = reinterpret_cast<char*>((reinterpret_cast<uintptr_t>(memory) + xml_memory_page_alignment) & ~(xml_memory_page_alignment - 1));
+
+ // prepare page structure
+ xml_memory_page* page = xml_memory_page::construct(page_memory);
+ assert(page);
+
+ page->allocator = _root->allocator;
+
+ // record the offset for freeing the memory block
+ assert(page_memory > memory && page_memory - static_cast<char*>(memory) <= 127);
+ page_memory[-1] = static_cast<char>(page_memory - static_cast<char*>(memory));
+
+ return page;
+ }
+
+ static void deallocate_page(xml_memory_page* page)
+ {
+ char* page_memory = reinterpret_cast<char*>(page);
+
+ xml_memory::deallocate(page_memory - page_memory[-1]);
+ }
+
+ void* allocate_memory_oob(size_t size, xml_memory_page*& out_page);
+
+ void* allocate_memory(size_t size, xml_memory_page*& out_page)
+ {
+ if (_busy_size + size > xml_memory_page_size) return allocate_memory_oob(size, out_page);
+
+ void* buf = reinterpret_cast<char*>(_root) + sizeof(xml_memory_page) + _busy_size;
+
+ _busy_size += size;
+
+ out_page = _root;
+
+ return buf;
+ }
+
+ void deallocate_memory(void* ptr, size_t size, xml_memory_page* page)
+ {
+ if (page == _root) page->busy_size = _busy_size;
+
+ assert(ptr >= reinterpret_cast<char*>(page) + sizeof(xml_memory_page) && ptr < reinterpret_cast<char*>(page) + sizeof(xml_memory_page) + page->busy_size);
+ (void)!ptr;
+
+ page->freed_size += size;
+ assert(page->freed_size <= page->busy_size);
+
+ if (page->freed_size == page->busy_size)
+ {
+ if (page->next == 0)
+ {
+ assert(_root == page);
+
+ // top page freed, just reset sizes
+ page->busy_size = page->freed_size = 0;
+ _busy_size = 0;
+ }
+ else
+ {
+ assert(_root != page);
+ assert(page->prev);
+
+ // remove from the list
+ page->prev->next = page->next;
+ page->next->prev = page->prev;
+
+ // deallocate
+ deallocate_page(page);
+ }
+ }
+ }
+
+ char_t* allocate_string(size_t length)
+ {
+ PUGI__STATIC_ASSERT(xml_memory_page_size <= (1 << 16));
+
+ // allocate memory for string and header block
+ size_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t);
+
+ // round size up to pointer alignment boundary
+ size_t full_size = (size + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1);
+
+ xml_memory_page* page;
+ xml_memory_string_header* header = static_cast<xml_memory_string_header*>(allocate_memory(full_size, page));
+
+ if (!header) return 0;
+
+ // setup header
+ ptrdiff_t page_offset = reinterpret_cast<char*>(header) - reinterpret_cast<char*>(page) - sizeof(xml_memory_page);
+
+ assert(page_offset >= 0 && page_offset < (1 << 16));
+ header->page_offset = static_cast<uint16_t>(page_offset);
+
+ // full_size == 0 for large strings that occupy the whole page
+ assert(full_size < (1 << 16) || (page->busy_size == full_size && page_offset == 0));
+ header->full_size = static_cast<uint16_t>(full_size < (1 << 16) ? full_size : 0);
+
+ // round-trip through void* to avoid 'cast increases required alignment of target type' warning
+ // header is guaranteed a pointer-sized alignment, which should be enough for char_t
+ return static_cast<char_t*>(static_cast<void*>(header + 1));
+ }
+
+ void deallocate_string(char_t* string)
+ {
+ // this function casts pointers through void* to avoid 'cast increases required alignment of target type' warnings
+ // we're guaranteed the proper (pointer-sized) alignment on the input string if it was allocated via allocate_string
+
+ // get header
+ xml_memory_string_header* header = static_cast<xml_memory_string_header*>(static_cast<void*>(string)) - 1;
+ assert(header);
+
+ // deallocate
+ size_t page_offset = sizeof(xml_memory_page) + header->page_offset;
+ xml_memory_page* page = reinterpret_cast<xml_memory_page*>(static_cast<void*>(reinterpret_cast<char*>(header) - page_offset));
+
+ // if full_size == 0 then this string occupies the whole page
+ size_t full_size = header->full_size == 0 ? page->busy_size : header->full_size;
+
+ deallocate_memory(header, full_size, page);
+ }
+
+ xml_memory_page* _root;
+ size_t _busy_size;
+ };
+
+ PUGI__FN_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page)
+ {
+ const size_t large_allocation_threshold = xml_memory_page_size / 4;
+
+ xml_memory_page* page = allocate_page(size <= large_allocation_threshold ? xml_memory_page_size : size);
+ out_page = page;
+
+ if (!page) return 0;
+
+ if (size <= large_allocation_threshold)
+ {
+ _root->busy_size = _busy_size;
+
+ // insert page at the end of linked list
+ page->prev = _root;
+ _root->next = page;
+ _root = page;
+
+ _busy_size = size;
+ }
+ else
+ {
+ // insert page before the end of linked list, so that it is deleted as soon as possible
+ // the last page is not deleted even if it's empty (see deallocate_memory)
+ assert(_root->prev);
+
+ page->prev = _root->prev;
+ page->next = _root;
+
+ _root->prev->next = page;
+ _root->prev = page;
+ }
+
+ // allocate inside page
+ page->busy_size = size;
+
+ return reinterpret_cast<char*>(page) + sizeof(xml_memory_page);
+ }
+PUGI__NS_END
+
+namespace pugi
+{
+ /// A 'name=value' XML attribute structure.
+ struct xml_attribute_struct
+ {
+ /// Default ctor
+ xml_attribute_struct(impl::xml_memory_page* page): header(reinterpret_cast<uintptr_t>(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0)
+ {
+ }
+
+ uintptr_t header;
+
+ char_t* name; ///< Pointer to attribute name.
+ char_t* value; ///< Pointer to attribute value.
+
+ xml_attribute_struct* prev_attribute_c; ///< Previous attribute (cyclic list)
+ xml_attribute_struct* next_attribute; ///< Next attribute
+ };
+
+ /// An XML document tree node.
+ struct xml_node_struct
+ {
+ /// Default ctor
+ /// \param type - node type
+ xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(reinterpret_cast<uintptr_t>(page) | (type - 1)), parent(0), name(0), value(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0)
+ {
+ }
+
+ uintptr_t header;
+
+ xml_node_struct* parent; ///< Pointer to parent
+
+ char_t* name; ///< Pointer to element name.
+ char_t* value; ///< Pointer to any associated string data.
+
+ xml_node_struct* first_child; ///< First child
+
+ xml_node_struct* prev_sibling_c; ///< Left brother (cyclic list)
+ xml_node_struct* next_sibling; ///< Right brother
+
+ xml_attribute_struct* first_attribute; ///< First attribute
+ };
+}
+
+PUGI__NS_BEGIN
+ struct xml_extra_buffer
+ {
+ char_t* buffer;
+ xml_extra_buffer* next;
+ };
+
+ struct xml_document_struct: public xml_node_struct, public xml_allocator
+ {
+ xml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0), extra_buffers(0)
+ {
+ }
+
+ const char_t* buffer;
+
+ xml_extra_buffer* extra_buffers;
+ };
+
+ inline xml_allocator& get_allocator(const xml_node_struct* node)
+ {
+ assert(node);
+
+ return *reinterpret_cast<xml_memory_page*>(node->header & xml_memory_page_pointer_mask)->allocator;
+ }
+
+ template <typename Object> inline xml_document_struct& get_document(const Object* object)
+ {
+ assert(object);
+
+ return *static_cast<xml_document_struct*>(reinterpret_cast<xml_memory_page*>(object->header & xml_memory_page_pointer_mask)->allocator);
+ }
+PUGI__NS_END
+
+// Low-level DOM operations
+PUGI__NS_BEGIN
+ inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc)
+ {
+ xml_memory_page* page;
+ void* memory = alloc.allocate_memory(sizeof(xml_attribute_struct), page);
+
+ return new (memory) xml_attribute_struct(page);
+ }
+
+ inline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type)
+ {
+ xml_memory_page* page;
+ void* memory = alloc.allocate_memory(sizeof(xml_node_struct), page);
+
+ return new (memory) xml_node_struct(page, type);
+ }
+
+ inline void destroy_attribute(xml_attribute_struct* a, xml_allocator& alloc)
+ {
+ uintptr_t header = a->header;
+
+ if (header & impl::xml_memory_page_name_allocated_mask) alloc.deallocate_string(a->name);
+ if (header & impl::xml_memory_page_value_allocated_mask) alloc.deallocate_string(a->value);
+
+ alloc.deallocate_memory(a, sizeof(xml_attribute_struct), reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask));
+ }
+
+ inline void destroy_node(xml_node_struct* n, xml_allocator& alloc)
+ {
+ uintptr_t header = n->header;
+
+ if (header & impl::xml_memory_page_name_allocated_mask) alloc.deallocate_string(n->name);
+ if (header & impl::xml_memory_page_value_allocated_mask) alloc.deallocate_string(n->value);
+
+ for (xml_attribute_struct* attr = n->first_attribute; attr; )
+ {
+ xml_attribute_struct* next = attr->next_attribute;
+
+ destroy_attribute(attr, alloc);
+
+ attr = next;
+ }
+
+ for (xml_node_struct* child = n->first_child; child; )
+ {
+ xml_node_struct* next = child->next_sibling;
+
+ destroy_node(child, alloc);
+
+ child = next;
+ }
+
+ alloc.deallocate_memory(n, sizeof(xml_node_struct), reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask));
+ }
+
+ inline void append_node(xml_node_struct* child, xml_node_struct* node)
+ {
+ child->parent = node;
+
+ xml_node_struct* head = node->first_child;
+
+ if (head)
+ {
+ xml_node_struct* tail = head->prev_sibling_c;
+
+ tail->next_sibling = child;
+ child->prev_sibling_c = tail;
+ head->prev_sibling_c = child;
+ }
+ else
+ {
+ node->first_child = child;
+ child->prev_sibling_c = child;
+ }
+ }
+
+ inline void prepend_node(xml_node_struct* child, xml_node_struct* node)
+ {
+ child->parent = node;
+
+ xml_node_struct* head = node->first_child;
+
+ if (head)
+ {
+ child->prev_sibling_c = head->prev_sibling_c;
+ head->prev_sibling_c = child;
+ }
+ else
+ child->prev_sibling_c = child;
+
+ child->next_sibling = head;
+ node->first_child = child;
+ }
+
+ inline void insert_node_after(xml_node_struct* child, xml_node_struct* node)
+ {
+ xml_node_struct* parent = node->parent;
+
+ child->parent = parent;
+
+ if (node->next_sibling)
+ node->next_sibling->prev_sibling_c = child;
+ else
+ parent->first_child->prev_sibling_c = child;
+
+ child->next_sibling = node->next_sibling;
+ child->prev_sibling_c = node;
+
+ node->next_sibling = child;
+ }
+
+ inline void insert_node_before(xml_node_struct* child, xml_node_struct* node)
+ {
+ xml_node_struct* parent = node->parent;
+
+ child->parent = parent;
+
+ if (node->prev_sibling_c->next_sibling)
+ node->prev_sibling_c->next_sibling = child;
+ else
+ parent->first_child = child;
+
+ child->prev_sibling_c = node->prev_sibling_c;
+ child->next_sibling = node;
+
+ node->prev_sibling_c = child;
+ }
+
+ inline void remove_node(xml_node_struct* node)
+ {
+ xml_node_struct* parent = node->parent;
+
+ if (node->next_sibling)
+ node->next_sibling->prev_sibling_c = node->prev_sibling_c;
+ else
+ parent->first_child->prev_sibling_c = node->prev_sibling_c;
+
+ if (node->prev_sibling_c->next_sibling)
+ node->prev_sibling_c->next_sibling = node->next_sibling;
+ else
+ parent->first_child = node->next_sibling;
+
+ node->parent = 0;
+ node->prev_sibling_c = 0;
+ node->next_sibling = 0;
+ }
+
+ inline void append_attribute(xml_attribute_struct* attr, xml_node_struct* node)
+ {
+ xml_attribute_struct* head = node->first_attribute;
+
+ if (head)
+ {
+ xml_attribute_struct* tail = head->prev_attribute_c;
+
+ tail->next_attribute = attr;
+ attr->prev_attribute_c = tail;
+ head->prev_attribute_c = attr;
+ }
+ else
+ {
+ node->first_attribute = attr;
+ attr->prev_attribute_c = attr;
+ }
+ }
+
+ inline void prepend_attribute(xml_attribute_struct* attr, xml_node_struct* node)
+ {
+ xml_attribute_struct* head = node->first_attribute;
+
+ if (head)
+ {
+ attr->prev_attribute_c = head->prev_attribute_c;
+ head->prev_attribute_c = attr;
+ }
+ else
+ attr->prev_attribute_c = attr;
+
+ attr->next_attribute = head;
+ node->first_attribute = attr;
+ }
+
+ inline void insert_attribute_after(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node)
+ {
+ if (place->next_attribute)
+ place->next_attribute->prev_attribute_c = attr;
+ else
+ node->first_attribute->prev_attribute_c = attr;
+
+ attr->next_attribute = place->next_attribute;
+ attr->prev_attribute_c = place;
+ place->next_attribute = attr;
+ }
+
+ inline void insert_attribute_before(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node)
+ {
+ if (place->prev_attribute_c->next_attribute)
+ place->prev_attribute_c->next_attribute = attr;
+ else
+ node->first_attribute = attr;
+
+ attr->prev_attribute_c = place->prev_attribute_c;
+ attr->next_attribute = place;
+ place->prev_attribute_c = attr;
+ }
+
+ inline void remove_attribute(xml_attribute_struct* attr, xml_node_struct* node)
+ {
+ if (attr->next_attribute)
+ attr->next_attribute->prev_attribute_c = attr->prev_attribute_c;
+ else
+ node->first_attribute->prev_attribute_c = attr->prev_attribute_c;
+
+ if (attr->prev_attribute_c->next_attribute)
+ attr->prev_attribute_c->next_attribute = attr->next_attribute;
+ else
+ node->first_attribute = attr->next_attribute;
+
+ attr->prev_attribute_c = 0;
+ attr->next_attribute = 0;
+ }
+
+ PUGI__FN_NO_INLINE xml_node_struct* append_new_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element)
+ {
+ xml_node_struct* child = allocate_node(alloc, type);
+ if (!child) return 0;
+
+ append_node(child, node);
+
+ return child;
+ }
+
+ PUGI__FN_NO_INLINE xml_attribute_struct* append_new_attribute(xml_node_struct* node, xml_allocator& alloc)
+ {
+ xml_attribute_struct* attr = allocate_attribute(alloc);
+ if (!attr) return 0;
+
+ append_attribute(attr, node);
+
+ return attr;
+ }
+PUGI__NS_END
+
+// Helper classes for code generation
+PUGI__NS_BEGIN
+ struct opt_false
+ {
+ enum { value = 0 };
+ };
+
+ struct opt_true
+ {
+ enum { value = 1 };
+ };
+PUGI__NS_END
+
+// Unicode utilities
+PUGI__NS_BEGIN
+ inline uint16_t endian_swap(uint16_t value)
+ {
+ return static_cast<uint16_t>(((value & 0xff) << 8) | (value >> 8));
+ }
+
+ inline uint32_t endian_swap(uint32_t value)
+ {
+ return ((value & 0xff) << 24) | ((value & 0xff00) << 8) | ((value & 0xff0000) >> 8) | (value >> 24);
+ }
+
+ struct utf8_counter
+ {
+ typedef size_t value_type;
+
+ static value_type low(value_type result, uint32_t ch)
+ {
+ // U+0000..U+007F
+ if (ch < 0x80) return result + 1;
+ // U+0080..U+07FF
+ else if (ch < 0x800) return result + 2;
+ // U+0800..U+FFFF
+ else return result + 3;
+ }
+
+ static value_type high(value_type result, uint32_t)
+ {
+ // U+10000..U+10FFFF
+ return result + 4;
+ }
+ };
+
+ struct utf8_writer
+ {
+ typedef uint8_t* value_type;
+
+ static value_type low(value_type result, uint32_t ch)
+ {
+ // U+0000..U+007F
+ if (ch < 0x80)
+ {
+ *result = static_cast<uint8_t>(ch);
+ return result + 1;
+ }
+ // U+0080..U+07FF
+ else if (ch < 0x800)
+ {
+ result[0] = static_cast<uint8_t>(0xC0 | (ch >> 6));
+ result[1] = static_cast<uint8_t>(0x80 | (ch & 0x3F));
+ return result + 2;
+ }
+ // U+0800..U+FFFF
+ else
+ {
+ result[0] = static_cast<uint8_t>(0xE0 | (ch >> 12));
+ result[1] = static_cast<uint8_t>(0x80 | ((ch >> 6) & 0x3F));
+ result[2] = static_cast<uint8_t>(0x80 | (ch & 0x3F));
+ return result + 3;
+ }
+ }
+
+ static value_type high(value_type result, uint32_t ch)
+ {
+ // U+10000..U+10FFFF
+ result[0] = static_cast<uint8_t>(0xF0 | (ch >> 18));
+ result[1] = static_cast<uint8_t>(0x80 | ((ch >> 12) & 0x3F));
+ result[2] = static_cast<uint8_t>(0x80 | ((ch >> 6) & 0x3F));
+ result[3] = static_cast<uint8_t>(0x80 | (ch & 0x3F));
+ return result + 4;
+ }
+
+ static value_type any(value_type result, uint32_t ch)
+ {
+ return (ch < 0x10000) ? low(result, ch) : high(result, ch);
+ }
+ };
+
+ struct utf16_counter
+ {
+ typedef size_t value_type;
+
+ static value_type low(value_type result, uint32_t)
+ {
+ return result + 1;
+ }
+
+ static value_type high(value_type result, uint32_t)
+ {
+ return result + 2;
+ }
+ };
+
+ struct utf16_writer
+ {
+ typedef uint16_t* value_type;
+
+ static value_type low(value_type result, uint32_t ch)
+ {
+ *result = static_cast<uint16_t>(ch);
+
+ return result + 1;
+ }
+
+ static value_type high(value_type result, uint32_t ch)
+ {
+ uint32_t msh = static_cast<uint32_t>(ch - 0x10000) >> 10;
+ uint32_t lsh = static_cast<uint32_t>(ch - 0x10000) & 0x3ff;
+
+ result[0] = static_cast<uint16_t>(0xD800 + msh);
+ result[1] = static_cast<uint16_t>(0xDC00 + lsh);
+
+ return result + 2;
+ }
+
+ static value_type any(value_type result, uint32_t ch)
+ {
+ return (ch < 0x10000) ? low(result, ch) : high(result, ch);
+ }
+ };
+
+ struct utf32_counter
+ {
+ typedef size_t value_type;
+
+ static value_type low(value_type result, uint32_t)
+ {
+ return result + 1;
+ }
+
+ static value_type high(value_type result, uint32_t)
+ {
+ return result + 1;
+ }
+ };
+
+ struct utf32_writer
+ {
+ typedef uint32_t* value_type;
+
+ static value_type low(value_type result, uint32_t ch)
+ {
+ *result = ch;
+
+ return result + 1;
+ }
+
+ static value_type high(value_type result, uint32_t ch)
+ {
+ *result = ch;
+
+ return result + 1;
+ }
+
+ static value_type any(value_type result, uint32_t ch)
+ {
+ *result = ch;
+
+ return result + 1;
+ }
+ };
+
+ struct latin1_writer
+ {
+ typedef uint8_t* value_type;
+
+ static value_type low(value_type result, uint32_t ch)
+ {
+ *result = static_cast<uint8_t>(ch > 255 ? '?' : ch);
+
+ return result + 1;
+ }
+
+ static value_type high(value_type result, uint32_t ch)
+ {
+ (void)ch;
+
+ *result = '?';
+
+ return result + 1;
+ }
+ };
+
+ template <size_t size> struct wchar_selector;
+
+ template <> struct wchar_selector<2>
+ {
+ typedef uint16_t type;
+ typedef utf16_counter counter;
+ typedef utf16_writer writer;
+ };
+
+ template <> struct wchar_selector<4>
+ {
+ typedef uint32_t type;
+ typedef utf32_counter counter;
+ typedef utf32_writer writer;
+ };
+
+ typedef wchar_selector<sizeof(wchar_t)>::counter wchar_counter;
+ typedef wchar_selector<sizeof(wchar_t)>::writer wchar_writer;
+
+ template <typename Traits, typename opt_swap = opt_false> struct utf_decoder
+ {
+ static inline typename Traits::value_type decode_utf8_block(const uint8_t* data, size_t size, typename Traits::value_type result)
+ {
+ const uint8_t utf8_byte_mask = 0x3f;
+
+ while (size)
+ {
+ uint8_t lead = *data;
+
+ // 0xxxxxxx -> U+0000..U+007F
+ if (lead < 0x80)
+ {
+ result = Traits::low(result, lead);
+ data += 1;
+ size -= 1;
+
+ // process aligned single-byte (ascii) blocks
+ if ((reinterpret_cast<uintptr_t>(data) & 3) == 0)
+ {
+ // round-trip through void* to silence 'cast increases required alignment of target type' warnings
+ while (size >= 4 && (*static_cast<const uint32_t*>(static_cast<const void*>(data)) & 0x80808080) == 0)
+ {
+ result = Traits::low(result, data[0]);
+ result = Traits::low(result, data[1]);
+ result = Traits::low(result, data[2]);
+ result = Traits::low(result, data[3]);
+ data += 4;
+ size -= 4;
+ }
+ }
+ }
+ // 110xxxxx -> U+0080..U+07FF
+ else if (static_cast<unsigned int>(lead - 0xC0) < 0x20 && size >= 2 && (data[1] & 0xc0) == 0x80)
+ {
+ result = Traits::low(result, ((lead & ~0xC0) << 6) | (data[1] & utf8_byte_mask));
+ data += 2;
+ size -= 2;
+ }
+ // 1110xxxx -> U+0800-U+FFFF
+ else if (static_cast<unsigned int>(lead - 0xE0) < 0x10 && size >= 3 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80)
+ {
+ result = Traits::low(result, ((lead & ~0xE0) << 12) | ((data[1] & utf8_byte_mask) << 6) | (data[2] & utf8_byte_mask));
+ data += 3;
+ size -= 3;
+ }
+ // 11110xxx -> U+10000..U+10FFFF
+ else if (static_cast<unsigned int>(lead - 0xF0) < 0x08 && size >= 4 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80 && (data[3] & 0xc0) == 0x80)
+ {
+ result = Traits::high(result, ((lead & ~0xF0) << 18) | ((data[1] & utf8_byte_mask) << 12) | ((data[2] & utf8_byte_mask) << 6) | (data[3] & utf8_byte_mask));
+ data += 4;
+ size -= 4;
+ }
+ // 10xxxxxx or 11111xxx -> invalid
+ else
+ {
+ data += 1;
+ size -= 1;
+ }
+ }
+
+ return result;
+ }
+
+ static inline typename Traits::value_type decode_utf16_block(const uint16_t* data, size_t size, typename Traits::value_type result)
+ {
+ const uint16_t* end = data + size;
+
+ while (data < end)
+ {
+ unsigned int lead = opt_swap::value ? endian_swap(*data) : *data;
+
+ // U+0000..U+D7FF
+ if (lead < 0xD800)
+ {
+ result = Traits::low(result, lead);
+ data += 1;
+ }
+ // U+E000..U+FFFF
+ else if (static_cast<unsigned int>(lead - 0xE000) < 0x2000)
+ {
+ result = Traits::low(result, lead);
+ data += 1;
+ }
+ // surrogate pair lead
+ else if (static_cast<unsigned int>(lead - 0xD800) < 0x400 && data + 1 < end)
+ {
+ uint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1];
+
+ if (static_cast<unsigned int>(next - 0xDC00) < 0x400)
+ {
+ result = Traits::high(result, 0x10000 + ((lead & 0x3ff) << 10) + (next & 0x3ff));
+ data += 2;
+ }
+ else
+ {
+ data += 1;
+ }
+ }
+ else
+ {
+ data += 1;
+ }
+ }
+
+ return result;
+ }
+
+ static inline typename Traits::value_type decode_utf32_block(const uint32_t* data, size_t size, typename Traits::value_type result)
+ {
+ const uint32_t* end = data + size;
+
+ while (data < end)
+ {
+ uint32_t lead = opt_swap::value ? endian_swap(*data) : *data;
+
+ // U+0000..U+FFFF
+ if (lead < 0x10000)
+ {
+ result = Traits::low(result, lead);
+ data += 1;
+ }
+ // U+10000..U+10FFFF
+ else
+ {
+ result = Traits::high(result, lead);
+ data += 1;
+ }
+ }
+
+ return result;
+ }
+
+ static inline typename Traits::value_type decode_latin1_block(const uint8_t* data, size_t size, typename Traits::value_type result)
+ {
+ for (size_t i = 0; i < size; ++i)
+ {
+ result = Traits::low(result, data[i]);
+ }
+
+ return result;
+ }
+
+ static inline typename Traits::value_type decode_wchar_block_impl(const uint16_t* data, size_t size, typename Traits::value_type result)
+ {
+ return decode_utf16_block(data, size, result);
+ }
+
+ static inline typename Traits::value_type decode_wchar_block_impl(const uint32_t* data, size_t size, typename Traits::value_type result)
+ {
+ return decode_utf32_block(data, size, result);
+ }
+
+ static inline typename Traits::value_type decode_wchar_block(const wchar_t* data, size_t size, typename Traits::value_type result)
+ {
+ return decode_wchar_block_impl(reinterpret_cast<const wchar_selector<sizeof(wchar_t)>::type*>(data), size, result);
+ }
+ };
+
+ template <typename T> PUGI__FN void convert_utf_endian_swap(T* result, const T* data, size_t length)
+ {
+ for (size_t i = 0; i < length; ++i) result[i] = endian_swap(data[i]);
+ }
+
+#ifdef PUGIXML_WCHAR_MODE
+ PUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length)
+ {
+ for (size_t i = 0; i < length; ++i) result[i] = static_cast<wchar_t>(endian_swap(static_cast<wchar_selector<sizeof(wchar_t)>::type>(data[i])));
+ }
+#endif
+PUGI__NS_END
+
+PUGI__NS_BEGIN
+ enum chartype_t
+ {
+ ct_parse_pcdata = 1, // \0, &, \r, <
+ ct_parse_attr = 2, // \0, &, \r, ', "
+ ct_parse_attr_ws = 4, // \0, &, \r, ', ", \n, tab
+ ct_space = 8, // \r, \n, space, tab
+ ct_parse_cdata = 16, // \0, ], >, \r
+ ct_parse_comment = 32, // \0, -, >, \r
+ ct_symbol = 64, // Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .
+ ct_start_symbol = 128 // Any symbol > 127, a-z, A-Z, _, :
+ };
+
+ static const unsigned char chartype_table[256] =
+ {
+ 55, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 63, 0, 0, // 0-15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
+ 8, 0, 6, 0, 0, 0, 7, 6, 0, 0, 0, 0, 0, 96, 64, 0, // 32-47
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 0, 1, 0, 48, 0, // 48-63
+ 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 64-79
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 16, 0, 192, // 80-95
+ 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 96-111
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 0, 0, 0, // 112-127
+
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 128+
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192
+ };
+
+ enum chartypex_t
+ {
+ ctx_special_pcdata = 1, // Any symbol >= 0 and < 32 (except \t, \r, \n), &, <, >
+ ctx_special_attr = 2, // Any symbol >= 0 and < 32 (except \t), &, <, >, "
+ ctx_start_symbol = 4, // Any symbol > 127, a-z, A-Z, _
+ ctx_digit = 8, // 0-9
+ ctx_symbol = 16 // Any symbol > 127, a-z, A-Z, 0-9, _, -, .
+ };
+
+ static const unsigned char chartypex_table[256] =
+ {
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 2, 3, 3, // 0-15
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 16-31
+ 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 16, 16, 0, // 32-47
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 3, 0, 3, 0, // 48-63
+
+ 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 64-79
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 20, // 80-95
+ 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 96-111
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, // 112-127
+
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 128+
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20
+ };
+
+#ifdef PUGIXML_WCHAR_MODE
+ #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast<unsigned int>(c) < 128 ? table[static_cast<unsigned int>(c)] : table[128]) & (ct))
+#else
+ #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast<unsigned char>(c)] & (ct))
+#endif
+
+ #define PUGI__IS_CHARTYPE(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartype_table)
+ #define PUGI__IS_CHARTYPEX(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartypex_table)
+
+ PUGI__FN bool is_little_endian()
+ {
+ unsigned int ui = 1;
+
+ return *reinterpret_cast<unsigned char*>(&ui) == 1;
+ }
+
+ PUGI__FN xml_encoding get_wchar_encoding()
+ {
+ PUGI__STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4);
+
+ if (sizeof(wchar_t) == 2)
+ return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+ else
+ return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+ }
+
+ PUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
+ {
+ // look for BOM in first few bytes
+ if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be;
+ if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le;
+ if (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be;
+ if (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le;
+ if (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8;
+
+ // look for <, <? or <?xm in various encodings
+ if (d0 == 0 && d1 == 0 && d2 == 0 && d3 == 0x3c) return encoding_utf32_be;
+ if (d0 == 0x3c && d1 == 0 && d2 == 0 && d3 == 0) return encoding_utf32_le;
+ if (d0 == 0 && d1 == 0x3c && d2 == 0 && d3 == 0x3f) return encoding_utf16_be;
+ if (d0 == 0x3c && d1 == 0 && d2 == 0x3f && d3 == 0) return encoding_utf16_le;
+ if (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d) return encoding_utf8;
+
+ // look for utf16 < followed by node name (this may fail, but is better than utf8 since it's zero terminated so early)
+ if (d0 == 0 && d1 == 0x3c) return encoding_utf16_be;
+ if (d0 == 0x3c && d1 == 0) return encoding_utf16_le;
+
+ // no known BOM detected, assume utf8
+ return encoding_utf8;
+ }
+
+ PUGI__FN xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size)
+ {
+ // replace wchar encoding with utf implementation
+ if (encoding == encoding_wchar) return get_wchar_encoding();
+
+ // replace utf16 encoding with utf16 with specific endianness
+ if (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+ // replace utf32 encoding with utf32 with specific endianness
+ if (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+ // only do autodetection if no explicit encoding is requested
+ if (encoding != encoding_auto) return encoding;
+
+ // skip encoding autodetection if input buffer is too small
+ if (size < 4) return encoding_utf8;
+
+ // try to guess encoding (based on XML specification, Appendix F.1)
+ const uint8_t* data = static_cast<const uint8_t*>(contents);
+
+ PUGI__DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3];
+
+ return guess_buffer_encoding(d0, d1, d2, d3);
+ }
+
+ PUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
+ {
+ size_t length = size / sizeof(char_t);
+
+ if (is_mutable)
+ {
+ out_buffer = static_cast<char_t*>(const_cast<void*>(contents));
+ out_length = length;
+ }
+ else
+ {
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ if (contents)
+ memcpy(buffer, contents, length * sizeof(char_t));
+ else
+ assert(length == 0);
+
+ buffer[length] = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+ }
+
+ return true;
+ }
+
+#ifdef PUGIXML_WCHAR_MODE
+ PUGI__FN bool need_endian_swap_utf(xml_encoding le, xml_encoding re)
+ {
+ return (le == encoding_utf16_be && re == encoding_utf16_le) || (le == encoding_utf16_le && re == encoding_utf16_be) ||
+ (le == encoding_utf32_be && re == encoding_utf32_le) || (le == encoding_utf32_le && re == encoding_utf32_be);
+ }
+
+ PUGI__FN bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
+ {
+ const char_t* data = static_cast<const char_t*>(contents);
+ size_t length = size / sizeof(char_t);
+
+ if (is_mutable)
+ {
+ char_t* buffer = const_cast<char_t*>(data);
+
+ convert_wchar_endian_swap(buffer, data, length);
+
+ out_buffer = buffer;
+ out_length = length;
+ }
+ else
+ {
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ convert_wchar_endian_swap(buffer, data, length);
+ buffer[length] = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+ }
+
+ return true;
+ }
+
+ PUGI__FN bool convert_buffer_utf8(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size)
+ {
+ const uint8_t* data = static_cast<const uint8_t*>(contents);
+ size_t data_length = size;
+
+ // first pass: get length in wchar_t units
+ size_t length = utf_decoder<wchar_counter>::decode_utf8_block(data, data_length, 0);
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // second pass: convert utf8 input to wchar_t
+ wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+ wchar_writer::value_type oend = utf_decoder<wchar_writer>::decode_utf8_block(data, data_length, obegin);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ template <typename opt_swap> PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+ {
+ const uint16_t* data = static_cast<const uint16_t*>(contents);
+ size_t data_length = size / sizeof(uint16_t);
+
+ // first pass: get length in wchar_t units
+ size_t length = utf_decoder<wchar_counter, opt_swap>::decode_utf16_block(data, data_length, 0);
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // second pass: convert utf16 input to wchar_t
+ wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+ wchar_writer::value_type oend = utf_decoder<wchar_writer, opt_swap>::decode_utf16_block(data, data_length, obegin);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ template <typename opt_swap> PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+ {
+ const uint32_t* data = static_cast<const uint32_t*>(contents);
+ size_t data_length = size / sizeof(uint32_t);
+
+ // first pass: get length in wchar_t units
+ size_t length = utf_decoder<wchar_counter, opt_swap>::decode_utf32_block(data, data_length, 0);
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // second pass: convert utf32 input to wchar_t
+ wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+ wchar_writer::value_type oend = utf_decoder<wchar_writer, opt_swap>::decode_utf32_block(data, data_length, obegin);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size)
+ {
+ const uint8_t* data = static_cast<const uint8_t*>(contents);
+ size_t data_length = size;
+
+ // get length in wchar_t units
+ size_t length = data_length;
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // convert latin1 input to wchar_t
+ wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+ wchar_writer::value_type oend = utf_decoder<wchar_writer>::decode_latin1_block(data, data_length, obegin);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)
+ {
+ // get native encoding
+ xml_encoding wchar_encoding = get_wchar_encoding();
+
+ // fast path: no conversion required
+ if (encoding == wchar_encoding) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);
+
+ // only endian-swapping is required
+ if (need_endian_swap_utf(encoding, wchar_encoding)) return convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable);
+
+ // source encoding is utf8
+ if (encoding == encoding_utf8) return convert_buffer_utf8(out_buffer, out_length, contents, size);
+
+ // source encoding is utf16
+ if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+ {
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+ return (native_encoding == encoding) ?
+ convert_buffer_utf16(out_buffer, out_length, contents, size, opt_false()) :
+ convert_buffer_utf16(out_buffer, out_length, contents, size, opt_true());
+ }
+
+ // source encoding is utf32
+ if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+ {
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+ return (native_encoding == encoding) ?
+ convert_buffer_utf32(out_buffer, out_length, contents, size, opt_false()) :
+ convert_buffer_utf32(out_buffer, out_length, contents, size, opt_true());
+ }
+
+ // source encoding is latin1
+ if (encoding == encoding_latin1) return convert_buffer_latin1(out_buffer, out_length, contents, size);
+
+ assert(!"Invalid encoding");
+ return false;
+ }
+#else
+ template <typename opt_swap> PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+ {
+ const uint16_t* data = static_cast<const uint16_t*>(contents);
+ size_t data_length = size / sizeof(uint16_t);
+
+ // first pass: get length in utf8 units
+ size_t length = utf_decoder<utf8_counter, opt_swap>::decode_utf16_block(data, data_length, 0);
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // second pass: convert utf16 input to utf8
+ uint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);
+ uint8_t* oend = utf_decoder<utf8_writer, opt_swap>::decode_utf16_block(data, data_length, obegin);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ template <typename opt_swap> PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+ {
+ const uint32_t* data = static_cast<const uint32_t*>(contents);
+ size_t data_length = size / sizeof(uint32_t);
+
+ // first pass: get length in utf8 units
+ size_t length = utf_decoder<utf8_counter, opt_swap>::decode_utf32_block(data, data_length, 0);
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // second pass: convert utf32 input to utf8
+ uint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);
+ uint8_t* oend = utf_decoder<utf8_writer, opt_swap>::decode_utf32_block(data, data_length, obegin);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ PUGI__FN size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size)
+ {
+ for (size_t i = 0; i < size; ++i)
+ if (data[i] > 127)
+ return i;
+
+ return size;
+ }
+
+ PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
+ {
+ const uint8_t* data = static_cast<const uint8_t*>(contents);
+ size_t data_length = size;
+
+ // get size of prefix that does not need utf8 conversion
+ size_t prefix_length = get_latin1_7bit_prefix_length(data, data_length);
+ assert(prefix_length <= data_length);
+
+ const uint8_t* postfix = data + prefix_length;
+ size_t postfix_length = data_length - prefix_length;
+
+ // if no conversion is needed, just return the original buffer
+ if (postfix_length == 0) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);
+
+ // first pass: get length in utf8 units
+ size_t length = prefix_length + utf_decoder<utf8_counter>::decode_latin1_block(postfix, postfix_length, 0);
+
+ // allocate buffer of suitable length
+ char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!buffer) return false;
+
+ // second pass: convert latin1 input to utf8
+ memcpy(buffer, data, prefix_length);
+
+ uint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);
+ uint8_t* oend = utf_decoder<utf8_writer>::decode_latin1_block(postfix, postfix_length, obegin + prefix_length);
+
+ assert(oend == obegin + length);
+ *oend = 0;
+
+ out_buffer = buffer;
+ out_length = length + 1;
+
+ return true;
+ }
+
+ PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)
+ {
+ // fast path: no conversion required
+ if (encoding == encoding_utf8) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);
+
+ // source encoding is utf16
+ if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+ {
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+ return (native_encoding == encoding) ?
+ convert_buffer_utf16(out_buffer, out_length, contents, size, opt_false()) :
+ convert_buffer_utf16(out_buffer, out_length, contents, size, opt_true());
+ }
+
+ // source encoding is utf32
+ if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+ {
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+ return (native_encoding == encoding) ?
+ convert_buffer_utf32(out_buffer, out_length, contents, size, opt_false()) :
+ convert_buffer_utf32(out_buffer, out_length, contents, size, opt_true());
+ }
+
+ // source encoding is latin1
+ if (encoding == encoding_latin1) return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable);
+
+ assert(!"Invalid encoding");
+ return false;
+ }
+#endif
+
+ PUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length)
+ {
+ // get length in utf8 characters
+ return utf_decoder<utf8_counter>::decode_wchar_block(str, length, 0);
+ }
+
+ PUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length)
+ {
+ // convert to utf8
+ uint8_t* begin = reinterpret_cast<uint8_t*>(buffer);
+ uint8_t* end = utf_decoder<utf8_writer>::decode_wchar_block(str, length, begin);
+
+ assert(begin + size == end);
+ (void)!end;
+
+ // zero-terminate
+ buffer[size] = 0;
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length)
+ {
+ // first pass: get length in utf8 characters
+ size_t size = as_utf8_begin(str, length);
+
+ // allocate resulting string
+ std::string result;
+ result.resize(size);
+
+ // second pass: convert to utf8
+ if (size > 0) as_utf8_end(&result[0], size, str, length);
+
+ return result;
+ }
+
+ PUGI__FN std::basic_string<wchar_t> as_wide_impl(const char* str, size_t size)
+ {
+ const uint8_t* data = reinterpret_cast<const uint8_t*>(str);
+
+ // first pass: get length in wchar_t units
+ size_t length = utf_decoder<wchar_counter>::decode_utf8_block(data, size, 0);
+
+ // allocate resulting string
+ std::basic_string<wchar_t> result;
+ result.resize(length);
+
+ // second pass: convert to wchar_t
+ if (length > 0)
+ {
+ wchar_writer::value_type begin = reinterpret_cast<wchar_writer::value_type>(&result[0]);
+ wchar_writer::value_type end = utf_decoder<wchar_writer>::decode_utf8_block(data, size, begin);
+
+ assert(begin + length == end);
+ (void)!end;
+ }
+
+ return result;
+ }
+#endif
+
+ inline bool strcpy_insitu_allow(size_t length, uintptr_t header, uintptr_t header_mask, char_t* target)
+ {
+ // never reuse shared memory
+ if (header & xml_memory_page_contents_shared_mask) return false;
+
+ size_t target_length = strlength(target);
+
+ // always reuse document buffer memory if possible
+ if ((header & header_mask) == 0) return target_length >= length;
+
+ // reuse heap memory if waste is not too great
+ const size_t reuse_threshold = 32;
+
+ return target_length >= length && (target_length < reuse_threshold || target_length - length < target_length / 2);
+ }
+
+ PUGI__FN bool strcpy_insitu(char_t*& dest, uintptr_t& header, uintptr_t header_mask, const char_t* source)
+ {
+ assert(header);
+
+ size_t source_length = strlength(source);
+
+ if (source_length == 0)
+ {
+ // empty string and null pointer are equivalent, so just deallocate old memory
+ xml_allocator* alloc = reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask)->allocator;
+
+ if (header & header_mask) alloc->deallocate_string(dest);
+
+ // mark the string as not allocated
+ dest = 0;
+ header &= ~header_mask;
+
+ return true;
+ }
+ else if (dest && strcpy_insitu_allow(source_length, header, header_mask, dest))
+ {
+ // we can reuse old buffer, so just copy the new data (including zero terminator)
+ memcpy(dest, source, (source_length + 1) * sizeof(char_t));
+
+ return true;
+ }
+ else
+ {
+ xml_allocator* alloc = reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask)->allocator;
+
+ // allocate new buffer
+ char_t* buf = alloc->allocate_string(source_length + 1);
+ if (!buf) return false;
+
+ // copy the string (including zero terminator)
+ memcpy(buf, source, (source_length + 1) * sizeof(char_t));
+
+ // deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures)
+ if (header & header_mask) alloc->deallocate_string(dest);
+
+ // the string is now allocated, so set the flag
+ dest = buf;
+ header |= header_mask;
+
+ return true;
+ }
+ }
+
+ struct gap
+ {
+ char_t* end;
+ size_t size;
+
+ gap(): end(0), size(0)
+ {
+ }
+
+ // Push new gap, move s count bytes further (skipping the gap).
+ // Collapse previous gap.
+ void push(char_t*& s, size_t count)
+ {
+ if (end) // there was a gap already; collapse it
+ {
+ // Move [old_gap_end, new_gap_start) to [old_gap_start, ...)
+ assert(s >= end);
+ memmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));
+ }
+
+ s += count; // end of current gap
+
+ // "merge" two gaps
+ end = s;
+ size += count;
+ }
+
+ // Collapse all gaps, return past-the-end pointer
+ char_t* flush(char_t* s)
+ {
+ if (end)
+ {
+ // Move [old_gap_end, current_pos) to [old_gap_start, ...)
+ assert(s >= end);
+ memmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));
+
+ return s - size;
+ }
+ else return s;
+ }
+ };
+
+ PUGI__FN char_t* strconv_escape(char_t* s, gap& g)
+ {
+ char_t* stre = s + 1;
+
+ switch (*stre)
+ {
+ case '#': // &#...
+ {
+ unsigned int ucsc = 0;
+
+ if (stre[1] == 'x') // &#x... (hex code)
+ {
+ stre += 2;
+
+ char_t ch = *stre;
+
+ if (ch == ';') return stre;
+
+ for (;;)
+ {
+ if (static_cast<unsigned int>(ch - '0') <= 9)
+ ucsc = 16 * ucsc + (ch - '0');
+ else if (static_cast<unsigned int>((ch | ' ') - 'a') <= 5)
+ ucsc = 16 * ucsc + ((ch | ' ') - 'a' + 10);
+ else if (ch == ';')
+ break;
+ else // cancel
+ return stre;
+
+ ch = *++stre;
+ }
+
+ ++stre;
+ }
+ else // &#... (dec code)
+ {
+ char_t ch = *++stre;
+
+ if (ch == ';') return stre;
+
+ for (;;)
+ {
+ if (static_cast<unsigned int>(static_cast<unsigned int>(ch) - '0') <= 9)
+ ucsc = 10 * ucsc + (ch - '0');
+ else if (ch == ';')
+ break;
+ else // cancel
+ return stre;
+
+ ch = *++stre;
+ }
+
+ ++stre;
+ }
+
+ #ifdef PUGIXML_WCHAR_MODE
+ s = reinterpret_cast<char_t*>(wchar_writer::any(reinterpret_cast<wchar_writer::value_type>(s), ucsc));
+ #else
+ s = reinterpret_cast<char_t*>(utf8_writer::any(reinterpret_cast<uint8_t*>(s), ucsc));
+ #endif
+
+ g.push(s, stre - s);
+ return stre;
+ }
+
+ case 'a': // &a
+ {
+ ++stre;
+
+ if (*stre == 'm') // &am
+ {
+ if (*++stre == 'p' && *++stre == ';') // &
+ {
+ *s++ = '&';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ }
+ else if (*stre == 'p') // &ap
+ {
+ if (*++stre == 'o' && *++stre == 's' && *++stre == ';') // '
+ {
+ *s++ = '\'';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ }
+ break;
+ }
+
+ case 'g': // &g
+ {
+ if (*++stre == 't' && *++stre == ';') // >
+ {
+ *s++ = '>';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ break;
+ }
+
+ case 'l': // &l
+ {
+ if (*++stre == 't' && *++stre == ';') // <
+ {
+ *s++ = '<';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ break;
+ }
+
+ case 'q': // &q
+ {
+ if (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // "
+ {
+ *s++ = '"';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return stre;
+ }
+
+ // Parser utilities
+ #define PUGI__ENDSWITH(c, e) ((c) == (e) || ((c) == 0 && endch == (e)))
+ #define PUGI__SKIPWS() { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; }
+ #define PUGI__OPTSET(OPT) ( optmsk & (OPT) )
+ #define PUGI__PUSHNODE(TYPE) { cursor = append_new_node(cursor, alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); }
+ #define PUGI__POPNODE() { cursor = cursor->parent; }
+ #define PUGI__SCANFOR(X) { while (*s != 0 && !(X)) ++s; }
+ #define PUGI__SCANWHILE(X) { while (X) ++s; }
+ #define PUGI__SCANWHILE_UNROLL(X) { for (;;) { char_t ss = s[0]; if (PUGI__UNLIKELY(!(X))) { break; } ss = s[1]; if (PUGI__UNLIKELY(!(X))) { s += 1; break; } ss = s[2]; if (PUGI__UNLIKELY(!(X))) { s += 2; break; } ss = s[3]; if (PUGI__UNLIKELY(!(X))) { s += 3; break; } s += 4; } }
+ #define PUGI__ENDSEG() { ch = *s; *s = 0; ++s; }
+ #define PUGI__THROW_ERROR(err, m) return error_offset = m, error_status = err, static_cast<char_t*>(0)
+ #define PUGI__CHECK_ERROR(err, m) { if (*s == 0) PUGI__THROW_ERROR(err, m); }
+
+ PUGI__FN char_t* strconv_comment(char_t* s, char_t endch)
+ {
+ gap g;
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment));
+
+ if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+ {
+ *s++ = '\n'; // replace first one with 0x0a
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here
+ {
+ *g.flush(s) = 0;
+
+ return s + (s[2] == '>' ? 3 : 2);
+ }
+ else if (*s == 0)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch)
+ {
+ gap g;
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata));
+
+ if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+ {
+ *s++ = '\n'; // replace first one with 0x0a
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here
+ {
+ *g.flush(s) = 0;
+
+ return s + 1;
+ }
+ else if (*s == 0)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ typedef char_t* (*strconv_pcdata_t)(char_t*);
+
+ template <typename opt_trim, typename opt_eol, typename opt_escape> struct strconv_pcdata_impl
+ {
+ static char_t* parse(char_t* s)
+ {
+ gap g;
+
+ char_t* begin = s;
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_pcdata));
+
+ if (*s == '<') // PCDATA ends here
+ {
+ char_t* end = g.flush(s);
+
+ if (opt_trim::value)
+ while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space))
+ --end;
+
+ *end = 0;
+
+ return s + 1;
+ }
+ else if (opt_eol::value && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+ {
+ *s++ = '\n'; // replace first one with 0x0a
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (opt_escape::value && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (*s == 0)
+ {
+ char_t* end = g.flush(s);
+
+ if (opt_trim::value)
+ while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space))
+ --end;
+
+ *end = 0;
+
+ return s;
+ }
+ else ++s;
+ }
+ }
+ };
+
+ PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask)
+ {
+ PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800);
+
+ switch (((optmask >> 4) & 3) | ((optmask >> 9) & 4)) // get bitmask for flags (eol escapes trim)
+ {
+ case 0: return strconv_pcdata_impl<opt_false, opt_false, opt_false>::parse;
+ case 1: return strconv_pcdata_impl<opt_false, opt_false, opt_true>::parse;
+ case 2: return strconv_pcdata_impl<opt_false, opt_true, opt_false>::parse;
+ case 3: return strconv_pcdata_impl<opt_false, opt_true, opt_true>::parse;
+ case 4: return strconv_pcdata_impl<opt_true, opt_false, opt_false>::parse;
+ case 5: return strconv_pcdata_impl<opt_true, opt_false, opt_true>::parse;
+ case 6: return strconv_pcdata_impl<opt_true, opt_true, opt_false>::parse;
+ case 7: return strconv_pcdata_impl<opt_true, opt_true, opt_true>::parse;
+ default: assert(false); return 0; // should not get here
+ }
+ }
+
+ typedef char_t* (*strconv_attribute_t)(char_t*, char_t);
+
+ template <typename opt_escape> struct strconv_attribute_impl
+ {
+ static char_t* parse_wnorm(char_t* s, char_t end_quote)
+ {
+ gap g;
+
+ // trim leading whitespaces
+ if (PUGI__IS_CHARTYPE(*s, ct_space))
+ {
+ char_t* str = s;
+
+ do ++str;
+ while (PUGI__IS_CHARTYPE(*str, ct_space));
+
+ g.push(s, str - s);
+ }
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space));
+
+ if (*s == end_quote)
+ {
+ char_t* str = g.flush(s);
+
+ do *str-- = 0;
+ while (PUGI__IS_CHARTYPE(*str, ct_space));
+
+ return s + 1;
+ }
+ else if (PUGI__IS_CHARTYPE(*s, ct_space))
+ {
+ *s++ = ' ';
+
+ if (PUGI__IS_CHARTYPE(*s, ct_space))
+ {
+ char_t* str = s + 1;
+ while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str;
+
+ g.push(s, str - s);
+ }
+ }
+ else if (opt_escape::value && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (!*s)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ static char_t* parse_wconv(char_t* s, char_t end_quote)
+ {
+ gap g;
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws));
+
+ if (*s == end_quote)
+ {
+ *g.flush(s) = 0;
+
+ return s + 1;
+ }
+ else if (PUGI__IS_CHARTYPE(*s, ct_space))
+ {
+ if (*s == '\r')
+ {
+ *s++ = ' ';
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else *s++ = ' ';
+ }
+ else if (opt_escape::value && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (!*s)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ static char_t* parse_eol(char_t* s, char_t end_quote)
+ {
+ gap g;
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr));
+
+ if (*s == end_quote)
+ {
+ *g.flush(s) = 0;
+
+ return s + 1;
+ }
+ else if (*s == '\r')
+ {
+ *s++ = '\n';
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (opt_escape::value && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (!*s)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ static char_t* parse_simple(char_t* s, char_t end_quote)
+ {
+ gap g;
+
+ while (true)
+ {
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr));
+
+ if (*s == end_quote)
+ {
+ *g.flush(s) = 0;
+
+ return s + 1;
+ }
+ else if (opt_escape::value && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (!*s)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+ };
+
+ PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask)
+ {
+ PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80);
+
+ switch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes)
+ {
+ case 0: return strconv_attribute_impl<opt_false>::parse_simple;
+ case 1: return strconv_attribute_impl<opt_true>::parse_simple;
+ case 2: return strconv_attribute_impl<opt_false>::parse_eol;
+ case 3: return strconv_attribute_impl<opt_true>::parse_eol;
+ case 4: return strconv_attribute_impl<opt_false>::parse_wconv;
+ case 5: return strconv_attribute_impl<opt_true>::parse_wconv;
+ case 6: return strconv_attribute_impl<opt_false>::parse_wconv;
+ case 7: return strconv_attribute_impl<opt_true>::parse_wconv;
+ case 8: return strconv_attribute_impl<opt_false>::parse_wnorm;
+ case 9: return strconv_attribute_impl<opt_true>::parse_wnorm;
+ case 10: return strconv_attribute_impl<opt_false>::parse_wnorm;
+ case 11: return strconv_attribute_impl<opt_true>::parse_wnorm;
+ case 12: return strconv_attribute_impl<opt_false>::parse_wnorm;
+ case 13: return strconv_attribute_impl<opt_true>::parse_wnorm;
+ case 14: return strconv_attribute_impl<opt_false>::parse_wnorm;
+ case 15: return strconv_attribute_impl<opt_true>::parse_wnorm;
+ default: assert(false); return 0; // should not get here
+ }
+ }
+
+ inline xml_parse_result make_parse_result(xml_parse_status status, ptrdiff_t offset = 0)
+ {
+ xml_parse_result result;
+ result.status = status;
+ result.offset = offset;
+
+ return result;
+ }
+
+ struct xml_parser
+ {
+ xml_allocator alloc;
+ char_t* error_offset;
+ xml_parse_status error_status;
+
+ xml_parser(const xml_allocator& alloc_): alloc(alloc_), error_offset(0), error_status(status_ok)
+ {
+ }
+
+ // DOCTYPE consists of nested sections of the following possible types:
+ // <!-- ... -->, <? ... ?>, "...", '...'
+ // <![...]]>
+ // <!...>
+ // First group can not contain nested groups
+ // Second group can contain nested groups of the same type
+ // Third group can contain all other groups
+ char_t* parse_doctype_primitive(char_t* s)
+ {
+ if (*s == '"' || *s == '\'')
+ {
+ // quoted string
+ char_t ch = *s++;
+ PUGI__SCANFOR(*s == ch);
+ if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+ s++;
+ }
+ else if (s[0] == '<' && s[1] == '?')
+ {
+ // <? ... ?>
+ s += 2;
+ PUGI__SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype
+ if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+ s += 2;
+ }
+ else if (s[0] == '<' && s[1] == '!' && s[2] == '-' && s[3] == '-')
+ {
+ s += 4;
+ PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype
+ if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+ s += 4;
+ }
+ else PUGI__THROW_ERROR(status_bad_doctype, s);
+
+ return s;
+ }
+
+ char_t* parse_doctype_ignore(char_t* s)
+ {
+ size_t depth = 0;
+
+ assert(s[0] == '<' && s[1] == '!' && s[2] == '[');
+ s += 3;
+
+ while (*s)
+ {
+ if (s[0] == '<' && s[1] == '!' && s[2] == '[')
+ {
+ // nested ignore section
+ s += 3;
+ depth++;
+ }
+ else if (s[0] == ']' && s[1] == ']' && s[2] == '>')
+ {
+ // ignore section end
+ s += 3;
+
+ if (depth == 0)
+ return s;
+
+ depth--;
+ }
+ else s++;
+ }
+
+ PUGI__THROW_ERROR(status_bad_doctype, s);
+ }
+
+ char_t* parse_doctype_group(char_t* s, char_t endch)
+ {
+ size_t depth = 0;
+
+ assert((s[0] == '<' || s[0] == 0) && s[1] == '!');
+ s += 2;
+
+ while (*s)
+ {
+ if (s[0] == '<' && s[1] == '!' && s[2] != '-')
+ {
+ if (s[2] == '[')
+ {
+ // ignore
+ s = parse_doctype_ignore(s);
+ if (!s) return s;
+ }
+ else
+ {
+ // some control group
+ s += 2;
+ depth++;
+ }
+ }
+ else if (s[0] == '<' || s[0] == '"' || s[0] == '\'')
+ {
+ // unknown tag (forbidden), or some primitive group
+ s = parse_doctype_primitive(s);
+ if (!s) return s;
+ }
+ else if (*s == '>')
+ {
+ if (depth == 0)
+ return s;
+
+ depth--;
+ s++;
+ }
+ else s++;
+ }
+
+ if (depth != 0 || endch != '>') PUGI__THROW_ERROR(status_bad_doctype, s);
+
+ return s;
+ }
+
+ char_t* parse_exclamation(char_t* s, xml_node_struct* cursor, unsigned int optmsk, char_t endch)
+ {
+ // parse node contents, starting with exclamation mark
+ ++s;
+
+ if (*s == '-') // '<!-...'
+ {
+ ++s;
+
+ if (*s == '-') // '<!--...'
+ {
+ ++s;
+
+ if (PUGI__OPTSET(parse_comments))
+ {
+ PUGI__PUSHNODE(node_comment); // Append a new node on the tree.
+ cursor->value = s; // Save the offset.
+ }
+
+ if (PUGI__OPTSET(parse_eol) && PUGI__OPTSET(parse_comments))
+ {
+ s = strconv_comment(s, endch);
+
+ if (!s) PUGI__THROW_ERROR(status_bad_comment, cursor->value);
+ }
+ else
+ {
+ // Scan for terminating '-->'.
+ PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>'));
+ PUGI__CHECK_ERROR(status_bad_comment, s);
+
+ if (PUGI__OPTSET(parse_comments))
+ *s = 0; // Zero-terminate this segment at the first terminating '-'.
+
+ s += (s[2] == '>' ? 3 : 2); // Step over the '\0->'.
+ }
+ }
+ else PUGI__THROW_ERROR(status_bad_comment, s);
+ }
+ else if (*s == '[')
+ {
+ // '<![CDATA[...'
+ if (*++s=='C' && *++s=='D' && *++s=='A' && *++s=='T' && *++s=='A' && *++s == '[')
+ {
+ ++s;
+
+ if (PUGI__OPTSET(parse_cdata))
+ {
+ PUGI__PUSHNODE(node_cdata); // Append a new node on the tree.
+ cursor->value = s; // Save the offset.
+
+ if (PUGI__OPTSET(parse_eol))
+ {
+ s = strconv_cdata(s, endch);
+
+ if (!s) PUGI__THROW_ERROR(status_bad_cdata, cursor->value);
+ }
+ else
+ {
+ // Scan for terminating ']]>'.
+ PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));
+ PUGI__CHECK_ERROR(status_bad_cdata, s);
+
+ *s++ = 0; // Zero-terminate this segment.
+ }
+ }
+ else // Flagged for discard, but we still have to scan for the terminator.
+ {
+ // Scan for terminating ']]>'.
+ PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));
+ PUGI__CHECK_ERROR(status_bad_cdata, s);
+
+ ++s;
+ }
+
+ s += (s[1] == '>' ? 2 : 1); // Step over the last ']>'.
+ }
+ else PUGI__THROW_ERROR(status_bad_cdata, s);
+ }
+ else if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && PUGI__ENDSWITH(s[6], 'E'))
+ {
+ s -= 2;
+
+ if (cursor->parent) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+ char_t* mark = s + 9;
+
+ s = parse_doctype_group(s, endch);
+ if (!s) return s;
+
+ assert((*s == 0 && endch == '>') || *s == '>');
+ if (*s) *s++ = 0;
+
+ if (PUGI__OPTSET(parse_doctype))
+ {
+ while (PUGI__IS_CHARTYPE(*mark, ct_space)) ++mark;
+
+ PUGI__PUSHNODE(node_doctype);
+
+ cursor->value = mark;
+ }
+ }
+ else if (*s == 0 && endch == '-') PUGI__THROW_ERROR(status_bad_comment, s);
+ else if (*s == 0 && endch == '[') PUGI__THROW_ERROR(status_bad_cdata, s);
+ else PUGI__THROW_ERROR(status_unrecognized_tag, s);
+
+ return s;
+ }
+
+ char_t* parse_question(char_t* s, xml_node_struct*& ref_cursor, unsigned int optmsk, char_t endch)
+ {
+ // load into registers
+ xml_node_struct* cursor = ref_cursor;
+ char_t ch = 0;
+
+ // parse node contents, starting with question mark
+ ++s;
+
+ // read PI target
+ char_t* target = s;
+
+ if (!PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_pi, s);
+
+ PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol));
+ PUGI__CHECK_ERROR(status_bad_pi, s);
+
+ // determine node type; stricmp / strcasecmp is not portable
+ bool declaration = (target[0] | ' ') == 'x' && (target[1] | ' ') == 'm' && (target[2] | ' ') == 'l' && target + 3 == s;
+
+ if (declaration ? PUGI__OPTSET(parse_declaration) : PUGI__OPTSET(parse_pi))
+ {
+ if (declaration)
+ {
+ // disallow non top-level declarations
+ if (cursor->parent) PUGI__THROW_ERROR(status_bad_pi, s);
+
+ PUGI__PUSHNODE(node_declaration);
+ }
+ else
+ {
+ PUGI__PUSHNODE(node_pi);
+ }
+
+ cursor->name = target;
+
+ PUGI__ENDSEG();
+
+ // parse value/attributes
+ if (ch == '?')
+ {
+ // empty node
+ if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_pi, s);
+ s += (*s == '>');
+
+ PUGI__POPNODE();
+ }
+ else if (PUGI__IS_CHARTYPE(ch, ct_space))
+ {
+ PUGI__SKIPWS();
+
+ // scan for tag end
+ char_t* value = s;
+
+ PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>'));
+ PUGI__CHECK_ERROR(status_bad_pi, s);
+
+ if (declaration)
+ {
+ // replace ending ? with / so that 'element' terminates properly
+ *s = '/';
+
+ // we exit from this function with cursor at node_declaration, which is a signal to parse() to go to LOC_ATTRIBUTES
+ s = value;
+ }
+ else
+ {
+ // store value and step over >
+ cursor->value = value;
+ PUGI__POPNODE();
+
+ PUGI__ENDSEG();
+
+ s += (*s == '>');
+ }
+ }
+ else PUGI__THROW_ERROR(status_bad_pi, s);
+ }
+ else
+ {
+ // scan for tag end
+ PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>'));
+ PUGI__CHECK_ERROR(status_bad_pi, s);
+
+ s += (s[1] == '>' ? 2 : 1);
+ }
+
+ // store from registers
+ ref_cursor = cursor;
+
+ return s;
+ }
+
+ char_t* parse_tree(char_t* s, xml_node_struct* root, unsigned int optmsk, char_t endch)
+ {
+ strconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk);
+ strconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk);
+
+ char_t ch = 0;
+ xml_node_struct* cursor = root;
+ char_t* mark = s;
+
+ while (*s != 0)
+ {
+ if (*s == '<')
+ {
+ ++s;
+
+ LOC_TAG:
+ if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // '<#...'
+ {
+ PUGI__PUSHNODE(node_element); // Append a new node to the tree.
+
+ cursor->name = s;
+
+ PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator.
+ PUGI__ENDSEG(); // Save char in 'ch', terminate & step over.
+
+ if (ch == '>')
+ {
+ // end of tag
+ }
+ else if (PUGI__IS_CHARTYPE(ch, ct_space))
+ {
+ LOC_ATTRIBUTES:
+ while (true)
+ {
+ PUGI__SKIPWS(); // Eat any whitespace.
+
+ if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #...
+ {
+ xml_attribute_struct* a = append_new_attribute(cursor, alloc); // Make space for this attribute.
+ if (!a) PUGI__THROW_ERROR(status_out_of_memory, s);
+
+ a->name = s; // Save the offset.
+
+ PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator.
+ PUGI__ENDSEG(); // Save char in 'ch', terminate & step over.
+
+ if (PUGI__IS_CHARTYPE(ch, ct_space))
+ {
+ PUGI__SKIPWS(); // Eat any whitespace.
+
+ ch = *s;
+ ++s;
+ }
+
+ if (ch == '=') // '<... #=...'
+ {
+ PUGI__SKIPWS(); // Eat any whitespace.
+
+ if (*s == '"' || *s == '\'') // '<... #="...'
+ {
+ ch = *s; // Save quote char to avoid breaking on "''" -or- '""'.
+ ++s; // Step over the quote.
+ a->value = s; // Save the offset.
+
+ s = strconv_attribute(s, ch);
+
+ if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value);
+
+ // After this line the loop continues from the start;
+ // Whitespaces, / and > are ok, symbols and EOF are wrong,
+ // everything else will be detected
+ if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_attribute, s);
+ }
+ else PUGI__THROW_ERROR(status_bad_attribute, s);
+ }
+ else PUGI__THROW_ERROR(status_bad_attribute, s);
+ }
+ else if (*s == '/')
+ {
+ ++s;
+
+ if (*s == '>')
+ {
+ PUGI__POPNODE();
+ s++;
+ break;
+ }
+ else if (*s == 0 && endch == '>')
+ {
+ PUGI__POPNODE();
+ break;
+ }
+ else PUGI__THROW_ERROR(status_bad_start_element, s);
+ }
+ else if (*s == '>')
+ {
+ ++s;
+
+ break;
+ }
+ else if (*s == 0 && endch == '>')
+ {
+ break;
+ }
+ else PUGI__THROW_ERROR(status_bad_start_element, s);
+ }
+
+ // !!!
+ }
+ else if (ch == '/') // '<#.../'
+ {
+ if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_start_element, s);
+
+ PUGI__POPNODE(); // Pop.
+
+ s += (*s == '>');
+ }
+ else if (ch == 0)
+ {
+ // we stepped over null terminator, backtrack & handle closing tag
+ --s;
+
+ if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s);
+ }
+ else PUGI__THROW_ERROR(status_bad_start_element, s);
+ }
+ else if (*s == '/')
+ {
+ ++s;
+
+ char_t* name = cursor->name;
+ if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s);
+
+ while (PUGI__IS_CHARTYPE(*s, ct_symbol))
+ {
+ if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s);
+ }
+
+ if (*name)
+ {
+ if (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s);
+ else PUGI__THROW_ERROR(status_end_element_mismatch, s);
+ }
+
+ PUGI__POPNODE(); // Pop.
+
+ PUGI__SKIPWS();
+
+ if (*s == 0)
+ {
+ if (endch != '>') PUGI__THROW_ERROR(status_bad_end_element, s);
+ }
+ else
+ {
+ if (*s != '>') PUGI__THROW_ERROR(status_bad_end_element, s);
+ ++s;
+ }
+ }
+ else if (*s == '?') // '<?...'
+ {
+ s = parse_question(s, cursor, optmsk, endch);
+ if (!s) return s;
+
+ assert(cursor);
+ if (PUGI__NODETYPE(cursor) == node_declaration) goto LOC_ATTRIBUTES;
+ }
+ else if (*s == '!') // '<!...'
+ {
+ s = parse_exclamation(s, cursor, optmsk, endch);
+ if (!s) return s;
+ }
+ else if (*s == 0 && endch == '?') PUGI__THROW_ERROR(status_bad_pi, s);
+ else PUGI__THROW_ERROR(status_unrecognized_tag, s);
+ }
+ else
+ {
+ mark = s; // Save this offset while searching for a terminator.
+
+ PUGI__SKIPWS(); // Eat whitespace if no genuine PCDATA here.
+
+ if (*s == '<' || !*s)
+ {
+ // We skipped some whitespace characters because otherwise we would take the tag branch instead of PCDATA one
+ assert(mark != s);
+
+ if (!PUGI__OPTSET(parse_ws_pcdata | parse_ws_pcdata_single) || PUGI__OPTSET(parse_trim_pcdata))
+ {
+ continue;
+ }
+ else if (PUGI__OPTSET(parse_ws_pcdata_single))
+ {
+ if (s[0] != '<' || s[1] != '/' || cursor->first_child) continue;
+ }
+ }
+
+ if (!PUGI__OPTSET(parse_trim_pcdata))
+ s = mark;
+
+ if (cursor->parent || PUGI__OPTSET(parse_fragment))
+ {
+ PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree.
+ cursor->value = s; // Save the offset.
+
+ s = strconv_pcdata(s);
+
+ PUGI__POPNODE(); // Pop since this is a standalone.
+
+ if (!*s) break;
+ }
+ else
+ {
+ PUGI__SCANFOR(*s == '<'); // '...<'
+ if (!*s) break;
+
+ ++s;
+ }
+
+ // We're after '<'
+ goto LOC_TAG;
+ }
+ }
+
+ // check that last tag is closed
+ if (cursor != root) PUGI__THROW_ERROR(status_end_element_mismatch, s);
+
+ return s;
+ }
+
+ #ifdef PUGIXML_WCHAR_MODE
+ static char_t* parse_skip_bom(char_t* s)
+ {
+ unsigned int bom = 0xfeff;
+ return (s[0] == static_cast<wchar_t>(bom)) ? s + 1 : s;
+ }
+ #else
+ static char_t* parse_skip_bom(char_t* s)
+ {
+ return (s[0] == '\xef' && s[1] == '\xbb' && s[2] == '\xbf') ? s + 3 : s;
+ }
+ #endif
+
+ static bool has_element_node_siblings(xml_node_struct* node)
+ {
+ while (node)
+ {
+ if (PUGI__NODETYPE(node) == node_element) return true;
+
+ node = node->next_sibling;
+ }
+
+ return false;
+ }
+
+ static xml_parse_result parse(char_t* buffer, size_t length, xml_document_struct* xmldoc, xml_node_struct* root, unsigned int optmsk)
+ {
+ // allocator object is a part of document object
+ xml_allocator& alloc_ = *static_cast<xml_allocator*>(xmldoc);
+
+ // early-out for empty documents
+ if (length == 0)
+ return make_parse_result(PUGI__OPTSET(parse_fragment) ? status_ok : status_no_document_element);
+
+ // get last child of the root before parsing
+ xml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c : 0;
+
+ // create parser on stack
+ xml_parser parser(alloc_);
+
+ // save last character and make buffer zero-terminated (speeds up parsing)
+ char_t endch = buffer[length - 1];
+ buffer[length - 1] = 0;
+
+ // skip BOM to make sure it does not end up as part of parse output
+ char_t* buffer_data = parse_skip_bom(buffer);
+
+ // perform actual parsing
+ parser.parse_tree(buffer_data, root, optmsk, endch);
+
+ // update allocator state
+ alloc_ = parser.alloc;
+
+ xml_parse_result result = make_parse_result(parser.error_status, parser.error_offset ? parser.error_offset - buffer : 0);
+ assert(result.offset >= 0 && static_cast<size_t>(result.offset) <= length);
+
+ if (result)
+ {
+ // since we removed last character, we have to handle the only possible false positive (stray <)
+ if (endch == '<')
+ return make_parse_result(status_unrecognized_tag, length - 1);
+
+ // check if there are any element nodes parsed
+ xml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling : root->first_child;
+
+ if (!PUGI__OPTSET(parse_fragment) && !has_element_node_siblings(first_root_child_parsed))
+ return make_parse_result(status_no_document_element, length - 1);
+ }
+ else
+ {
+ // roll back offset if it occurs on a null terminator in the source buffer
+ if (result.offset > 0 && static_cast<size_t>(result.offset) == length - 1 && endch == 0)
+ result.offset--;
+ }
+
+ return result;
+ }
+ };
+
+ // Output facilities
+ PUGI__FN xml_encoding get_write_native_encoding()
+ {
+ #ifdef PUGIXML_WCHAR_MODE
+ return get_wchar_encoding();
+ #else
+ return encoding_utf8;
+ #endif
+ }
+
+ PUGI__FN xml_encoding get_write_encoding(xml_encoding encoding)
+ {
+ // replace wchar encoding with utf implementation
+ if (encoding == encoding_wchar) return get_wchar_encoding();
+
+ // replace utf16 encoding with utf16 with specific endianness
+ if (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+ // replace utf32 encoding with utf32 with specific endianness
+ if (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+ // only do autodetection if no explicit encoding is requested
+ if (encoding != encoding_auto) return encoding;
+
+ // assume utf8 encoding
+ return encoding_utf8;
+ }
+
+#ifdef PUGIXML_WCHAR_MODE
+ PUGI__FN size_t get_valid_length(const char_t* data, size_t length)
+ {
+ if (length < 1) return 0;
+
+ // discard last character if it's the lead of a surrogate pair
+ return (sizeof(wchar_t) == 2 && static_cast<unsigned int>(static_cast<uint16_t>(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length;
+ }
+
+ PUGI__FN size_t convert_buffer_output(char_t* r_char, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding)
+ {
+ // only endian-swapping is required
+ if (need_endian_swap_utf(encoding, get_wchar_encoding()))
+ {
+ convert_wchar_endian_swap(r_char, data, length);
+
+ return length * sizeof(char_t);
+ }
+
+ // convert to utf8
+ if (encoding == encoding_utf8)
+ {
+ uint8_t* dest = r_u8;
+ uint8_t* end = utf_decoder<utf8_writer>::decode_wchar_block(data, length, dest);
+
+ return static_cast<size_t>(end - dest);
+ }
+
+ // convert to utf16
+ if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+ {
+ uint16_t* dest = r_u16;
+
+ // convert to native utf16
+ uint16_t* end = utf_decoder<utf16_writer>::decode_wchar_block(data, length, dest);
+
+ // swap if necessary
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+ if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+ return static_cast<size_t>(end - dest) * sizeof(uint16_t);
+ }
+
+ // convert to utf32
+ if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+ {
+ uint32_t* dest = r_u32;
+
+ // convert to native utf32
+ uint32_t* end = utf_decoder<utf32_writer>::decode_wchar_block(data, length, dest);
+
+ // swap if necessary
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+ if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+ return static_cast<size_t>(end - dest) * sizeof(uint32_t);
+ }
+
+ // convert to latin1
+ if (encoding == encoding_latin1)
+ {
+ uint8_t* dest = r_u8;
+ uint8_t* end = utf_decoder<latin1_writer>::decode_wchar_block(data, length, dest);
+
+ return static_cast<size_t>(end - dest);
+ }
+
+ assert(!"Invalid encoding");
+ return 0;
+ }
+#else
+ PUGI__FN size_t get_valid_length(const char_t* data, size_t length)
+ {
+ if (length < 5) return 0;
+
+ for (size_t i = 1; i <= 4; ++i)
+ {
+ uint8_t ch = static_cast<uint8_t>(data[length - i]);
+
+ // either a standalone character or a leading one
+ if ((ch & 0xc0) != 0x80) return length - i;
+ }
+
+ // there are four non-leading characters at the end, sequence tail is broken so might as well process the whole chunk
+ return length;
+ }
+
+ PUGI__FN size_t convert_buffer_output(char_t* /* r_char */, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding)
+ {
+ if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+ {
+ uint16_t* dest = r_u16;
+
+ // convert to native utf16
+ uint16_t* end = utf_decoder<utf16_writer>::decode_utf8_block(reinterpret_cast<const uint8_t*>(data), length, dest);
+
+ // swap if necessary
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+ if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+ return static_cast<size_t>(end - dest) * sizeof(uint16_t);
+ }
+
+ if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+ {
+ uint32_t* dest = r_u32;
+
+ // convert to native utf32
+ uint32_t* end = utf_decoder<utf32_writer>::decode_utf8_block(reinterpret_cast<const uint8_t*>(data), length, dest);
+
+ // swap if necessary
+ xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+ if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+ return static_cast<size_t>(end - dest) * sizeof(uint32_t);
+ }
+
+ if (encoding == encoding_latin1)
+ {
+ uint8_t* dest = r_u8;
+ uint8_t* end = utf_decoder<latin1_writer>::decode_utf8_block(reinterpret_cast<const uint8_t*>(data), length, dest);
+
+ return static_cast<size_t>(end - dest);
+ }
+
+ assert(!"Invalid encoding");
+ return 0;
+ }
+#endif
+
+ class xml_buffered_writer
+ {
+ xml_buffered_writer(const xml_buffered_writer&);
+ xml_buffered_writer& operator=(const xml_buffered_writer&);
+
+ public:
+ xml_buffered_writer(xml_writer& writer_, xml_encoding user_encoding): writer(writer_), bufsize(0), encoding(get_write_encoding(user_encoding))
+ {
+ PUGI__STATIC_ASSERT(bufcapacity >= 8);
+ }
+
+ ~xml_buffered_writer()
+ {
+ flush();
+ }
+
+ size_t flush()
+ {
+ flush(buffer, bufsize);
+ bufsize = 0;
+ return 0;
+ }
+
+ void flush(const char_t* data, size_t size)
+ {
+ if (size == 0) return;
+
+ // fast path, just write data
+ if (encoding == get_write_native_encoding())
+ writer.write(data, size * sizeof(char_t));
+ else
+ {
+ // convert chunk
+ size_t result = convert_buffer_output(scratch.data_char, scratch.data_u8, scratch.data_u16, scratch.data_u32, data, size, encoding);
+ assert(result <= sizeof(scratch));
+
+ // write data
+ writer.write(scratch.data_u8, result);
+ }
+ }
+
+ void write_direct(const char_t* data, size_t length)
+ {
+ // flush the remaining buffer contents
+ flush();
+
+ // handle large chunks
+ if (length > bufcapacity)
+ {
+ if (encoding == get_write_native_encoding())
+ {
+ // fast path, can just write data chunk
+ writer.write(data, length * sizeof(char_t));
+ return;
+ }
+
+ // need to convert in suitable chunks
+ while (length > bufcapacity)
+ {
+ // get chunk size by selecting such number of characters that are guaranteed to fit into scratch buffer
+ // and form a complete codepoint sequence (i.e. discard start of last codepoint if necessary)
+ size_t chunk_size = get_valid_length(data, bufcapacity);
+ assert(chunk_size);
+
+ // convert chunk and write
+ flush(data, chunk_size);
+
+ // iterate
+ data += chunk_size;
+ length -= chunk_size;
+ }
+
+ // small tail is copied below
+ bufsize = 0;
+ }
+
+ memcpy(buffer + bufsize, data, length * sizeof(char_t));
+ bufsize += length;
+ }
+
+ void write_buffer(const char_t* data, size_t length)
+ {
+ size_t offset = bufsize;
+
+ if (offset + length <= bufcapacity)
+ {
+ memcpy(buffer + offset, data, length * sizeof(char_t));
+ bufsize = offset + length;
+ }
+ else
+ {
+ write_direct(data, length);
+ }
+ }
+
+ void write_string(const char_t* data)
+ {
+ // write the part of the string that fits in the buffer
+ size_t offset = bufsize;
+
+ while (*data && offset < bufcapacity)
+ buffer[offset++] = *data++;
+
+ // write the rest
+ if (offset < bufcapacity)
+ {
+ bufsize = offset;
+ }
+ else
+ {
+ // backtrack a bit if we have split the codepoint
+ size_t length = offset - bufsize;
+ size_t extra = length - get_valid_length(data - length, length);
+
+ bufsize = offset - extra;
+
+ write_direct(data - extra, strlength(data) + extra);
+ }
+ }
+
+ void write(char_t d0)
+ {
+ size_t offset = bufsize;
+ if (offset > bufcapacity - 1) offset = flush();
+
+ buffer[offset + 0] = d0;
+ bufsize = offset + 1;
+ }
+
+ void write(char_t d0, char_t d1)
+ {
+ size_t offset = bufsize;
+ if (offset > bufcapacity - 2) offset = flush();
+
+ buffer[offset + 0] = d0;
+ buffer[offset + 1] = d1;
+ bufsize = offset + 2;
+ }
+
+ void write(char_t d0, char_t d1, char_t d2)
+ {
+ size_t offset = bufsize;
+ if (offset > bufcapacity - 3) offset = flush();
+
+ buffer[offset + 0] = d0;
+ buffer[offset + 1] = d1;
+ buffer[offset + 2] = d2;
+ bufsize = offset + 3;
+ }
+
+ void write(char_t d0, char_t d1, char_t d2, char_t d3)
+ {
+ size_t offset = bufsize;
+ if (offset > bufcapacity - 4) offset = flush();
+
+ buffer[offset + 0] = d0;
+ buffer[offset + 1] = d1;
+ buffer[offset + 2] = d2;
+ buffer[offset + 3] = d3;
+ bufsize = offset + 4;
+ }
+
+ void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4)
+ {
+ size_t offset = bufsize;
+ if (offset > bufcapacity - 5) offset = flush();
+
+ buffer[offset + 0] = d0;
+ buffer[offset + 1] = d1;
+ buffer[offset + 2] = d2;
+ buffer[offset + 3] = d3;
+ buffer[offset + 4] = d4;
+ bufsize = offset + 5;
+ }
+
+ void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5)
+ {
+ size_t offset = bufsize;
+ if (offset > bufcapacity - 6) offset = flush();
+
+ buffer[offset + 0] = d0;
+ buffer[offset + 1] = d1;
+ buffer[offset + 2] = d2;
+ buffer[offset + 3] = d3;
+ buffer[offset + 4] = d4;
+ buffer[offset + 5] = d5;
+ bufsize = offset + 6;
+ }
+
+ // utf8 maximum expansion: x4 (-> utf32)
+ // utf16 maximum expansion: x2 (-> utf32)
+ // utf32 maximum expansion: x1
+ enum
+ {
+ bufcapacitybytes =
+ #ifdef PUGIXML_MEMORY_OUTPUT_STACK
+ PUGIXML_MEMORY_OUTPUT_STACK
+ #else
+ 10240
+ #endif
+ ,
+ bufcapacity = bufcapacitybytes / (sizeof(char_t) + 4)
+ };
+
+ char_t buffer[bufcapacity];
+
+ union
+ {
+ uint8_t data_u8[4 * bufcapacity];
+ uint16_t data_u16[2 * bufcapacity];
+ uint32_t data_u32[bufcapacity];
+ char_t data_char[bufcapacity];
+ } scratch;
+
+ xml_writer& writer;
+ size_t bufsize;
+ xml_encoding encoding;
+ };
+
+ PUGI__FN void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type)
+ {
+ while (*s)
+ {
+ const char_t* prev = s;
+
+ // While *s is a usual symbol
+ PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type));
+
+ writer.write_buffer(prev, static_cast<size_t>(s - prev));
+
+ switch (*s)
+ {
+ case 0: break;
+ case '&':
+ writer.write('&', 'a', 'm', 'p', ';');
+ ++s;
+ break;
+ case '<':
+ writer.write('&', 'l', 't', ';');
+ ++s;
+ break;
+ case '>':
+ writer.write('&', 'g', 't', ';');
+ ++s;
+ break;
+ case '"':
+ writer.write('&', 'q', 'u', 'o', 't', ';');
+ ++s;
+ break;
+ default: // s is not a usual symbol
+ {
+ unsigned int ch = static_cast<unsigned int>(*s++);
+ assert(ch < 32);
+
+ writer.write('&', '#', static_cast<char_t>((ch / 10) + '0'), static_cast<char_t>((ch % 10) + '0'), ';');
+ }
+ }
+ }
+ }
+
+ PUGI__FN void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags)
+ {
+ if (flags & format_no_escapes)
+ writer.write_string(s);
+ else
+ text_output_escaped(writer, s, type);
+ }
+
+ PUGI__FN void text_output_cdata(xml_buffered_writer& writer, const char_t* s)
+ {
+ do
+ {
+ writer.write('<', '!', '[', 'C', 'D');
+ writer.write('A', 'T', 'A', '[');
+
+ const char_t* prev = s;
+
+ // look for ]]> sequence - we can't output it as is since it terminates CDATA
+ while (*s && !(s[0] == ']' && s[1] == ']' && s[2] == '>')) ++s;
+
+ // skip ]] if we stopped at ]]>, > will go to the next CDATA section
+ if (*s) s += 2;
+
+ writer.write_buffer(prev, static_cast<size_t>(s - prev));
+
+ writer.write(']', ']', '>');
+ }
+ while (*s);
+ }
+
+ PUGI__FN void text_output_indent(xml_buffered_writer& writer, const char_t* indent, size_t indent_length, unsigned int depth)
+ {
+ switch (indent_length)
+ {
+ case 1:
+ {
+ for (unsigned int i = 0; i < depth; ++i)
+ writer.write(indent[0]);
+ break;
+ }
+
+ case 2:
+ {
+ for (unsigned int i = 0; i < depth; ++i)
+ writer.write(indent[0], indent[1]);
+ break;
+ }
+
+ case 3:
+ {
+ for (unsigned int i = 0; i < depth; ++i)
+ writer.write(indent[0], indent[1], indent[2]);
+ break;
+ }
+
+ case 4:
+ {
+ for (unsigned int i = 0; i < depth; ++i)
+ writer.write(indent[0], indent[1], indent[2], indent[3]);
+ break;
+ }
+
+ default:
+ {
+ for (unsigned int i = 0; i < depth; ++i)
+ writer.write_buffer(indent, indent_length);
+ }
+ }
+ }
+
+ PUGI__FN void node_output_comment(xml_buffered_writer& writer, const char_t* s)
+ {
+ writer.write('<', '!', '-', '-');
+
+ while (*s)
+ {
+ const char_t* prev = s;
+
+ // look for -\0 or -- sequence - we can't output it since -- is illegal in comment body
+ while (*s && !(s[0] == '-' && (s[1] == '-' || s[1] == 0))) ++s;
+
+ writer.write_buffer(prev, static_cast<size_t>(s - prev));
+
+ if (*s)
+ {
+ assert(*s == '-');
+
+ writer.write('-', ' ');
+ ++s;
+ }
+ }
+
+ writer.write('-', '-', '>');
+ }
+
+ PUGI__FN void node_output_attributes(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+ {
+ const char_t* default_name = PUGIXML_TEXT(":anonymous");
+
+ for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute)
+ {
+ writer.write(' ');
+ writer.write_string(a->name ? a->name : default_name);
+ writer.write('=', '"');
+
+ if (a->value)
+ text_output(writer, a->value, ctx_special_attr, flags);
+
+ writer.write('"');
+ }
+ }
+
+ PUGI__FN bool node_output_start(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+ {
+ const char_t* default_name = PUGIXML_TEXT(":anonymous");
+ const char_t* name = node->name ? node->name : default_name;
+
+ writer.write('<');
+ writer.write_string(name);
+
+ if (node->first_attribute)
+ node_output_attributes(writer, node, flags);
+
+ if (flags & format_raw)
+ {
+ if (!node->first_child)
+ writer.write(' ', '/', '>');
+ else
+ {
+ writer.write('>');
+
+ return true;
+ }
+ }
+ else
+ {
+ xml_node_struct* first = node->first_child;
+
+ if (!first)
+ writer.write(' ', '/', '>', '\n');
+ else if (!first->next_sibling && (PUGI__NODETYPE(first) == node_pcdata || PUGI__NODETYPE(first) == node_cdata))
+ {
+ writer.write('>');
+
+ const char_t* value = first->value ? first->value : PUGIXML_TEXT("");
+
+ if (PUGI__NODETYPE(first) == node_pcdata)
+ text_output(writer, value, ctx_special_pcdata, flags);
+ else
+ text_output_cdata(writer, value);
+
+ writer.write('<', '/');
+ writer.write_string(name);
+ writer.write('>', '\n');
+ }
+ else
+ {
+ writer.write('>', '\n');
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ PUGI__FN void node_output_end(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+ {
+ const char_t* default_name = PUGIXML_TEXT(":anonymous");
+ const char_t* name = node->name ? node->name : default_name;
+
+ writer.write('<', '/');
+ writer.write_string(name);
+
+ if (flags & format_raw)
+ writer.write('>');
+ else
+ writer.write('>', '\n');
+ }
+
+ PUGI__FN void node_output_simple(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+ {
+ const char_t* default_name = PUGIXML_TEXT(":anonymous");
+
+ switch (PUGI__NODETYPE(node))
+ {
+ case node_pcdata:
+ text_output(writer, node->value ? node->value : PUGIXML_TEXT(""), ctx_special_pcdata, flags);
+ if ((flags & format_raw) == 0) writer.write('\n');
+ break;
+
+ case node_cdata:
+ text_output_cdata(writer, node->value ? node->value : PUGIXML_TEXT(""));
+ if ((flags & format_raw) == 0) writer.write('\n');
+ break;
+
+ case node_comment:
+ node_output_comment(writer, node->value ? node->value : PUGIXML_TEXT(""));
+ if ((flags & format_raw) == 0) writer.write('\n');
+ break;
+
+ case node_pi:
+ writer.write('<', '?');
+ writer.write_string(node->name ? node->name : default_name);
+
+ if (node->value)
+ {
+ writer.write(' ');
+ writer.write_string(node->value);
+ }
+
+ writer.write('?', '>');
+ if ((flags & format_raw) == 0) writer.write('\n');
+ break;
+
+ case node_declaration:
+ writer.write('<', '?');
+ writer.write_string(node->name ? node->name : default_name);
+ node_output_attributes(writer, node, flags);
+ writer.write('?', '>');
+ if ((flags & format_raw) == 0) writer.write('\n');
+ break;
+
+ case node_doctype:
+ writer.write('<', '!', 'D', 'O', 'C');
+ writer.write('T', 'Y', 'P', 'E');
+
+ if (node->value)
+ {
+ writer.write(' ');
+ writer.write_string(node->value);
+ }
+
+ writer.write('>');
+ if ((flags & format_raw) == 0) writer.write('\n');
+ break;
+
+ default:
+ assert(!"Invalid node type");
+ }
+ }
+
+ PUGI__FN void node_output(xml_buffered_writer& writer, xml_node_struct* root, const char_t* indent, unsigned int flags, unsigned int depth)
+ {
+ size_t indent_length = ((flags & (format_indent | format_raw)) == format_indent) ? strlength(indent) : 0;
+
+ xml_node_struct* node = root;
+
+ do
+ {
+ assert(node);
+
+ // begin writing current node
+ if (indent_length)
+ text_output_indent(writer, indent, indent_length, depth);
+
+ if (PUGI__NODETYPE(node) == node_element)
+ {
+ if (node_output_start(writer, node, flags))
+ {
+ node = node->first_child;
+ depth++;
+ continue;
+ }
+ }
+ else if (PUGI__NODETYPE(node) == node_document)
+ {
+ if (node->first_child)
+ {
+ node = node->first_child;
+ continue;
+ }
+ }
+ else
+ {
+ node_output_simple(writer, node, flags);
+ }
+
+ // continue to the next node
+ while (node != root)
+ {
+ if (node->next_sibling)
+ {
+ node = node->next_sibling;
+ break;
+ }
+
+ node = node->parent;
+
+ // write closing node
+ if (PUGI__NODETYPE(node) == node_element)
+ {
+ depth--;
+
+ if (indent_length)
+ text_output_indent(writer, indent, indent_length, depth);
+
+ node_output_end(writer, node, flags);
+ }
+ }
+ }
+ while (node != root);
+ }
+
+ PUGI__FN bool has_declaration(xml_node_struct* node)
+ {
+ for (xml_node_struct* child = node->first_child; child; child = child->next_sibling)
+ {
+ xml_node_type type = PUGI__NODETYPE(child);
+
+ if (type == node_declaration) return true;
+ if (type == node_element) return false;
+ }
+
+ return false;
+ }
+
+ PUGI__FN bool is_attribute_of(xml_attribute_struct* attr, xml_node_struct* node)
+ {
+ for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute)
+ if (a == attr)
+ return true;
+
+ return false;
+ }
+
+ PUGI__FN bool allow_insert_attribute(xml_node_type parent)
+ {
+ return parent == node_element || parent == node_declaration;
+ }
+
+ PUGI__FN bool allow_insert_child(xml_node_type parent, xml_node_type child)
+ {
+ if (parent != node_document && parent != node_element) return false;
+ if (child == node_document || child == node_null) return false;
+ if (parent != node_document && (child == node_declaration || child == node_doctype)) return false;
+
+ return true;
+ }
+
+ PUGI__FN bool allow_move(xml_node parent, xml_node child)
+ {
+ // check that child can be a child of parent
+ if (!allow_insert_child(parent.type(), child.type()))
+ return false;
+
+ // check that node is not moved between documents
+ if (parent.root() != child.root())
+ return false;
+
+ // check that new parent is not in the child subtree
+ xml_node cur = parent;
+
+ while (cur)
+ {
+ if (cur == child)
+ return false;
+
+ cur = cur.parent();
+ }
+
+ return true;
+ }
+
+ PUGI__FN void node_copy_string(char_t*& dest, uintptr_t& header, uintptr_t header_mask, char_t* source, uintptr_t& source_header, xml_allocator* alloc)
+ {
+ assert(!dest && (header & header_mask) == 0);
+
+ if (source)
+ {
+ if (alloc && (source_header & header_mask) == 0)
+ {
+ dest = source;
+
+ // since strcpy_insitu can reuse document buffer memory we need to mark both source and dest as shared
+ header |= xml_memory_page_contents_shared_mask;
+ source_header |= xml_memory_page_contents_shared_mask;
+ }
+ else
+ strcpy_insitu(dest, header, header_mask, source);
+ }
+ }
+
+ PUGI__FN void node_copy_contents(xml_node_struct* dn, xml_node_struct* sn, xml_allocator* shared_alloc)
+ {
+ node_copy_string(dn->name, dn->header, xml_memory_page_name_allocated_mask, sn->name, sn->header, shared_alloc);
+ node_copy_string(dn->value, dn->header, xml_memory_page_value_allocated_mask, sn->value, sn->header, shared_alloc);
+
+ for (xml_attribute_struct* sa = sn->first_attribute; sa; sa = sa->next_attribute)
+ {
+ xml_attribute_struct* da = append_new_attribute(dn, get_allocator(dn));
+
+ if (da)
+ {
+ node_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc);
+ node_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc);
+ }
+ }
+ }
+
+ PUGI__FN void node_copy_tree(xml_node_struct* dn, xml_node_struct* sn)
+ {
+ xml_allocator& alloc = get_allocator(dn);
+ xml_allocator* shared_alloc = (&alloc == &get_allocator(sn)) ? &alloc : 0;
+
+ node_copy_contents(dn, sn, shared_alloc);
+
+ xml_node_struct* dit = dn;
+ xml_node_struct* sit = sn->first_child;
+
+ while (sit && sit != sn)
+ {
+ if (sit != dn)
+ {
+ xml_node_struct* copy = append_new_node(dit, alloc, PUGI__NODETYPE(sit));
+
+ if (copy)
+ {
+ node_copy_contents(copy, sit, shared_alloc);
+
+ if (sit->first_child)
+ {
+ dit = copy;
+ sit = sit->first_child;
+ continue;
+ }
+ }
+ }
+
+ // continue to the next node
+ do
+ {
+ if (sit->next_sibling)
+ {
+ sit = sit->next_sibling;
+ break;
+ }
+
+ sit = sit->parent;
+ dit = dit->parent;
+ }
+ while (sit != sn);
+ }
+ }
+
+ inline bool is_text_node(xml_node_struct* node)
+ {
+ xml_node_type type = PUGI__NODETYPE(node);
+
+ return type == node_pcdata || type == node_cdata;
+ }
+
+ // get value with conversion functions
+ PUGI__FN int get_integer_base(const char_t* value)
+ {
+ const char_t* s = value;
+
+ while (PUGI__IS_CHARTYPE(*s, ct_space))
+ s++;
+
+ if (*s == '-')
+ s++;
+
+ return (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? 16 : 10;
+ }
+
+ PUGI__FN int get_value_int(const char_t* value, int def)
+ {
+ if (!value) return def;
+
+ int base = get_integer_base(value);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return static_cast<int>(wcstol(value, 0, base));
+ #else
+ return static_cast<int>(strtol(value, 0, base));
+ #endif
+ }
+
+ PUGI__FN unsigned int get_value_uint(const char_t* value, unsigned int def)
+ {
+ if (!value) return def;
+
+ int base = get_integer_base(value);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return static_cast<unsigned int>(wcstoul(value, 0, base));
+ #else
+ return static_cast<unsigned int>(strtoul(value, 0, base));
+ #endif
+ }
+
+ PUGI__FN double get_value_double(const char_t* value, double def)
+ {
+ if (!value) return def;
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return wcstod(value, 0);
+ #else
+ return strtod(value, 0);
+ #endif
+ }
+
+ PUGI__FN float get_value_float(const char_t* value, float def)
+ {
+ if (!value) return def;
+
+ #ifdef PUGIXML_WCHAR_MODE
+ return static_cast<float>(wcstod(value, 0));
+ #else
+ return static_cast<float>(strtod(value, 0));
+ #endif
+ }
+
+ PUGI__FN bool get_value_bool(const char_t* value, bool def)
+ {
+ if (!value) return def;
+
+ // only look at first char
+ char_t first = *value;
+
+ // 1*, t* (true), T* (True), y* (yes), Y* (YES)
+ return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y');
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN long long get_value_llong(const char_t* value, long long def)
+ {
+ if (!value) return def;
+
+ int base = get_integer_base(value);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ #ifdef PUGI__MSVC_CRT_VERSION
+ return _wcstoi64(value, 0, base);
+ #else
+ return wcstoll(value, 0, base);
+ #endif
+ #else
+ #ifdef PUGI__MSVC_CRT_VERSION
+ return _strtoi64(value, 0, base);
+ #else
+ return strtoll(value, 0, base);
+ #endif
+ #endif
+ }
+
+ PUGI__FN unsigned long long get_value_ullong(const char_t* value, unsigned long long def)
+ {
+ if (!value) return def;
+
+ int base = get_integer_base(value);
+
+ #ifdef PUGIXML_WCHAR_MODE
+ #ifdef PUGI__MSVC_CRT_VERSION
+ return _wcstoui64(value, 0, base);
+ #else
+ return wcstoull(value, 0, base);
+ #endif
+ #else
+ #ifdef PUGI__MSVC_CRT_VERSION
+ return _strtoui64(value, 0, base);
+ #else
+ return strtoull(value, 0, base);
+ #endif
+ #endif
+ }
+#endif
+
+ // set value with conversion functions
+ PUGI__FN bool set_value_buffer(char_t*& dest, uintptr_t& header, uintptr_t header_mask, char (&buf)[128])
+ {
+ #ifdef PUGIXML_WCHAR_MODE
+ char_t wbuf[128];
+ impl::widen_ascii(wbuf, buf);
+
+ return strcpy_insitu(dest, header, header_mask, wbuf);
+ #else
+ return strcpy_insitu(dest, header, header_mask, buf);
+ #endif
+ }
+
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, int value)
+ {
+ char buf[128];
+ sprintf(buf, "%d", value);
+
+ return set_value_buffer(dest, header, header_mask, buf);
+ }
+
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, unsigned int value)
+ {
+ char buf[128];
+ sprintf(buf, "%u", value);
+
+ return set_value_buffer(dest, header, header_mask, buf);
+ }
+
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, float value)
+ {
+ char buf[128];
+ sprintf(buf, "%.9g", value);
+
+ return set_value_buffer(dest, header, header_mask, buf);
+ }
+
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, double value)
+ {
+ char buf[128];
+ sprintf(buf, "%.17g", value);
+
+ return set_value_buffer(dest, header, header_mask, buf);
+ }
+
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, bool value)
+ {
+ return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, long long value)
+ {
+ char buf[128];
+ sprintf(buf, "%lld", value);
+
+ return set_value_buffer(dest, header, header_mask, buf);
+ }
+
+ PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, unsigned long long value)
+ {
+ char buf[128];
+ sprintf(buf, "%llu", value);
+
+ return set_value_buffer(dest, header, header_mask, buf);
+ }
+#endif
+
+ // we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick
+ PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result)
+ {
+ #if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)
+ // there are 64-bit versions of fseek/ftell, let's use them
+ typedef __int64 length_type;
+
+ _fseeki64(file, 0, SEEK_END);
+ length_type length = _ftelli64(file);
+ _fseeki64(file, 0, SEEK_SET);
+ #elif defined(__MINGW32__) && !defined(__NO_MINGW_LFS) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR))
+ // there are 64-bit versions of fseek/ftell, let's use them
+ typedef off64_t length_type;
+
+ fseeko64(file, 0, SEEK_END);
+ length_type length = ftello64(file);
+ fseeko64(file, 0, SEEK_SET);
+ #else
+ // if this is a 32-bit OS, long is enough; if this is a unix system, long is 64-bit, which is enough; otherwise we can't do anything anyway.
+ typedef long length_type;
+
+ fseek(file, 0, SEEK_END);
+ length_type length = ftell(file);
+ fseek(file, 0, SEEK_SET);
+ #endif
+
+ // check for I/O errors
+ if (length < 0) return status_io_error;
+
+ // check for overflow
+ size_t result = static_cast<size_t>(length);
+
+ if (static_cast<length_type>(result) != length) return status_out_of_memory;
+
+ // finalize
+ out_result = result;
+
+ return status_ok;
+ }
+
+ PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding)
+ {
+ // We only need to zero-terminate if encoding conversion does not do it for us
+ #ifdef PUGIXML_WCHAR_MODE
+ xml_encoding wchar_encoding = get_wchar_encoding();
+
+ if (encoding == wchar_encoding || need_endian_swap_utf(encoding, wchar_encoding))
+ {
+ size_t length = size / sizeof(char_t);
+
+ static_cast<char_t*>(buffer)[length] = 0;
+ return (length + 1) * sizeof(char_t);
+ }
+ #else
+ if (encoding == encoding_utf8)
+ {
+ static_cast<char*>(buffer)[size] = 0;
+ return size + 1;
+ }
+ #endif
+
+ return size;
+ }
+
+ PUGI__FN xml_parse_result load_file_impl(xml_document& doc, FILE* file, unsigned int options, xml_encoding encoding)
+ {
+ if (!file) return make_parse_result(status_file_not_found);
+
+ // get file size (can result in I/O errors)
+ size_t size = 0;
+ xml_parse_status size_status = get_file_size(file, size);
+
+ if (size_status != status_ok)
+ {
+ fclose(file);
+ return make_parse_result(size_status);
+ }
+
+ size_t max_suffix_size = sizeof(char_t);
+
+ // allocate buffer for the whole file
+ char* contents = static_cast<char*>(xml_memory::allocate(size + max_suffix_size));
+
+ if (!contents)
+ {
+ fclose(file);
+ return make_parse_result(status_out_of_memory);
+ }
+
+ // read file in memory
+ size_t read_size = fread(contents, 1, size, file);
+ fclose(file);
+
+ if (read_size != size)
+ {
+ xml_memory::deallocate(contents);
+ return make_parse_result(status_io_error);
+ }
+
+ xml_encoding real_encoding = get_buffer_encoding(encoding, contents, size);
+
+ return doc.load_buffer_inplace_own(contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding);
+ }
+
+#ifndef PUGIXML_NO_STL
+ template <typename T> struct xml_stream_chunk
+ {
+ static xml_stream_chunk* create()
+ {
+ void* memory = xml_memory::allocate(sizeof(xml_stream_chunk));
+
+ return new (memory) xml_stream_chunk();
+ }
+
+ static void destroy(void* ptr)
+ {
+ xml_stream_chunk* chunk = static_cast<xml_stream_chunk*>(ptr);
+
+ // free chunk chain
+ while (chunk)
+ {
+ xml_stream_chunk* next_ = chunk->next;
+
+ xml_memory::deallocate(chunk);
+
+ chunk = next_;
+ }
+ }
+
+ xml_stream_chunk(): next(0), size(0)
+ {
+ }
+
+ xml_stream_chunk* next;
+ size_t size;
+
+ T data[xml_memory_page_size / sizeof(T)];
+ };
+
+ template <typename T> PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)
+ {
+ buffer_holder chunks(0, xml_stream_chunk<T>::destroy);
+
+ // read file to a chunk list
+ size_t total = 0;
+ xml_stream_chunk<T>* last = 0;
+
+ while (!stream.eof())
+ {
+ // allocate new chunk
+ xml_stream_chunk<T>* chunk = xml_stream_chunk<T>::create();
+ if (!chunk) return status_out_of_memory;
+
+ // append chunk to list
+ if (last) last = last->next = chunk;
+ else chunks.data = last = chunk;
+
+ // read data to chunk
+ stream.read(chunk->data, static_cast<std::streamsize>(sizeof(chunk->data) / sizeof(T)));
+ chunk->size = static_cast<size_t>(stream.gcount()) * sizeof(T);
+
+ // read may set failbit | eofbit in case gcount() is less than read length, so check for other I/O errors
+ if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error;
+
+ // guard against huge files (chunk size is small enough to make this overflow check work)
+ if (total + chunk->size < total) return status_out_of_memory;
+ total += chunk->size;
+ }
+
+ size_t max_suffix_size = sizeof(char_t);
+
+ // copy chunk list to a contiguous buffer
+ char* buffer = static_cast<char*>(xml_memory::allocate(total + max_suffix_size));
+ if (!buffer) return status_out_of_memory;
+
+ char* write = buffer;
+
+ for (xml_stream_chunk<T>* chunk = static_cast<xml_stream_chunk<T>*>(chunks.data); chunk; chunk = chunk->next)
+ {
+ assert(write + chunk->size <= buffer + total);
+ memcpy(write, chunk->data, chunk->size);
+ write += chunk->size;
+ }
+
+ assert(write == buffer + total);
+
+ // return buffer
+ *out_buffer = buffer;
+ *out_size = total;
+
+ return status_ok;
+ }
+
+ template <typename T> PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)
+ {
+ // get length of remaining data in stream
+ typename std::basic_istream<T>::pos_type pos = stream.tellg();
+ stream.seekg(0, std::ios::end);
+ std::streamoff length = stream.tellg() - pos;
+ stream.seekg(pos);
+
+ if (stream.fail() || pos < 0) return status_io_error;
+
+ // guard against huge files
+ size_t read_length = static_cast<size_t>(length);
+
+ if (static_cast<std::streamsize>(read_length) != length || length < 0) return status_out_of_memory;
+
+ size_t max_suffix_size = sizeof(char_t);
+
+ // read stream data into memory (guard against stream exceptions with buffer holder)
+ buffer_holder buffer(xml_memory::allocate(read_length * sizeof(T) + max_suffix_size), xml_memory::deallocate);
+ if (!buffer.data) return status_out_of_memory;
+
+ stream.read(static_cast<T*>(buffer.data), static_cast<std::streamsize>(read_length));
+
+ // read may set failbit | eofbit in case gcount() is less than read_length (i.e. line ending conversion), so check for other I/O errors
+ if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error;
+
+ // return buffer
+ size_t actual_length = static_cast<size_t>(stream.gcount());
+ assert(actual_length <= read_length);
+
+ *out_buffer = buffer.release();
+ *out_size = actual_length * sizeof(T);
+
+ return status_ok;
+ }
+
+ template <typename T> PUGI__FN xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream<T>& stream, unsigned int options, xml_encoding encoding)
+ {
+ void* buffer = 0;
+ size_t size = 0;
+ xml_parse_status status = status_ok;
+
+ // if stream has an error bit set, bail out (otherwise tellg() can fail and we'll clear error bits)
+ if (stream.fail()) return make_parse_result(status_io_error);
+
+ // load stream to memory (using seek-based implementation if possible, since it's faster and takes less memory)
+ if (stream.tellg() < 0)
+ {
+ stream.clear(); // clear error flags that could be set by a failing tellg
+ status = load_stream_data_noseek(stream, &buffer, &size);
+ }
+ else
+ status = load_stream_data_seek(stream, &buffer, &size);
+
+ if (status != status_ok) return make_parse_result(status);
+
+ xml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size);
+
+ return doc.load_buffer_inplace_own(buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding);
+ }
+#endif
+
+#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || (defined(__MINGW32__) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR)))
+ PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)
+ {
+ return _wfopen(path, mode);
+ }
+#else
+ PUGI__FN char* convert_path_heap(const wchar_t* str)
+ {
+ assert(str);
+
+ // first pass: get length in utf8 characters
+ size_t length = strlength_wide(str);
+ size_t size = as_utf8_begin(str, length);
+
+ // allocate resulting string
+ char* result = static_cast<char*>(xml_memory::allocate(size + 1));
+ if (!result) return 0;
+
+ // second pass: convert to utf8
+ as_utf8_end(result, size, str, length);
+
+ return result;
+ }
+
+ PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)
+ {
+ // there is no standard function to open wide paths, so our best bet is to try utf8 path
+ char* path_utf8 = convert_path_heap(path);
+ if (!path_utf8) return 0;
+
+ // convert mode to ASCII (we mirror _wfopen interface)
+ char mode_ascii[4] = {0};
+ for (size_t i = 0; mode[i]; ++i) mode_ascii[i] = static_cast<char>(mode[i]);
+
+ // try to open the utf8 path
+ FILE* result = fopen(path_utf8, mode_ascii);
+
+ // free dummy buffer
+ xml_memory::deallocate(path_utf8);
+
+ return result;
+ }
+#endif
+
+ PUGI__FN bool save_file_impl(const xml_document& doc, FILE* file, const char_t* indent, unsigned int flags, xml_encoding encoding)
+ {
+ if (!file) return false;
+
+ xml_writer_file writer(file);
+ doc.save(writer, indent, flags, encoding);
+
+ int result = ferror(file);
+
+ fclose(file);
+
+ return result == 0;
+ }
+
+ PUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer)
+ {
+ // check input buffer
+ assert(contents || size == 0);
+
+ // get actual encoding
+ xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size);
+
+ // get private buffer
+ char_t* buffer = 0;
+ size_t length = 0;
+
+ if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory);
+
+ // delete original buffer if we performed a conversion
+ if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents);
+
+ // store buffer for offset_debug
+ doc->buffer = buffer;
+
+ // parse
+ xml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options);
+
+ // remember encoding
+ res.encoding = buffer_encoding;
+
+ // grab onto buffer if it's our buffer, user is responsible for deallocating contents himself
+ if (own || buffer != contents) *out_buffer = buffer;
+
+ return res;
+ }
+PUGI__NS_END
+
+namespace pugi
+{
+ PUGI__FN xml_writer_file::xml_writer_file(void* file_): file(file_)
+ {
+ }
+
+ PUGI__FN void xml_writer_file::write(const void* data, size_t size)
+ {
+ size_t result = fwrite(data, 1, size, static_cast<FILE*>(file));
+ (void)!result; // unfortunately we can't do proper error handling here
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream): narrow_stream(&stream), wide_stream(0)
+ {
+ }
+
+ PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream): narrow_stream(0), wide_stream(&stream)
+ {
+ }
+
+ PUGI__FN void xml_writer_stream::write(const void* data, size_t size)
+ {
+ if (narrow_stream)
+ {
+ assert(!wide_stream);
+ narrow_stream->write(reinterpret_cast<const char*>(data), static_cast<std::streamsize>(size));
+ }
+ else
+ {
+ assert(wide_stream);
+ assert(size % sizeof(wchar_t) == 0);
+
+ wide_stream->write(reinterpret_cast<const wchar_t*>(data), static_cast<std::streamsize>(size / sizeof(wchar_t)));
+ }
+ }
+#endif
+
+ PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0)
+ {
+ }
+
+ PUGI__FN xml_tree_walker::~xml_tree_walker()
+ {
+ }
+
+ PUGI__FN int xml_tree_walker::depth() const
+ {
+ return _depth;
+ }
+
+ PUGI__FN bool xml_tree_walker::begin(xml_node&)
+ {
+ return true;
+ }
+
+ PUGI__FN bool xml_tree_walker::end(xml_node&)
+ {
+ return true;
+ }
+
+ PUGI__FN xml_attribute::xml_attribute(): _attr(0)
+ {
+ }
+
+ PUGI__FN xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr)
+ {
+ }
+
+ PUGI__FN static void unspecified_bool_xml_attribute(xml_attribute***)
+ {
+ }
+
+ PUGI__FN xml_attribute::operator xml_attribute::unspecified_bool_type() const
+ {
+ return _attr ? unspecified_bool_xml_attribute : 0;
+ }
+
+ PUGI__FN bool xml_attribute::operator!() const
+ {
+ return !_attr;
+ }
+
+ PUGI__FN bool xml_attribute::operator==(const xml_attribute& r) const
+ {
+ return (_attr == r._attr);
+ }
+
+ PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const
+ {
+ return (_attr != r._attr);
+ }
+
+ PUGI__FN bool xml_attribute::operator<(const xml_attribute& r) const
+ {
+ return (_attr < r._attr);
+ }
+
+ PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const
+ {
+ return (_attr > r._attr);
+ }
+
+ PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const
+ {
+ return (_attr <= r._attr);
+ }
+
+ PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const
+ {
+ return (_attr >= r._attr);
+ }
+
+ PUGI__FN xml_attribute xml_attribute::next_attribute() const
+ {
+ return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute();
+ }
+
+ PUGI__FN xml_attribute xml_attribute::previous_attribute() const
+ {
+ return _attr && _attr->prev_attribute_c->next_attribute ? xml_attribute(_attr->prev_attribute_c) : xml_attribute();
+ }
+
+ PUGI__FN const char_t* xml_attribute::as_string(const char_t* def) const
+ {
+ return (_attr && _attr->value) ? _attr->value : def;
+ }
+
+ PUGI__FN int xml_attribute::as_int(int def) const
+ {
+ return impl::get_value_int(_attr ? _attr->value : 0, def);
+ }
+
+ PUGI__FN unsigned int xml_attribute::as_uint(unsigned int def) const
+ {
+ return impl::get_value_uint(_attr ? _attr->value : 0, def);
+ }
+
+ PUGI__FN double xml_attribute::as_double(double def) const
+ {
+ return impl::get_value_double(_attr ? _attr->value : 0, def);
+ }
+
+ PUGI__FN float xml_attribute::as_float(float def) const
+ {
+ return impl::get_value_float(_attr ? _attr->value : 0, def);
+ }
+
+ PUGI__FN bool xml_attribute::as_bool(bool def) const
+ {
+ return impl::get_value_bool(_attr ? _attr->value : 0, def);
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN long long xml_attribute::as_llong(long long def) const
+ {
+ return impl::get_value_llong(_attr ? _attr->value : 0, def);
+ }
+
+ PUGI__FN unsigned long long xml_attribute::as_ullong(unsigned long long def) const
+ {
+ return impl::get_value_ullong(_attr ? _attr->value : 0, def);
+ }
+#endif
+
+ PUGI__FN bool xml_attribute::empty() const
+ {
+ return !_attr;
+ }
+
+ PUGI__FN const char_t* xml_attribute::name() const
+ {
+ return (_attr && _attr->name) ? _attr->name : PUGIXML_TEXT("");
+ }
+
+ PUGI__FN const char_t* xml_attribute::value() const
+ {
+ return (_attr && _attr->value) ? _attr->value : PUGIXML_TEXT("");
+ }
+
+ PUGI__FN size_t xml_attribute::hash_value() const
+ {
+ return static_cast<size_t>(reinterpret_cast<uintptr_t>(_attr) / sizeof(xml_attribute_struct));
+ }
+
+ PUGI__FN xml_attribute_struct* xml_attribute::internal_object() const
+ {
+ return _attr;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(const char_t* rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(int rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(unsigned int rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(double rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(float rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(bool rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN xml_attribute& xml_attribute::operator=(long long rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long long rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+#endif
+
+ PUGI__FN bool xml_attribute::set_name(const char_t* rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(const char_t* rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(int rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(unsigned int rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(double rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(float rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(bool rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN bool xml_attribute::set_value(long long rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+
+ PUGI__FN bool xml_attribute::set_value(unsigned long long rhs)
+ {
+ if (!_attr) return false;
+
+ return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+ }
+#endif
+
+#ifdef __BORLANDC__
+ PUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs)
+ {
+ return (bool)lhs && rhs;
+ }
+
+ PUGI__FN bool operator||(const xml_attribute& lhs, bool rhs)
+ {
+ return (bool)lhs || rhs;
+ }
+#endif
+
+ PUGI__FN xml_node::xml_node(): _root(0)
+ {
+ }
+
+ PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p)
+ {
+ }
+
+ PUGI__FN static void unspecified_bool_xml_node(xml_node***)
+ {
+ }
+
+ PUGI__FN xml_node::operator xml_node::unspecified_bool_type() const
+ {
+ return _root ? unspecified_bool_xml_node : 0;
+ }
+
+ PUGI__FN bool xml_node::operator!() const
+ {
+ return !_root;
+ }
+
+ PUGI__FN xml_node::iterator xml_node::begin() const
+ {
+ return iterator(_root ? _root->first_child : 0, _root);
+ }
+
+ PUGI__FN xml_node::iterator xml_node::end() const
+ {
+ return iterator(0, _root);
+ }
+
+ PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const
+ {
+ return attribute_iterator(_root ? _root->first_attribute : 0, _root);
+ }
+
+ PUGI__FN xml_node::attribute_iterator xml_node::attributes_end() const
+ {
+ return attribute_iterator(0, _root);
+ }
+
+ PUGI__FN xml_object_range<xml_node_iterator> xml_node::children() const
+ {
+ return xml_object_range<xml_node_iterator>(begin(), end());
+ }
+
+ PUGI__FN xml_object_range<xml_named_node_iterator> xml_node::children(const char_t* name_) const
+ {
+ return xml_object_range<xml_named_node_iterator>(xml_named_node_iterator(child(name_)._root, _root, name_), xml_named_node_iterator(0, _root, name_));
+ }
+
+ PUGI__FN xml_object_range<xml_attribute_iterator> xml_node::attributes() const
+ {
+ return xml_object_range<xml_attribute_iterator>(attributes_begin(), attributes_end());
+ }
+
+ PUGI__FN bool xml_node::operator==(const xml_node& r) const
+ {
+ return (_root == r._root);
+ }
+
+ PUGI__FN bool xml_node::operator!=(const xml_node& r) const
+ {
+ return (_root != r._root);
+ }
+
+ PUGI__FN bool xml_node::operator<(const xml_node& r) const
+ {
+ return (_root < r._root);
+ }
+
+ PUGI__FN bool xml_node::operator>(const xml_node& r) const
+ {
+ return (_root > r._root);
+ }
+
+ PUGI__FN bool xml_node::operator<=(const xml_node& r) const
+ {
+ return (_root <= r._root);
+ }
+
+ PUGI__FN bool xml_node::operator>=(const xml_node& r) const
+ {
+ return (_root >= r._root);
+ }
+
+ PUGI__FN bool xml_node::empty() const
+ {
+ return !_root;
+ }
+
+ PUGI__FN const char_t* xml_node::name() const
+ {
+ return (_root && _root->name) ? _root->name : PUGIXML_TEXT("");
+ }
+
+ PUGI__FN xml_node_type xml_node::type() const
+ {
+ return _root ? PUGI__NODETYPE(_root) : node_null;
+ }
+
+ PUGI__FN const char_t* xml_node::value() const
+ {
+ return (_root && _root->value) ? _root->value : PUGIXML_TEXT("");
+ }
+
+ PUGI__FN xml_node xml_node::child(const char_t* name_) const
+ {
+ if (!_root) return xml_node();
+
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ PUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const
+ {
+ if (!_root) return xml_attribute();
+
+ for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)
+ if (i->name && impl::strequal(name_, i->name))
+ return xml_attribute(i);
+
+ return xml_attribute();
+ }
+
+ PUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const
+ {
+ if (!_root) return xml_node();
+
+ for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)
+ if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::next_sibling() const
+ {
+ return _root ? xml_node(_root->next_sibling) : xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const
+ {
+ if (!_root) return xml_node();
+
+ for (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c)
+ if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::previous_sibling() const
+ {
+ if (!_root) return xml_node();
+
+ if (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c);
+ else return xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::parent() const
+ {
+ return _root ? xml_node(_root->parent) : xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::root() const
+ {
+ return _root ? xml_node(&impl::get_document(_root)) : xml_node();
+ }
+
+ PUGI__FN xml_text xml_node::text() const
+ {
+ return xml_text(_root);
+ }
+
+ PUGI__FN const char_t* xml_node::child_value() const
+ {
+ if (!_root) return PUGIXML_TEXT("");
+
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if (i->value && impl::is_text_node(i))
+ return i->value;
+
+ return PUGIXML_TEXT("");
+ }
+
+ PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const
+ {
+ return child(name_).child_value();
+ }
+
+ PUGI__FN xml_attribute xml_node::first_attribute() const
+ {
+ return _root ? xml_attribute(_root->first_attribute) : xml_attribute();
+ }
+
+ PUGI__FN xml_attribute xml_node::last_attribute() const
+ {
+ return _root && _root->first_attribute ? xml_attribute(_root->first_attribute->prev_attribute_c) : xml_attribute();
+ }
+
+ PUGI__FN xml_node xml_node::first_child() const
+ {
+ return _root ? xml_node(_root->first_child) : xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::last_child() const
+ {
+ return _root && _root->first_child ? xml_node(_root->first_child->prev_sibling_c) : xml_node();
+ }
+
+ PUGI__FN bool xml_node::set_name(const char_t* rhs)
+ {
+ switch (type())
+ {
+ case node_pi:
+ case node_declaration:
+ case node_element:
+ return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs);
+
+ default:
+ return false;
+ }
+ }
+
+ PUGI__FN bool xml_node::set_value(const char_t* rhs)
+ {
+ switch (type())
+ {
+ case node_pi:
+ case node_cdata:
+ case node_pcdata:
+ case node_comment:
+ case node_doctype:
+ return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs);
+
+ default:
+ return false;
+ }
+ }
+
+ PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_)
+ {
+ if (!impl::allow_insert_attribute(type())) return xml_attribute();
+
+ xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+ if (!a) return xml_attribute();
+
+ impl::append_attribute(a._attr, _root);
+
+ a.set_name(name_);
+
+ return a;
+ }
+
+ PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_)
+ {
+ if (!impl::allow_insert_attribute(type())) return xml_attribute();
+
+ xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+ if (!a) return xml_attribute();
+
+ impl::prepend_attribute(a._attr, _root);
+
+ a.set_name(name_);
+
+ return a;
+ }
+
+ PUGI__FN xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr)
+ {
+ if (!impl::allow_insert_attribute(type())) return xml_attribute();
+ if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();
+
+ xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+ if (!a) return xml_attribute();
+
+ impl::insert_attribute_after(a._attr, attr._attr, _root);
+
+ a.set_name(name_);
+
+ return a;
+ }
+
+ PUGI__FN xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr)
+ {
+ if (!impl::allow_insert_attribute(type())) return xml_attribute();
+ if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();
+
+ xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+ if (!a) return xml_attribute();
+
+ impl::insert_attribute_before(a._attr, attr._attr, _root);
+
+ a.set_name(name_);
+
+ return a;
+ }
+
+ PUGI__FN xml_attribute xml_node::append_copy(const xml_attribute& proto)
+ {
+ if (!proto) return xml_attribute();
+
+ xml_attribute result = append_attribute(proto.name());
+ result.set_value(proto.value());
+
+ return result;
+ }
+
+ PUGI__FN xml_attribute xml_node::prepend_copy(const xml_attribute& proto)
+ {
+ if (!proto) return xml_attribute();
+
+ xml_attribute result = prepend_attribute(proto.name());
+ result.set_value(proto.value());
+
+ return result;
+ }
+
+ PUGI__FN xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr)
+ {
+ if (!proto) return xml_attribute();
+
+ xml_attribute result = insert_attribute_after(proto.name(), attr);
+ result.set_value(proto.value());
+
+ return result;
+ }
+
+ PUGI__FN xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr)
+ {
+ if (!proto) return xml_attribute();
+
+ xml_attribute result = insert_attribute_before(proto.name(), attr);
+ result.set_value(proto.value());
+
+ return result;
+ }
+
+ PUGI__FN xml_node xml_node::append_child(xml_node_type type_)
+ {
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::append_node(n._root, _root);
+
+ if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::prepend_child(xml_node_type type_)
+ {
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::prepend_node(n._root, _root);
+
+ if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node)
+ {
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+ if (!node._root || node._root->parent != _root) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::insert_node_before(n._root, node._root);
+
+ if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node)
+ {
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+ if (!node._root || node._root->parent != _root) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::insert_node_after(n._root, node._root);
+
+ if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::append_child(const char_t* name_)
+ {
+ xml_node result = append_child(node_element);
+
+ result.set_name(name_);
+
+ return result;
+ }
+
+ PUGI__FN xml_node xml_node::prepend_child(const char_t* name_)
+ {
+ xml_node result = prepend_child(node_element);
+
+ result.set_name(name_);
+
+ return result;
+ }
+
+ PUGI__FN xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node)
+ {
+ xml_node result = insert_child_after(node_element, node);
+
+ result.set_name(name_);
+
+ return result;
+ }
+
+ PUGI__FN xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node)
+ {
+ xml_node result = insert_child_before(node_element, node);
+
+ result.set_name(name_);
+
+ return result;
+ }
+
+ PUGI__FN xml_node xml_node::append_copy(const xml_node& proto)
+ {
+ xml_node_type type_ = proto.type();
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::append_node(n._root, _root);
+ impl::node_copy_tree(n._root, proto._root);
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::prepend_copy(const xml_node& proto)
+ {
+ xml_node_type type_ = proto.type();
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::prepend_node(n._root, _root);
+ impl::node_copy_tree(n._root, proto._root);
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node)
+ {
+ xml_node_type type_ = proto.type();
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+ if (!node._root || node._root->parent != _root) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::insert_node_after(n._root, node._root);
+ impl::node_copy_tree(n._root, proto._root);
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node)
+ {
+ xml_node_type type_ = proto.type();
+ if (!impl::allow_insert_child(type(), type_)) return xml_node();
+ if (!node._root || node._root->parent != _root) return xml_node();
+
+ xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+ if (!n) return xml_node();
+
+ impl::insert_node_before(n._root, node._root);
+ impl::node_copy_tree(n._root, proto._root);
+
+ return n;
+ }
+
+ PUGI__FN xml_node xml_node::append_move(const xml_node& moved)
+ {
+ if (!impl::allow_move(*this, moved)) return xml_node();
+
+ // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+ impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+ impl::remove_node(moved._root);
+ impl::append_node(moved._root, _root);
+
+ return moved;
+ }
+
+ PUGI__FN xml_node xml_node::prepend_move(const xml_node& moved)
+ {
+ if (!impl::allow_move(*this, moved)) return xml_node();
+
+ // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+ impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+ impl::remove_node(moved._root);
+ impl::prepend_node(moved._root, _root);
+
+ return moved;
+ }
+
+ PUGI__FN xml_node xml_node::insert_move_after(const xml_node& moved, const xml_node& node)
+ {
+ if (!impl::allow_move(*this, moved)) return xml_node();
+ if (!node._root || node._root->parent != _root) return xml_node();
+ if (moved._root == node._root) return xml_node();
+
+ // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+ impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+ impl::remove_node(moved._root);
+ impl::insert_node_after(moved._root, node._root);
+
+ return moved;
+ }
+
+ PUGI__FN xml_node xml_node::insert_move_before(const xml_node& moved, const xml_node& node)
+ {
+ if (!impl::allow_move(*this, moved)) return xml_node();
+ if (!node._root || node._root->parent != _root) return xml_node();
+ if (moved._root == node._root) return xml_node();
+
+ // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+ impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+ impl::remove_node(moved._root);
+ impl::insert_node_before(moved._root, node._root);
+
+ return moved;
+ }
+
+ PUGI__FN bool xml_node::remove_attribute(const char_t* name_)
+ {
+ return remove_attribute(attribute(name_));
+ }
+
+ PUGI__FN bool xml_node::remove_attribute(const xml_attribute& a)
+ {
+ if (!_root || !a._attr) return false;
+ if (!impl::is_attribute_of(a._attr, _root)) return false;
+
+ impl::remove_attribute(a._attr, _root);
+ impl::destroy_attribute(a._attr, impl::get_allocator(_root));
+
+ return true;
+ }
+
+ PUGI__FN bool xml_node::remove_child(const char_t* name_)
+ {
+ return remove_child(child(name_));
+ }
+
+ PUGI__FN bool xml_node::remove_child(const xml_node& n)
+ {
+ if (!_root || !n._root || n._root->parent != _root) return false;
+
+ impl::remove_node(n._root);
+ impl::destroy_node(n._root, impl::get_allocator(_root));
+
+ return true;
+ }
+
+ PUGI__FN xml_parse_result xml_node::append_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)
+ {
+ // append_buffer is only valid for elements/documents
+ if (!impl::allow_insert_child(type(), node_element)) return impl::make_parse_result(status_append_invalid_root);
+
+ // get document node
+ impl::xml_document_struct* doc = &impl::get_document(_root);
+
+ // disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense
+ doc->header |= impl::xml_memory_page_contents_shared_mask;
+
+ // get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later)
+ impl::xml_memory_page* page = 0;
+ impl::xml_extra_buffer* extra = static_cast<impl::xml_extra_buffer*>(doc->allocate_memory(sizeof(impl::xml_extra_buffer), page));
+ (void)page;
+
+ if (!extra) return impl::make_parse_result(status_out_of_memory);
+
+ // save name; name of the root has to be NULL before parsing - otherwise closing node mismatches will not be detected at the top level
+ char_t* rootname = _root->name;
+ _root->name = 0;
+
+ // parse
+ char_t* buffer = 0;
+ xml_parse_result res = impl::load_buffer_impl(doc, _root, const_cast<void*>(contents), size, options, encoding, false, false, &buffer);
+
+ // restore name
+ _root->name = rootname;
+
+ // add extra buffer to the list
+ extra->buffer = buffer;
+ extra->next = doc->extra_buffers;
+ doc->extra_buffers = extra;
+
+ return res;
+ }
+
+ PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const
+ {
+ if (!_root) return xml_node();
+
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if (i->name && impl::strequal(name_, i->name))
+ {
+ for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)
+ if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value : PUGIXML_TEXT("")))
+ return xml_node(i);
+ }
+
+ return xml_node();
+ }
+
+ PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const
+ {
+ if (!_root) return xml_node();
+
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)
+ if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value : PUGIXML_TEXT("")))
+ return xml_node(i);
+
+ return xml_node();
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN string_t xml_node::path(char_t delimiter) const
+ {
+ xml_node cursor = *this; // Make a copy.
+
+ string_t result = cursor.name();
+
+ while (cursor.parent())
+ {
+ cursor = cursor.parent();
+
+ string_t temp = cursor.name();
+ temp += delimiter;
+ temp += result;
+ result.swap(temp);
+ }
+
+ return result;
+ }
+#endif
+
+ PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const
+ {
+ xml_node found = *this; // Current search context.
+
+ if (!_root || !path_ || !path_[0]) return found;
+
+ if (path_[0] == delimiter)
+ {
+ // Absolute path; e.g. '/foo/bar'
+ found = found.root();
+ ++path_;
+ }
+
+ const char_t* path_segment = path_;
+
+ while (*path_segment == delimiter) ++path_segment;
+
+ const char_t* path_segment_end = path_segment;
+
+ while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end;
+
+ if (path_segment == path_segment_end) return found;
+
+ const char_t* next_segment = path_segment_end;
+
+ while (*next_segment == delimiter) ++next_segment;
+
+ if (*path_segment == '.' && path_segment + 1 == path_segment_end)
+ return found.first_element_by_path(next_segment, delimiter);
+ else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end)
+ return found.parent().first_element_by_path(next_segment, delimiter);
+ else
+ {
+ for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)
+ {
+ if (j->name && impl::strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment)))
+ {
+ xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter);
+
+ if (subsearch) return subsearch;
+ }
+ }
+
+ return xml_node();
+ }
+ }
+
+ PUGI__FN bool xml_node::traverse(xml_tree_walker& walker)
+ {
+ walker._depth = -1;
+
+ xml_node arg_begin = *this;
+ if (!walker.begin(arg_begin)) return false;
+
+ xml_node cur = first_child();
+
+ if (cur)
+ {
+ ++walker._depth;
+
+ do
+ {
+ xml_node arg_for_each = cur;
+ if (!walker.for_each(arg_for_each))
+ return false;
+
+ if (cur.first_child())
+ {
+ ++walker._depth;
+ cur = cur.first_child();
+ }
+ else if (cur.next_sibling())
+ cur = cur.next_sibling();
+ else
+ {
+ // Borland C++ workaround
+ while (!cur.next_sibling() && cur != *this && !cur.parent().empty())
+ {
+ --walker._depth;
+ cur = cur.parent();
+ }
+
+ if (cur != *this)
+ cur = cur.next_sibling();
+ }
+ }
+ while (cur && cur != *this);
+ }
+
+ assert(walker._depth == -1);
+
+ xml_node arg_end = *this;
+ return walker.end(arg_end);
+ }
+
+ PUGI__FN size_t xml_node::hash_value() const
+ {
+ return static_cast<size_t>(reinterpret_cast<uintptr_t>(_root) / sizeof(xml_node_struct));
+ }
+
+ PUGI__FN xml_node_struct* xml_node::internal_object() const
+ {
+ return _root;
+ }
+
+ PUGI__FN void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const
+ {
+ if (!_root) return;
+
+ impl::xml_buffered_writer buffered_writer(writer, encoding);
+
+ impl::node_output(buffered_writer, _root, indent, flags, depth);
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN void xml_node::print(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const
+ {
+ xml_writer_stream writer(stream);
+
+ print(writer, indent, flags, encoding, depth);
+ }
+
+ PUGI__FN void xml_node::print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const
+ {
+ xml_writer_stream writer(stream);
+
+ print(writer, indent, flags, encoding_wchar, depth);
+ }
+#endif
+
+ PUGI__FN ptrdiff_t xml_node::offset_debug() const
+ {
+ if (!_root) return -1;
+
+ impl::xml_document_struct& doc = impl::get_document(_root);
+
+ // we can determine the offset reliably only if there is exactly once parse buffer
+ if (!doc.buffer || doc.extra_buffers) return -1;
+
+ switch (type())
+ {
+ case node_document:
+ return 0;
+
+ case node_element:
+ case node_declaration:
+ case node_pi:
+ return _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1;
+
+ case node_pcdata:
+ case node_cdata:
+ case node_comment:
+ case node_doctype:
+ return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1;
+
+ default:
+ return -1;
+ }
+ }
+
+#ifdef __BORLANDC__
+ PUGI__FN bool operator&&(const xml_node& lhs, bool rhs)
+ {
+ return (bool)lhs && rhs;
+ }
+
+ PUGI__FN bool operator||(const xml_node& lhs, bool rhs)
+ {
+ return (bool)lhs || rhs;
+ }
+#endif
+
+ PUGI__FN xml_text::xml_text(xml_node_struct* root): _root(root)
+ {
+ }
+
+ PUGI__FN xml_node_struct* xml_text::_data() const
+ {
+ if (!_root || impl::is_text_node(_root)) return _root;
+
+ for (xml_node_struct* node = _root->first_child; node; node = node->next_sibling)
+ if (impl::is_text_node(node))
+ return node;
+
+ return 0;
+ }
+
+ PUGI__FN xml_node_struct* xml_text::_data_new()
+ {
+ xml_node_struct* d = _data();
+ if (d) return d;
+
+ return xml_node(_root).append_child(node_pcdata).internal_object();
+ }
+
+ PUGI__FN xml_text::xml_text(): _root(0)
+ {
+ }
+
+ PUGI__FN static void unspecified_bool_xml_text(xml_text***)
+ {
+ }
+
+ PUGI__FN xml_text::operator xml_text::unspecified_bool_type() const
+ {
+ return _data() ? unspecified_bool_xml_text : 0;
+ }
+
+ PUGI__FN bool xml_text::operator!() const
+ {
+ return !_data();
+ }
+
+ PUGI__FN bool xml_text::empty() const
+ {
+ return _data() == 0;
+ }
+
+ PUGI__FN const char_t* xml_text::get() const
+ {
+ xml_node_struct* d = _data();
+
+ return (d && d->value) ? d->value : PUGIXML_TEXT("");
+ }
+
+ PUGI__FN const char_t* xml_text::as_string(const char_t* def) const
+ {
+ xml_node_struct* d = _data();
+
+ return (d && d->value) ? d->value : def;
+ }
+
+ PUGI__FN int xml_text::as_int(int def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_int(d ? d->value : 0, def);
+ }
+
+ PUGI__FN unsigned int xml_text::as_uint(unsigned int def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_uint(d ? d->value : 0, def);
+ }
+
+ PUGI__FN double xml_text::as_double(double def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_double(d ? d->value : 0, def);
+ }
+
+ PUGI__FN float xml_text::as_float(float def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_float(d ? d->value : 0, def);
+ }
+
+ PUGI__FN bool xml_text::as_bool(bool def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_bool(d ? d->value : 0, def);
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN long long xml_text::as_llong(long long def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_llong(d ? d->value : 0, def);
+ }
+
+ PUGI__FN unsigned long long xml_text::as_ullong(unsigned long long def) const
+ {
+ xml_node_struct* d = _data();
+
+ return impl::get_value_ullong(d ? d->value : 0, def);
+ }
+#endif
+
+ PUGI__FN bool xml_text::set(const char_t* rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+ PUGI__FN bool xml_text::set(int rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+ PUGI__FN bool xml_text::set(unsigned int rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+ PUGI__FN bool xml_text::set(float rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+ PUGI__FN bool xml_text::set(double rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+ PUGI__FN bool xml_text::set(bool rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN bool xml_text::set(long long rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+
+ PUGI__FN bool xml_text::set(unsigned long long rhs)
+ {
+ xml_node_struct* dn = _data_new();
+
+ return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+ }
+#endif
+
+ PUGI__FN xml_text& xml_text::operator=(const char_t* rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_text& xml_text::operator=(int rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_text& xml_text::operator=(unsigned int rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_text& xml_text::operator=(double rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_text& xml_text::operator=(float rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_text& xml_text::operator=(bool rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+#ifdef PUGIXML_HAS_LONG_LONG
+ PUGI__FN xml_text& xml_text::operator=(long long rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+
+ PUGI__FN xml_text& xml_text::operator=(unsigned long long rhs)
+ {
+ set(rhs);
+ return *this;
+ }
+#endif
+
+ PUGI__FN xml_node xml_text::data() const
+ {
+ return xml_node(_data());
+ }
+
+#ifdef __BORLANDC__
+ PUGI__FN bool operator&&(const xml_text& lhs, bool rhs)
+ {
+ return (bool)lhs && rhs;
+ }
+
+ PUGI__FN bool operator||(const xml_text& lhs, bool rhs)
+ {
+ return (bool)lhs || rhs;
+ }
+#endif
+
+ PUGI__FN xml_node_iterator::xml_node_iterator()
+ {
+ }
+
+ PUGI__FN xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent())
+ {
+ }
+
+ PUGI__FN xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)
+ {
+ }
+
+ PUGI__FN bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const
+ {
+ return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;
+ }
+
+ PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const
+ {
+ return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;
+ }
+
+ PUGI__FN xml_node& xml_node_iterator::operator*() const
+ {
+ assert(_wrap._root);
+ return _wrap;
+ }
+
+ PUGI__FN xml_node* xml_node_iterator::operator->() const
+ {
+ assert(_wrap._root);
+ return const_cast<xml_node*>(&_wrap); // BCC32 workaround
+ }
+
+ PUGI__FN const xml_node_iterator& xml_node_iterator::operator++()
+ {
+ assert(_wrap._root);
+ _wrap._root = _wrap._root->next_sibling;
+ return *this;
+ }
+
+ PUGI__FN xml_node_iterator xml_node_iterator::operator++(int)
+ {
+ xml_node_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ PUGI__FN const xml_node_iterator& xml_node_iterator::operator--()
+ {
+ _wrap = _wrap._root ? _wrap.previous_sibling() : _parent.last_child();
+ return *this;
+ }
+
+ PUGI__FN xml_node_iterator xml_node_iterator::operator--(int)
+ {
+ xml_node_iterator temp = *this;
+ --*this;
+ return temp;
+ }
+
+ PUGI__FN xml_attribute_iterator::xml_attribute_iterator()
+ {
+ }
+
+ PUGI__FN xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent)
+ {
+ }
+
+ PUGI__FN xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)
+ {
+ }
+
+ PUGI__FN bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const
+ {
+ return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root;
+ }
+
+ PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const
+ {
+ return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root;
+ }
+
+ PUGI__FN xml_attribute& xml_attribute_iterator::operator*() const
+ {
+ assert(_wrap._attr);
+ return _wrap;
+ }
+
+ PUGI__FN xml_attribute* xml_attribute_iterator::operator->() const
+ {
+ assert(_wrap._attr);
+ return const_cast<xml_attribute*>(&_wrap); // BCC32 workaround
+ }
+
+ PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++()
+ {
+ assert(_wrap._attr);
+ _wrap._attr = _wrap._attr->next_attribute;
+ return *this;
+ }
+
+ PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator++(int)
+ {
+ xml_attribute_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator--()
+ {
+ _wrap = _wrap._attr ? _wrap.previous_attribute() : _parent.last_attribute();
+ return *this;
+ }
+
+ PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator--(int)
+ {
+ xml_attribute_iterator temp = *this;
+ --*this;
+ return temp;
+ }
+
+ PUGI__FN xml_named_node_iterator::xml_named_node_iterator(): _name(0)
+ {
+ }
+
+ PUGI__FN xml_named_node_iterator::xml_named_node_iterator(const xml_node& node, const char_t* name): _wrap(node), _parent(node.parent()), _name(name)
+ {
+ }
+
+ PUGI__FN xml_named_node_iterator::xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name): _wrap(ref), _parent(parent), _name(name)
+ {
+ }
+
+ PUGI__FN bool xml_named_node_iterator::operator==(const xml_named_node_iterator& rhs) const
+ {
+ return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;
+ }
+
+ PUGI__FN bool xml_named_node_iterator::operator!=(const xml_named_node_iterator& rhs) const
+ {
+ return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;
+ }
+
+ PUGI__FN xml_node& xml_named_node_iterator::operator*() const
+ {
+ assert(_wrap._root);
+ return _wrap;
+ }
+
+ PUGI__FN xml_node* xml_named_node_iterator::operator->() const
+ {
+ assert(_wrap._root);
+ return const_cast<xml_node*>(&_wrap); // BCC32 workaround
+ }
+
+ PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator++()
+ {
+ assert(_wrap._root);
+ _wrap = _wrap.next_sibling(_name);
+ return *this;
+ }
+
+ PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator++(int)
+ {
+ xml_named_node_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator--()
+ {
+ if (_wrap._root)
+ _wrap = _wrap.previous_sibling(_name);
+ else
+ {
+ _wrap = _parent.last_child();
+
+ if (!impl::strequal(_wrap.name(), _name))
+ _wrap = _wrap.previous_sibling(_name);
+ }
+
+ return *this;
+ }
+
+ PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator--(int)
+ {
+ xml_named_node_iterator temp = *this;
+ --*this;
+ return temp;
+ }
+
+ PUGI__FN xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto)
+ {
+ }
+
+ PUGI__FN xml_parse_result::operator bool() const
+ {
+ return status == status_ok;
+ }
+
+ PUGI__FN const char* xml_parse_result::description() const
+ {
+ switch (status)
+ {
+ case status_ok: return "No error";
+
+ case status_file_not_found: return "File was not found";
+ case status_io_error: return "Error reading from file/stream";
+ case status_out_of_memory: return "Could not allocate memory";
+ case status_internal_error: return "Internal error occurred";
+
+ case status_unrecognized_tag: return "Could not determine tag type";
+
+ case status_bad_pi: return "Error parsing document declaration/processing instruction";
+ case status_bad_comment: return "Error parsing comment";
+ case status_bad_cdata: return "Error parsing CDATA section";
+ case status_bad_doctype: return "Error parsing document type declaration";
+ case status_bad_pcdata: return "Error parsing PCDATA section";
+ case status_bad_start_element: return "Error parsing start element tag";
+ case status_bad_attribute: return "Error parsing element attribute";
+ case status_bad_end_element: return "Error parsing end element tag";
+ case status_end_element_mismatch: return "Start-end tags mismatch";
+
+ case status_append_invalid_root: return "Unable to append nodes: root is not an element or document";
+
+ case status_no_document_element: return "No document element found";
+
+ default: return "Unknown error";
+ }
+ }
+
+ PUGI__FN xml_document::xml_document(): _buffer(0)
+ {
+ create();
+ }
+
+ PUGI__FN xml_document::~xml_document()
+ {
+ destroy();
+ }
+
+ PUGI__FN void xml_document::reset()
+ {
+ destroy();
+ create();
+ }
+
+ PUGI__FN void xml_document::reset(const xml_document& proto)
+ {
+ reset();
+
+ for (xml_node cur = proto.first_child(); cur; cur = cur.next_sibling())
+ append_copy(cur);
+ }
+
+ PUGI__FN void xml_document::create()
+ {
+ assert(!_root);
+
+ // initialize sentinel page
+ PUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment - sizeof(void*) <= sizeof(_memory));
+
+ // align upwards to page boundary
+ void* page_memory = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(_memory) + (impl::xml_memory_page_alignment - 1)) & ~(impl::xml_memory_page_alignment - 1));
+
+ // prepare page structure
+ impl::xml_memory_page* page = impl::xml_memory_page::construct(page_memory);
+ assert(page);
+
+ page->busy_size = impl::xml_memory_page_size;
+
+ // allocate new root
+ _root = new (reinterpret_cast<char*>(page) + sizeof(impl::xml_memory_page)) impl::xml_document_struct(page);
+ _root->prev_sibling_c = _root;
+
+ // setup sentinel page
+ page->allocator = static_cast<impl::xml_document_struct*>(_root);
+
+ // verify the document allocation
+ assert(reinterpret_cast<char*>(_root) + sizeof(impl::xml_document_struct) <= _memory + sizeof(_memory));
+ }
+
+ PUGI__FN void xml_document::destroy()
+ {
+ assert(_root);
+
+ // destroy static storage
+ if (_buffer)
+ {
+ impl::xml_memory::deallocate(_buffer);
+ _buffer = 0;
+ }
+
+ // destroy extra buffers (note: no need to destroy linked list nodes, they're allocated using document allocator)
+ for (impl::xml_extra_buffer* extra = static_cast<impl::xml_document_struct*>(_root)->extra_buffers; extra; extra = extra->next)
+ {
+ if (extra->buffer) impl::xml_memory::deallocate(extra->buffer);
+ }
+
+ // destroy dynamic storage, leave sentinel page (it's in static memory)
+ impl::xml_memory_page* root_page = reinterpret_cast<impl::xml_memory_page*>(_root->header & impl::xml_memory_page_pointer_mask);
+ assert(root_page && !root_page->prev);
+ assert(reinterpret_cast<char*>(root_page) >= _memory && reinterpret_cast<char*>(root_page) < _memory + sizeof(_memory));
+
+ for (impl::xml_memory_page* page = root_page->next; page; )
+ {
+ impl::xml_memory_page* next = page->next;
+
+ impl::xml_allocator::deallocate_page(page);
+
+ page = next;
+ }
+
+ _root = 0;
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN xml_parse_result xml_document::load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options, xml_encoding encoding)
+ {
+ reset();
+
+ return impl::load_stream_impl(*this, stream, options, encoding);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options)
+ {
+ reset();
+
+ return impl::load_stream_impl(*this, stream, options, encoding_wchar);
+ }
+#endif
+
+ PUGI__FN xml_parse_result xml_document::load_string(const char_t* contents, unsigned int options)
+ {
+ // Force native encoding (skip autodetection)
+ #ifdef PUGIXML_WCHAR_MODE
+ xml_encoding encoding = encoding_wchar;
+ #else
+ xml_encoding encoding = encoding_utf8;
+ #endif
+
+ return load_buffer(contents, impl::strlength(contents) * sizeof(char_t), options, encoding);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load(const char_t* contents, unsigned int options)
+ {
+ return load_string(contents, options);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding)
+ {
+ reset();
+
+ FILE* file = fopen(path_, "rb");
+
+ return impl::load_file_impl(*this, file, options, encoding);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding)
+ {
+ reset();
+
+ FILE* file = impl::open_file_wide(path_, L"rb");
+
+ return impl::load_file_impl(*this, file, options, encoding);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)
+ {
+ reset();
+
+ return impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, const_cast<void*>(contents), size, options, encoding, false, false, &_buffer);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding)
+ {
+ reset();
+
+ return impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, contents, size, options, encoding, true, false, &_buffer);
+ }
+
+ PUGI__FN xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding)
+ {
+ reset();
+
+ return impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, contents, size, options, encoding, true, true, &_buffer);
+ }
+
+ PUGI__FN void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+ {
+ impl::xml_buffered_writer buffered_writer(writer, encoding);
+
+ if ((flags & format_write_bom) && encoding != encoding_latin1)
+ {
+ // BOM always represents the codepoint U+FEFF, so just write it in native encoding
+ #ifdef PUGIXML_WCHAR_MODE
+ unsigned int bom = 0xfeff;
+ buffered_writer.write(static_cast<wchar_t>(bom));
+ #else
+ buffered_writer.write('\xef', '\xbb', '\xbf');
+ #endif
+ }
+
+ if (!(flags & format_no_declaration) && !impl::has_declaration(_root))
+ {
+ buffered_writer.write_string(PUGIXML_TEXT("<?xml version=\"1.0\""));
+ if (encoding == encoding_latin1) buffered_writer.write_string(PUGIXML_TEXT(" encoding=\"ISO-8859-1\""));
+ buffered_writer.write('?', '>');
+ if (!(flags & format_raw)) buffered_writer.write('\n');
+ }
+
+ impl::node_output(buffered_writer, _root, indent, flags, 0);
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN void xml_document::save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+ {
+ xml_writer_stream writer(stream);
+
+ save(writer, indent, flags, encoding);
+ }
+
+ PUGI__FN void xml_document::save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags) const
+ {
+ xml_writer_stream writer(stream);
+
+ save(writer, indent, flags, encoding_wchar);
+ }
+#endif
+
+ PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+ {
+ FILE* file = fopen(path_, (flags & format_save_file_text) ? "w" : "wb");
+ return impl::save_file_impl(*this, file, indent, flags, encoding);
+ }
+
+ PUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+ {
+ FILE* file = impl::open_file_wide(path_, (flags & format_save_file_text) ? L"w" : L"wb");
+ return impl::save_file_impl(*this, file, indent, flags, encoding);
+ }
+
+ PUGI__FN xml_node xml_document::document_element() const
+ {
+ assert(_root);
+
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if (PUGI__NODETYPE(i) == node_element)
+ return xml_node(i);
+
+ return xml_node();
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str)
+ {
+ assert(str);
+
+ return impl::as_utf8_impl(str, impl::strlength_wide(str));
+ }
+
+ PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t>& str)
+ {
+ return impl::as_utf8_impl(str.c_str(), str.size());
+ }
+
+ PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const char* str)
+ {
+ assert(str);
+
+ return impl::as_wide_impl(str, strlen(str));
+ }
+
+ PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const std::string& str)
+ {
+ return impl::as_wide_impl(str.c_str(), str.size());
+ }
+#endif
+
+ PUGI__FN void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate)
+ {
+ impl::xml_memory::allocate = allocate;
+ impl::xml_memory::deallocate = deallocate;
+ }
+
+ PUGI__FN allocation_function PUGIXML_FUNCTION get_memory_allocation_function()
+ {
+ return impl::xml_memory::allocate;
+ }
+
+ PUGI__FN deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function()
+ {
+ return impl::xml_memory::deallocate;
+ }
+}
+
+#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
+namespace std
+{
+ // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
+ PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_node_iterator&)
+ {
+ return std::bidirectional_iterator_tag();
+ }
+
+ PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_attribute_iterator&)
+ {
+ return std::bidirectional_iterator_tag();
+ }
+
+ PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_named_node_iterator&)
+ {
+ return std::bidirectional_iterator_tag();
+ }
+}
+#endif
+
+#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
+namespace std
+{
+ // Workarounds for (non-standard) iterator category detection
+ PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&)
+ {
+ return std::bidirectional_iterator_tag();
+ }
+
+ PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&)
+ {
+ return std::bidirectional_iterator_tag();
+ }
+
+ PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_named_node_iterator&)
+ {
+ return std::bidirectional_iterator_tag();
+ }
+}
+#endif
+
+#ifndef PUGIXML_NO_XPATH
+// STL replacements
+PUGI__NS_BEGIN
+ struct equal_to
+ {
+ template <typename T> bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs == rhs;
+ }
+ };
+
+ struct not_equal_to
+ {
+ template <typename T> bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs != rhs;
+ }
+ };
+
+ struct less
+ {
+ template <typename T> bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs < rhs;
+ }
+ };
+
+ struct less_equal
+ {
+ template <typename T> bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs <= rhs;
+ }
+ };
+
+ template <typename T> void swap(T& lhs, T& rhs)
+ {
+ T temp = lhs;
+ lhs = rhs;
+ rhs = temp;
+ }
+
+ template <typename I, typename Pred> I min_element(I begin, I end, const Pred& pred)
+ {
+ I result = begin;
+
+ for (I it = begin + 1; it != end; ++it)
+ if (pred(*it, *result))
+ result = it;
+
+ return result;
+ }
+
+ template <typename I> void reverse(I begin, I end)
+ {
+ while (end - begin > 1) swap(*begin++, *--end);
+ }
+
+ template <typename I> I unique(I begin, I end)
+ {
+ // fast skip head
+ while (end - begin > 1 && *begin != *(begin + 1)) begin++;
+
+ if (begin == end) return begin;
+
+ // last written element
+ I write = begin++;
+
+ // merge unique elements
+ while (begin != end)
+ {
+ if (*begin != *write)
+ *++write = *begin++;
+ else
+ begin++;
+ }
+
+ // past-the-end (write points to live element)
+ return write + 1;
+ }
+
+ template <typename I> void copy_backwards(I begin, I end, I target)
+ {
+ while (begin != end) *--target = *--end;
+ }
+
+ template <typename I, typename Pred, typename T> void insertion_sort(I begin, I end, const Pred& pred, T*)
+ {
+ assert(begin != end);
+
+ for (I it = begin + 1; it != end; ++it)
+ {
+ T val = *it;
+
+ if (pred(val, *begin))
+ {
+ // move to front
+ copy_backwards(begin, it, it + 1);
+ *begin = val;
+ }
+ else
+ {
+ I hole = it;
+
+ // move hole backwards
+ while (pred(val, *(hole - 1)))
+ {
+ *hole = *(hole - 1);
+ hole--;
+ }
+
+ // fill hole with element
+ *hole = val;
+ }
+ }
+ }
+
+ // std variant for elements with ==
+ template <typename I, typename Pred> void partition(I begin, I middle, I end, const Pred& pred, I* out_eqbeg, I* out_eqend)
+ {
+ I eqbeg = middle, eqend = middle + 1;
+
+ // expand equal range
+ while (eqbeg != begin && *(eqbeg - 1) == *eqbeg) --eqbeg;
+ while (eqend != end && *eqend == *eqbeg) ++eqend;
+
+ // process outer elements
+ I ltend = eqbeg, gtbeg = eqend;
+
+ for (;;)
+ {
+ // find the element from the right side that belongs to the left one
+ for (; gtbeg != end; ++gtbeg)
+ if (!pred(*eqbeg, *gtbeg))
+ {
+ if (*gtbeg == *eqbeg) swap(*gtbeg, *eqend++);
+ else break;
+ }
+
+ // find the element from the left side that belongs to the right one
+ for (; ltend != begin; --ltend)
+ if (!pred(*(ltend - 1), *eqbeg))
+ {
+ if (*eqbeg == *(ltend - 1)) swap(*(ltend - 1), *--eqbeg);
+ else break;
+ }
+
+ // scanned all elements
+ if (gtbeg == end && ltend == begin)
+ {
+ *out_eqbeg = eqbeg;
+ *out_eqend = eqend;
+ return;
+ }
+
+ // make room for elements by moving equal area
+ if (gtbeg == end)
+ {
+ if (--ltend != --eqbeg) swap(*ltend, *eqbeg);
+ swap(*eqbeg, *--eqend);
+ }
+ else if (ltend == begin)
+ {
+ if (eqend != gtbeg) swap(*eqbeg, *eqend);
+ ++eqend;
+ swap(*gtbeg++, *eqbeg++);
+ }
+ else swap(*gtbeg++, *--ltend);
+ }
+ }
+
+ template <typename I, typename Pred> void median3(I first, I middle, I last, const Pred& pred)
+ {
+ if (pred(*middle, *first)) swap(*middle, *first);
+ if (pred(*last, *middle)) swap(*last, *middle);
+ if (pred(*middle, *first)) swap(*middle, *first);
+ }
+
+ template <typename I, typename Pred> void median(I first, I middle, I last, const Pred& pred)
+ {
+ if (last - first <= 40)
+ {
+ // median of three for small chunks
+ median3(first, middle, last, pred);
+ }
+ else
+ {
+ // median of nine
+ size_t step = (last - first + 1) / 8;
+
+ median3(first, first + step, first + 2 * step, pred);
+ median3(middle - step, middle, middle + step, pred);
+ median3(last - 2 * step, last - step, last, pred);
+ median3(first + step, middle, last - step, pred);
+ }
+ }
+
+ template <typename I, typename Pred> void sort(I begin, I end, const Pred& pred)
+ {
+ // sort large chunks
+ while (end - begin > 32)
+ {
+ // find median element
+ I middle = begin + (end - begin) / 2;
+ median(begin, middle, end - 1, pred);
+
+ // partition in three chunks (< = >)
+ I eqbeg, eqend;
+ partition(begin, middle, end, pred, &eqbeg, &eqend);
+
+ // loop on larger half
+ if (eqbeg - begin > end - eqend)
+ {
+ sort(eqend, end, pred);
+ end = eqbeg;
+ }
+ else
+ {
+ sort(begin, eqbeg, pred);
+ begin = eqend;
+ }
+ }
+
+ // insertion sort small chunk
+ if (begin != end) insertion_sort(begin, end, pred, &*begin);
+ }
+PUGI__NS_END
+
+// Allocator used for AST and evaluation stacks
+PUGI__NS_BEGIN
+ struct xpath_memory_block
+ {
+ xpath_memory_block* next;
+ size_t capacity;
+
+ char data[
+ #ifdef PUGIXML_MEMORY_XPATH_PAGE_SIZE
+ PUGIXML_MEMORY_XPATH_PAGE_SIZE
+ #else
+ 4096
+ #endif
+ ];
+ };
+
+ class xpath_allocator
+ {
+ xpath_memory_block* _root;
+ size_t _root_size;
+
+ public:
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ jmp_buf* error_handler;
+ #endif
+
+ xpath_allocator(xpath_memory_block* root, size_t root_size = 0): _root(root), _root_size(root_size)
+ {
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ error_handler = 0;
+ #endif
+ }
+
+ void* allocate_nothrow(size_t size)
+ {
+ // align size so that we're able to store pointers in subsequent blocks
+ size = (size + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+
+ if (_root_size + size <= _root->capacity)
+ {
+ void* buf = _root->data + _root_size;
+ _root_size += size;
+ return buf;
+ }
+ else
+ {
+ // make sure we have at least 1/4th of the page free after allocation to satisfy subsequent allocation requests
+ size_t block_capacity_base = sizeof(_root->data);
+ size_t block_capacity_req = size + block_capacity_base / 4;
+ size_t block_capacity = (block_capacity_base > block_capacity_req) ? block_capacity_base : block_capacity_req;
+
+ size_t block_size = block_capacity + offsetof(xpath_memory_block, data);
+
+ xpath_memory_block* block = static_cast<xpath_memory_block*>(xml_memory::allocate(block_size));
+ if (!block) return 0;
+
+ block->next = _root;
+ block->capacity = block_capacity;
+
+ _root = block;
+ _root_size = size;
+
+ return block->data;
+ }
+ }
+
+ void* allocate(size_t size)
+ {
+ void* result = allocate_nothrow(size);
+
+ if (!result)
+ {
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ assert(error_handler);
+ longjmp(*error_handler, 1);
+ #else
+ throw std::bad_alloc();
+ #endif
+ }
+
+ return result;
+ }
+
+ void* reallocate(void* ptr, size_t old_size, size_t new_size)
+ {
+ // align size so that we're able to store pointers in subsequent blocks
+ old_size = (old_size + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+ new_size = (new_size + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+
+ // we can only reallocate the last object
+ assert(ptr == 0 || static_cast<char*>(ptr) + old_size == _root->data + _root_size);
+
+ // adjust root size so that we have not allocated the object at all
+ bool only_object = (_root_size == old_size);
+
+ if (ptr) _root_size -= old_size;
+
+ // allocate a new version (this will obviously reuse the memory if possible)
+ void* result = allocate(new_size);
+ assert(result);
+
+ // we have a new block
+ if (result != ptr && ptr)
+ {
+ // copy old data
+ assert(new_size >= old_size);
+ memcpy(result, ptr, old_size);
+
+ // free the previous page if it had no other objects
+ if (only_object)
+ {
+ assert(_root->data == result);
+ assert(_root->next);
+
+ xpath_memory_block* next = _root->next->next;
+
+ if (next)
+ {
+ // deallocate the whole page, unless it was the first one
+ xml_memory::deallocate(_root->next);
+ _root->next = next;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ void revert(const xpath_allocator& state)
+ {
+ // free all new pages
+ xpath_memory_block* cur = _root;
+
+ while (cur != state._root)
+ {
+ xpath_memory_block* next = cur->next;
+
+ xml_memory::deallocate(cur);
+
+ cur = next;
+ }
+
+ // restore state
+ _root = state._root;
+ _root_size = state._root_size;
+ }
+
+ void release()
+ {
+ xpath_memory_block* cur = _root;
+ assert(cur);
+
+ while (cur->next)
+ {
+ xpath_memory_block* next = cur->next;
+
+ xml_memory::deallocate(cur);
+
+ cur = next;
+ }
+ }
+ };
+
+ struct xpath_allocator_capture
+ {
+ xpath_allocator_capture(xpath_allocator* alloc): _target(alloc), _state(*alloc)
+ {
+ }
+
+ ~xpath_allocator_capture()
+ {
+ _target->revert(_state);
+ }
+
+ xpath_allocator* _target;
+ xpath_allocator _state;
+ };
+
+ struct xpath_stack
+ {
+ xpath_allocator* result;
+ xpath_allocator* temp;
+ };
+
+ struct xpath_stack_data
+ {
+ xpath_memory_block blocks[2];
+ xpath_allocator result;
+ xpath_allocator temp;
+ xpath_stack stack;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ jmp_buf error_handler;
+ #endif
+
+ xpath_stack_data(): result(blocks + 0), temp(blocks + 1)
+ {
+ blocks[0].next = blocks[1].next = 0;
+ blocks[0].capacity = blocks[1].capacity = sizeof(blocks[0].data);
+
+ stack.result = &result;
+ stack.temp = &temp;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ result.error_handler = temp.error_handler = &error_handler;
+ #endif
+ }
+
+ ~xpath_stack_data()
+ {
+ result.release();
+ temp.release();
+ }
+ };
+PUGI__NS_END
+
+// String class
+PUGI__NS_BEGIN
+ class xpath_string
+ {
+ const char_t* _buffer;
+ bool _uses_heap;
+ size_t _length_heap;
+
+ static char_t* duplicate_string(const char_t* string, size_t length, xpath_allocator* alloc)
+ {
+ char_t* result = static_cast<char_t*>(alloc->allocate((length + 1) * sizeof(char_t)));
+ assert(result);
+
+ memcpy(result, string, length * sizeof(char_t));
+ result[length] = 0;
+
+ return result;
+ }
+
+ xpath_string(const char_t* buffer, bool uses_heap_, size_t length_heap): _buffer(buffer), _uses_heap(uses_heap_), _length_heap(length_heap)
+ {
+ }
+
+ public:
+ static xpath_string from_const(const char_t* str)
+ {
+ return xpath_string(str, false, 0);
+ }
+
+ static xpath_string from_heap_preallocated(const char_t* begin, const char_t* end)
+ {
+ assert(begin <= end && *end == 0);
+
+ return xpath_string(begin, true, static_cast<size_t>(end - begin));
+ }
+
+ static xpath_string from_heap(const char_t* begin, const char_t* end, xpath_allocator* alloc)
+ {
+ assert(begin <= end);
+
+ size_t length = static_cast<size_t>(end - begin);
+
+ return length == 0 ? xpath_string() : xpath_string(duplicate_string(begin, length, alloc), true, length);
+ }
+
+ xpath_string(): _buffer(PUGIXML_TEXT("")), _uses_heap(false), _length_heap(0)
+ {
+ }
+
+ void append(const xpath_string& o, xpath_allocator* alloc)
+ {
+ // skip empty sources
+ if (!*o._buffer) return;
+
+ // fast append for constant empty target and constant source
+ if (!*_buffer && !_uses_heap && !o._uses_heap)
+ {
+ _buffer = o._buffer;
+ }
+ else
+ {
+ // need to make heap copy
+ size_t target_length = length();
+ size_t source_length = o.length();
+ size_t result_length = target_length + source_length;
+
+ // allocate new buffer
+ char_t* result = static_cast<char_t*>(alloc->reallocate(_uses_heap ? const_cast<char_t*>(_buffer) : 0, (target_length + 1) * sizeof(char_t), (result_length + 1) * sizeof(char_t)));
+ assert(result);
+
+ // append first string to the new buffer in case there was no reallocation
+ if (!_uses_heap) memcpy(result, _buffer, target_length * sizeof(char_t));
+
+ // append second string to the new buffer
+ memcpy(result + target_length, o._buffer, source_length * sizeof(char_t));
+ result[result_length] = 0;
+
+ // finalize
+ _buffer = result;
+ _uses_heap = true;
+ _length_heap = result_length;
+ }
+ }
+
+ const char_t* c_str() const
+ {
+ return _buffer;
+ }
+
+ size_t length() const
+ {
+ return _uses_heap ? _length_heap : strlength(_buffer);
+ }
+
+ char_t* data(xpath_allocator* alloc)
+ {
+ // make private heap copy
+ if (!_uses_heap)
+ {
+ size_t length_ = strlength(_buffer);
+
+ _buffer = duplicate_string(_buffer, length_, alloc);
+ _uses_heap = true;
+ _length_heap = length_;
+ }
+
+ return const_cast<char_t*>(_buffer);
+ }
+
+ bool empty() const
+ {
+ return *_buffer == 0;
+ }
+
+ bool operator==(const xpath_string& o) const
+ {
+ return strequal(_buffer, o._buffer);
+ }
+
+ bool operator!=(const xpath_string& o) const
+ {
+ return !strequal(_buffer, o._buffer);
+ }
+
+ bool uses_heap() const
+ {
+ return _uses_heap;
+ }
+ };
+PUGI__NS_END
+
+PUGI__NS_BEGIN
+ PUGI__FN bool starts_with(const char_t* string, const char_t* pattern)
+ {
+ while (*pattern && *string == *pattern)
+ {
+ string++;
+ pattern++;
+ }
+
+ return *pattern == 0;
+ }
+
+ PUGI__FN const char_t* find_char(const char_t* s, char_t c)
+ {
+ #ifdef PUGIXML_WCHAR_MODE
+ return wcschr(s, c);
+ #else
+ return strchr(s, c);
+ #endif
+ }
+
+ PUGI__FN const char_t* find_substring(const char_t* s, const char_t* p)
+ {
+ #ifdef PUGIXML_WCHAR_MODE
+ // MSVC6 wcsstr bug workaround (if s is empty it always returns 0)
+ return (*p == 0) ? s : wcsstr(s, p);
+ #else
+ return strstr(s, p);
+ #endif
+ }
+
+ // Converts symbol to lower case, if it is an ASCII one
+ PUGI__FN char_t tolower_ascii(char_t ch)
+ {
+ return static_cast<unsigned int>(ch - 'A') < 26 ? static_cast<char_t>(ch | ' ') : ch;
+ }
+
+ PUGI__FN xpath_string string_value(const xpath_node& na, xpath_allocator* alloc)
+ {
+ if (na.attribute())
+ return xpath_string::from_const(na.attribute().value());
+ else
+ {
+ xml_node n = na.node();
+
+ switch (n.type())
+ {
+ case node_pcdata:
+ case node_cdata:
+ case node_comment:
+ case node_pi:
+ return xpath_string::from_const(n.value());
+
+ case node_document:
+ case node_element:
+ {
+ xpath_string result;
+
+ xml_node cur = n.first_child();
+
+ while (cur && cur != n)
+ {
+ if (cur.type() == node_pcdata || cur.type() == node_cdata)
+ result.append(xpath_string::from_const(cur.value()), alloc);
+
+ if (cur.first_child())
+ cur = cur.first_child();
+ else if (cur.next_sibling())
+ cur = cur.next_sibling();
+ else
+ {
+ while (!cur.next_sibling() && cur != n)
+ cur = cur.parent();
+
+ if (cur != n) cur = cur.next_sibling();
+ }
+ }
+
+ return result;
+ }
+
+ default:
+ return xpath_string();
+ }
+ }
+ }
+
+ PUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn)
+ {
+ assert(ln->parent == rn->parent);
+
+ // there is no common ancestor (the shared parent is null), nodes are from different documents
+ if (!ln->parent) return ln < rn;
+
+ // determine sibling order
+ xml_node_struct* ls = ln;
+ xml_node_struct* rs = rn;
+
+ while (ls && rs)
+ {
+ if (ls == rn) return true;
+ if (rs == ln) return false;
+
+ ls = ls->next_sibling;
+ rs = rs->next_sibling;
+ }
+
+ // if rn sibling chain ended ln must be before rn
+ return !rs;
+ }
+
+ PUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn)
+ {
+ // find common ancestor at the same depth, if any
+ xml_node_struct* lp = ln;
+ xml_node_struct* rp = rn;
+
+ while (lp && rp && lp->parent != rp->parent)
+ {
+ lp = lp->parent;
+ rp = rp->parent;
+ }
+
+ // parents are the same!
+ if (lp && rp) return node_is_before_sibling(lp, rp);
+
+ // nodes are at different depths, need to normalize heights
+ bool left_higher = !lp;
+
+ while (lp)
+ {
+ lp = lp->parent;
+ ln = ln->parent;
+ }
+
+ while (rp)
+ {
+ rp = rp->parent;
+ rn = rn->parent;
+ }
+
+ // one node is the ancestor of the other
+ if (ln == rn) return left_higher;
+
+ // find common ancestor... again
+ while (ln->parent != rn->parent)
+ {
+ ln = ln->parent;
+ rn = rn->parent;
+ }
+
+ return node_is_before_sibling(ln, rn);
+ }
+
+ PUGI__FN bool node_is_ancestor(xml_node_struct* parent, xml_node_struct* node)
+ {
+ while (node && node != parent) node = node->parent;
+
+ return parent && node == parent;
+ }
+
+ PUGI__FN const void* document_buffer_order(const xpath_node& xnode)
+ {
+ xml_node_struct* node = xnode.node().internal_object();
+
+ if (node)
+ {
+ if ((get_document(node).header & xml_memory_page_contents_shared_mask) == 0)
+ {
+ if (node->name && (node->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return node->name;
+ if (node->value && (node->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return node->value;
+ }
+
+ return 0;
+ }
+
+ xml_attribute_struct* attr = xnode.attribute().internal_object();
+
+ if (attr)
+ {
+ if ((get_document(attr).header & xml_memory_page_contents_shared_mask) == 0)
+ {
+ if ((attr->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return attr->name;
+ if ((attr->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return attr->value;
+ }
+
+ return 0;
+ }
+
+ return 0;
+ }
+
+ struct document_order_comparator
+ {
+ bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
+ {
+ // optimized document order based check
+ const void* lo = document_buffer_order(lhs);
+ const void* ro = document_buffer_order(rhs);
+
+ if (lo && ro) return lo < ro;
+
+ // slow comparison
+ xml_node ln = lhs.node(), rn = rhs.node();
+
+ // compare attributes
+ if (lhs.attribute() && rhs.attribute())
+ {
+ // shared parent
+ if (lhs.parent() == rhs.parent())
+ {
+ // determine sibling order
+ for (xml_attribute a = lhs.attribute(); a; a = a.next_attribute())
+ if (a == rhs.attribute())
+ return true;
+
+ return false;
+ }
+
+ // compare attribute parents
+ ln = lhs.parent();
+ rn = rhs.parent();
+ }
+ else if (lhs.attribute())
+ {
+ // attributes go after the parent element
+ if (lhs.parent() == rhs.node()) return false;
+
+ ln = lhs.parent();
+ }
+ else if (rhs.attribute())
+ {
+ // attributes go after the parent element
+ if (rhs.parent() == lhs.node()) return true;
+
+ rn = rhs.parent();
+ }
+
+ if (ln == rn) return false;
+
+ if (!ln || !rn) return ln < rn;
+
+ return node_is_before(ln.internal_object(), rn.internal_object());
+ }
+ };
+
+ struct duplicate_comparator
+ {
+ bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
+ {
+ if (lhs.attribute()) return rhs.attribute() ? lhs.attribute() < rhs.attribute() : true;
+ else return rhs.attribute() ? false : lhs.node() < rhs.node();
+ }
+ };
+
+ PUGI__FN double gen_nan()
+ {
+ #if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24))
+ union { float f; uint32_t i; } u[sizeof(float) == sizeof(uint32_t) ? 1 : -1];
+ u[0].i = 0x7fc00000;
+ return u[0].f;
+ #else
+ // fallback
+ const volatile double zero = 0.0;
+ return zero / zero;
+ #endif
+ }
+
+ PUGI__FN bool is_nan(double value)
+ {
+ #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)
+ return !!_isnan(value);
+ #elif defined(fpclassify) && defined(FP_NAN)
+ return fpclassify(value) == FP_NAN;
+ #else
+ // fallback
+ const volatile double v = value;
+ return v != v;
+ #endif
+ }
+
+ PUGI__FN const char_t* convert_number_to_string_special(double value)
+ {
+ #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)
+ if (_finite(value)) return (value == 0) ? PUGIXML_TEXT("0") : 0;
+ if (_isnan(value)) return PUGIXML_TEXT("NaN");
+ return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity");
+ #elif defined(fpclassify) && defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO)
+ switch (fpclassify(value))
+ {
+ case FP_NAN:
+ return PUGIXML_TEXT("NaN");
+
+ case FP_INFINITE:
+ return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity");
+
+ case FP_ZERO:
+ return PUGIXML_TEXT("0");
+
+ default:
+ return 0;
+ }
+ #else
+ // fallback
+ const volatile double v = value;
+
+ if (v == 0) return PUGIXML_TEXT("0");
+ if (v != v) return PUGIXML_TEXT("NaN");
+ if (v * 2 == v) return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity");
+ return 0;
+ #endif
+ }
+
+ PUGI__FN bool convert_number_to_boolean(double value)
+ {
+ return (value != 0 && !is_nan(value));
+ }
+
+ PUGI__FN void truncate_zeros(char* begin, char* end)
+ {
+ while (begin != end && end[-1] == '0') end--;
+
+ *end = 0;
+ }
+
+ // gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent
+#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)
+ PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)
+ {
+ // get base values
+ int sign, exponent;
+ _ecvt_s(buffer, buffer_size, value, DBL_DIG + 1, &exponent, &sign);
+
+ // truncate redundant zeros
+ truncate_zeros(buffer, buffer + strlen(buffer));
+
+ // fill results
+ *out_mantissa = buffer;
+ *out_exponent = exponent;
+ }
+#else
+ PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)
+ {
+ // get a scientific notation value with IEEE DBL_DIG decimals
+ sprintf(buffer, "%.*e", DBL_DIG, value);
+ assert(strlen(buffer) < buffer_size);
+ (void)!buffer_size;
+
+ // get the exponent (possibly negative)
+ char* exponent_string = strchr(buffer, 'e');
+ assert(exponent_string);
+
+ int exponent = atoi(exponent_string + 1);
+
+ // extract mantissa string: skip sign
+ char* mantissa = buffer[0] == '-' ? buffer + 1 : buffer;
+ assert(mantissa[0] != '0' && mantissa[1] == '.');
+
+ // divide mantissa by 10 to eliminate integer part
+ mantissa[1] = mantissa[0];
+ mantissa++;
+ exponent++;
+
+ // remove extra mantissa digits and zero-terminate mantissa
+ truncate_zeros(mantissa, exponent_string);
+
+ // fill results
+ *out_mantissa = mantissa;
+ *out_exponent = exponent;
+ }
+#endif
+
+ PUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator* alloc)
+ {
+ // try special number conversion
+ const char_t* special = convert_number_to_string_special(value);
+ if (special) return xpath_string::from_const(special);
+
+ // get mantissa + exponent form
+ char mantissa_buffer[32];
+
+ char* mantissa;
+ int exponent;
+ convert_number_to_mantissa_exponent(value, mantissa_buffer, sizeof(mantissa_buffer), &mantissa, &exponent);
+
+ // allocate a buffer of suitable length for the number
+ size_t result_size = strlen(mantissa_buffer) + (exponent > 0 ? exponent : -exponent) + 4;
+ char_t* result = static_cast<char_t*>(alloc->allocate(sizeof(char_t) * result_size));
+ assert(result);
+
+ // make the number!
+ char_t* s = result;
+
+ // sign
+ if (value < 0) *s++ = '-';
+
+ // integer part
+ if (exponent <= 0)
+ {
+ *s++ = '0';
+ }
+ else
+ {
+ while (exponent > 0)
+ {
+ assert(*mantissa == 0 || static_cast<unsigned int>(static_cast<unsigned int>(*mantissa) - '0') <= 9);
+ *s++ = *mantissa ? *mantissa++ : '0';
+ exponent--;
+ }
+ }
+
+ // fractional part
+ if (*mantissa)
+ {
+ // decimal point
+ *s++ = '.';
+
+ // extra zeroes from negative exponent
+ while (exponent < 0)
+ {
+ *s++ = '0';
+ exponent++;
+ }
+
+ // extra mantissa digits
+ while (*mantissa)
+ {
+ assert(static_cast<unsigned int>(*mantissa - '0') <= 9);
+ *s++ = *mantissa++;
+ }
+ }
+
+ // zero-terminate
+ assert(s < result + result_size);
+ *s = 0;
+
+ return xpath_string::from_heap_preallocated(result, s);
+ }
+
+ PUGI__FN bool check_string_to_number_format(const char_t* string)
+ {
+ // parse leading whitespace
+ while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;
+
+ // parse sign
+ if (*string == '-') ++string;
+
+ if (!*string) return false;
+
+ // if there is no integer part, there should be a decimal part with at least one digit
+ if (!PUGI__IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !PUGI__IS_CHARTYPEX(string[1], ctx_digit))) return false;
+
+ // parse integer part
+ while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;
+
+ // parse decimal part
+ if (*string == '.')
+ {
+ ++string;
+
+ while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;
+ }
+
+ // parse trailing whitespace
+ while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;
+
+ return *string == 0;
+ }
+
+ PUGI__FN double convert_string_to_number(const char_t* string)
+ {
+ // check string format
+ if (!check_string_to_number_format(string)) return gen_nan();
+
+ // parse string
+ #ifdef PUGIXML_WCHAR_MODE
+ return wcstod(string, 0);
+ #else
+ return atof(string);
+ #endif
+ }
+
+ PUGI__FN bool convert_string_to_number_scratch(char_t (&buffer)[32], const char_t* begin, const char_t* end, double* out_result)
+ {
+ size_t length = static_cast<size_t>(end - begin);
+ char_t* scratch = buffer;
+
+ if (length >= sizeof(buffer) / sizeof(buffer[0]))
+ {
+ // need to make dummy on-heap copy
+ scratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!scratch) return false;
+ }
+
+ // copy string to zero-terminated buffer and perform conversion
+ memcpy(scratch, begin, length * sizeof(char_t));
+ scratch[length] = 0;
+
+ *out_result = convert_string_to_number(scratch);
+
+ // free dummy buffer
+ if (scratch != buffer) xml_memory::deallocate(scratch);
+
+ return true;
+ }
+
+ PUGI__FN double round_nearest(double value)
+ {
+ return floor(value + 0.5);
+ }
+
+ PUGI__FN double round_nearest_nzero(double value)
+ {
+ // same as round_nearest, but returns -0 for [-0.5, -0]
+ // ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0)
+ return (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5);
+ }
+
+ PUGI__FN const char_t* qualified_name(const xpath_node& node)
+ {
+ return node.attribute() ? node.attribute().name() : node.node().name();
+ }
+
+ PUGI__FN const char_t* local_name(const xpath_node& node)
+ {
+ const char_t* name = qualified_name(node);
+ const char_t* p = find_char(name, ':');
+
+ return p ? p + 1 : name;
+ }
+
+ struct namespace_uri_predicate
+ {
+ const char_t* prefix;
+ size_t prefix_length;
+
+ namespace_uri_predicate(const char_t* name)
+ {
+ const char_t* pos = find_char(name, ':');
+
+ prefix = pos ? name : 0;
+ prefix_length = pos ? static_cast<size_t>(pos - name) : 0;
+ }
+
+ bool operator()(xml_attribute a) const
+ {
+ const char_t* name = a.name();
+
+ if (!starts_with(name, PUGIXML_TEXT("xmlns"))) return false;
+
+ return prefix ? name[5] == ':' && strequalrange(name + 6, prefix, prefix_length) : name[5] == 0;
+ }
+ };
+
+ PUGI__FN const char_t* namespace_uri(xml_node node)
+ {
+ namespace_uri_predicate pred = node.name();
+
+ xml_node p = node;
+
+ while (p)
+ {
+ xml_attribute a = p.find_attribute(pred);
+
+ if (a) return a.value();
+
+ p = p.parent();
+ }
+
+ return PUGIXML_TEXT("");
+ }
+
+ PUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent)
+ {
+ namespace_uri_predicate pred = attr.name();
+
+ // Default namespace does not apply to attributes
+ if (!pred.prefix) return PUGIXML_TEXT("");
+
+ xml_node p = parent;
+
+ while (p)
+ {
+ xml_attribute a = p.find_attribute(pred);
+
+ if (a) return a.value();
+
+ p = p.parent();
+ }
+
+ return PUGIXML_TEXT("");
+ }
+
+ PUGI__FN const char_t* namespace_uri(const xpath_node& node)
+ {
+ return node.attribute() ? namespace_uri(node.attribute(), node.parent()) : namespace_uri(node.node());
+ }
+
+ PUGI__FN void normalize_space(char_t* buffer)
+ {
+ char_t* write = buffer;
+
+ for (char_t* it = buffer; *it; )
+ {
+ char_t ch = *it++;
+
+ if (PUGI__IS_CHARTYPE(ch, ct_space))
+ {
+ // replace whitespace sequence with single space
+ while (PUGI__IS_CHARTYPE(*it, ct_space)) it++;
+
+ // avoid leading spaces
+ if (write != buffer) *write++ = ' ';
+ }
+ else *write++ = ch;
+ }
+
+ // remove trailing space
+ if (write != buffer && PUGI__IS_CHARTYPE(write[-1], ct_space)) write--;
+
+ // zero-terminate
+ *write = 0;
+ }
+
+ PUGI__FN void translate(char_t* buffer, const char_t* from, const char_t* to, size_t to_length)
+ {
+ char_t* write = buffer;
+
+ while (*buffer)
+ {
+ PUGI__DMC_VOLATILE char_t ch = *buffer++;
+
+ const char_t* pos = find_char(from, ch);
+
+ if (!pos)
+ *write++ = ch; // do not process
+ else if (static_cast<size_t>(pos - from) < to_length)
+ *write++ = to[pos - from]; // replace
+ }
+
+ // zero-terminate
+ *write = 0;
+ }
+
+ PUGI__FN unsigned char* translate_table_generate(xpath_allocator* alloc, const char_t* from, const char_t* to)
+ {
+ unsigned char table[128] = {0};
+
+ while (*from)
+ {
+ unsigned int fc = static_cast<unsigned int>(*from);
+ unsigned int tc = static_cast<unsigned int>(*to);
+
+ if (fc >= 128 || tc >= 128)
+ return 0;
+
+ // code=128 means "skip character"
+ if (!table[fc])
+ table[fc] = static_cast<unsigned char>(tc ? tc : 128);
+
+ from++;
+ if (tc) to++;
+ }
+
+ for (int i = 0; i < 128; ++i)
+ if (!table[i])
+ table[i] = static_cast<unsigned char>(i);
+
+ void* result = alloc->allocate_nothrow(sizeof(table));
+
+ if (result)
+ {
+ memcpy(result, table, sizeof(table));
+ }
+
+ return static_cast<unsigned char*>(result);
+ }
+
+ PUGI__FN void translate_table(char_t* buffer, const unsigned char* table)
+ {
+ char_t* write = buffer;
+
+ while (*buffer)
+ {
+ char_t ch = *buffer++;
+ unsigned int index = static_cast<unsigned int>(ch);
+
+ if (index < 128)
+ {
+ unsigned char code = table[index];
+
+ // code=128 means "skip character" (table size is 128 so 128 can be a special value)
+ // this code skips these characters without extra branches
+ *write = static_cast<char_t>(code);
+ write += 1 - (code >> 7);
+ }
+ else
+ {
+ *write++ = ch;
+ }
+ }
+
+ // zero-terminate
+ *write = 0;
+ }
+
+ inline bool is_xpath_attribute(const char_t* name)
+ {
+ return !(starts_with(name, PUGIXML_TEXT("xmlns")) && (name[5] == 0 || name[5] == ':'));
+ }
+
+ struct xpath_variable_boolean: xpath_variable
+ {
+ xpath_variable_boolean(): value(false)
+ {
+ }
+
+ bool value;
+ char_t name[1];
+ };
+
+ struct xpath_variable_number: xpath_variable
+ {
+ xpath_variable_number(): value(0)
+ {
+ }
+
+ double value;
+ char_t name[1];
+ };
+
+ struct xpath_variable_string: xpath_variable
+ {
+ xpath_variable_string(): value(0)
+ {
+ }
+
+ ~xpath_variable_string()
+ {
+ if (value) xml_memory::deallocate(value);
+ }
+
+ char_t* value;
+ char_t name[1];
+ };
+
+ struct xpath_variable_node_set: xpath_variable
+ {
+ xpath_node_set value;
+ char_t name[1];
+ };
+
+ static const xpath_node_set dummy_node_set;
+
+ PUGI__FN unsigned int hash_string(const char_t* str)
+ {
+ // Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time)
+ unsigned int result = 0;
+
+ while (*str)
+ {
+ result += static_cast<unsigned int>(*str++);
+ result += result << 10;
+ result ^= result >> 6;
+ }
+
+ result += result << 3;
+ result ^= result >> 11;
+ result += result << 15;
+
+ return result;
+ }
+
+ template <typename T> PUGI__FN T* new_xpath_variable(const char_t* name)
+ {
+ size_t length = strlength(name);
+ if (length == 0) return 0; // empty variable names are invalid
+
+ // $$ we can't use offsetof(T, name) because T is non-POD, so we just allocate additional length characters
+ void* memory = xml_memory::allocate(sizeof(T) + length * sizeof(char_t));
+ if (!memory) return 0;
+
+ T* result = new (memory) T();
+
+ memcpy(result->name, name, (length + 1) * sizeof(char_t));
+
+ return result;
+ }
+
+ PUGI__FN xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name)
+ {
+ switch (type)
+ {
+ case xpath_type_node_set:
+ return new_xpath_variable<xpath_variable_node_set>(name);
+
+ case xpath_type_number:
+ return new_xpath_variable<xpath_variable_number>(name);
+
+ case xpath_type_string:
+ return new_xpath_variable<xpath_variable_string>(name);
+
+ case xpath_type_boolean:
+ return new_xpath_variable<xpath_variable_boolean>(name);
+
+ default:
+ return 0;
+ }
+ }
+
+ template <typename T> PUGI__FN void delete_xpath_variable(T* var)
+ {
+ var->~T();
+ xml_memory::deallocate(var);
+ }
+
+ PUGI__FN void delete_xpath_variable(xpath_value_type type, xpath_variable* var)
+ {
+ switch (type)
+ {
+ case xpath_type_node_set:
+ delete_xpath_variable(static_cast<xpath_variable_node_set*>(var));
+ break;
+
+ case xpath_type_number:
+ delete_xpath_variable(static_cast<xpath_variable_number*>(var));
+ break;
+
+ case xpath_type_string:
+ delete_xpath_variable(static_cast<xpath_variable_string*>(var));
+ break;
+
+ case xpath_type_boolean:
+ delete_xpath_variable(static_cast<xpath_variable_boolean*>(var));
+ break;
+
+ default:
+ assert(!"Invalid variable type");
+ }
+ }
+
+ PUGI__FN xpath_variable* get_variable_scratch(char_t (&buffer)[32], xpath_variable_set* set, const char_t* begin, const char_t* end)
+ {
+ size_t length = static_cast<size_t>(end - begin);
+ char_t* scratch = buffer;
+
+ if (length >= sizeof(buffer) / sizeof(buffer[0]))
+ {
+ // need to make dummy on-heap copy
+ scratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+ if (!scratch) return 0;
+ }
+
+ // copy string to zero-terminated buffer and perform lookup
+ memcpy(scratch, begin, length * sizeof(char_t));
+ scratch[length] = 0;
+
+ xpath_variable* result = set->get(scratch);
+
+ // free dummy buffer
+ if (scratch != buffer) xml_memory::deallocate(scratch);
+
+ return result;
+ }
+PUGI__NS_END
+
+// Internal node set class
+PUGI__NS_BEGIN
+ PUGI__FN xpath_node_set::type_t xpath_get_order(const xpath_node* begin, const xpath_node* end)
+ {
+ if (end - begin < 2)
+ return xpath_node_set::type_sorted;
+
+ document_order_comparator cmp;
+
+ bool first = cmp(begin[0], begin[1]);
+
+ for (const xpath_node* it = begin + 1; it + 1 < end; ++it)
+ if (cmp(it[0], it[1]) != first)
+ return xpath_node_set::type_unsorted;
+
+ return first ? xpath_node_set::type_sorted : xpath_node_set::type_sorted_reverse;
+ }
+
+ PUGI__FN xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev)
+ {
+ xpath_node_set::type_t order = rev ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted;
+
+ if (type == xpath_node_set::type_unsorted)
+ {
+ xpath_node_set::type_t sorted = xpath_get_order(begin, end);
+
+ if (sorted == xpath_node_set::type_unsorted)
+ {
+ sort(begin, end, document_order_comparator());
+
+ type = xpath_node_set::type_sorted;
+ }
+ else
+ type = sorted;
+ }
+
+ if (type != order) reverse(begin, end);
+
+ return order;
+ }
+
+ PUGI__FN xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type)
+ {
+ if (begin == end) return xpath_node();
+
+ switch (type)
+ {
+ case xpath_node_set::type_sorted:
+ return *begin;
+
+ case xpath_node_set::type_sorted_reverse:
+ return *(end - 1);
+
+ case xpath_node_set::type_unsorted:
+ return *min_element(begin, end, document_order_comparator());
+
+ default:
+ assert(!"Invalid node set type");
+ return xpath_node();
+ }
+ }
+
+ class xpath_node_set_raw
+ {
+ xpath_node_set::type_t _type;
+
+ xpath_node* _begin;
+ xpath_node* _end;
+ xpath_node* _eos;
+
+ public:
+ xpath_node_set_raw(): _type(xpath_node_set::type_unsorted), _begin(0), _end(0), _eos(0)
+ {
+ }
+
+ xpath_node* begin() const
+ {
+ return _begin;
+ }
+
+ xpath_node* end() const
+ {
+ return _end;
+ }
+
+ bool empty() const
+ {
+ return _begin == _end;
+ }
+
+ size_t size() const
+ {
+ return static_cast<size_t>(_end - _begin);
+ }
+
+ xpath_node first() const
+ {
+ return xpath_first(_begin, _end, _type);
+ }
+
+ void push_back_grow(const xpath_node& node, xpath_allocator* alloc);
+
+ void push_back(const xpath_node& node, xpath_allocator* alloc)
+ {
+ if (_end != _eos)
+ *_end++ = node;
+ else
+ push_back_grow(node, alloc);
+ }
+
+ void append(const xpath_node* begin_, const xpath_node* end_, xpath_allocator* alloc)
+ {
+ if (begin_ == end_) return;
+
+ size_t size_ = static_cast<size_t>(_end - _begin);
+ size_t capacity = static_cast<size_t>(_eos - _begin);
+ size_t count = static_cast<size_t>(end_ - begin_);
+
+ if (size_ + count > capacity)
+ {
+ // reallocate the old array or allocate a new one
+ xpath_node* data = static_cast<xpath_node*>(alloc->reallocate(_begin, capacity * sizeof(xpath_node), (size_ + count) * sizeof(xpath_node)));
+ assert(data);
+
+ // finalize
+ _begin = data;
+ _end = data + size_;
+ _eos = data + size_ + count;
+ }
+
+ memcpy(_end, begin_, count * sizeof(xpath_node));
+ _end += count;
+ }
+
+ void sort_do()
+ {
+ _type = xpath_sort(_begin, _end, _type, false);
+ }
+
+ void truncate(xpath_node* pos)
+ {
+ assert(_begin <= pos && pos <= _end);
+
+ _end = pos;
+ }
+
+ void remove_duplicates()
+ {
+ if (_type == xpath_node_set::type_unsorted)
+ sort(_begin, _end, duplicate_comparator());
+
+ _end = unique(_begin, _end);
+ }
+
+ xpath_node_set::type_t type() const
+ {
+ return _type;
+ }
+
+ void set_type(xpath_node_set::type_t value)
+ {
+ _type = value;
+ }
+ };
+
+ PUGI__FN_NO_INLINE void xpath_node_set_raw::push_back_grow(const xpath_node& node, xpath_allocator* alloc)
+ {
+ size_t capacity = static_cast<size_t>(_eos - _begin);
+
+ // get new capacity (1.5x rule)
+ size_t new_capacity = capacity + capacity / 2 + 1;
+
+ // reallocate the old array or allocate a new one
+ xpath_node* data = static_cast<xpath_node*>(alloc->reallocate(_begin, capacity * sizeof(xpath_node), new_capacity * sizeof(xpath_node)));
+ assert(data);
+
+ // finalize
+ _begin = data;
+ _end = data + capacity;
+ _eos = data + new_capacity;
+
+ // push
+ *_end++ = node;
+ }
+PUGI__NS_END
+
+PUGI__NS_BEGIN
+ struct xpath_context
+ {
+ xpath_node n;
+ size_t position, size;
+
+ xpath_context(const xpath_node& n_, size_t position_, size_t size_): n(n_), position(position_), size(size_)
+ {
+ }
+ };
+
+ enum lexeme_t
+ {
+ lex_none = 0,
+ lex_equal,
+ lex_not_equal,
+ lex_less,
+ lex_greater,
+ lex_less_or_equal,
+ lex_greater_or_equal,
+ lex_plus,
+ lex_minus,
+ lex_multiply,
+ lex_union,
+ lex_var_ref,
+ lex_open_brace,
+ lex_close_brace,
+ lex_quoted_string,
+ lex_number,
+ lex_slash,
+ lex_double_slash,
+ lex_open_square_brace,
+ lex_close_square_brace,
+ lex_string,
+ lex_comma,
+ lex_axis_attribute,
+ lex_dot,
+ lex_double_dot,
+ lex_double_colon,
+ lex_eof
+ };
+
+ struct xpath_lexer_string
+ {
+ const char_t* begin;
+ const char_t* end;
+
+ xpath_lexer_string(): begin(0), end(0)
+ {
+ }
+
+ bool operator==(const char_t* other) const
+ {
+ size_t length = static_cast<size_t>(end - begin);
+
+ return strequalrange(other, begin, length);
+ }
+ };
+
+ class xpath_lexer
+ {
+ const char_t* _cur;
+ const char_t* _cur_lexeme_pos;
+ xpath_lexer_string _cur_lexeme_contents;
+
+ lexeme_t _cur_lexeme;
+
+ public:
+ explicit xpath_lexer(const char_t* query): _cur(query)
+ {
+ next();
+ }
+
+ const char_t* state() const
+ {
+ return _cur;
+ }
+
+ void next()
+ {
+ const char_t* cur = _cur;
+
+ while (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur;
+
+ // save lexeme position for error reporting
+ _cur_lexeme_pos = cur;
+
+ switch (*cur)
+ {
+ case 0:
+ _cur_lexeme = lex_eof;
+ break;
+
+ case '>':
+ if (*(cur+1) == '=')
+ {
+ cur += 2;
+ _cur_lexeme = lex_greater_or_equal;
+ }
+ else
+ {
+ cur += 1;
+ _cur_lexeme = lex_greater;
+ }
+ break;
+
+ case '<':
+ if (*(cur+1) == '=')
+ {
+ cur += 2;
+ _cur_lexeme = lex_less_or_equal;
+ }
+ else
+ {
+ cur += 1;
+ _cur_lexeme = lex_less;
+ }
+ break;
+
+ case '!':
+ if (*(cur+1) == '=')
+ {
+ cur += 2;
+ _cur_lexeme = lex_not_equal;
+ }
+ else
+ {
+ _cur_lexeme = lex_none;
+ }
+ break;
+
+ case '=':
+ cur += 1;
+ _cur_lexeme = lex_equal;
+
+ break;
+
+ case '+':
+ cur += 1;
+ _cur_lexeme = lex_plus;
+
+ break;
+
+ case '-':
+ cur += 1;
+ _cur_lexeme = lex_minus;
+
+ break;
+
+ case '*':
+ cur += 1;
+ _cur_lexeme = lex_multiply;
+
+ break;
+
+ case '|':
+ cur += 1;
+ _cur_lexeme = lex_union;
+
+ break;
+
+ case '$':
+ cur += 1;
+
+ if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))
+ {
+ _cur_lexeme_contents.begin = cur;
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+
+ if (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname
+ {
+ cur++; // :
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+ }
+
+ _cur_lexeme_contents.end = cur;
+
+ _cur_lexeme = lex_var_ref;
+ }
+ else
+ {
+ _cur_lexeme = lex_none;
+ }
+
+ break;
+
+ case '(':
+ cur += 1;
+ _cur_lexeme = lex_open_brace;
+
+ break;
+
+ case ')':
+ cur += 1;
+ _cur_lexeme = lex_close_brace;
+
+ break;
+
+ case '[':
+ cur += 1;
+ _cur_lexeme = lex_open_square_brace;
+
+ break;
+
+ case ']':
+ cur += 1;
+ _cur_lexeme = lex_close_square_brace;
+
+ break;
+
+ case ',':
+ cur += 1;
+ _cur_lexeme = lex_comma;
+
+ break;
+
+ case '/':
+ if (*(cur+1) == '/')
+ {
+ cur += 2;
+ _cur_lexeme = lex_double_slash;
+ }
+ else
+ {
+ cur += 1;
+ _cur_lexeme = lex_slash;
+ }
+ break;
+
+ case '.':
+ if (*(cur+1) == '.')
+ {
+ cur += 2;
+ _cur_lexeme = lex_double_dot;
+ }
+ else if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit))
+ {
+ _cur_lexeme_contents.begin = cur; // .
+
+ ++cur;
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
+
+ _cur_lexeme_contents.end = cur;
+
+ _cur_lexeme = lex_number;
+ }
+ else
+ {
+ cur += 1;
+ _cur_lexeme = lex_dot;
+ }
+ break;
+
+ case '@':
+ cur += 1;
+ _cur_lexeme = lex_axis_attribute;
+
+ break;
+
+ case '"':
+ case '\'':
+ {
+ char_t terminator = *cur;
+
+ ++cur;
+
+ _cur_lexeme_contents.begin = cur;
+ while (*cur && *cur != terminator) cur++;
+ _cur_lexeme_contents.end = cur;
+
+ if (!*cur)
+ _cur_lexeme = lex_none;
+ else
+ {
+ cur += 1;
+ _cur_lexeme = lex_quoted_string;
+ }
+
+ break;
+ }
+
+ case ':':
+ if (*(cur+1) == ':')
+ {
+ cur += 2;
+ _cur_lexeme = lex_double_colon;
+ }
+ else
+ {
+ _cur_lexeme = lex_none;
+ }
+ break;
+
+ default:
+ if (PUGI__IS_CHARTYPEX(*cur, ctx_digit))
+ {
+ _cur_lexeme_contents.begin = cur;
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
+
+ if (*cur == '.')
+ {
+ cur++;
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
+ }
+
+ _cur_lexeme_contents.end = cur;
+
+ _cur_lexeme = lex_number;
+ }
+ else if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))
+ {
+ _cur_lexeme_contents.begin = cur;
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+
+ if (cur[0] == ':')
+ {
+ if (cur[1] == '*') // namespace test ncname:*
+ {
+ cur += 2; // :*
+ }
+ else if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname
+ {
+ cur++; // :
+
+ while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+ }
+ }
+
+ _cur_lexeme_contents.end = cur;
+
+ _cur_lexeme = lex_string;
+ }
+ else
+ {
+ _cur_lexeme = lex_none;
+ }
+ }
+
+ _cur = cur;
+ }
+
+ lexeme_t current() const
+ {
+ return _cur_lexeme;
+ }
+
+ const char_t* current_pos() const
+ {
+ return _cur_lexeme_pos;
+ }
+
+ const xpath_lexer_string& contents() const
+ {
+ assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string);
+
+ return _cur_lexeme_contents;
+ }
+ };
+
+ enum ast_type_t
+ {
+ ast_unknown,
+ ast_op_or, // left or right
+ ast_op_and, // left and right
+ ast_op_equal, // left = right
+ ast_op_not_equal, // left != right
+ ast_op_less, // left < right
+ ast_op_greater, // left > right
+ ast_op_less_or_equal, // left <= right
+ ast_op_greater_or_equal, // left >= right
+ ast_op_add, // left + right
+ ast_op_subtract, // left - right
+ ast_op_multiply, // left * right
+ ast_op_divide, // left / right
+ ast_op_mod, // left % right
+ ast_op_negate, // left - right
+ ast_op_union, // left | right
+ ast_predicate, // apply predicate to set; next points to next predicate
+ ast_filter, // select * from left where right
+ ast_string_constant, // string constant
+ ast_number_constant, // number constant
+ ast_variable, // variable
+ ast_func_last, // last()
+ ast_func_position, // position()
+ ast_func_count, // count(left)
+ ast_func_id, // id(left)
+ ast_func_local_name_0, // local-name()
+ ast_func_local_name_1, // local-name(left)
+ ast_func_namespace_uri_0, // namespace-uri()
+ ast_func_namespace_uri_1, // namespace-uri(left)
+ ast_func_name_0, // name()
+ ast_func_name_1, // name(left)
+ ast_func_string_0, // string()
+ ast_func_string_1, // string(left)
+ ast_func_concat, // concat(left, right, siblings)
+ ast_func_starts_with, // starts_with(left, right)
+ ast_func_contains, // contains(left, right)
+ ast_func_substring_before, // substring-before(left, right)
+ ast_func_substring_after, // substring-after(left, right)
+ ast_func_substring_2, // substring(left, right)
+ ast_func_substring_3, // substring(left, right, third)
+ ast_func_string_length_0, // string-length()
+ ast_func_string_length_1, // string-length(left)
+ ast_func_normalize_space_0, // normalize-space()
+ ast_func_normalize_space_1, // normalize-space(left)
+ ast_func_translate, // translate(left, right, third)
+ ast_func_boolean, // boolean(left)
+ ast_func_not, // not(left)
+ ast_func_true, // true()
+ ast_func_false, // false()
+ ast_func_lang, // lang(left)
+ ast_func_number_0, // number()
+ ast_func_number_1, // number(left)
+ ast_func_sum, // sum(left)
+ ast_func_floor, // floor(left)
+ ast_func_ceiling, // ceiling(left)
+ ast_func_round, // round(left)
+ ast_step, // process set left with step
+ ast_step_root, // select root node
+
+ ast_opt_translate_table, // translate(left, right, third) where right/third are constants
+ ast_opt_compare_attribute // @name = 'string'
+ };
+
+ enum axis_t
+ {
+ axis_ancestor,
+ axis_ancestor_or_self,
+ axis_attribute,
+ axis_child,
+ axis_descendant,
+ axis_descendant_or_self,
+ axis_following,
+ axis_following_sibling,
+ axis_namespace,
+ axis_parent,
+ axis_preceding,
+ axis_preceding_sibling,
+ axis_self
+ };
+
+ enum nodetest_t
+ {
+ nodetest_none,
+ nodetest_name,
+ nodetest_type_node,
+ nodetest_type_comment,
+ nodetest_type_pi,
+ nodetest_type_text,
+ nodetest_pi,
+ nodetest_all,
+ nodetest_all_in_namespace
+ };
+
+ enum predicate_t
+ {
+ predicate_default,
+ predicate_posinv,
+ predicate_constant,
+ predicate_constant_one
+ };
+
+ enum nodeset_eval_t
+ {
+ nodeset_eval_all,
+ nodeset_eval_any,
+ nodeset_eval_first
+ };
+
+ template <axis_t N> struct axis_to_type
+ {
+ static const axis_t axis;
+ };
+
+ template <axis_t N> const axis_t axis_to_type<N>::axis = N;
+
+ class xpath_ast_node
+ {
+ private:
+ // node type
+ char _type;
+ char _rettype;
+
+ // for ast_step
+ char _axis;
+
+ // for ast_step/ast_predicate/ast_filter
+ char _test;
+
+ // tree node structure
+ xpath_ast_node* _left;
+ xpath_ast_node* _right;
+ xpath_ast_node* _next;
+
+ union
+ {
+ // value for ast_string_constant
+ const char_t* string;
+ // value for ast_number_constant
+ double number;
+ // variable for ast_variable
+ xpath_variable* variable;
+ // node test for ast_step (node name/namespace/node type/pi target)
+ const char_t* nodetest;
+ // table for ast_opt_translate_table
+ const unsigned char* table;
+ } _data;
+
+ xpath_ast_node(const xpath_ast_node&);
+ xpath_ast_node& operator=(const xpath_ast_node&);
+
+ template <class Comp> static bool compare_eq(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp)
+ {
+ xpath_value_type lt = lhs->rettype(), rt = rhs->rettype();
+
+ if (lt != xpath_type_node_set && rt != xpath_type_node_set)
+ {
+ if (lt == xpath_type_boolean || rt == xpath_type_boolean)
+ return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack));
+ else if (lt == xpath_type_number || rt == xpath_type_number)
+ return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack));
+ else if (lt == xpath_type_string || rt == xpath_type_string)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_string ls = lhs->eval_string(c, stack);
+ xpath_string rs = rhs->eval_string(c, stack);
+
+ return comp(ls, rs);
+ }
+ }
+ else if (lt == xpath_type_node_set && rt == xpath_type_node_set)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);
+ xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+ for (const xpath_node* li = ls.begin(); li != ls.end(); ++li)
+ for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ if (comp(string_value(*li, stack.result), string_value(*ri, stack.result)))
+ return true;
+ }
+
+ return false;
+ }
+ else
+ {
+ if (lt == xpath_type_node_set)
+ {
+ swap(lhs, rhs);
+ swap(lt, rt);
+ }
+
+ if (lt == xpath_type_boolean)
+ return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack));
+ else if (lt == xpath_type_number)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ double l = lhs->eval_number(c, stack);
+ xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+ for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))
+ return true;
+ }
+
+ return false;
+ }
+ else if (lt == xpath_type_string)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_string l = lhs->eval_string(c, stack);
+ xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+ for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ if (comp(l, string_value(*ri, stack.result)))
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+ assert(!"Wrong types");
+ return false;
+ }
+
+ static bool eval_once(xpath_node_set::type_t type, nodeset_eval_t eval)
+ {
+ return type == xpath_node_set::type_sorted ? eval != nodeset_eval_all : eval == nodeset_eval_any;
+ }
+
+ template <class Comp> static bool compare_rel(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp)
+ {
+ xpath_value_type lt = lhs->rettype(), rt = rhs->rettype();
+
+ if (lt != xpath_type_node_set && rt != xpath_type_node_set)
+ return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack));
+ else if (lt == xpath_type_node_set && rt == xpath_type_node_set)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);
+ xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+ for (const xpath_node* li = ls.begin(); li != ls.end(); ++li)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ double l = convert_string_to_number(string_value(*li, stack.result).c_str());
+
+ for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ xpath_allocator_capture crii(stack.result);
+
+ if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))
+ return true;
+ }
+ }
+
+ return false;
+ }
+ else if (lt != xpath_type_node_set && rt == xpath_type_node_set)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ double l = lhs->eval_number(c, stack);
+ xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+ for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))
+ return true;
+ }
+
+ return false;
+ }
+ else if (lt == xpath_type_node_set && rt != xpath_type_node_set)
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);
+ double r = rhs->eval_number(c, stack);
+
+ for (const xpath_node* li = ls.begin(); li != ls.end(); ++li)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ if (comp(convert_string_to_number(string_value(*li, stack.result).c_str()), r))
+ return true;
+ }
+
+ return false;
+ }
+ else
+ {
+ assert(!"Wrong types");
+ return false;
+ }
+ }
+
+ static void apply_predicate_boolean(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once)
+ {
+ assert(ns.size() >= first);
+ assert(expr->rettype() != xpath_type_number);
+
+ size_t i = 1;
+ size_t size = ns.size() - first;
+
+ xpath_node* last = ns.begin() + first;
+
+ // remove_if... or well, sort of
+ for (xpath_node* it = last; it != ns.end(); ++it, ++i)
+ {
+ xpath_context c(*it, i, size);
+
+ if (expr->eval_boolean(c, stack))
+ {
+ *last++ = *it;
+
+ if (once) break;
+ }
+ }
+
+ ns.truncate(last);
+ }
+
+ static void apply_predicate_number(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once)
+ {
+ assert(ns.size() >= first);
+ assert(expr->rettype() == xpath_type_number);
+
+ size_t i = 1;
+ size_t size = ns.size() - first;
+
+ xpath_node* last = ns.begin() + first;
+
+ // remove_if... or well, sort of
+ for (xpath_node* it = last; it != ns.end(); ++it, ++i)
+ {
+ xpath_context c(*it, i, size);
+
+ if (expr->eval_number(c, stack) == i)
+ {
+ *last++ = *it;
+
+ if (once) break;
+ }
+ }
+
+ ns.truncate(last);
+ }
+
+ static void apply_predicate_number_const(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack)
+ {
+ assert(ns.size() >= first);
+ assert(expr->rettype() == xpath_type_number);
+
+ size_t size = ns.size() - first;
+
+ xpath_node* last = ns.begin() + first;
+
+ xpath_context c(xpath_node(), 1, size);
+
+ double er = expr->eval_number(c, stack);
+
+ if (er >= 1.0 && er <= size)
+ {
+ size_t eri = static_cast<size_t>(er);
+
+ if (er == eri)
+ {
+ xpath_node r = last[eri - 1];
+
+ *last++ = r;
+ }
+ }
+
+ ns.truncate(last);
+ }
+
+ void apply_predicate(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, bool once)
+ {
+ if (ns.size() == first) return;
+
+ assert(_type == ast_filter || _type == ast_predicate);
+
+ if (_test == predicate_constant || _test == predicate_constant_one)
+ apply_predicate_number_const(ns, first, _right, stack);
+ else if (_right->rettype() == xpath_type_number)
+ apply_predicate_number(ns, first, _right, stack, once);
+ else
+ apply_predicate_boolean(ns, first, _right, stack, once);
+ }
+
+ void apply_predicates(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, nodeset_eval_t eval)
+ {
+ if (ns.size() == first) return;
+
+ bool last_once = eval_once(ns.type(), eval);
+
+ for (xpath_ast_node* pred = _right; pred; pred = pred->_next)
+ pred->apply_predicate(ns, first, stack, !pred->_next && last_once);
+ }
+
+ bool step_push(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* parent, xpath_allocator* alloc)
+ {
+ assert(a);
+
+ const char_t* name = a->name ? a->name : PUGIXML_TEXT("");
+
+ switch (_test)
+ {
+ case nodetest_name:
+ if (strequal(name, _data.nodetest) && is_xpath_attribute(name))
+ {
+ ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_type_node:
+ case nodetest_all:
+ if (is_xpath_attribute(name))
+ {
+ ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_all_in_namespace:
+ if (starts_with(name, _data.nodetest) && is_xpath_attribute(name))
+ {
+ ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);
+ return true;
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ return false;
+ }
+
+ bool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc)
+ {
+ assert(n);
+
+ xml_node_type type = PUGI__NODETYPE(n);
+
+ switch (_test)
+ {
+ case nodetest_name:
+ if (type == node_element && n->name && strequal(n->name, _data.nodetest))
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_type_node:
+ ns.push_back(xml_node(n), alloc);
+ return true;
+
+ case nodetest_type_comment:
+ if (type == node_comment)
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_type_text:
+ if (type == node_pcdata || type == node_cdata)
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_type_pi:
+ if (type == node_pi)
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_pi:
+ if (type == node_pi && n->name && strequal(n->name, _data.nodetest))
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_all:
+ if (type == node_element)
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ case nodetest_all_in_namespace:
+ if (type == node_element && n->name && starts_with(n->name, _data.nodetest))
+ {
+ ns.push_back(xml_node(n), alloc);
+ return true;
+ }
+ break;
+
+ default:
+ assert(!"Unknown axis");
+ }
+
+ return false;
+ }
+
+ template <class T> void step_fill(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc, bool once, T)
+ {
+ const axis_t axis = T::axis;
+
+ switch (axis)
+ {
+ case axis_attribute:
+ {
+ for (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute)
+ if (step_push(ns, a, n, alloc) & once)
+ return;
+
+ break;
+ }
+
+ case axis_child:
+ {
+ for (xml_node_struct* c = n->first_child; c; c = c->next_sibling)
+ if (step_push(ns, c, alloc) & once)
+ return;
+
+ break;
+ }
+
+ case axis_descendant:
+ case axis_descendant_or_self:
+ {
+ if (axis == axis_descendant_or_self)
+ if (step_push(ns, n, alloc) & once)
+ return;
+
+ xml_node_struct* cur = n->first_child;
+
+ while (cur)
+ {
+ if (step_push(ns, cur, alloc) & once)
+ return;
+
+ if (cur->first_child)
+ cur = cur->first_child;
+ else
+ {
+ while (!cur->next_sibling)
+ {
+ cur = cur->parent;
+
+ if (cur == n) return;
+ }
+
+ cur = cur->next_sibling;
+ }
+ }
+
+ break;
+ }
+
+ case axis_following_sibling:
+ {
+ for (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling)
+ if (step_push(ns, c, alloc) & once)
+ return;
+
+ break;
+ }
+
+ case axis_preceding_sibling:
+ {
+ for (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c)
+ if (step_push(ns, c, alloc) & once)
+ return;
+
+ break;
+ }
+
+ case axis_following:
+ {
+ xml_node_struct* cur = n;
+
+ // exit from this node so that we don't include descendants
+ while (!cur->next_sibling)
+ {
+ cur = cur->parent;
+
+ if (!cur) return;
+ }
+
+ cur = cur->next_sibling;
+
+ while (cur)
+ {
+ if (step_push(ns, cur, alloc) & once)
+ return;
+
+ if (cur->first_child)
+ cur = cur->first_child;
+ else
+ {
+ while (!cur->next_sibling)
+ {
+ cur = cur->parent;
+
+ if (!cur) return;
+ }
+
+ cur = cur->next_sibling;
+ }
+ }
+
+ break;
+ }
+
+ case axis_preceding:
+ {
+ xml_node_struct* cur = n;
+
+ // exit from this node so that we don't include descendants
+ while (!cur->prev_sibling_c->next_sibling)
+ {
+ cur = cur->parent;
+
+ if (!cur) return;
+ }
+
+ cur = cur->prev_sibling_c;
+
+ while (cur)
+ {
+ if (cur->first_child)
+ cur = cur->first_child->prev_sibling_c;
+ else
+ {
+ // leaf node, can't be ancestor
+ if (step_push(ns, cur, alloc) & once)
+ return;
+
+ while (!cur->prev_sibling_c->next_sibling)
+ {
+ cur = cur->parent;
+
+ if (!cur) return;
+
+ if (!node_is_ancestor(cur, n))
+ if (step_push(ns, cur, alloc) & once)
+ return;
+ }
+
+ cur = cur->prev_sibling_c;
+ }
+ }
+
+ break;
+ }
+
+ case axis_ancestor:
+ case axis_ancestor_or_self:
+ {
+ if (axis == axis_ancestor_or_self)
+ if (step_push(ns, n, alloc) & once)
+ return;
+
+ xml_node_struct* cur = n->parent;
+
+ while (cur)
+ {
+ if (step_push(ns, cur, alloc) & once)
+ return;
+
+ cur = cur->parent;
+ }
+
+ break;
+ }
+
+ case axis_self:
+ {
+ step_push(ns, n, alloc);
+
+ break;
+ }
+
+ case axis_parent:
+ {
+ if (n->parent)
+ step_push(ns, n->parent, alloc);
+
+ break;
+ }
+
+ default:
+ assert(!"Unimplemented axis");
+ }
+ }
+
+ template <class T> void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v)
+ {
+ const axis_t axis = T::axis;
+
+ switch (axis)
+ {
+ case axis_ancestor:
+ case axis_ancestor_or_self:
+ {
+ if (axis == axis_ancestor_or_self && _test == nodetest_type_node) // reject attributes based on principal node type test
+ if (step_push(ns, a, p, alloc) & once)
+ return;
+
+ xml_node_struct* cur = p;
+
+ while (cur)
+ {
+ if (step_push(ns, cur, alloc) & once)
+ return;
+
+ cur = cur->parent;
+ }
+
+ break;
+ }
+
+ case axis_descendant_or_self:
+ case axis_self:
+ {
+ if (_test == nodetest_type_node) // reject attributes based on principal node type test
+ step_push(ns, a, p, alloc);
+
+ break;
+ }
+
+ case axis_following:
+ {
+ xml_node_struct* cur = p;
+
+ while (cur)
+ {
+ if (cur->first_child)
+ cur = cur->first_child;
+ else
+ {
+ while (!cur->next_sibling)
+ {
+ cur = cur->parent;
+
+ if (!cur) return;
+ }
+
+ cur = cur->next_sibling;
+ }
+
+ if (step_push(ns, cur, alloc) & once)
+ return;
+ }
+
+ break;
+ }
+
+ case axis_parent:
+ {
+ step_push(ns, p, alloc);
+
+ break;
+ }
+
+ case axis_preceding:
+ {
+ // preceding:: axis does not include attribute nodes and attribute ancestors (they are the same as parent's ancestors), so we can reuse node preceding
+ step_fill(ns, p, alloc, once, v);
+ break;
+ }
+
+ default:
+ assert(!"Unimplemented axis");
+ }
+ }
+
+ template <class T> void step_fill(xpath_node_set_raw& ns, const xpath_node& xn, xpath_allocator* alloc, bool once, T v)
+ {
+ const axis_t axis = T::axis;
+ const bool axis_has_attributes = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_descendant_or_self || axis == axis_following || axis == axis_parent || axis == axis_preceding || axis == axis_self);
+
+ if (xn.node())
+ step_fill(ns, xn.node().internal_object(), alloc, once, v);
+ else if (axis_has_attributes && xn.attribute() && xn.parent())
+ step_fill(ns, xn.attribute().internal_object(), xn.parent().internal_object(), alloc, once, v);
+ }
+
+ template <class T> xpath_node_set_raw step_do(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval, T v)
+ {
+ const axis_t axis = T::axis;
+ const bool axis_reverse = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_preceding || axis == axis_preceding_sibling);
+ const xpath_node_set::type_t axis_type = axis_reverse ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted;
+
+ bool once =
+ (axis == axis_attribute && _test == nodetest_name) ||
+ (!_right && eval_once(axis_type, eval)) ||
+ (_right && !_right->_next && _right->_test == predicate_constant_one);
+
+ xpath_node_set_raw ns;
+ ns.set_type(axis_type);
+
+ if (_left)
+ {
+ xpath_node_set_raw s = _left->eval_node_set(c, stack, nodeset_eval_all);
+
+ // self axis preserves the original order
+ if (axis == axis_self) ns.set_type(s.type());
+
+ for (const xpath_node* it = s.begin(); it != s.end(); ++it)
+ {
+ size_t size = ns.size();
+
+ // in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes
+ if (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted);
+
+ step_fill(ns, *it, stack.result, once, v);
+ if (_right) apply_predicates(ns, size, stack, eval);
+ }
+ }
+ else
+ {
+ step_fill(ns, c.n, stack.result, once, v);
+ if (_right) apply_predicates(ns, 0, stack, eval);
+ }
+
+ // child, attribute and self axes always generate unique set of nodes
+ // for other axis, if the set stayed sorted, it stayed unique because the traversal algorithms do not visit the same node twice
+ if (axis != axis_child && axis != axis_attribute && axis != axis_self && ns.type() == xpath_node_set::type_unsorted)
+ ns.remove_duplicates();
+
+ return ns;
+ }
+
+ public:
+ xpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value):
+ _type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)
+ {
+ assert(type == ast_string_constant);
+ _data.string = value;
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_value_type rettype_, double value):
+ _type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)
+ {
+ assert(type == ast_number_constant);
+ _data.number = value;
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value):
+ _type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)
+ {
+ assert(type == ast_variable);
+ _data.variable = value;
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0):
+ _type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0)
+ {
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents):
+ _type(static_cast<char>(type)), _rettype(xpath_type_node_set), _axis(static_cast<char>(axis)), _test(static_cast<char>(test)), _left(left), _right(0), _next(0)
+ {
+ assert(type == ast_step);
+ _data.nodetest = contents;
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test):
+ _type(static_cast<char>(type)), _rettype(xpath_type_node_set), _axis(0), _test(static_cast<char>(test)), _left(left), _right(right), _next(0)
+ {
+ assert(type == ast_filter || type == ast_predicate);
+ }
+
+ void set_next(xpath_ast_node* value)
+ {
+ _next = value;
+ }
+
+ void set_right(xpath_ast_node* value)
+ {
+ _right = value;
+ }
+
+ bool eval_boolean(const xpath_context& c, const xpath_stack& stack)
+ {
+ switch (_type)
+ {
+ case ast_op_or:
+ return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack);
+
+ case ast_op_and:
+ return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack);
+
+ case ast_op_equal:
+ return compare_eq(_left, _right, c, stack, equal_to());
+
+ case ast_op_not_equal:
+ return compare_eq(_left, _right, c, stack, not_equal_to());
+
+ case ast_op_less:
+ return compare_rel(_left, _right, c, stack, less());
+
+ case ast_op_greater:
+ return compare_rel(_right, _left, c, stack, less());
+
+ case ast_op_less_or_equal:
+ return compare_rel(_left, _right, c, stack, less_equal());
+
+ case ast_op_greater_or_equal:
+ return compare_rel(_right, _left, c, stack, less_equal());
+
+ case ast_func_starts_with:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_string lr = _left->eval_string(c, stack);
+ xpath_string rr = _right->eval_string(c, stack);
+
+ return starts_with(lr.c_str(), rr.c_str());
+ }
+
+ case ast_func_contains:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_string lr = _left->eval_string(c, stack);
+ xpath_string rr = _right->eval_string(c, stack);
+
+ return find_substring(lr.c_str(), rr.c_str()) != 0;
+ }
+
+ case ast_func_boolean:
+ return _left->eval_boolean(c, stack);
+
+ case ast_func_not:
+ return !_left->eval_boolean(c, stack);
+
+ case ast_func_true:
+ return true;
+
+ case ast_func_false:
+ return false;
+
+ case ast_func_lang:
+ {
+ if (c.n.attribute()) return false;
+
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_string lang = _left->eval_string(c, stack);
+
+ for (xml_node n = c.n.node(); n; n = n.parent())
+ {
+ xml_attribute a = n.attribute(PUGIXML_TEXT("xml:lang"));
+
+ if (a)
+ {
+ const char_t* value = a.value();
+
+ // strnicmp / strncasecmp is not portable
+ for (const char_t* lit = lang.c_str(); *lit; ++lit)
+ {
+ if (tolower_ascii(*lit) != tolower_ascii(*value)) return false;
+ ++value;
+ }
+
+ return *value == 0 || *value == '-';
+ }
+ }
+
+ return false;
+ }
+
+ case ast_opt_compare_attribute:
+ {
+ const char_t* value = (_right->_type == ast_string_constant) ? _right->_data.string : _right->_data.variable->get_string();
+
+ xml_attribute attr = c.n.node().attribute(_left->_data.nodetest);
+
+ return attr && strequal(attr.value(), value) && is_xpath_attribute(attr.name());
+ }
+
+ case ast_variable:
+ {
+ assert(_rettype == _data.variable->type());
+
+ if (_rettype == xpath_type_boolean)
+ return _data.variable->get_boolean();
+
+ // fallthrough to type conversion
+ }
+
+ default:
+ {
+ switch (_rettype)
+ {
+ case xpath_type_number:
+ return convert_number_to_boolean(eval_number(c, stack));
+
+ case xpath_type_string:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return !eval_string(c, stack).empty();
+ }
+
+ case xpath_type_node_set:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return !eval_node_set(c, stack, nodeset_eval_any).empty();
+ }
+
+ default:
+ assert(!"Wrong expression for return type boolean");
+ return false;
+ }
+ }
+ }
+ }
+
+ double eval_number(const xpath_context& c, const xpath_stack& stack)
+ {
+ switch (_type)
+ {
+ case ast_op_add:
+ return _left->eval_number(c, stack) + _right->eval_number(c, stack);
+
+ case ast_op_subtract:
+ return _left->eval_number(c, stack) - _right->eval_number(c, stack);
+
+ case ast_op_multiply:
+ return _left->eval_number(c, stack) * _right->eval_number(c, stack);
+
+ case ast_op_divide:
+ return _left->eval_number(c, stack) / _right->eval_number(c, stack);
+
+ case ast_op_mod:
+ return fmod(_left->eval_number(c, stack), _right->eval_number(c, stack));
+
+ case ast_op_negate:
+ return -_left->eval_number(c, stack);
+
+ case ast_number_constant:
+ return _data.number;
+
+ case ast_func_last:
+ return static_cast<double>(c.size);
+
+ case ast_func_position:
+ return static_cast<double>(c.position);
+
+ case ast_func_count:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return static_cast<double>(_left->eval_node_set(c, stack, nodeset_eval_all).size());
+ }
+
+ case ast_func_string_length_0:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return static_cast<double>(string_value(c.n, stack.result).length());
+ }
+
+ case ast_func_string_length_1:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return static_cast<double>(_left->eval_string(c, stack).length());
+ }
+
+ case ast_func_number_0:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return convert_string_to_number(string_value(c.n, stack.result).c_str());
+ }
+
+ case ast_func_number_1:
+ return _left->eval_number(c, stack);
+
+ case ast_func_sum:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ double r = 0;
+
+ xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all);
+
+ for (const xpath_node* it = ns.begin(); it != ns.end(); ++it)
+ {
+ xpath_allocator_capture cri(stack.result);
+
+ r += convert_string_to_number(string_value(*it, stack.result).c_str());
+ }
+
+ return r;
+ }
+
+ case ast_func_floor:
+ {
+ double r = _left->eval_number(c, stack);
+
+ return r == r ? floor(r) : r;
+ }
+
+ case ast_func_ceiling:
+ {
+ double r = _left->eval_number(c, stack);
+
+ return r == r ? ceil(r) : r;
+ }
+
+ case ast_func_round:
+ return round_nearest_nzero(_left->eval_number(c, stack));
+
+ case ast_variable:
+ {
+ assert(_rettype == _data.variable->type());
+
+ if (_rettype == xpath_type_number)
+ return _data.variable->get_number();
+
+ // fallthrough to type conversion
+ }
+
+ default:
+ {
+ switch (_rettype)
+ {
+ case xpath_type_boolean:
+ return eval_boolean(c, stack) ? 1 : 0;
+
+ case xpath_type_string:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return convert_string_to_number(eval_string(c, stack).c_str());
+ }
+
+ case xpath_type_node_set:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ return convert_string_to_number(eval_string(c, stack).c_str());
+ }
+
+ default:
+ assert(!"Wrong expression for return type number");
+ return 0;
+ }
+
+ }
+ }
+ }
+
+ xpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack)
+ {
+ assert(_type == ast_func_concat);
+
+ xpath_allocator_capture ct(stack.temp);
+
+ // count the string number
+ size_t count = 1;
+ for (xpath_ast_node* nc = _right; nc; nc = nc->_next) count++;
+
+ // gather all strings
+ xpath_string static_buffer[4];
+ xpath_string* buffer = static_buffer;
+
+ // allocate on-heap for large concats
+ if (count > sizeof(static_buffer) / sizeof(static_buffer[0]))
+ {
+ buffer = static_cast<xpath_string*>(stack.temp->allocate(count * sizeof(xpath_string)));
+ assert(buffer);
+ }
+
+ // evaluate all strings to temporary stack
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ buffer[0] = _left->eval_string(c, swapped_stack);
+
+ size_t pos = 1;
+ for (xpath_ast_node* n = _right; n; n = n->_next, ++pos) buffer[pos] = n->eval_string(c, swapped_stack);
+ assert(pos == count);
+
+ // get total length
+ size_t length = 0;
+ for (size_t i = 0; i < count; ++i) length += buffer[i].length();
+
+ // create final string
+ char_t* result = static_cast<char_t*>(stack.result->allocate((length + 1) * sizeof(char_t)));
+ assert(result);
+
+ char_t* ri = result;
+
+ for (size_t j = 0; j < count; ++j)
+ for (const char_t* bi = buffer[j].c_str(); *bi; ++bi)
+ *ri++ = *bi;
+
+ *ri = 0;
+
+ return xpath_string::from_heap_preallocated(result, ri);
+ }
+
+ xpath_string eval_string(const xpath_context& c, const xpath_stack& stack)
+ {
+ switch (_type)
+ {
+ case ast_string_constant:
+ return xpath_string::from_const(_data.string);
+
+ case ast_func_local_name_0:
+ {
+ xpath_node na = c.n;
+
+ return xpath_string::from_const(local_name(na));
+ }
+
+ case ast_func_local_name_1:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);
+ xpath_node na = ns.first();
+
+ return xpath_string::from_const(local_name(na));
+ }
+
+ case ast_func_name_0:
+ {
+ xpath_node na = c.n;
+
+ return xpath_string::from_const(qualified_name(na));
+ }
+
+ case ast_func_name_1:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);
+ xpath_node na = ns.first();
+
+ return xpath_string::from_const(qualified_name(na));
+ }
+
+ case ast_func_namespace_uri_0:
+ {
+ xpath_node na = c.n;
+
+ return xpath_string::from_const(namespace_uri(na));
+ }
+
+ case ast_func_namespace_uri_1:
+ {
+ xpath_allocator_capture cr(stack.result);
+
+ xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);
+ xpath_node na = ns.first();
+
+ return xpath_string::from_const(namespace_uri(na));
+ }
+
+ case ast_func_string_0:
+ return string_value(c.n, stack.result);
+
+ case ast_func_string_1:
+ return _left->eval_string(c, stack);
+
+ case ast_func_concat:
+ return eval_string_concat(c, stack);
+
+ case ast_func_substring_before:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_string s = _left->eval_string(c, swapped_stack);
+ xpath_string p = _right->eval_string(c, swapped_stack);
+
+ const char_t* pos = find_substring(s.c_str(), p.c_str());
+
+ return pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string();
+ }
+
+ case ast_func_substring_after:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_string s = _left->eval_string(c, swapped_stack);
+ xpath_string p = _right->eval_string(c, swapped_stack);
+
+ const char_t* pos = find_substring(s.c_str(), p.c_str());
+ if (!pos) return xpath_string();
+
+ const char_t* rbegin = pos + p.length();
+ const char_t* rend = s.c_str() + s.length();
+
+ return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);
+ }
+
+ case ast_func_substring_2:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_string s = _left->eval_string(c, swapped_stack);
+ size_t s_length = s.length();
+
+ double first = round_nearest(_right->eval_number(c, stack));
+
+ if (is_nan(first)) return xpath_string(); // NaN
+ else if (first >= s_length + 1) return xpath_string();
+
+ size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
+ assert(1 <= pos && pos <= s_length + 1);
+
+ const char_t* rbegin = s.c_str() + (pos - 1);
+ const char_t* rend = s.c_str() + s.length();
+
+ return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);
+ }
+
+ case ast_func_substring_3:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_string s = _left->eval_string(c, swapped_stack);
+ size_t s_length = s.length();
+
+ double first = round_nearest(_right->eval_number(c, stack));
+ double last = first + round_nearest(_right->_next->eval_number(c, stack));
+
+ if (is_nan(first) || is_nan(last)) return xpath_string();
+ else if (first >= s_length + 1) return xpath_string();
+ else if (first >= last) return xpath_string();
+ else if (last < 1) return xpath_string();
+
+ size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
+ size_t end = last >= s_length + 1 ? s_length + 1 : static_cast<size_t>(last);
+
+ assert(1 <= pos && pos <= end && end <= s_length + 1);
+ const char_t* rbegin = s.c_str() + (pos - 1);
+ const char_t* rend = s.c_str() + (end - 1);
+
+ return (end == s_length + 1 && !s.uses_heap()) ? xpath_string::from_const(rbegin) : xpath_string::from_heap(rbegin, rend, stack.result);
+ }
+
+ case ast_func_normalize_space_0:
+ {
+ xpath_string s = string_value(c.n, stack.result);
+
+ normalize_space(s.data(stack.result));
+
+ return s;
+ }
+
+ case ast_func_normalize_space_1:
+ {
+ xpath_string s = _left->eval_string(c, stack);
+
+ normalize_space(s.data(stack.result));
+
+ return s;
+ }
+
+ case ast_func_translate:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_string s = _left->eval_string(c, stack);
+ xpath_string from = _right->eval_string(c, swapped_stack);
+ xpath_string to = _right->_next->eval_string(c, swapped_stack);
+
+ translate(s.data(stack.result), from.c_str(), to.c_str(), to.length());
+
+ return s;
+ }
+
+ case ast_opt_translate_table:
+ {
+ xpath_string s = _left->eval_string(c, stack);
+
+ translate_table(s.data(stack.result), _data.table);
+
+ return s;
+ }
+
+ case ast_variable:
+ {
+ assert(_rettype == _data.variable->type());
+
+ if (_rettype == xpath_type_string)
+ return xpath_string::from_const(_data.variable->get_string());
+
+ // fallthrough to type conversion
+ }
+
+ default:
+ {
+ switch (_rettype)
+ {
+ case xpath_type_boolean:
+ return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));
+
+ case xpath_type_number:
+ return convert_number_to_string(eval_number(c, stack), stack.result);
+
+ case xpath_type_node_set:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first);
+ return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result);
+ }
+
+ default:
+ assert(!"Wrong expression for return type string");
+ return xpath_string();
+ }
+ }
+ }
+ }
+
+ xpath_node_set_raw eval_node_set(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval)
+ {
+ switch (_type)
+ {
+ case ast_op_union:
+ {
+ xpath_allocator_capture cr(stack.temp);
+
+ xpath_stack swapped_stack = {stack.temp, stack.result};
+
+ xpath_node_set_raw ls = _left->eval_node_set(c, swapped_stack, eval);
+ xpath_node_set_raw rs = _right->eval_node_set(c, stack, eval);
+
+ // we can optimize merging two sorted sets, but this is a very rare operation, so don't bother
+ rs.set_type(xpath_node_set::type_unsorted);
+
+ rs.append(ls.begin(), ls.end(), stack.result);
+ rs.remove_duplicates();
+
+ return rs;
+ }
+
+ case ast_filter:
+ {
+ xpath_node_set_raw set = _left->eval_node_set(c, stack, _test == predicate_constant_one ? nodeset_eval_first : nodeset_eval_all);
+
+ // either expression is a number or it contains position() call; sort by document order
+ if (_test != predicate_posinv) set.sort_do();
+
+ bool once = eval_once(set.type(), eval);
+
+ apply_predicate(set, 0, stack, once);
+
+ return set;
+ }
+
+ case ast_func_id:
+ return xpath_node_set_raw();
+
+ case ast_step:
+ {
+ switch (_axis)
+ {
+ case axis_ancestor:
+ return step_do(c, stack, eval, axis_to_type<axis_ancestor>());
+
+ case axis_ancestor_or_self:
+ return step_do(c, stack, eval, axis_to_type<axis_ancestor_or_self>());
+
+ case axis_attribute:
+ return step_do(c, stack, eval, axis_to_type<axis_attribute>());
+
+ case axis_child:
+ return step_do(c, stack, eval, axis_to_type<axis_child>());
+
+ case axis_descendant:
+ return step_do(c, stack, eval, axis_to_type<axis_descendant>());
+
+ case axis_descendant_or_self:
+ return step_do(c, stack, eval, axis_to_type<axis_descendant_or_self>());
+
+ case axis_following:
+ return step_do(c, stack, eval, axis_to_type<axis_following>());
+
+ case axis_following_sibling:
+ return step_do(c, stack, eval, axis_to_type<axis_following_sibling>());
+
+ case axis_namespace:
+ // namespaced axis is not supported
+ return xpath_node_set_raw();
+
+ case axis_parent:
+ return step_do(c, stack, eval, axis_to_type<axis_parent>());
+
+ case axis_preceding:
+ return step_do(c, stack, eval, axis_to_type<axis_preceding>());
+
+ case axis_preceding_sibling:
+ return step_do(c, stack, eval, axis_to_type<axis_preceding_sibling>());
+
+ case axis_self:
+ return step_do(c, stack, eval, axis_to_type<axis_self>());
+
+ default:
+ assert(!"Unknown axis");
+ return xpath_node_set_raw();
+ }
+ }
+
+ case ast_step_root:
+ {
+ assert(!_right); // root step can't have any predicates
+
+ xpath_node_set_raw ns;
+
+ ns.set_type(xpath_node_set::type_sorted);
+
+ if (c.n.node()) ns.push_back(c.n.node().root(), stack.result);
+ else if (c.n.attribute()) ns.push_back(c.n.parent().root(), stack.result);
+
+ return ns;
+ }
+
+ case ast_variable:
+ {
+ assert(_rettype == _data.variable->type());
+
+ if (_rettype == xpath_type_node_set)
+ {
+ const xpath_node_set& s = _data.variable->get_node_set();
+
+ xpath_node_set_raw ns;
+
+ ns.set_type(s.type());
+ ns.append(s.begin(), s.end(), stack.result);
+
+ return ns;
+ }
+
+ // fallthrough to type conversion
+ }
+
+ default:
+ assert(!"Wrong expression for return type node set");
+ return xpath_node_set_raw();
+ }
+ }
+
+ void optimize(xpath_allocator* alloc)
+ {
+ if (_left) _left->optimize(alloc);
+ if (_right) _right->optimize(alloc);
+ if (_next) _next->optimize(alloc);
+
+ // Rewrite [position()=expr] with [expr]
+ // Note that this step has to go before classification to recognize [position()=1]
+ if ((_type == ast_filter || _type == ast_predicate) &&
+ _right->_type == ast_op_equal && _right->_left->_type == ast_func_position && _right->_right->_rettype == xpath_type_number)
+ {
+ _right = _right->_right;
+ }
+
+ // Classify filter/predicate ops to perform various optimizations during evaluation
+ if (_type == ast_filter || _type == ast_predicate)
+ {
+ assert(_test == predicate_default);
+
+ if (_right->_type == ast_number_constant && _right->_data.number == 1.0)
+ _test = predicate_constant_one;
+ else if (_right->_rettype == xpath_type_number && (_right->_type == ast_number_constant || _right->_type == ast_variable || _right->_type == ast_func_last))
+ _test = predicate_constant;
+ else if (_right->_rettype != xpath_type_number && _right->is_posinv_expr())
+ _test = predicate_posinv;
+ }
+
+ // Rewrite descendant-or-self::node()/child::foo with descendant::foo
+ // The former is a full form of //foo, the latter is much faster since it executes the node test immediately
+ // Do a similar kind of rewrite for self/descendant/descendant-or-self axes
+ // Note that we only rewrite positionally invariant steps (//foo[1] != /descendant::foo[1])
+ if (_type == ast_step && (_axis == axis_child || _axis == axis_self || _axis == axis_descendant || _axis == axis_descendant_or_self) && _left &&
+ _left->_type == ast_step && _left->_axis == axis_descendant_or_self && _left->_test == nodetest_type_node && !_left->_right &&
+ is_posinv_step())
+ {
+ if (_axis == axis_child || _axis == axis_descendant)
+ _axis = axis_descendant;
+ else
+ _axis = axis_descendant_or_self;
+
+ _left = _left->_left;
+ }
+
+ // Use optimized lookup table implementation for translate() with constant arguments
+ if (_type == ast_func_translate && _right->_type == ast_string_constant && _right->_next->_type == ast_string_constant)
+ {
+ unsigned char* table = translate_table_generate(alloc, _right->_data.string, _right->_next->_data.string);
+
+ if (table)
+ {
+ _type = ast_opt_translate_table;
+ _data.table = table;
+ }
+ }
+
+ // Use optimized path for @attr = 'value' or @attr = $value
+ if (_type == ast_op_equal &&
+ _left->_type == ast_step && _left->_axis == axis_attribute && _left->_test == nodetest_name && !_left->_left && !_left->_right &&
+ (_right->_type == ast_string_constant || (_right->_type == ast_variable && _right->_rettype == xpath_type_string)))
+ {
+ _type = ast_opt_compare_attribute;
+ }
+ }
+
+ bool is_posinv_expr() const
+ {
+ switch (_type)
+ {
+ case ast_func_position:
+ case ast_func_last:
+ return false;
+
+ case ast_string_constant:
+ case ast_number_constant:
+ case ast_variable:
+ return true;
+
+ case ast_step:
+ case ast_step_root:
+ return true;
+
+ case ast_predicate:
+ case ast_filter:
+ return true;
+
+ default:
+ if (_left && !_left->is_posinv_expr()) return false;
+
+ for (xpath_ast_node* n = _right; n; n = n->_next)
+ if (!n->is_posinv_expr()) return false;
+
+ return true;
+ }
+ }
+
+ bool is_posinv_step() const
+ {
+ assert(_type == ast_step);
+
+ for (xpath_ast_node* n = _right; n; n = n->_next)
+ {
+ assert(n->_type == ast_predicate);
+
+ if (n->_test != predicate_posinv)
+ return false;
+ }
+
+ return true;
+ }
+
+ xpath_value_type rettype() const
+ {
+ return static_cast<xpath_value_type>(_rettype);
+ }
+ };
+
+ struct xpath_parser
+ {
+ xpath_allocator* _alloc;
+ xpath_lexer _lexer;
+
+ const char_t* _query;
+ xpath_variable_set* _variables;
+
+ xpath_parse_result* _result;
+
+ char_t _scratch[32];
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ jmp_buf _error_handler;
+ #endif
+
+ void throw_error(const char* message)
+ {
+ _result->error = message;
+ _result->offset = _lexer.current_pos() - _query;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ longjmp(_error_handler, 1);
+ #else
+ throw xpath_exception(*_result);
+ #endif
+ }
+
+ void throw_error_oom()
+ {
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ throw_error("Out of memory");
+ #else
+ throw std::bad_alloc();
+ #endif
+ }
+
+ void* alloc_node()
+ {
+ void* result = _alloc->allocate_nothrow(sizeof(xpath_ast_node));
+
+ if (!result) throw_error_oom();
+
+ return result;
+ }
+
+ const char_t* alloc_string(const xpath_lexer_string& value)
+ {
+ if (value.begin)
+ {
+ size_t length = static_cast<size_t>(value.end - value.begin);
+
+ char_t* c = static_cast<char_t*>(_alloc->allocate_nothrow((length + 1) * sizeof(char_t)));
+ if (!c) throw_error_oom();
+ assert(c); // workaround for clang static analysis
+
+ memcpy(c, value.begin, length * sizeof(char_t));
+ c[length] = 0;
+
+ return c;
+ }
+ else return 0;
+ }
+
+ xpath_ast_node* parse_function_helper(ast_type_t type0, ast_type_t type1, size_t argc, xpath_ast_node* args[2])
+ {
+ assert(argc <= 1);
+
+ if (argc == 1 && args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set");
+
+ return new (alloc_node()) xpath_ast_node(argc == 0 ? type0 : type1, xpath_type_string, args[0]);
+ }
+
+ xpath_ast_node* parse_function(const xpath_lexer_string& name, size_t argc, xpath_ast_node* args[2])
+ {
+ switch (name.begin[0])
+ {
+ case 'b':
+ if (name == PUGIXML_TEXT("boolean") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_boolean, xpath_type_boolean, args[0]);
+
+ break;
+
+ case 'c':
+ if (name == PUGIXML_TEXT("count") && argc == 1)
+ {
+ if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set");
+ return new (alloc_node()) xpath_ast_node(ast_func_count, xpath_type_number, args[0]);
+ }
+ else if (name == PUGIXML_TEXT("contains") && argc == 2)
+ return new (alloc_node()) xpath_ast_node(ast_func_contains, xpath_type_boolean, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("concat") && argc >= 2)
+ return new (alloc_node()) xpath_ast_node(ast_func_concat, xpath_type_string, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("ceiling") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_ceiling, xpath_type_number, args[0]);
+
+ break;
+
+ case 'f':
+ if (name == PUGIXML_TEXT("false") && argc == 0)
+ return new (alloc_node()) xpath_ast_node(ast_func_false, xpath_type_boolean);
+ else if (name == PUGIXML_TEXT("floor") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_floor, xpath_type_number, args[0]);
+
+ break;
+
+ case 'i':
+ if (name == PUGIXML_TEXT("id") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_id, xpath_type_node_set, args[0]);
+
+ break;
+
+ case 'l':
+ if (name == PUGIXML_TEXT("last") && argc == 0)
+ return new (alloc_node()) xpath_ast_node(ast_func_last, xpath_type_number);
+ else if (name == PUGIXML_TEXT("lang") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_lang, xpath_type_boolean, args[0]);
+ else if (name == PUGIXML_TEXT("local-name") && argc <= 1)
+ return parse_function_helper(ast_func_local_name_0, ast_func_local_name_1, argc, args);
+
+ break;
+
+ case 'n':
+ if (name == PUGIXML_TEXT("name") && argc <= 1)
+ return parse_function_helper(ast_func_name_0, ast_func_name_1, argc, args);
+ else if (name == PUGIXML_TEXT("namespace-uri") && argc <= 1)
+ return parse_function_helper(ast_func_namespace_uri_0, ast_func_namespace_uri_1, argc, args);
+ else if (name == PUGIXML_TEXT("normalize-space") && argc <= 1)
+ return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("not") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_not, xpath_type_boolean, args[0]);
+ else if (name == PUGIXML_TEXT("number") && argc <= 1)
+ return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]);
+
+ break;
+
+ case 'p':
+ if (name == PUGIXML_TEXT("position") && argc == 0)
+ return new (alloc_node()) xpath_ast_node(ast_func_position, xpath_type_number);
+
+ break;
+
+ case 'r':
+ if (name == PUGIXML_TEXT("round") && argc == 1)
+ return new (alloc_node()) xpath_ast_node(ast_func_round, xpath_type_number, args[0]);
+
+ break;
+
+ case 's':
+ if (name == PUGIXML_TEXT("string") && argc <= 1)
+ return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]);
+ else if (name == PUGIXML_TEXT("string-length") && argc <= 1)
+ return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]);
+ else if (name == PUGIXML_TEXT("starts-with") && argc == 2)
+ return new (alloc_node()) xpath_ast_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("substring-before") && argc == 2)
+ return new (alloc_node()) xpath_ast_node(ast_func_substring_before, xpath_type_string, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("substring-after") && argc == 2)
+ return new (alloc_node()) xpath_ast_node(ast_func_substring_after, xpath_type_string, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("substring") && (argc == 2 || argc == 3))
+ return new (alloc_node()) xpath_ast_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("sum") && argc == 1)
+ {
+ if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set");
+ return new (alloc_node()) xpath_ast_node(ast_func_sum, xpath_type_number, args[0]);
+ }
+
+ break;
+
+ case 't':
+ if (name == PUGIXML_TEXT("translate") && argc == 3)
+ return new (alloc_node()) xpath_ast_node(ast_func_translate, xpath_type_string, args[0], args[1]);
+ else if (name == PUGIXML_TEXT("true") && argc == 0)
+ return new (alloc_node()) xpath_ast_node(ast_func_true, xpath_type_boolean);
+
+ break;
+
+ default:
+ break;
+ }
+
+ throw_error("Unrecognized function or wrong parameter count");
+
+ return 0;
+ }
+
+ axis_t parse_axis_name(const xpath_lexer_string& name, bool& specified)
+ {
+ specified = true;
+
+ switch (name.begin[0])
+ {
+ case 'a':
+ if (name == PUGIXML_TEXT("ancestor"))
+ return axis_ancestor;
+ else if (name == PUGIXML_TEXT("ancestor-or-self"))
+ return axis_ancestor_or_self;
+ else if (name == PUGIXML_TEXT("attribute"))
+ return axis_attribute;
+
+ break;
+
+ case 'c':
+ if (name == PUGIXML_TEXT("child"))
+ return axis_child;
+
+ break;
+
+ case 'd':
+ if (name == PUGIXML_TEXT("descendant"))
+ return axis_descendant;
+ else if (name == PUGIXML_TEXT("descendant-or-self"))
+ return axis_descendant_or_self;
+
+ break;
+
+ case 'f':
+ if (name == PUGIXML_TEXT("following"))
+ return axis_following;
+ else if (name == PUGIXML_TEXT("following-sibling"))
+ return axis_following_sibling;
+
+ break;
+
+ case 'n':
+ if (name == PUGIXML_TEXT("namespace"))
+ return axis_namespace;
+
+ break;
+
+ case 'p':
+ if (name == PUGIXML_TEXT("parent"))
+ return axis_parent;
+ else if (name == PUGIXML_TEXT("preceding"))
+ return axis_preceding;
+ else if (name == PUGIXML_TEXT("preceding-sibling"))
+ return axis_preceding_sibling;
+
+ break;
+
+ case 's':
+ if (name == PUGIXML_TEXT("self"))
+ return axis_self;
+
+ break;
+
+ default:
+ break;
+ }
+
+ specified = false;
+ return axis_child;
+ }
+
+ nodetest_t parse_node_test_type(const xpath_lexer_string& name)
+ {
+ switch (name.begin[0])
+ {
+ case 'c':
+ if (name == PUGIXML_TEXT("comment"))
+ return nodetest_type_comment;
+
+ break;
+
+ case 'n':
+ if (name == PUGIXML_TEXT("node"))
+ return nodetest_type_node;
+
+ break;
+
+ case 'p':
+ if (name == PUGIXML_TEXT("processing-instruction"))
+ return nodetest_type_pi;
+
+ break;
+
+ case 't':
+ if (name == PUGIXML_TEXT("text"))
+ return nodetest_type_text;
+
+ break;
+
+ default:
+ break;
+ }
+
+ return nodetest_none;
+ }
+
+ // PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall
+ xpath_ast_node* parse_primary_expression()
+ {
+ switch (_lexer.current())
+ {
+ case lex_var_ref:
+ {
+ xpath_lexer_string name = _lexer.contents();
+
+ if (!_variables)
+ throw_error("Unknown variable: variable set is not provided");
+
+ xpath_variable* var = get_variable_scratch(_scratch, _variables, name.begin, name.end);
+
+ if (!var)
+ throw_error("Unknown variable: variable set does not contain the given name");
+
+ _lexer.next();
+
+ return new (alloc_node()) xpath_ast_node(ast_variable, var->type(), var);
+ }
+
+ case lex_open_brace:
+ {
+ _lexer.next();
+
+ xpath_ast_node* n = parse_expression();
+
+ if (_lexer.current() != lex_close_brace)
+ throw_error("Unmatched braces");
+
+ _lexer.next();
+
+ return n;
+ }
+
+ case lex_quoted_string:
+ {
+ const char_t* value = alloc_string(_lexer.contents());
+
+ xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_string_constant, xpath_type_string, value);
+ _lexer.next();
+
+ return n;
+ }
+
+ case lex_number:
+ {
+ double value = 0;
+
+ if (!convert_string_to_number_scratch(_scratch, _lexer.contents().begin, _lexer.contents().end, &value))
+ throw_error_oom();
+
+ xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_number_constant, xpath_type_number, value);
+ _lexer.next();
+
+ return n;
+ }
+
+ case lex_string:
+ {
+ xpath_ast_node* args[2] = {0};
+ size_t argc = 0;
+
+ xpath_lexer_string function = _lexer.contents();
+ _lexer.next();
+
+ xpath_ast_node* last_arg = 0;
+
+ if (_lexer.current() != lex_open_brace)
+ throw_error("Unrecognized function call");
+ _lexer.next();
+
+ if (_lexer.current() != lex_close_brace)
+ args[argc++] = parse_expression();
+
+ while (_lexer.current() != lex_close_brace)
+ {
+ if (_lexer.current() != lex_comma)
+ throw_error("No comma between function arguments");
+ _lexer.next();
+
+ xpath_ast_node* n = parse_expression();
+
+ if (argc < 2) args[argc] = n;
+ else last_arg->set_next(n);
+
+ argc++;
+ last_arg = n;
+ }
+
+ _lexer.next();
+
+ return parse_function(function, argc, args);
+ }
+
+ default:
+ throw_error("Unrecognizable primary expression");
+
+ return 0;
+ }
+ }
+
+ // FilterExpr ::= PrimaryExpr | FilterExpr Predicate
+ // Predicate ::= '[' PredicateExpr ']'
+ // PredicateExpr ::= Expr
+ xpath_ast_node* parse_filter_expression()
+ {
+ xpath_ast_node* n = parse_primary_expression();
+
+ while (_lexer.current() == lex_open_square_brace)
+ {
+ _lexer.next();
+
+ xpath_ast_node* expr = parse_expression();
+
+ if (n->rettype() != xpath_type_node_set) throw_error("Predicate has to be applied to node set");
+
+ n = new (alloc_node()) xpath_ast_node(ast_filter, n, expr, predicate_default);
+
+ if (_lexer.current() != lex_close_square_brace)
+ throw_error("Unmatched square brace");
+
+ _lexer.next();
+ }
+
+ return n;
+ }
+
+ // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
+ // AxisSpecifier ::= AxisName '::' | '@'?
+ // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'
+ // NameTest ::= '*' | NCName ':' '*' | QName
+ // AbbreviatedStep ::= '.' | '..'
+ xpath_ast_node* parse_step(xpath_ast_node* set)
+ {
+ if (set && set->rettype() != xpath_type_node_set)
+ throw_error("Step has to be applied to node set");
+
+ bool axis_specified = false;
+ axis_t axis = axis_child; // implied child axis
+
+ if (_lexer.current() == lex_axis_attribute)
+ {
+ axis = axis_attribute;
+ axis_specified = true;
+
+ _lexer.next();
+ }
+ else if (_lexer.current() == lex_dot)
+ {
+ _lexer.next();
+
+ return new (alloc_node()) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0);
+ }
+ else if (_lexer.current() == lex_double_dot)
+ {
+ _lexer.next();
+
+ return new (alloc_node()) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0);
+ }
+
+ nodetest_t nt_type = nodetest_none;
+ xpath_lexer_string nt_name;
+
+ if (_lexer.current() == lex_string)
+ {
+ // node name test
+ nt_name = _lexer.contents();
+ _lexer.next();
+
+ // was it an axis name?
+ if (_lexer.current() == lex_double_colon)
+ {
+ // parse axis name
+ if (axis_specified) throw_error("Two axis specifiers in one step");
+
+ axis = parse_axis_name(nt_name, axis_specified);
+
+ if (!axis_specified) throw_error("Unknown axis");
+
+ // read actual node test
+ _lexer.next();
+
+ if (_lexer.current() == lex_multiply)
+ {
+ nt_type = nodetest_all;
+ nt_name = xpath_lexer_string();
+ _lexer.next();
+ }
+ else if (_lexer.current() == lex_string)
+ {
+ nt_name = _lexer.contents();
+ _lexer.next();
+ }
+ else throw_error("Unrecognized node test");
+ }
+
+ if (nt_type == nodetest_none)
+ {
+ // node type test or processing-instruction
+ if (_lexer.current() == lex_open_brace)
+ {
+ _lexer.next();
+
+ if (_lexer.current() == lex_close_brace)
+ {
+ _lexer.next();
+
+ nt_type = parse_node_test_type(nt_name);
+
+ if (nt_type == nodetest_none) throw_error("Unrecognized node type");
+
+ nt_name = xpath_lexer_string();
+ }
+ else if (nt_name == PUGIXML_TEXT("processing-instruction"))
+ {
+ if (_lexer.current() != lex_quoted_string)
+ throw_error("Only literals are allowed as arguments to processing-instruction()");
+
+ nt_type = nodetest_pi;
+ nt_name = _lexer.contents();
+ _lexer.next();
+
+ if (_lexer.current() != lex_close_brace)
+ throw_error("Unmatched brace near processing-instruction()");
+ _lexer.next();
+ }
+ else
+ throw_error("Unmatched brace near node type test");
+
+ }
+ // QName or NCName:*
+ else
+ {
+ if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:*
+ {
+ nt_name.end--; // erase *
+
+ nt_type = nodetest_all_in_namespace;
+ }
+ else nt_type = nodetest_name;
+ }
+ }
+ }
+ else if (_lexer.current() == lex_multiply)
+ {
+ nt_type = nodetest_all;
+ _lexer.next();
+ }
+ else throw_error("Unrecognized node test");
+
+ xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step, set, axis, nt_type, alloc_string(nt_name));
+
+ xpath_ast_node* last = 0;
+
+ while (_lexer.current() == lex_open_square_brace)
+ {
+ _lexer.next();
+
+ xpath_ast_node* expr = parse_expression();
+
+ xpath_ast_node* pred = new (alloc_node()) xpath_ast_node(ast_predicate, 0, expr, predicate_default);
+
+ if (_lexer.current() != lex_close_square_brace)
+ throw_error("Unmatched square brace");
+ _lexer.next();
+
+ if (last) last->set_next(pred);
+ else n->set_right(pred);
+
+ last = pred;
+ }
+
+ return n;
+ }
+
+ // RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step
+ xpath_ast_node* parse_relative_location_path(xpath_ast_node* set)
+ {
+ xpath_ast_node* n = parse_step(set);
+
+ while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)
+ {
+ lexeme_t l = _lexer.current();
+ _lexer.next();
+
+ if (l == lex_double_slash)
+ n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
+
+ n = parse_step(n);
+ }
+
+ return n;
+ }
+
+ // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath
+ // AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath
+ xpath_ast_node* parse_location_path()
+ {
+ if (_lexer.current() == lex_slash)
+ {
+ _lexer.next();
+
+ xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);
+
+ // relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path
+ lexeme_t l = _lexer.current();
+
+ if (l == lex_string || l == lex_axis_attribute || l == lex_dot || l == lex_double_dot || l == lex_multiply)
+ return parse_relative_location_path(n);
+ else
+ return n;
+ }
+ else if (_lexer.current() == lex_double_slash)
+ {
+ _lexer.next();
+
+ xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);
+ n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
+
+ return parse_relative_location_path(n);
+ }
+
+ // else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1
+ return parse_relative_location_path(0);
+ }
+
+ // PathExpr ::= LocationPath
+ // | FilterExpr
+ // | FilterExpr '/' RelativeLocationPath
+ // | FilterExpr '//' RelativeLocationPath
+ // UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
+ // UnaryExpr ::= UnionExpr | '-' UnaryExpr
+ xpath_ast_node* parse_path_or_unary_expression()
+ {
+ // Clarification.
+ // PathExpr begins with either LocationPath or FilterExpr.
+ // FilterExpr begins with PrimaryExpr
+ // PrimaryExpr begins with '$' in case of it being a variable reference,
+ // '(' in case of it being an expression, string literal, number constant or
+ // function call.
+
+ if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace ||
+ _lexer.current() == lex_quoted_string || _lexer.current() == lex_number ||
+ _lexer.current() == lex_string)
+ {
+ if (_lexer.current() == lex_string)
+ {
+ // This is either a function call, or not - if not, we shall proceed with location path
+ const char_t* state = _lexer.state();
+
+ while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state;
+
+ if (*state != '(') return parse_location_path();
+
+ // This looks like a function call; however this still can be a node-test. Check it.
+ if (parse_node_test_type(_lexer.contents()) != nodetest_none) return parse_location_path();
+ }
+
+ xpath_ast_node* n = parse_filter_expression();
+
+ if (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)
+ {
+ lexeme_t l = _lexer.current();
+ _lexer.next();
+
+ if (l == lex_double_slash)
+ {
+ if (n->rettype() != xpath_type_node_set) throw_error("Step has to be applied to node set");
+
+ n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
+ }
+
+ // select from location path
+ return parse_relative_location_path(n);
+ }
+
+ return n;
+ }
+ else if (_lexer.current() == lex_minus)
+ {
+ _lexer.next();
+
+ // precedence 7+ - only parses union expressions
+ xpath_ast_node* expr = parse_expression_rec(parse_path_or_unary_expression(), 7);
+
+ return new (alloc_node()) xpath_ast_node(ast_op_negate, xpath_type_number, expr);
+ }
+ else
+ return parse_location_path();
+ }
+
+ struct binary_op_t
+ {
+ ast_type_t asttype;
+ xpath_value_type rettype;
+ int precedence;
+
+ binary_op_t(): asttype(ast_unknown), rettype(xpath_type_none), precedence(0)
+ {
+ }
+
+ binary_op_t(ast_type_t asttype_, xpath_value_type rettype_, int precedence_): asttype(asttype_), rettype(rettype_), precedence(precedence_)
+ {
+ }
+
+ static binary_op_t parse(xpath_lexer& lexer)
+ {
+ switch (lexer.current())
+ {
+ case lex_string:
+ if (lexer.contents() == PUGIXML_TEXT("or"))
+ return binary_op_t(ast_op_or, xpath_type_boolean, 1);
+ else if (lexer.contents() == PUGIXML_TEXT("and"))
+ return binary_op_t(ast_op_and, xpath_type_boolean, 2);
+ else if (lexer.contents() == PUGIXML_TEXT("div"))
+ return binary_op_t(ast_op_divide, xpath_type_number, 6);
+ else if (lexer.contents() == PUGIXML_TEXT("mod"))
+ return binary_op_t(ast_op_mod, xpath_type_number, 6);
+ else
+ return binary_op_t();
+
+ case lex_equal:
+ return binary_op_t(ast_op_equal, xpath_type_boolean, 3);
+
+ case lex_not_equal:
+ return binary_op_t(ast_op_not_equal, xpath_type_boolean, 3);
+
+ case lex_less:
+ return binary_op_t(ast_op_less, xpath_type_boolean, 4);
+
+ case lex_greater:
+ return binary_op_t(ast_op_greater, xpath_type_boolean, 4);
+
+ case lex_less_or_equal:
+ return binary_op_t(ast_op_less_or_equal, xpath_type_boolean, 4);
+
+ case lex_greater_or_equal:
+ return binary_op_t(ast_op_greater_or_equal, xpath_type_boolean, 4);
+
+ case lex_plus:
+ return binary_op_t(ast_op_add, xpath_type_number, 5);
+
+ case lex_minus:
+ return binary_op_t(ast_op_subtract, xpath_type_number, 5);
+
+ case lex_multiply:
+ return binary_op_t(ast_op_multiply, xpath_type_number, 6);
+
+ case lex_union:
+ return binary_op_t(ast_op_union, xpath_type_node_set, 7);
+
+ default:
+ return binary_op_t();
+ }
+ }
+ };
+
+ xpath_ast_node* parse_expression_rec(xpath_ast_node* lhs, int limit)
+ {
+ binary_op_t op = binary_op_t::parse(_lexer);
+
+ while (op.asttype != ast_unknown && op.precedence >= limit)
+ {
+ _lexer.next();
+
+ xpath_ast_node* rhs = parse_path_or_unary_expression();
+
+ binary_op_t nextop = binary_op_t::parse(_lexer);
+
+ while (nextop.asttype != ast_unknown && nextop.precedence > op.precedence)
+ {
+ rhs = parse_expression_rec(rhs, nextop.precedence);
+
+ nextop = binary_op_t::parse(_lexer);
+ }
+
+ if (op.asttype == ast_op_union && (lhs->rettype() != xpath_type_node_set || rhs->rettype() != xpath_type_node_set))
+ throw_error("Union operator has to be applied to node sets");
+
+ lhs = new (alloc_node()) xpath_ast_node(op.asttype, op.rettype, lhs, rhs);
+
+ op = binary_op_t::parse(_lexer);
+ }
+
+ return lhs;
+ }
+
+ // Expr ::= OrExpr
+ // OrExpr ::= AndExpr | OrExpr 'or' AndExpr
+ // AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr
+ // EqualityExpr ::= RelationalExpr
+ // | EqualityExpr '=' RelationalExpr
+ // | EqualityExpr '!=' RelationalExpr
+ // RelationalExpr ::= AdditiveExpr
+ // | RelationalExpr '<' AdditiveExpr
+ // | RelationalExpr '>' AdditiveExpr
+ // | RelationalExpr '<=' AdditiveExpr
+ // | RelationalExpr '>=' AdditiveExpr
+ // AdditiveExpr ::= MultiplicativeExpr
+ // | AdditiveExpr '+' MultiplicativeExpr
+ // | AdditiveExpr '-' MultiplicativeExpr
+ // MultiplicativeExpr ::= UnaryExpr
+ // | MultiplicativeExpr '*' UnaryExpr
+ // | MultiplicativeExpr 'div' UnaryExpr
+ // | MultiplicativeExpr 'mod' UnaryExpr
+ xpath_ast_node* parse_expression()
+ {
+ return parse_expression_rec(parse_path_or_unary_expression(), 0);
+ }
+
+ xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result)
+ {
+ }
+
+ xpath_ast_node* parse()
+ {
+ xpath_ast_node* result = parse_expression();
+
+ if (_lexer.current() != lex_eof)
+ {
+ // there are still unparsed tokens left, error
+ throw_error("Incorrect query");
+ }
+
+ return result;
+ }
+
+ static xpath_ast_node* parse(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result)
+ {
+ xpath_parser parser(query, variables, alloc, result);
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ int error = setjmp(parser._error_handler);
+
+ return (error == 0) ? parser.parse() : 0;
+ #else
+ return parser.parse();
+ #endif
+ }
+ };
+
+ struct xpath_query_impl
+ {
+ static xpath_query_impl* create()
+ {
+ void* memory = xml_memory::allocate(sizeof(xpath_query_impl));
+
+ return new (memory) xpath_query_impl();
+ }
+
+ static void destroy(void* ptr)
+ {
+ if (!ptr) return;
+
+ // free all allocated pages
+ static_cast<xpath_query_impl*>(ptr)->alloc.release();
+
+ // free allocator memory (with the first page)
+ xml_memory::deallocate(ptr);
+ }
+
+ xpath_query_impl(): root(0), alloc(&block)
+ {
+ block.next = 0;
+ block.capacity = sizeof(block.data);
+ }
+
+ xpath_ast_node* root;
+ xpath_allocator alloc;
+ xpath_memory_block block;
+ };
+
+ PUGI__FN xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd)
+ {
+ if (!impl) return xpath_string();
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ if (setjmp(sd.error_handler)) return xpath_string();
+ #endif
+
+ xpath_context c(n, 1, 1);
+
+ return impl->root->eval_string(c, sd.stack);
+ }
+
+ PUGI__FN impl::xpath_ast_node* evaluate_node_set_prepare(xpath_query_impl* impl)
+ {
+ if (!impl) return 0;
+
+ if (impl->root->rettype() != xpath_type_node_set)
+ {
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ return 0;
+ #else
+ xpath_parse_result res;
+ res.error = "Expression does not evaluate to node set";
+
+ throw xpath_exception(res);
+ #endif
+ }
+
+ return impl->root;
+ }
+PUGI__NS_END
+
+namespace pugi
+{
+#ifndef PUGIXML_NO_EXCEPTIONS
+ PUGI__FN xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_)
+ {
+ assert(_result.error);
+ }
+
+ PUGI__FN const char* xpath_exception::what() const throw()
+ {
+ return _result.error;
+ }
+
+ PUGI__FN const xpath_parse_result& xpath_exception::result() const
+ {
+ return _result;
+ }
+#endif
+
+ PUGI__FN xpath_node::xpath_node()
+ {
+ }
+
+ PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_)
+ {
+ }
+
+ PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_)
+ {
+ }
+
+ PUGI__FN xml_node xpath_node::node() const
+ {
+ return _attribute ? xml_node() : _node;
+ }
+
+ PUGI__FN xml_attribute xpath_node::attribute() const
+ {
+ return _attribute;
+ }
+
+ PUGI__FN xml_node xpath_node::parent() const
+ {
+ return _attribute ? _node : _node.parent();
+ }
+
+ PUGI__FN static void unspecified_bool_xpath_node(xpath_node***)
+ {
+ }
+
+ PUGI__FN xpath_node::operator xpath_node::unspecified_bool_type() const
+ {
+ return (_node || _attribute) ? unspecified_bool_xpath_node : 0;
+ }
+
+ PUGI__FN bool xpath_node::operator!() const
+ {
+ return !(_node || _attribute);
+ }
+
+ PUGI__FN bool xpath_node::operator==(const xpath_node& n) const
+ {
+ return _node == n._node && _attribute == n._attribute;
+ }
+
+ PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const
+ {
+ return _node != n._node || _attribute != n._attribute;
+ }
+
+#ifdef __BORLANDC__
+ PUGI__FN bool operator&&(const xpath_node& lhs, bool rhs)
+ {
+ return (bool)lhs && rhs;
+ }
+
+ PUGI__FN bool operator||(const xpath_node& lhs, bool rhs)
+ {
+ return (bool)lhs || rhs;
+ }
+#endif
+
+ PUGI__FN void xpath_node_set::_assign(const_iterator begin_, const_iterator end_)
+ {
+ assert(begin_ <= end_);
+
+ size_t size_ = static_cast<size_t>(end_ - begin_);
+
+ if (size_ <= 1)
+ {
+ // deallocate old buffer
+ if (_begin != &_storage) impl::xml_memory::deallocate(_begin);
+
+ // use internal buffer
+ if (begin_ != end_) _storage = *begin_;
+
+ _begin = &_storage;
+ _end = &_storage + size_;
+ }
+ else
+ {
+ // make heap copy
+ xpath_node* storage = static_cast<xpath_node*>(impl::xml_memory::allocate(size_ * sizeof(xpath_node)));
+
+ if (!storage)
+ {
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ return;
+ #else
+ throw std::bad_alloc();
+ #endif
+ }
+
+ memcpy(storage, begin_, size_ * sizeof(xpath_node));
+
+ // deallocate old buffer
+ if (_begin != &_storage) impl::xml_memory::deallocate(_begin);
+
+ // finalize
+ _begin = storage;
+ _end = storage + size_;
+ }
+ }
+
+ PUGI__FN xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(&_storage), _end(&_storage)
+ {
+ }
+
+ PUGI__FN xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_), _begin(&_storage), _end(&_storage)
+ {
+ _assign(begin_, end_);
+ }
+
+ PUGI__FN xpath_node_set::~xpath_node_set()
+ {
+ if (_begin != &_storage) impl::xml_memory::deallocate(_begin);
+ }
+
+ PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(ns._type), _begin(&_storage), _end(&_storage)
+ {
+ _assign(ns._begin, ns._end);
+ }
+
+ PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)
+ {
+ if (this == &ns) return *this;
+
+ _type = ns._type;
+ _assign(ns._begin, ns._end);
+
+ return *this;
+ }
+
+ PUGI__FN xpath_node_set::type_t xpath_node_set::type() const
+ {
+ return _type;
+ }
+
+ PUGI__FN size_t xpath_node_set::size() const
+ {
+ return _end - _begin;
+ }
+
+ PUGI__FN bool xpath_node_set::empty() const
+ {
+ return _begin == _end;
+ }
+
+ PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const
+ {
+ assert(index < size());
+ return _begin[index];
+ }
+
+ PUGI__FN xpath_node_set::const_iterator xpath_node_set::begin() const
+ {
+ return _begin;
+ }
+
+ PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const
+ {
+ return _end;
+ }
+
+ PUGI__FN void xpath_node_set::sort(bool reverse)
+ {
+ _type = impl::xpath_sort(_begin, _end, _type, reverse);
+ }
+
+ PUGI__FN xpath_node xpath_node_set::first() const
+ {
+ return impl::xpath_first(_begin, _end, _type);
+ }
+
+ PUGI__FN xpath_parse_result::xpath_parse_result(): error("Internal error"), offset(0)
+ {
+ }
+
+ PUGI__FN xpath_parse_result::operator bool() const
+ {
+ return error == 0;
+ }
+
+ PUGI__FN const char* xpath_parse_result::description() const
+ {
+ return error ? error : "No error";
+ }
+
+ PUGI__FN xpath_variable::xpath_variable(): _type(xpath_type_none), _next(0)
+ {
+ }
+
+ PUGI__FN const char_t* xpath_variable::name() const
+ {
+ switch (_type)
+ {
+ case xpath_type_node_set:
+ return static_cast<const impl::xpath_variable_node_set*>(this)->name;
+
+ case xpath_type_number:
+ return static_cast<const impl::xpath_variable_number*>(this)->name;
+
+ case xpath_type_string:
+ return static_cast<const impl::xpath_variable_string*>(this)->name;
+
+ case xpath_type_boolean:
+ return static_cast<const impl::xpath_variable_boolean*>(this)->name;
+
+ default:
+ assert(!"Invalid variable type");
+ return 0;
+ }
+ }
+
+ PUGI__FN xpath_value_type xpath_variable::type() const
+ {
+ return _type;
+ }
+
+ PUGI__FN bool xpath_variable::get_boolean() const
+ {
+ return (_type == xpath_type_boolean) ? static_cast<const impl::xpath_variable_boolean*>(this)->value : false;
+ }
+
+ PUGI__FN double xpath_variable::get_number() const
+ {
+ return (_type == xpath_type_number) ? static_cast<const impl::xpath_variable_number*>(this)->value : impl::gen_nan();
+ }
+
+ PUGI__FN const char_t* xpath_variable::get_string() const
+ {
+ const char_t* value = (_type == xpath_type_string) ? static_cast<const impl::xpath_variable_string*>(this)->value : 0;
+ return value ? value : PUGIXML_TEXT("");
+ }
+
+ PUGI__FN const xpath_node_set& xpath_variable::get_node_set() const
+ {
+ return (_type == xpath_type_node_set) ? static_cast<const impl::xpath_variable_node_set*>(this)->value : impl::dummy_node_set;
+ }
+
+ PUGI__FN bool xpath_variable::set(bool value)
+ {
+ if (_type != xpath_type_boolean) return false;
+
+ static_cast<impl::xpath_variable_boolean*>(this)->value = value;
+ return true;
+ }
+
+ PUGI__FN bool xpath_variable::set(double value)
+ {
+ if (_type != xpath_type_number) return false;
+
+ static_cast<impl::xpath_variable_number*>(this)->value = value;
+ return true;
+ }
+
+ PUGI__FN bool xpath_variable::set(const char_t* value)
+ {
+ if (_type != xpath_type_string) return false;
+
+ impl::xpath_variable_string* var = static_cast<impl::xpath_variable_string*>(this);
+
+ // duplicate string
+ size_t size = (impl::strlength(value) + 1) * sizeof(char_t);
+
+ char_t* copy = static_cast<char_t*>(impl::xml_memory::allocate(size));
+ if (!copy) return false;
+
+ memcpy(copy, value, size);
+
+ // replace old string
+ if (var->value) impl::xml_memory::deallocate(var->value);
+ var->value = copy;
+
+ return true;
+ }
+
+ PUGI__FN bool xpath_variable::set(const xpath_node_set& value)
+ {
+ if (_type != xpath_type_node_set) return false;
+
+ static_cast<impl::xpath_variable_node_set*>(this)->value = value;
+ return true;
+ }
+
+ PUGI__FN xpath_variable_set::xpath_variable_set()
+ {
+ for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) _data[i] = 0;
+ }
+
+ PUGI__FN xpath_variable_set::~xpath_variable_set()
+ {
+ for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)
+ {
+ xpath_variable* var = _data[i];
+
+ while (var)
+ {
+ xpath_variable* next = var->_next;
+
+ impl::delete_xpath_variable(var->_type, var);
+
+ var = next;
+ }
+ }
+ }
+
+ PUGI__FN xpath_variable* xpath_variable_set::find(const char_t* name) const
+ {
+ const size_t hash_size = sizeof(_data) / sizeof(_data[0]);
+ size_t hash = impl::hash_string(name) % hash_size;
+
+ // look for existing variable
+ for (xpath_variable* var = _data[hash]; var; var = var->_next)
+ if (impl::strequal(var->name(), name))
+ return var;
+
+ return 0;
+ }
+
+ PUGI__FN xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type)
+ {
+ const size_t hash_size = sizeof(_data) / sizeof(_data[0]);
+ size_t hash = impl::hash_string(name) % hash_size;
+
+ // look for existing variable
+ for (xpath_variable* var = _data[hash]; var; var = var->_next)
+ if (impl::strequal(var->name(), name))
+ return var->type() == type ? var : 0;
+
+ // add new variable
+ xpath_variable* result = impl::new_xpath_variable(type, name);
+
+ if (result)
+ {
+ result->_type = type;
+ result->_next = _data[hash];
+
+ _data[hash] = result;
+ }
+
+ return result;
+ }
+
+ PUGI__FN bool xpath_variable_set::set(const char_t* name, bool value)
+ {
+ xpath_variable* var = add(name, xpath_type_boolean);
+ return var ? var->set(value) : false;
+ }
+
+ PUGI__FN bool xpath_variable_set::set(const char_t* name, double value)
+ {
+ xpath_variable* var = add(name, xpath_type_number);
+ return var ? var->set(value) : false;
+ }
+
+ PUGI__FN bool xpath_variable_set::set(const char_t* name, const char_t* value)
+ {
+ xpath_variable* var = add(name, xpath_type_string);
+ return var ? var->set(value) : false;
+ }
+
+ PUGI__FN bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value)
+ {
+ xpath_variable* var = add(name, xpath_type_node_set);
+ return var ? var->set(value) : false;
+ }
+
+ PUGI__FN xpath_variable* xpath_variable_set::get(const char_t* name)
+ {
+ return find(name);
+ }
+
+ PUGI__FN const xpath_variable* xpath_variable_set::get(const char_t* name) const
+ {
+ return find(name);
+ }
+
+ PUGI__FN xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0)
+ {
+ impl::xpath_query_impl* qimpl = impl::xpath_query_impl::create();
+
+ if (!qimpl)
+ {
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ _result.error = "Out of memory";
+ #else
+ throw std::bad_alloc();
+ #endif
+ }
+ else
+ {
+ impl::buffer_holder impl_holder(qimpl, impl::xpath_query_impl::destroy);
+
+ qimpl->root = impl::xpath_parser::parse(query, variables, &qimpl->alloc, &_result);
+
+ if (qimpl->root)
+ {
+ qimpl->root->optimize(&qimpl->alloc);
+
+ _impl = static_cast<impl::xpath_query_impl*>(impl_holder.release());
+ _result.error = 0;
+ }
+ }
+ }
+
+ PUGI__FN xpath_query::~xpath_query()
+ {
+ impl::xpath_query_impl::destroy(_impl);
+ }
+
+ PUGI__FN xpath_value_type xpath_query::return_type() const
+ {
+ if (!_impl) return xpath_type_none;
+
+ return static_cast<impl::xpath_query_impl*>(_impl)->root->rettype();
+ }
+
+ PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const
+ {
+ if (!_impl) return false;
+
+ impl::xpath_context c(n, 1, 1);
+ impl::xpath_stack_data sd;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ if (setjmp(sd.error_handler)) return false;
+ #endif
+
+ return static_cast<impl::xpath_query_impl*>(_impl)->root->eval_boolean(c, sd.stack);
+ }
+
+ PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const
+ {
+ if (!_impl) return impl::gen_nan();
+
+ impl::xpath_context c(n, 1, 1);
+ impl::xpath_stack_data sd;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ if (setjmp(sd.error_handler)) return impl::gen_nan();
+ #endif
+
+ return static_cast<impl::xpath_query_impl*>(_impl)->root->eval_number(c, sd.stack);
+ }
+
+#ifndef PUGIXML_NO_STL
+ PUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const
+ {
+ impl::xpath_stack_data sd;
+
+ impl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);
+
+ return string_t(r.c_str(), r.length());
+ }
+#endif
+
+ PUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const
+ {
+ impl::xpath_stack_data sd;
+
+ impl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);
+
+ size_t full_size = r.length() + 1;
+
+ if (capacity > 0)
+ {
+ size_t size = (full_size < capacity) ? full_size : capacity;
+ assert(size > 0);
+
+ memcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t));
+ buffer[size - 1] = 0;
+ }
+
+ return full_size;
+ }
+
+ PUGI__FN xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const
+ {
+ impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast<impl::xpath_query_impl*>(_impl));
+ if (!root) return xpath_node_set();
+
+ impl::xpath_context c(n, 1, 1);
+ impl::xpath_stack_data sd;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ if (setjmp(sd.error_handler)) return xpath_node_set();
+ #endif
+
+ impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_all);
+
+ return xpath_node_set(r.begin(), r.end(), r.type());
+ }
+
+ PUGI__FN xpath_node xpath_query::evaluate_node(const xpath_node& n) const
+ {
+ impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast<impl::xpath_query_impl*>(_impl));
+ if (!root) return xpath_node();
+
+ impl::xpath_context c(n, 1, 1);
+ impl::xpath_stack_data sd;
+
+ #ifdef PUGIXML_NO_EXCEPTIONS
+ if (setjmp(sd.error_handler)) return xpath_node();
+ #endif
+
+ impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_first);
+
+ return r.first();
+ }
+
+ PUGI__FN const xpath_parse_result& xpath_query::result() const
+ {
+ return _result;
+ }
+
+ PUGI__FN static void unspecified_bool_xpath_query(xpath_query***)
+ {
+ }
+
+ PUGI__FN xpath_query::operator xpath_query::unspecified_bool_type() const
+ {
+ return _impl ? unspecified_bool_xpath_query : 0;
+ }
+
+ PUGI__FN bool xpath_query::operator!() const
+ {
+ return !_impl;
+ }
+
+ PUGI__FN xpath_node xml_node::select_node(const char_t* query, xpath_variable_set* variables) const
+ {
+ xpath_query q(query, variables);
+ return select_node(q);
+ }
+
+ PUGI__FN xpath_node xml_node::select_node(const xpath_query& query) const
+ {
+ return query.evaluate_node(*this);
+ }
+
+ PUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const
+ {
+ xpath_query q(query, variables);
+ return select_nodes(q);
+ }
+
+ PUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const
+ {
+ return query.evaluate_node_set(*this);
+ }
+
+ PUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const
+ {
+ xpath_query q(query, variables);
+ return select_single_node(q);
+ }
+
+ PUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const
+ {
+ return query.evaluate_node(*this);
+ }
+}
+
+#endif
+
+#ifdef __BORLANDC__
+# pragma option pop
+#endif
+
+// Intel C++ does not properly keep warning state for function templates,
+// so popping warning state at the end of translation unit leads to warnings in the middle.
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+# pragma warning(pop)
+#endif
+
+// Undefine all local macros (makes sure we're not leaking macros in header-only mode)
+#undef PUGI__NO_INLINE
+#undef PUGI__UNLIKELY
+#undef PUGI__STATIC_ASSERT
+#undef PUGI__DMC_VOLATILE
+#undef PUGI__MSVC_CRT_VERSION
+#undef PUGI__NS_BEGIN
+#undef PUGI__NS_END
+#undef PUGI__FN
+#undef PUGI__FN_NO_INLINE
+#undef PUGI__NODETYPE
+#undef PUGI__IS_CHARTYPE_IMPL
+#undef PUGI__IS_CHARTYPE
+#undef PUGI__IS_CHARTYPEX
+#undef PUGI__ENDSWITH
+#undef PUGI__SKIPWS
+#undef PUGI__OPTSET
+#undef PUGI__PUSHNODE
+#undef PUGI__POPNODE
+#undef PUGI__SCANFOR
+#undef PUGI__SCANWHILE
+#undef PUGI__SCANWHILE_UNROLL
+#undef PUGI__ENDSEG
+#undef PUGI__THROW_ERROR
+#undef PUGI__CHECK_ERROR
+
+#endif
+
+/**
+ * Copyright (c) 2006-2014 Arseny Kapoulkine
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
diff --git a/src/pugixml/pugixml.hpp b/src/pugixml/pugixml.hpp
new file mode 100644
index 0000000..9798b46
--- /dev/null
+++ b/src/pugixml/pugixml.hpp
@@ -0,0 +1,1366 @@
+/**
+ * pugixml parser - version 1.5
+ * --------------------------------------------------------
+ * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine at gmail.com)
+ * Report bugs and download new versions at http://pugixml.org/
+ *
+ * This library is distributed under the MIT License. See notice at the end
+ * of this file.
+ *
+ * This work is based on the pugxml parser, which is:
+ * Copyright (C) 2003, by Kristen Wegner (kristen at tima.net)
+ */
+
+#ifndef PUGIXML_VERSION
+// Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons
+# define PUGIXML_VERSION 150
+#endif
+
+// Include user configuration file (this can define various configuration macros)
+#include "pugiconfig.hpp"
+
+#ifndef HEADER_PUGIXML_HPP
+#define HEADER_PUGIXML_HPP
+
+// Include stddef.h for size_t and ptrdiff_t
+#include <stddef.h>
+
+// Include exception header for XPath
+#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
+# include <exception>
+#endif
+
+// Include STL headers
+#ifndef PUGIXML_NO_STL
+# include <iterator>
+# include <iosfwd>
+# include <string>
+#endif
+
+// Macro for deprecated features
+#ifndef PUGIXML_DEPRECATED
+# if defined(__GNUC__)
+# define PUGIXML_DEPRECATED __attribute__((deprecated))
+# elif defined(_MSC_VER) && _MSC_VER >= 1300
+# define PUGIXML_DEPRECATED __declspec(deprecated)
+# else
+# define PUGIXML_DEPRECATED
+# endif
+#endif
+
+// If no API is defined, assume default
+#ifndef PUGIXML_API
+# define PUGIXML_API
+#endif
+
+// If no API for classes is defined, assume default
+#ifndef PUGIXML_CLASS
+# define PUGIXML_CLASS PUGIXML_API
+#endif
+
+// If no API for functions is defined, assume default
+#ifndef PUGIXML_FUNCTION
+# define PUGIXML_FUNCTION PUGIXML_API
+#endif
+
+// If the platform is known to have long long support, enable long long functions
+#ifndef PUGIXML_HAS_LONG_LONG
+# if defined(__cplusplus) && __cplusplus >= 201103
+# define PUGIXML_HAS_LONG_LONG
+# elif defined(_MSC_VER) && _MSC_VER >= 1400
+# define PUGIXML_HAS_LONG_LONG
+# endif
+#endif
+
+// Character interface macros
+#ifdef PUGIXML_WCHAR_MODE
+# define PUGIXML_TEXT(t) L ## t
+# define PUGIXML_CHAR wchar_t
+#else
+# define PUGIXML_TEXT(t) t
+# define PUGIXML_CHAR char
+#endif
+
+namespace pugi
+{
+ // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE
+ typedef PUGIXML_CHAR char_t;
+
+#ifndef PUGIXML_NO_STL
+ // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE
+ typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;
+#endif
+}
+
+// The PugiXML namespace
+namespace pugi
+{
+ // Tree node types
+ enum xml_node_type
+ {
+ node_null, // Empty (null) node handle
+ node_document, // A document tree's absolute root
+ node_element, // Element tag, i.e. '<node/>'
+ node_pcdata, // Plain character data, i.e. 'text'
+ node_cdata, // Character data, i.e. '<![CDATA[text]]>'
+ node_comment, // Comment tag, i.e. '<!-- text -->'
+ node_pi, // Processing instruction, i.e. '<?name?>'
+ node_declaration, // Document declaration, i.e. '<?xml version="1.0"?>'
+ node_doctype // Document type declaration, i.e. '<!DOCTYPE doc>'
+ };
+
+ // Parsing options
+
+ // Minimal parsing mode (equivalent to turning all other flags off).
+ // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.
+ const unsigned int parse_minimal = 0x0000;
+
+ // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.
+ const unsigned int parse_pi = 0x0001;
+
+ // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.
+ const unsigned int parse_comments = 0x0002;
+
+ // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.
+ const unsigned int parse_cdata = 0x0004;
+
+ // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.
+ // This flag is off by default; turning it on usually results in slower parsing and more memory consumption.
+ const unsigned int parse_ws_pcdata = 0x0008;
+
+ // This flag determines if character and entity references are expanded during parsing. This flag is on by default.
+ const unsigned int parse_escapes = 0x0010;
+
+ // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.
+ const unsigned int parse_eol = 0x0020;
+
+ // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.
+ const unsigned int parse_wconv_attribute = 0x0040;
+
+ // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.
+ const unsigned int parse_wnorm_attribute = 0x0080;
+
+ // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.
+ const unsigned int parse_declaration = 0x0100;
+
+ // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.
+ const unsigned int parse_doctype = 0x0200;
+
+ // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only
+ // of whitespace is added to the DOM tree.
+ // This flag is off by default; turning it on may result in slower parsing and more memory consumption.
+ const unsigned int parse_ws_pcdata_single = 0x0400;
+
+ // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.
+ const unsigned int parse_trim_pcdata = 0x0800;
+
+ // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document
+ // is a valid document. This flag is off by default.
+ const unsigned int parse_fragment = 0x1000;
+
+ // The default parsing mode.
+ // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,
+ // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
+ const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
+
+ // The full parsing mode.
+ // Nodes of all types are added to the DOM tree, character/reference entities are expanded,
+ // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
+ const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
+
+ // These flags determine the encoding of input data for XML document
+ enum xml_encoding
+ {
+ encoding_auto, // Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found
+ encoding_utf8, // UTF8 encoding
+ encoding_utf16_le, // Little-endian UTF16
+ encoding_utf16_be, // Big-endian UTF16
+ encoding_utf16, // UTF16 with native endianness
+ encoding_utf32_le, // Little-endian UTF32
+ encoding_utf32_be, // Big-endian UTF32
+ encoding_utf32, // UTF32 with native endianness
+ encoding_wchar, // The same encoding wchar_t has (either UTF16 or UTF32)
+ encoding_latin1
+ };
+
+ // Formatting flags
+
+ // Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default.
+ const unsigned int format_indent = 0x01;
+
+ // Write encoding-specific BOM to the output stream. This flag is off by default.
+ const unsigned int format_write_bom = 0x02;
+
+ // Use raw output mode (no indentation and no line breaks are written). This flag is off by default.
+ const unsigned int format_raw = 0x04;
+
+ // Omit default XML declaration even if there is no declaration in the document. This flag is off by default.
+ const unsigned int format_no_declaration = 0x08;
+
+ // Don't escape attribute values and PCDATA contents. This flag is off by default.
+ const unsigned int format_no_escapes = 0x10;
+
+ // Open file using text mode in xml_document::save_file. This enables special character (i.e. new-line) conversions on some systems. This flag is off by default.
+ const unsigned int format_save_file_text = 0x20;
+
+ // The default set of formatting flags.
+ // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
+ const unsigned int format_default = format_indent;
+
+ // Forward declarations
+ struct xml_attribute_struct;
+ struct xml_node_struct;
+
+ class xml_node_iterator;
+ class xml_attribute_iterator;
+ class xml_named_node_iterator;
+
+ class xml_tree_walker;
+
+ struct xml_parse_result;
+
+ class xml_node;
+
+ class xml_text;
+
+ #ifndef PUGIXML_NO_XPATH
+ class xpath_node;
+ class xpath_node_set;
+ class xpath_query;
+ class xpath_variable_set;
+ #endif
+
+ // Range-based for loop support
+ template <typename It> class xml_object_range
+ {
+ public:
+ typedef It const_iterator;
+ typedef It iterator;
+
+ xml_object_range(It b, It e): _begin(b), _end(e)
+ {
+ }
+
+ It begin() const { return _begin; }
+ It end() const { return _end; }
+
+ private:
+ It _begin, _end;
+ };
+
+ // Writer interface for node printing (see xml_node::print)
+ class PUGIXML_CLASS xml_writer
+ {
+ public:
+ virtual ~xml_writer() {}
+
+ // Write memory chunk into stream/file/whatever
+ virtual void write(const void* data, size_t size) = 0;
+ };
+
+ // xml_writer implementation for FILE*
+ class PUGIXML_CLASS xml_writer_file: public xml_writer
+ {
+ public:
+ // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio
+ xml_writer_file(void* file);
+
+ virtual void write(const void* data, size_t size);
+
+ private:
+ void* file;
+ };
+
+ #ifndef PUGIXML_NO_STL
+ // xml_writer implementation for streams
+ class PUGIXML_CLASS xml_writer_stream: public xml_writer
+ {
+ public:
+ // Construct writer from an output stream object
+ xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);
+ xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);
+
+ virtual void write(const void* data, size_t size);
+
+ private:
+ std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
+ std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
+ };
+ #endif
+
+ // A light-weight handle for manipulating attributes in DOM tree
+ class PUGIXML_CLASS xml_attribute
+ {
+ friend class xml_attribute_iterator;
+ friend class xml_node;
+
+ private:
+ xml_attribute_struct* _attr;
+
+ typedef void (*unspecified_bool_type)(xml_attribute***);
+
+ public:
+ // Default constructor. Constructs an empty attribute.
+ xml_attribute();
+
+ // Constructs attribute from internal pointer
+ explicit xml_attribute(xml_attribute_struct* attr);
+
+ // Safe bool conversion operator
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+
+ // Comparison operators (compares wrapped attribute pointers)
+ bool operator==(const xml_attribute& r) const;
+ bool operator!=(const xml_attribute& r) const;
+ bool operator<(const xml_attribute& r) const;
+ bool operator>(const xml_attribute& r) const;
+ bool operator<=(const xml_attribute& r) const;
+ bool operator>=(const xml_attribute& r) const;
+
+ // Check if attribute is empty
+ bool empty() const;
+
+ // Get attribute name/value, or "" if attribute is empty
+ const char_t* name() const;
+ const char_t* value() const;
+
+ // Get attribute value, or the default value if attribute is empty
+ const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
+
+ // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty
+ int as_int(int def = 0) const;
+ unsigned int as_uint(unsigned int def = 0) const;
+ double as_double(double def = 0) const;
+ float as_float(float def = 0) const;
+
+ #ifdef PUGIXML_HAS_LONG_LONG
+ long long as_llong(long long def = 0) const;
+ unsigned long long as_ullong(unsigned long long def = 0) const;
+ #endif
+
+ // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty
+ bool as_bool(bool def = false) const;
+
+ // Set attribute name/value (returns false if attribute is empty or there is not enough memory)
+ bool set_name(const char_t* rhs);
+ bool set_value(const char_t* rhs);
+
+ // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
+ bool set_value(int rhs);
+ bool set_value(unsigned int rhs);
+ bool set_value(double rhs);
+ bool set_value(float rhs);
+ bool set_value(bool rhs);
+
+ #ifdef PUGIXML_HAS_LONG_LONG
+ bool set_value(long long rhs);
+ bool set_value(unsigned long long rhs);
+ #endif
+
+ // Set attribute value (equivalent to set_value without error checking)
+ xml_attribute& operator=(const char_t* rhs);
+ xml_attribute& operator=(int rhs);
+ xml_attribute& operator=(unsigned int rhs);
+ xml_attribute& operator=(double rhs);
+ xml_attribute& operator=(float rhs);
+ xml_attribute& operator=(bool rhs);
+
+ #ifdef PUGIXML_HAS_LONG_LONG
+ xml_attribute& operator=(long long rhs);
+ xml_attribute& operator=(unsigned long long rhs);
+ #endif
+
+ // Get next/previous attribute in the attribute list of the parent node
+ xml_attribute next_attribute() const;
+ xml_attribute previous_attribute() const;
+
+ // Get hash value (unique for handles to the same object)
+ size_t hash_value() const;
+
+ // Get internal pointer
+ xml_attribute_struct* internal_object() const;
+ };
+
+#ifdef __BORLANDC__
+ // Borland C++ workaround
+ bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs);
+ bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs);
+#endif
+
+ // A light-weight handle for manipulating nodes in DOM tree
+ class PUGIXML_CLASS xml_node
+ {
+ friend class xml_attribute_iterator;
+ friend class xml_node_iterator;
+ friend class xml_named_node_iterator;
+
+ protected:
+ xml_node_struct* _root;
+
+ typedef void (*unspecified_bool_type)(xml_node***);
+
+ public:
+ // Default constructor. Constructs an empty node.
+ xml_node();
+
+ // Constructs node from internal pointer
+ explicit xml_node(xml_node_struct* p);
+
+ // Safe bool conversion operator
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+
+ // Comparison operators (compares wrapped node pointers)
+ bool operator==(const xml_node& r) const;
+ bool operator!=(const xml_node& r) const;
+ bool operator<(const xml_node& r) const;
+ bool operator>(const xml_node& r) const;
+ bool operator<=(const xml_node& r) const;
+ bool operator>=(const xml_node& r) const;
+
+ // Check if node is empty.
+ bool empty() const;
+
+ // Get node type
+ xml_node_type type() const;
+
+ // Get node name, or "" if node is empty or it has no name
+ const char_t* name() const;
+
+ // Get node value, or "" if node is empty or it has no value
+ // Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.
+ const char_t* value() const;
+
+ // Get attribute list
+ xml_attribute first_attribute() const;
+ xml_attribute last_attribute() const;
+
+ // Get children list
+ xml_node first_child() const;
+ xml_node last_child() const;
+
+ // Get next/previous sibling in the children list of the parent node
+ xml_node next_sibling() const;
+ xml_node previous_sibling() const;
+
+ // Get parent node
+ xml_node parent() const;
+
+ // Get root of DOM tree this node belongs to
+ xml_node root() const;
+
+ // Get text object for the current node
+ xml_text text() const;
+
+ // Get child, attribute or next/previous sibling with the specified name
+ xml_node child(const char_t* name) const;
+ xml_attribute attribute(const char_t* name) const;
+ xml_node next_sibling(const char_t* name) const;
+ xml_node previous_sibling(const char_t* name) const;
+
+ // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
+ const char_t* child_value() const;
+
+ // Get child value of child with specified name. Equivalent to child(name).child_value().
+ const char_t* child_value(const char_t* name) const;
+
+ // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
+ bool set_name(const char_t* rhs);
+ bool set_value(const char_t* rhs);
+
+ // Add attribute with specified name. Returns added attribute, or empty attribute on errors.
+ xml_attribute append_attribute(const char_t* name);
+ xml_attribute prepend_attribute(const char_t* name);
+ xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);
+ xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);
+
+ // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.
+ xml_attribute append_copy(const xml_attribute& proto);
+ xml_attribute prepend_copy(const xml_attribute& proto);
+ xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);
+ xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);
+
+ // Add child node with specified type. Returns added node, or empty node on errors.
+ xml_node append_child(xml_node_type type = node_element);
+ xml_node prepend_child(xml_node_type type = node_element);
+ xml_node insert_child_after(xml_node_type type, const xml_node& node);
+ xml_node insert_child_before(xml_node_type type, const xml_node& node);
+
+ // Add child element with specified name. Returns added node, or empty node on errors.
+ xml_node append_child(const char_t* name);
+ xml_node prepend_child(const char_t* name);
+ xml_node insert_child_after(const char_t* name, const xml_node& node);
+ xml_node insert_child_before(const char_t* name, const xml_node& node);
+
+ // Add a copy of the specified node as a child. Returns added node, or empty node on errors.
+ xml_node append_copy(const xml_node& proto);
+ xml_node prepend_copy(const xml_node& proto);
+ xml_node insert_copy_after(const xml_node& proto, const xml_node& node);
+ xml_node insert_copy_before(const xml_node& proto, const xml_node& node);
+
+ // Move the specified node to become a child of this node. Returns moved node, or empty node on errors.
+ xml_node append_move(const xml_node& moved);
+ xml_node prepend_move(const xml_node& moved);
+ xml_node insert_move_after(const xml_node& moved, const xml_node& node);
+ xml_node insert_move_before(const xml_node& moved, const xml_node& node);
+
+ // Remove specified attribute
+ bool remove_attribute(const xml_attribute& a);
+ bool remove_attribute(const char_t* name);
+
+ // Remove specified child
+ bool remove_child(const xml_node& n);
+ bool remove_child(const char_t* name);
+
+ // Parses buffer as an XML document fragment and appends all nodes as children of the current node.
+ // Copies/converts the buffer, so it may be deleted or changed after the function returns.
+ // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.
+ xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+ // Find attribute using predicate. Returns first attribute for which predicate returned true.
+ template <typename Predicate> xml_attribute find_attribute(Predicate pred) const
+ {
+ if (!_root) return xml_attribute();
+
+ for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
+ if (pred(attrib))
+ return attrib;
+
+ return xml_attribute();
+ }
+
+ // Find child node using predicate. Returns first child for which predicate returned true.
+ template <typename Predicate> xml_node find_child(Predicate pred) const
+ {
+ if (!_root) return xml_node();
+
+ for (xml_node node = first_child(); node; node = node.next_sibling())
+ if (pred(node))
+ return node;
+
+ return xml_node();
+ }
+
+ // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true.
+ template <typename Predicate> xml_node find_node(Predicate pred) const
+ {
+ if (!_root) return xml_node();
+
+ xml_node cur = first_child();
+
+ while (cur._root && cur._root != _root)
+ {
+ if (pred(cur)) return cur;
+
+ if (cur.first_child()) cur = cur.first_child();
+ else if (cur.next_sibling()) cur = cur.next_sibling();
+ else
+ {
+ while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
+
+ if (cur._root != _root) cur = cur.next_sibling();
+ }
+ }
+
+ return xml_node();
+ }
+
+ // Find child node by attribute name/value
+ xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const;
+ xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const;
+
+ #ifndef PUGIXML_NO_STL
+ // Get the absolute node path from root as a text string.
+ string_t path(char_t delimiter = '/') const;
+ #endif
+
+ // Search for a node by path consisting of node names and . or .. elements.
+ xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const;
+
+ // Recursively traverse subtree with xml_tree_walker
+ bool traverse(xml_tree_walker& walker);
+
+ #ifndef PUGIXML_NO_XPATH
+ // Select single node by evaluating XPath query. Returns first node from the resulting node set.
+ xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const;
+ xpath_node select_node(const xpath_query& query) const;
+
+ // Select node set by evaluating XPath query
+ xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const;
+ xpath_node_set select_nodes(const xpath_query& query) const;
+
+ // (deprecated: use select_node instead) Select single node by evaluating XPath query.
+ xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const;
+ xpath_node select_single_node(const xpath_query& query) const;
+
+ #endif
+
+ // Print subtree using a writer object
+ void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
+
+ #ifndef PUGIXML_NO_STL
+ // Print subtree to stream
+ void print(std::basic_ostream<char, std::char_traits<char> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
+ void print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const;
+ #endif
+
+ // Child nodes iterators
+ typedef xml_node_iterator iterator;
+
+ iterator begin() const;
+ iterator end() const;
+
+ // Attribute iterators
+ typedef xml_attribute_iterator attribute_iterator;
+
+ attribute_iterator attributes_begin() const;
+ attribute_iterator attributes_end() const;
+
+ // Range-based for support
+ xml_object_range<xml_node_iterator> children() const;
+ xml_object_range<xml_named_node_iterator> children(const char_t* name) const;
+ xml_object_range<xml_attribute_iterator> attributes() const;
+
+ // Get node offset in parsed file/string (in char_t units) for debugging purposes
+ ptrdiff_t offset_debug() const;
+
+ // Get hash value (unique for handles to the same object)
+ size_t hash_value() const;
+
+ // Get internal pointer
+ xml_node_struct* internal_object() const;
+ };
+
+#ifdef __BORLANDC__
+ // Borland C++ workaround
+ bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs);
+ bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs);
+#endif
+
+ // A helper for working with text inside PCDATA nodes
+ class PUGIXML_CLASS xml_text
+ {
+ friend class xml_node;
+
+ xml_node_struct* _root;
+
+ typedef void (*unspecified_bool_type)(xml_text***);
+
+ explicit xml_text(xml_node_struct* root);
+
+ xml_node_struct* _data_new();
+ xml_node_struct* _data() const;
+
+ public:
+ // Default constructor. Constructs an empty object.
+ xml_text();
+
+ // Safe bool conversion operator
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+
+ // Check if text object is empty
+ bool empty() const;
+
+ // Get text, or "" if object is empty
+ const char_t* get() const;
+
+ // Get text, or the default value if object is empty
+ const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
+
+ // Get text as a number, or the default value if conversion did not succeed or object is empty
+ int as_int(int def = 0) const;
+ unsigned int as_uint(unsigned int def = 0) const;
+ double as_double(double def = 0) const;
+ float as_float(float def = 0) const;
+
+ #ifdef PUGIXML_HAS_LONG_LONG
+ long long as_llong(long long def = 0) const;
+ unsigned long long as_ullong(unsigned long long def = 0) const;
+ #endif
+
+ // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty
+ bool as_bool(bool def = false) const;
+
+ // Set text (returns false if object is empty or there is not enough memory)
+ bool set(const char_t* rhs);
+
+ // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
+ bool set(int rhs);
+ bool set(unsigned int rhs);
+ bool set(double rhs);
+ bool set(float rhs);
+ bool set(bool rhs);
+
+ #ifdef PUGIXML_HAS_LONG_LONG
+ bool set(long long rhs);
+ bool set(unsigned long long rhs);
+ #endif
+
+ // Set text (equivalent to set without error checking)
+ xml_text& operator=(const char_t* rhs);
+ xml_text& operator=(int rhs);
+ xml_text& operator=(unsigned int rhs);
+ xml_text& operator=(double rhs);
+ xml_text& operator=(float rhs);
+ xml_text& operator=(bool rhs);
+
+ #ifdef PUGIXML_HAS_LONG_LONG
+ xml_text& operator=(long long rhs);
+ xml_text& operator=(unsigned long long rhs);
+ #endif
+
+ // Get the data node (node_pcdata or node_cdata) for this object
+ xml_node data() const;
+ };
+
+#ifdef __BORLANDC__
+ // Borland C++ workaround
+ bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs);
+ bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs);
+#endif
+
+ // Child node iterator (a bidirectional iterator over a collection of xml_node)
+ class PUGIXML_CLASS xml_node_iterator
+ {
+ friend class xml_node;
+
+ private:
+ mutable xml_node _wrap;
+ xml_node _parent;
+
+ xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent);
+
+ public:
+ // Iterator traits
+ typedef ptrdiff_t difference_type;
+ typedef xml_node value_type;
+ typedef xml_node* pointer;
+ typedef xml_node& reference;
+
+ #ifndef PUGIXML_NO_STL
+ typedef std::bidirectional_iterator_tag iterator_category;
+ #endif
+
+ // Default constructor
+ xml_node_iterator();
+
+ // Construct an iterator which points to the specified node
+ xml_node_iterator(const xml_node& node);
+
+ // Iterator operators
+ bool operator==(const xml_node_iterator& rhs) const;
+ bool operator!=(const xml_node_iterator& rhs) const;
+
+ xml_node& operator*() const;
+ xml_node* operator->() const;
+
+ const xml_node_iterator& operator++();
+ xml_node_iterator operator++(int);
+
+ const xml_node_iterator& operator--();
+ xml_node_iterator operator--(int);
+ };
+
+ // Attribute iterator (a bidirectional iterator over a collection of xml_attribute)
+ class PUGIXML_CLASS xml_attribute_iterator
+ {
+ friend class xml_node;
+
+ private:
+ mutable xml_attribute _wrap;
+ xml_node _parent;
+
+ xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);
+
+ public:
+ // Iterator traits
+ typedef ptrdiff_t difference_type;
+ typedef xml_attribute value_type;
+ typedef xml_attribute* pointer;
+ typedef xml_attribute& reference;
+
+ #ifndef PUGIXML_NO_STL
+ typedef std::bidirectional_iterator_tag iterator_category;
+ #endif
+
+ // Default constructor
+ xml_attribute_iterator();
+
+ // Construct an iterator which points to the specified attribute
+ xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);
+
+ // Iterator operators
+ bool operator==(const xml_attribute_iterator& rhs) const;
+ bool operator!=(const xml_attribute_iterator& rhs) const;
+
+ xml_attribute& operator*() const;
+ xml_attribute* operator->() const;
+
+ const xml_attribute_iterator& operator++();
+ xml_attribute_iterator operator++(int);
+
+ const xml_attribute_iterator& operator--();
+ xml_attribute_iterator operator--(int);
+ };
+
+ // Named node range helper
+ class PUGIXML_CLASS xml_named_node_iterator
+ {
+ friend class xml_node;
+
+ public:
+ // Iterator traits
+ typedef ptrdiff_t difference_type;
+ typedef xml_node value_type;
+ typedef xml_node* pointer;
+ typedef xml_node& reference;
+
+ #ifndef PUGIXML_NO_STL
+ typedef std::bidirectional_iterator_tag iterator_category;
+ #endif
+
+ // Default constructor
+ xml_named_node_iterator();
+
+ // Construct an iterator which points to the specified node
+ xml_named_node_iterator(const xml_node& node, const char_t* name);
+
+ // Iterator operators
+ bool operator==(const xml_named_node_iterator& rhs) const;
+ bool operator!=(const xml_named_node_iterator& rhs) const;
+
+ xml_node& operator*() const;
+ xml_node* operator->() const;
+
+ const xml_named_node_iterator& operator++();
+ xml_named_node_iterator operator++(int);
+
+ const xml_named_node_iterator& operator--();
+ xml_named_node_iterator operator--(int);
+
+ private:
+ mutable xml_node _wrap;
+ xml_node _parent;
+ const char_t* _name;
+
+ xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name);
+ };
+
+ // Abstract tree walker class (see xml_node::traverse)
+ class PUGIXML_CLASS xml_tree_walker
+ {
+ friend class xml_node;
+
+ private:
+ int _depth;
+
+ protected:
+ // Get current traversal depth
+ int depth() const;
+
+ public:
+ xml_tree_walker();
+ virtual ~xml_tree_walker();
+
+ // Callback that is called when traversal begins
+ virtual bool begin(xml_node& node);
+
+ // Callback that is called for each node traversed
+ virtual bool for_each(xml_node& node) = 0;
+
+ // Callback that is called when traversal ends
+ virtual bool end(xml_node& node);
+ };
+
+ // Parsing status, returned as part of xml_parse_result object
+ enum xml_parse_status
+ {
+ status_ok = 0, // No error
+
+ status_file_not_found, // File was not found during load_file()
+ status_io_error, // Error reading from file/stream
+ status_out_of_memory, // Could not allocate memory
+ status_internal_error, // Internal error occurred
+
+ status_unrecognized_tag, // Parser could not determine tag type
+
+ status_bad_pi, // Parsing error occurred while parsing document declaration/processing instruction
+ status_bad_comment, // Parsing error occurred while parsing comment
+ status_bad_cdata, // Parsing error occurred while parsing CDATA section
+ status_bad_doctype, // Parsing error occurred while parsing document type declaration
+ status_bad_pcdata, // Parsing error occurred while parsing PCDATA section
+ status_bad_start_element, // Parsing error occurred while parsing start element tag
+ status_bad_attribute, // Parsing error occurred while parsing element attribute
+ status_bad_end_element, // Parsing error occurred while parsing end element tag
+ status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag)
+
+ status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer)
+
+ status_no_document_element // Parsing resulted in a document without element nodes
+ };
+
+ // Parsing result
+ struct PUGIXML_CLASS xml_parse_result
+ {
+ // Parsing status (see xml_parse_status)
+ xml_parse_status status;
+
+ // Last parsed offset (in char_t units from start of input data)
+ ptrdiff_t offset;
+
+ // Source document encoding
+ xml_encoding encoding;
+
+ // Default constructor, initializes object to failed state
+ xml_parse_result();
+
+ // Cast to bool operator
+ operator bool() const;
+
+ // Get error description
+ const char* description() const;
+ };
+
+ // Document class (DOM tree root)
+ class PUGIXML_CLASS xml_document: public xml_node
+ {
+ private:
+ char_t* _buffer;
+
+ char _memory[192];
+
+ // Non-copyable semantics
+ xml_document(const xml_document&);
+ const xml_document& operator=(const xml_document&);
+
+ void create();
+ void destroy();
+
+ public:
+ // Default constructor, makes empty document
+ xml_document();
+
+ // Destructor, invalidates all node/attribute handles to this document
+ ~xml_document();
+
+ // Removes all nodes, leaving the empty document
+ void reset();
+
+ // Removes all nodes, then copies the entire contents of the specified document
+ void reset(const xml_document& proto);
+
+ #ifndef PUGIXML_NO_STL
+ // Load document from stream.
+ xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+ xml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default);
+ #endif
+
+ // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied.
+ xml_parse_result load(const char_t* contents, unsigned int options = parse_default);
+
+ // Load document from zero-terminated string. No encoding conversions are applied.
+ xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default);
+
+ // Load document from file
+ xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+ xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+ // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns.
+ xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+ // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
+ // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed.
+ xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+ // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
+ // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore).
+ xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+ // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details).
+ void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+
+ #ifndef PUGIXML_NO_STL
+ // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details).
+ void save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+ void save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const;
+ #endif
+
+ // Save XML to file
+ bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+ bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+
+ // Get document element
+ xml_node document_element() const;
+ };
+
+#ifndef PUGIXML_NO_XPATH
+ // XPath query return type
+ enum xpath_value_type
+ {
+ xpath_type_none, // Unknown type (query failed to compile)
+ xpath_type_node_set, // Node set (xpath_node_set)
+ xpath_type_number, // Number
+ xpath_type_string, // String
+ xpath_type_boolean // Boolean
+ };
+
+ // XPath parsing result
+ struct PUGIXML_CLASS xpath_parse_result
+ {
+ // Error message (0 if no error)
+ const char* error;
+
+ // Last parsed offset (in char_t units from string start)
+ ptrdiff_t offset;
+
+ // Default constructor, initializes object to failed state
+ xpath_parse_result();
+
+ // Cast to bool operator
+ operator bool() const;
+
+ // Get error description
+ const char* description() const;
+ };
+
+ // A single XPath variable
+ class PUGIXML_CLASS xpath_variable
+ {
+ friend class xpath_variable_set;
+
+ protected:
+ xpath_value_type _type;
+ xpath_variable* _next;
+
+ xpath_variable();
+
+ // Non-copyable semantics
+ xpath_variable(const xpath_variable&);
+ xpath_variable& operator=(const xpath_variable&);
+
+ public:
+ // Get variable name
+ const char_t* name() const;
+
+ // Get variable type
+ xpath_value_type type() const;
+
+ // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error
+ bool get_boolean() const;
+ double get_number() const;
+ const char_t* get_string() const;
+ const xpath_node_set& get_node_set() const;
+
+ // Set variable value; no type conversion is performed, false is returned on type mismatch error
+ bool set(bool value);
+ bool set(double value);
+ bool set(const char_t* value);
+ bool set(const xpath_node_set& value);
+ };
+
+ // A set of XPath variables
+ class PUGIXML_CLASS xpath_variable_set
+ {
+ private:
+ xpath_variable* _data[64];
+
+ // Non-copyable semantics
+ xpath_variable_set(const xpath_variable_set&);
+ xpath_variable_set& operator=(const xpath_variable_set&);
+
+ xpath_variable* find(const char_t* name) const;
+
+ public:
+ // Default constructor/destructor
+ xpath_variable_set();
+ ~xpath_variable_set();
+
+ // Add a new variable or get the existing one, if the types match
+ xpath_variable* add(const char_t* name, xpath_value_type type);
+
+ // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch
+ bool set(const char_t* name, bool value);
+ bool set(const char_t* name, double value);
+ bool set(const char_t* name, const char_t* value);
+ bool set(const char_t* name, const xpath_node_set& value);
+
+ // Get existing variable by name
+ xpath_variable* get(const char_t* name);
+ const xpath_variable* get(const char_t* name) const;
+ };
+
+ // A compiled XPath query object
+ class PUGIXML_CLASS xpath_query
+ {
+ private:
+ void* _impl;
+ xpath_parse_result _result;
+
+ typedef void (*unspecified_bool_type)(xpath_query***);
+
+ // Non-copyable semantics
+ xpath_query(const xpath_query&);
+ xpath_query& operator=(const xpath_query&);
+
+ public:
+ // Construct a compiled object from XPath expression.
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
+ explicit xpath_query(const char_t* query, xpath_variable_set* variables = 0);
+
+ // Destructor
+ ~xpath_query();
+
+ // Get query expression return type
+ xpath_value_type return_type() const;
+
+ // Evaluate expression as boolean value in the specified context; performs type conversion if necessary.
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+ bool evaluate_boolean(const xpath_node& n) const;
+
+ // Evaluate expression as double value in the specified context; performs type conversion if necessary.
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+ double evaluate_number(const xpath_node& n) const;
+
+ #ifndef PUGIXML_NO_STL
+ // Evaluate expression as string value in the specified context; performs type conversion if necessary.
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+ string_t evaluate_string(const xpath_node& n) const;
+ #endif
+
+ // Evaluate expression as string value in the specified context; performs type conversion if necessary.
+ // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+ // If PUGIXML_NO_EXCEPTIONS is defined, returns empty set instead.
+ size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const;
+
+ // Evaluate expression as node set in the specified context.
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
+ // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead.
+ xpath_node_set evaluate_node_set(const xpath_node& n) const;
+
+ // Evaluate expression as node set in the specified context.
+ // Return first node in document order, or empty node if node set is empty.
+ // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
+ // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead.
+ xpath_node evaluate_node(const xpath_node& n) const;
+
+ // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode)
+ const xpath_parse_result& result() const;
+
+ // Safe bool conversion operator
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+ };
+
+ #ifndef PUGIXML_NO_EXCEPTIONS
+ // XPath exception class
+ class PUGIXML_CLASS xpath_exception: public std::exception
+ {
+ private:
+ xpath_parse_result _result;
+
+ public:
+ // Construct exception from parse result
+ explicit xpath_exception(const xpath_parse_result& result);
+
+ // Get error message
+ virtual const char* what() const throw();
+
+ // Get parse result
+ const xpath_parse_result& result() const;
+ };
+ #endif
+
+ // XPath node class (either xml_node or xml_attribute)
+ class PUGIXML_CLASS xpath_node
+ {
+ private:
+ xml_node _node;
+ xml_attribute _attribute;
+
+ typedef void (*unspecified_bool_type)(xpath_node***);
+
+ public:
+ // Default constructor; constructs empty XPath node
+ xpath_node();
+
+ // Construct XPath node from XML node/attribute
+ xpath_node(const xml_node& node);
+ xpath_node(const xml_attribute& attribute, const xml_node& parent);
+
+ // Get node/attribute, if any
+ xml_node node() const;
+ xml_attribute attribute() const;
+
+ // Get parent of contained node/attribute
+ xml_node parent() const;
+
+ // Safe bool conversion operator
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+
+ // Comparison operators
+ bool operator==(const xpath_node& n) const;
+ bool operator!=(const xpath_node& n) const;
+ };
+
+#ifdef __BORLANDC__
+ // Borland C++ workaround
+ bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs);
+ bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs);
+#endif
+
+ // A fixed-size collection of XPath nodes
+ class PUGIXML_CLASS xpath_node_set
+ {
+ public:
+ // Collection type
+ enum type_t
+ {
+ type_unsorted, // Not ordered
+ type_sorted, // Sorted by document order (ascending)
+ type_sorted_reverse // Sorted by document order (descending)
+ };
+
+ // Constant iterator type
+ typedef const xpath_node* const_iterator;
+
+ // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work
+ typedef const xpath_node* iterator;
+
+ // Default constructor. Constructs empty set.
+ xpath_node_set();
+
+ // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful
+ xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);
+
+ // Destructor
+ ~xpath_node_set();
+
+ // Copy constructor/assignment operator
+ xpath_node_set(const xpath_node_set& ns);
+ xpath_node_set& operator=(const xpath_node_set& ns);
+
+ // Get collection type
+ type_t type() const;
+
+ // Get collection size
+ size_t size() const;
+
+ // Indexing operator
+ const xpath_node& operator[](size_t index) const;
+
+ // Collection iterators
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ // Sort the collection in ascending/descending order by document order
+ void sort(bool reverse = false);
+
+ // Get first node in the collection by document order
+ xpath_node first() const;
+
+ // Check if collection is empty
+ bool empty() const;
+
+ private:
+ type_t _type;
+
+ xpath_node _storage;
+
+ xpath_node* _begin;
+ xpath_node* _end;
+
+ void _assign(const_iterator begin, const_iterator end);
+ };
+#endif
+
+#ifndef PUGIXML_NO_STL
+ // Convert wide string to UTF8
+ std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);
+ std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str);
+
+ // Convert UTF8 to wide string
+ std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);
+ std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str);
+#endif
+
+ // Memory allocation function interface; returns pointer to allocated memory or NULL on failure
+ typedef void* (*allocation_function)(size_t size);
+
+ // Memory deallocation function interface
+ typedef void (*deallocation_function)(void* ptr);
+
+ // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.
+ void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);
+
+ // Get current memory management functions
+ allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
+ deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
+}
+
+#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
+namespace std
+{
+ // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
+ std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&);
+ std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&);
+ std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&);
+}
+#endif
+
+#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
+namespace std
+{
+ // Workarounds for (non-standard) iterator category detection
+ std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&);
+ std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&);
+ std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&);
+}
+#endif
+
+#endif
+
+// Make sure implementation is included in header-only mode
+// Use macro expansion in #include to work around QMake (QTBUG-11923)
+#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
+# define PUGIXML_SOURCE "pugixml.cpp"
+# include PUGIXML_SOURCE
+#endif
+
+/**
+ * Copyright (c) 2006-2014 Arseny Kapoulkine
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
diff --git a/src/swig/Accuracy.i b/src/swig/Accuracy.i
new file mode 100644
index 0000000..c315115
--- /dev/null
+++ b/src/swig/Accuracy.i
@@ -0,0 +1,17 @@
+/* Accuracy.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Accuracy.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+#ifdef SWIGPYTHON
+%rename(__int__) PacBio::BAM::Accuracy::operator int;
+#else // C#, R
+%rename(ToInt) PacBio::BAM::Accuracy::operator int;
+#endif
+
+%include <pbbam/Accuracy.h>
\ No newline at end of file
diff --git a/src/swig/AlignmentPrinter.i b/src/swig/AlignmentPrinter.i
new file mode 100644
index 0000000..6c4fc69
--- /dev/null
+++ b/src/swig/AlignmentPrinter.i
@@ -0,0 +1,11 @@
+/* AlignmentPrinter.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/AlignmentPrinter.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/AligmentPrinter.h>
\ No newline at end of file
diff --git a/src/swig/BamFile.i b/src/swig/BamFile.i
new file mode 100644
index 0000000..5b8a916
--- /dev/null
+++ b/src/swig/BamFile.i
@@ -0,0 +1,21 @@
+/* BamFile.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamFile.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::BamFile::BamFile(BamFile&&);
+%ignore PacBio::BAM::BamFile::operator=;
+
+HANDLE_STD_EXCEPTION(BamFile);
+HANDLE_STD_EXCEPTION(EnsurePacBioIndexExists);
+HANDLE_STD_EXCEPTION(EnsureStandardIndexExists);
+HANDLE_STD_EXCEPTION(ReferenceId);
+HANDLE_STD_EXCEPTION(ReferenceLength);
+HANDLE_STD_EXCEPTION(ReferenceName);
+
+%include <pbbam/BamFile.h>
\ No newline at end of file
diff --git a/src/swig/BamHeader.i b/src/swig/BamHeader.i
new file mode 100644
index 0000000..5f7ea8e
--- /dev/null
+++ b/src/swig/BamHeader.i
@@ -0,0 +1,28 @@
+/* BamHeader.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamHeader.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// Hide warnings about "internal" being a C# reserved word
+%warnfilter(314) PacBio::BAM::internal;
+
+%ignore PacBio::BAM::BamHeader::BamHeader(BamHeader&&); // move ctors not used
+%ignore PacBio::BAM::BamHeader::operator=; // assignment operators not used
+
+%template(ProgramInfoList) std::vector<PacBio::BAM::ProgramInfo>;
+%template(ReadGroupInfoList) std::vector<PacBio::BAM::ReadGroupInfo>;
+%template(SequenceInfoList) std::vector<PacBio::BAM::SequenceInfo>;
+
+HANDLE_STD_EXCEPTION(Program);
+HANDLE_STD_EXCEPTION(ReadGroup);
+HANDLE_STD_EXCEPTION(Sequence);
+HANDLE_STD_EXCEPTION(SequenceId);
+HANDLE_STD_EXCEPTION(SequenceLength);
+HANDLE_STD_EXCEPTION(SequenceName);
+
+%include <pbbam/BamHeader.h>
diff --git a/src/swig/BamRecord.i b/src/swig/BamRecord.i
new file mode 100644
index 0000000..16e6036
--- /dev/null
+++ b/src/swig/BamRecord.i
@@ -0,0 +1,33 @@
+/* BamRecord.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamRecord.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// Hide warnings about "internal" being a C# reserved word
+%warnfilter(314) PacBio::BAM::internal;
+
+// hide warnings about unused methods
+%ignore PacBio::BAM::BamRecord::BamRecord(BamRecordImpl&&);
+%ignore PacBio::BAM::BamRecord::BamRecord(BamRecord&&);
+%ignore PacBio::BAM::BamRecord::operator=;
+
+// ignore static methods, to allow member
+%ignore PacBio::BAM::BamRecord::Clipped(const BamRecord&, const ClipType, const PacBio::BAM::Position, const PacBio::BAM::Position);
+%ignore PacBio::BAM::BamRecord::Mapped(const BamRecord&, const int32_t, const Position, const Strand, const Cigar&, const uint8_t);
+
+// C# gets confused by the const and nonconst overloads
+%ignore PacBio::BAM::BamRecord::Impl() const;
+
+#ifdef SWIGR
+%rename("EncodedPkmean") PacBio::BAM::BamRecord::Pkmean(const std::vector<uint16_t>&);
+%rename("EncodedPkmid") PacBio::BAM::BamRecord::Pkmid(const std::vector<uint16_t>&);
+#endif // SWIGR
+
+HANDLE_STD_EXCEPTION(CigarData);
+
+%include <pbbam/BamRecord.h>
diff --git a/src/swig/BamRecordBuilder.i b/src/swig/BamRecordBuilder.i
new file mode 100644
index 0000000..7e968f9
--- /dev/null
+++ b/src/swig/BamRecordBuilder.i
@@ -0,0 +1,12 @@
+/* BamRecord.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamRecordBuilder.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+
+%include <pbbam/BamRecordBuilder.h>
diff --git a/src/swig/BamRecordImpl.i b/src/swig/BamRecordImpl.i
new file mode 100644
index 0000000..3899147
--- /dev/null
+++ b/src/swig/BamRecordImpl.i
@@ -0,0 +1,16 @@
+/* BamRecordImpl.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamRecordImpl.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::BamRecordImpl::BamRecordImpl(BamRecordImpl&&);
+%ignore PacBio::BAM::BamRecordImpl::operator=;
+
+HANDLE_STD_EXCEPTION(CigarData);
+
+%include <pbbam/BamRecordImpl.h>
\ No newline at end of file
diff --git a/src/swig/BamTagCodec.i b/src/swig/BamTagCodec.i
new file mode 100644
index 0000000..4a4326b
--- /dev/null
+++ b/src/swig/BamTagCodec.i
@@ -0,0 +1,11 @@
+/* BamTagCodec.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamTagCodec.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/BamTagCodec.h>
\ No newline at end of file
diff --git a/src/swig/BamWriter.i b/src/swig/BamWriter.i
new file mode 100644
index 0000000..87e332f
--- /dev/null
+++ b/src/swig/BamWriter.i
@@ -0,0 +1,18 @@
+/* BamWriter.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamWriter.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::BamWriter(const BamWriter&); // copy ctor not used
+%ignore PacBio::BAM::BamWriter(BamWriter&&); // move ctor not used
+%ignore PacBio::BAM::BamWriter::operator=; // assignment operators not used
+
+HANDLE_STD_EXCEPTION(BamWriter);
+HANDLE_STD_EXCEPTION(Write);
+
+%include <pbbam/BamWriter.h>
\ No newline at end of file
diff --git a/src/swig/CMakeLists.txt b/src/swig/CMakeLists.txt
new file mode 100644
index 0000000..8f52386
--- /dev/null
+++ b/src/swig/CMakeLists.txt
@@ -0,0 +1,68 @@
+# --------------------------------------------- @
+# SWIG
+# --------------------------------------------- @
+
+# general SWIG
+if(${wrapping_swig})
+
+ find_package(SWIG 3.0.5 REQUIRED)
+
+ include(${SWIG_USE_FILE})
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+
+ #
+ # quash compiler warnings from SWIG-generated code
+ #
+ check_cxx_compiler_flag("-Wno-unused-local-typedefs" HAS_NO_UNUSED_BUT_SET_VARIABLE)
+ if(HAS_NO_UNUSED_BUT_SET_VARIABLE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable")
+ endif()
+
+ check_cxx_compiler_flag("-Wno-dynamic-class-memaccess" HAS_NO_DYNAMIC_CLASS_MEMACCESS)
+ if (HAS_NO_DYNAMIC_CLASS_MEMACCESS)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-dynamic-class-memaccess")
+ endif()
+
+ check_cxx_compiler_flag("-Wno-unused-parameter" HAS_NO_UNUSED_PARAMETER)
+ if (HAS_NO_UNUSED_PARAMETER)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")
+ endif()
+
+ check_cxx_compiler_flag("-Wno-return-local-addr" HAS_NO_RETURN_LOCAL_ADDR)
+ if (HAS_NO_RETURN_LOCAL_ADDR)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-local-addr")
+ endif()
+
+ check_cxx_compiler_flag("-Wno-return-type" HAS_NO_RETURN_TYPE)
+ if (HAS_NO_RETURN_TYPE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type")
+ endif()
+
+ #
+ # SWIG source file properties
+ #
+ set_source_files_properties(PacBioBam.i PROPERTIES CPLUSPLUS ON)
+
+ if (APPLE)
+ else()
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set_source_files_properties(PacBioBam.i PROPERTIES SWIG_FLAGS "-DSWIGWORDSIZE64")
+ endif()
+ endif()
+
+endif()
+
+# Python
+if(PacBioBAM_wrap_python)
+ include(WrapPython.cmake)
+endif()
+
+# R
+if(PacBioBAM_wrap_r)
+ include(WrapR.cmake)
+endif()
+
+# CSharp
+if(PacBioBAM_wrap_csharp)
+ include(WrapCSharp.cmake)
+endif()
diff --git a/src/swig/Cigar.i b/src/swig/Cigar.i
new file mode 100644
index 0000000..2c5cf8c
--- /dev/null
+++ b/src/swig/Cigar.i
@@ -0,0 +1,16 @@
+/* Cigar.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Cigar.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%template(CigarOpList) std::vector<PacBio::BAM::CigarOperation>;
+
+%ignore PacBio::BAM::Cigar::Cigar(Cigar&&);
+%ignore PacBio::BAM::Cigar::operator=;
+
+%include <pbbam/Cigar.h>
diff --git a/src/swig/CigarOperation.i b/src/swig/CigarOperation.i
new file mode 100644
index 0000000..b2a9586
--- /dev/null
+++ b/src/swig/CigarOperation.i
@@ -0,0 +1,49 @@
+/* CigarOperation.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/CigarOperation.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::CigarOperation::CigarOperation(CigarOperation&&);
+%ignore PacBio::BAM::CigarOperation::operator=;
+
+#ifdef SWIGR
+%ignore PacBio::BAM::CigarOperation::CigarOperation(CigarOperationType, uint32_t);
+#endif
+
+HANDLE_STD_EXCEPTION(CigarOperation);
+
+%include <pbbam/CigarOperation.h>
+
+// enums aren't always named consistently (at least between Mac/clang/swig & Linux/gcc/swig)
+// so, keep this after the main %include so client source can be consistent
+#ifdef SWIGPYTHON
+%pythoncode %{
+try:
+ UNKNOWN_OP
+ ALIGNMENT_MATCH
+ INSERTION
+ DELETION
+ REFERENCE_SKIP
+ SOFT_CLIP
+ HARD_CLIP
+ PADDING
+ SEQUENCE_MATCH
+ SEQUENCE_MISMATCH
+except NameError:
+ UNKNOWN_OP = CigarOperationType_UNKNOWN_OP
+ ALIGNMENT_MATCH = CigarOperationType_ALIGNMENT_MATCH
+ INSERTION = CigarOperationType_INSERTION
+ DELETION = CigarOperationType_DELETION
+ REFERENCE_SKIP = CigarOperationType_REFERENCE_SKIP
+ SOFT_CLIP = CigarOperationType_SOFT_CLIP
+ HARD_CLIP = CigarOperationType_HARD_CLIP
+ PADDING = CigarOperationType_PADDING
+ SEQUENCE_MATCH = CigarOperationType_SEQUENCE_MATCH
+ SEQUENCE_MISMATCH = CigarOperationType_SEQUENCE_MISMATCH
+%}
+#endif
diff --git a/src/swig/DataSet.i b/src/swig/DataSet.i
new file mode 100644
index 0000000..8ba22c4
--- /dev/null
+++ b/src/swig/DataSet.i
@@ -0,0 +1,17 @@
+/* DataSet.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/DataSet.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// move ctors not used
+%ignore PacBio::BAM::DataSet::DataSet(DataSet&&);
+
+// assignment operators not used
+%ignore PacBio::BAM::DataSet::operator=;
+
+%include <pbbam/DataSet.h>
\ No newline at end of file
diff --git a/src/swig/DataSetTypes.i b/src/swig/DataSetTypes.i
new file mode 100644
index 0000000..2aeb0ff
--- /dev/null
+++ b/src/swig/DataSetTypes.i
@@ -0,0 +1,62 @@
+/* DataSetTypes.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/internal/DataSetElement.h>
+#include <pbbam/internal/DataSetListElement.h>
+#include <pbbam/internal/DataSetBaseTypes.h>
+#include <pbbam/DataSetTypes.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+%}
+
+%ignore PacBio::BAM::internal::DataSetElement::DataSetElement(DataSetElement&&);
+%ignore PacBio::BAM::internal::DataSetElement::operator=;
+%ignore PacBio::BAM::internal::DataSetElement::operator[];
+/*%rename(__getitem__) PacBio::BAM::internal::DataSetElement::operator[];*/
+
+%include <pbbam/internal/DataSetElement.h>
+
+%ignore PacBio::BAM::internal::DataSetElementList::operator[];
+%ignore PacBio::BAM::internal::DataSetListIterator::operator++;
+%ignore PacBio::BAM::internal::DataSetListConstIterator::operator++;
+
+%include <pbbam/internal/DataSetListElement.h>
+
+%template(ExtensionListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExtensionElement>;
+%template(ExternalResourceListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExternalResource>;
+%template(FileIndexListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::FileIndex>;
+%template(FilterListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Filter>;
+%template(PropertyListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Property>;
+%template(SubDataSetListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::DataSetBase>;
+
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExtensionElement> {
+ PacBio::BAM::ExtensionElement& __getitem__(unsigned int i) { return $self->Child<PacBio::BAM::ExtensionElement>(i); }
+ PacBio::BAM::ExtensionElement& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::ExtensionElement>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExternalResource> {
+ PacBio::BAM::ExternalResource& __getitem__(unsigned int i) { return $self->Child<PacBio::BAM::ExternalResource>(i); }
+ PacBio::BAM::ExternalResource& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::ExternalResource>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::FileIndex> {
+ PacBio::BAM::FileIndex& __getitem__(unsigned int i) { return $self->Child<PacBio::BAM::FileIndex>(i);}
+ PacBio::BAM::FileIndex& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::FileIndex>(s);}
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Filter> {
+ PacBio::BAM::Filter& __getitem__(unsigned int i) { return $self->Child<PacBio::BAM::Filter>(i); }
+ PacBio::BAM::Filter& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::Filter>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Property> {
+ PacBio::BAM::Property& __getitem__(unsigned int i) { return $self->Child<PacBio::BAM::Property>(i); }
+ PacBio::BAM::Property& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::Property>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::DataSetBase> {
+ PacBio::BAM::DataSetBase& __getitem__(unsigned int i) { return $self->Child<PacBio::BAM::DataSetBase>(i); }
+ PacBio::BAM::DataSetBase& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::DataSetBase>(s); }
+}
+
+%include <pbbam/internal/DataSetBaseTypes.h>
+%include <pbbam/DataSetTypes.h>
diff --git a/src/swig/EntireFileQuery.i b/src/swig/EntireFileQuery.i
new file mode 100644
index 0000000..a0571e8
--- /dev/null
+++ b/src/swig/EntireFileQuery.i
@@ -0,0 +1,17 @@
+/* EntireFileQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/DataSet.h>
+#include <pbbam/internal/QueryBase.h>
+#include <pbbam/EntireFileQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+HANDLE_STD_EXCEPTION(EntireFileQuery);
+
+%include <pbbam/DataSet.h>
+%include <pbbam/internal/QueryBase.h>
+%include <pbbam/EntireFileQuery.h>
\ No newline at end of file
diff --git a/src/swig/Frames.i b/src/swig/Frames.i
new file mode 100644
index 0000000..d3e001a
--- /dev/null
+++ b/src/swig/Frames.i
@@ -0,0 +1,19 @@
+/* Frames.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Frames.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::Frames::Frames(Frames&&);
+%ignore PacBio::BAM::Frames::Frames(std::vector<uint16_t>&&);
+%ignore PacBio::BAM::Frames::operator=;
+%ignore PacBio::BAM::Frames::Data(std::vector<uint16_t>&&);
+
+%template(UInt8List) std::vector<uint8_t>;
+%template(UInt16List) std::vector<uint16_t>;
+
+%include <pbbam/Frames.h>
diff --git a/src/swig/GenomicInterval.i b/src/swig/GenomicInterval.i
new file mode 100644
index 0000000..626c8ac
--- /dev/null
+++ b/src/swig/GenomicInterval.i
@@ -0,0 +1,11 @@
+/* GenomicInterval.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GenomicInterval.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/GenomicInterval.h>
\ No newline at end of file
diff --git a/src/swig/GenomicIntervalQuery.i b/src/swig/GenomicIntervalQuery.i
new file mode 100644
index 0000000..0ed7886
--- /dev/null
+++ b/src/swig/GenomicIntervalQuery.i
@@ -0,0 +1,15 @@
+/* GenomicIntervalQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GenomicIntervalQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+HANDLE_STD_EXCEPTION(CreateIterator);
+HANDLE_STD_EXCEPTION(GenomicIntervalQuery);
+HANDLE_STD_EXCEPTION(Interval);
+
+%include <pbbam/GenomicIntervalQuery.h>
\ No newline at end of file
diff --git a/src/swig/GroupQuery.i b/src/swig/GroupQuery.i
new file mode 100644
index 0000000..3128e15
--- /dev/null
+++ b/src/swig/GroupQuery.i
@@ -0,0 +1,11 @@
+/* GroupQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GroupQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/GroupQuery.h>
\ No newline at end of file
diff --git a/src/swig/GroupQueryBase.i b/src/swig/GroupQueryBase.i
new file mode 100644
index 0000000..ade4526
--- /dev/null
+++ b/src/swig/GroupQueryBase.i
@@ -0,0 +1,32 @@
+/* GroupQueryBase.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GroupQueryBase.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::GroupQueryIterator::operator++;
+%ignore PacBio::BAM::GroupQueryConstIterator::operator++;
+
+%include <pbbam/GroupQueryBase.h>
+
+%extend PacBio::BAM::GroupQueryIterator
+{
+ PacBio::BAM::GroupQueryIterator& incr(void)
+ { return $self->operator++(); }
+
+ std::vector<PacBio::BAM::BamRecord>* value(void)
+ { return $self->operator->(); }
+}
+
+%extend PacBio::BAM::GroupQueryConstIterator
+{
+ PacBio::BAM::GroupQueryConstIterator& incr(void)
+ { return $self->operator++(); }
+
+ const std::vector<PacBio::BAM::BamRecord>* value(void) const
+ { return $self->operator->(); }
+}
\ No newline at end of file
diff --git a/src/swig/IndexedFastaReader.i b/src/swig/IndexedFastaReader.i
new file mode 100644
index 0000000..25ef650
--- /dev/null
+++ b/src/swig/IndexedFastaReader.i
@@ -0,0 +1,13 @@
+/* IndexedFastaReader.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/IndexedFastaReader.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::IndexedFastaReader::operator=; // assignment operators not used
+
+%include <pbbam/IndexedFastaReader.h>
diff --git a/src/swig/Interval.i b/src/swig/Interval.i
new file mode 100644
index 0000000..0867eb4
--- /dev/null
+++ b/src/swig/Interval.i
@@ -0,0 +1,12 @@
+/* Interval.i */
+%module PacBioBam
+%{
+#include <pbbam/Interval.h>
+#include <pbbam/Position.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Interval.h>
+
+%template(PositionInterval) PacBio::BAM::Interval<PacBio::BAM::Position>;
diff --git a/src/swig/LocalContextFlags.i b/src/swig/LocalContextFlags.i
new file mode 100644
index 0000000..b47a4d4
--- /dev/null
+++ b/src/swig/LocalContextFlags.i
@@ -0,0 +1,11 @@
+/* LocalContextFlags.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/LocalContextFlags.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/LocalContextFlags.h>
diff --git a/src/swig/Orientation.i b/src/swig/Orientation.i
new file mode 100644
index 0000000..2f10a7a
--- /dev/null
+++ b/src/swig/Orientation.i
@@ -0,0 +1,11 @@
+/* Orientation.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Orientation.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Orientation.h>
\ No newline at end of file
diff --git a/src/swig/PacBio.BAM.csproj.in b/src/swig/PacBio.BAM.csproj.in
new file mode 100644
index 0000000..61872db
--- /dev/null
+++ b/src/swig/PacBio.BAM.csproj.in
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{6E414044-5469-48E4-BA14-1B9888875DD5}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <RootNamespace>PacBio.BAM</RootNamespace>
+ <AssemblyName>PacBio.BAM</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>full</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="*.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
diff --git a/src/swig/PacBioBam.i b/src/swig/PacBioBam.i
new file mode 100644
index 0000000..ed8c746
--- /dev/null
+++ b/src/swig/PacBioBam.i
@@ -0,0 +1,166 @@
+/* pbbam.i */
+%module PacBioBam
+%{
+
+/*ifdef SWIGR
+ define SWIG_SHARED_PTR_NAMESPACE boost
+ define SWIG_SHARED_PTR_SUBNAMESPACE
+endif*/
+
+#include <pbbam/Config.h>
+#include <string>
+#include <vector>
+%}
+
+#define SWIG_FILE_WITH_INIT
+#define PBBAM_EXPORT
+
+#ifdef SWIGCSHARP
+%rename(Equals) *::operator==;
+%rename(ToBool) *::operator bool;
+%rename(ToInt) *::operator int;
+%rename(ToUint8) *::operator uint8_t;
+
+%ignore *::operator !=;
+
+// Iterator interfaces are not useful outside of C++
+%ignore *::begin;
+%ignore *::end;
+
+%csmethodmodifiers *::ToString() const "public override";
+
+#endif // SWIGCSHARP
+
+/********* SWIG includes ************/
+
+%include "exception.i"
+%include "stdint.i"
+%include "std_common.i"
+
+#ifdef SWIGR
+%include "boost_shared_ptr.i"
+#else
+%include "std_shared_ptr.i"
+#endif
+
+%include "std_map.i"
+%include "std_pair.i"
+%include "std_string.i"
+%include "std_vector.i"
+
+ // TODO: can we call these vectors!?
+%template(StringList) std::vector<std::string>;
+%template(IntList) std::vector<int>;
+%template(UIntList) std::vector<unsigned int>;
+%template(FloatList) std::vector<float>;
+%template(ShortList) std::vector<short>;
+%template(CharList) std::vector<char>;
+
+// basic exception-handler helper
+//
+// -- STL builtins --
+// std::invalid_argument -> ValueError
+// std::domain_error -> ValueError
+// std::overflow_error -> OverflowError
+// std::out_of_range -> IndexError
+// std::length_error -> IndexError
+// std::runtime_error -> RuntimeError
+// std::exception -> SystemError
+//
+// (anything else) -> UnknownError
+//
+// * All pbbam exceptions are simply std::exception (SystemErro) for now,
+// until (if?) we flesh out a more detailed exception hierarchy.
+// Either way, new ones will inherit from std::exception, so SystemError
+// should still remain a valid handler.
+//
+%define HANDLE_STD_EXCEPTION(MethodName)
+%exception MethodName {
+ try {
+ $action
+ }
+ SWIG_CATCH_STDEXCEPT // catch std::exception
+ catch (...) {
+ SWIG_exception(SWIG_UnknownError, "Unknown exception");
+ }
+}
+%enddef
+
+/********* PacBioBAM includes ************/
+
+#ifdef SWIGCSHARP
+ // Renames to play nice with C#
+ // (These are used in the dataset support code, where things like
+ // this happen in C++:
+ //
+ // void Extensions(Extensions x) { ... }
+ //
+ // and this poses problems for C#. Renaming should be fine
+ // as it is doubtful we will refer to these classes by name anyway.)
+ //
+%rename(ExtensionsType) PacBio::BAM::Extensions;
+%rename(ExternalResourcesType) PacBio::BAM::ExternalResources;
+%rename(FiltersType) PacBio::BAM::Filters;
+%rename(SubDataSetsType) PacBio::BAM::SubDataSets;
+%rename(ProvenanceType) PacBio::BAM::Provenance;
+%rename(PropertiesType) PacBio::BAM::Properties;
+%rename(FileIndicesType) PacBio::BAM::FileIndices;
+%rename(ParentToolType) PacBio::BAM::ParentTool;
+%rename(CigarType) PacBio::BAM::Cigar;
+#endif
+
+// Basic types
+%include "Accuracy.i"
+%include "CigarOperation.i"
+%include "Interval.i"
+%include "LocalContextFlags.i"
+%include "Orientation.i"
+%include "Position.i"
+%include "QualityValue.i"
+%include "Strand.i"
+%include "Tag.i"
+
+// Basic type aggregates
+%include "Cigar.i"
+%include "GenomicInterval.i"
+%include "QualityValues.i"
+%include "TagCollection.i"
+
+// keep this guy after the other basic types, hacky but works
+%include "Frames.i"
+
+// Header API
+%include "ProgramInfo.i"
+%include "ReadGroupInfo.i"
+%include "SequenceInfo.i"
+%include "BamHeader.i"
+
+// SAM/BAM format
+%include "BamFile.i"
+%include "BamRecordImpl.i"
+%include "BamRecord.i"
+%include "BamRecordBuilder.i"
+%include "BamTagCodec.i"
+%include "BamWriter.i"
+%include "SamTagCodec.i"
+
+// DataSet
+%include "DataSetTypes.i"
+%include "DataSet.i"
+
+// Query/iterator API
+%include "QueryBase.i"
+%include "GroupQueryBase.i"
+%include "GroupQuery.i"
+%include "EntireFileQuery.i"
+%include "GenomicIntervalQuery.i"
+%include "ZmwQuery.i"
+%include "ZmwGroupQuery.i"
+
+// PBI
+%include "PbiFile.i"
+%include "PbiRawData.i"
+%include "PbiIndex.i"
+
+// FASTA
+%include "IndexedFastaReader.i"
diff --git a/src/swig/PbiFile.i b/src/swig/PbiFile.i
new file mode 100644
index 0000000..096ff10
--- /dev/null
+++ b/src/swig/PbiFile.i
@@ -0,0 +1,11 @@
+/* PbiFile.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/PbiFile.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/PbiFile.h>
\ No newline at end of file
diff --git a/src/swig/PbiIndex.i b/src/swig/PbiIndex.i
new file mode 100644
index 0000000..d903f67
--- /dev/null
+++ b/src/swig/PbiIndex.i
@@ -0,0 +1,18 @@
+/* PbiIndex.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/PbiIndex.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+/*%ignore PacBio::BAM::IndexResultBlock::IndexResultBlock();*/
+%ignore PacBio::BAM::IndexResultBlock::IndexResultBlock(size_t, size_t);
+
+%ignore PacBio::BAM::PbiIndex::PbiIndex(PbiIndex&&); // move ctors not used
+%ignore PacBio::BAM::PbiIndex::operator=; // assignment operators not used
+%ignore PacBio::BAM::PbiIndeX::VirtualFileOffsets;
+
+%include <pbbam/PbiIndex.h>
diff --git a/src/swig/PbiRawData.i b/src/swig/PbiRawData.i
new file mode 100644
index 0000000..4992cc4
--- /dev/null
+++ b/src/swig/PbiRawData.i
@@ -0,0 +1,29 @@
+/* PbiRawData.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/PbiRawData.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// move ctors not used
+%ignore PacBio::BAM::PbiRawBarcodeData::PbiRawBarcodeData(PbiRawBarcodeData&&);
+%ignore PacBio::BAM::PbiRawMappedData::PbiRawMappedData(PbiRawMappedData&&);
+%ignore PacBio::BAM::PbiReferenceEntry::PbiReferenceEntry(PbiReferenceEntry&&);
+%ignore PacBio::BAM::PbiRawReferenceData::PbiRawReferenceData(PbiRawReferenceData&&);
+%ignore PacBio::BAM::PbiRawSubreadData::PbiRawSubreadData(PbiRawSubreadData&&);
+%ignore PacBio::BAM::PbiRawData::PbiRawData(PbiRawData&&);
+
+// assignment operators not used
+%ignore PacBio::BAM::PbiRawBarcodeData::operator=;
+%ignore PacBio::BAM::PbiRawMappedData::operator=;
+%ignore PacBio::BAM::PbiReferenceEntry::operator=;
+%ignore PacBio::BAM::PbiRawReferenceData::operator=;
+%ignore PacBio::BAM::PbiRawSubreadData::operator=;
+%ignore PacBio::BAM::PbiRawData::operator=;
+
+HANDLE_STD_EXCEPTION(PacBio::BAM::PbiRawMappedData::AddRecord);
+
+%include <pbbam/PbiRawData.h>
diff --git a/src/swig/Position.i b/src/swig/Position.i
new file mode 100644
index 0000000..9917024
--- /dev/null
+++ b/src/swig/Position.i
@@ -0,0 +1,11 @@
+/* Position.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Position.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Position.h>
diff --git a/src/swig/ProgramInfo.i b/src/swig/ProgramInfo.i
new file mode 100644
index 0000000..9f2a2aa
--- /dev/null
+++ b/src/swig/ProgramInfo.i
@@ -0,0 +1,15 @@
+/* ProgramInfo.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/ProgramInfo.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::ProgramInfo::ProgramInfo(ProgramInfo&&);
+%ignore PacBio::BAM::ProgramInfo::operator=;
+%ignore PacBio::BAM::ProgramInfo::ToSam(const ProgramInfo&); // ignore static method, to allow member
+
+%include <pbbam/ProgramInfo.h>
\ No newline at end of file
diff --git a/src/swig/QualityValue.i b/src/swig/QualityValue.i
new file mode 100644
index 0000000..29874e1
--- /dev/null
+++ b/src/swig/QualityValue.i
@@ -0,0 +1,20 @@
+/* QualityValue.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/QualityValue.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::QualityValue::operator=;
+
+#ifdef SWIGPYTHON
+%rename(__int__) PacBio::BAM::QualityValue::operator uint8_t;
+#else // R, C#
+%rename(ToInt) PacBio::BAM::QualityValue::operator uint8_t;
+#endif
+
+%include <pbbam/QualityValue.h>
+
diff --git a/src/swig/QualityValues.i b/src/swig/QualityValues.i
new file mode 100644
index 0000000..815a1b2
--- /dev/null
+++ b/src/swig/QualityValues.i
@@ -0,0 +1,17 @@
+/* QualityValues.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/QualityValues.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%template(QualityValueList) std::vector<PacBio::BAM::QualityValue>;
+
+%ignore PacBio::BAM::QualityValues::operator=;
+%ignore PacBio::BAM::QualityValues::QualityValues(QualityValues&&);
+%ignore PacBio::BAM::QualityValues::QualityValues(std::vector<QualityValue>&&);
+
+%include <pbbam/QualityValues.h>
diff --git a/src/swig/QueryBase.i b/src/swig/QueryBase.i
new file mode 100644
index 0000000..f2220d9
--- /dev/null
+++ b/src/swig/QueryBase.i
@@ -0,0 +1,127 @@
+/* QueryBase.i */
+
+%module PacBioBam
+
+%{
+
+#include <pbbam/internal/QueryBase.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+
+%ignore PacBio::BAM::QueryIterator::operator++;
+%ignore PacBio::BAM::QueryConstIterator::operator++;
+
+%ignore PacBio::BAM::internal::QueryIterator::operator++;
+%ignore PacBio::BAM::internal::QueryConstIterator::operator++;
+
+%typemap(csinterfaces) PacBio::BAM::internal::QueryBase<BamRecord> "global::System.Collections.IEnumerable\n, global::System.Collections.Generic.IEnumerable<PacBio.BAM.BamRecord>\n";
+%typemap(cscode) PacBio::BAM::internal::QueryBase<BamRecord>
+%{
+
+ public global::System.Collections.Generic.IEnumerator<PacBio.BAM.BamRecord> GetEnumerator()
+ {
+ var i = this.cbegin();
+ var e = this.cend();
+ while (!i.Equals(e))
+ {
+ yield return i.value();
+ i.incr();
+ }
+ }
+
+ global::System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+%}
+
+namespace std {
+ %template(BamRecordList) std::vector<PacBio::BAM::BamRecord>;
+}
+
+%typemap(csinterfaces) PacBio::BAM::internal::QueryBase<std::vector<BamRecord> > "global::System.Collections.IEnumerable\n, global::System.Collections.Generic.IEnumerable<BamRecordList>\n";
+%typemap(cscode) PacBio::BAM::internal::QueryBase<std::vector<BamRecord> >
+%{
+
+ public global::System.Collections.Generic.IEnumerator<BamRecordList> GetEnumerator()
+ {
+ var i = this.cbegin();
+ var e = this.cend();
+ while (!i.Equals(e))
+ {
+ yield return i.value();
+ i.incr();
+ }
+ }
+
+ global::System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+%}
+
+%include <pbbam/internal/QueryBase.h>
+
+%template(IQuery) PacBio::BAM::internal::QueryBase<BamRecord>;
+%template(IGroupQuery) PacBio::BAM::internal::QueryBase<std::vector<BamRecord> >;
+
+// IEnumerable<BamRecord> interfaces for Queries
+%template(BamQueryIteratorBase) PacBio::BAM::internal::QueryIteratorBase<BamRecord>;
+%template(BamGroupQueryIteratorBase) PacBio::BAM::internal::QueryIteratorBase<std::vector<BamRecord> >;
+%template(BamQueryIterator) PacBio::BAM::internal::QueryIterator<BamRecord>;
+%template(BamGroupQueryIterator) PacBio::BAM::internal::QueryIterator<std::vector<BamRecord> >;
+%template(BamQueryConstIterator) PacBio::BAM::internal::QueryConstIterator<BamRecord>;
+%template(BamGroupQueryConstIterator) PacBio::BAM::internal::QueryConstIterator<std::vector<BamRecord> >;
+
+// Iterator API
+#ifdef SWIGPYTHON
+%pythoncode %{
+def Iterate(c):
+ i = c.begin()
+ e = c.end()
+ while i != e:
+ yield i.value()
+ i.incr()
+%}
+#endif
+
+%extend PacBio::BAM::internal::QueryIterator<BamRecord>
+{
+ PacBio::BAM::internal::QueryIterator<BamRecord>& incr(void)
+ { return $self->operator++(); }
+
+ PacBio::BAM::BamRecord* value(void)
+ { return $self->operator->(); }
+}
+
+%extend PacBio::BAM::internal::QueryConstIterator<BamRecord>
+{
+ PacBio::BAM::internal::QueryConstIterator<BamRecord>& incr(void)
+ { return $self->operator++(); }
+
+ const PacBio::BAM::BamRecord* value(void) const
+ { return $self->operator->(); }
+}
+
+%extend PacBio::BAM::internal::QueryIterator<std::vector<BamRecord> >
+{
+ PacBio::BAM::internal::QueryIterator<std::vector<BamRecord> >& incr(void)
+ { return $self->operator++(); }
+
+ std::vector<PacBio::BAM::BamRecord>* value(void)
+ { return $self->operator->(); }
+}
+
+%extend PacBio::BAM::internal::QueryConstIterator<std::vector<BamRecord> >
+{
+ PacBio::BAM::internal::QueryConstIterator<std::vector<BamRecord> >& incr(void)
+ { return $self->operator++(); }
+
+ const std::vector<PacBio::BAM::BamRecord>* value(void) const
+ { return $self->operator->(); }
+}
diff --git a/src/swig/ReadGroupInfo.i b/src/swig/ReadGroupInfo.i
new file mode 100644
index 0000000..a02deda
--- /dev/null
+++ b/src/swig/ReadGroupInfo.i
@@ -0,0 +1,15 @@
+/* ReadGroupInfo.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/ReadGroupInfo.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::ReadGroupInfo::ReadGroupInfo(ReadGroupInfo&&);
+%ignore PacBio::BAM::ReadGroupInfo::operator=;
+%ignore PacBio::BAM::ReadGroupInfo::ToSam(const ReadGroupInfo&);
+
+%include <pbbam/ReadGroupInfo.h>
\ No newline at end of file
diff --git a/src/swig/SamTagCodec.i b/src/swig/SamTagCodec.i
new file mode 100644
index 0000000..320d488
--- /dev/null
+++ b/src/swig/SamTagCodec.i
@@ -0,0 +1,11 @@
+/* SamTagCodec.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/SamTagCodec.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/SamTagCodec.h>
\ No newline at end of file
diff --git a/src/swig/SequenceInfo.i b/src/swig/SequenceInfo.i
new file mode 100644
index 0000000..3b0ce67
--- /dev/null
+++ b/src/swig/SequenceInfo.i
@@ -0,0 +1,15 @@
+/* SequenceInfo.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/SequenceInfo.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::SequenceInfo::SequenceInfo(SequenceInfo&&);
+%ignore PacBio::BAM::SequenceInfo::operator=;
+%ignore PacBio::BAM::SequenceInfo::ToSam(const SequenceInfo&); // ignore static method, to allow member
+
+%include <pbbam/SequenceInfo.h>
\ No newline at end of file
diff --git a/src/swig/Strand.i b/src/swig/Strand.i
new file mode 100644
index 0000000..96f71f1
--- /dev/null
+++ b/src/swig/Strand.i
@@ -0,0 +1,11 @@
+/* Strand.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Strand.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Strand.h>
\ No newline at end of file
diff --git a/src/swig/Tag.i b/src/swig/Tag.i
new file mode 100644
index 0000000..838454c
--- /dev/null
+++ b/src/swig/Tag.i
@@ -0,0 +1,130 @@
+/* Tag.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Tag.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::Tag::Tag(Tag&&);
+%ignore PacBio::BAM::Tag::operator=;
+
+HANDLE_STD_EXCEPTION(ToInt8);
+HANDLE_STD_EXCEPTION(ToUInt8);
+HANDLE_STD_EXCEPTION(ToInt16);
+HANDLE_STD_EXCEPTION(ToUInt16);
+HANDLE_STD_EXCEPTION(ToInt32);
+HANDLE_STD_EXCEPTION(ToUInt32);
+HANDLE_STD_EXCEPTION(ToFloat);
+HANDLE_STD_EXCEPTION(ToString);
+HANDLE_STD_EXCEPTION(ToInt8Array);
+HANDLE_STD_EXCEPTION(ToUInt8Array);
+HANDLE_STD_EXCEPTION(ToInt16Array);
+HANDLE_STD_EXCEPTION(ToUInt16Array);
+HANDLE_STD_EXCEPTION(ToInt32Array);
+HANDLE_STD_EXCEPTION(ToUInt32Array);
+HANDLE_STD_EXCEPTION(ToFloatArray);
+
+#ifdef SWIGR
+
+%ignore PacBio::BAM::Tag::Tag(int8_t value);
+%ignore PacBio::BAM::Tag::Tag(uint8_t value);
+%ignore PacBio::BAM::Tag::Tag(int16_t value);
+%ignore PacBio::BAM::Tag::Tag(uint16_t value);
+%ignore PacBio::BAM::Tag::Tag(int32_t value);
+%ignore PacBio::BAM::Tag::Tag(uint32_t value);
+%ignore PacBio::BAM::Tag::Tag(float value);
+%ignore PacBio::BAM::Tag::Tag(const std::string& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<int8_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<uint8_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<int16_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<uint16_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<int32_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<uint32_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<float>& value);
+
+%extend PacBio::BAM::Tag {
+
+ PacBio::BAM::Tag FromInt8(int x) { return PacBio::BAM::Tag(static_cast<int8_t>(x)); }
+ PacBio::BAM::Tag FromUInt8(int x) { return PacBio::BAM::Tag(static_cast<uint8_t>(x)); }
+ PacBio::BAM::Tag FromInt16(int x) { return PacBio::BAM::Tag(static_cast<int16_t>(x)); }
+ PacBio::BAM::Tag FromUInt16(int x) { return PacBio::BAM::Tag(static_cast<uint16_t>(x)); }
+ PacBio::BAM::Tag FromInt32(int x) { return PacBio::BAM::Tag(static_cast<int32_t>(x)); }
+ PacBio::BAM::Tag FromUInt32(int x) { return PacBio::BAM::Tag(static_cast<uint32_t>(x)); }
+ PacBio::BAM::Tag FromFloat(int x) { return PacBio::BAM::Tag(static_cast<float>(x)); }
+
+ PacBio::BAM::Tag FromInt8Array(const std::vector<int>& v)
+ {
+ std::vector<int8_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<int8_t>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+
+ PacBio::BAM::Tag FromUInt8Array(const std::vector<int>& v)
+ {
+ std::vector<uint8_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<uint8_t>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+
+ PacBio::BAM::Tag FromInt16Array(const std::vector<int>& v)
+ {
+ std::vector<int16_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<int16_t>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+
+ PacBio::BAM::Tag FromUInt16Array(const std::vector<int>& v)
+ {
+ std::vector<int16_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<uint16_t>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+
+ PacBio::BAM::Tag FromInt32Array(const std::vector<int>& v)
+ {
+ std::vector<int16_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<int32_t>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+
+ PacBio::BAM::Tag FromUInt32Array(const std::vector<int>& v)
+ {
+ std::vector<int16_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<uint32_t>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+
+ PacBio::BAM::Tag FromFloatArray(const std::vector<int>& v)
+ {
+ std::vector<int16_t> result;
+ const size_t numElements = v.size();
+ result.reserve(numElements);
+ for (size_t i = 0; i < numElements; ++i)
+ result.push_back(static_cast<float>(v.at(i)));
+ return PacBio::BAM::Tag(result);
+ }
+}
+#endif // SWIGR
+
+%include <pbbam/Tag.h>
\ No newline at end of file
diff --git a/src/swig/TagCollection.i b/src/swig/TagCollection.i
new file mode 100644
index 0000000..bcfc707
--- /dev/null
+++ b/src/swig/TagCollection.i
@@ -0,0 +1,13 @@
+/* TagCollection.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/TagCollection.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%template(TagCollectionType) std::map<std::string, PacBio::BAM::Tag>;
+
+%include <pbbam/TagCollection.h>
\ No newline at end of file
diff --git a/src/swig/WrapCSharp.cmake b/src/swig/WrapCSharp.cmake
new file mode 100644
index 0000000..a6eee7f
--- /dev/null
+++ b/src/swig/WrapCSharp.cmake
@@ -0,0 +1,46 @@
+
+find_package(CSharp REQUIRED)
+include (${CSHARP_USE_FILE})
+
+set(PacBioBAM_CSharpLibDir ${PacBioBAM_LibDir}/csharp/PacBio.BAM)
+set(PacBioBAM_CSharpDLL ${PacBioBAM_CSharpLibDir}/bin/Debug/PacBio.BAM.dll)
+set(CSharpTestRootDir ${PacBioBAM_TestsDir}/src/CSharp)
+set(NativeLibraryPaths ${PacBioBAM_CSharpLibDir}:${PacBioBAM_LibDir}:${Htslib_LibDir})
+
+#
+# Create SWIG wrapper
+#
+file(MAKE_DIRECTORY ${PacBioBAM_CSharpLibDir})
+set(CMAKE_SWIG_OUTDIR ${PacBioBAM_CSharpLibDir}) # ensure any swig files in lib/csharp
+set_source_files_properties(
+ PacBioBam.i PROPERTIES
+ CPLUSPLUS ON
+ SWIG_FLAGS "-namespace;PacBio.BAM")
+swig_add_module(PacBioBam csharp PacBioBam.i)
+swig_link_libraries(PacBioBam ${PacBioBAM_LIBRARIES}) # add any C# libs you need from <Find|Use>CSharp.cmake
+set_target_properties(
+ ${SWIG_MODULE_PacBioBam_REAL_NAME} # ensure wrapper lib in lib/csharp
+ PROPERTIES
+ LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_CSharpLibDir}
+)
+add_dependencies(${SWIG_MODULE_PacBioBam_REAL_NAME} pbbam)
+
+#
+# Write a csproj, then shell out to build and check the assembly---
+# can't get it working nicely in CMake yet
+#
+configure_file(
+ ${PacBioBAM_SwigSourceDir}/PacBio.BAM.csproj.in
+ ${PacBioBAM_CSharpLibDir}/PacBio.BAM.csproj)
+configure_file(
+ ${CSharpTestRootDir}/TestPbbam.cs.in
+ ${CSharpTestRootDir}/TestPbbam.cs)
+configure_file(
+ ${CSharpTestRootDir}/buildAssembly.sh.in
+ buildAssembly.sh)
+add_custom_command(
+ OUTPUT ${PacBioBAM_CSharpDLL}
+ DEPENDS ${SWIG_MODULE_PacBioBam_REAL_NAME}
+ COMMAND bash ./buildAssembly.sh
+)
+add_custom_target(CSharpAssembly ALL DEPENDS ${PacBioBAM_CSharpDLL})
diff --git a/src/swig/WrapPython.cmake b/src/swig/WrapPython.cmake
new file mode 100644
index 0000000..839d7a5
--- /dev/null
+++ b/src/swig/WrapPython.cmake
@@ -0,0 +1,54 @@
+
+# setup
+find_package(PythonLibs REQUIRED)
+include_directories(${PYTHON_INCLUDE_PATH})
+set(PacBioBAM_PythonLibDir ${PacBioBAM_LibDir}/python)
+set(PythonTestRootDir ${PacBioBAM_TestsDir}/src/python)
+
+# create wrapper
+file(MAKE_DIRECTORY ${PacBioBAM_PythonLibDir})
+set(CMAKE_SWIG_OUTDIR ${PacBioBAM_PythonLibDir}) # put PacBioBam.py in lib/python
+
+swig_add_module(PacBioBam python PacBioBam.i)
+swig_link_libraries(PacBioBam ${PacBioBAM_LIBRARIES} ${PYTHON_LIBRARIES})
+set_target_properties(
+ ${SWIG_MODULE_PacBioBam_REAL_NAME} # put _PacBioBam.so in lib/python
+ PROPERTIES
+ LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_PythonLibDir}
+)
+add_dependencies(${SWIG_MODULE_PacBioBam_REAL_NAME} pbbam)
+
+# simple "wrapper worked" check
+# this is run every build, to check importing from Python, but does NOT run full Python-side unit tests
+add_custom_target(
+ check_swig_python
+ ALL
+ "PYTHONPATH=${PacBioBAM_PythonLibDir}" python check_swig.py
+ COMMENT "Checking Python wrapper"
+ WORKING_DIRECTORY ${PythonTestRootDir}
+)
+add_dependencies(check_swig_python ${SWIG_MODULE_PacBioBam_REAL_NAME})
+
+# unit tests
+if(PacBioBAM_build_tests)
+
+ # configure data directory info
+ configure_file(
+ ${PythonTestRootDir}/test/config.py.in
+ ${PythonTestRootDir}/test/config.py
+ )
+
+ # test runner
+ add_test(
+ NAME PythonUnitTests
+ WORKING_DIRECTORY ${PythonTestRootDir}
+ COMMAND "python" test_pbbam.py
+ )
+ set_tests_properties(
+ PythonUnitTests
+ PROPERTIES
+ ENVIRONMENT "PYTHONPATH=${PacBioBAM_PythonLibDir}"
+ )
+
+endif() # unit tests
+
diff --git a/src/swig/WrapR.cmake b/src/swig/WrapR.cmake
new file mode 100644
index 0000000..5dccedd
--- /dev/null
+++ b/src/swig/WrapR.cmake
@@ -0,0 +1,71 @@
+# setup
+set(R_INCLUDE_DIR_HINT /mnt/software/r/R/3.1.1/usr/share/R/include) # TODO: hard-coded hint for now, clean up later
+find_package(R REQUIRED)
+include_directories(${R_INCLUDE_DIR})
+set(PacBioBAM_RLibDir ${PacBioBAM_LibDir}/R)
+set(RTestRootDir ${PacBioBAM_TestsDir}/src/R)
+
+# Suppress warnings from generated code
+include(CheckCXXCompilerFlag)
+check_cxx_compiler_flag("-Wno-unused-parameter" HAS_NO_UNUSED_PARAMETER)
+if(HAS_NO_UNUSED_PARAMETER)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")
+endif()
+
+# SWIG R does not support PBBAM_SHARED_PTR, but it does support boost::shared_ptr
+# So force boost if we're wrapping for R.
+add_definitions(-DPBBAM_USE_BOOST_SHARED_PTR)
+
+# create wrapper & library
+file(MAKE_DIRECTORY ${PacBioBAM_RLibDir})
+set(CMAKE_SWIG_OUTDIR ${PacBioBAM_RLibDir}) # put PacBioBam.R wrapper in lib/R
+swig_add_module(PacBioBam r PacBioBam.i)
+swig_link_libraries(PacBioBam ${PacBioBAM_LIBRARIES})
+if(R_LIBRARIES)
+ swig_link_libraries(PacBioBam ${R_LIBRARIES})
+endif()
+
+# make sure the library is named "PacBioBam.so" explicitly
+# no "lib" prefix... that gets in the way of the name lookups between SWIG/R
+# and make sure library ends up in lib/R
+set_target_properties(
+ ${SWIG_MODULE_PacBioBam_REAL_NAME}
+ PROPERTIES
+ LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_RLibDir}
+ RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_RLibDir}
+ SONAME PacBioBam.so
+ PREFIX ""
+)
+add_dependencies(${SWIG_MODULE_PacBioBam_REAL_NAME} pbbam)
+
+# simple "wrapper worked" check
+configure_file(
+ ${RTestRootDir}/check_swig.R.in
+ ${RTestRootDir}/check_swig.R
+)
+
+add_custom_target(
+ check_swig_R
+ ALL
+ "R" --slave --no-save < ${RTestRootDir}/check_swig.R
+ COMMENT "Checking R wrapper"
+ WORKING_DIRECTORY ${PacBioBAM_RLibDir}
+)
+add_dependencies(check_swig_R ${SWIG_MODULE_PacBioBam_REAL_NAME})
+
+# unit tests
+if(PacBioBAM_build_tests)
+
+ # configure script
+ configure_file(
+ ${RTestRootDir}/test_pbbam.sh.in
+ ${RTestRootDir}/test_pbbam.sh
+ )
+
+ # test runner
+ add_test(
+ NAME RUnitTests
+ COMMAND "sh" ${RTestRootDir}/test_pbbam.sh
+ WORKING_DIRECTORY ${PacBioBAM_RLibDir}
+ )
+endif()
diff --git a/src/swig/ZmwGroupQuery.i b/src/swig/ZmwGroupQuery.i
new file mode 100644
index 0000000..c020eb5
--- /dev/null
+++ b/src/swig/ZmwGroupQuery.i
@@ -0,0 +1,14 @@
+/* ZmwGroupQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/internal/QueryBase.h>
+#include <pbbam/ZmwGroupQuery.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/internal/QueryBase.h>
+%include <pbbam/ZmwGroupQuery.h>
diff --git a/src/swig/ZmwQuery.i b/src/swig/ZmwQuery.i
new file mode 100644
index 0000000..8ad33d7
--- /dev/null
+++ b/src/swig/ZmwQuery.i
@@ -0,0 +1,11 @@
+/* ZmwQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/ZmwQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/ZmwQuery.h>
\ No newline at end of file
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..38dfe39
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,66 @@
+find_package(Threads REQUIRED)
+
+# find samtools binary for comparing against 'gold standard' files
+#set(Samtools_Dir "/Users/derek/development/samtools")
+set(Samtools_Dir "${PacBioBAM_RootDir}/../../../../prebuilt.out/samtools/samtools-0.1.19/ubuntu-1404/bin")
+find_program(Samtools_Bin samtools HINTS ${Samtools_Dir})
+
+# ensure tests directory exists
+file(MAKE_DIRECTORY ${PacBioBAM_TestsDir}/bin)
+file(MAKE_DIRECTORY ${PacBioBAM_TestsDir}/data/temp)
+
+# generate paths/values used by for test
+configure_file(
+ ${PacBioBAM_TestsDir}/src/TestData.h.in
+ ${PacBioBAM_TestsDir}/src/TestData.h
+)
+configure_file(
+ ${PacBioBAM_TestsDir}/data/test_group_query/group.fofn.in
+ ${PacBioBAM_TestsDir}/data/test_group_query/group.fofn
+)
+
+# add PacBioBAM & GoogleTest includes
+include_directories(
+ ${PacBioBAM_INCLUDE_DIRS}
+ ${gtest_SOURCE_DIR}/include
+ ${gtest_SOURCE_DIR}
+)
+
+# grab PacBioBAM test source files
+include(files.cmake)
+set(SOURCES
+ ${PacBioBAMTest_H}
+ ${PacBioBAMTest_CPP}
+)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PacBioBAM_CXX_FLAGS}")
+
+# define test executable
+add_definitions(-DPBBAM_TESTING)
+if(MSVC)
+ # VS2012+ pooh-pooh's Derek's "#define private public" trick
+ add_definitions(-D_ALLOW_KEYWORD_MACROS)
+endif()
+
+if(PacBioBAM_wrap_r)
+ # SWIG R does not support PBBAM_SHARED_PTR, but it does support boost::shared_ptr
+ # So force boost if we're wrapping for R.
+ add_definitions(-DPBBAM_USE_BOOST_SHARED_PTR)
+endif()
+add_executable(test_pbbam ${SOURCES})
+set_target_properties(test_pbbam PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_TestsDir}/bin
+)
+
+# set up unit test to run our executable
+add_test(
+ NAME UnitTests
+ WORKING_DIRECTORY ${PacBioBAM_TestsDir}/bin
+ COMMAND test_pbbam
+)
+add_dependencies(test_pbbam pbbam)
+target_link_libraries(test_pbbam
+ ${PacBioBAM_LIBRARIES}
+ ${CMAKE_THREAD_LIBS_INIT} # quirky pthreads
+ gtest
+ gtest_main
+)
diff --git a/tests/data/aligned.bam b/tests/data/aligned.bam
new file mode 100644
index 0000000..158fa2a
Binary files /dev/null and b/tests/data/aligned.bam differ
diff --git a/tests/data/dataset/ali1.xml b/tests/data/dataset/ali1.xml
new file mode 100644
index 0000000..015068e
--- /dev/null
+++ b/tests/data/dataset/ali1.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments0.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments1.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments1.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSets>
+ <pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+ <pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ <pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ </pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/ali2.xml b/tests/data/dataset/ali2.xml
new file mode 100644
index 0000000..f71e2d2
--- /dev/null
+++ b/tests/data/dataset/ali2.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments2.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments2.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments3.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments3.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSets>
+ <pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+ <pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ <pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ </pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/ali3.xml b/tests/data/dataset/ali3.xml
new file mode 100644
index 0000000..d0dc0d6
--- /dev/null
+++ b/tests/data/dataset/ali3.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments2.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments2.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments3.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments3.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSets>
+ <pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+ <pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.75" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ <pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ </pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/ali4.xml b/tests/data/dataset/ali4.xml
new file mode 100644
index 0000000..015068e
--- /dev/null
+++ b/tests/data/dataset/ali4.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments0.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments1.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments1.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSets>
+ <pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+ <pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ <pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ </pbds:DataSet>
+ </pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/bam_mapping.bam b/tests/data/dataset/bam_mapping.bam
new file mode 100644
index 0000000..00637b9
Binary files /dev/null and b/tests/data/dataset/bam_mapping.bam differ
diff --git a/tests/data/dataset/bam_mapping.bam.bai b/tests/data/dataset/bam_mapping.bam.bai
new file mode 100644
index 0000000..a185e97
Binary files /dev/null and b/tests/data/dataset/bam_mapping.bam.bai differ
diff --git a/tests/data/dataset/bam_mapping.bam.pbi b/tests/data/dataset/bam_mapping.bam.pbi
new file mode 100644
index 0000000..8ad2fd5
Binary files /dev/null and b/tests/data/dataset/bam_mapping.bam.pbi differ
diff --git a/tests/data/dataset/bam_mapping_1.bam b/tests/data/dataset/bam_mapping_1.bam
new file mode 100644
index 0000000..9644940
Binary files /dev/null and b/tests/data/dataset/bam_mapping_1.bam differ
diff --git a/tests/data/dataset/bam_mapping_1.bam.bai b/tests/data/dataset/bam_mapping_1.bam.bai
new file mode 100644
index 0000000..d3d7d59
Binary files /dev/null and b/tests/data/dataset/bam_mapping_1.bam.bai differ
diff --git a/tests/data/dataset/bam_mapping_1.bam.pbi b/tests/data/dataset/bam_mapping_1.bam.pbi
new file mode 100644
index 0000000..11e85a0
Binary files /dev/null and b/tests/data/dataset/bam_mapping_1.bam.pbi differ
diff --git a/tests/data/dataset/bam_mapping_2.bam b/tests/data/dataset/bam_mapping_2.bam
new file mode 100644
index 0000000..419701d
Binary files /dev/null and b/tests/data/dataset/bam_mapping_2.bam differ
diff --git a/tests/data/dataset/bam_mapping_2.bam.bai b/tests/data/dataset/bam_mapping_2.bam.bai
new file mode 100644
index 0000000..32bfe5b
Binary files /dev/null and b/tests/data/dataset/bam_mapping_2.bam.bai differ
diff --git a/tests/data/dataset/bam_mapping_2.bam.pbi b/tests/data/dataset/bam_mapping_2.bam.pbi
new file mode 100644
index 0000000..9c46e0e
Binary files /dev/null and b/tests/data/dataset/bam_mapping_2.bam.pbi differ
diff --git a/tests/data/dataset/bam_mapping_staggered.xml b/tests/data/dataset/bam_mapping_staggered.xml
new file mode 100644
index 0000000..51a8b71
--- /dev/null
+++ b/tests/data/dataset/bam_mapping_staggered.xml
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<pbds:DataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreatedAt="2015-05-13T10:58:26" MetaType="PacBio.DataSet.DataSet" Name="" Tags="" UniqueId="30f72098-bc5b-e06b-566c-8b28dda909a8" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_1.bam">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_1.bam.bai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_2.bam">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_2.bam.bai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSets>
+ <pbds:DataSet CreatedAt="2015-05-13T10:58:26" UniqueId="c5402d06-4643-057c-e300-fe229b4e8909" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_2.bam">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_2.bam.bai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ </pbds:DataSet>
+ <pbds:DataSet CreatedAt="2015-05-13T10:58:26" UniqueId="f8b54a55-5fb7-706f-ab35-39afc9c86924" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_1.bam">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_1.bam.bai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ </pbds:DataSet>
+ </pbds:DataSets>
+</pbds:DataSet>
diff --git a/tests/data/dataset/barcode.dataset.xml b/tests/data/dataset/barcode.dataset.xml
new file mode 100644
index 0000000..3613e20
--- /dev/null
+++ b/tests/data/dataset/barcode.dataset.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:BarcodeSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.BarcodeSet" Name="DataSet_BarcodeSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Barcodes FASTA" Description="Points to an example Barcodes FASTA file." MetaType="BarcodeFile.BarcodeFastaFile" ResourceId="file:///mnt/path/to/barcode.fasta" Tags="Example"/>
+ </pbbase:ExternalResources>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>400</pbds:TotalLength>
+ <pbds:NumRecords>30</pbds:NumRecords>
+ <pbsec:BarcodeConstruction>paired</pbsec:BarcodeConstruction>
+ </pbds:DataSetMetadata>
+</pbds:BarcodeSet>
diff --git a/tests/data/dataset/ccsread.dataset.xml b/tests/data/dataset/ccsread.dataset.xml
new file mode 100644
index 0000000..9baafab
--- /dev/null
+++ b/tests/data/dataset/ccsread.dataset.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:ConsensusReadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.ConsensusReadSet" Name="DataSet_ConsensusReadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First ConsensusRead BAM" Description="Points to an example ConsensusRead BAM file." MetaType="PacBio.ConsensusReadFile.ConsensusReadBamFile" ResourceId="file:///mnt/path/to/ccsreads0.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex MetaType="PacBio.Index.PacBioIndex" ResourceId="file:///mnt/path/to/ccsreads0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second ConsensusRead BAM" Description="Points to another example ConsensusRead BAM file." MetaType="PacBio.ConsensusReadFile.ConsensusReadBamFile" ResourceId="file:///mnt/path/to/ccsreads1.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex MetaType="PacBio.Index.PacBioIndex" ResourceId="file:///mnt/path/to/ccsreads0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+</pbds:ConsensusReadSet>
diff --git a/tests/data/dataset/contig.dataset.xml b/tests/data/dataset/contig.dataset.xml
new file mode 100644
index 0000000..77d7c4e
--- /dev/null
+++ b/tests/data/dataset/contig.dataset.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:ContigSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.ContigSet" Name="DataSet_ContigSet" Tags="AHAcontigs" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First References FASTA" Description="Points to an example references FASTA file." MetaType="PacBio.ReferenceFile.ReferenceFastaFile" ResourceId="file:///mnt/path/to/reference.fasta" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex MetaType="PacBio.Index.SaWriterIndex" ResourceId="file:///mnt/path/to/reference.fasta.sa"/>
+ <pbbase:FileIndex MetaType="PacBio.Index.SamIndex" ResourceId="file:///mnt/path/to/reference.fasta.fai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>5000000</pbds:TotalLength>
+ <pbds:NumRecords>500</pbds:NumRecords>
+ <pbsec:Contigs>
+ <pbsec:Contig Name="gi|229359445|emb|AM181176.4|" Description="Pseudomonas fluorescens SBW25 complete genome|quiver" Length="6722109" Digest="f627c795efad7ce0050ed42b942d408e"/>
+ </pbsec:Contigs>
+ </pbds:DataSetMetadata>
+</pbds:ContigSet>
diff --git a/tests/data/dataset/fofn.fofn b/tests/data/dataset/fofn.fofn
new file mode 100644
index 0000000..71126cc
--- /dev/null
+++ b/tests/data/dataset/fofn.fofn
@@ -0,0 +1,3 @@
+ali1.xml
+ali2.xml
+bam_mapping.bam
diff --git a/tests/data/dataset/hdfsubread_dataset.xml b/tests/data/dataset/hdfsubread_dataset.xml
new file mode 100644
index 0000000..8a0e0e2
--- /dev/null
+++ b/tests/data/dataset/hdfsubread_dataset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:HdfSubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.HdfSubreadSet" Name="DataSet_HdfSubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResourcess>
+ <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads0.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads1.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads1.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResourcess>
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.75" Operator=">" />
+ </pbbase:Properties>
+ </pbds:Filter>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=" />
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>500000</pbds:TotalLength>
+ <pbds:NumRecords>500</pbds:NumRecords>
+ <pbmeta:Collections>
+ <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS2" InstrumentId="43210">
+ <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+ <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+ <pbmeta:RunDetails>
+ <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+ <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+ </pbmeta:RunDetails>
+ <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+ <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+ <pbmeta:WellName>B01</pbmeta:WellName>
+ <pbmeta:Concentration>10</pbmeta:Concentration>
+ <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+ <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+ <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+ <pbmeta:UseCount>0</pbmeta:UseCount>
+ <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+ <pbsample:BioSamplePointers>
+ <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+ </pbsample:BioSamplePointers>
+ </pbmeta:WellSample>
+ <pbmeta:AutomationName>POC Protocol</pbmeta:AutomationName>
+ <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+ <pbmeta:CellIndex>0</pbmeta:CellIndex>
+ <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+ <pbmeta:Primary>
+ <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+ <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+ <pbmeta:SequencingCondition/>
+ <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+ <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+ <pbmeta:CopyFiles>
+ <pbmeta:CollectionFileCopy>Fasta</pbmeta:CollectionFileCopy>
+ </pbmeta:CopyFiles>
+ </pbmeta:Primary>
+ </pbmeta:CollectionMetadata>
+ </pbmeta:Collections>
+ <pbsample:BioSamples>
+ <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+ </pbsample:BioSamples>
+ </pbds:DataSetMetadata>
+</pbds:HdfSubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/lambda_contigs.fasta b/tests/data/dataset/lambda_contigs.fasta
new file mode 100644
index 0000000..509d085
--- /dev/null
+++ b/tests/data/dataset/lambda_contigs.fasta
@@ -0,0 +1,156 @@
+>lambda_NEB3011_contig_1
+GGGCGGCGACCTCGCGGGTTTTCGCTATTTATGAAAATTTTCCGGTTTAAGGCGTTTCCG
+TTCTTCTTCGTCATAACTTAATGTTTTTATTTAAAATACCCTCTGAAAAGAAAGGAAACG
+ACAGGTGCTGAAAGCGAGCTTTTTGGCCTCTGTCGTTTCCTTTCTCTGTTTTTGTCCGTG
+GAATGAACAATGGAAGTCAACAAAAAGCAGCTGGCTGACATTTTCGGTGCGAGTATCCGT
+ACCATTCAGAACTGGCAGGAACAGGGAATGCCCGTTCTGCGAGGCGGTGGCAAGGGTAAT
+GAGGTGCTTTATGACTCTGCCGCCGTCATAAAATGGTATGCCGAAAGGGATGCTGAAATT
+GAGAACGAAAAGCTGCGCCGGGAGGTTGAAGAACTGCGGCAGGCCAGCGAGGCAGATCTC
+CAGCCAGGAACTATTGAGTACGAACGCCATCGACTTACGCGTGCGCAGGCCGACGCACAG
+GAACTGAAGAATGCCAGAGACTCCGCTGAAGTGGTGGAAACCGCATTCTGTACTTTCGTG
+CTGTCGCGGATCGCAGGTGAAATTGCCAGTATTCTCGACGGGCTCCCCCTGTCGGTGCAG
+CGGCGTTTTCCGGAACTGGAAAACCGACATGTTGATTTCCTGAAACGGGATATCATCAAA
+GCCATGAACAAAGCAGCCGCGCTGGATGAACTGATACCGGGGTTGCTGAGTGAATATATC
+GAACAGTCAGGTTAACAGGCTGCGGCATTTTGTCCGCGCCGGGCTTCGCTCACTGTTCAG
+GCCGGAGCCACAGACCGCCGTTGAATGGGCGGATGCTAATTACTATCTCCCGAAAGAATC
+CGCATACCAGGAAGGGCGCTGGGAAACACTGCCCTTTCAGCGGGCCATCATGAATGCGAT
+GGGCAGCGACTACATCCGTGAGGTGAATGTGGTGAAGTCTGCCCGTGTCGGTTATTCCAA
+AATGCTGCTGGGTGTTTATGCCTACTTTATAGAGCATAAGCAGCGCAACACCCTTATCTG
+GTTGCCGACGGATGGTGATGCCGAGAACTTTATGAAAACCCACGTTGAGCCGACTATTCG
+TGATATTCCGTCGCTGCTGGCGCTGGCCCCGTGGTATGGCAAAAAGCACCGGGATAACAC
+GCTCACCATGAAGCGTTTCACTAATGGGCGTGGCTTCTGGTGCCTGGGCGGTAAAGCGGC
+AAAAAACTACCGTGAAAAGTCGGTGGATGTGGCGGGTTATGATGAACTTGCTGCTTTTGA
+TGATGATATTGAACAGGAAGGCTCTCCGACGTTCCTGGGTGACAAGCGTATTGAAGGCTC
+GGTCTGGCCAAAGTCCATCCGTGGCTCCACGCCAAAAGTGAGAGGCACCTGTCAGATTGA
+>lambda_NEB3011_contig_2
+GCGTGCAGCCAGTGAATCCCCGCATTTTATGCGTTTTCATGTTGCCTGCCCGCATTGCGG
+GGAGGAGCAGTATCTTAAATTTGGCGACAAAGAGACGCCGTTTGGCCTCAAATGGACGCC
+GGATGACCCCTCCAGCGTGTTTTATCTCTGCGAGCATAATGCCTGCGTCATCCGCCAGCA
+GGAGCTGGACTTTACTGATGCCCGTTATATCTGCGAAAAGACCGGGATCTGGACCCGTGA
+TGGCATTCTCTGGTTTTCGTCATCCGGTGAAGAGATTGAGCCACCTGACAGTGTGACCTT
+TCACATCTGGACAGCGTACAGCCCGTTCACCACCTGGGTGCAGATTGTCAAAGACTGGAT
+GAAAACGAAAGGGGATACGGGAAAACGTAAAACCTTCGTAAACACCACGCTCGGTGAGAC
+GTGGGAGGCGAAAATTGGCGAACGTCCGGATGCTGAAGTGATGGCAGAGCGGAAAGAGCA
+TTATTCAGCGCCCGTTCCTGACCGTGTGGCTTACCTGACCGCCGGTATCGACTCCCAGCT
+GGACCGCTACGAAATGCGCGTATGGGGATGGGGGCCGGGTGAGGAAAGCTGGCTGATTGA
+CCGGCAGATTATTATGGGCCGCCACGACGATGAACAGACGCTGCTGCGTGTGGATGAGGC
+CATCAATAAAACCTATACCCGCCGGAATGGTGCAGAAATGTCGATATCCCGTATCTGCTG
+GGATACTGGCGGGATTGACCCGACCATTGTGTATGAACGCTCGAAAAAACATGGGCTGTT
+CCGGGTGATCCCCATTAAAGGGGCATCCGTCTACGGAAAGCCGGTGGCCAGCATGCCACG
+TAAGCGAAACAAAAACGGGGTTTACCTTACCGAAATCGGTACGGATACCGCGAAAGAGCA
+GATTTATAACCGCTTCACACTGACGCCGGAAGGGGATGAACCGCTTCCCGGTGCCGTTCA
+CTTCCCGAATAACCCGGATATTTTTGATCTGACCGAAGCGCAGCAGCTGACTGCTGAAGA
+GCAGGTCGAAAAATGGGTGGATGGCAGGAAAAAAATACTGTGGGACAGCAAAAAGCGACG
+CAATGAGGCACTCGACTGCTTCGTTTATGCGCTGGCGGCGCTGCGCATCAGTATTTCCCG
+CTGGCAGCTGGATCTCAGTGCGCTGCTGGCGAGCCTGCAGGAAGAGGATGGTGCAGCAAC
+CAACAAGAAAACACTGGCAGATTACGCCCGTGCCTTATCCGGAGAGGATGAATGACGCGA
+CAGGAAGAACTTGCCGCTGCCCGTGCGGCACTGCATGACCTGATGACAGGTAAACGGGTG
+GCAACAGTACAGAAAGACGGACGAAGGGTGGAGTTTACGGCCACTTCCGTGTCTGACCTG
+AAAAAATATATTGCAGAGCTGGAAGTGCAGACCGGCATGACACAGCGACGCAGGGGACCT
+GCAGGATTTTATGTATGAAAACGCCCACCATTCCCACCCTTCTGGGGCCGGACGGCATGA
+CATCGCTGCGCGAATATGCCGGTTATCACGGCGGTGGCAGCGGATTTGGAGGGCAGTTGC
+GGTCGTGGAACCCACCGAGTGAAAGTGTGGATGCAGCCCTGTTGCCCAACTTTACCCGTG
+GCAATGCCCGCGCAGACGATCTGGTACGCAATAACGGCTATGCCGCCAACGCCATCCAGC
+TGCATCAGGATCATATCGTCGGGTCTTTTTTCCGGCTCAGTCATCGCCCAAGCTGGCGCT
+ATCTGGGCATCGGGGAGGAAGAAGCCCGTGCCTTTTCCCGCGAGGTTGAAGCGGCATGGA
+AAGAGTTTGCCGAGGATGACTGCTGCTGCATTGACGTTGAGCGAAAACGCACGTTTACCA
+TGATGATTCGGGAAGGTGTGGCCATGCACGCCTTTAACGGTGAACTGTTCGTTCAGGCCA
+>lambda_NEB3011_contig_3
+CCTGGGATACCAGTTCGTCGCGGCTTTTCCGGACACAGTTCCGGATGGTCAGCCCGAAGC
+GCATCAGCAACCCGAACAATACCGGCGACAGCCGGAACTGCCGTGCCGGTGTGCAGATTA
+ATGACAGCGGTGCGGCGCTGGGATATTACGTCAGCGAGGACGGGTATCCTGGCTGGATGC
+CGCAGAAATGGACATGGATACCCCGTGAGTTACCCGGCGGGCGCGCCTCGTTCATTCACG
+TTTTTGAACCCGTGGAGGACGGGCAGACTCGCGGTGCAAATGTGTTTTACAGCGTGATGG
+AGCAGATGAAGATGCTCGACACGCTGCAGAACACGCAGCTGCAGAGCGCCATTGTGAAGG
+CGATGTATGCCGCCACCATTGAGAGTGAGCTGGATACGCAGTCAGCGATGGATTTTATTC
+TGGGCGCGAACAGTCAGGAGCAGCGGGAAAGGCTGACCGGCTGGATTGGTGAAATTGCCG
+CGTATTACGCCGCAGCGCCGGTCCGGCTGGGAGGCGCAAAAGTACCGCACCTGATGCCGG
+GTGACTCACTGAACCTGCAGACGGCTCAGGATACGGATAACGGCTACTCCGTGTTTGAGC
+AGTCACTGCTGCGGTATATCGCTGCCGGGCTGGGTGTCTCGTATGAGCAGCTTTCCCGGA
+ATTACGCCCAGATGAGCTACTCCACGGCACGGGCCAGTGCGAACGAGTCGTGGGCGTACT
+TTATGGGGCGGCGAAAATTCGTCGCATCCCGTCAGGCGAGCCAGATGTTTCTGTGCTGGC
+TGGAAGAGGCCATCGTTCGCCGCGTGGTGACGTTACCTTCAAAAGCGCGCTTCAGTTTTC
+AGGAAGCCCGCAGTGCCTGGGGGAACTGCGACTGGATAGGCTCCGGTCGTATGGCCATCG
+ATGGTCTGAAAGAAGTTCAGGAAGCGGTGATGCTGATAGAAGCCGGACTGAGTACCTACG
+AGAAAGAGTGCGCAAAACGCGGTGACGACTATCAGGAAATTTTTGCCCAGCAGGTCCGTG
+AAACGATGGAGCGCCGTGCAGCCGGTCTTAAACCGCCCGCCTGGGCGGCTGCAGCATTTG
+AATCCGGGCTGCGACAATCAACAGAGGAGGAGAAGAGTGACAGCAGAGCTGCGTAATCTC
+CCGCATATTGCCAGCATGGCCTTTAATGAGCCGCTGATGCTTGAACCCGCCTATGCGCGG
+GTTTTCTTTTGTGCGCTTGCAGGCCAGCTTGGGATCAGCAGCCTGACGGATGCGGTGTCC
+GGCGACAGCCTGACTGCCCAGGAGGCACTCGCGACGCTGGCATTATCCGGTGATGATGAC
+GGACCACGACAGGCCCGCAGTTATCAGGTCATGAACGGCATCGCCGTGCTGCCGGTGTCC
+GGCACGCTGGTCAGCCGGACGCGGGCGCTGCAGCCGTACTCGGGGATGACCGGTTACAAC
+GGCATTATCGCCCGTCTGCAACAGGCTGCCAGCGATCCGATGGTGGACGGCATTCTGCTC
+GATATGGACACGCCCGGCGGGATGGTGGCGGGGGCATTTGACTGCGCTGACATCATCGCC
+CGTGTGCGTGACATAAAACCGGTATGGGCGCTTGCCAACGACATGAACTGCAGTGCAGGT
+CAGTTGCTTGCCAGTGCCGCCTCCCGGCGTCTGGTCACGCAGACCGCCCGGACAGGCTCC
+ATCGGCGTCATGATGGCTCACAGTAATTACGGTGCTGCGCTGGAGAAACAGGGTGTGGAA
+ATCACGCTGATTTACAGCGGCAGCCATAAGGTGGATGGCAACCCCTACAGCCATCTTCCG
+GATGACGTCCGGGAGACACTGCAGTCCCGGATGGACGCAACCCGCCAGATGTTTGCGCAG
+AAGGTGTCGGCATATACCGGCCTGTCCGTGCAGGTTGTGCTGGATACCGAGGCTGCAGTG
+TACAGCGGTCAGGAGGCCATTGATGCCGGACTGGCTGATGAACTTGTTAACAGCACCGAT
+GCGATCACCGTCATGCGTGATGCACTGGATGCACGTAAATCCCGTCTCTCAGGAGGGCGA
+ATGACCAAAGAGACTCAATCAACAACTGTTTCAGCCACTGCTTCGCAGGCTGACGTTACT
+GACGTGGTGCCAGCGACGGAGGGCGAGAACGCCAGCGCGGCGCAGCCGGACGTGAACGCG
+CAGATCACCGCAGCGGTTGCGGCAGAAAACAGCCGCATTATGGGGATCCTCAACTGTGAG
+GAGGCTCACGGACGCGAAGAACAGGCACGCGTGCTGGCAGAAACCCCCGGTATGACCGTG
+AAAACGGCCCGCCGCATTCTGGCCGCAGCACCACAGAGTGCACAGGCGCGCAGTGACACT
+GCGCTGGATCGTCTGATGCAGGGGGCACCGGCACCGCTGGCTGCAGGTAACCCGGCATCT
+GATGCCGTTAACGATTTGCTGAACACACCAGTGTAAGGGATGTTTATGACGAGCAAAGAA
+ACCTTTACCCATTACCAGCCGCAGGGCAACAGTGACCCGGCTCATACCGCAACCGCGCCC
+GGCGGATTGAGTGCGAAAGCGCCTGCAATGACCCCGCTGATGCTGGACACCTCCAGCCGT
+AAGCTGGTTGCGTGGGATGGCACCACCGACGGTGCTGCCGTTGGCATTCTTGCGGTTGCT
+GCTGACCAGACCAGCACCACGCTGACGTTCTACAAGTCCGGCACGTTCCGTTATGAGGAT
+GTGCTCTGGCCGGAGGCTGCCAGCGACGAGACGAAAAAACGGACCGCGTTTGCCGGAACG
+GCAATCAGCATCGTTTAACTTTACCCTTCATCACTAAAGGCCGCCTGTGCGGCTTTTTTT
+ACGGGATTTTTTTATGTCGATGTACACAACCGCCCAACTGCTGGCGGCAAATGAGCAGAA
+ATTTAAGTTTGATCCGCTGTTTCTGCGTCTCTTTTTCCGTGAGAGCTATCCCTTCACCAC
+GGAGAAAGTCTATCTCTCACAAATTCCGGGACTGGTAAACATGGCGCTGTACGTTTCGCC
+GATTGTTTCCGGTGAGGTTATCCGTTCCCGTGGCGGCTCCACCTCTGAATTTACGCCGGG
+ATATGTCAAGCCGAAGCATGAAGTGAATCCGCAGATGACCCTGCGTCGCCTGCCGGATGA
+AGATCCGCAGAATCTGGCGGACCCGGCTTACCGCCGCCGTCGCATCATCATGCAGAACAT
+GCGTGACGAAGAGCTGGCCATTGCTCAGGTCGAAGAGATGCAGGCAGTTTCTGCCGTGCT
+TAAGGGCAAATACACCATGACCGGTGAAGCCTTCGATCCGGTTGAGGTGGATATGGGCCG
+CAGTGAGGAGAATAACATCACGCAGTCCGGCGGCACGGAGTGGAGCAAGCGTGACAAGTC
+CACGTATGACCCGACCGACGATATCGAAGCCTACGCGCTGAACGCCAGCGGTGTGGTGAA
+TATCATCGTGTTCGATCCGAAAGGCTGGGCGCTGTTCCGTTCCTTCAAAGCCGTCAAGGA
+GAAGCTGGATACCCGTCGTGGCTCTAATTCCGAGCTGGAGACAGCGGTGAAAGACCTGGG
+CAAAGCGGTGTCCTATAAGGGGATGTATGGCGATGTGGCCATCGTCGTGTATTCCGGACA
+>lambda_NEB3011_contig_4
+GTACGTGGAAAACGGCGTCAAAAAGAACTTCCTGCCGGACAACACGATGGTGCTGGGGAA
+CACTCAGGCACGCGGTCTGCGCACCTATGGCTGCATTCAGGATGCGGACGCACAGCGCGA
+AGGCATTAACGCCTCTGCCCGTTACCCGAAAAACTGGGTGACCACCGGCGATCCGGCGCG
+TGAGTTCACCATGATTCAGTCAGCACCGCTGATGCTGCTGGCTGACCCTGATGAGTTCGT
+GTCCGTACAACTGGCGTAATCATGGCCCTTCGGGGCCATTGTTTCTCTGTGGAGGAGTCC
+ATGACGAAAGATGAACTGATTGCCCGTCTCCGCTCGCTGGGTGAACAACTGAACCGTGAT
+GTCAGCCTGACGGGGACGAAAGAAGAACTGGCGCTCCGTGTGGCAGAGCTGAAAGAGGAG
+CTTGATGACACGGATGAAACTGCCGGTCAGGACACCCCTCTCAGCCGGGAAAATGTGCTG
+ACCGGACATGAAAATGAGGTGGGATCAGCGCAGCCGGATACCGTGATTCTGGATACGTCT
+GAACTGGTCACGGTCGTGGCACTGGTGAAGCTGCATACTGATGCACTTCACGCCACGCGG
+GATGAACCTGTGGCATTTGTGCTGCCGGGAACGGCGTTTCGTGTCTCTGCCGGTGTGGCA
+GCCGAAATGACAGAGCGCGGCCTGGCCAGAATGCAATAACGGGAGGCGCTGTGGCTGATT
+TCGATAACCTGTTCGATGCTGCCATTGCCCGCGCCGATGAAACGATACGCGGGTACATGG
+GAACGTCAGCCACCATTACATCCGGTGAGCAGTCAGGTGCGGTGATACGTGGTGTTTTTG
+ATGACCCTGAAAATATCAGCTATGCCGGACAGGGCGTGCGCGTTGAAGGCTCCAGCCCGT
+CCCTGTTTGTCCGGACTGATGAGGTGCGGCAGCTGCGGCGTGGAGACACGCTGACCATCG
+GTGAGGAAAATTTCTGGGTAGATCGGGTTTCGCCGGATGATGGCGGAAGTTGTCATCTCT
+GGCTTGGACGGGGCGTACCGCCTGCCGTTAACCGTCGCCGCTGAAAGGGGGATGTATGGC
+CATAAAAGGTCTTGAGCAGGCCGTTGAAAACCTCAGCCGTATCAGCAAAACGGCGGTGCC
+TGGTGCCGCCGCAATGGCCATTAACCGCGTTGCTTCATCCGCGATATCGCAGTCGGCGTC
+ACAGGTTGCCCGTGAGACAAAGGTACGCCGGAAACTGGTAAAGGAAAGGGCCAGGCTGAA
+AAGGGCCACGGTCAAAAATCCGCAGGCCAGAATCAAAGTTAACCGGGGGGATTTGCCCGT
+AATCAAGCTGGGTAATGCGCGGGTTGTCCTTTCGCGCCGCAGGCGTCGTAAAAAGGGGCA
+GCGTTCATCCCTGAAAGGTGGCGGCAGCGTGCTTGTGGTGGGTAACCGTCGTATTCCCGG
+CGCGTTTATTCAGCAACTGAAAAATGGCCGGTGGCATGTCATGCAGCGTGTGGCTGGGAA
+AAACCGTTACCCCATTGATGTGGTGAAAATCCCGATGGCGGTGCCGCTGACCACGGCGTT
+TAAACAAAATATTGAGCGGATACGGCGTGAACGTCTTCCGAAAGAGCTGGGCTATGCGCT
+GCAGCATCAACTGAGGATGGTAATAAAGCGATGAAACATACTGAACTCCGTGCAGCCGTA
+CTGGATGCACTGGAGAAGCATGACACCGGGGCGACGTTTTTTGATGGTCGCCCCGCTGTT
+TTTGATGAGGCGGATTTTCCGGCAGTTGCCGTTTATCTCACCGGCGCTGAATACACGGGC
+GAAGAGCTGGACAGCGATACCTGGCAGGCGGAGCTGCATATCGAAGTTTTCCTGCCTGCT
+CAGGTGCCGGATTCAGAGCTGGATGCGTGGATGGAGTCCCGGATTTATCCGGTGATGAGC
+GATATCCCGGCACTGTCAGATTTGATCACCAGTATGGTGGCCAGCGGCTATGACTACCGG
+CGCGACGATGATGCGGGCTTGTGGAGTTCAGCCGATCTGACTTATGTCATTACCTATGAA
+ATGTGAGGACGCTATGCCTGTACCAAATCCTACAATGCCGGTGAAAGGTGCCGGGACCAC
+CCTGTGGGTTTATAAGGGGAGCGGTGACCCTTACGCGAATCCGCTTTCAGACGTTGACTG
+GTCGCGTCTGGCAAAAGTTAAAGACCTGACGCCCGGCGAACTGACCGCTGAGTCCTATGA
diff --git a/tests/data/dataset/lambda_contigs.xml b/tests/data/dataset/lambda_contigs.xml
new file mode 100644
index 0000000..e2bfb18
--- /dev/null
+++ b/tests/data/dataset/lambda_contigs.xml
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<pbds:ReferenceSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreatedAt="2015-05-28T10:56:36" MetaType="PacBio.DataSet.ReferenceSet" Name="" Tags="" UniqueId="596e87db-34f9-d2fd-c905-b017543170e1" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd"><pbbase:ExternalResources><pbbase:ExternalResource ResourceId="file:tests/data/lambda_contigs.fasta" /></pbbase:ExternalResources></pbds:Re [...]
\ No newline at end of file
diff --git a/tests/data/dataset/m150430_142051_Mon_p1_b25.sts.xml b/tests/data/dataset/m150430_142051_Mon_p1_b25.sts.xml
new file mode 100644
index 0000000..abc631c
--- /dev/null
+++ b/tests/data/dataset/m150430_142051_Mon_p1_b25.sts.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><PipeStats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://pacificbiosciences.com/PipelineStats/PipeStats.xsd"><MovieName>m150430_142051_Mon_p1_b25</MovieName><MovieLength>40</MovieLength><NumFramesDropped>-1</NumFramesDropped><NumSequencingZmws>2876</NumSequencingZmws><TraceFileSize>2891592848</TraceFileSize><PulseFileSize>255406259</PulseFileSize><BaseFileSize>44432421</BaseFileSize> [...]
\ No newline at end of file
diff --git a/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam
new file mode 100644
index 0000000..fb08bf9
Binary files /dev/null and b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam differ
diff --git a/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai
new file mode 100644
index 0000000..b87bfa7
Binary files /dev/null and b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai differ
diff --git a/tests/data/dataset/pbalchemy10kbp.xml b/tests/data/dataset/pbalchemy10kbp.xml
new file mode 100644
index 0000000..1b90cec
--- /dev/null
+++ b/tests/data/dataset/pbalchemy10kbp.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pbds:DataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" CreatedAt="2015-05-22T16:56:16" MetaType="PacBio.DataSet.DataSet" Name="" Tags="" UniqueId="58e3f7c5-24c1-b58b-fbd5-37de268cc2f0" Version="2.3.0" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource ResourceId="file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rname" Value="E.faecalis.1" Operator="=" />
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+</pbds:DataSet>
diff --git a/tests/data/dataset/reference.dataset.xml b/tests/data/dataset/reference.dataset.xml
new file mode 100644
index 0000000..953f863
--- /dev/null
+++ b/tests/data/dataset/reference.dataset.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:ReferenceSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.ReferenceSet" Name="DataSet_ReferenceSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First References FASTA" Description="Points to an example references FASTA file." MetaType="PacBio.ReferenceFile.ReferenceFastaFile" ResourceId="file:///mnt/path/to/reference.fasta" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex MetaType="PacBio.Index.SaWriterIndex" ResourceId="file:///mnt/path/to/reference.fasta.sa"/>
+ <pbbase:FileIndex MetaType="PacBio.Index.SamIndex" ResourceId="file:///mnt/path/to/reference.fasta.fai"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>5000000</pbds:TotalLength>
+ <pbds:NumRecords>500</pbds:NumRecords>
+ <pbds:Organism>Tribble</pbds:Organism>
+ <pbds:Ploidy>Diploid</pbds:Ploidy>
+ <pbds:Contigs>
+ <pbds:Contig Name="gi|229359445|emb|AM181176.4|" Description="Pseudomonas fluorescens SBW25 complete genome|quiver" Length="6722109" Digest="f627c795efad7ce0050ed42b942d408e"/>
+ </pbds:Contigs>
+ </pbds:DataSetMetadata>
+</pbds:ReferenceSet>
diff --git a/tests/data/dataset/subread_dataset1.xml b/tests/data/dataset/subread_dataset1.xml
new file mode 100644
index 0000000..ac6325b
--- /dev/null
+++ b/tests/data/dataset/subread_dataset1.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:SubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.SubreadSet" Name="DataSet_SubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd" >
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads0.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads1.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads0.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.75" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>500000</pbds:TotalLength>
+ <pbds:NumRecords>500</pbds:NumRecords>
+ <pbmeta:Collections>
+ <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS" InstrumentId="43210">
+ <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+ <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+ <pbmeta:RunDetails>
+ <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+ <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+ </pbmeta:RunDetails>
+ <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+ <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+ <pbmeta:WellName>B01</pbmeta:WellName>
+ <pbmeta:Concentration>10</pbmeta:Concentration>
+ <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+ <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+ <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+ <pbmeta:UseCount>0</pbmeta:UseCount>
+ <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+ <pbsample:BioSamplePointers>
+ <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+ </pbsample:BioSamplePointers>
+ </pbmeta:WellSample>
+ <pbmeta:Automation>
+ <pbbase:AutomationParameters>
+ <pbbase:AutomationParameter/>
+ </pbbase:AutomationParameters>
+ </pbmeta:Automation>
+ <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+ <pbmeta:CellIndex>0</pbmeta:CellIndex>
+ <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+ <pbmeta:Primary>
+ <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+ <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+ <pbmeta:SequencingCondition/>
+ <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+ <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+ <pbmeta:CopyFiles>
+ <pbmeta:CollectionFileCopy>Bam</pbmeta:CollectionFileCopy>
+ </pbmeta:CopyFiles>
+ </pbmeta:Primary>
+ </pbmeta:CollectionMetadata>
+ </pbmeta:Collections>
+ <pbsample:BioSamples>
+ <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+ </pbsample:BioSamples>
+ </pbds:DataSetMetadata>
+</pbds:SubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/subread_dataset2.xml b/tests/data/dataset/subread_dataset2.xml
new file mode 100644
index 0000000..63da322
--- /dev/null
+++ b/tests/data/dataset/subread_dataset2.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:SubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.SubreadSet" Name="DataSet_SubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd" >
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads2.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads2.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads3.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads3.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.75" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>500000</pbds:TotalLength>
+ <pbds:NumRecords>500</pbds:NumRecords>
+ <pbmeta:Collections>
+ <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS" InstrumentId="43210">
+ <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+ <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+ <pbmeta:RunDetails>
+ <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+ <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+ </pbmeta:RunDetails>
+ <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+ <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+ <pbmeta:WellName>B01</pbmeta:WellName>
+ <pbmeta:Concentration>10</pbmeta:Concentration>
+ <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+ <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+ <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+ <pbmeta:UseCount>0</pbmeta:UseCount>
+ <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+ <pbsample:BioSamplePointers>
+ <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+ </pbsample:BioSamplePointers>
+ </pbmeta:WellSample>
+ <pbmeta:Automation>
+ <pbbase:AutomationParameters>
+ <pbbase:AutomationParameter/>
+ </pbbase:AutomationParameters>
+ </pbmeta:Automation>
+ <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+ <pbmeta:CellIndex>0</pbmeta:CellIndex>
+ <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+ <pbmeta:Primary>
+ <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+ <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+ <pbmeta:SequencingCondition/>
+ <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+ <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+ <pbmeta:CopyFiles>
+ <pbmeta:CollectionFileCopy>Bam</pbmeta:CollectionFileCopy>
+ </pbmeta:CopyFiles>
+ </pbmeta:Primary>
+ </pbmeta:CollectionMetadata>
+ </pbmeta:Collections>
+ <pbsample:BioSamples>
+ <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+ </pbsample:BioSamples>
+ </pbds:DataSetMetadata>
+</pbds:SubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/subread_dataset3.xml b/tests/data/dataset/subread_dataset3.xml
new file mode 100644
index 0000000..00a1786
--- /dev/null
+++ b/tests/data/dataset/subread_dataset3.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:SubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.SubreadSet" Name="DataSet_SubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd" >
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads2.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads2.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads3.bam" Tags="Example">
+ <pbbase:FileIndices>
+ <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads3.pbi"/>
+ </pbbase:FileIndices>
+ </pbbase:ExternalResource>
+ </pbbase:ExternalResources>
+ <pbds:Filters>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ <pbds:Filter>
+ <pbbase:Properties>
+ <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=="/>
+ </pbbase:Properties>
+ </pbds:Filter>
+ </pbds:Filters>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>500000</pbds:TotalLength>
+ <pbds:NumRecords>500</pbds:NumRecords>
+ <pbmeta:Collections>
+ <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS" InstrumentId="43210">
+ <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+ <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+ <pbmeta:RunDetails>
+ <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+ <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+ </pbmeta:RunDetails>
+ <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+ <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+ <pbmeta:WellName>B01</pbmeta:WellName>
+ <pbmeta:Concentration>10</pbmeta:Concentration>
+ <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+ <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+ <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+ <pbmeta:UseCount>0</pbmeta:UseCount>
+ <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+ <pbsample:BioSamplePointers>
+ <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+ </pbsample:BioSamplePointers>
+ </pbmeta:WellSample>
+ <pbmeta:Automation>
+ <pbbase:AutomationParameters>
+ <pbbase:AutomationParameter/>
+ </pbbase:AutomationParameters>
+ </pbmeta:Automation>
+ <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+ <pbmeta:CellIndex>0</pbmeta:CellIndex>
+ <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+ <pbmeta:Primary>
+ <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+ <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+ <pbmeta:SequencingCondition/>
+ <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+ <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+ <pbmeta:CopyFiles>
+ <pbmeta:CollectionFileCopy>Bam</pbmeta:CollectionFileCopy>
+ </pbmeta:CopyFiles>
+ </pbmeta:Primary>
+ </pbmeta:CollectionMetadata>
+ </pbmeta:Collections>
+ <pbsample:BioSamples>
+ <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+ </pbsample:BioSamples>
+ </pbds:DataSetMetadata>
+</pbds:SubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/transformed_rs_subread_dataset.xml b/tests/data/dataset/transformed_rs_subread_dataset.xml
new file mode 100644
index 0000000..6b93870
--- /dev/null
+++ b/tests/data/dataset/transformed_rs_subread_dataset.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pbds:HdfSubreadSet xmlns:uuid="java:java.util.UUID" xmlns:bax="http://whatever"
+ xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:fn="http://www.w3.org/2005/xpath-functions"
+ Name="Subreads from run r001173_42129_130607"
+ MetaType="PacBio.DataSet.SubreadSet"
+ Tags="pacbio.secondary.instrument=RS"
+ Version="0.5"
+ UniqueId="abbc9183-b01e-4671-8c12-19efee534647">
+ <pbbase:ExternalResources>
+ <pbbase:ExternalResource MetaType="PacBio.SubreadFile.BaxFile"
+ ResourceId="file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.0.bax.h5"/>
+ <pbbase:ExternalResource MetaType="PacBio.SubreadFile.BaxFile"
+ ResourceId="file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.1.bax.h5"/>
+ <pbbase:ExternalResource MetaType="PacBio.SubreadFile.BaxFile"
+ ResourceId="file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.2.bax.h5"/>
+ </pbbase:ExternalResources>
+ <pbds:DataSetMetadata>
+ <pbds:TotalLength>50000000</pbds:TotalLength>
+ <pbds:NumRecords>150000</pbds:NumRecords>
+ <pbmeta:Collections>
+ <pbmeta:CollectionMetadata Context="m130608_033634_42129_c100515232550000001823076608221351_s1_p0"
+ InstrumentName="42129"
+ InstrumentId="1">
+ <pbmeta:InstCtrlVer>2.0.1.0.124174</pbmeta:InstCtrlVer>
+ <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2010.124174, HwVer=1.0</pbmeta:SigProcVer>
+ <pbmeta:RunDetails>
+ <pbmeta:RunId>r001173_42129_130607</pbmeta:RunId>
+ <pbmeta:Name>2013-06-07_42129_10kb_Ecoli_201-validation_2</pbmeta:Name>
+ </pbmeta:RunDetails>
+ <pbmeta:WellSample Name="P4-C2_Ecoli_10kb_MBS_stageHS">
+ <pbmeta:PlateId>2013-06-07_42129_10kb_Ecoli_201-validation_2</pbmeta:PlateId>
+ <pbmeta:WellName>P4-C2_Ecoli_10kb_MBS_stageHS</pbmeta:WellName>
+ <pbmeta:Concentration>0</pbmeta:Concentration>
+ <pbmeta:SampleReuseEnabled>false</pbmeta:SampleReuseEnabled>
+ <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+ <pbmeta:SizeSelectionEnabled>
+ false
+ </pbmeta:SizeSelectionEnabled>
+ <pbmeta:UseCount>1</pbmeta:UseCount>
+ <pbmeta:Comments>P4-C2_Ecoli_10kb_MBS_stageHS</pbmeta:Comments>
+ <pbsample:BioSamplePointers>
+ <pbsample:BioSamplePointer>abafd4ed-5cf7-4b83-a869-1a5d239d30e2</pbsample:BioSamplePointer>
+ </pbsample:BioSamplePointers>
+ </pbmeta:WellSample>
+ <pbmeta:AutomationName>MagBead Standard Seq v2</pbmeta:AutomationName>
+ <pbmeta:CollectionNumber>2</pbmeta:CollectionNumber>
+ <pbmeta:CellIndex>1</pbmeta:CellIndex>
+ <pbmeta:CellPac Barcode="10051523255000000182307660822135"/>
+ <pbmeta:Primary>
+ <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+ <pbmeta:ConfigFileName>2-0-0_P4-C2.xml</pbmeta:ConfigFileName>
+ <pbmeta:SequencingCondition/>
+ <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+ <pbmeta:CollectionPathUri>rsy://mp-f030-io/vol54//RS_DATA_STAGING/42129/2013-06-07_42129_10kb_Ecoli_201-validation_2_1173/A01_2/</pbmeta:CollectionPathUri>
+ <pbmeta:CopyFiles>
+ <pbmeta:CollectionFileCopy>Fasta</pbmeta:CollectionFileCopy>
+ </pbmeta:CopyFiles>
+ </pbmeta:Primary>
+ </pbmeta:CollectionMetadata>
+ </pbmeta:Collections>
+ <pbsample:BioSamples>
+ <pbsample:BioSample Name="P4-C2_Ecoli_10kb_MBS_stageHS" Description="P4-C2_Ecoli_10kb_MBS_stageHS"
+ UniqueId="abafd4ed-5cf7-4b83-a869-1a5d239d30e2"/>
+ </pbsample:BioSamples>
+ </pbds:DataSetMetadata>
+</pbds:HdfSubreadSet>
diff --git a/tests/data/ex2.bam b/tests/data/ex2.bam
new file mode 100644
index 0000000..efba168
Binary files /dev/null and b/tests/data/ex2.bam differ
diff --git a/tests/data/ex2.bam.bai b/tests/data/ex2.bam.bai
new file mode 100644
index 0000000..f44c34d
Binary files /dev/null and b/tests/data/ex2.bam.bai differ
diff --git a/tests/data/ex2.sam b/tests/data/ex2.sam
new file mode 100644
index 0000000..b609d6c
--- /dev/null
+++ b/tests/data/ex2.sam
@@ -0,0 +1,3310 @@
+ at HD VN:1.0 SO:coordinate pb:3.0b7
+ at SQ SN:seq1 LN:1575
+ at SQ SN:seq2 LN:1584
+B7_591:4:96:693:509 73 seq1 1 99 36M * 0 0 CACTAGTGGCTCATTGTAAATGTGTGGTTTAACTCG <<<<<<<<<<<<<<<;<<<<<<<<<5<<<<<;:<;7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:152:368:113 73 seq1 3 99 35M * 0 0 CTAGTGGCTCATTGTAAATGTGTGGTTTAACTCGT <<<<<<<<<<0<<<<655<<7<<<:9<<3/:<6): MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:8:5:734:57 137 seq1 5 99 35M * 0 0 AGTGGCTCATTGTAAATGTGTGGTTTAACTCGTCC <<<<<<<<<<<7;71<<;<;;<7;<<3;);3*8/5 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:289:587:906 137 seq1 6 63 36M * 0 0 GTGGCTCATTGTAATTTTTTGTTTTAACTCTTCTCT (-&----,----)-)-),'--)---',+-,),''*, MF:i:-126 Aq:i:63 NM:i:5 UQ:i:38 H0:i:0 H1:i:0
+EAS56_59:8:38:671:758 137 seq1 9 99 35M * 0 0 GCTCATTGTAAATGTGTGGTTTAACTCGTCCATGG <<<<<<<<<<<<<<<;<;7<<<<<<<<7<<;:<5% MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:18:467:281 73 seq1 13 99 35M * 0 0 ATTGTAAATGTGTGGTTTAACTCGTCCCTGGCCCA <<<<<<<<;<<<8<<<<<;8:;6/686&;(16666 MF:i:18 Aq:i:39 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_28:5:296:340:699 137 seq1 13 99 36M * 0 0 ATTGTAAATGTGTGGTTTAACTCGTCCATGGCCCAG <<<<<;<<<;<;<<<<<<<<<<<8<8<3<8;<;<0; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:194:894:408 73 seq1 15 99 35M * 0 0 TGTAAATGTGTGGTTTAACTCGTCCATTGCCCAGC <<<<<<<<<7<<;<<<<;<<<7;;<<<*,;;572< MF:i:18 Aq:i:43 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS188_4:8:12:628:973 89 seq1 18 75 35M * 0 0 AAATGTGTGGTTTAACTCGTCCATGGCCCAGCATT ==;=:;:;;:====;=;===:=======;==;=== MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:68:402:50 137 seq1 22 99 35M * 0 0 GTGTGGTTTAACTCGTCCATGGCCCAGCATTTGGG <<<<<<<<<<<<<<:<<<9<6;9;;&697;7&<55 MF:i:18 Aq:i:66 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_30:6:298:115:564 137 seq1 22 99 35M * 0 0 GTGTGGTTTAACTCGTCCATGGCCCAGCATTAGGG <<<<<<<<<<<<<;<<<;<<<;<<<;<:<<;;5;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:188:662:155 73 seq1 24 99 36M * 0 0 GTGGTTTAACTCGTCCATGGCCCAGCATTAGGGAGC <<<<<<<<<<<<<<<<<<:;<<<4<<+<<14991;4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:225:608:291 73 seq1 28 99 35M * 0 0 TTTAACTCGTCCATGGCCCAGCATTAGGGATCTGT <<<<<<<<<<<<<<8&<<<;6<9;;+2++(%59(< MF:i:18 Aq:i:58 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_66:7:328:397:316 73 seq1 29 99 35M * 0 0 TTAACTCGTCCATGGCCCAGCATTAGGGAGCTGTG <<<<<<<<<<<<<6=<<<;<<5<<<+<15:'<;;4 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:257:960:682 73 seq1 31 75 35M * 0 0 AACTCGTCCATGGCCCAGCATTAGGGAGCTGTGGA <<<<<<<<<<<;<<<<<<<<<<<<<<<<<<9;;9< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:143:69:578 83 seq1 36 98 35M = 185 184 GTACATGGCCCAGCATTAGGGAGCTGTGGACCCCG ===;=====48=844;=;+=5==*57,2+5&,5+5 MF:i:18 Aq:i:35 NM:i:2 UQ:i:38 H0:i:0 H1:i:1
+EAS114_32:5:78:583:499 147 seq1 37 74 35M = 229 227 TCCATGGCCCAGCATTAGGGCGCTGTGGACCCTGC <<8;<<<<<<1<<-1<+8<<&;:555;5-*77/51 MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_93:7:252:171:323 147 seq1 43 99 35M = 234 226 GCCCAGCATTAGGGAGCTGTGGACCCTGCAGCCTG <<<):<<<<<<<<<:<<<&5<<2<562<<<<-7-- MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:106:316:452 83 seq1 49 99 36M = 224 211 CATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTTG ;<<;<<<<;<;;;;7;<;<<<;<<;<<;4:<<;+&+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_589:8:113:968:19 147 seq1 50 99 35M = 219 204 ATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGGGG <<<<;<;<<<<<<:;;;.;;<75;);;;<.2+(;5 MF:i:18 Aq:i:63 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_65:3:321:311:983 83 seq1 51 99 35M = 228 212 TTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGG <<<;<<<<<<<<+;;<47;<9;94430499<88+6 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:155:12:674 147 seq1 52 99 36M = 224 208 TAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<+:9-<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:51:1429:1043 147 seq1 59 99 35M = 209 185 CTGTGGACCCTGCAGCCTGGCTGTGGGGGGCGCCG <<<<<<<<<<<<<:<<<;<<<<:):;<;;-15)+1 MF:i:18 Aq:i:68 NM:i:2 UQ:i:22 H0:i:1 H1:i:0
+B7_591:5:42:540:501 83 seq1 60 99 36M = 224 200 TGTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG <<<<<<<<<<<<<<<<<<<<<<.;<<<<,804,858 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:223:142:410 83 seq1 60 99 35M = 235 210 TGTGGACCCTGCAGCCTGGCTGGGGGGGGCGCAGT <<<<<<<<<<<<<<:<5<<2<<(<:<<<:5,((7( MF:i:18 Aq:i:39 NM:i:2 UQ:i:32 H0:i:0 H1:i:1
+EAS1_108:1:65:787:74 147 seq1 61 88 35M = 213 187 GTGGACCCTGCAGCCTGGCTGGGGGGGGCACGGGG <<<<<8-82<2823;-<;822222888,*(2%2-2 MF:i:18 Aq:i:21 NM:i:5 UQ:i:51 H0:i:0 H1:i:0
+EAS56_61:6:227:259:597 83 seq1 61 99 35M = 248 222 GTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG <<<<<<<<<<;;<<<6;8:68333;<8(8,1,$$+ MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:243:10:911 147 seq1 63 99 35M = 236 208 GGACCCTGCAGCCTGGCTGTGGGGGCCGCTGTGGG <<;<<<<<<<<<<7<<<<<7<<<<<:4<((<%;<+ MF:i:18 Aq:i:64 NM:i:2 UQ:i:22 H0:i:1 H1:i:0
+EAS221_1:2:90:986:1224 147 seq1 67 99 35M = 267 235 CCTGCAGCCTGGCTGTGGGGGCCGCAGCGGGTGGG <<:<<<<<<<<<<<<0<<<<<)<<63<+<<2'<-< MF:i:18 Aq:i:41 NM:i:3 UQ:i:39 H0:i:0 H1:i:1
+EAS54_67:3:175:730:949 147 seq1 70 99 35M = 230 195 GCAGCCTGGCTGTGGGGGCCGCAGTGGCTGAGGGG <<<<<<<<<<8<;<<<<<0(<<;;,<<7<4%7626 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:76:493:708 83 seq1 73 44 35M = 229 191 GCCTGGCTGTGGGGGCACCAGCCGCTGCGGGGGGT <<<<1<<1<;626<;<''+;-'';+2'+;;)6--+ MF:i:-126 Aq:i:44 NM:i:5 UQ:i:34 H0:i:0 H1:i:0
+EAS1_97:7:20:979:96 147 seq1 79 99 35M = 254 210 CTGTGGGGGCCGCAGTGGCTGAGGGGGGGAGGGGC <<<<<<;<<<<<7<<,<<,:;,<<<<17)++':.' MF:i:18 Aq:i:37 NM:i:4 UQ:i:43 H0:i:0 H1:i:1
+EAS114_26:3:284:261:124 147 seq1 79 99 35M = 263 219 CTGTGGGGGCCGCAGTGGGTGAGGGGTGGAGGGGG ============'8====':=+====,=8,8'=++ MF:i:18 Aq:i:39 NM:i:5 UQ:i:64 H0:i:0 H1:i:1
+EAS221_1:2:29:1486:672 83 seq1 79 99 35M = 256 212 CTGTGGGGGCCGCAGTGGCTGAGGGGTGCAGAGCC <<<<<<<<<<<<<;<;<<<<<;<<<<8;;;<8;-; MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:218:877:489 147 seq1 80 10 35M = 250 205 TGTGGGGGCCGCAGTGGCTGGGGGGGGGCGGGCGG <<<<<<<;<<<07640<2<9(<9<<&9%(<(6%%3 MF:i:18 Aq:i:10 NM:i:6 UQ:i:34 H0:i:0 H1:i:0
+EAS51_64:7:242:862:732 73 seq1 95 66 35M = 95 0 GGCTGAGGGGTGCAGAGCCGAGTCACGGGGTTGCC <<<<<<<<<<<<<<<;<<<:<;+<3<::3<';:'; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:242:862:732 133 seq1 95 0 * = 95 0 GGGTCTATGTGAACAAAGGCACTAAACACAGCTGT <<<<<<<<<<8<<<<<78<<<378<<<77755++2 MF:i:-64
+EAS56_57:6:190:289:82 69 seq1 100 0 * = 100 0 CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA <<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<; MF:i:-64
+EAS56_57:6:190:289:82 137 seq1 100 73 35M = 100 0 AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC <<<<<<;<<<<<<<<<<;<<;<<<<;8<6;9;;2; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:190:727:308 83 seq1 103 99 35M = 263 195 GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<844 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:141:80:875 83 seq1 110 99 35M = 265 190 AGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAA <<<<<<<<<<<<<<<<<<<<<<:<<8;<<8+7;-7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:40:1128:1940 147 seq1 112 99 35M = 291 214 CCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACC <<<<<<<<<<<<<<<<<<<;<<5;;<<<9;;;;7: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:290:319:736 69 seq1 113 0 * = 113 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<<<<:7:<.<<<<7<<.<.<<.9*<4<:<4%74 MF:i:-64
+EAS51_62:5:290:319:736 137 seq1 113 73 35M = 113 0 CGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCT ==;=======7====6=;==:;;====66=::27: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:132:493:921 69 seq1 119 0 * = 119 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<<<<<<<<<<<<<<<<<;<<<<77;0<;;6777 MF:i:-64
+B7_597:2:132:493:921 137 seq1 119 75 35M = 119 0 ACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTG <<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;88: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:283:799:560 147 seq1 121 66 35M = 283 197 GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGAC <<<<+<<<<8<<<+<<<<<;<<:07;8;7402447 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:225:195:543 83 seq1 123 99 35M = 299 211 GGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTG <<<<<<<<<<<<<<<<<<<<<<<9<<;::388998 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:114:714:317 83 seq1 126 99 35M = 311 220 TGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5;<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:70:147:84 147 seq1 128 73 35M = 285 192 CCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;(5<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:187:227:818 147 seq1 129 99 35M = 290 196 CAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:77:29:126 83 seq1 131 99 35M = 315 219 GCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCT <<<<<<<<<<3<<<<<<<;;;7<;<<449<-:977 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:327:795:103 83 seq1 133 99 35M = 302 204 ACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:139:117:262 69 seq1 135 0 * = 135 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<7<<<<<<<<<<<<<<<<<<<;<;<<<<<37;3 MF:i:-64
+EAS114_30:3:139:117:262 137 seq1 135 76 35M = 135 0 AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG <<<<;<<<<<<<<<<<<<:<<<<<:<<8<<<<:<: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:29:817:854 73 seq1 135 77 35M = 135 0 AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:29:817:854 133 seq1 135 0 * = 135 0 GTTCTCAAGGTTGTTGCAAGGGGGTTTATGTGAAC <<<<<<<<<<<<<<<1..;:;;;;1%407)07&7. MF:i:-64
+EAS192_3:6:170:169:57 147 seq1 138 99 35M = 296 193 GGCTTGACCTCTGGTGACTGCCAGAGCTGCTGGCC <<<<<;<<<<<<;<<<<<<<<<<<<:<<<<<;;+% MF:i:18 Aq:i:45 NM:i:2 UQ:i:30 H0:i:0 H1:i:1
+B7_595:4:84:802:737 83 seq1 140 68 35M = 284 179 CTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAG <<<<<<<<<<;9<9<<<;<<;73;<<<<<37;1+. MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:78:583:670 147 seq1 142 99 35M = 316 209 TAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCT <<<<<<<<<<;;;<;;<<<:7;5;<5;;<2--8-; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:90:435:691 83 seq1 147 99 35M = 318 206 TCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGT <<<<<<<<<<;<<<;<<<<:<<<;<81;<<1;784 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:13:122:187 147 seq1 153 99 35M = 343 225 GACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCCTT <<<<<<<;<;<<<;<<<<:;6<<<<;;;;:<<%%< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS221_1:6:69:735:1915 83 seq1 154 99 35M = 321 202 ACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTT <<<<<<<<;<<<<<<<<<;<<<<;<8<<<<;1:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:66:959:1311 147 seq1 159 95 35M = 336 212 CAGAGCTGCTGGCAAGCTAGAGGCCCATCTGGAGC ;;4;;;+;;;-01;;&-;;4;;&;;73)(&**274 MF:i:18 Aq:i:31 NM:i:2 UQ:i:12 H0:i:0 H1:i:1
+EAS56_57:6:325:759:288 83 seq1 163 99 35M = 341 213 GCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCT 8<;<<<<81<<<<<;<<;<<<;9</;6;;809034 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:82:926:112 83 seq1 164 99 35M = 328 199 CTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTC <;<<<<<<<<<5<<<<<<<<<<<<<<<;<<1:<4< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:324:728:956 83 seq1 165 99 35M = 322 192 TGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCT <<<<<<<<<<<<<<<<<<<<8<<<:<::;;;;<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:294:525:849 147 seq1 167 99 35M = 340 208 CTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAA <<<<<<<<<<<<<<<<<<<<<<9+<:<<<<9;;15 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:159:125:297 147 seq1 170 99 35M = 337 202 GCAAGCTAGAGTCCCATTTGGAGCCACTCTAAGAC <<<<<<<<<<<<<<;<<<;<;<<6;)<:9;26;39 MF:i:18 Aq:i:43 NM:i:2 UQ:i:26 H0:i:0 H1:i:1
+EAS54_65:6:164:797:930 83 seq1 173 99 35M = 332 194 AGCTAGAGACCCATTTGGAGCCCCTCTAAGCCGTT <<<<<<<<<<<<<<<;;;:<<<<<;<;<<<<<,:: MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_81:7:293:355:321 147 seq1 174 99 35M = 356 217 GCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTC <<<:<;<<<<<<<;<<<<<<<<<;<<;4<<<:+:< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:653:400 147 seq1 175 99 35M = 340 200 CTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCT <;<9<<+<2<9<,;;64;<<<<;8<00*1<48:+8 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:62:1109:804 147 seq1 176 99 35M = 350 209 TAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTA <<<<<<<<<<<<<:<<:<<<<<<:<:<<<<;;;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:303:402:142 147 seq1 181 99 35M = 343 197 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT <8<<<<<<<<<<<<<<<<<<<<<<<46<648;;'; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:321:642:388 147 seq1 181 99 35M = 357 209 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:1:1140:1206 147 seq1 181 99 35M = 368 222 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT ;;;;;;;;;;;;;:9;;7;;:;:;97;:;:88888 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:155:68:326 83 seq1 182 99 36M = 332 186 CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:19:886:279 83 seq1 182 99 35M = 337 190 CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTA <9<<<<<<<<<<<<6<28:<<85<<<<<2<;<9<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:143:69:578 147 seq1 185 98 35M = 36 -184 ATTGGGAGCCCCTCTAAGCCGTTCTATTTGTAATG 222&<21<<<<12<7<01<<<<<0<<<<<<<20<< MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_71:4:13:981:659 149 seq1 187 0 * = 188 35 CGGGACAATGGACGAGGTAAACCGCACATTGACAA +)---3&&3&--+0)&+3:7777).333:<06<<< MF:i:-64
+EAS54_71:4:13:981:659 89 seq1 188 37 34M = 187 -35 TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA ()&)06636;;<664*6;<<<<<<<<<<<<<<<1 MF:i:64 Aq:i:0 NM:i:2 UQ:i:14 H0:i:0 H1:i:1
+B7_610:1:37:652:403 147 seq1 193 99 35M = 347 189 CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT <<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:282:274:50 147 seq1 193 99 35M = 371 213 CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT <<<<<<<<<<<<<<<<<;<<<<<99<9<5909;5; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:133:460:542 83 seq1 195 99 36M = 356 197 CCTATAAGCCGTTCTATTTGTAATGAAAACTATATT <<<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_73:5:44:498:945 83 seq1 195 82 35M = 377 217 CCTATAAGCCGTTCTATTTGTAATGAAAACTATAT ;<;<<<<<<<<<<9<;<:<<<<<<:<<<<;:;<3< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:1:139:152:856 83 seq1 198 99 35M = 392 229 CTAAGCCGTTCTATTTGTAATGAAAACTATATTTA <<<<<<<<;<<<<<<<<<<;<;<<<;<<<<;<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:323:639:311 147 seq1 200 99 36M = 357 193 AAGCCGTTCTATTTGTAATGAAAACTATATTTAGGC <<<<<<<<<<<<<<<<<<<2<<<<<<;<<<<<<81< MF:i:18 Aq:i:70 NM:i:1 UQ:i:23 H0:i:1 H1:i:0
+EAS114_39:2:18:967:582 147 seq1 200 99 35M = 398 233 AAGCCGTTCTATTTGTAATGAAAACTATATTTATG <<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:186:850:838 83 seq1 205 99 35M = 389 219 GTTCTATTTGTAATGAAAACTATATTTATGCTATT <<<<<;<<<<<<<<<<<:<<<<<;<<<;</<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:126:558:408 147 seq1 206 99 35M = 368 197 TTCTATTTGTAATGAAAACTATATTTATGCTATTC <<<<<<<<<<<<<:<<<<<<<<<<<<<<7<;<<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:157:643:175 147 seq1 206 99 35M = 380 209 TTCTATTTGTAATGAAAACTATATTTATGCTATTC <<<<<<<<;<<<<<<<<<<<<<<<<<<<)<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:141:711:813 83 seq1 209 99 35M = 370 196 TATTTGTAATGAAAACTATATTTATGCTATTCAGT <<<<<<<<<<;<<<<<<<<<<<<<<;<<<<<<:+< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:115:538:276 147 seq1 209 99 35M = 360 186 TATTTGTAATGAAAACTATATTTATGCTATTCAGT <<<<<<<<;<<<;;<<<;<:<<<:<<<<<<;;;7; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:51:1429:1043 83 seq1 209 99 35M = 59 -185 TATTTGTAATGAAAACTATATTTATGCTATTCAGT 9<5<<<<<<<<<<<<<9<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:176:168:513 147 seq1 210 99 35M = 410 235 ATTTGTAATGAAAACTATATTTATGCTATTCAGTT <<<<;<<<<<<<<<<<<<<<<<<<:&<<<<:;0;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:282:817:710 83 seq1 211 99 35M = 384 208 TTTGTAATGAAAACTATATTTATGCTATTCAGTTC <<<<<<<<<<<<<<<<<<<<<<<;:<<<<:8,<<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:65:787:74 83 seq1 213 88 35M = 61 -187 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 44848=:1661/66==?:<=:?6><<<<1>><<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:240:264:231 89 seq1 213 66 35M = 213 -35 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 9;,;;62<9<)29<<<;96<<<;<<7<<<<<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:240:264:231 149 seq1 213 0 * = 213 35 CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA %15+5022))0&<<)0)+7:4+&<0<<:0<<<7<< MF:i:-64
+EAS1_93:7:14:426:613 83 seq1 214 99 35M = 379 200 GTAATGAAAACTATATTTATGCTATTCAGTTCTAA ======;=;==========;;==3=;==-=<;<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:173:995:93 147 seq1 215 99 35M = 382 202 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<<<<<<<<<<<<<7:<<<<;:<:<<<<:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:195:348:703 147 seq1 215 99 35M = 353 173 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<;<<<<<;:<<<<<<<<<<<<:<1:<:7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:62:879:264 147 seq1 216 99 35M = 396 215 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:83:452:970 83 seq1 216 99 35M = 379 198 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT ==========================;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:64:1318:1711 83 seq1 218 99 35M = 389 206 TGAAAACTATATTTATGCTATTCAGTTCTAAATAT <<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:113:968:19 83 seq1 219 99 35M = 50 -204 GAAAACTATATTTATGCTATTCAGTTCTAAATATA 8;<;8;9<<<<<<<9<:<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:160:896:275 147 seq1 220 99 35M = 387 202 AAAACTATATTTATGCTATTCAGTTCTAAATATAG ============<====<==<====<==<==;=:6 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:181:191:418 147 seq1 221 99 36M = 387 202 AAACTATATTTATGCTATTCAGTTCTAAATATAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<988 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:242:354:637 83 seq1 222 99 36M = 417 231 AACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<6<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:77:789 147 seq1 223 99 35M = 396 208 ACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<:<4<<9<:7<<<:<<<7<<<<<<<<<<9<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:42:540:501 147 seq1 224 99 36M = 60 -200 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:155:12:674 83 seq1 224 99 36M = 52 -208 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<;<<<<;<<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:106:316:452 147 seq1 224 99 36M = 49 -211 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT :<<<<<;<<<<:<<:<<<<<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:89:525:113 147 seq1 227 78 40M = 397 210 TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG <1<7<6;+0;7;7'<70;-<7<:<:<<5<<:9<5:7:%:7 MF:i:18 Aq:i:39 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS54_65:3:321:311:983 147 seq1 228 99 35M = 51 -212 ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA ;;4;;<7<<<<<<77<<<<<<<<<<17<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:76:493:708 147 seq1 229 44 35M = 73 -191 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA 5/)63.&1517(544(055(0454&7706566679 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:125:628:79 147 seq1 229 99 35M = 400 205 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA ==================<6<====<<:<==7;:: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:78:583:499 83 seq1 229 74 35M = 37 -227 TTTACGCTATTCAGTACTAAATATAGAAATTGAAA &6&9774&<;67<44&-4<;<9<7<<<<<;<<<<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:27 H0:i:0 H1:i:1
+EAS54_67:3:175:730:949 83 seq1 230 99 35M = 70 -195 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC <<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:84:275:1572 147 seq1 230 99 35M = 394 199 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC /6;;;4;;;;;;;;7;;4;.4;;;;;6;;;77077 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:248:753:731 83 seq1 231 99 35M = 402 206 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA <<<<<<<<<<<8<<<<<<<<<<<<:<<<<&<:<.: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:9:1289:215 83 seq1 231 99 35M = 394 198 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA ;;;;;;9;;;67;;;;;99;9;;;;;;;;977747 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:188:802:71 147 seq1 232 99 35M = 415 218 ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG <<<<<<<<<;<<<<<9<<<:<<<:<<<<<<:<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:252:171:323 83 seq1 234 99 35M = 43 -226 GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT ;8<;<=3=6==:====;;======;========== MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:223:142:410 147 seq1 235 99 35M = 60 -210 CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG 8;<<<;<<<<;<<<<<<;<;<<<<<<<<<<<<;<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:243:10:911 83 seq1 236 99 35M = 63 -208 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;<;;;<4;9:<<<;<<;<<<<<;;<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:5:730:1436 147 seq1 236 99 35M = 403 202 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:57:1672:1890 89 seq1 236 75 40M = 236 -40 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA :;;;9<8;;*<<<<<<:<<<<<<<<1:<<<<<<<<<<<7< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:57:1672:1890 149 seq1 236 0 * = 236 40 CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA -+)%)'-'+,,<066,))090+:&486083:5&&:<<5<0 MF:i:-64
+EAS1_105:2:299:360:220 83 seq1 237 99 35M = 403 201 ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG <<<<<<<9<9<<<<<<<<<<<<<<<<<5<;<0<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:24:1037:84 147 seq1 238 99 35M = 415 212 TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<;:<57< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:86:823:683 147 seq1 240 99 35M = 408 203 CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT <<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;9<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:130:568:978 83 seq1 246 88 35M = 434 223 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC 7<<;<<;<7<:;<7<<<<<<<<);4;+<7+3+%;< MF:i:18 Aq:i:24 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS114_45:4:73:1208:495 147 seq1 246 99 35M = 431 220 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC ;;;;;;;;;;;;;;;;;;;;;;;;5;;;;;37377 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:264:642:506 83 seq1 247 99 35M = 420 208 AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT <<;<<<<<<;<<<;:;;:;;<<;<<<<;*+;*&.4 MF:i:18 Aq:i:56 NM:i:3 UQ:i:28 H0:i:1 H1:i:0
+EAS114_28:5:104:350:749 147 seq1 247 99 36M = 415 204 AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <<8<<<<<<<<<<<;<<<<<<<<0;<<<9;<85;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:227:259:597 147 seq1 248 99 35M = 61 -222 AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:113:809:364 83 seq1 250 99 35M = 413 198 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<7<;<;<<<4 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:218:877:489 83 seq1 250 86 35M = 80 -205 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG 9<<<8<<<;<9<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:20:979:96 83 seq1 254 99 35M = 79 -210 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA '9996;(:;-<;1<<<<=<<<<=<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:259:219:114 83 seq1 254 99 35M = 411 192 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA <<<<<<<<<<<<<<<;<<<<<<7<7<<<<<0<<9< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:13:1034:1144 83 seq1 256 99 35M = 429 208 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<<<<<<<<<<<<<<<<<<<<<<<3<<<;<<;<++ MF:i:18 Aq:i:69 NM:i:2 UQ:i:48 H0:i:1 H1:i:0
+EAS221_1:2:29:1486:672 147 seq1 256 99 35M = 79 -212 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<:<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<++ MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS139_11:7:46:695:738 147 seq1 259 74 35M = 428 204 TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG <;<<<<;<<),&4<3<<7&7<0;)).3;79;7<;0 MF:i:-126 Aq:i:74 NM:i:3 UQ:i:18 H0:i:0 H1:i:0
+EAS139_11:8:26:1221:222 147 seq1 261 99 35M = 446 220 AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:190:727:308 147 seq1 263 99 35M = 103 -195 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:284:261:124 83 seq1 263 99 35M = 79 -219 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ===27===.====&===========;;======== MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:141:80:875 147 seq1 265 99 35M = 110 -190 AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA 6/<;84<;<;<<<<<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:24:1135:563 147 seq1 266 99 40M = 446 220 GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC <<<<:<<<<:1:<<<<<<.<<<<<<<<;<;;;43+:30:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:90:986:1224 83 seq1 267 99 35M = 67 -235 CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC <7*37;;;;;;;9<<;<7<<<<<<<<<<<;;<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:287:492:169 83 seq1 269 99 36M = 449 216 GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC <<<7<<<<<<<<<<<<<<<<<<<<<<<8;;<;6<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:48:9:409 83 seq1 271 75 18M5I12M = 464 228 GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:1:87:1222:878 147 seq1 272 10 40M = 435 203 TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA &+6<6&<:<<9<1112<<;)9227</);;;2-79;)/769 MF:i:18 Aq:i:10 NM:i:3 UQ:i:41 H0:i:0 H1:i:0
+B7_591:7:200:192:373 147 seq1 275 75 14M5I17M = 451 212 AGTGCCTTTGTTCACATAGACCCCCTTGCAACAACC <<<<<<<<<<<<<<<<<<<<<<<<<:<:<;5<<;<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_65:1:163:846:223 147 seq1 278 74 11M5I19M = 463 220 GCCTTTGTTCACATAGACCCCCTTGCAACAACCTT <<<<;<<;4<<<;;9<<<<<+<<;<</27;;47;. MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:7:283:799:560 83 seq1 283 66 35M = 121 -197 ACATAGACCCCCTTGCAACAACCTTGAGAACCCCA <4<6<8;;6<<<+;<:<<;<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:66 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_595:4:84:802:737 147 seq1 284 68 35M = 140 -179 CATAGACCCCCTTGCAACAACCTTGAGAACCCCAG +<1<-;69;;;;8;:<<6<;<<<<<<<<<<<<<<< MF:i:-126 Aq:i:68 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_66:5:308:400:602 147 seq1 285 71 35M = 470 220 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG ;<<<<<<<<<<<<<<<<<<<<<<<<;;;<<;<;76 MF:i:-126 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS54_81:2:285:367:932 147 seq1 285 74 35M = 440 190 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG ===========;======;=====;=======5== MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:1:70:147:84 83 seq1 285 73 35M = 128 -192 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG <<<:<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<; MF:i:-126 Aq:i:73 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_62:3:314:386:190 83 seq1 287 98 35M = 459 207 AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA ++<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS56_65:1:53:272:944 83 seq1 287 99 35M = 447 195 CAACCCCCTTGCAACAACCTTGCGAACCCCAGGGA <<<<<<<<<<<<.7<.<<<<<<-<-<<<<<&<222 MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS188_7:5:112:51:128 147 seq1 287 99 35M = 477 225 AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA ++<<<<<<<<<<<<<5<<<<<<<<<<<<<<;<;<6 MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS56_57:6:44:280:641 147 seq1 288 99 35M = 454 201 AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA ;<<<<<<<<<<66<;<<<<<;<<2;;;<<;;;;,; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:75:946:1035 83 seq1 288 99 35M = 480 227 AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA <<<<<<<<<<;<<<;<<<<<<<8;<6<<<<44<:4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:187:227:818 83 seq1 290 99 35M = 129 -196 CCCCCTTGCAACAACCTTGAGAACCCCAGGGAATT <<9<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:40:1128:1940 83 seq1 291 99 35M = 112 -214 CCCCTTACAACAACCTTGAGAACCCCAGGGAATTT <<<:///77:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS54_71:4:72:63:435 83 seq1 293 99 34M = 490 232 CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG <<<<<<<<<<<<<<<<<<<<;<<<;<;;39:7:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:271:244:568 83 seq1 294 99 35M = 481 222 CTTGCAACAACCTTGAGAACCCCAGGGAATTTGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:82:902:868 83 seq1 295 99 35M = 471 211 TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA <<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:313:83:546 147 seq1 296 99 35M = 454 193 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<;<<<<<<<<<<<<<<4<<<:<;<<9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:57:786:414 147 seq1 296 99 35M = 453 192 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<<<<<<<<<<<<<<:<<:<<:;;7<7 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:260:985:520 147 seq1 296 99 35M = 468 207 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<<<<<<<<;:;<<;<:<<<,:1;)<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:170:169:57 83 seq1 296 99 35M = 138 -193 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA 778<:<<<9<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:199:327:965 147 seq1 297 91 35M = 494 232 NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT !,+*+++++++++++*+++++++**)+*+**+(** MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+B7_610:5:147:68:353 147 seq1 299 99 35M = 486 222 AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT <;<;<<7<<<<<<<7<<;;<7<4<8<<<8.;4;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:225:195:543 147 seq1 299 99 35M = 123 -211 AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT ;;8;;+;(<<<<<<<<7;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:303:184:14 147 seq1 301 99 35M = 479 213 CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA <<<<<<8<0<<<<-<-98<<--<<<6;076;75+& MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:326:309:149 147 seq1 301 99 35M = 467 201 CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA <<<<<<<<<<<<<<<<<<<<:<<<<<<<<<;;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:327:795:103 147 seq1 302 99 35M = 133 -204 AACCTTGAGAACCCCAGGGAATTTGTCAATGTCAG ;::;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:110:355:323 83 seq1 303 99 35M = 477 209 ACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGG <<<<<<<<<<<<<<<<<<<<<<<<;<<<<;;<<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:18:1418:237 83 seq1 304 99 35M = 503 234 CCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<7< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:112:203:90 147 seq1 305 99 35M = 470 200 CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA <<:<<<<<<<<.<<<<<<<<<<<<6<:867<8884 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:319:246:304 83 seq1 305 99 35M = 472 202 CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:114:714:317 147 seq1 311 99 35M = 126 -220 AACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGC ;8<;:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:327:991:508 83 seq1 312 99 35M = 495 218 ACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCA <<<<<<<<<<<<<<<<<<<<<;<;:<7:47;:75; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:77:29:126 147 seq1 315 99 35M = 131 -219 ACAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT ()9;;<<<<<<<<<<5<<<7<<<<<<;<<<;7<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS219_1:1:37:1004:1136 83 seq1 315 99 35M = 473 193 CCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT <<<<<<<<<<<<<<;<<<;<<<<<:<<;;369<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:78:583:670 83 seq1 316 99 35M = 142 -209 CAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTT 8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:90:435:691 147 seq1 318 99 35M = 147 -206 GGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGT ;;<;;;+<<:<<<:<;;<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:69:735:1915 147 seq1 321 99 35M = 154 -202 AATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAG <<::<<<7<<<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:324:728:956 147 seq1 322 99 35M = 165 -192 ATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGT <;;;;5;<<0<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:269:280:716 83 seq1 323 99 35M = 490 202 TTTGTCAATGTCAGGGAAGGAGCATTTTTTCAGTT <<<<<<<<<2<<:2:1<<7/2/:3<<<<*<3($<< MF:i:18 Aq:i:58 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_73:3:88:24:744 147 seq1 325 84 35M = 484 194 TGTCAATGTCAGGGAAGGAGCATTTTTGAAGTTTA <7*:<<::.'<<<<:<<:<<'<63'6+'303*%%+ MF:i:18 Aq:i:21 NM:i:5 UQ:i:53 H0:i:0 H1:i:0
+EAS1_108:7:82:926:112 147 seq1 328 99 35M = 164 -199 CAATGTCAGGGAAGGAGCATTTTGTCAGTTGCCAA <1:/<*6<<6<<<<<6<<<<<<4<<<<82<+<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS56_63:7:185:213:330 147 seq1 328 99 35M = 502 209 CAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAA <<<<<<<<<;<<;<<<<<;<<<<;;;<<;<<;<38 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:277:458:330 147 seq1 329 99 36M = 490 197 AATGTCAGGGAAGGAGCCTTTTGTCAGTTACCAAAT <<7<<<<<<<<<2<<<%,<6<&<<,<<<<:<<<<(7 MF:i:18 Aq:i:41 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+B7_595:1:81:1000:375 147 seq1 329 90 35M = 524 230 NATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAA !.............................+.(+. MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS220_1:8:33:672:473 83 seq1 330 99 35M = 515 220 ATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAAT <<<<<<<<7<7<7<<62<<<<66<15*/99*5241 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:164:797:930 147 seq1 332 99 35M = 173 -194 GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGT ;;:;8<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:155:68:326 147 seq1 332 99 36M = 182 -186 GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTG ;<<<:6<<<<<<6<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:202:39:380 83 seq1 334 99 35M = 513 214 CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT <<<<<<<<<<<<<<<<<;<<:;<<18<84:<&<+< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:42:1091:1726 83 seq1 334 99 35M = 502 203 CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT <<<<<<<<<<<<<<<<<<<<<<8<<<<<<8:<.<: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:66:959:1311 83 seq1 336 95 35M = 159 -212 GGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT 67.68:4::6;;;7:6:;:5;8;;<<:;;<;;;;< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:200:559:765 83 seq1 337 99 36M = 521 220 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTAT <<<<<<<<<<<<<<7<<<<<<;<<;;4<7<9;<<-; MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:328:669:662 83 seq1 337 99 34M = 512 210 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT <<<<<<<<<<<<<<<<<<<<<<<<+9;<;;.<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:159:125:297 83 seq1 337 99 35M = 170 -202 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA 89<;;8<<;<;<4<;<8<<<<;;8<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:19:886:279 147 seq1 337 99 35M = 182 -190 GAAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA 9%<2)2.2::<;<<<2<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:67 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+B7_595:1:209:653:400 83 seq1 340 99 35M = 175 -200 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA <69<98<+<<6<<4<<<<</4<<:<4<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:294:525:849 83 seq1 340 99 35M = 167 -208 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA ;<;:;:<;<;<<<3<<<;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:87:1375:1303 147 seq1 340 99 35M = 529 224 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA <<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:325:759:288 147 seq1 341 99 35M = 163 -213 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC 9;<9<;<;;<;<;<;<<<:<;<<<;<<<<<;<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:76:786:458 147 seq1 341 99 35M = 502 196 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC <<.<<<<2<<:84<:<<<:<8<<)<)429<2<<8< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:210:880:606 147 seq1 341 99 35M = 518 212 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT <<<<<<<<<<<<<<<<<<;<<<<<<:<<<<3<<8& MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS192_3:3:257:611:440 83 seq1 341 99 35M = 524 218 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC <<<<<<<<<<<<<<<<<<<<8<<<<;<<<<8<<+5 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:303:402:142 83 seq1 343 99 35M = 181 -197 AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA ;;;;;<9<<8;<<<<7<<;<<<<;<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:13:122:187 83 seq1 343 99 35M = 153 -225 AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA <<&<;;<<<;7<<<<;<;<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:80:885:513 147 seq1 344 99 35M = 507 198 GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG <<<<<<<<<<<<<<<<<<<:<<<<2:<;<<75<7; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:90:1873:89 83 seq1 344 99 35M = 531 222 GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<7<<<7 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:1:37:652:403 83 seq1 347 99 35M = 193 -189 TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG <;<<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:28:701:724 147 seq1 347 99 35M = 521 209 TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG <<<<<<7<<<<<<7::<:<<-<<::::::<747:: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:66:655:769 83 seq1 348 99 35M = 515 202 TTTGTCAGTTACCAAATGTGTTTATTACCAGAGGG 8;<<<<<8<<<<<;<<<7<;<<<<<;<7<27<;;7 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:231:339:551 147 seq1 350 99 35M = 527 212 TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT <<<<<<;<<<<<<;<<<<<<<<<<;5<<46;<;:1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:129:694:359 147 seq1 350 88 35M = 525 210 TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT ============+7=======:==;;;'=;==7;= MF:i:18 Aq:i:43 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+EAS220_1:2:62:1109:804 83 seq1 350 99 35M = 176 -209 TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT <<<<<:<<<::<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:157:935:374 83 seq1 353 99 35M = 512 194 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <<<<<<<<<<;<<;;<<<<<<<<<::8'5++;+11 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:103:111:720 83 seq1 353 99 36M = 512 195 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGAG <<<<<<<<<<<<<<<<<<<<<<<<<5<<<5;<5<:; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:311:100:539 147 seq1 353 99 35M = 508 190 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <<<<;<<<<;<<<<<;<<<<<<<<<:<::;7;<0; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:195:348:703 83 seq1 353 99 35M = 215 -173 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <9<<9</<<<<<<<<<<<<<<2<8<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:72:308:839 147 seq1 354 99 40M = 517 203 AGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG <<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<99494416: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:133:460:542 147 seq1 356 99 36M = 195 -197 TTACCAAATGTGTTTATTACCAGAGGGATGGAGGGA ;:;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:293:355:321 83 seq1 356 99 35M = 174 -217 TTACCAAATGTGTTTATTACCAGAGGGATGGAGGG <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:323:639:311 83 seq1 357 99 36M = 200 -193 TACCAAATGTGTTTATTACCAGAGGGATGGAGGGAA -94<<<<<<<4<<<<<<<<2<<<<<7<<<-<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:321:642:388 83 seq1 357 99 33M = 181 -209 TACCAAATGTGTTTATTACCAGAGGGATGGAGG 19<<<<<8<<<<<<<<;<<<<<<<<<<7<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:4:262:456:74 83 seq1 357 99 35M = 504 182 TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA <<<<<<<<<<<<<<<<<<<<:;;:;7:<::7<7:3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:95:426:791 83 seq1 359 99 35M = 547 223 CCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG <<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<,<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:115:538:276 83 seq1 360 99 35M = 209 -186 CAAATGTGTTTATTACCAGAGGGATGGAGGGAAGA :<<<<<<<<;;<5<<;<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:196:533:921 83 seq1 361 99 35M = 526 200 AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAG =====1========8===:===7======971=3= MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:121:380:656 83 seq1 362 99 35M = 542 215 AATGTGTTTATTACCAGAGGGATGGAGGGAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<:<:<<83<:<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:34:970:1374 83 seq1 363 99 35M = 520 192 ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG <<<<<<<<<<<<<<;7<77;<<;<;;9;;:86::: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:29:1061:574 147 seq1 363 99 35M = 563 235 ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG <<<<<<<<<<<<<<<<<<;<<<<<<;<<8<:<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:124:243:35 83 seq1 364 60 35M = 544 215 TGTGTTTATTACCAGAGGGATGGAGGGAAGAGCGA <<<<<;;<<<<<<:<<<.<<<:++5+:1(;1;$<( MF:i:18 Aq:i:60 NM:i:1 UQ:i:3 H0:i:1 H1:i:0
+EAS114_30:2:272:750:698 147 seq1 365 80 35M = 538 208 GTGTTTATTACCAGAGGGATGGAGGGATGACGGAC <)<<<<<7;<<<4<;7<<<<78068:(%<3*861, MF:i:18 Aq:i:37 NM:i:2 UQ:i:13 H0:i:0 H1:i:1
+EAS56_53:3:126:558:408 83 seq1 368 99 35M = 206 -197 TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT <:<<:;;<<<<<<<<8<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:1:1140:1206 83 seq1 368 99 35M = 181 -222 TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT 77977::99;;;:;;<;;;:;;;<<;<;;;;<;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:141:711:813 147 seq1 370 99 35M = 209 -196 TATTACCAGAGGGATGGAGGGAAGAGGGACGCTGA =<5<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:282:274:50 83 seq1 371 99 35M = 193 -213 ATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAA </7;/:<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:485:482 83 seq1 371 94 35M = 530 194 ATTACCAGAGGGATGAAGGGAAGAGGGACGCTGAA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<:<:89< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_63:1:119:446:185 147 seq1 372 99 35M = 562 225 TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG <<<<<<<7<<<4<<<<9<<54<:<7<5:<::7-5; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:168:69:605 147 seq1 373 67 36M = 565 228 TACCCGAGGGATGGAGGGTAGAGGGACGCTGAAGTG <<<4(<<<<<<<<<<<<<(1<6<-<2<<7<<6<<++ MF:i:18 Aq:i:26 NM:i:4 UQ:i:59 H0:i:0 H1:i:0
+EAS114_32:6:78:909:394 147 seq1 373 81 35M = 554 216 TACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGA <<<<<<8<<<&<<<-<<<14,4;<<-0<2+<)/82 MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:5:41:118:1246 83 seq1 374 99 35M = 548 209 ACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAA <<<<<<<<<<<<<<<<<<<<<<<</<<<<<<1<<( MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:44:498:945 147 seq1 377 82 35M = 195 -217 ATAGGGATGGAGGGAAGAGGGCCGCTGAAGAACTT <%*50<7<4<<<7<,<<.<8/,9<:</<<<;<;<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:15 H0:i:0 H1:i:1
+EAS114_39:5:50:972:1286 147 seq1 377 99 35M = 559 217 AGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTT <<<<<<<<<<<<<<<<<;<<<<<<<<<6<<7:7:; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:82:164:1924 147 seq1 378 99 35M = 542 199 GAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTT <<<<<<<<<<<<<<<<<<<<8<<<<<<3<<'<7<8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:14:426:613 147 seq1 379 99 35M = 214 -200 AGGGAGGGAGGGAAGAGGGACGCTGAAGAACTTTG :<<<<&<<<<<<<<<<<<<<6<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_61:4:83:452:970 147 seq1 379 99 35M = 216 -198 AGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTG <<<39<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:157:643:175 83 seq1 380 99 35M = 206 -209 GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA ;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:61:1797:113 83 seq1 380 99 35M = 551 206 GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA <<<<<<;<<<<;:<3<<<<;;<<<8<<;:<<;3<. MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:90:828:633 147 seq1 381 99 36M = 537 192 GGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATG <<<<<<<<<<<8<;96<;<<<<<99<2<<;<96<8; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:61:433:385 147 seq1 381 99 35M = 579 233 GGATGGAGGGAAGAGGGACGCTGAAGCACTTTGAT <<<<<<<<<<<<<<<<<;<<;<<6<<)91<<;;,; MF:i:18 Aq:i:43 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+EAS1_93:2:173:995:93 83 seq1 382 99 35M = 215 -202 GCTGGAGGGAAGAGGGACGCTGAAGAACTTTGATG <(0<<9<<<7<<<<<<7<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:73 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_71:3:254:32:275 83 seq1 382 99 34M = 575 228 GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT <<<<<<<<<<<<<<<<<<<<<<;;<:<::<:2*< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:282:817:710 147 seq1 384 99 35M = 211 -208 TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC 366=6;======8====:========;======== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:75:217:337 147 seq1 386 99 35M = 568 217 GAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT ;;;;;;;;;;;;;;;;;;8;;;;;;;;;;;88787 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:181:191:418 83 seq1 387 99 36M = 221 -202 AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:160:896:275 83 seq1 387 99 35M = 220 -202 AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTC ;;;9;<<<<<<;<;;<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:88:1656:896 83 seq1 387 99 40M = 538 191 AGGGAAGAGGGATGCTGAAGAACTTTGATGCCCTCTTCTT <<<9<<<<<<<9<<<;<<<<<<<<<;6<<;7<<<<::9:; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_597:8:186:850:838 147 seq1 389 99 35M = 205 -219 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <;<;<;<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:64:1318:1711 147 seq1 389 99 35M = 218 -206 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:78:1478:1446 83 seq1 389 99 35M = 560 206 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<:<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:82:879:246 147 seq1 391 99 35M = 576 220 AAGAGGGACGCTGAAGAATTTTGATGCCCTCTTCT <<<<<<<<<<<<<<<<<<&<<<77<<-<<<6<62< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_610:1:139:152:856 147 seq1 392 99 35M = 198 -229 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT <<<<<;<<<<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:162:503:769 83 seq1 392 99 35M = 571 214 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT ========================:========== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:216:988:883 147 seq1 392 99 35M = 584 227 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT <<<<<<<<<<<<8;<;88<;8;;;;828;8;8;;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:118:523:591 147 seq1 393 99 35M = 563 205 GAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTC <<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<;;<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:3:168:741:680 147 seq1 394 99 35M = 562 203 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC <<<<<<<<<<<<<<<<<<<<<<<<<1<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:9:1289:215 147 seq1 394 99 35M = 231 -198 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC 7747*7;;;;+;;:2;7;:1;;9:;:;:;;:;::; MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:84:275:1572 83 seq1 394 99 35M = 230 -199 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC 777777::7:;74;:;:7;:::;;;;:;;8;;;<; MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:77:789 83 seq1 396 99 35M = 223 -208 GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA 9<;<:<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:62:879:264 83 seq1 396 99 35M = 216 -215 GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA ====:=<============================ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:89:525:113 83 seq1 397 78 40M = 227 -210 GACGCTGAAGAACTTTGATTCCCTCTTCTTCCAAAGATGA );:+4-&<<+<<:<+<)<<<7<8<8:<:<<:<82::<<2< MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_39:2:18:967:582 83 seq1 398 99 35M = 200 -233 ACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAG <:<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:140:522:212 147 seq1 399 99 35M = 568 204 CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA <<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<;95; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:125:628:79 83 seq1 400 99 34M = 229 -205 GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA 95&<<<<<<<63<<<6<<<<8<;<<8<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:185:312:167 147 seq1 401 99 35M = 562 196 CTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATG ===========================;855;=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:248:753:731 147 seq1 402 99 35M = 231 -206 TGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGA 7;55;=,=89=====3===9=======9======= MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:299:360:220 147 seq1 403 99 35M = 237 -201 GAAGAACTTAGATGCCCTCTTCTTCCAAAGATGAA 66<;;4;<<()<<4<<<<<<;<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS114_45:6:5:730:1436 83 seq1 403 99 35M = 236 -202 GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA 7977979;;;;;;;;;7;3<;2<;26;<;<<;;<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:134:868:252 83 seq1 404 99 36M = 595 227 AAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:165:431:857 83 seq1 406 99 35M = 559 188 GAACTTTGATGCCCTCTTCTTCCAAAGATGAAACG <<<<<<<<<<<<<<<<<<<<<<<6&:<7<:76,;; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:86:823:683 83 seq1 408 99 35M = 240 -203 ACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCG <4<<<<<<<<:<<6<<7<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:176:168:513 83 seq1 410 99 35M = 210 -235 TTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTA ;0;;;7:<<<<<<<;<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:259:219:114 147 seq1 411 99 35M = 254 -192 TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA 666<:6/:6::6::<:::<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:84:1013:1074 89 seq1 411 71 35M = 411 -35 TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA 8;;<;8744<7<<4<<47<<<<<<7<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:84:1013:1074 149 seq1 411 0 * = 411 35 GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC <7<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-64
+EAS54_81:7:325:150:465 83 seq1 412 99 35M = 598 221 TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<3;;: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:179:13:782 147 seq1 412 99 35M = 568 191 TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC <<<<<<<<<<<<<<<<<:<<:7<<<<::<7<:-:1 MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:113:809:364 147 seq1 413 99 35M = 250 -198 GATGCCCTCTTCTTCCAAAGATGAAACGCGTAACT ;<;;;<<<:<6<<<::<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:188:802:71 83 seq1 415 99 35M = 232 -218 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC ;;;;<:::<<<<<7<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:204:264:413 83 seq1 415 96 34M = 593 213 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG <<<<<<<<<<<<<;:59<+<<:<<<9<<;:62<) MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:104:350:749 83 seq1 415 99 36M = 247 -204 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCG ;<93;9;<3;<<<;<<<<<;<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:24:1037:84 83 seq1 415 99 35M = 238 -212 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC <;<<;<<<7<<7&<<<<<<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:242:354:637 147 seq1 417 99 36M = 222 -231 CCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT 8<;;;;;<<<8;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:37:761:635 83 seq1 418 99 35M = 581 198 CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT <6<<<<<<6<<<<<<<<<<<<<<<<<8<8<<4<4< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:44:1578:1674 83 seq1 418 99 35M = 573 190 CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT ;<<;<<;<<;;;;;9<;9;;<9:;;<:;9;76669 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:120:63:653 83 seq1 420 99 35M = 598 213 TCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<9<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:264:642:506 147 seq1 420 99 35M = 247 -208 ACTTCATCCAAAGATGAAACGCGTAACTGCGCTCT &;(-/)-1&:<<9<25<<<<2<1<';8<<<:888< MF:i:18 Aq:i:56 NM:i:2 UQ:i:13 H0:i:1 H1:i:0
+EAS188_7:3:101:572:491 83 seq1 425 99 35M = 600 210 TTCCAAAGATGAAACGCGTAACTGCGCTCTCATTC <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<1<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:27:1881:486 147 seq1 427 99 35M = 607 215 CCAAAGATGAAACGCGTAACTGCGCTCTCATTCAC ;;;;;;;;;;;;;;1;;;;;;;;78;8;8;8878/ MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:120:14:944 147 seq1 428 99 35M = 621 228 CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT <<<<<<<<<<<<<<<;<<<<<;<<<<<<<:;8;;7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:46:695:738 83 seq1 428 74 35M = 259 -204 CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT <<<<2<5<<-<<<<<<<4<<<<<<<<<<<<<<3<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:13:1034:1144 147 seq1 429 99 35M = 256 -208 AAAGATGAAACGCGTAACTGCGCTCTCATTCACTC <<:%<9)<<<<<<8<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:91:360:585 83 seq1 430 99 35M = 586 191 AAGATGAAACGCGTAACTGCGCTCTCATTCACTCC <<<<9<<<<<;<<<;<<77<<<;<;;<;;<;<;;< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:73:1208:495 83 seq1 431 99 35M = 246 -220 AGATGAAACGCGTAACTGCGCTCTCATTCACTCCA 8-889<<;<;;:<;<;;;;;;<<;;<;;;;<<;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:16:1081:1894 147 seq1 431 99 35M = 624 228 AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA <<<<<<<<<<<<<<<<<<8<<<<;<<;<<<<<<<+ MF:i:18 Aq:i:45 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS188_4:7:35:408:348 85 seq1 433 0 * = 433 35 GGTTCTCAAGGTTGTTGCAATGGGGTCTATGTGAA .73<;<<:77<<<<<<<<<<-<<;<<<<<<<<<<< MF:i:-64
+EAS188_4:7:35:408:348 153 seq1 433 35 35M = 433 -35 AAGAAACGCGTAACTGCGCTCTCATACACTCCAGC 4,'3<6;)2);<3<-6<;<;7+7<5+<<<7<<<<< MF:i:64 Aq:i:0 NM:i:2 UQ:i:21 H0:i:0 H1:i:1
+EAS56_53:4:130:568:978 147 seq1 434 88 35M = 246 -223 TGAAACGCGAAACTGCACTCTCATTCACTCCAGCT --;066;;62<<<2&<+<+<2;<<2<<<;<<<7<< MF:i:18 Aq:i:24 NM:i:2 UQ:i:27 H0:i:0 H1:i:0
+EAS139_19:1:87:1222:878 83 seq1 435 34 40M = 272 -203 TCAGCGCGTCACTCCGCTCTCATTCACCCCAGCTCCCTGT !!;*:885<&<<<)8&<:<<<8<8<::*<4<88<<<8<<< MF:i:18 Aq:i:10 NM:i:6 UQ:i:42 H0:i:0 H1:i:0
+EAS51_64:6:143:763:480 85 seq1 436 0 * = 436 35 CTGAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA ;<&-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-64
+EAS51_64:6:143:763:480 153 seq1 436 70 35M = 436 -35 AAACGCGTAACTGCGCTCTCATTCACTCCAGCTCC ::3<:6<<<:<<<<7<<<<<<<<)6<<<1<<<<;< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:145:607:216 147 seq1 437 99 35M = 596 194 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC <<<<<<<<8<<<<<<<<<<4<<<7<:<<1<<;;99 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:46:285:790 89 seq1 437 72 35M = 437 -35 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ;;<8<;<<<<88<8<<;;<;<<;<<<<<<<<;<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:46:285:790 149 seq1 437 0 * = 437 35 TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG !!<<3<<<;;<<<<<<<<<;<;7<<7<<<<<<;<< MF:i:-64
+EAS56_59:4:329:577:757 85 seq1 437 0 * = 437 35 TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG !!<<<<9;<:<<;<<<<<<<<;<<<<<<<<<<<<< MF:i:-64
+EAS56_59:4:329:577:757 153 seq1 437 72 35M = 437 -35 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ;;;888;<<<<<<6<<<2;<<<<<<;<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:57:722:347 147 seq1 439 99 35M = 599 195 CGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:285:367:932 83 seq1 440 74 35M = 285 -190 GCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGT 9=5==;=;7===;==;=================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:38:842:395 73 seq1 442 77 35M * 0 0 GTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<93<;9 MF:i:32 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:14:601:624 147 seq1 446 99 35M = 622 211 CTGCGCTCTCATTCACTCCAGCTCCCTGTCAACCC <<1<<<<<<<<<<<<<<<<<3<<::<<7<<1,<:( MF:i:18 Aq:i:69 NM:i:2 UQ:i:18 H0:i:1 H1:i:0
+EAS114_45:3:3:1377:1663 83 seq1 446 99 35M = 626 215 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<;;;;<:;;:<;;<;;<;:;;<;9;;::977676 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:26:1221:222 83 seq1 446 99 35M = 261 -220 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<<<<<<:<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:82:566:1096 83 seq1 446 99 35M = 621 210 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:24:1135:563 83 seq1 446 99 40M = 266 -220 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA 6+96:87<&8<<79:<;<<<<:<<;<<<<<<;;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:53:272:944 147 seq1 447 99 35M = 287 -195 TGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAA &94<4&8.6<6&;<:0:8;;:6;<;:<*<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:287:492:169 147 seq1 449 99 36M = 269 -216 CGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG ;/;6<<<<4(<(<<<<6<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:49:163:904 147 seq1 450 99 35M = 616 201 GCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78958 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:200:192:373 83 seq1 451 75 36M = 275 -212 CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC <<<8<<<4<4<<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:253:285:104 147 seq1 451 99 35M = 627 211 CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA ======================:========7==; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:151:159:43 83 seq1 452 99 35M = 645 228 TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC <<<<<<<;<<<8<<<;<;8<<<<7<77;;79<09+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:1:115:868:887 147 seq1 452 99 35M = 650 233 TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC >>>>>>>>>>>>>>;<>>>>><<>>>;<+<</;;1 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:57:786:414 83 seq1 453 99 35M = 296 -192 CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC ;;;8;1;:<<<<;<::;;<<<<;<;;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:197:170:559 89 seq1 453 71 35M = 453 -35 CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC <:<;;:<5<5<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:197:170:559 149 seq1 453 0 * = 453 35 TTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAACA :;;;;<<<<<<8<<<<<<<<<<<<<<<<<<<<<<< MF:i:-64
+EAS1_103:7:313:83:546 83 seq1 454 99 35M = 296 -193 TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT ;)<994<;<<<<<<<;<<<<<<<<<<<<<<5<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:44:280:641 83 seq1 454 99 35M = 288 -201 TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT 9;<<9;9;;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:60:837:923 147 seq1 457 61 36M = 641 220 TTCACGCCAGCTCCCTGTCACCCAATGGACCTCTGA <<<<<4<<+<<*<<<<88<<<<<'*<4-+<<4&<40 MF:i:18 Aq:i:24 NM:i:2 UQ:i:24 H0:i:0 H1:i:1
+EAS114_45:5:85:401:1190 147 seq1 458 99 35M = 652 229 TCACTCCAGCTCCCTGTCACCCAATGGACCTGTGA 4;;;1;;;;;;.6;;;(;;/;/;3;;;7;(3&063 MF:i:18 Aq:i:55 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:314:386:190 147 seq1 459 98 35M = 287 -207 CACTCCAGCTCCCTGTCACCCAATGGACCTGTGAT 76;%;<<3<9;<69<<<7;;;<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:2:831:692 83 seq1 462 99 35M = 634 207 TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC <<<<<<<<;<<<<<<<<<<9<<:9<<<;;96<796 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:163:846:223 83 seq1 463 74 35M = 278 -220 CCAGCTCCCTGTCACCCAATGGACCTGTGATATCT <7<5<*<<<<0<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:48:9:409 147 seq1 464 75 35M = 271 -228 CAGCTCCCTGTCACCCAATGGACCTGTGATATCTG <<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:134:751:831 83 seq1 465 99 36M = 651 222 AGCTCCCTGTCACCCAATGGACCTGTGATATCTGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<948 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:326:309:149 83 seq1 467 99 35M = 301 -201 CTCCCTGTCACCCAATGGACCTGTGATATCTGGAT ;;<<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:260:985:520 83 seq1 468 99 35M = 296 -207 TCCCTGTCACCCAATGGACCTGTGATATCTGGATT ;9;7<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:112:203:90 83 seq1 470 99 35M = 305 -200 CCTGTCACCCAATGGACCTGTGATATCTGGATTCT ;<;:;<;;;<<<<<<<<<:<<<7<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:308:400:602 83 seq1 470 71 35M = 285 -220 CCTGTCACCCAATGGACCTGTGATATCTGGATTCT ;77;2<<;<7<<;<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:82:902:868 147 seq1 471 99 35M = 295 -211 CTGTCACCCAATGGACCTGTGATATCTGGATTCTG <<;;<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:153:977:200 147 seq1 472 99 35M = 640 203 TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ;<<;<<<<7<<;;;;;<<6<<<<<86;;8<;8;6; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:319:246:304 147 seq1 472 99 35M = 305 -202 TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ;;<;;;<<<<8;<<<<;<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:37:1004:1136 147 seq1 473 99 35M = 315 -193 GTCACCCAATGGACCTGTGATATCTGGATTCTGGG </8<<<<7<+<<<<<<<,<<<<<<<<<6<<<<1<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:59:396:359 83 seq1 474 99 35M = 670 231 TCACCCAATGGACCTGTGATATCTGGATTCTGGGA <<9;;<;<;;;;<;;9;;;;;<;;;;;<;;77677 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:45:1769:1130 147 seq1 476 99 35M = 635 194 ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA ;;;;;;;;;;;;9;;;;;;19;;;9;;;;176777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:110:355:323 147 seq1 477 99 35M = 303 -209 CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT 6069;1<<;4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:28:708:463 83 seq1 477 99 36M = 672 231 CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<:<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:112:51:128 83 seq1 477 99 35M = 287 -225 CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT ;9<;;:<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:303:184:14 83 seq1 479 99 35M = 301 -213 CAATGGACCTGTGATATCTGGATTCTGGGAAATTC :<<.<;;7<:<<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:84:101:328 147 seq1 480 99 35M = 673 228 AATGGACCTGTGATATCTGGATTCTGGGAAATTCT <<<;<<<<<<<<;<<<<<<<<<<:<;;<44;;<;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:228:354:203 83 seq1 480 99 34M = 643 198 AATGGACCTGTGATATCTGGATTCTGGGAAATTC 88<<<8<<<<<<<<<8<<<<<<<<<4<<<4/9/; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:38:856:336 83 seq1 480 99 33M = 656 211 AATGGACCTGTGATATCTGGATTCTGGGAAATT <<<<<<<<<<<;;<;<;<:69<<;<5-500373 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:75:946:1035 147 seq1 480 99 35M = 288 -227 AATGGACCTGTGATATCTGGATTCTGGGAAATTCT <<)4</<5<<<<<<<<<<<<<<<<<<<<<66<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:271:244:568 147 seq1 481 99 35M = 294 -222 ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT ;<<<<<<;<;<<<<<<<<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:129:477:427 83 seq1 481 99 35M = 652 206 ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT <<<<<<<<<<<<<<<<<<;;<<<<::<9<;<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:262:297:601 147 seq1 482 99 35M = 635 188 TGGACCTGTGATATCTGGATTCTGGGAAATTCTTC <<<<;<<9<<57<<7<<<;<<;77-;;53<<;;<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:88:24:744 83 seq1 484 84 35M = 325 -194 GTCCTGTGATATCTGGATTCTGGGAAATTCTTCAT 4%++88;-9<;<<<+8<<<:<;8:<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+B7_610:5:147:68:353 83 seq1 486 99 35M = 299 -222 CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC <<;;<<<<<<<<+;<<;<<0;<<<<;<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS51_78:7:316:961:576 83 seq1 488 65 35M = 666 213 TGTGATATCTGGATTCTGGGAAATTCTTCATCCCG <<<<<<<;<<<<;<<:<<;<;<<:;<9+34;;6%/ MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_61:8:7:171:402 83 seq1 489 99 35M = 682 228 GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG <<<<<<<<<<<<<<<;/<<<<;<<<<<;<<1<<<4 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:277:458:330 83 seq1 490 99 36M = 329 -197 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGAC <<<<<8;<<<1<;7<<<;<<<<<<<<7<<7<<<<;7 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:269:280:716 147 seq1 490 99 35M = 323 -202 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA 6;<;;6:;<<<;64;<<<<<<<<;<<;<<;<<<<< MF:i:18 Aq:i:58 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:72:63:435 147 seq1 490 99 35M = 293 -232 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA ::<;<<<<;;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:46:900:610 83 seq1 491 99 35M = 684 228 GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC <<<<<<<<<<<<;<<<<<<<<<<<<<<<<<;;4;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:467:475 83 seq1 493 99 35M = 683 225 TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC <<<<<<<<<<<<;;;<<<<<<<<<:<<<<:+<<;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:201:959:19 83 seq1 493 99 35M = 681 223 TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC <<<<<<<<<<<<<<;<<<:<;<<;<<;+;+<3494 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:240:593:842 83 seq1 494 99 35M = 660 201 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ============<================9===:= MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:29:381:169 147 seq1 494 99 35M = 641 182 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT <<<<<<<<<<<2<288;<<;<<:4<:<<;&92929 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:199:327:965 83 seq1 494 91 35M = 297 -232 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT <5<:<<<58<:<<<<<<8<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:87:323:895 83 seq1 494 99 35M = 671 212 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ;<<;;;;<<;<959;;;<;:<<;9<;;;4377788 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:327:991:508 147 seq1 495 99 35M = 312 -218 TCTGGATTCTGGGAAATTCTTCATCCTGGACCCTG 0:;::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:6:882:784 147 seq1 496 99 35M = 686 225 CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGA <<<<<<<<<<<<<:<<<<<<<<<<<<:6::::<,2 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:175:705:982 83 seq1 496 89 36M = 660 200 CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG <<<<;<<;<<<<<<<<<<<<<;<<+<:;39;+<40< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:30:92:753 83 seq1 497 99 35M = 673 211 TGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:245:323:744 147 seq1 499 99 35M = 679 215 GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG <;<<<<<<<<<<<<<<<<<<<<<;<+<<<<<<<4< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:76:786:458 83 seq1 502 99 35M = 341 -196 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT ;<;:7<.<<<<<8;<<<<<<<6<;8<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:185:213:330 83 seq1 502 99 35M = 328 -209 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT ;4<<<;<<<<<<<<;<<;;;<<<<9<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:42:1091:1726 147 seq1 502 99 35M = 334 -203 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT 4443838<4<8<87<<3</8<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:12:158:458 83 seq1 503 84 36M = 675 208 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT <77<<<7<<<<<<<<<<<<5<4;<<;5<;;+2<+;; MF:i:18 Aq:i:15 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:277:590:364 147 seq1 503 99 35M = 681 213 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC <<<<<8<<<<<<<<;<<<<<;;<7<<;;7858;;8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:18:1418:237 147 seq1 503 99 35M = 304 -234 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC <<:<<<<<<<<:<<<<<<<<<:<<<<<<<<<<<<: MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:4:262:456:74 147 seq1 504 99 35M = 357 -182 TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT 862;<<<:;<;<<<;;;<<<<;;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:186:989:869 83 seq1 505 99 34M = 655 185 GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT <<<<<<<<<<<<<<<<<<<<7;:<<<<<<<<<$< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:80:885:513 83 seq1 507 99 35M = 344 -198 GAAATTCTTCATCCTGGACCCTGAGAGATTCTGCA <7<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:311:100:539 83 seq1 508 99 35M = 353 -190 AAATTCTTCATCCTGGACCCTGAGAGATTCTGCAG ;<;<<;;<;<<;<<<<<;9<<<;<<<<<<<<9<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:199:511:426 147 seq1 509 99 35M = 669 195 AATTCTTCATCCTGGACCCTGAGAGATTCTGCAGC <<<<<<<<<<<<<<;<<<<<<:<<<<<<<<<;:<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:26:227:1053 83 seq1 510 99 35M = 663 188 ATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:172:622:707 83 seq1 511 99 35M = 685 209 TTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCC <<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<5:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:157:935:374 147 seq1 512 99 35M = 353 -194 TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCA 94988994.<:<+42::<<<<<:<:<4<<<<;<1< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:103:111:720 147 seq1 512 99 36M = 353 -195 TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG ;4<<<;)<<-<9<;<<7<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:328:669:662 147 seq1 512 99 35M = 337 -210 TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA 4<<;<<8<.<88.<<;4<<<<<<<4<.<<<<7<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS51_64:5:202:39:380 147 seq1 513 99 35M = 334 -214 CTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG /92/;2<+2<<<<64<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:66:655:769 147 seq1 515 99 35M = 348 -202 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT 8<<;:69<;:;9<2<*9<;6<<<<<17<;<3+<;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:7:526:343 83 seq1 515 99 35M = 698 218 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT <<<<<<<<<<<<<<<:<<<5<<<<<<5;<<<+8<; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:33:672:473 147 seq1 515 99 35M = 330 -220 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT 5<70<<55<4<24.5<<<<<<<<<6<<<<<<2<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:72:308:839 83 seq1 517 99 40M = 354 -203 ATCGTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT :8:.:<;<<5<<<<<<<<<<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:2 UQ:i:40 H0:i:0 H1:i:1
+EAS56_61:1:210:880:606 83 seq1 518 99 35M = 341 -212 TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA .<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:80:760:490 83 seq1 520 99 34M = 686 201 CTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAG <<<<<<<<<<8<;<7<<<<<<;<;;<2<;<<<1, MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:34:970:1374 147 seq1 520 99 35M = 363 -192 CTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGA <6<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:1:200:559:765 147 seq1 521 99 36M = 337 -220 TGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT 8<;;4<3;<;<<<<<<5<<;;<<98;;<<<<;<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_53:8:28:701:724 83 seq1 521 99 35M = 347 -209 TGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGAT .;..3;8.8<8;<<;9<9<<<7;<<<<<<<<7<<7 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:318:345:156 147 seq1 522 99 35M = 695 208 GGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT <<<<<<<<:<<<<<<<<5<:5<<<3:'<72')*;9 MF:i:18 Aq:i:39 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+B7_595:1:81:1000:375 83 seq1 524 90 35M = 329 -230 ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGC ;8<;+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:13:1155:631 147 seq1 524 99 40M = 668 184 ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTG <<<<<<;<<;<<<<<<;<<<<<9<;<;94<<%<<<7:777 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:257:611:440 147 seq1 524 99 35M = 341 -218 ACCCTGAGAGATTCTGCAGCCCAGATCCAGATTGC 2<;;8<;;<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:6:129:694:359 83 seq1 525 88 35M = 350 -210 CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT 7777<7<7;77+<3<<;<<;<<<<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:6:11:285:1567 147 seq1 525 99 35M = 685 195 CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:1:196:533:921 147 seq1 526 99 35M = 361 -200 CCTGAGAGATTCTGCAGCCCAGATCCAGATTGCTT 7<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:2:6:251:1557 147 seq1 526 99 35M = 700 209 CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:20:492:850 83 seq1 526 78 35M = 694 203 CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT <7<<<<<<<<<<<.<54<7&<<<7<74<2<<<2<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:231:339:551 83 seq1 527 99 35M = 350 -212 CTGAGAGATTCTGCAGCCCAGATCCAGATTGCTTG <;<<;<<<<<<<<<<;:<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:4:68:1122:79 83 seq1 528 99 40M = 687 199 TGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCT <<<<<<<<<<<<<;<<<<;<<<<<<;<<<4;<<4;99::; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:87:1375:1303 83 seq1 529 99 35M = 340 -224 GAGAGATTCTGCAGCCCAGATCCAGATTGCTTGTG :<;<(<<<<<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS220_1:8:46:485:482 147 seq1 530 94 35M = 371 -194 AGAGATTCTGCAGCCCAGATCCAGATTGCTTGTGG <<<<<::<<<<<<<<6<<<<<<<<<6<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_4:7:90:1873:89 147 seq1 531 99 35M = 344 -222 GAGATTCTGCAGCCCAGATCCAGATTGCTTGTGGT <<<<;49<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:5:238:31:968 83 seq1 534 99 35M = 717 218 ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG 9======8====*=====,=1=======<=7:::, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:78:773:660 147 seq1 534 99 36M = 711 213 ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGA <<<<<<<<;<<<<<<<<<8<8<<;<<<;<<;7<<4: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:90:828:633 83 seq1 537 99 36M = 381 -192 CTGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG <<<;<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_30:2:272:750:698 83 seq1 538 80 35M = 365 -208 TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG 0<;8;64;<<<;<;.<+;:<4;4<;<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:3:88:1656:896 147 seq1 538 99 40M = 387 -191 TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCTGC 6/8::*9/*3*'<88<:9*<<<8<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_61:6:126:541:194 147 seq1 540 97 35M = 730 225 CAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGC <<<<<<<<8<<<<<8<<<<<<<<<8<<<428+<80 MF:i:18 Aq:i:43 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS114_28:4:9:55:730 147 seq1 540 99 36M = 722 218 CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT >>=>>+==>>==<==<=8=><:;8/;7</5724-2; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:278:918:892 83 seq1 541 99 35M = 720 214 AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT =============:====================8 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:243:876:758 83 seq1 541 99 35M = 712 206 AGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;78<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_65:5:121:380:656 147 seq1 542 99 35M = 362 -215 GCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTG :;<<;<<1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:82:164:1924 83 seq1 542 99 35M = 378 -199 GCCCAGCACCAGATTGCTTGTGGTCTGACAGGCTG 6<<<<<<-<<<<<<<<<2<<06<9<<<<<1<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS114_30:6:163:312:891 83 seq1 543 99 35M = 709 201 CCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGC <<<<<<<<<;<<<<<<<<<<<<<<<<:;;<;;<;0 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:124:243:35 147 seq1 544 60 35M = 364 -215 GCATATCCAGATTGCTGGTGGTCTGACAGGCAGCA &+<+;<694;+&99<<2<;423<26<-<<<<,<3< MF:i:-126 Aq:i:60 NM:i:2 UQ:i:28 H0:i:0 H1:i:0
+B7_591:1:191:462:705 83 seq1 545 99 36M = 721 212 CAGATCCAGATTGCTTGTGGTCTGACAGGCTGCAAC <<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<::<6 MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:8:95:426:791 147 seq1 547 99 35M = 359 -223 GNTCCAGATTGCTTGTGGTCTGACAGGCTGCAACT !!!!<<<<<;;<<<<;<<;<;;<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:23 H0:i:1 H1:i:0
+EAS218_4:5:41:118:1246 147 seq1 548 99 35M = 374 -209 CTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTG <<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:27:973:518 83 seq1 549 99 35M = 691 177 TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT <<<<<<<<<<<<<<;<<<<7<<<<<<<<88;0:8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:4:679:110 83 seq1 549 99 35M = 705 191 TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT <<<<<<<<<<<<<<<<<<<;<<<<<<<<::<;;:7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:297:283:948 147 seq1 550 99 35M = 727 212 CCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTG <<<<<<<<<<<<<<<<<<<<<<<:<<9;)+1;19- MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:61:1797:113 147 seq1 551 99 35M = 380 -206 CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA <<0<<&<<<<;<<4;;3<;<:<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS188_7:6:205:873:464 83 seq1 552 99 35M = 743 226 AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG <<<<<<<<<7<<<<<<<<<<<<:<<,:<:<<<<:: MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:33:1168:1762 83 seq1 552 99 35M = 728 211 AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG <<<<<<<<<<<<<<<<;<<;<;<<<<<<<<:;2:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:78:909:394 83 seq1 554 81 35M = 373 -216 ATTGCTTGGTGTCTGACAGGCTGCAACTGTGAGCC 6167&+&&/&//734/3<<<9*<;;3<3<;9<<3< MF:i:18 Aq:i:21 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+EAS1_103:2:226:302:758 147 seq1 556 99 35M = 751 230 TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT <<<<<<<;;;,<;<92;66<;))42<&2&(/1!!! MF:i:18 Aq:i:33 NM:i:2 UQ:i:9 H0:i:0 H1:i:1
+EAS114_28:5:206:671:49 147 seq1 557 99 36M = 719 198 GCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCA <<<<<<;<<<<8<<<;;<<<3<<8<8<35+,55;,3 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:165:431:857 147 seq1 559 99 35M = 406 -188 TTGGGGTCTGACAGGCTGCAACTGTGAGCCATCAC ''7'/;'1%0447<<<*<6<<<*<*<<<<6<<<<< MF:i:18 Aq:i:53 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS114_39:5:50:972:1286 83 seq1 559 99 35M = 377 -217 TTGTGGTCTGACAGGCTGCAACTGTGAGCCATCAC :;;7;7;;0<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:288:552:440 147 seq1 560 87 35M = 747 222 TGTGGTCTGACAGGCTGCAACTGTGAGCCTTCCAT <<<<71<77<<<:<<<&<4<<77<16<88&36+%% MF:i:18 Aq:i:26 NM:i:4 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:8:78:1478:1446 147 seq1 560 99 35M = 389 -206 TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA <8,8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:275:851:240 83 seq1 561 99 35M = 743 217 GTGGTCTGACAGGCTGCAACTGTGAGCCATCACAA <<<<<<<<<<<<<<<<<<<<<<<:<<4<7<<<<<< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:185:312:167 83 seq1 562 99 35M = 401 -196 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<8:<8<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:1:119:446:185 83 seq1 562 99 35M = 372 -225 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +70730;<0<77;;<<<<<9<<<<<<9<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:3:168:741:680 83 seq1 562 99 35M = 394 -203 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<5<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:67:1797:1931 83 seq1 562 99 35M = 750 223 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:228:182:717 83 seq1 563 99 35M = 729 201 GGTCTGACAGGCTGCAACTGTGAGCCATCCCCATG <=9============5==5=<,59<=1=<&;&;;7 MF:i:18 Aq:i:66 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS112_34:7:118:523:591 83 seq1 563 99 35M = 393 -205 GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG 4:--&0:67<<8:<<<<<<<<<<<:4<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:29:1061:574 83 seq1 563 99 35M = 363 -235 GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG <87<5<<9<<<66<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:168:69:605 83 seq1 565 67 36M = 373 -228 TCTGACAGGCGGCAACTGTGAGCCATCACAATGAAC '<'<144<0<&<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS221_3:4:90:247:212 83 seq1 567 99 35M = 733 201 TGACAGGCTGCAACTGTGAGCCATCACAATGAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<8< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:140:522:212 83 seq1 568 99 35M = 399 -204 GACAGGCTGCAACTGTGAGCCATCACAATGAACAA :;8;:::<<:<<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:179:13:782 83 seq1 568 99 35M = 412 -191 GACAGTCTACAACTGTGAGCCATCACAATGAACAA &37.3&;3'*<3<;9<9<<5<<<<<<<<<9<<<<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS114_45:3:75:217:337 83 seq1 568 99 35M = 386 -217 GACAGGCTGCAACTGTGAGCCATCACAATGAACAA 4779797;;;<;:4;;<<<77<;;;7<<;<;<;<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:168:528:288 147 seq1 570 99 35M = 740 205 CAGGCTGCAACTGTGAGCCATCACAATGAACAACA <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<;<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:162:503:769 147 seq1 571 99 35M = 392 -214 AGGCTGCAACTGTGAGCCATCACAATGAACAACAG ;:;1;=8=;:+=====;&==7============== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:163:618:570 147 seq1 571 99 35M = 751 215 AGGCTGCAACTGTGAGCCATCACAATGAACAACAG <<<<<<<8<<<<<<<<<<<<<+<.7<<..<;&;8; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:251:121:479 147 seq1 572 99 35M = 750 213 GGCTGCAACTGTGAGCCATCACAATGAACAACAGG <<<<<<<<<<<;:<<<<;:;:<:<;:188;7:<+( MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:44:1578:1674 147 seq1 573 99 35M = 418 -190 GCTGCAACTGTGAGCCATCACAATGAACAACAGGA 62631;;4;;;8;;48;;7;8;;;;;;;;;8;;;; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:263:74:407 147 seq1 574 99 35M = 754 215 CTGCAACTGTGAGCCATCACAATGAACAACAGGAA <<<<2<<<<<<:<<<9<<4<<<<:<<<<9<999.7 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:254:32:275 147 seq1 575 99 35M = 382 -228 TGCAACTGTGAGCCATCACAATGAACAACAGGAAG (6+<;+6:9<<:7:<95<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:82:879:246 83 seq1 576 99 35M = 391 -220 ACAACTGTGAGCCATCACAATGAACAACAGGAAGA %+=661;&===:&==1<5======1========== MF:i:18 Aq:i:43 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_71:4:165:397:25 147 seq1 576 99 35M = 759 217 GCAACTGTGAGCCATCACAATGAACAACAGGAAGA <<7<<<<<<)97<6<:3:60:3+37-37+<:33:3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:148:776:486 147 seq1 578 99 35M = 755 212 AACTGTGAGCCATCACAATGAACAACAGGAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:59:1576:946 83 seq1 578 99 35M = 761 218 AACTGTGAGCCATCACAATGAACAACAGGAAGAAA <:<<<<<<<<<<<<:<:<<<<<<<8<<::1<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:61:433:385 83 seq1 579 99 35M = 381 -233 ACTGTGAGCCATCACAATGAACAACAGGAAGAAAA <*97<<<<&9<<;<&<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:37:761:635 147 seq1 581 99 35M = 418 -198 TGTGAGCCATCACAATGAACAACAGGAAGAAAAGG +37:<088<+<<;<<;<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:178:192:499 147 seq1 582 99 35M = 768 221 GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT <<<<<<<;<1<<<<<<;<<;6<<3666;;;;;/6/ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:93:945:176 83 seq1 582 99 35M = 745 198 GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT <<<<<<<<<<<<<<<<<<<<<;<<<<;;<;:7;<3 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:216:988:883 83 seq1 584 99 35M = 392 -227 AAGCCAACACAATGAACAACAGGAAGAAAAGGTCT (=/1+=&:=&======<==<=============== MF:i:18 Aq:i:68 NM:i:2 UQ:i:12 H0:i:1 H1:i:0
+EAS114_39:1:12:884:219 83 seq1 584 99 35M = 756 207 GAGCCATCACAATGAACAACAGGAAGAAAAGGTCT <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<5:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:61:628:681 147 seq1 586 99 36M = 746 196 GCCATCACAATGAACAACAGGAAGAAAAGGTCTTTC <<<<<<<<<<<<<<<<<<<;<<<<<<<:<<;;;;;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:91:360:585 147 seq1 586 99 35M = 430 -191 GACATCACAATGAACAACAGGAAGAAAAGGTCTTT 5&&<<3:;<<<<<<)<<3<<<<<<<;;<<<<;<<< MF:i:18 Aq:i:67 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS139_11:6:89:1151:1878 83 seq1 587 99 35M = 757 205 CCATCACAATGAACAACAGGAAGAAAAGGTCTTTC <;;<<<<<;;;<<<<4;;::;<;8;;<;;8:<8<4 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:40:1596:1433 83 seq1 587 99 40M = 756 209 CCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG <<<<<<<<<<<<<<<<<<<<<<<<;<<<<1<<<<<::;:: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:4:1620:413 83 seq1 588 99 35M = 768 215 CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA <<<<<<<<<<6<<<6<<<;<6<9-1<;<&66<<<2 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:65:1928:1125 83 seq1 588 99 35M = 784 231 CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA <<;<<<7<<7<;<7<<<<<<<7<<<<;<.-;<+88 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:123:998:248 147 seq1 589 99 35M = 776 222 ATCACAATGAACAACAGGAAGAAAAGGTCTTTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<<68< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:240:603:890 147 seq1 590 99 36M = 740 186 TCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA <<<<<<<<<<<<<<<<<<;<:<<:<<;<<<<<8865 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:20:762:748 147 seq1 591 99 35M = 777 221 CACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:246:313:499 83 seq1 592 99 35M = 757 200 ACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG <<<<<<<<<<<<<;<;<<<<<<<<;<<<<<;;<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:6:7:858:437 83 seq1 593 99 35M = 773 215 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG <<<<<<<<<<<<<<<<<<<<<;<3<<<<<<<<<33 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:150:933:810 147 seq1 593 99 35M = 755 197 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG =================================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:204:264:413 147 seq1 593 96 35M = 415 -213 CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG 1==(4=::;/7::&===;====/=;===;;===== MF:i:18 Aq:i:27 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+EAS139_11:3:65:556:1505 147 seq1 593 99 35M = 790 232 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:62:386:959 83 seq1 594 99 35M = 752 193 AATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGT <<8<<<<;<<<<-<<87;</<;<+<;5<+;;<3;+ MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:134:868:252 147 seq1 595 99 36M = 404 -227 ATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGA <;<<<8<<<<<<<<<<<<<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:252:19:955 83 seq1 596 84 35M = 771 210 TGAACAAAAGGAAGAAAAGGTCTTTCAAAAGGTGA <<<<<<<<<<4<<<<9<<+9)9<<4:9+<<0<909 MF:i:18 Aq:i:41 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_67:4:145:607:216 83 seq1 596 99 35M = 437 -194 TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA /;<<&<<8<<<<<<<<<<<<<;872<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_65:8:140:924:923 147 seq1 597 99 35M = 767 205 GAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGAT <<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<5;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:120:63:653 147 seq1 598 99 35M = 420 -213 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:204:779:181 147 seq1 598 99 35M = 779 216 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<<<<<5<<:<<<<<8<<,<<<<<<<<<<91<91< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:325:150:465 147 seq1 598 99 35M = 412 -221 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<:<<<<<<<<;<:<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:57:722:347 83 seq1 599 99 35M = 439 -195 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:266:842 147 seq1 599 99 35M = 784 220 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT =====)===========8=====7882855355'5 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:183:852:253 147 seq1 599 99 35M = 773 209 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<;;<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:30:887:404 147 seq1 600 99 35M = 789 224 CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG <<<<<<<<<<;<<<<<<<<<<<<<<<<:(<<<7;7 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:101:572:491 147 seq1 600 99 35M = 425 -210 CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG 8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:73:730:487 83 seq1 604 99 35M = 770 201 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT <<<<<<<<<<<<<<<<<<<9<<<<<<:<<<;<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:172:896:83 83 seq1 604 99 34M = 786 217 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT <<<<<<<<<<<<<<<<<:;;+;<<<<<<<<9;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:154:762:630 147 seq1 604 99 35M = 792 223 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:99:756:130 147 seq1 606 99 35M = 798 227 GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:11:360:1577 83 seq1 606 99 35M = 781 210 GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT <<<<<<<<<<<<<<<<<4<;;<<;;<;<<<8<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:27:1881:486 83 seq1 607 99 35M = 427 -215 AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC 99797;;9:<:;;;<;;;;<<<;;;;<;<;;<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:5:497:687 83 seq1 607 99 35M = 789 217 AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:142:63:937 147 seq1 609 99 36M = 777 204 GAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC <<<<<<<<<<<<<<<<<:<<<<<<<<<;<<:<<:<: MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:36:485:632 147 seq1 610 99 36M = 784 210 AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<;<18; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:8:36:927:478 83 seq1 610 99 35M = 798 223 AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC <<<<<<<<<<<<<<<<;<<<<<:<:<<<<8<9;<8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:169:862:829 147 seq1 611 99 35M = 772 195 AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA <<<<<<<<<<<<<<<<<;<<<;<;<<<<:<;;<78 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:63:424:1643 147 seq1 614 99 35M = 798 219 GGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACC ;;<<<<<<;<<<<<<<<<<5;9;<<<<<<<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:20:41:138 83 seq1 615 99 35M = 774 194 GTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCT <<<<<<<<<<<<<<<<<<<<<<<<7<;<<<<<(<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:49:163:904 83 seq1 616 99 35M = 450 -201 TCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTC 79779<<<<<;;;;9;;<<7<;*9<<<7<<;<<;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:135:543:760 83 seq1 619 99 35M = 787 203 TTCAAAAGGTGATGTGTGTTCTCATCAACCTCATA <<<<;;<;<<<<<<<9<<<<<<<<<<<;<<<<5<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:131:742:561 147 seq1 620 99 35M = 790 205 TCAAAAGGTGATGTGTGTTCTCATCAACCTCATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:120:14:944 83 seq1 621 99 35M = 428 -228 CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA :;<<;<;<;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:82:566:1096 147 seq1 621 99 35M = 446 -210 CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA <<<<<<<<<<:<<<<<<<:<<<<<<:<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:14:601:624 83 seq1 622 99 35M = 446 -211 AAAAGGTGATGTGTGTTCTCATCAACCTCATACAC 1;;;;==5===.(=9=5=========8====;=== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:5:538:401 83 seq1 624 99 40M = 788 204 AAGGTGATGTGTGTTCTCATCAACCTCATACACACACATG <<<<;<<<<<<<<<<<<<<<;<::7<<;<53:<98;;;;; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:16:1081:1894 83 seq1 624 99 35M = 431 -228 AAGGTGATGTGTGTTCTCATCAACCTCATACACAC ;5;;&<;<<<<<<<<;<;<<;<<<;<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:3:1377:1663 147 seq1 626 99 35M = 446 -215 GGTGATGTGTGTTCTCATCAACCTCATACACACAC 6-88663;8;81;;66;8;;89939;;;67;2;;; MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:253:285:104 83 seq1 627 99 35M = 451 -211 GTGATGTGTGTTCTCATCAACCTCATACACACACA 2<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:66:1282:1215 83 seq1 627 99 35M = 794 202 GTGATGTGTGTTCTCATCAACCTCATACACACACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:2:1200:1076 147 seq1 629 99 35M = 786 192 GATGTGTGTTCTCATCAACCTCATACACACACATG ;;;;;;;;;;/;;;;;;;;6;;9;489;;;88888 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:194:688:289 83 seq1 631 99 35M = 795 199 TGTGTGTTCTCATCAACCTCATACACACACATGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:19:855:491 83 seq1 631 99 35M = 783 187 TGTGTGTTCTCATCAACCTCATACACACACATGGT <<<<<<<<<<<;<<.:<<<<;;;<4<:<:<7<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:215:133:909 83 seq1 631 99 34M = 789 193 TGTGTGTTCTCATCAACCTCATACACACACATGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<996( MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:35:378:681 83 seq1 632 99 35M = 812 215 GTGTGTTCTCATCAACCTCATACACACACATGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:40:758:116 147 seq1 632 99 40M = 814 222 GTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:7262 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:2:831:692 147 seq1 634 99 35M = 462 -207 GTGTTCTCATCAACCTCATACACACACATGGTTTA 2749'979<9<<<6;<<<0<;<<<<<3<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:162:594:858 83 seq1 634 99 35M = 818 219 GTGTTCTCATCAACCTCATACACACACATGGTTTA <<<<<<<<<<<<<<<<<9<;<<<<<<<<<<3<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:233:478:792 83 seq1 634 99 35M = 791 192 GTGTTCTCATCAACCTCATACACACACATGGTTTA <<<<<<<<<<<<<<<<<<<+<<<<<<<9<<<+;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:262:297:601 83 seq1 635 99 35M = 482 -188 TGTTCTCATCAACCTCATACACACACATGGTTTAG ;;<26;;;<;<7;<<<<<99<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:45:1769:1130 83 seq1 635 99 35M = 476 -194 TGTTCTCATCAACCTCATACACACACATGGTTTAG 88989;<;97;9<<;<;;;;9<98<<<<<<<;<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:153:977:200 83 seq1 640 99 35M = 472 -203 TCATCAACCTCATACACACACATGGTTTAGGGGTA 1:<83<<9;;9<<9;;<<;<<;;;;<;;<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:60:837:923 83 seq1 641 61 36M = 457 -220 CATCAACCGCATACACTCACATGGTTTAGGGGTATA 0<4<<<02.<99+<+&!<<<<+<<<<<<<<<<<<3< MF:i:18 Aq:i:24 NM:i:2 UQ:i:13 H0:i:0 H1:i:0
+EAS51_66:3:29:381:169 83 seq1 641 99 35M = 494 -182 CATCAACCTCATACACACACATGGTTTAGGGGTAT 2<82<;66<:<;<:<;<;<8<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:96:836:737 83 seq1 642 99 35M = 841 234 ATCAACCTCATACACACACATGGTTTAGGGGTATA <<<<<<71<<<<<<<<<<899<:5<<<96858<<. MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:228:354:203 147 seq1 643 99 35M = 480 -198 TCAACCTCATACACACACATGGTTTAGGGGTATAA %1<851<5<<<982<<<<<<<<::<<<<7<<<<3< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:151:159:43 147 seq1 645 99 35M = 452 -228 AACCTCATACACACACATGGTTTAGGGGTATAATA ;;4;6<<;<<<<7<77<6;<6<<<<<;;<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:182:404:693 147 seq1 646 99 35M = 812 201 ACCTCATACACACACATGGTTTAGGGGTATAATAC <<<<<<<<<<<<<<<<<<<<<<:::<6<;<94;77 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:4:841:339 147 seq1 646 99 35M = 793 182 ACCTCATACACACACATGGTTTAGGGGTATAATAC <<<<<<<<<<<<<<<<<;<7<<&;;<5<+<;7<<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:156:857:494 147 seq1 648 99 35M = 838 225 CTCATACACACACATGGTTTAGGGGTATAATACCT <<<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<:<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:165:464:123 83 seq1 650 99 35M = 814 199 CATACACACACATGGTTTAGGGGTATAATACCTCT ===============7==============8==== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:1:115:868:887 83 seq1 650 99 35M = 452 -233 CATACACACACATGGTTTAGGGGTATAATACCTCT ==;==8=;=;========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:134:751:831 147 seq1 651 99 36M = 465 -222 ATACACACACATGGTTTAGGGGTATAATACCTCTAC ;:<4<8<<<;<;<<5<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:192:716:235 147 seq1 651 99 35M = 798 182 ATACACACACATGGTTTAGGGGTATAATACCTCTA ======================9==:<==:;;69; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:40:594:752 83 seq1 651 99 35M = 831 215 ATACACACACATGGTTTAGGGGTATAATACCTCTA <<<<<<<<<<;<<<;<<<::;<:;<;:<;;;<;<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:184:17:636 89 seq1 652 76 35M = 652 -35 TACACACACATGGTTTAGGGGTATAATACCTCTAC 8<89<<:<<<;;;<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:184:17:636 149 seq1 652 0 * = 652 35 TTTTTTTTTTTTTTTTTTTTTTTTTTTTCACAGGT !!!!!!!!!!!!!!!!!!!!!!!!!!!77777777 MF:i:-64
+EAS1_108:8:129:477:427 147 seq1 652 99 35M = 481 -206 TACACACACATGGTTTAGGGGTATAATACCTCTAC <<<9;<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:130:912:658 147 seq1 652 99 35M = 841 224 TACACACACATGGTTTAGGGGTATAATACCTCTAC <<<<<;<<<<<<;<<<<<<<<<<<<<<<<<7<;;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:85:401:1190 83 seq1 652 99 35M = 458 -229 TACACACACATGGTTTAGGGGTATAATACCTCTAC 64778:;69739:;+9::7;;;<;6<;7;;;;;7< MF:i:18 Aq:i:55 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:4:1502:1911 147 seq1 652 99 40M = 802 190 TACACACACATGGTTTAGGGGTATAATACCTCTACATGGC <<<:4<<<<<<;<<<<;9;5<95<;<<;9+;1612:1::: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:198:691:595 147 seq1 655 99 35M = 847 227 ACACACATGGTTTAGGGGTATAATACCTCTACATG ==============&===============;7;=1 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:186:989:869 147 seq1 655 99 35M = 505 -185 ACACACATGGTTTAGGGGTATAATACCTCTACATG ;<<;:<<<7:<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:38:856:336 147 seq1 656 99 35M = 480 -211 CACACATGGTTTAGGGGTATAATACCTCTACATGG 2;4;4<:;6:5:<<;:;<<;<<;<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:49:271:588 147 seq1 658 99 35M = 830 207 CACATGGTTTAGGGGTATAATACCTCTACATGGCT <<<<<<<<<<<<<<5:<<<<<<:<<<<<<<:7%9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:240:593:842 147 seq1 660 99 35M = 494 -201 CATGGTTTAGGGGTATAATACCTCTACATGGCTGA *<<<;<<6<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:175:705:982 147 seq1 660 89 36M = 496 -200 CATGGTTTAGGGGTATAATACCTCTACATGGCTGAT ')'''''')'''''*')*)'*)')))+,'*)+'*,! MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS221_3:6:26:227:1053 147 seq1 663 99 35M = 510 -188 GGTTTAGGGGTATAATACCTCTACATGGCTGATTA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:316:961:576 147 seq1 666 65 35M = 488 -213 TTACGGGTGTAATCTCTCTACATGGCTAATTATGA (++%%+++),+,+*++,+,,-,**+,-&-,+-+-- MF:i:-126 Aq:i:65 NM:i:5 UQ:i:36 H0:i:0 H1:i:0
+EAS56_63:5:96:788:614 147 seq1 667 99 35M = 862 230 TAGGGGTATAATACCTCTACATGGCTGATTATGAA <<<<<<<<<<<<<<<<<<<<<<;6;<<;;<;;7;9 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:13:1155:631 83 seq1 668 99 40M = 524 -184 AGGGGTATAATACCTCTACATGGCTGATTATGAAAACAAT ;:398<<;<<<<<;<3<;;<<<<;;<<<<<<<<<<;<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:199:511:426 83 seq1 669 99 35M = 509 -195 GGGGTATAATACCTCTACATGGCTGATTATGAAAA <:7:<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:124:241:608 83 seq1 670 99 35M = 856 221 GGGTATAATACCTCTACATGGCTGATTATGAAAAC <<<<<<<<<;<<<<<<<<<;;<<<;<<<<;;8;;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:59:396:359 147 seq1 670 99 35M = 474 -231 GGGTATAATACCTCTACATGGCTGATTATGAAAAC 28288;;;;;;;;;::;;;;:;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:87:323:895 147 seq1 671 99 35M = 494 -212 GGTATAATACCTCTACATGGCTGATTATGAAAACA 55777;;;939;9;;9;;;;9;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:28:708:463 147 seq1 672 99 36M = 477 -231 GTATAATACCTCTACATGGCTGATTATGAAAACAAT ;;<;<<====3=====5=================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:84:101:328 83 seq1 673 99 35M = 480 -228 TATAATACCTCTACATGGCTGATTATGAAAACAAT <<<<<<<<:<<<<<<<<<6<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:30:92:753 147 seq1 673 99 35M = 497 -211 TATAATACCTCTACATGGCTGATTATGAAAACAAT <<<<<<;<<<<<<:<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:8:88:90:59 73 seq1 674 37 35M = 674 0 ATAATACCTCTACATGTCTGATTATGAAAACAATG <<<<<<<4;7;<<<;;47;&9..1;6&4<755;1; MF:i:64 Aq:i:0 NM:i:1 UQ:i:19 H0:i:0 H1:i:1
+EAS112_32:8:88:90:59 133 seq1 674 0 * = 674 0 TGCACCTCCCTGTTCACCTAGATGCTAGGAGGACA =7595=92=72.=+5(:4=9092((.2&(&%07%. MF:i:-64
+B7_593:1:12:158:458 147 seq1 675 84 36M = 503 -208 TAATAATGCTACATGGATGATTATGAAATCAATGTT ++++++$((+*+++++++++++++&+++++++++++ MF:i:18 Aq:i:15 NM:i:5 UQ:i:40 H0:i:0 H1:i:0
+B7_593:4:28:781:723 83 seq1 676 99 36M = 855 215 AATACCTCTACATGGCTGATTATGAAAACAATGTTC <<<<<<<<<7<<<;;<<;;<<;<5<4<7<;7<+:<9 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:27:856:401 147 seq1 679 99 35M = 871 227 ACCTCTACATGGCTGATTATGAAAACAATGTTCCC ======6===;2==;===;=+=92=;5+=&556:6 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:245:323:744 83 seq1 679 99 35M = 499 -215 ACCTCTACATGGCTGATTATGAAAACAATGTTCCC /.848299;&;9;9;=2.=7========;;===== MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:31:948:254 83 seq1 680 99 35M = 849 204 CCTCTACATGGCTGATTATGAAAACAATGTTCCCC <<<<<<<<<<<<<<<<<<<;<<<<<:<<8<;;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:277:590:364 83 seq1 681 99 35M = 503 -213 CTCTACATGGCTGATTATGAAAACAATGTTCCCCA :::<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:201:959:19 147 seq1 681 99 35M = 493 -223 CTCTACATGGCTGATTATTAAAACAATGTTCCCCA ;4;.9<:0&/<5<::<<9/.<<<<<<<<<<<<;<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS56_61:8:7:171:402 147 seq1 682 99 35M = 489 -228 TCTACATGGCTGATTATGAAAACAATGTTCCCCAG :086::::847:<7<<7<<<<<<;7<<;<<<<7<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:67:317:249 83 seq1 683 26 35M = 840 192 CTACATGGCTGATTATGAAATCTATGTTCCCCATA <<<<<<;<<<<;:;<<7;<<.<&3<;;<<(;;6.< MF:i:18 Aq:i:26 NM:i:3 UQ:i:31 H0:i:0 H1:i:0
+EAS51_64:4:189:467:475 147 seq1 683 99 35M = 493 -225 CTACATGGCTGATTATGAAAACAATGTTCCCCAGA *.;*;7<75<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:46:900:610 147 seq1 684 99 35M = 491 -228 TACATGGCTGATTATGAAAACAATGTTCCCCAGAT <;5<;<<<;<<<<<<;<<<<<<<<<<8<<<<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:232:351:909 83 seq1 685 80 36M = 843 194 ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC <<<<<99<<<<<<99<7<'<9<<<6<<+<;7;<<&; MF:i:18 Aq:i:39 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS139_11:6:11:285:1567 83 seq1 685 99 35M = 525 -195 ACATGGCTGATTATGAAAACAATGTTCCCCAGATA <8<4<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:172:622:707 147 seq1 685 99 35M = 511 -209 ACATGGCTGATTATGAAAACAATGTTCCCCAGATA 92<3996;<<<<<<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:6:882:784 83 seq1 686 99 35M = 496 -225 CATGGCTGATTATGAAAACAATGTTCCCCAGATAC 4;7<;64<<:<<4<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:80:760:490 147 seq1 686 99 35M = 520 -201 CATGGCTGATTATGAAAACAATGTTCCCCAGATAC %::::+<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:68:1122:79 147 seq1 687 99 40M = 528 -199 ATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCC ::77*:1<<<<<<<<<<<<<<<:;<<<;<<<<<<8<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:264:988:663 83 seq1 688 99 35M = 875 222 TGGCTGATTATGAAAACAATGTTCCCCAGATACCA <<<<<<<<<<<1<4<<<4<<0<;<-<74*(<&51- MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:3:233:911 147 seq1 688 99 35M = 868 215 TGGCTGATTATGAAAACAATGTTCCCCAGATACCA <<<<<<<<<<<<<<<<<;<<<<<<<<<<;<;<<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:187:925:547 83 seq1 689 99 35M = 857 203 GGCTGATTATGAAAACAATGTTCCCAAGATACCAT 43<<<:9<;;;:7<<<<6<:<8<-4-/,81<(48: MF:i:18 Aq:i:37 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS56_65:5:75:637:650 147 seq1 691 99 35M = 868 212 CTGATTATGAAAACAATGTTCCCCAGATACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:27:973:518 147 seq1 691 99 35M = 549 -177 CTGATTATGAAAACAATGTTCCCCAGATACCATCC +<<<<<<9<<<<<<<<<<<;<;<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:20:492:850 147 seq1 694 10 35M = 526 -203 AGTATGAAAACAATGTTCCCCAGATGCCGTCCCGG :.5:+.;;&91:;79:766:1:9+6&:1&&:+:)) MF:i:18 Aq:i:10 NM:i:4 UQ:i:31 H0:i:0 H1:i:0
+EAS51_64:4:318:345:156 83 seq1 695 99 35M = 522 -208 TTATGAAAACAATGTTCCCCAGATACCATCCCTGT ;8<8<<<<<;<<:<<;<;77<<<<<;<<;<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:5:863:302 83 seq1 698 99 35M = 866 203 TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:7:526:343 147 seq1 698 99 35M = 515 -218 TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT (7:;;;<<;;;<1<1<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS114_26:2:73:513:102 83 seq1 698 99 35M = 868 205 TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT ===========================;======= MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:6:251:1557 83 seq1 700 99 35M = 526 -209 AAAACAATGTTCCCCAGATACCATCCCTGTCTTAC <<<<<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:147:64:416 83 seq1 701 99 35M = 870 204 AAACAATGTCCCCCAGATACCATCCCTGTCTTACT <<<<<<<<<<<<<<<;<<<<<;<<<<;;:<;;;;; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_595:3:297:637:86 147 seq1 704 99 35M = 869 200 CAATGTTCCCCAGATACCATCCCTGTCTTACTTCC <<<<<<<<<<<<;+<+;<;<:<<<<<9<<957<;( MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:160:272:398 147 seq1 705 99 35M = 891 221 AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA 9<<<3<<<<<<<<<<<9<<;8<<<<;<+.;;89.. MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:4:679:110 147 seq1 705 99 35M = 549 -191 AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:163:312:891 147 seq1 709 99 35M = 543 -201 TTCCCCAGATACCGTCCCTGTCTTACTTCCAGCTC 0.<;;8<<<0<<<<<<<<<<6<<<<<<8<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_28:3:78:773:660 83 seq1 711 99 36M = 534 -213 CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC 7<;7<<<7;9<<8;<<<<<<;<<<<<<<<<<7<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:5:63:875:1339 147 seq1 711 99 35M = 879 203 CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCC <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:243:876:758 147 seq1 712 99 35M = 541 -206 CCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC 0%3<1;.70;3363;31;<<<<<<6<<<;<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:104:153:698 147 seq1 713 99 36M = 896 219 CCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAG ;<<<<<<;6<<<<<<<<<<;<<<<;<;;;<.<::50 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:86:498:373 147 seq1 716 99 35M = 894 213 GATACCATCCCTGTCTTACTTCCAGCTCACCAGAG <<<<<<<<<<<<<<<<<<<<<<<5:<<<:<;7+67 MF:i:18 Aq:i:69 NM:i:1 UQ:i:25 H0:i:1 H1:i:0
+EAS1_95:6:87:734:888 147 seq1 717 99 35M = 900 218 ATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG ===========;8=========;;=;====;;3(; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:238:31:968 147 seq1 717 99 35M = 534 -218 ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG =(.7=5%===9:7==+==77=============== MF:i:18 Aq:i:69 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_65:3:290:558:349 83 seq1 719 99 35M = 869 185 ACCATCCCTGTCTTACTTCCAGCTCCCCAGCGGGA <<<;<<;<;<188<<<8::<686+4:<<6:&3)*& MF:i:18 Aq:i:59 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_28:5:206:671:49 83 seq1 719 99 36M = 557 -198 ACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA ;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:278:918:892 147 seq1 720 99 35M = 541 -214 CCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA =6=3=<===&========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:191:462:705 147 seq1 721 99 36M = 545 -212 CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAG <<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:9:55:730 83 seq1 722 99 36M = 540 -218 ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC <:<;;<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:45:462:455 147 seq1 723 99 35M = 874 186 TCCCTGTCTTACTTCCAGCTCCCCAGACGGAACGC <<<<<<8<<<;<;<<<;<<<<<<<6;8&:80;733 MF:i:18 Aq:i:43 NM:i:2 UQ:i:27 H0:i:0 H1:i:1
+EAS114_28:2:149:650:44 147 seq1 726 99 36M = 902 212 CTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC <<<<<<<<<<<<<<<<<<<<<<<<<;6<<;<<7<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:297:283:948 83 seq1 727 99 35M = 550 -212 TGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC 6;;3;6<<66<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:33:1168:1762 147 seq1 728 99 35M = 552 -211 GTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCA 79<9;3<<<4<<<97<;;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:228:182:717 147 seq1 729 99 35M = 563 -201 TCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAA 778;8;474<<<;2;;<2<<<<<<<<;<;;9<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:8:1351:1986 147 seq1 729 99 35M = 911 217 TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA <<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS51_64:4:163:31:455 147 seq1 730 99 35M = 886 191 CTTACTTCCAGCTCCCCAGAGGGACAGCTNNCAAC <+<<<<<<<;0+<<<<;06070-9(0(9<!!5)05 MF:i:18 Aq:i:31 NM:i:3 UQ:i:7 H0:i:0 H1:i:1
+EAS54_61:6:126:541:194 83 seq1 730 97 35M = 540 -225 AGTACGACCAGCTCCCCAGAGGGAAAGCTTTCAAC +%&:/+(46=47&71/2==;=;8====28212=== MF:i:18 Aq:i:43 NM:i:4 UQ:i:40 H0:i:1 H1:i:0
+EAS51_62:7:178:286:414 147 seq1 731 99 35M = 907 211 TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG <<<<<<<<<<<<<<<<8<<<<<<<<<1<<<1;998 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:35:361:546 147 seq1 731 99 35M = 892 196 TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG <<<<<<<<<<<<<<<<;<5<<<<<;<2<<<:<8<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:90:247:212 147 seq1 733 99 35M = 567 -201 ACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCT 7655:;87;<;;;8<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:149:354:667 83 seq1 734 99 35M = 888 189 CTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTT <<<<<<<<<<<<<<<<<<<><<<<<<<<;<:<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:240:603:890 83 seq1 740 99 36M = 590 -186 GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA ;+&+//&<<<<<<<<<<9<<<8<<<<9<<<<<<<<< MF:i:18 Aq:i:66 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_591:7:129:956:115 147 seq1 740 99 36M = 927 223 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;877- MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:168:528:288 83 seq1 740 99 35M = 570 -205 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC 8<%<31;<<;<;<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:275:851:240 147 seq1 743 99 35M = 561 -217 CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT 66614/&3616630666&66666&66666868666 MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS188_7:6:205:873:464 147 seq1 743 99 35M = 552 -226 CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT <-((+:+;289<--;<;-;<:;;<<<;;<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:37:610:260 147 seq1 745 99 35M = 913 203 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC <<<;<;<<7<<<<<<<<<<<<<<;6<963;;;3;1 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:93:945:176 147 seq1 745 99 35M = 582 -198 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC 6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:61:628:681 83 seq1 746 99 36M = 586 -196 CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT 95<<<<<<<<;<<<<;<<<:<<;;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:288:552:440 83 seq1 747 87 35M = 560 -222 AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT 9<<%'%<<.2<<<<<<<<5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:2 UQ:i:33 H0:i:0 H1:i:0
+EAS56_53:2:170:265:818 147 seq1 748 10 35M = 920 207 GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT <<<<<(5/959<8.<9<8<<<2<&59&&:22:8+( MF:i:18 Aq:i:10 NM:i:3 UQ:i:17 H0:i:0 H1:i:0
+B7_595:2:251:121:479 83 seq1 750 99 35M = 572 -213 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<6'..663;&<<;<<9<<<9<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:67:1797:1931 147 seq1 750 99 35M = 562 -223 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:226:302:758 83 seq1 751 99 35M = 556 -230 GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG ;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:163:618:570 83 seq1 751 99 35M = 571 -215 GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG <9774<88&:8<:8<8:8<8<<<<<;88<88<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_97:3:73:292:429 83 seq1 752 99 35M = 920 203 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC <<<<<<<<<<7<<;<<<<<<<2<<<5<<<<<:%)< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_108:3:82:356:253 83 seq1 752 99 35M = 927 210 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC ===================<========;===39= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:62:386:959 147 seq1 752 99 35M = 594 -193 AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC %;71131((<<6<92(+<1<<;<-3<8<<;<;;<< MF:i:18 Aq:i:57 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_62:3:263:74:407 83 seq1 754 99 35M = 574 -215 AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT ;;88<::+;<)<5<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:67:620:344 83 seq1 755 99 35M = 905 185 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT <<<<2<:2<<<<<<7<<<<:<<*<<<<<<***3<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:148:776:486 83 seq1 755 99 35M = 578 -212 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT ;:<<<;<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:150:933:810 83 seq1 755 99 35M = 593 -197 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT :89===:=:=;;==;==================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:102:467:897 83 seq1 756 97 35M = 940 219 GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT <<<<9<<<<9<2<<<&,/</<<<<7<<;&&<$;*< MF:i:18 Aq:i:37 NM:i:2 UQ:i:8 H0:i:1 H1:i:0
+EAS114_39:1:12:884:219 147 seq1 756 99 35M = 584 -207 GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTT 7;::<:<<<7<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:40:1596:1433 147 seq1 756 99 40M = 587 -209 GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT -:8:1841<4;<88<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:7:761:623 83 seq1 757 99 35M = 938 216 CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG <<<<<<<<<<<<<8<<<<;;<0<<<<<;;<;<;;& MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:246:313:499 147 seq1 757 99 35M = 592 -200 CTTTAAACGCTTCTAGCCATTTCTTTTGGCATTTG +;77%;;;&:;:7;<<<<<6<:<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS139_11:6:89:1151:1878 147 seq1 757 99 35M = 587 -205 CTTTCAACGATTCTAGCCATTTCTTTTGGCATTTG 8<66,,<<<<<<:<<<<<9<<<:<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_71:4:165:397:25 83 seq1 759 99 34M = 576 -217 TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC &(33'60;-'+'<7;<<*3-<;;183<<<;<;<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:59:1576:946 147 seq1 761 99 35M = 578 -218 CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT 9<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:256:407:470 147 seq1 762 99 35M = 939 212 AACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTC <<<<<<<<;<;<<<<<<<<<;;<</<<;;83;7;9 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:148:437:481 147 seq1 764 99 36M = 949 221 CGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGA <<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<;0;8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:140:924:923 83 seq1 767 99 35M = 597 -205 TTTTAGCCATTTCTTTTGGCATTTGCCTTCAGACC <<&<<;;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_103:4:143:560:194 83 seq1 768 99 35M = 946 213 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC <<<<;;<<<<<<<<<<<6<;<<<<;;<<;9<999< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:178:192:499 83 seq1 768 99 35M = 582 -221 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC 86<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:4:1620:413 147 seq1 768 99 35M = 588 -215 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC -<<<7<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:73:730:487 147 seq1 770 99 35M = 604 -201 TAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTA <;;<<2;<;<<<;0<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:179:389:585 147 seq1 770 24 35M = 953 218 TGGCCACTTTTTATCGCATTTCCCTTTAGAACCTA <.4<9.4+.+'&-220<+<4<6<<20*6;<0(9<% MF:i:-126 Aq:i:24 NM:i:7 UQ:i:103 H0:i:0 H1:i:0
+B7_595:1:252:19:955 147 seq1 771 84 35M = 596 -210 AGCCAGTTCTTTTGGCATTTGCCTTCAGACCCTCC <8<884<<<<<<68<<<<<<<2<;<<;<+<<<;<< MF:i:18 Aq:i:41 NM:i:2 UQ:i:46 H0:i:0 H1:i:1
+EAS54_71:4:169:862:829 83 seq1 772 99 34M = 611 -195 GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC ,1<6<<<<<7<<<<<<<<<<<<<<<<<7<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:6:7:858:437 147 seq1 773 99 35M = 593 -215 CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC 7;<4;;:;80<;<;<<<<<<:<<;<<<;;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:183:852:253 83 seq1 773 99 35M = 599 -209 CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC ;<9<;<<<<<<<<;<<<<<;<<<;<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:20:41:138 147 seq1 774 99 35M = 615 -194 CATTTCTTTTGGCATTTGCCTTCAGACCCTACACG ;;;<;<<<::<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:123:998:248 83 seq1 776 99 35M = 589 -222 TTTCTTTTGGCATTTGCCTTCAGACCCTACACGAA ;:;5;<;:<9<<<<<:<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:142:63:937 83 seq1 777 99 36M = 609 -204 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAATG ;;;<;<<<<;<<<<<;:<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:20:762:748 83 seq1 777 99 35M = 591 -221 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT =:747;7=;;==7=;==7===7==7;========= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:149:953:349 83 seq1 777 99 35M = 915 173 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT <<<<<<<<;<<<<<<<<<<<;7:<:<<:<:;;::; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:46:981:766 147 seq1 778 99 35M = 933 190 TCTTTTGGCATTTGCCTTCAGACCCTACACGAATG <<<<<<<<<<<<<;<<<<<-<;<<<<-<-<;-:6; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:204:779:181 83 seq1 779 99 35M = 598 -216 CTTTTGGCATTTGCCTTCAGACCCTACACGAATGC ;:;/*<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:11:360:1577 147 seq1 781 99 35M = 606 -210 TTTGGCATTTGCCTTCAGACCCTACACGAATGCGT 1<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:5:491:391 83 seq1 782 99 35M = 917 170 TTGGCATTTGCCTTCAGACCCTACACGAATGCGTC =========;===;==:4=========;3;==7;= MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:186:199:927 83 seq1 783 99 35M = 802 54 TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT <77<<<<2<;<<<<<06<<<<<<<<60<<684/6& MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:19:855:491 147 seq1 783 99 35M = 631 -187 TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT 8<<<<;:<<<<:<<<<<:<;;<<<<<<<;<<<;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:36:485:632 83 seq1 784 99 36M = 610 -210 GGCATTTGCCTTCAGACCCTACACGAATGCGTCTCT 0;;;<<;<<<;<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:266:842 83 seq1 784 99 35M = 599 -220 GGCATTTGCCTTCAGACCCTACACGAATGCGTCTC <9<<6;9<;9;;<<<<;;;9<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:65:1928:1125 147 seq1 784 99 35M = 588 -231 GGCATTTGCCTTCAGACCCTACACGAATACGTCTC <+<<<2<4<<<0<<4<<<<<6<<<6<<<'<<<<0< MF:i:18 Aq:i:41 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+EAS221_3:4:66:584:407 147 seq1 785 99 35M = 954 204 GCATTTGCCTTCAGACCCTACACGAATGCGTCTCT <<<*9<9<<<1<<<<<<<<*<59<4<)<2<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:172:896:83 147 seq1 786 99 35M = 604 -217 CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA ;<.5.;;<+;<<<<<<<4<<<<<<<;<<<<<;<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:2:1200:1076 83 seq1 786 99 35M = 629 -192 CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA 7779779;9;:;;4;;9;;:7;<<<7;;;:<;<<; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:135:543:760 147 seq1 787 99 35M = 619 -203 ATTTGCCTTCAGACCCTACACGAATGCGTCTCTAC ;;.;;8;<8;<<32;<<<<<7<<<<<9<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:5:538:401 147 seq1 788 99 40M = 624 -204 TTTGCCTTCACACCCTACACGAATGCGTCTCTGCCACAGG 671&7::49:&0<<<(<::<&<<<:<<<<<<<&<<<<1<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:10 H0:i:0 H1:i:1
+EAS54_71:6:215:133:909 147 seq1 789 99 35M = 631 -193 TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA 7758;<;<;8<<<<;<;<<<<<:;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:30:887:404 83 seq1 789 99 35M = 600 -224 TTGCCTTCAGACCCTGCACGAATGCGTCTCTACCA <<<<5<;::<<<;<<.<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS219_1:1:5:497:687 147 seq1 789 99 35M = 607 -217 TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA <8<<8<<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:131:742:561 83 seq1 790 99 35M = 620 -205 TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC <:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:65:556:1505 83 seq1 790 99 35M = 593 -232 TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC <6<8<<4<8;;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:233:478:792 147 seq1 791 99 35M = 634 -192 GCCTTCAGACCCTACACGAATGCGTCTCTACCACA 6<;9:<<9-<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:66:257:524 83 seq1 791 99 35M = 959 203 GCCTTCAGACCCTACACGAATGCGTCTCTACCACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<% MF:i:18 Aq:i:73 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_53:4:154:762:630 83 seq1 792 99 35M = 604 -223 CCTTCAGACCCTACACGAATGCGTCTCTACCACAG <<-::<91<<<<;<;<<<<;<<<<<<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:4:841:339 83 seq1 793 99 35M = 646 -182 CTTCAGACCCTACACGAATGCGTCTCTACCACAGG 77-):22<<<33;<5<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:66:1282:1215 147 seq1 794 99 35M = 627 -202 TTCAGACCCTACACGAATGCGTCTCTACCACAGGG ::;<;<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:194:688:289 147 seq1 795 99 35M = 631 -199 TCAGACCCTACACGAATGCGTCTCTACCACAGGGG ;8;%28<;<<<<<<<<;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:8:36:927:478 147 seq1 798 99 35M = 610 -223 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ,6;;;3;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:99:756:130 83 seq1 798 99 35M = 606 -227 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:192:716:235 83 seq1 798 99 35M = 651 -182 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT <5<<<8<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:63:424:1643 83 seq1 798 99 35M = 614 -219 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT 9+<<<+7<<<<<<<<<<<<<<<<<8<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:14:360:580 83 seq1 799 99 35M = 963 199 ACCCTACACGAATGCGTCTCTACCACAGGGGGCGG ===========3===;5<==8;====79==.=5'5 MF:i:18 Aq:i:68 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS51_78:7:186:199:927 147 seq1 802 99 35M = 783 -54 CTACGCGAATGCGTCTCTACCACAGGGGGCTGCGC -;++)6<*8+;&<&/<<<<7<<71<<<<<6<<<7< MF:i:18 Aq:i:57 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS139_19:3:4:1502:1911 83 seq1 802 99 40M = 652 -190 CTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTT :+:::5/;99<;<&<*<-9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:187:791:153 83 seq1 803 99 35M = 958 190 TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG <<<<<<<<<<<<<<<<<<<<<:+;;<;<88*6;68 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:63:527:1923 83 seq1 803 99 35M = 981 213 TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG <<<<<<<<<<<<<<<<<:<<<<3<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:31:98:804 83 seq1 805 99 35M = 982 212 CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGC =======9===;============5=;9=;=;==& MF:i:18 Aq:i:74 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS218_4:7:89:1487:520 147 seq1 805 99 35M = 997 227 CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGT 8<<<6/<<<<<<<<<:<<8<:<<3<<:668<86<3 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:69:88:1154 83 seq1 805 99 35M = 992 222 CACGAATGCGTCTCTACCACAGGCGGCTGCGCGGT <<<<<<<<<<<<<<<<<<<<<<<2<<<<:<<<<<7 MF:i:18 Aq:i:47 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS114_26:1:99:212:522 147 seq1 806 99 35M = 1002 231 ACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT ================8==;====;=;===1==:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:35:378:681 147 seq1 812 99 35M = 632 -215 GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT :<5-<);;;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:182:404:693 83 seq1 812 99 35M = 646 -201 GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT <;7;;4<<<<<<<7<<7<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:119:761:239 83 seq1 813 99 35M = 999 221 CGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATC <<<<<<<<<<<<6<<<<<<;<2<<<<;<<<<<;;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:165:464:123 147 seq1 814 99 35M = 650 -199 GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA 9;<)<<%<<9<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:40:758:116 83 seq1 814 99 40M = 632 -222 GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG 25/8/:<75:2<<<<<<7<<;<<<<<<<88;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:55:506:125 83 seq1 817 99 35M = 982 200 TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA <<<<<<<<<;<9<;<<;558<<<<5(5*<<<<<51 MF:i:18 Aq:i:35 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:162:594:858 147 seq1 818 99 35M = 634 -219 CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA 90;<99;==99==;4=:========;=====;=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:55:74:1040 83 seq1 818 99 35M = 975 192 CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:100:708:1984 83 seq1 819 99 35M = 1015 231 TACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<7%: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:92:367:1495 147 seq1 820 99 35M = 987 202 ACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<6<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:49:905:27 147 seq1 821 68 35M = 1000 214 CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA <<;<.89<9.<2<9<:91+447.9,04&000(,+( MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS218_4:7:87:964:826 147 seq1 822 99 35M = 999 212 CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<1<<8;4;;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:38:1576:1923 147 seq1 822 99 35M = 987 200 CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;<<;< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:337:968 83 seq1 823 85 35M = 981 193 ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT <<<<<;<<<<<<<<<<<<<<<<<<<;<<;;<;;;; MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:187:294:947 83 seq1 823 99 35M = 1002 214 ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT <<<<<<<<<<<<<<<<:<<<<<&<<%:<)7;7::4 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:49:271:588 83 seq1 830 99 35M = 658 -207 GCTGCGCGGTTTCCCATCATGAAGCACTGAACTTC :0=:===:<===;;===;================= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:40:594:752 147 seq1 831 99 35M = 651 -215 CTGCGCGGTTTCCCATCATGAAGCACTGAACTTCC ;7;9<;;;<;<;:<<;;<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:163:757:432 83 seq1 837 99 35M = 1013 211 GGTTTCCCATCATGAAGCACTGAACTTCCACGTCT <<<<<<<;<<<<<<<<;<;<<<<<<<<<<<<83:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:156:857:494 83 seq1 838 99 35M = 648 -225 GTTTCCCATCATGAAGCACTGAACTTCCACGTCTC <<<8<:5<<;<<8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:84:91:614 147 seq1 839 99 35M = 1019 215 TTTCCCATCATGAAGCACTGATCTTCCACGTCTCA ;4<<<<<-84<<<;<<<<8<7.<4<<;77&:%<:: MF:i:18 Aq:i:39 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS51_64:7:152:918:824 147 seq1 839 99 35M = 1033 229 TTTCCCATCATGAAGCACTGAACTTCCACGTCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:67:317:249 147 seq1 840 26 35M = 683 -192 TTCCCATCATGACGCACCGAACTTCCACGTCTCAT .5;7;++;<8.;&:7<<.5<<<<7<<7<<<<<<;7 MF:i:-126 Aq:i:26 NM:i:2 UQ:i:18 H0:i:0 H1:i:0
+EAS51_62:7:96:836:737 147 seq1 841 99 35M = 642 -234 TCCCATCATGAAGCACTGAACTTCCACGTCTCATC 1<;<7;;1;8;;8:<<1<;<<;<<<<<<<<<<;<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:130:912:658 83 seq1 841 99 35M = 652 -224 TCCCATCATGAAGCACTGAACTTCCACGTCTCATC ;=;;;<<<<<=55=;==<=======<========= MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:75:934:439 147 seq1 842 99 35M = 1001 194 CCCATCATGAAGCACTGAACTTCCACGTCTCATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:212:329:348 147 seq1 842 99 35M = 1020 212 CCCATCATGAAGCACTGAACTTCCACGTCTCATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:49:183:435 147 seq1 843 99 35M = 1005 197 CCATCATGAAGCACTGAACTTCCACGTCTCATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:;8;: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:280:133:495 83 seq1 843 99 35M = 1015 207 CCATCATGAAGCACTGAACTTCCACGTCTCATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:232:351:909 147 seq1 843 80 36M = 685 -194 CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG :8%3<8====130=8==+===;=3=8===48==;3* MF:i:18 Aq:i:39 NM:i:1 UQ:i:15 H0:i:0 H1:i:1
+EAS221_1:8:77:781:676 147 seq1 846 99 35M = 1010 199 TCATGAAGCACTGAACTTCCACGTATCATCTAGGG <<<<<<<5<<5<<<<<<<<<<<<13<<2<<<<<,< MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS1_95:2:198:691:595 83 seq1 847 99 35M = 655 -227 CATGAAGCACTGAACTTCCACGTCTCATCTAGGGG :=:;=;===========;================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:31:948:254 147 seq1 849 99 35M = 680 -204 TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA 7;;;98<<7<<<<<<<<<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:278:440:902 83 seq1 851 99 35M = 1032 216 AAGCACTGAACTTCCACGTCTCATCTAGGGGAACA =========<==<==============:;;=;=;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:74:674:124 147 seq1 854 99 35M = 1041 222 CACTGAACTTCCACGTCTCATCTAGGGGAACAGGG <<<<<<<<<<<<:<;<<<<;<<<<;9;<<;;.;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:28:781:723 147 seq1 855 99 36M = 676 -215 ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG 8488<::;4;;<:;;;::<;7<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:28:474:566 147 seq1 855 99 36M = 1018 199 ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG <<<<<<<<<<<<<<<<<<<<<<<:<;<;;<<7;8;< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:124:241:608 147 seq1 856 99 35M = 670 -221 CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG 9;;<<;<<<;<<<;<:<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:187:925:547 147 seq1 857 99 35M = 689 -203 TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG ((988+&8<<;<09<;<<9<<4<<-<99<<;<9<; MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:9:512:826 83 seq1 859 99 35M = 1021 197 AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG 67<<<;;;<;;<<;;<;<:;9;;;9;;;;<59777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:194:696:490 83 seq1 862 99 35M = 1026 199 TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC <<<<<<<<<<<<<<<<<<<;5<<<<<:<1<8<<<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:96:788:614 83 seq1 862 99 35M = 667 -230 TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC ;9;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:81:786:340 147 seq1 863 99 35M = 1033 205 TCCACGTCTCATCTAGGGGAACAGAGAGGTGCACT <<<<7<<<<<<<<<<<<<<7<<;<&<<;;7<7;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS192_3:7:298:644:697 147 seq1 863 99 35M = 1035 207 TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT <<<<<<<<<<<<<<<::;;;6<8:;;9;98;668; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:178:305:843 147 seq1 864 99 35M = 1037 208 CCACGTCTCATCTAGGGGAACAGGGAGGTGCACTA <<<<<<<<<<<<<<<<<<<:<<<<<;<<:<<:<;: MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:5:863:302 147 seq1 866 99 35M = 698 -203 ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT :4:29:<<<9;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:30:788:376 83 seq1 866 99 35M = 1038 207 ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT <<<<<<<<<<<<:<<<<<<<<:<;<<(<7;7;:(; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:143:310:958 147 seq1 868 99 35M = 1048 215 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<<<<<<<<8<8<<<<<;;7<<<;6;<<+4;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:3:233:911 83 seq1 868 99 35M = 688 -215 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:75:637:650 83 seq1 868 99 35M = 691 -212 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:73:513:102 147 seq1 868 99 35M = 698 -205 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC ==::===8=>=====>=>=>>>=>>==>=>>>>>> MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:297:637:86 83 seq1 869 99 35M = 704 -200 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG <:75<;<;;<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS54_65:3:290:558:349 147 seq1 869 99 35M = 719 -185 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG 2;2;;'5&;<<5<<;5/<<<<<7<<;+;<<+1<8< MF:i:18 Aq:i:59 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS1_95:3:308:956:873 83 seq1 870 99 35M = 1068 233 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC <<<<<<<<<<<<<;<;<;1<<<<<.<9<;<<<<+; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:147:64:416 147 seq1 870 99 35M = 701 -204 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC /;49;:6<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:812:345 147 seq1 871 99 36M = 1036 201 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC <<<<<<<7<;<<7<;77;3<&0-;<5<;6<1'13<: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:134:243:630 147 seq1 871 99 35M = 1052 216 TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT <<<:<<<<</<<<-<<<<6/<-<:<5+<::-2</2 MF:i:18 Aq:i:39 NM:i:2 UQ:i:29 H0:i:0 H1:i:1
+EAS54_81:2:27:856:401 83 seq1 871 99 35M = 679 -227 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCT .'=.93======;;====;======;===;=;=== MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:45:462:455 83 seq1 874 99 35M = 723 -186 TCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCA 62*<;;;;<<;<<9;;<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:264:988:663 147 seq1 875 99 35M = 688 -222 CGAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC (%<:4<4<<7<<1-:<1766<66<<<<+<:<;8;< MF:i:18 Aq:i:60 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_63:1:145:71:26 147 seq1 875 99 35M = 1040 200 CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC <<<<<<<<<<<<<<<<<;<;;<<;<;<9<9;;99; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:101:825:28 147 seq1 879 99 35M = 1079 235 GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC <<86<<;<78<<<)<;4<67<;<;<74-7;,;8,; MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_4:5:63:875:1339 83 seq1 879 99 35M = 711 -203 GGGAACAGGGAGGTGCACTAATGCGCTCCACGCCC ;;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:290:270:557 83 seq1 880 99 35M = 1052 207 GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA <<<<<<<<<<<<<;<<<<9<:;<<<<<<5<0<<;+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:134:853:558 147 seq1 880 99 35M = 1071 226 GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA ==========================9=9=;<;<5 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:282:567:481 83 seq1 880 88 35M = 1064 219 GGAACAGGGAGGCGCACTAATGCGCTCCACGCCCA <<<<<<<<<<<<3<7<7<<<<;<<0)<<<<<<<<3 MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS114_30:1:154:818:165 147 seq1 881 99 35M = 1041 195 GAACAGGGAGGTGCACTAATGCGCTCCACGCCCAA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<:7;:; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:301:54:240 147 seq1 882 99 35M = 1061 214 AACAGGGAGGTGCACTAATGCGCTCCACGCCCAAG <<<<:<9<<<<:<<<<9<<<<<<690<<6</<(83 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:12:402:843 147 seq1 885 99 35M = 1072 222 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:262:965:756 83 seq1 885 99 35M = 1069 219 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<9;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:30:816:90 147 seq1 885 99 35M = 1057 207 AGGGAGGTGCACTAATGCGCTCCACGCCCCAGCCC <<<<<<<<<<<<<<<<<<<:<<<<<<::1&(1::7 MF:i:18 Aq:i:69 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS188_7:4:171:104:398 147 seq1 885 99 35M = 1066 216 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC =========)===97===3===4===4==,)=/)= MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:163:31:455 83 seq1 886 99 35M = 730 -191 GGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCT 8;<<;<<<78+<=</<<=;23<=<<<<<<<<<<<< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:149:354:667 147 seq1 888 99 35M = 734 -189 GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC ;<;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:18:571:1110 83 seq1 888 99 35M = 1070 217 GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC 7<<<<<<<<<<<<;<<<<<<<<<<<<788<<<;6< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:312:837:406 147 seq1 889 99 35M = 1048 194 AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:160:272:398 83 seq1 891 99 35M = 705 -221 GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA 3:,<,;;<<;<<1<<<<<<<;<;<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:228:587:504 83 seq1 891 65 35M = 1050 194 GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA <<<<7<<7;7<<3<<<<7<<<<<*3<<<<74<:<* MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:35:361:546 83 seq1 892 99 35M = 731 -196 TGCACTAATGCGCTCCACGCCCAAGCCCTTCTCAC :4;4;;<<;4<8<;;<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:84:438:1505 83 seq1 893 99 40M = 1068 215 GCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTC 35<<:;9<;<;5<<<:<3<<7:<9/<)<<:::9<&5;;+1 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:277:482:316 147 seq1 894 99 35M = 1098 239 CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG <<<<<<<<<<<<<<;<;<<<:<;<<<<;<<<1<1; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:86:498:373 83 seq1 894 99 35M = 716 -213 CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG ):)4:<5<<<<;89<<<969<<<:<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:236:498:526 147 seq1 895 99 35M = 1048 188 ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:43:1120:878 83 seq1 895 99 35M = 1075 215 ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT <<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<=7;7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:104:153:698 83 seq1 896 99 36M = 713 -219 CTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTT 69<<)9<<:5:6<<<16:<6/<6<1<<<<<:<:<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:166:42:147 83 seq1 898 99 35M = 1048 185 AATGCGCTCCACGCCCAAGCCCTTCTAACAGTTTC <<;<<<<<<<<<<<<<<<<;6<<64;)<<7;7;;; MF:i:18 Aq:i:43 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+B7_595:2:178:77:424 83 seq1 900 99 35M = 1058 193 TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG <<<<<<<<<<<<<<<6<<;<<<<<<<<6<;<<<<6 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:87:734:888 83 seq1 900 99 35M = 717 -218 TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG 56<<86;:<<<4;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:149:650:44 83 seq1 902 99 36M = 726 -212 CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC ;8<<</<<:<<595<<9<<<<<<<<<<<<<<3<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:552:234 83 seq1 903 99 35M = 1094 226 GCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC <<<<<<<<<<<<<;<<<<<<<<9<969<<<<3<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:58:703:72 147 seq1 905 99 35M = 1088 218 TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC 2<7<<<<<<<<<<<8:<<<<8<(<8<:::8.::<3 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:242:4:593 83 seq1 905 99 35M = 1086 216 TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC <<<<<<<<<<<8<<<<-<<<<<88;<;<<8<;88< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:67:620:344 147 seq1 905 99 35M = 755 -185 CCCCCGCCCAAGCCCTTCTCACAGTTTCTGCCCCC +++*+++#++++++,++++++++,,+,&+,,,,+, MF:i:18 Aq:i:33 NM:i:2 UQ:i:19 H0:i:1 H1:i:0
+EAS51_62:7:178:286:414 83 seq1 907 99 35M = 731 -211 CACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAG 68;38::<<;<<8;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:174:987:334 147 seq1 908 99 35M = 1082 209 ACACCCAAGCCCTTCTCACAGTTTCTGCCCCCAGC <<;4<<<<;;</4<4<+<<<<<;<<<<<</<93+2 MF:i:18 Aq:i:41 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS219_FC30151:1:55:8:1412 147 seq1 910 99 35M = 1072 197 GCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:8:1351:1986 83 seq1 911 99 35M = 729 -217 CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG <8;<<<<<<<<<<<;<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:37:610:260 83 seq1 913 99 35M = 745 -203 CAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGT /74<.<4.&<<<:<<<<::<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:228:189:826 83 seq1 914 99 35M = 1112 233 AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT ;9=========;=1======9=====1;=<3=:6; MF:i:18 Aq:i:45 NM:i:1 UQ:i:16 H0:i:0 H1:i:1
+EAS56_59:3:149:953:349 147 seq1 915 99 35M = 777 -173 AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG 2;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:24:1374:211 83 seq1 915 99 35M = 1064 184 AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG ;;:<<;<;:;;;;;;;;;;<::;;;6;;2+74917 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:5:491:391 147 seq1 917 99 35M = 782 -170 CCCTGCTCACAGTTTCTGCCCCCAGCATGGTTGTA -/+5-.&&:5+:92=6===========9======= MF:i:18 Aq:i:62 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS114_32:2:306:119:56 83 seq1 919 99 35M = 1083 199 CTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:216:381:608 147 seq1 920 99 35M = 1075 190 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<;;+<6:<;26; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:73:292:429 147 seq1 920 99 35M = 752 -203 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG ;6;6;<<<<<;<<<<;<<<<<<<<7<<<<<<5<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:170:265:818 83 seq1 920 73 35M = 748 -207 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG 3+;%;.;;<<9+;3;;;<<<;57<1<;<<<<<<<; MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:278:906:933 83 seq1 920 99 35M = 1071 186 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<. MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:190:95:706 83 seq1 920 99 35M = 1078 193 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<9<<<<<;;<;<;;<<;<;;<, MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:278:848:765 83 seq1 920 99 35M = 1088 203 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:29:249:878 147 seq1 921 99 35M = 1077 191 TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG <<<<<<<<<<<<<<<<<<<<<<:<:<<=<<:<<6& MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:259:467:737 147 seq1 923 99 36M = 1102 215 TCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCA <<<<<<<<<<<<7<<<<<<<'<<.<<<<<<;;;<67 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:24:195:604 147 seq1 923 99 35M = 1098 210 TCACAGTTTCTGCCCCCAGCATGGTTGTACTGTGC <;<<<<<<<<<89<<<<<868<8;6<8;3(38&<8 MF:i:18 Aq:i:65 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_32:4:42:923:169 147 seq1 925 99 35M = 1099 209 ACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAA 9<<<;9<<<<<;<;<<.<<;<;6<<<<1;8<<-0; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:29:529:379 147 seq1 926 99 35M = 1117 226 CAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT <<<<<<<<8<<<<<<<<<<<<<<<<<;<672;<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:26:785:882 147 seq1 926 99 35M = 1107 216 CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT <<<0<<<<<<<<<6,<<)<<<<<<<&<<0<<,<'< MF:i:18 Aq:i:39 NM:i:1 UQ:i:21 H0:i:0 H1:i:1
+B7_591:7:129:956:115 83 seq1 927 99 36M = 740 -223 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC <<:<9<4<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:82:356:253 147 seq1 927 99 35M = 752 -210 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA 97;7<<;;<<<<<7;<<:<<<9<<;<<<9<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:134:379:893 83 seq1 927 99 35M = 1095 203 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA <<<<<<<<<<<<<5<<<<;<<<<<;<:5;<<4+<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:256:404:584 83 seq1 928 99 35M = 1096 203 GTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC <<<<<<<<<<<<<<<<<<<<<7<3;<:;;3:3:</ MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:76:333:905 147 seq1 929 99 35M = 1076 182 TTTCTGCCCCCAGCATGGTTGTACTGGGCAATACA <<<<<7;<;<<6<<6<<7<<7<)&<4+6)0+<;(0 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:11:646:628 83 seq1 930 99 36M = 1106 212 TTCTGCCCCCAGCATGGTTGTACTGGGCAATACATG <<<<<<<<<<6<<<<<<<<<<<<</<;<<<<<<6<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:136:389:320 83 seq1 930 99 35M = 1100 205 TTCTGCCCCCAGCATGGTTGTACTGGGCAATACAT 7<<<<<;<<7<6<<;;<;<;;677<6;(27;<(97 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:93:334:858 83 seq1 932 99 35M = 1106 209 CTGCCCCCAGCATGGTTGTACTTGGCAATACATGA <<<<<<<<;<<<<;;<<9<<<<&;&<<9<9;/;&; MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:3:46:981:766 83 seq1 933 99 35M = 778 -190 TGCCCCCAGCATGGTTGTACTGGGCAATACATGAG /<<<;/;<<316<<<3<<<<7<<<7<<<;<<<<<7 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:209:159:130 83 seq1 934 99 34M = 1109 210 GCCCCCAGCATGGTTGTACTGGGCAATACATGAG <<<<<<8<<<<<<&<<+7<<4<<<22<;<<<<3< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:111:796:737 83 seq1 936 99 35M = 1112 211 CCCCAGCATGGTTGTACTGGGCAATACATGTGATT <<<<<<<<<<<<<<<:<<;7;<<<<993<4%:%<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:4:15:856:340 83 seq1 936 99 35M = 1093 192 CCCCAGCATGGTTGCACTGGGCAATACATGAGATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<77<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:5:7:761:623 147 seq1 938 99 35M = 757 -216 CCGGCATGGTTGTACTGGGCAATACATGAGATTAT ::';-8);<<<<;<1<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS1_97:5:84:927:843 83 seq1 938 99 35M = 1138 235 CCAGCATGGTTGTACTGGGCAATACATGAGATTAT <<<<<<<<<<<<<;9;;4;<<0<<7<<9<;<:<5< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:273:901:459 83 seq1 938 99 35M = 1098 195 CCAGCATGGTTGTACTGGGCAATACATGAGATTAT <<8<<<;<;8<;<;<;7+8<788<;;22<27;77; MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:256:407:470 83 seq1 939 99 35M = 762 -212 CAGCATGGTTGTACTGGGCAATACATGAGATTATT 7.47;0;;5<4033*<<<<<9,<<<<<;<<<<<3< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:77:251:446 147 seq1 939 99 35M = 1110 206 CAGCATGGTTGTACTGGGCAATACATGAGATTATT <<9<<<<<<<<<<<<<97<<<<<<<<<96<<<+<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:102:467:897 147 seq1 940 97 35M = 756 -219 AGCATGGTTGTACAGGGCAATACATGAGATTATTA 83333<+02<:<.&<+<.<::7<<::<<<<:<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS221_1:6:92:1807:1185 83 seq1 940 99 35M = 1119 214 AGCATGGTTGTACTGGGCAATACATGAGATTATTA <<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:142:858:903 83 seq1 943 99 35M = 1121 213 ATGGTTGTACTGGGCAATACATGAGATTATTAGGA ======;====5=======9======;===3=5=; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:143:560:194 147 seq1 946 99 35M = 768 -213 GTTGTACTGGGCAATACATGAGATTATTAGGAAAT 9:<;7<:::<:<;<<<<<<<<<<:<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:148:437:481 83 seq1 949 99 36M = 764 -221 GTACTGGGCAATACATGAGATTATTAGGAAATGCTT <<<;<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:75:917:886 147 seq1 951 99 35M = 1110 194 ACTGGGCAATACATGAGATTATTAGGAAATGCTTT <<<<<<<<<<<<<<:<<<<<<<<<71<<<:6<:8< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:118:851:285 147 seq1 953 99 35M = 1133 215 TGGGCAATACATGAGATTATTAGGAAATGCTTTAC <<<<<<<<<<<<<<<<<<<<<<<;;<;<:<<<<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:179:389:585 83 seq1 953 24 35M = 770 -218 TGTGAAATGAATGAGATTATTAGGAAATGCTTTAC ;<)<;*;9*+<;<<,,<,<4<4<<<<<;<4<9494 MF:i:18 Aq:i:24 NM:i:4 UQ:i:53 H0:i:0 H1:i:0
+EAS114_30:7:269:944:220 147 seq1 953 99 35M = 1147 229 TGGGCAATACATGAGATTATTAGGAAATGCTTTAC <<<<<<<8<<<<<<<<<<<<<<<;<<<<<;<<;81 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:93:1002:845 147 seq1 954 99 35M = 1129 210 GGGCAATACATGAGATTATTAGGAAATGCTTTACT <<<<<<<<<<<<<<<<<<<<<:<<;<<<;<<<</< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:66:584:407 83 seq1 954 99 35M = 785 -204 GGGCAATACATGAGATTATTAGGAAATGCTTTACT <<84<<<766<<<.6<<<<<<4<<7<<<<<<<7<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:63:48:631 147 seq1 957 99 35M = 1143 221 CAATACATGAGATTATTAGGAAATGCTTTACTGTC <<<<<<;<<7</<<<<<<;;;<<<;<;<<7;;);< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:187:791:153 147 seq1 958 99 35M = 803 -190 AATACATGAGATTATTAGGAAATGCTTTACTGTCA :;55&<99<<1<;<<8<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:72:1809:1398 83 seq1 958 99 35M = 1145 222 AATACATGAGATTATTAGGAAATGCTTTACTGTCA <<<<<<<<<<<<<<<<<<::<9<<<<<<<<<6<<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:66:257:524 147 seq1 959 99 35M = 791 -203 ATACATGAGATTATTAGGAAATGCTTTACTGTCAT <;<<<<<<<<3<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:247:522:670 147 seq1 960 99 35M = 1121 196 TACATGAGATTATTAGGAAATGCTTTACTGTCATA <<<<<<<<<<<<<<<;<<<<<<<<<<<<<5;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:37:400:627 147 seq1 961 99 35M = 1154 228 ACATGAGATTATTAGGAAATGCTTTACTGTCATAA <<<<<<7+<<<<<<2615<<6<<<<5<<1<<;:74 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:329:177:267 147 seq1 962 99 35M = 1139 212 CATGAGATTATTAGGAAATGCTTTACTGTCATAAC <<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<9; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:166:203:416 147 seq1 963 99 35M = 1136 208 ATGAGATTATTAGGAAATGCTTTACTGTCATAACT <<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<<97< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:14:360:580 147 seq1 963 99 35M = 799 -199 ATGAGATTATTAGGAAATGCTTTACTGTCATAACT <,1<;<;;<<<<<1<<<;<7<<6<:;;<<<<<<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:193:38:987 147 seq1 964 99 35M = 1158 229 TGAGATTATTAGGAAATGCTTTACTGTCATAACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;:;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:39:59:738 147 seq1 965 99 35M = 1142 212 GAGATTATTAGGAAATGCTTTACTGTCATAATTAT 3<8.<<<<<<<-<<<<3<388;;880<0<0)-722 MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS51_66:4:209:92:210 147 seq1 965 99 35M = 1156 226 GAGATTATTAGGAAATGCTTTACTGTCATAACTAT <<<<<<<<<<<<<<<<;<<<<<<<5<7<<;;;<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:86:308:648 83 seq1 970 99 35M = 1161 226 TATTAGGAAATGCTTTACTGTCATAACTATGAAGA =8=====;=8======;=======35==;=;.;25 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:206:563:262 147 seq1 971 99 35M = 1137 201 ATTAGGAAATGCTTTACTGTCATAACTATGAAGAG <<<<<<<<<;<<<<<<<<<<<<;<<<<<<<-;<4; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:82:822:767 83 seq1 972 99 35M = 1165 228 TTAGGAAATGCTTTACTGTCATAACTATGAAGAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<.<,< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:207:926:427 147 seq1 973 99 35M = 1159 221 TAGGAAATGCTTTACTGTCATAACTATGAAGAGAC <<<<<<7<<<<<;<<<<<6:<;<6<&<58<<6::: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:144:28:475 83 seq1 974 99 35M = 1167 228 AGGAAATGCTTTACTGTCATAACTATGAAGAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<::8< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:55:74:1040 147 seq1 975 99 35M = 818 -192 GGAAATGCTTTACTGTCATAACTATGAAGAGACTA ;;;;;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:274:176:479 83 seq1 976 99 35M = 1144 203 GAAATGCTTTACTGTCATAACTATGAAGAGACTAT <<<<<<<<<<<<<;<<<<<<<<<<;<<9<59<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:337:968 147 seq1 981 10 35M = 823 -193 GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA %454<75!7<+!990<9<6<<<<6<</<<<<<<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:24 H0:i:0 H1:i:0
+EAS114_28:7:157:786:424 83 seq1 981 99 36M = 1171 226 GCTTTACTGTCATAACTATGAAGAGACTATTGCCAG <<<<<<<<<<<<<;<<<<<<;<<;<<;<<<<+4:70 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:63:527:1923 147 seq1 981 99 35M = 803 -213 GCTTTACTGTCATAACCATGAAGAGACTATTGCCA 9<<<8<-8;;8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:7:55:506:125 147 seq1 982 99 35M = 817 -200 CTTTACTGTCATAACTATGAAGAGACTACTGCCAG 118%67;1;8,4:187<4>::1:818;;&::<>.; MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_81:2:31:98:804 147 seq1 982 99 35M = 805 -212 CTTTACTGTCATAACTATGAAGAGACTATTGCCAG ====;========7===================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:235:805:373 147 seq1 983 99 35M = 1146 198 TTTACTGTCATAACTATGAAGAGACTATTTCCAGA <<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99; MF:i:18 Aq:i:74 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS114_28:5:11:868:62 83 seq1 983 99 36M = 1154 207 TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT <<<<<<<<<<<<<<<<<<<<:<<<;<<<<(7:7039 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:280:512:316 147 seq1 984 99 35M = 1159 210 TTACTGTCATAACTATGAAGAGACTATTGCCAGCT ==<========6==4==6;;==:===;=2/:+8%6 MF:i:18 Aq:i:68 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:5:292:122:666 83 seq1 985 99 35M = 1159 209 TACTGTCATAACTATGAAGAGACTATTGTCAGATG <<<<<<6<<<<<<<<8;<<<<<<<<<<3&9+;;(; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_53:1:23:403:981 83 seq1 985 99 35M = 1151 201 TACTGTCATAACTATGAAGAGACTATTGCCAGATG <8<<<;<<<<<<;<<<<<<8;<<<9<9,3;,6(91 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:33:1566:588 83 seq1 985 76 35M = 1166 216 TACTGTCATAACTATGAAGAGCCTATTGCCAGATG <;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797 MF:i:18 Aq:i:37 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS139_11:7:92:367:1495 83 seq1 987 99 35M = 820 -202 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA <8<88<<<<7<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:38:1576:1923 83 seq1 987 99 35M = 822 -200 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA 8;<98<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:190:481:295 147 seq1 990 99 35M = 1161 206 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<<<<<<<<<<<<<<<<<<<<<9<<<<<9<7<2:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:168:117:441 83 seq1 990 99 35M = 1151 196 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<3<<<<<<<<<<<<<<<<<<<+<<17;<;:<995 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:239:796:221 147 seq1 992 99 35M = 1160 203 ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC <<<7<<7<<7<<7<;<<<<<,;;,+'<+/+99%:' MF:i:18 Aq:i:37 NM:i:4 UQ:i:26 H0:i:0 H1:i:1
+EAS220_1:4:69:88:1154 147 seq1 992 99 35M = 805 -222 ATAACTATGAAGAGACTATTGCCAGATGAACCACA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:34:956:1309 83 seq1 994 99 35M = 1168 209 AACTATGAAGAGACTATTGCCAGATGAACCACACA <<<<<<7<<<<<<<<<<<6<<<<<<<<<<<:<8<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:229:717:121 83 seq1 995 99 35M = 1150 190 ACTATGAAGAGACTATTGCCAGATGAACCACACAC =================<)=<4<0=.<<<71;41& MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS219_1:1:67:191:668 83 seq1 995 99 35M = 1134 174 ACTATGAAGAGACTATTGCCAGATGAACCACACCT <<<<<<<<<<<<<<<<<6<<;<;<;<<<<<<6;%2 MF:i:18 Aq:i:74 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_64:3:309:303:278 147 seq1 996 99 35M = 1178 217 CTATGAAGAGACTATTGCCAGATGAACCACACATT <<<<<<<<<<<<<<<<+<<+<<7<<<<<5<<<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:60:1020:1259 83 seq1 996 99 35M = 1157 196 CTATGAAGAGACTATTGCCAGATGAACCACACATT <;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:89:1487:520 83 seq1 997 99 35M = 805 -227 TATGAAGAGACTATTGCCAGATGAACCACACATTA 4;;/<<<<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:15:805:420 147 seq1 998 35 35M = 1164 201 ATGAAGAGACTATTCACATGTGAACCACACATTTA ;73;;;;67.;1<<+*.;*&<4947<&474&*9*( MF:i:-126 Aq:i:35 NM:i:4 UQ:i:33 H0:i:0 H1:i:0
+EAS56_57:3:119:761:239 147 seq1 999 99 35M = 813 -221 TGAAGAGACTATTGCCAGATGAACCACACATTAAT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:142:457:584 83 seq1 999 99 35M = 1160 196 TGAAGAGACTATTTCCAGATGAACCACACATTAAT <<<<<<<<<<<<</<<,6<66<<<;<;;<*4744. MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS218_4:7:87:964:826 83 seq1 999 99 35M = 822 -212 TGAAGAGACTATTGCCAGATGAACCACACATTAAT )6<<<<<<:;<6<<::<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:49:905:27 83 seq1 1000 68 35M = 821 -214 GAAGAGACTATTGCCAGTTGAACCACACATTAATA 99515<<&<<6595-56%;86&<;<<<6<<<<6;< MF:i:18 Aq:i:31 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS1_108:3:75:934:439 83 seq1 1001 99 35M = 842 -194 AAGAGACTATTGCCAGATGAACCACACATTAATAC ==7=:=========================<==== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:99:212:522 83 seq1 1002 99 35M = 806 -231 AGAGACTATTGCCAGATGAACCACACATTAATACT <1<16<7<3<<;;<8<<<<<<<<<<<<;<<<<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:187:294:947 147 seq1 1002 99 35M = 823 -214 AGAGACTATTGCCAGATGAACCACACATTAATACT <<:<<8181;<8<<<<<<<<8<<<<<<<<<<<<<: MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:2:152:860:286 147 seq1 1004 99 35M = 1171 202 AGACTATTGCCAGATGAACCACACATTAATACTAT <;<<<;<<0:<3<:<<2<<<<<7+<7+47<9(999 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:49:183:435 83 seq1 1005 99 35M = 843 -197 GACTATTGCCAGATGAACCACACATTAATACTATG 1<7<<<<;:<<<<<;<<<;<<<;<;<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:63:854:610 147 seq1 1005 99 35M = 1180 210 GACTATTGCCAGATGAACCACACATTAATACTATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:12:276:1797 83 seq1 1006 99 35M = 1190 219 ACTATTGCCAGATGAACCACACATTAATACTATGT <<<<<<<<<<<<:</<<9<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:190:42:671 147 seq1 1008 99 36M = 1192 220 TATTGCCAGATGAACCACACATTAATACTATGTTTC <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:67:692:110 83 seq1 1009 99 35M = 1175 201 ATTGCCAGATGAACCACACATTAATACTATGTTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:61:183:767 83 seq1 1010 99 35M = 1195 220 TTGCCAGATGAACCACACCTTAATACTATGTTTCT <<<<<<<<<<;<<<9<9<+<<<8<<<<<<;8<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS221_1:8:77:781:676 83 seq1 1010 99 35M = 846 -199 TTGCCAGATGAACCACACATTAATACTATGTTTCT :<;<2<<<<<<26<<<<6<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:21:132:1423 83 seq1 1012 99 35M = 1178 201 GCCAGATGAACCACACATTAATACTATGTTTCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:163:757:432 147 seq1 1013 99 35M = 837 -211 CCAGATGAACCACACATTAATACTATGTTTCTCAT 1+<8<<<<<<;<5<;<<<<<;5<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_30:3:302:288:657 83 seq1 1013 99 35M = 1173 195 CCAGATGAACCACACATTAATACTATGTTTCTTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:97:1584:777 83 seq1 1013 99 35M = 1200 222 CCAGATGAACCACACATTAATACTATGTTTCTTAT <<;<;;;;<;<;<<;;;;;;;;;;;;;;:;79979 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:280:133:495 147 seq1 1015 99 35M = 843 -207 AGATGAACCACACATTAATACTATGTTTCTTATCT <:<9:<<7:<6<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:100:708:1984 147 seq1 1015 99 35M = 819 -231 AGATGAACCACACATTAATACTATGTTTCTTATCT :8<(8<)9<;<<<<+<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:182:313:319 83 seq1 1016 99 35M = 1180 199 GATGAACCACACATTAATACTATGTTTCTTATCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<;<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:41:474:283 83 seq1 1018 99 35M = 1182 199 TGAACCACACATTAATACTATGTTTCTTATCTGCA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<+<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:28:474:566 83 seq1 1018 99 36M = 855 -199 TGAACCACACATTAATACTATGTTTCTTATCTGCAC ;<<<+<<<<5<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:84:91:614 83 seq1 1019 99 35M = 839 -215 GAACCACACATTAATACTATGTTTCTTATCTGCAC <<;;<<<7<<<<<<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:159:222:274 83 seq1 1019 99 35M = 1189 205 GAACCACACATTAATACTATGTTTCTTATCTGCAC =;9====;=9==59=+==9========9===5;7= MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:62:603:1552 147 seq1 1019 99 35M = 1180 196 GAACCACACATTAATACTATGTTTCTTATCTGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:212:329:348 83 seq1 1020 99 34M = 842 -212 AACCACACATTAATACTATGTTTCTTATCTGCAC 8<6:<:<<<;<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:233:97:262 83 seq1 1021 99 34M = 1175 189 ACCACACATTAATACTATGTTTCTTATCTGCCCA <<<<<<<<<<<;<;<<:<<<<<<<<<<<<.<&77 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_45:7:9:512:826 147 seq1 1021 99 35M = 859 -197 ACCACACATTAATACTATGTTTCTTATCTGCACAT 76777:;;;;;;;;;;;;;;;;;;;;;;;;;:;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:29:794:282 147 seq1 1025 99 36M = 1196 207 CACATTAATACTATGTTTCTTATCTGCACATTACTA <<<<<<<<<<<<<<<<<<<<<;<<<&<<;:<<8<<8 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:278:524:521 147 seq1 1025 99 35M = 1224 234 CACATTAATACTATGTTTCTTATCTGCACATTACT <<<;<<;<<<<<<<;<<<<<<<<<<7;5;<<<;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:39:966:551 83 seq1 1026 99 35M = 1205 214 ACATTAATACTATGTTTCTTATCTGCACATTACTA <<<<<<<<<<<<<<<<<<<<<<<<:<;<&<<&<<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:194:696:490 147 seq1 1026 99 35M = 862 -199 ACATTAATACTATGTTTCTTATCTGCACATTACTA ========;======;==========8==:===== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:305:565:952 83 seq1 1030 99 36M = 1213 219 TAATACTATGTTTCTTATCTGCACATTACTACCCTG 7<<<<<<<<<7<<<<<<<<<7<<<;;<;<;<<<<<+ MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:287:258:321 83 seq1 1030 99 35M = 1194 199 TAATACTATGTTTCTTATCTGCACATTACTACCCT <<<<<<<<<<<;<<<<<<<<42:<+<<<;<<;;;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:278:440:902 147 seq1 1032 99 35M = 851 -216 ATACTATGTTTCTTATCTGCACATTACTACCCTGC <;7;4<;<;;;<<;<;;;<<<<<9<<<;<<<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:180:905:36 83 seq1 1033 99 35M = 1212 214 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ==========8===;;=========;==77%41=; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:152:918:824 83 seq1 1033 99 35M = 839 -229 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:81:786:340 83 seq1 1033 99 35M = 863 -205 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ;<;<<<;<<;<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:196:11:27 147 seq1 1035 65 36M = 1198 199 CTATGTTTCTTATCTGCNCATTACTACCCTGCAATT <<<<<<<<;<<<<<<<8!4<<<;+<88;8<+2,8<; MF:i:18 Aq:i:24 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS192_3:7:298:644:697 83 seq1 1035 99 35M = 863 -207 CTATGTTTCTTATCTGCACATTACTACCCTGCAAT 8:<8;<;:7;<<;4;:+<7<<<<;<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:812:345 83 seq1 1036 99 36M = 871 -201 TATGTTTCTTATCTGCACATTACTACCCTGCAATTA ;<;<<<<5<<<:<;<:<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:178:305:843 83 seq1 1037 99 35M = 864 -208 ATGTTTCTTATCTGCACATTACTACCCTGCAATTA <<<<<<<4<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:30:788:376 147 seq1 1038 99 35M = 866 -207 TGTTTCTTATCTGCACATTACTACCCTGCAATTAA :5<<4:88;9<<<<<;<<<<;<8<;<<<<1<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:1:145:71:26 83 seq1 1040 99 35M = 875 -200 TTTCTTATCTGCACATTACTACCCTGCAATTAATA 882;8;<;;887<<<;;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:157:42:763 147 seq1 1040 99 35M = 1203 198 TTTCTTATCTGCACATTACTACCCTGCAATTATTA <<;<;<<<<<;<:4<<<<<<<<<;;4<<<:;;+;+ MF:i:18 Aq:i:61 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+B7_589:8:74:674:124 83 seq1 1041 99 35M = 854 -222 TTCTTATCTGCACATTACTACCCTGCAATTAATAT ;;;;;<<:<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:154:818:165 83 seq1 1041 99 35M = 881 -195 TTCTTATCTGCACATTACTACCCTGCAATTAATAT ;;;;<<<;<;;<;<<<<;<<;;;<<;<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:319:174:811 83 seq1 1044 99 35M = 1242 233 TTATCTGCACATTTCTACCCTGCAATTAATATAAT <<<<<<<<<;<<<<<<<<<;;<<<<<<<8<<;9<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:3:87:133:930 147 seq1 1044 99 40M = 1198 194 TTATCTGCACATTACTACCCTGCAATTAATATAATTGTGT <<<7<<<<;<<;7<<7<<;;<<<;<5;<;;;5;;<:/48: MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:44:1466:425 147 seq1 1044 99 35M = 1213 204 TTATCTGCACATTACTACCCTGCAATTAATATAAT <<<<<<<<<<<<<<<<<<<<<;<<<<<<;<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:236:498:526 83 seq1 1048 99 35M = 895 -188 CAGCACATTACTACCCTGCAATTAATATAATTGTG <%88<;<:8<<<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_64:3:143:310:958 83 seq1 1048 99 35M = 868 -215 CTGCACATTACTACCCTGCAATTAATATAATTGTG 84<;<6<<<<;<<<;;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:312:837:406 83 seq1 1048 99 35M = 889 -194 CTGCACATTACTACCCTGCAATTAATATAATTGTG ;<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:166:42:147 147 seq1 1048 99 35M = 898 -185 CTGCACATTACTACCCTGCAATTAATATAATTGTG 3.7;;;;:<<<77<<3<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:279:763:945 83 seq1 1048 99 36M = 1210 198 CTGCACATTACTACCCTGCAATTAATATAATTGTGT <<<<<<<<<<<<<<<<<<<4:<<47<:<;<<</<9< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:82:998:566 147 seq1 1050 99 35M = 1227 212 GCACATTACTACCCTGCAATTAATATAATTGTGTC <<<<<<<:<<0<<<<:<82<<::<4<<;<<4<4<; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:228:587:504 147 seq1 1050 65 35M = 891 -194 GCACATTACGACCCGGCAAGGTGTATAATTGTGTC ;4;4;&&82&04+&&48;3&3&*<7<47<<;-<-8 MF:i:-126 Aq:i:65 NM:i:6 UQ:i:47 H0:i:0 H1:i:0
+B7_595:6:290:270:557 147 seq1 1052 99 35M = 880 -207 ACATTACTACCCTGCAATTAATATAATTGTGTCCA 87:9;;;<851+:5.<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:134:243:630 83 seq1 1052 99 35M = 871 -216 ACATTACTACCCTGCAATTAATATAATTGTGTCCA 63<;37:<*&:<<<,,*<<:7<<7<<<<<<<::<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:47:303:887 147 seq1 1052 96 35M = 1240 223 ACATTACTACCCTGCCATTAATATACTTGTGTCCA <<;;<+<9<<<<<9<(6<;//</<8(<<89;6084 MF:i:18 Aq:i:25 NM:i:2 UQ:i:14 H0:i:0 H1:i:0
+EAS221_3:8:74:770:1712 147 seq1 1052 99 35M = 1208 191 ACATTACTACCCTGCAATTAATATAATTGTGTCCA <<<<<<<<<<<<<<<<<<<5<<<<<<<<<<<<7<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:29:575:453 147 seq1 1056 99 36M = 1228 208 TACTACCCTGCAATTAATATAATTGTGTCCATTTAC <<<<<<<<<<<<<<<<<<<<<<<<7<1<:<9<&<98 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:5:318:177:383 147 seq1 1056 99 35M = 1251 230 TACTACCCTGCAATTAATATAATTGTGTCCATGTA ;<<<<<<<<;<<<<<<<<<<<<<<<<<<7<;1'<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:179:549:753 83 seq1 1056 99 35M = 1218 197 TACTACCCTGCAATTAATATAATTGTGTCCATGTA <<<<<<<<<<<<<<<<<<<<<<<<8<7<<<:<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:30:816:90 83 seq1 1057 99 35M = 885 -207 ACTACCCTGCAATTAATATAATTGTGTCCATGTAC :<3:%9299<<<<<<<<<5<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:178:77:424 147 seq1 1058 99 35M = 900 -193 CTACCCTGCAATTAATATAATTGTGTCCATGTACA :5:8<;<;:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:301:54:240 83 seq1 1061 99 35M = 882 -214 CCCTGCAATTAATATAATTGTGTCCATGTACACAC &..*3===1=========5.5==5===4====:5= MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:91:521:517 83 seq1 1061 99 35M = 1239 213 CCCTGCAATTAATATAATTGTGTCCATGTACACAC <<<<<<<<<<<<<<<<9<<<<<<<<<<8<<;;;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:24:1374:211 147 seq1 1064 99 35M = 915 -184 TGCAATTAATATAATTGTGTCCATGTACACACGCT 77661;;;5;;:;;:;:;;;;;;8:;;;:;;;;;: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:282:567:481 147 seq1 1064 88 35M = 880 -219 TGCAATTAATATAATTGTGTCCACGTACACACGCT <9<6<;<9<<<;<<<;<5<7<5</7<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS188_7:4:171:104:398 83 seq1 1066 99 35M = 885 -216 CAATTAATATAATTGTGTCCATGTACACACGCTGT 79<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:9:80:353 147 seq1 1067 99 35M = 1233 201 AATTAATATAATTGTGTCCATGTACACACGCTGTC <<<<<<<<<<<<<<<<<<<<<6<<<;;<<5<<2;2 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:42:920:522 147 seq1 1067 99 35M = 1244 212 AATTAATATAATTGTGTCCATGTACACACGCTGTT <<<<<<<<<<<<<:<<<<<<<:<<<<<<<:;;::& MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_95:3:308:956:873 147 seq1 1068 99 35M = 870 -233 ATAAAAATAAGTGTGTCCATGTACACACGCTGTCC 91.97&9499&-1*98*19999839999.9&9799 MF:i:18 Aq:i:31 NM:i:3 UQ:i:23 H0:i:0 H1:i:1
+EAS139_19:6:84:438:1505 147 seq1 1068 99 40M = 893 -215 ATTAATATAATTGTGTCCATGTACACACTCTGTCCTATGT :0::413::;:::0:179::3<;<:<9<&6<<<;<019<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS51_62:3:55:340:837 147 seq1 1069 99 35M = 1238 204 TTAATATAATTGTGTCCATGTACACACGCTGTCCT <<;<<;<<<<<8<;<<<;<7<<<;<<<<<93+79( MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:262:965:756 147 seq1 1069 99 35M = 885 -219 TTAATATAATTGTGTCCATGTACACACGCTGTCCT <<:<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:18:571:1110 147 seq1 1070 99 35M = 888 -217 TAATATAATTGTGTCCATGTACACACGCTGTCCTA 9<<;<;==;;=;=<;<=================== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:40:918:950 147 seq1 1071 99 35M = 1247 211 AATATAATTGTGTCCATGTACACACGCTTTCCTTT =========,=9=====2=7===7=0==&=+3=-= MF:i:18 Aq:i:65 NM:i:2 UQ:i:17 H0:i:1 H1:i:0
+EAS1_97:2:59:882:980 147 seq1 1071 99 35M = 1263 227 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <<<<<<<<<8<<<<<9<+<<<9<<<1<<77889+6 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:134:853:558 83 seq1 1071 99 35M = 880 -226 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <<<<8<<<7<<<<;;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:278:906:933 147 seq1 1071 99 35M = 920 -186 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <88::<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:12:402:843 83 seq1 1072 99 35M = 885 -222 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <7<+<<11<9<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:160:434:853 147 seq1 1072 99 35M = 1259 222 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <<<<<<<<<<<<<<<<<<<<<<,<<<<:<<<<,<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:55:8:1412 83 seq1 1072 99 35M = 910 -197 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:219:294:861 147 seq1 1073 99 35M = 1244 206 TATAATTGTGTCCATGTACACACGCTGTCCTCTGT <<<<<<<<<<<<<9<<<5<9<<<9<<544<<'<+: MF:i:18 Aq:i:69 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS220_1:4:14:1665:1772 147 seq1 1073 84 35M = 1263 225 TATAATGGTGTCCATGTACACACGCTGTCCTATGT <<<<<7*<<<<<<<<<78<5<<7<<5<556<(73( MF:i:18 Aq:i:39 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+B7_591:3:45:294:380 147 seq1 1074 80 36M = 1233 195 ATAATTGTGTCCATGTACACACGATGTCATATGTAC <<<<<<<<9<<<<<<<<<70<<7<6272&:3<+</% MF:i:18 Aq:i:39 NM:i:2 UQ:i:32 H0:i:0 H1:i:1
+EAS1_108:7:222:538:267 83 seq1 1074 99 35M = 1228 189 ATAATTGTGTCCATGTACACACGCTGTCCTATTTA <<<<<<<<<<<<<<<<<<<<<;<<<<74;;39%6+ MF:i:18 Aq:i:67 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:216:381:608 83 seq1 1075 99 35M = 920 -190 TAATTGTGTCCATGTACACTCGCTGTCCTATGTAC 55<99<<<99;<;<<(<39&7<<<<<<<<<<<<<9 MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_67:1:138:186:274 83 seq1 1075 99 35M = 1231 191 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC =39====9===;=;=;=9=;=====;===-=+=-7 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:43:1120:878 147 seq1 1075 99 35M = 895 -215 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC <<<;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:166:776:590 147 seq1 1075 99 35M = 1252 212 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC <<<<<</<<<<<<<<<<<<<'<=<:26.</79<:: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:76:333:905 83 seq1 1076 99 35M = 929 -182 AATTGTGTCCATGTACACACGCTGTCCTATGTACT <<;<<<<;7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:29:249:878 83 seq1 1077 99 35M = 921 -191 ATTGTGTCCATGTACACACGCTGTCCTATGTACTT <,;<9<;<:<<<<<<<<<<<<<<<<<<<<<<><<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:190:95:706 147 seq1 1078 99 35M = 920 -193 TTGTGTCCATGTACACACGCTGTCCTATGTACTTA 9;97437;<;;<<;<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:101:825:28 83 seq1 1079 99 35M = 879 -235 TGTGTCCATGTACACACGCTGTCCTATGTACTTAT 0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:188:460:1000 83 seq1 1080 99 35M = 1251 206 GTGTCCATGTACACACGCTGTCCTATGTACTTATC <<<<<<<<<<<<<<<<7<<;:4;44<;;:8;;9;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:268:523:511 83 seq1 1081 99 35M = 1241 195 TGTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<;<<<<6<:9<<3<44 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:54:263:585 83 seq1 1081 99 36M = 1254 209 TGTCCATGTACACACGCTGTCCTATGTACTTATCAT <<<<<<<<<<<<<<<<<<<:;<<;<:;::<<;;:;4 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:174:987:334 83 seq1 1082 99 35M = 908 -209 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ,;<;;<<<&<<<1<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:224:932:942 83 seq1 1082 99 34M = 1250 203 GTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:12:1296:358 83 seq1 1082 96 35M = 1252 205 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ;;;6;7;7;;;;;7;9;;-*1;9;699/99/7477 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:306:119:56 147 seq1 1083 99 35M = 919 -199 TCCATGTACACACGCTGTCCTATGTACTTATCATG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:66:179:118 147 seq1 1084 99 35M = 1262 213 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;<<6<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:110:584:649 83 seq1 1084 99 35M = 1266 217 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<::<38 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:28:315:310 147 seq1 1085 99 35M = 1242 192 CATGTACACACGCTGTCCTATGTACTTATCATGAC <<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:242:4:593 147 seq1 1086 99 35M = 905 -216 ATATACACACGCTGTCCTATGTACTTATCATGACT 1.%55877+8+88808887+7;7;18:8;;;.&;8 MF:i:18 Aq:i:53 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:131:946:353 147 seq1 1087 99 35M = 1249 197 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<;<<<<;;<<<<<<<;<:52;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:4:1732:88 83 seq1 1087 99 35M = 1265 213 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<<<<<2<8;8<;<8;<2;2:<:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:58:703:72 83 seq1 1088 99 35M = 905 -218 GTACACACGCTGTCCTATGTACTTATCATGACTCT 5&<<7;+95;7'6<<<<<.<<<<<;<<9<7<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:113:694:725 147 seq1 1088 99 35M = 1266 213 GTACACACGCTGTCCTATGTACTTATCATGACTCT <<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:278:848:765 147 seq1 1088 99 35M = 920 -203 GTACACACGCTGTCCTATGTACTTATCATGACTCT 7;;<;5<55<<;;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:234:787:12 147 seq1 1092 97 35M = 1257 200 ACACGCTGGCCTATGTACTTATAATGACTCTATCC <;<<<9<<&+9;3;<993;<9<+94;9&41;08%9 MF:i:18 Aq:i:24 NM:i:2 UQ:i:15 H0:i:0 H1:i:0
+EAS218_1:4:15:856:340 147 seq1 1093 99 35M = 936 -192 CACGCTGTCCTATGTACTTATCATGACTCTATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:258:266:101 147 seq1 1094 99 35M = 1285 226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA <<<<<<<<<<<<<<<<<<5<;,<-2<<<<;68<<6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:552:234 147 seq1 1094 99 35M = 903 -226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA ::;:=;=99=====;;====;==========<=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:134:379:893 147 seq1 1095 99 35M = 927 -203 CGCTGTCCTATGTACTTATCATGACTCTATCCCAA 7137::;<<<<<<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:256:404:584 147 seq1 1096 99 35M = 928 -203 ACTGTCCTATGTACTTATCATGACTCTATCCCAAA &&326+23<3<<<+:<</<<8<<<:7:<<<<<<<< MF:i:18 Aq:i:60 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_30:4:317:378:535 147 seq1 1096 99 35M = 1258 197 GCTGTCCTATGTACTTATCATGACTCTATCCCAAA <<<<<<<<<<<<:<<<<<<<<<;<<;<8<;:7:1( MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:277:482:316 83 seq1 1098 99 35M = 894 -239 TGTCCTATGTACTTATCATGACTCTATCCCAAATT 9998;<<<<<;;<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:273:901:459 147 seq1 1098 99 35M = 938 -195 TGTCCTATGTACTTATCATGACTCTATCCCAAATT 4;+/+7,;<8+&<;;82;;<8<8<2<;<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:316:25:230 147 seq1 1098 99 35M = 1273 210 TGTCCTATGTACTTATCATGACTCTATCCCAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<);2;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:24:195:604 83 seq1 1098 99 35M = 923 -210 TGTCCTATGTACTTATCATGACTCTATCCCAAATT ;6<02;<<<<59<<;<;<<<<9<3<<<<<<<<<;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:42:923:169 83 seq1 1099 99 35M = 925 -209 TTCCTATGTACTTATCATGAATCTATCCCAAATTC &;972<;&<9<,;;;<<<;<&99<<;<;;3<<3<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:10 H0:i:0 H1:i:1
+EAS114_45:6:59:1548:1096 147 seq1 1099 99 35M = 1297 233 GTCCTATGTACTTATCATGACTCTATCCCAAATTC ;.;;;;;;;;6;;;;;;;;;;;;;;;73;;77777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:136:389:320 147 seq1 1100 99 35M = 930 -205 TCCTATGTACTTATCATGACTCTATCCCAAATTCC .5:,666<)<8<:<<:66<<<<<<<<<<5<<7<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:122:342:296 83 seq1 1100 99 35M = 1256 191 TCCTATGTACTTATCATGACTCTATCCCAAATTCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<*<<<<9< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:259:467:737 83 seq1 1102 99 36M = 923 -215 CTATGTACTTATCATGACTCTATCCCAAATTCCCAA 8<<<<<<<:<<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:71:832:743 147 seq1 1102 99 35M = 1290 223 CTATGTACTTATCATGACTCTATCCCAAATTCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<*<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:105:521:563 147 seq1 1103 72 35M = 1267 199 TATGTACTTATCATGACTCTATCCCAAATTCCCAA ;<)<9995<9<<59<7<<<<7<7<35,0,544<3( MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:201:195:757 147 seq1 1103 99 35M = 1298 230 TATGTACTTATCATGACTCTATCCCAAATTCCCAA <<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;;8 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:6:585:132 147 seq1 1105 23 36M = 1276 207 TGTACTTATCATGTTTCTTTCCTAATTTTTCAATTA 6666166&6)+61))646+6&)&%&-44))1'144' MF:i:-126 Aq:i:23 NM:i:7 UQ:i:59 H0:i:0 H1:i:0
+EAS1_105:2:179:532:82 83 seq1 1105 99 35M = 1285 215 TGTACTTATCATGACTCTATCCCAAATTCCCAATT <<<<<<<<<<<<<<<<<<<<3<;<;<<<<:<8<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:11:646:628 147 seq1 1106 99 36M = 930 -212 GTACTTATCATGACTCTATCCCAAATTCCCAATTAC <<<3<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:93:334:858 147 seq1 1106 99 35M = 932 -209 GTACTTATCATGACTCTATCCCAAATTCCCAATTA ;<;+;;<<;<<<<<;<<<<;;8<<<<8<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:26:785:882 83 seq1 1107 99 35M = 926 -216 TACTTATCATGACTCTATCCCAAATTCCCAATTAC <<&5&<<<<5.;5<'<<;.76<<<<<7<7<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:4:54:989:654 83 seq1 1108 99 35M = 1296 223 ACTTATCATGACTCTATCCCAAATTCCCAATTACG <<<<<<<<<<<<<<<9<<<<<<9<<<<<1<<<88; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:202:326:680 147 seq1 1108 78 35M = 1268 195 ACTTATCATGACTCTATCCCAAATTCTCAATTACG <<<<<<<4<<<*<<<*<<<7..:7<3*:7.7<+.; MF:i:18 Aq:i:37 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+B7_597:3:53:616:842 147 seq1 1109 99 35M = 1288 214 CTTATCATGACTCTATCCCAAATTCCCACTTACGT <<<<<<<<<<<<<<<<<<<;07<<<<<-&<<-<4; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_71:4:209:159:130 147 seq1 1109 99 35M = 934 -210 CTTATCATGACTCTATCCCAAATTCCCAATTACGT ;:6<:<8::;<<<;<-<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:75:917:886 83 seq1 1110 99 35M = 951 -194 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<8<<<<<<8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:286:753:854 147 seq1 1110 99 35M = 1288 213 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<<<<<<<<<<<<<<<3<<<<<<9999<;<<9; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:290:146:36 83 seq1 1110 99 35M = 1280 205 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<<<<<<<<<<<<<<<<<<<<8<<<<<;;<;;< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:93:1475:542 147 seq1 1110 99 35M = 1254 179 TTATCATGACTCTATCCCAAATTCCCAATTACGTC ;;;;;;;;;;;;;;;;;;;;;;9;;;9;;;77777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:77:251:446 83 seq1 1110 99 35M = 939 -206 TTATCATGACTCTATCCCAAATGCCCAATTACGTC <<24,:8<<<:1<<<:35<:<:,<<<<<<:5:<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS1_105:3:176:431:647 147 seq1 1112 99 35M = 1285 208 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <<<<<<<<<<<<<<<<2<<<<<<<<6<<<<9<<6< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:111:796:737 147 seq1 1112 99 35M = 936 -211 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <3<<<<<<<<<<<7<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:228:189:826 147 seq1 1112 99 35M = 914 -233 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT :74=:.==1========================== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:35:631:594 147 seq1 1112 99 35M = 1271 194 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:29:529:379 83 seq1 1117 99 35M = 926 -226 GACTCTATCCCAAATTCCCAATTACGTCCTATCTT ;<<<:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:74:596:137 83 seq1 1119 91 35M = 1294 210 CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT <<<<<<<<<</4<<<<<<*<:6<<<<<<<<;/3<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:92:1807:1185 147 seq1 1119 99 35M = 940 -214 CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT <<<<<<9<<<<<<<<<<<<<<<<<<<<<<><<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:57:735:151 83 seq1 1121 94 35M = 1314 228 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<<<<8<<8<:<<*<:<<<4<<<;,<<<<:<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:142:858:903 147 seq1 1121 99 35M = 943 -213 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:247:522:670 83 seq1 1121 99 35M = 960 -196 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC ;;;9;:<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:75:732:442 83 seq1 1121 99 40M = 1293 212 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<;<<<<<9<<<;<<;<<<5<<;8<<<<<<<<;:9%% MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:183:645:699 83 seq1 1122 86 35M = 1281 194 TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT <<9<9<<<<<<<<<;<<;<<*175;173<;;;<-/ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:175:437:950 147 seq1 1126 99 35M = 1298 207 CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:59 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:93:1002:845 83 seq1 1129 99 35M = 954 -210 AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA <<::;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:50:542:881 147 seq1 1132 99 35M = 1324 227 TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA <<<<<4<09<<9<<2<<<<<<<<<<<2/.&2<%<7 MF:i:18 Aq:i:63 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_99:3:118:851:285 83 seq1 1133 99 35M = 953 -215 CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC 3+7<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:67:191:668 147 seq1 1134 99 35M = 995 -174 CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA <<<<<7<<7<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:166:203:416 83 seq1 1136 99 35M = 963 -208 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC <<<<<<<<::<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:15:1497:1530 83 seq1 1136 99 35M = 1314 213 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC 0<;;;9;;86<;;;<<&<<.<<;)3;7;654-471 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:206:563:262 83 seq1 1137 99 35M = 971 -201 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:40:352:151 83 seq1 1137 99 35M = 1327 225 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:67:302:762 83 seq1 1138 99 36M = 1313 211 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<;;65;<-<;<:8<<<3 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:84:927:843 147 seq1 1138 99 35M = 938 -235 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT 588;<:<<<<<<<6<<<<;<<<:/<<3<:;<*<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:147:479:41 147 seq1 1139 99 35M = 1322 218 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<::6<<;<<<;;9;;6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:329:177:267 83 seq1 1139 99 35M = 962 -212 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:72:916:763 147 seq1 1142 99 35M = 1340 233 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT </:8<8)<<<<:<<<<<;.89<:67<.;<<7+336 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:124:128:489 83 seq1 1142 99 35M = 1348 241 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT <<<<<<<<<<<<<<<<<6:6<<-4<::;;<<:48< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:39:59:738 83 seq1 1142 99 35M = 965 -212 GTCCTATGTTCTTCTTAGGGAAGAACAGCTTAGGT ;.;4;<;3<<9<<9<&<<9<<<<<;<9<;<<;9<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS1_99:6:63:48:631 83 seq1 1143 99 35M = 957 -221 TCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTA ;*:;;<2<<2779;:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:274:176:479 147 seq1 1144 99 35M = 976 -203 CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT 7)<<7<626<<7<<<<<<<<<<<<<<<<<<<3<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:72:1809:1398 147 seq1 1145 99 35M = 958 -222 CTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATC ;:;;:<7:7<:<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:235:805:373 83 seq1 1146 99 35M = 983 -198 TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA <<;<<<<<<9<9<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:269:944:220 83 seq1 1147 99 35M = 953 -229 ATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAA <;<;8<<;7<<<<<;<<-<<<<<<;<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:174:597:66 147 seq1 1148 99 35M = 1307 194 TCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAAT <<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;6;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:229:717:121 147 seq1 1150 99 35M = 995 -190 TTCTTCTGAGGGAAGAACAGCTTAGGTATCAATTT 6;-;7<<(<<<<<8<18<7<<<<<<<<<;<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS56_53:1:23:403:981 147 seq1 1151 99 35M = 985 -201 TCTTCATAGGGAAGAACAGCTTAGGTATCAATTTG (;3+<&3<</7<<<<<<;<<<<<<<<<<<<</<2< MF:i:18 Aq:i:65 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS112_32:7:168:117:441 147 seq1 1151 99 35M = 990 -196 TCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTG ;;;;3;<<<<<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:52:1455:1212 83 seq1 1153 99 40M = 1304 191 TTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCT <9<<<99<;<<9<;<-<<<6<<75;;<*%<5<3+.8:*5; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:37:400:627 83 seq1 1154 99 35M = 961 -228 TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTG 474*;<<9<;<<<;<<:<<<<<<;<<<<<<;<<;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:11:868:62 147 seq1 1154 99 36M = 983 -207 TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGT ;;77;;7<<<<<<<<7<<<;<7<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:209:92:210 83 seq1 1156 99 35M = 965 -226 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT ;9;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:128:394:455 147 seq1 1156 99 35M = 1313 192 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT ======6==========;===9==;5===;==;== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:316:949:122 83 seq1 1156 99 35M = 1321 200 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0<:<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:60:1020:1259 147 seq1 1157 99 35M = 996 -196 TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:193:38:987 83 seq1 1158 99 35M = 964 -229 AGGGAAGAACAGCTTAGGTATCAATTTTGTGTTCT <<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_93:5:292:122:666 147 seq1 1159 99 35M = 985 -209 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG <;<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:280:512:316 83 seq1 1159 99 35M = 984 -210 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG ;9===;======;7==;;======;=====;==== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:207:926:427 83 seq1 1159 99 35M = 973 -221 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG ;;7<<;4<<<2<<;<<<<<<<<<<7<;<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:239:796:221 83 seq1 1160 99 35M = 992 -203 GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT ;;<<;<<;<<<+:<<<4<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:142:457:584 147 seq1 1160 99 35M = 999 -196 GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT 8::<:<<9<<.<:<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:190:481:295 83 seq1 1161 99 35M = 990 -206 GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG ;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:86:308:648 147 seq1 1161 99 35M = 970 -226 GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG <7<<<;<<<<+;<<<2<5<<<77;<<2<;;<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:182:23:585 83 seq1 1163 99 35M = 1336 208 AGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:216:650:516 83 seq1 1164 99 36M = 1326 198 GAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:15:805:420 83 seq1 1164 35 35M = 998 -201 GAACAGTTTAGGTATCAATTTGGTGTTCTTTGTAA <64<59&996<(64<)7).68<0<0<<7741<1:< MF:i:18 Aq:i:35 NM:i:2 UQ:i:24 H0:i:0 H1:i:1
+EAS56_65:6:82:822:767 147 seq1 1165 99 35M = 972 -228 AACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA <<9<<<<<<<<<<;;<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:33:1566:588 147 seq1 1166 76 35M = 985 -216 ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG -6246;;97;77;;97;;;;;;9;7;79;)&;37; MF:i:18 Aq:i:37 NM:i:1 UQ:i:22 H0:i:0 H1:i:1
+EAS1_93:1:20:635:509 147 seq1 1167 99 35M = 1333 201 CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT <<<<<<<<<;<<<<;<<<;<;;;<<<;<<<<<<(8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:144:28:475 147 seq1 1167 99 35M = 974 -228 CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT ;;;9;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:36:1402:1709 147 seq1 1168 99 35M = 1326 193 AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC <<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<:9<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:34:956:1309 147 seq1 1168 99 35M = 994 -209 AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC 9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:157:784:936 147 seq1 1169 99 35M = 1356 222 GCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCT <<<<<<<<<<<<<<<<<:<<<<<<;<<<<814<4< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:2:152:860:286 83 seq1 1171 99 35M = 1004 -202 TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA 2;5;8<<;5<<<;<2<8<<<<<<;8<;<<<<;<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:157:786:424 147 seq1 1171 99 36M = 981 -226 TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG ;<;2;;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:33:1407:94 147 seq1 1172 99 35M = 1360 223 TAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG ;;;;;;;6:;;:::7;:;;;;:::;;;;:;47771 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:302:288:657 147 seq1 1173 99 35M = 1013 -195 AGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGG <:5<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:233:97:262 147 seq1 1175 99 35M = 1021 -189 GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA --;;7<;<;;:;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:67:692:110 147 seq1 1175 99 35M = 1009 -201 GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA ;;<<8<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:68:692:347 147 seq1 1176 99 36M = 1351 211 TATCAATTTGGTGTTCTGTGTAAAGTCTCATGGAGC <<<<<<<<<+6<;<<<<3<:<<<<6<8<<<&*/;*0 MF:i:18 Aq:i:64 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS51_64:3:309:303:278 83 seq1 1178 99 35M = 996 -217 TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC <:<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:21:132:1423 147 seq1 1178 99 35M = 1012 -201 TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC :<<<<<6<<;<<;<5<;<<<<<<;<6<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:63:854:610 83 seq1 1180 99 35M = 1005 -210 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT :.5;2<:88<<72:<<;<<7<8;<;/<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:182:313:319 147 seq1 1180 99 35M = 1016 -199 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT </<;185;8<;;87<;8<<<<8<;83<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:62:603:1552 83 seq1 1180 99 35M = 1019 -196 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT 8::;:<<6<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:145:144:796 83 seq1 1181 99 35M = 1372 226 ATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTC <<<<<<<<<<<<<<;<<<<<<;<<<<<<4;4;<;/ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:41:474:283 147 seq1 1182 99 35M = 1018 -199 TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC 6/;;;88;;<:;48<<<<<;<;<<<<<<<<<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:329:458:365 83 seq1 1186 99 35M = 1364 213 GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT ==========================9======== MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:159:222:274 147 seq1 1189 99 35M = 1019 -205 GTCTGGGGAAAGTCTCAGGGAGCCGTCCGTGTCCT ''7*<&<'<<<<.<2<<<<<<<<<<+<<<8<8<<; MF:i:18 Aq:i:37 NM:i:3 UQ:i:17 H0:i:0 H1:i:1
+EAS114_32:6:88:162:587 83 seq1 1189 99 35M = 1372 218 TTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCT <;<<<<<<<<<;<5<;<;<<7<++<<2&*:322+7 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:148:340:479 83 seq1 1190 99 35M = 1364 209 TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC <<<<<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:12:276:1797 147 seq1 1190 99 35M = 1006 -219 TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC )9<02)<<<<<<<<<<<<<1<<<<&<<<<9<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:190:42:671 83 seq1 1192 99 36M = 1008 -220 TGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA <<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:321:271:138 83 seq1 1193 99 35M = 1394 236 GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA <<<<<<<<<<<<<<<<<<<<<;9<<;<<;;<88;& MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:154:669:853 147 seq1 1193 99 35M = 1371 213 GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA ============<===.====<:=<9=<<<9;:;2 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:287:258:321 147 seq1 1194 99 35M = 1030 -199 TGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCAT :.<9<)<;<9<.<<:<:+5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:61:183:767 147 seq1 1195 99 35M = 1010 -220 GTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATC 6&.;;<3<363<<<<<<<<8<<<6<<<<3<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:29:794:282 83 seq1 1196 99 36M = 1025 -207 TAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG 7<<<<45::-<<<<<;<<-;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:313:827:992 83 seq1 1197 99 35M = 1379 217 AAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG <<<<6<<<<:<<<<<66<<<:33:<<<80<;6<8+ MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:196:11:27 83 seq1 1198 65 36M = 1035 -199 AAGACCCAGTTAGCCGTCCGTGTCCTCCCATCTGGC 96&6<'<7:!!<,:;+7<<6:<<<<<<<<<7<7;:< MF:i:18 Aq:i:24 NM:i:4 UQ:i:27 H0:i:0 H1:i:0
+EAS139_19:3:87:133:930 83 seq1 1198 99 40M = 1044 -194 CAGTCTCAGGGCGCCGTCCGTTTCCTCCCATCTGGCCTCG )8&)907)-;9&,<<9)<;<<0<;<<99<<<<<<;<<9<< MF:i:18 Aq:i:39 NM:i:3 UQ:i:28 H0:i:0 H1:i:1
+EAS114_45:7:97:1584:777 147 seq1 1200 99 35M = 1013 -222 GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC 66746,9::9;;;;:;;;;;;;;;;;;;;;:;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:127:153:861 83 seq1 1202 99 35M = 1374 207 CTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTC <<<<<<<<<<<<<<<<<<<<<<<=<*<<<24;;:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:157:42:763 83 seq1 1203 99 35M = 1040 -198 TCTGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCG 4++;((2(5;24<./<:<<<<<<<<;<<88<<<<9 MF:i:18 Aq:i:61 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:4:91:267:655 83 seq1 1204 99 35M = 1365 196 CAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGT <<<<<<<<<<<<<<<<<<<<<;:;;7<9477<74; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:39:966:551 147 seq1 1205 99 35M = 1026 -214 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC 8;;;;;<<6'<<<+8<<<1<<<<4<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:61:38:1182 147 seq1 1205 99 35M = 1388 218 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:47:352:1492 83 seq1 1205 99 40M = 1385 220 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGCCCACTA :<<<::<24<04-&<;<<2<<<&<60)&<5<<6*8:)9+* MF:i:18 Aq:i:53 NM:i:3 UQ:i:28 H0:i:1 H1:i:0
+EAS221_3:8:74:770:1712 83 seq1 1208 99 35M = 1052 -191 GAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCAC 3.&::6<<<9<6:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:279:763:945 147 seq1 1210 99 36M = 1048 -198 GCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT +9:-+<:1-44<<':<;<+<-<<<;:<<;;<<<<<0 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:306:388:342 147 seq1 1211 99 35M = 1398 222 CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT ================5====:=====;==1=4== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:180:905:36 147 seq1 1212 99 35M = 1033 -214 CCTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG 6%%<;<662<<*;<<<8<<:<<<<<<<<<<<<<<; MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:2:19:752:816 83 seq1 1212 99 35M = 1394 217 CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG <<<<<<<<<<<<<<<<<<<8<7;<;<<767277;6 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:305:565:952 147 seq1 1213 99 36M = 1030 -219 GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT 5(<1<147<81<*8--8<<<7<91<<<;+<+<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:44:1466:425 83 seq1 1213 99 35M = 1044 -204 GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGG 6-<<9<<:<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:68:64:783 147 seq1 1214 99 35M = 1402 223 TCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT <<<<<<<<<<<<<<<<<;;<<<<<<;<<<9:<<:9 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:64:37:257 147 seq1 1215 99 35M = 1389 209 CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT ================<=====;===8;4====== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:20:413:1334 83 seq1 1215 99 35M = 1370 190 CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT 7<<;<<<.;<;67;7;;;:;;3;<59+...77677 MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:179:549:753 147 seq1 1218 99 35M = 1056 -197 TGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTC :77<</<<<::<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:16:823:343 83 seq1 1223 99 35M = 1403 215 TCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAA ================================4== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:266:556:252 83 seq1 1224 99 35M = 1392 203 CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA <<<<<<<<<<<<<<<<<;<<<<<<4;;<;;;<7;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:278:524:521 83 seq1 1224 99 35M = 1025 -234 CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA 7777,<;<<7<<<<;;<<;;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:72:1426:1883 83 seq1 1226 99 35M = 1405 214 CATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:82:998:566 83 seq1 1227 99 35M = 1050 -212 ATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCT <9<9<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:29:575:453 83 seq1 1228 99 36M = 1056 -208 TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTG ;<<<;;<:<<<;<;<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:222:538:267 147 seq1 1228 99 35M = 1074 -189 TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTT 52/8-<<7<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:138:186:274 147 seq1 1231 99 35M = 1075 -191 GGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGG <;<<<<<6;<<<<<3<<36;3;<9<<<<<<3;<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:137:895:681 83 seq1 1232 99 35M = 1418 221 GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<-8<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:71:636:533 83 seq1 1232 99 35M = 1398 201 GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC <<<<<<<<<<<<<<<<<<<<<<<7<<<5<<<-847 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:45:294:380 83 seq1 1233 80 36M = 1074 -195 CCTCGTCCACACTGGTTCGCTTGAAAGCTTGGGCTG ;<+<7<<<<;7<,<7<<<+/7;<<;<<;7<<<;<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_66:8:9:80:353 83 seq1 1233 99 35M = 1067 -201 CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT ;;5;:8<:<:;:;<<<<;<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:73:302:1574 83 seq1 1233 99 35M = 1429 231 CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT <<<<<<<<<<;<<<<<<<<<<<<+:;<<;:8;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:131:779:345 147 seq1 1237 99 35M = 1399 197 GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA ============================9====;= MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:159:71:155 83 seq1 1237 99 35M = 1428 226 GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA =========;=<======;=:=3;==;=6<==;=; MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:55:340:837 83 seq1 1238 99 35M = 1069 -204 TCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAAT 61378<::<<<5:<;;:<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:91:521:517 147 seq1 1239 99 35M = 1061 -213 CCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATG 8;8<4=:===7===9=============<====== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:47:303:887 83 seq1 1240 96 35M = 1052 -223 CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA <;<6<;<;<8<<<8<<<<;<<<.<<<<<<<8<8;< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:74:570:695 147 seq1 1240 99 35M = 1436 231 CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA =========================7====;8<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:268:523:511 147 seq1 1241 99 35M = 1081 -195 ACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGAT 8<7<99<<<<<<<<<:<<<<<<4<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:319:174:811 147 seq1 1242 99 35M = 1044 -233 CACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATG ;7;3<<3.<<<<<<<<<<<4<<<<<<<<<<<<<0< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:28:315:310 83 seq1 1242 99 35M = 1085 -192 AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG +%,768<<:<:<2<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:4 UQ:i:70 H0:i:1 H1:i:0
+EAS1_108:1:328:614:638 83 seq1 1243 99 35M = 1428 220 ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGC <<<<<<<<<<<<<<<<<<<<4/;<<9<<<<7<<*: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:63:930:152 147 seq1 1243 99 35M = 1410 202 ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATTC <<<<;<<<<<<<7<<;::<<)726;)<99<)&;&+ MF:i:18 Aq:i:59 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_59:1:219:294:861 83 seq1 1244 99 35M = 1073 -206 CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC ;,;<;<<<;&<<<<<<<5<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:42:920:522 83 seq1 1244 99 35M = 1067 -212 CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC ;;;;;99<;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:87:89:696 83 seq1 1245 99 36M = 1419 210 TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<:;<<<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:166:979:531 147 seq1 1245 99 35M = 1410 200 TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCC <<</<<<<<<<<<9<<9<<;<7<<<<9<<<9<,)6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:40:918:950 83 seq1 1247 99 35M = 1071 -211 GTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCT =0=&&33======;=====.=============== MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:131:946:353 83 seq1 1249 99 35M = 1087 -197 TCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTG <<:<<66<<<6<<4<<<:8<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:224:932:942 147 seq1 1250 99 35M = 1082 -203 CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG <;<<;;<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:318:177:383 83 seq1 1251 99 35M = 1056 -230 TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC 5:9;7;777<<7<<<<<<<<<<<<<<<<<<<<<<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:188:460:1000 147 seq1 1251 99 35M = 1080 -206 TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC +;+077<7;<57<;;8<<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:12:1296:358 147 seq1 1252 96 35M = 1082 -205 CTTGAAAGCTTGGTCTGTAATGATGCCCCTTGGCC -770074;;6;&42;:2;;;:;;;;:;;/:;;;;: MF:i:18 Aq:i:37 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS188_4:5:166:776:590 83 seq1 1252 99 35M = 1075 -212 CTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCC <;:;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:54:263:585 147 seq1 1254 99 36M = 1081 -209 TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATC 1:::6<<<<;;;<4<<<<<<<<6<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:93:1475:542 83 seq1 1254 99 35M = 1110 -179 TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT 98987:9:<:;:;;;;;<<;<;<;;;;<<<;;;<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:122:342:296 147 seq1 1256 99 35M = 1100 -191 AAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCA <:;:<<<;<2<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:234:787:12 83 seq1 1257 97 35M = 1092 -200 AAGCTTGGGCTGTAATGATGCCCCTTGGCCATCAC ;;.<;;994<;9<<;;;<<<<<<<7<<<<<<<<<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:317:378:535 83 seq1 1258 99 35M = 1096 -197 AGCTTGGGCTGTAATGATGCCCCTTGGCCATCACC ;7;':<77<<;<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:160:434:853 83 seq1 1259 99 35M = 1072 -222 GCTTGGGCTGTAATGATGCCCCTTGGCCATCACCC ;;*4;<;<<<;<<<<<<<8<<<;<<<<<<<<8<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:18:1498:1475 147 seq1 1260 99 35M = 1427 202 CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG <<<<<7<<<<<<+<<-3<<3<:<2<1<<:<<<<<+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+B7_593:2:104:744:280 83 seq1 1262 64 36M = 1421 195 TGGGCTGTAATGATGCCCCTTGTCCATCACCCGGTC <<<<<<<<<<<<<<;<;<<<<:4<<4<<0<;80+;: MF:i:18 Aq:i:21 NM:i:2 UQ:i:34 H0:i:0 H1:i:1
+EAS1_95:4:66:179:118 83 seq1 1262 99 35M = 1084 -213 TGGGCTGTAATGATGCCCCTTGGCCATCACCCAGT <<99<<<<<<<<<<<<<<<<<<<9<<<:<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:277:194:143 83 seq1 1262 99 35M = 1444 217 TGGGCTGTAATGATGCCCCTTGGCCATCACCCGGT <<<<<<<<<<<;<<<<<<<<<<9;<<<8</<<6<: MF:i:18 Aq:i:72 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS1_97:2:59:882:980 83 seq1 1263 99 35M = 1071 -227 GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC 7339%<6<<<<<;<<9<<8<<<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS220_1:4:14:1665:1772 83 seq1 1263 84 35M = 1073 -225 GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC <&7<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_57:2:259:42:969 147 seq1 1265 99 35M = 1426 196 GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC <<<<<;<<;<<3<<<;9<36<<29;<<;;;</;<2 MF:i:18 Aq:i:69 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:4:4:1732:88 147 seq1 1265 99 35M = 1087 -213 GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC :<4<:<<:<::<<<<<::<<<<<:<:<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:2:110:584:649 147 seq1 1266 99 35M = 1084 -217 CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ++:4686<<68<;<;<;<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_59:5:113:694:725 83 seq1 1266 99 35M = 1088 -213 CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ;::<<:<:<<<<<<<<<<:<:<<<<<<;<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:8:58:369:244 147 seq1 1266 99 35M = 1436 205 CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:105:521:563 83 seq1 1267 10 35M = 1103 -199 TGTAATGCTGCCCCTTGGCCATCCCCCGGTCCCTG /8)-8/6(98<967<3<<979<<1<<<7<<<<7<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:45 H0:i:0 H1:i:0
+EAS188_4:5:202:326:680 83 seq1 1268 78 35M = 1108 -195 GTAATGATGCCCCTTGGCCATCACCCGGTCCCTGC +33<81<:*<;<;;30;<<<;<<<8<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS192_3:6:216:292:528 83 seq1 1269 99 35M = 1438 204 TAATGATGCCCCTTGGCCATCACCCAGTCCCTGCC <;<;<<<<<<<;<<<<<<<<;;;;:;;:<%<;1;: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1864:477 147 seq1 1270 99 35M = 1465 230 AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:35:631:594 83 seq1 1271 99 35M = 1112 -194 ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC <<<<4<<<<<.<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS112_34:8:103:812:255 83 seq1 1272 99 35M = 1461 224 TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCC <<<<<<<<<<<<<<<9<<;<<<39;;<;32:7;7+ MF:i:18 Aq:i:69 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS188_7:4:259:869:641 83 seq1 1272 99 35M = 1435 198 TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCA <<<<<<<<<<<<<<<<<<<<<,;<:<<<<<<<<<1 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:316:25:230 83 seq1 1273 99 35M = 1098 -210 GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT 8;8;<<;<;;<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:6:38:1071:155 83 seq1 1274 99 35M = 1465 226 ATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATC <<<<<<<<<<<<<:<<<<<<<<8<<<:<<:;;8:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:6:585:132 83 seq1 1276 23 36M = 1105 -207 GCCCCTTGACCACCACCCAGTCCCTGCCCCATCTCT :<473$'<+5;7*+<7<&<37<7<<<<7;;7<<:<7 MF:i:18 Aq:i:23 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+B7_595:6:47:720:789 83 seq1 1278 90 35M = 1455 212 CCCTTGGCCATCACCCGGTCCCGGCCCCTTCTCTT <<72<<<<<<<<;;<7;,0<2;*7<2;<*;;<<64 MF:i:18 Aq:i:25 NM:i:3 UQ:i:44 H0:i:0 H1:i:0
+EAS192_3:6:185:868:496 147 seq1 1278 99 35M = 1442 199 CCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTT <<<<<<<<<<<<;<<<;<<<<<<<<<<<9<<;<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:290:146:36 147 seq1 1280 99 35M = 1110 -205 CTTTCCCATCCCCCGGTCCCTGCCCCATCTCTTGT 7;%%%<8-4<(<<<7<<<:<:<<<<<<<<<<<<<< MF:i:18 Aq:i:25 NM:i:4 UQ:i:37 H0:i:0 H1:i:0
+B7_593:5:267:71:603 83 seq1 1281 99 36M = 1446 201 TTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<9; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:183:645:699 147 seq1 1281 86 35M = 1122 -194 GTGGCCCTCCCCCATTCCCTGCCCCATCTCTTGTA &)))2-&420<<<'--<6:6-<7<<<+:7<65<<< MF:i:18 Aq:i:21 NM:i:4 UQ:i:37 H0:i:0 H1:i:0
+EAS1_105:2:179:532:82 147 seq1 1285 99 35M = 1105 -215 CCATCACCCGGTCCCTGCCCCATCTCTTGTAATCT <:96<6<<<<89<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:3:176:431:647 83 seq1 1285 99 35M = 1112 -208 CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT <(9(<<<7;<<7<<<<<<<7<<<<<<7<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:258:266:101 83 seq1 1285 99 35M = 1094 -226 CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT %==/7&8=======:===6================ MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:179:735:569 147 seq1 1286 99 35M = 1461 210 CATCACCCGGTCCCTGCCCCATCTCTTGTAATCTC <<<<<<<<<<<<<<<<<<<<3<<<<<<<<4/<;<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:3:200:712:439 147 seq1 1286 99 35M = 1435 184 CGTCACCCGGTCCCTGCCCCATCTCTTGTAATCTC <7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:49 H0:i:0 H1:i:0
+EAS1_103:5:319:165:698 83 seq1 1287 99 35M = 1485 233 ATCACCCAGTCCCTGCCCCATATCTTGTAATCTCT <<<<<<<<<<<<<<<<<<<3<9<<<<<<<;<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:24 H0:i:0 H1:i:1
+B7_597:3:53:616:842 83 seq1 1288 99 35M = 1109 -214 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:286:753:854 83 seq1 1288 99 35M = 1110 -213 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ;<2<<<,57:<<9<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:1256:204 83 seq1 1288 99 35M = 1467 214 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC <<<<<;;;;;;<;;;;;;;<;<;;;;<:-;79697 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:289:132:526 83 seq1 1289 99 36M = 1472 219 CACCCGGTCCCTGCCCCATCTCTTGTAATCTCTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_1:4:71:832:743 83 seq1 1290 99 35M = 1102 -223 ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:102:511:946 83 seq1 1291 26 35M = 1461 205 CCCAGTCCCTGCCCCATCTCGGGTAATCTCTCTCC <<9<<;<<<<;<<<<;<<7;%<5<<0<<<)<.<.+ MF:i:18 Aq:i:26 NM:i:2 UQ:i:31 H0:i:0 H1:i:0
+EAS114_39:5:42:1223:1087 83 seq1 1293 99 35M = 1479 221 CAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTT <<<<<<<<<<<<<5<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:75:732:442 147 seq1 1293 99 40M = 1121 -212 CGGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC 7,*&28<61:88<.7<:<<:6<1<85:<:1<5<&::<<&< MF:i:18 Aq:i:60 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS54_73:3:23:502:103 147 seq1 1294 99 35M = 1486 227 AGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTT <2<<<<<<<<<<.<<<<<<<:1&:<<<7<<<<<<: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:74:596:137 147 seq1 1294 91 35M = 1119 -210 GGTCCCTGCCCCATCGCTTGTAATCTCTCGCCTTT +40778449779049'+*87489498949%89948 MF:i:18 Aq:i:22 NM:i:3 UQ:i:32 H0:i:0 H1:i:0
+EAS51_66:8:36:688:722 83 seq1 1295 99 35M = 1469 209 GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:60:182:718 147 seq1 1295 99 35M = 1485 225 GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT <<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:4:54:989:654 147 seq1 1296 99 35M = 1108 -223 TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT ,<1<2<<<;9)9<<;<<;<<<4<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:9:203:653 147 seq1 1296 99 35M = 1488 227 TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT <<<<<<<<<<<<<<<<<<<<<<::<9<<<<<;;;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:322:631:245 147 seq1 1297 99 36M = 1474 213 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC <<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<5; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:59:1548:1096 83 seq1 1297 99 35M = 1099 -233 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG 88888;;88;;;;8;;9;;;<<<<<<<<<<<<<<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:52:1779:1664 83 seq1 1297 99 35M = 1462 200 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG <<<<<<<<<<<<<<<<<<71<<<<<<<<<<<<<<% MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:218:173:667 83 seq1 1298 99 35M = 1448 185 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC <<<<<<<<<<<<<<<6<<<<<<<<<<<<<<<<<.< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:175:437:950 83 seq1 1298 99 35M = 1126 -207 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC ;;5:;;9<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:201:195:757 83 seq1 1298 99 35M = 1103 -230 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC :<':<:<<46<:<;:<;<;<<9<<<<<<<<;<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:8:377:655 83 seq1 1299 99 35M = 1473 209 CTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:50:950:562 83 seq1 1301 99 35M = 1473 207 GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGC <<<<<<<<<<<<<<<&<<8<<<<<<<5<:<+<:+; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:153:543:671 83 seq1 1301 99 34M = 1465 199 GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:33:1193:664 147 seq1 1301 99 40M = 1474 213 GCCCCATCTCTTGTAATCTCTCTCCTTTTTTCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%:<'<9:::9 MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:253:59:242 83 seq1 1302 99 35M = 1478 211 CCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<</<<9;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:52:1455:1212 147 seq1 1304 99 40M = 1153 -191 CCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGT 6::4::;4%;9:<79)<:<;<<:4::7<<9<&+71<9;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:316:176:543 83 seq1 1305 99 35M = 1469 199 CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC ====<=9===<<<=====9====<<=3==,96==9 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:50:1339:1154 147 seq1 1305 99 35M = 1481 211 CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC ==========<<==============;==7<;<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:169:292:652 83 seq1 1306 99 35M = 1510 239 ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<6<<-<<<<8< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:11:706:1030 83 seq1 1306 92 35M = 1469 198 ATCTCTTGTAATCTCTCTCATCTTTGCTGCATCCC <<<2<<2<<<<<<<<<<<<0<&<<<+<:2<4<<): MF:i:18 Aq:i:26 NM:i:2 UQ:i:20 H0:i:0 H1:i:0
+EAS221_3:6:70:843:706 83 seq1 1306 99 35M = 1449 178 ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<5<<5<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:174:597:66 83 seq1 1307 99 35M = 1148 -194 TCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCT 9<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:7:1547:1933 147 seq1 1308 99 35M = 1497 224 CTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTG <<<<<<<<<<<<<<<<<<<<<<<:<<8<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:117:411 147 seq1 1309 99 36M = 1482 209 TCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTC <<<<<<<<<<<<<<<<<<<<<<7<<:<<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:53:156:845 83 seq1 1311 99 35M = 1487 211 TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT <<<<<<8<<<.<<<<.6<<--<-<<<<<<<6<<<< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:90:1403:1635 83 seq1 1311 99 35M = 1480 204 TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT <<;<;<<<<;<;<;;<<<<<9;<.;;<:;99.979 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:67:302:762 147 seq1 1313 99 36M = 1138 -211 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC :8;88<;<<<;<<8<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:270:448:491 83 seq1 1313 99 35M = 1501 223 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC <<<<<<<<<<<<<<<<<<&<<.<<<<<<<:;;;<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:82:932:400 83 seq1 1313 97 34M = 1486 208 GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT <<<<<<8<1<<<<8+<<&<<<8<<<<<<<+(,/8 MF:i:18 Aq:i:25 NM:i:2 UQ:i:15 H0:i:0 H1:i:0
+EAS54_81:2:128:394:455 83 seq1 1313 99 35M = 1156 -192 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC ;=;9.=5=;=9====;;================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:57:735:151 147 seq1 1314 94 35M = 1121 -228 TAAACTCTCACCTTATTGCTGCATCCCTGTCTTCC 07;+79:;<)<<9<+8<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:3 UQ:i:28 H0:i:0 H1:i:0
+EAS114_28:6:51:506:878 147 seq1 1314 99 36M = 1501 223 TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCT <<<<<<<<<<<<<<<<<4<<<<<<<<<<0<<<<<:; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:15:1497:1530 147 seq1 1314 99 35M = 1136 -213 TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC 77778:;;;:;;;;:9;:;;;;;;;;;9;:;;;;; MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:9:1595:1826 83 seq1 1316 99 35M = 1494 213 ATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:73:273:488 147 seq1 1318 99 35M = 1512 229 CTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTG <<<<<2<88<88<<<8<<1<<<<<<68<<<;<;<* MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:199:760:42 147 seq1 1318 24 35M = 1489 206 CTCTCTAATTTTTGCTGCTTCCATGTCTTACTCTG +2&2&2&22222220222&220-222-22-22-22 MF:i:-126 Aq:i:24 NM:i:5 UQ:i:51 H0:i:0 H1:i:0
+EAS1_95:7:61:702:720 147 seq1 1320 99 35M = 1500 215 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC ==============;=======&=========3:= MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:41:576:1016 147 seq1 1320 99 35M = 1503 218 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<<<<<;<<<;<<<<<<<<<<<4<::< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:115:683:296 83 seq1 1320 99 35M = 1514 229 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<<8<<<<<<<<<<6<<<<3<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:63:1265:820 83 seq1 1320 99 35M = 1480 195 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<27<<<<<<<<<<<<<<<<<<<<03< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:92:288:1354 147 seq1 1321 99 40M = 1480 199 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT <<<<<<:<<<<<<<<<<<8<<:<<<<;;<8<<<8<:8+:: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:316:949:122 147 seq1 1321 99 35M = 1156 -200 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT 59899<<<<;;<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:37:1626:862 147 seq1 1321 99 35M = 1489 203 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:147:479:41 83 seq1 1322 99 35M = 1139 -218 CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTT ;:;:;<::<:<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:936:1509 147 seq1 1322 99 40M = 1502 220 CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTTATTT <<<<<<<<<7<<7<<<<<<<;<<<<<<<<<:<:<;%8::: MF:i:18 Aq:i:75 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_62:6:50:542:881 83 seq1 1324 99 35M = 1132 -227 CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA +2<<<;<3;29<6<5;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:71:85:629 147 seq1 1324 99 35M = 1484 195 CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA <<<<<<<<<<9<<<<<<<<<<<<<<<<<5<9<<+6 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:191:948:257 147 seq1 1325 99 35M = 1493 203 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT :<<<<<<<<9<:<<<<<<:<<<<;<<<<8<<<<7< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:249:986:224 83 seq1 1325 99 35M = 1499 209 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT =========5======7878===98==7=9==.-= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:6:1067:91 147 seq1 1325 99 35M = 1483 193 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<:8<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:216:650:516 147 seq1 1326 99 36M = 1164 -198 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ;9;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:18:376:416 147 seq1 1326 99 35M = 1510 219 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGTTT <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;:(<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS114_28:5:209:778:588 147 seq1 1326 99 36M = 1514 224 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT <<<<<<<<;<<<<<<<<<;<<<;<8<8<<<<;7;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:36:1402:1709 83 seq1 1326 99 35M = 1168 -193 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT ;;;:<<<;<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:40:352:151 147 seq1 1327 99 35M = 1137 -225 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ;=;;5=:-=9=====;;================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:139:331:63 83 seq1 1327 99 35M = 1486 194 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ====================<<============= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:11:1274:1230 147 seq1 1327 99 35M = 1507 215 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:36:678:316 83 seq1 1328 99 35M = 1500 207 TTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTA <<<<<<<<<<<<<<;<<<<<<<<<;<<<<,2<<<) MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:102:825:507 147 seq1 1330 99 35M = 1501 206 TGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:171:343:758 83 seq1 1331 99 36M = 1494 199 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<<<<<<<<<<<;<<<<59<<<9;<<3 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:85:1224:625 83 seq1 1331 99 35M = 1532 236 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTCCTT <<<<<<<<<;<<;<<7<<:<<7.<<<:&7<<.<;< MF:i:18 Aq:i:70 NM:i:1 UQ:i:13 H0:i:1 H1:i:0
+EAS188_7:5:308:354:124 83 seq1 1331 99 35M = 1507 211 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTT <<<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:7:22:22:934 147 seq1 1332 99 35M = 1500 203 CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<6<<<;<<<;84;<<48;<;6;<;) MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:71:707:568 147 seq1 1332 99 35M = 1518 221 CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:123:610:472 83 seq1 1333 99 35M = 1504 206 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT <<<<<<<<<<:<<<<<<<<<<<<<+:<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:20:635:509 83 seq1 1333 99 35M = 1167 -201 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT 50<59<<9<9<<<<<<<<<<<<<<<<<<<6<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:92:213:217 83 seq1 1333 99 35M = 1515 217 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:47:471:858 147 seq1 1335 99 35M = 1487 187 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<;<<<<<<<<9<<<4;;<<<<;<<<<<.<<4;<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:90:406:631 147 seq1 1335 99 35M = 1525 225 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<<<<<<<<<<<<<<<<:<<<<:;<<<<;<<8;<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:81:1723:1820 83 seq1 1335 99 35M = 1524 224 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:182:23:585 147 seq1 1336 99 35M = 1163 -208 ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT 9:<<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:150:508:757 147 seq1 1336 99 35M = 1483 182 ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<,< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:261:504:780 147 seq1 1337 99 35M = 1501 199 TCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTT <<<<<<<<<<<<<<<<<<<</2<<<9<<<5<<,<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:324:515:230 147 seq1 1339 99 35M = 1512 207 CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG <<;<<<<<<<<<<<<<<<:<<<<8<<<4<<4<<34 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:72:916:763 83 seq1 1340 99 35M = 1142 -233 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT <;;:<<<<<<<;<<;;;<<<<<<<<<;;<;<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:194:168:684 83 seq1 1340 99 36M = 1512 208 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<7<<.<<6-<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:113:43:634 147 seq1 1340 99 35M = 1500 195 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTTTT <<<<<<<<<<<<.<<<<<<<<<<<<</<<2;;%%; MF:i:18 Aq:i:45 NM:i:2 UQ:i:8 H0:i:1 H1:i:0
+EAS54_71:5:16:434:204 147 seq1 1340 99 35M = 1522 216 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT =================;)===8===:==7;<+%; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:246:205:734 73 seq1 1340 65 35M = 1340 0 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT <<<4<<6666<<6<:<<<3<<<:'<<:<<<<;6<+ MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:246:205:734 133 seq1 1340 0 * = 1340 0 CTCCAGGGAAGTTATCTCTCATCTAGANNNNNTTG <<<<<<:/<<<,6'</7;<-+9<<;<7!!!!!8<, MF:i:-64
+EAS54_65:3:102:884:63 147 seq1 1341 99 35M = 1481 175 TGTCTTCCTCTGTCTTGATTTCCTTGTTGTTGGTT <<<<<<<<<<<<<<<<<3<<<%<<<9<<9<<7+;< MF:i:18 Aq:i:43 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS51_64:3:67:782:132 83 seq1 1343 99 35M = 1498 190 TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;4<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:70:348:972 147 seq1 1343 99 35M = 1528 220 TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT <.<<3+.7<<7<<:78:<<7<:<7:<3<<7.:::< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:9:206:901 83 seq1 1344 99 35M = 1517 208 CTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTC <<<<<<<<<<<<<<<<<<<<<<5<<5<<%%:<<<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:21:443:404 83 seq1 1345 99 35M = 1529 219 TTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCT <<<<<<<<<<<<<<<<<<<<<7<<;<<;+<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:148:286:316 147 seq1 1347 99 35M = 1531 219 CCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGT <<<<<<<<+<<7<<<<<<<6<<<6<142<<<6<2< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:77:48:860 83 seq1 1348 99 35M = 1521 208 CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT =========;===========9==*;5=;=;=,7= MF:i:18 Aq:i:45 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS51_64:6:124:128:489 147 seq1 1348 99 35M = 1142 -241 CTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTT ::55<<<8<<<6<<;<<<<<<<<7<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:213:54:878 137 seq1 1348 99 35M * 0 0 CTCTGTCTTGATTTACTTGTTGTTGGTTTTTTGTT <<<<<<<<<;<<<<<<<<:<<:<<++<<<<%<%<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:4:73:42:1038 147 seq1 1349 99 35M = 1513 199 TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT <<<<<<<<<<<<<<<<<<<<<<<:<<<<<.<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:320:505:814 83 seq1 1350 99 35M = 1515 200 CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC <<<<<<<<<<<<<<<<;<<8<<76<<<<;<&<<<7 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_593:2:68:692:347 83 seq1 1351 99 36M = 1176 -211 TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTT 9<;;;;<<<:<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:252:428:683 137 seq1 1351 99 35M * 0 0 TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT <<<<<<;<<<<<<<<7<<7<<&+<<<<:<&<<<4< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:73:182:444 83 seq1 1354 99 34M = 1533 214 CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT <<<<;;<<<<<<<<<<<<;<;<<<<<:<<<<<7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:63:267:545 147 seq1 1354 99 35M = 1524 205 CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTG <<<<<<<<<<<<:<<<<<::<<<<<<.<<<;;;;5 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:177:562:806 83 seq1 1356 99 35M = 1515 194 TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTTTT <;<29<99<<;<<<9<20<9<<5;;<<<<<<<+.< MF:i:18 Aq:i:35 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS51_62:7:157:784:936 83 seq1 1356 99 35M = 1169 -222 TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTT <:<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:345:87 147 seq1 1360 99 35M = 1513 188 TTACTTGTTGTTGGTTTTCTGTTTCTTTTTTTGAT <<<<<<<<<<<<<<<<<<<<;<<<-<<<6<<<+8< MF:i:18 Aq:i:71 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS114_45:1:33:1407:94 83 seq1 1360 99 35M = 1172 -223 TTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGAT 77477;4;;;;;44;;;;;;7;;;;;;;9;;;;;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:2:434:715 147 seq1 1363 99 35M = 1527 199 CTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTT <<<<<<<<<<<<<<<<<;<<<<<<<0<<<68<<<+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:4:137:319:642 137 seq1 1363 99 35M * 0 0 CTTGTTGTTGGTTTTCTGTTTCTTTTTTTGATTTT <<<<<<<<<27<<<<<<<<<<<<<<&;<<&3;;<% MF:i:18 Aq:i:41 NM:i:2 UQ:i:9 H0:i:0 H1:i:1
+B7_610:3:148:340:479 147 seq1 1364 99 35M = 1190 -209 TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:329:458:365 147 seq1 1364 99 35M = 1186 -213 TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG ====:==9========>==7>==9>=7=>=>>=>> MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:91:267:655 147 seq1 1365 99 35M = 1204 -196 TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT ;,:;5:<6:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:91:856:504 83 seq1 1366 99 35M = 1520 189 GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT <<<<<<<<<<<<<<7<<<<<<<7<<<&;<<<&&<& MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_108:2:170:326:433 83 seq1 1367 99 35M = 1535 203 TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG =====<=9===:=<:==2=======2:===9==/5 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:132:717:233 83 seq1 1368 99 35M = 1529 196 TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA <<<<<<<<<<<<;<<<<<<<<<<<7<<<<&-<4<1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:14:420:712 83 seq1 1368 99 40M = 1525 197 TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA <<<<<<<<<<<<;<<<<<<<;<<<-;<<<&,<&*8111:6 MF:i:18 Aq:i:66 NM:i:3 UQ:i:21 H0:i:1 H1:i:0
+EAS114_39:4:43:1047:1626 147 seq1 1369 99 35M = 1523 189 GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA <<<<<<<<<<<<<<<<<<<:<<<:<<<<:+;-4:( MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:20:413:1334 147 seq1 1370 99 35M = 1215 -190 TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG 88878777;:;:1:;9;;;6;;;6;9;;;;;296; MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:154:669:853 83 seq1 1371 99 35M = 1193 -213 TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA <::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:117:857:942 83 seq1 1372 99 35M = 1527 190 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC <<<<<<<<<<<<<<<<<<<<<<<<<:6<;;7;9<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:145:144:796 147 seq1 1372 99 35M = 1181 -226 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC ;<<<;<<<<<<<<<;<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:88:162:587 147 seq1 1372 99 35M = 1189 -218 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC 386;;388-<8;<;68<<;;<;<6<<<8<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:73:108:1621 83 seq1 1373 99 35M = 1532 194 GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA <<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:127:153:861 147 seq1 1374 99 35M = 1202 -207 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT :;:6;9<<1;<<95<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:152:765:744 147 seq1 1374 99 35M = 1534 195 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT <<<<<<<<<<<<<<<<<<:<<<<<<<<&<7293<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:313:827:992 147 seq1 1379 99 35M = 1197 -217 TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC '187:1'<75<.*<<:5<..<<*<<917<<7<<17 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:7:268:263 89 seq1 1381 22 35M = 1381 -35 TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA ',)*&2<$7+<<<'<-<7<<<<<<<7<<</4/;<< MF:i:64 Aq:i:0 NM:i:4 UQ:i:22 H0:i:0 H1:i:0
+EAS51_64:3:7:268:263 149 seq1 1381 0 * = 1381 35 TCGTACAGAAGTTTAATGGAGCCTTGGGACCTTAC !!66'&+/&'8+2''1+'611'&6&+/&+.&+1'& MF:i:-64
+EAS139_19:1:47:352:1492 147 seq1 1385 99 40M = 1205 -220 TTTGTTTTGTATGGTGGAAGACATAATCCCACGCTTCCTA +7+/7+/%%1'6+3++1;:</<<5<)27<<9<)9<<9<7< MF:i:18 Aq:i:53 NM:i:3 UQ:i:14 H0:i:1 H1:i:0
+EAS139_11:5:61:38:1182 83 seq1 1388 99 35M = 1205 -218 GTTTGATTTGGTGGAAGACATAATCCCACGCTTCC 9:;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:64:37:257 83 seq1 1389 99 35M = 1215 -209 TTTGATTTGGTGGAAGACATAATCCCACGCTTCCT ;47<<47+9<4<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:266:556:252 147 seq1 1392 99 35M = 1224 -203 GATTTGGTGGAAGACATAATCCCACGCTTCCTATG .8558<72<(<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:321:271:138 147 seq1 1394 99 35M = 1193 -236 TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA 261:5969==9=:=<==<================= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:19:752:816 147 seq1 1394 99 35M = 1212 -217 TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA +<<+<--/<<<<4<2<<<<45<<<:<<<<<<+<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:306:388:342 83 seq1 1398 99 35M = 1211 -222 GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG 9/<9;<<<;<;<<7<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS114_39:1:71:636:533 147 seq1 1398 99 35M = 1232 -201 GTGGAAGACATAATCCCACGCTTCCTATGGAAAGG ,51(<<8<:<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:131:779:345 83 seq1 1399 99 35M = 1237 -197 TGGAAGACATAATCCCACGCTTCCTATGGAAAGGT <<7<<<<<<<<:<<<<<<<<<<<<<;<<<<<<;<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:68:64:783 83 seq1 1402 99 35M = 1214 -223 AAGACATAATCCCACGCTTCCTATGGAAAGGTTGT <<9<8<6<<<<<;<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:16:823:343 147 seq1 1403 99 35M = 1223 -215 AGACATAACCCCACGCTTCCTATGGAAAGGTTGTT <<<:<<<;+;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS219_FC30151:5:72:1426:1883 147 seq1 1405 99 35M = 1226 -214 ACATAATCCCACGCTTCCTATGGAAAGGTTGTTGG ;9<;<;0<;<;<<<<;<<<;:<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:166:979:531 83 seq1 1410 99 35M = 1245 -200 ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT 81<<<3<*<<:<<<<<<<8<<<<<<<<<<<<:<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:63:930:152 83 seq1 1410 99 35M = 1243 -202 ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT ;:4:8;:::;=:8;=;========;=:======== MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:137:895:681 147 seq1 1418 99 35M = 1232 -221 CTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATG 4;5+6;<<<<<<<<<9;<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:87:89:696 147 seq1 1419 99 36M = 1245 -210 TTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGAT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:104:744:280 147 seq1 1421 64 36M = 1262 -195 CATATGGAAAGGTTGTTGGGATTTTTTTAATGATTC '&+74*0<'/.47:8<<<<;<7''6/1<<<.<<68< MF:i:18 Aq:i:21 NM:i:3 UQ:i:33 H0:i:0 H1:i:0
+EAS56_57:2:259:42:969 83 seq1 1426 99 35M = 1265 -196 GGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCA <<<6<<<<<<-<<<<<<;<<;<6<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:18:1498:1475 83 seq1 1427 99 35M = 1260 -202 GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA :<4<*7<<<<<<<:<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:328:614:638 147 seq1 1428 99 35M = 1243 -220 AAAGGTTGTTGGGAGATTTTTAATGATTCCTCAAT <<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:159:71:155 147 seq1 1428 99 35M = 1237 -226 AAAGGTTGTTGGGAGATTTTTAATGATTCCTCGAT 5;;9<<:<;:<<<<7<<7;<3<<<:<<<;<<<<<; MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_39:1:73:302:1574 147 seq1 1429 99 35M = 1233 -231 AAGGTTGTTGGGAGATTTTTAATGATTCCTCAATG 7<88;;<;;<;;<<<<<<<<<<<<<<<<<<<<<1< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:200:712:439 83 seq1 1435 99 35M = 1286 -184 GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA <;<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<7 MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:259:869:641 147 seq1 1435 99 35M = 1272 -198 GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA 99=:=9=99<=========<=<<============ MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:74:570:695 83 seq1 1436 99 35M = 1240 -231 TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT .;:8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:58:369:244 83 seq1 1436 99 35M = 1266 -205 TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT <<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:216:292:528 147 seq1 1438 99 35M = 1269 -204 GGGAGATTTTTAATGATTCCTCAATGTTAAAATGT ;:;;8<<<<<<<<<<<<<:<<;<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:185:868:496 83 seq1 1442 99 35M = 1278 -199 GATTTTTAATGATTCCTCAATGTTAAAATGTCTAT :;;<;;<<<<<<<<;4<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:277:194:143 147 seq1 1444 99 35M = 1262 -217 TTTTTAATGATTCCTCAATGTTAAAATGTCTATTT ;<<;<<<;8;<0<7<<<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:267:71:603 147 seq1 1446 99 36M = 1281 -201 TTTAATGATTCCTCAATGTTAAAATGTCTATTTTTG 9;;<;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:218:173:667 147 seq1 1448 99 35M = 1298 -185 TAATGATTCCTCAATGTTAAAATGTCTATTTTTGT <<<<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:70:843:706 147 seq1 1449 99 35M = 1306 -178 AATGATTCCTCAATGTTAAAATGTCTATTTTTGTC <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:47:720:789 147 seq1 1455 90 35M = 1278 -212 TCCTCAATGTTAAAATGTCTATTTTTGTCTTGACA /)040<.878<<<<;8<;<9<9;<<<<<<<<<<93 MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:102:511:946 147 seq1 1461 26 35M = 1291 -205 ATGTAAAAGTGACTGTTATTGTCTTGACACCCAAC <%-4:6<:/&46;/*;<*84<0<'<&*<2<<<<<< MF:i:-126 Aq:i:26 NM:i:5 UQ:i:78 H0:i:0 H1:i:0
+EAS112_34:8:103:812:255 147 seq1 1461 99 35M = 1272 -224 ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC 7:777:7<<::7<7<7<<:7<7<:<<<<<<<<<7< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:179:735:569 83 seq1 1461 99 35M = 1286 -210 ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC <5<3:<<<<5;8<<<55;<:</:<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:52:1779:1664 147 seq1 1462 99 35M = 1297 -200 TGTTAAAATGTCTATTTTTGTCTTGACACCCAACT 6;;:;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:153:543:671 147 seq1 1465 99 35M = 1301 -199 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT ;;;;;=;==================;========= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:38:1071:155 147 seq1 1465 99 35M = 1274 -226 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT <<62<<<<<<3<<<<</<<<<<<<%<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1864:477 83 seq1 1465 99 35M = 1270 -230 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:1256:204 147 seq1 1467 99 35M = 1288 -214 AAATGTCTATTTTTGTCTTGACACCCAACTAATAT 66777:;;37;;:;;0;:;;;;):;;:7;;;;;;; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:316:176:543 147 seq1 1469 99 35M = 1305 -199 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT <<)/3<<<&<*<<0<<8<<82</5<<<<<88<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:36:688:722 147 seq1 1469 99 35M = 1295 -209 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT <;;<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:11:706:1030 147 seq1 1469 92 35M = 1306 -198 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT +<5069+9<<<<+<;<<<<;<<77<7<<;<<;<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:289:132:526 147 seq1 1472 99 36M = 1289 -219 TCTATTTTTGTCTTGACACCCAACTAATATTTGTCT ;<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:50:950:562 147 seq1 1473 99 35M = 1301 -207 CTATTTTTGTCTTGACACCCTACTAATATTTGTCT <<3<<<8<;<<<<<<+<<8<&<<<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS188_4:5:8:377:655 147 seq1 1473 99 35M = 1299 -209 CTATTTTTGTCTTGACACCCAACTAATATTTGTCT ;<8;;:<;<<:<;<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:322:631:245 83 seq1 1474 99 36M = 1297 -213 TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:33:1193:664 83 seq1 1474 99 40M = 1301 -213 TATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAA ;;;;;;<;;-9<<<:</+9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:253:59:242 147 seq1 1478 99 35M = 1302 -211 TTTGTCTTGACACCCAACTAATATTTGTCTGAGCA <<<:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:42:1223:1087 147 seq1 1479 99 35M = 1293 -221 TTGTCTTGACACCCAACTAATATTTGTCTGAGCAA ;:<<<:<7<<<;;<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:90:1403:1635 147 seq1 1480 99 35M = 1311 -204 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA 86878;;;8;788;;;;;;;;;;;;;8;5;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:92:288:1354 83 seq1 1480 99 40M = 1321 -199 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGT ::::;;;<<<<9;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:63:1265:820 147 seq1 1480 99 35M = 1320 -195 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA <<<<<<3<<1<<<<<<<7<<<<<<<<<<<<<<<+< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:102:884:63 83 seq1 1481 99 35M = 1341 -175 GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA <;7;;<<8<;8;<<<8<<<<<<8<<<8;<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:50:1339:1154 83 seq1 1481 99 35M = 1305 -211 GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA 7;7;8;<5<:86<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:117:411 83 seq1 1482 99 36M = 1309 -209 TCTTGACACCCAACTAATATTTGTCTGAGCAAAACA ;88<<<<<:<7<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:150:508:757 83 seq1 1483 99 35M = 1336 -182 CTTGACACCCAACTAATATTTGTCTGAGCAAAACA 6;;;<8<6;8<<8<<<<<;<<<<;<<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:6:1067:91 83 seq1 1483 99 35M = 1325 -193 CTTGACACCCAACTAATATTTGTCTGAGCAAAACA 3<;<<:;9;<<7;;<;<<<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:71:85:629 83 seq1 1484 99 35M = 1324 -195 TTGACACCCAACTAATATTTGTCTGAGCAAAACAG ,,1<1<7&%<9+:<<9<<9<<<<<<<<5<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:319:165:698 147 seq1 1485 99 35M = 1287 -233 TGACACCCAACTAATATTTGTCTGAGCAAAACAGT ;5;2;<:;<<:<<<<<<<<<;:;<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:60:182:718 83 seq1 1485 99 35M = 1295 -225 TGACACCCAACTAATATTTGTCTGAGCAAAACAGT <<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:82:932:400 147 seq1 1486 97 35M = 1313 -208 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC <<;<<72<<7<<<<<<<<<<;<<<+7<<<<<<<<< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:23:502:103 83 seq1 1486 99 35M = 1294 -227 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC 4:386:6<:::<:<:4:+<::4<<<6<<<<<<<66 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:139:331:63 147 seq1 1486 99 35M = 1327 -194 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC 7===================:=:============ MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:53:156:845 147 seq1 1487 99 35M = 1311 -211 ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT 171(*00,0;;&;7=77=;5;;(;1:=5======= MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:47:471:858 83 seq1 1487 99 35M = 1335 -187 ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT /;9<<63<<<<3<;<<<<<<<<<<<<<<<<<<<9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:9:203:653 83 seq1 1488 99 35M = 1296 -227 CACCCAACTAATATTTGTCTGAGCAAAACAGTCTA 37))&<8<<<<<7<4<;<777<<:<<<<<<<<;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:199:760:42 83 seq1 1489 24 35M = 1318 -206 ACCCAATTAATATTTTTCTTAGCAAAACAGTCTAG 58*5.<+<<<<,4<<**<90**9<<<<<<4<<<<< MF:i:18 Aq:i:24 NM:i:3 UQ:i:34 H0:i:0 H1:i:0
+EAS218_1:4:37:1626:862 83 seq1 1489 99 35M = 1321 -203 ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG :663<<3<<<<<<<<<<:<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:191:948:257 83 seq1 1493 99 35M = 1325 -203 AACTAATATTTGTCTGAGCAAAACAGTCTAGATGA :;;;;<<<<<<5<5<<<<<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:171:343:758 147 seq1 1494 99 36M = 1331 -199 ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGA :+;;<<<<<;<;:<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:9:1595:1826 147 seq1 1494 99 35M = 1316 -213 ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAG ;76;;6:9<9<963;<<7<<<<<<<;<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:7:1547:1933 83 seq1 1497 99 35M = 1308 -224 AATATTTGACTGAGCAAAACAGTCTAGATGAGAGA <<<<<<<<-<<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS51_64:3:67:782:132 147 seq1 1498 99 35M = 1343 -190 ATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAG ;;<;;;<<;;<<<;<<<;<<<;<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:249:986:224 147 seq1 1499 99 35M = 1325 -209 TATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGA <<<3<;<;;<<;8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:61:702:720 83 seq1 1500 99 35M = 1320 -215 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <<<4<4+0;<<:<<<<<<<<-<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:113:43:634 83 seq1 1500 99 35M = 1340 -195 ATTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAA ;9;1;<5:<<<%<<<<;<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS56_53:7:22:22:934 83 seq1 1500 99 35M = 1332 -203 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <+72::72<<60<<<<<<<96<<<<0<<<<1<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:36:678:316 147 seq1 1500 99 35M = 1328 -207 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <<72.2,;;<)6<<<<:<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:102:825:507 83 seq1 1501 99 35M = 1330 -206 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC <05<<<<<<<7<<<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:261:504:780 83 seq1 1501 99 35M = 1337 -199 TTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAAC 80;8(;0==8+====;==49=============== MF:i:18 Aq:i:43 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_78:7:270:448:491 147 seq1 1501 99 35M = 1313 -223 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC 7;;;;+2;<<+<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:51:506:878 83 seq1 1501 99 36M = 1314 -223 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACT <970;49;<;+<<<:<<<;;<<<<<<<<<<<<<<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:936:1509 83 seq1 1502 99 40M = 1322 -220 TTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT 99;66:<<;-<<<<:<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:41:576:1016 83 seq1 1503 99 35M = 1320 -218 TGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTT :<;<<<<<6<<<<;<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:123:610:472 147 seq1 1504 99 35M = 1333 -206 GTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTC :<::+<<9<<9<<<<=<<<<<=<<<<<<<<?<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:308:354:124 147 seq1 1507 99 35M = 1331 -211 TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT %+<)2<<<<<<<<8<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:11:1274:1230 83 seq1 1507 99 35M = 1327 -215 TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT .<<<<<<<<<<<<<<<<5<<<<<<<<<<5<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:169:292:652 147 seq1 1510 99 35M = 1306 -239 GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA 79919-<-<<<<<<<<<<<<<<<<<<<6<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:18:376:416 83 seq1 1510 99 35M = 1326 -219 GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA 70<<<<<<<7<7<<<2<<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:194:168:684 147 seq1 1512 99 36M = 1340 -208 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT ;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:73:273:488 83 seq1 1512 99 35M = 1318 -229 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGG </<<:<<9;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:324:515:230 83 seq1 1512 99 34M = 1339 -207 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG 7<<1<<<7<+<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:345:87 83 seq1 1513 99 35M = 1360 -188 AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT <<;<<<<5<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:73:42:1038 83 seq1 1513 99 35M = 1349 -199 AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:209:778:588 83 seq1 1514 99 36M = 1326 -224 AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT ;8;98;;;<3<<<<<<<<<;<<;<<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:115:683:296 147 seq1 1514 99 35M = 1320 -229 AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTC <<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:92:213:217 147 seq1 1515 99 35M = 1333 -217 ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT <<<<<:<<<<<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:177:562:806 147 seq1 1515 99 35M = 1356 -194 ACAGTGTAGATGAGAGAGACCTTCCCTGGAGGTCT )2<9;'/:<5<<<:<<:<:&5:&<8,<<+:<&<<< MF:i:18 Aq:i:35 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS1_103:3:320:505:814 147 seq1 1515 99 35M = 1350 -200 ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT <2<;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:9:206:901 147 seq1 1517 99 35M = 1344 -208 AGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGA <<<<<<<<<<<<<.<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:71:707:568 83 seq1 1518 99 35M = 1332 -221 GTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGAT ;9;<;<<<<<;<<<<<;<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:91:856:504 147 seq1 1520 99 35M = 1366 -189 CTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGG :::<<:<<<<<<<<<<<<<<<<<<<<<:<:<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:77:48:860 147 seq1 1521 99 35M = 1348 -208 TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC ;8;8;<9<9<<<<<<<<<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:16:434:204 83 seq1 1522 99 34M = 1340 -216 AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC <:7:<<<<<<<<<<<9<<<+<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:43:1047:1626 83 seq1 1523 99 35M = 1369 -189 GATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGT <<4<<<<<<<<<<<:<<<;<<<<<:<7<<;<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:81:1723:1820 147 seq1 1524 99 35M = 1335 -224 ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT ;6;;;<<<<<<<<<<<2<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:63:267:545 83 seq1 1524 99 35M = 1354 -205 ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:90:406:631 83 seq1 1525 99 35M = 1335 -225 TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTT <<<:<:<<<-<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:14:420:712 147 seq1 1525 99 40M = 1368 -197 TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCC 1::::<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:2:434:715 83 seq1 1527 99 35M = 1363 -199 AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT <<<<<<<<<:;<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:117:857:942 147 seq1 1527 99 35M = 1372 -190 AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT <<;<<<<<<<9<<<8<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:70:348:972 83 seq1 1528 99 35M = 1343 -220 GAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTC <99<-7<<7<<<87<<<)<<<<<<8<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:132:717:233 147 seq1 1529 99 35M = 1368 -196 AGAGAACTTCCCTGGAGGTCTGATGGAGTTTCTCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:4:21:443:404 147 seq1 1529 99 35M = 1345 -219 AGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCC =9=9=9==:========================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:148:286:316 83 seq1 1531 99 35M = 1347 -219 AGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCT ;::::;9/:<9<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:85:1224:625 147 seq1 1532 99 35M = 1331 -236 GAACTCCCCTGGAGGTCTGATGGCGTTTCTCCCTC 17;;7&-;<;<;:<6<<:;<<<<<<<;<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS221_1:8:73:108:1621 147 seq1 1532 99 35M = 1373 -194 GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC <<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:73:182:444 147 seq1 1533 99 35M = 1354 -214 AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG :1<4;;::<<;<<<<;<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:152:765:744 83 seq1 1534 99 35M = 1374 -195 ACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGT 6<;6<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:170:326:433 147 seq1 1535 99 35M = 1367 -203 CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC :44<<<<<<<<<<:6<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:8:4:841:340 73 seq2 1 99 36M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAA <<<<<<<<;<<<<<<<<;<<<<<;<;:<<<<<<<;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:142:943:582 73 seq2 1 99 35M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA <<<<<<;<<<<<<:<<;<<<<;<<<;<<<:;<<<5 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:43:859:229 153 seq2 1 66 35M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA +37<=<.;<<7.;77<5<<0<<<;<<<27<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:286:923:549 73 seq2 2 99 35M * 0 0 TCAAATGAACTTCTGTAATTGAAAAATTCATTTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:117:578:853 73 seq2 5 99 35M * 0 0 AATGAACTTCTGTAATTGAAAAATTCATTTAAGAA <;<9<<<<<;<<;<<<<<<<<<<<,<98;<;;&92 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:289:472:86 137 seq2 6 99 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:302:997:951 73 seq2 6 69 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<<<<<<<<;<<:<<52<<:;;<6<<;<:<2:9/ MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:13:1729:1844 73 seq2 6 99 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<;;<;7<<<<4<<<<762;6<<<<<<<;6;618 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:43:239:977 137 seq2 7 99 36M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;7;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:233:191:520 73 seq2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<8<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:75:555:1591 137 seq2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:43:656:1866 137 seq2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;:; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:100:563:301 137 seq2 8 99 35M * 0 0 GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;8;;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:126:526:276 137 seq2 8 84 35M * 0 0 GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:161:366:544 137 seq2 11 99 35M * 0 0 CTTCTGTAATTGAAAAATTCATTTAAGAAATTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:326:652:890 73 seq2 12 99 35M * 0 0 TTCTGTAATTGAAAAATTCATTTAAGAAATTACAA <<<<<<<<<<2<<<<<<<<<<<<<<+<8:<<9998 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:238:441:727 73 seq2 16 99 35M * 0 0 GTAATTGAAAAATTCATTTAAGAAATTACAAAATA <<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:64:507:478 137 seq2 17 99 35M * 0 0 TAATTGAAAAATTCATTTAAGAAATTACAAAATAT <<<<<;<<<<<<<<<<<<<<<;;;<<<;<<8;<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:118:440:850 137 seq2 18 99 35M * 0 0 AATTGAAAAATTCATTTAAGAAATTACAAAATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<949<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:270:995:918 137 seq2 24 84 35M * 0 0 AAAATTCATTTAAGAAATTACAAAATATAGTTGAA <<<<<<<<<<<<<:<<<<<<8<8<8<<<<:<;4;4 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:305:819:245 73 seq2 25 98 35M * 0 0 AAATTCATTTAAGAAATTACAAAATATAGTTGAAA 8<<<<8<;<<<<<;<8<<8<8<<<<8<<<899<<+ MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_26:7:13:172:720 73 seq2 26 99 35M * 0 0 AATTCATTTAAGAAATTACAAAATATAGTTGAAAG ============:3<==:====<=9=3===;==83 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_63:7:34:334:825 73 seq2 30 99 35M * 0 0 CATTTAAGAAATTACAAAATATAGTTGAAAGCTCT <<<<<<<<<<<<<<<<<<<<<<<<3;<<<<6<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:32:1379:738 137 seq2 33 99 35M * 0 0 TTAAGAAATTACAAAATATAGTTGAAAGCTCTAAC ;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:5:70:318:1631 137 seq2 34 99 40M * 0 0 TAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGA <<<<<<;<<<<<<<<<<<<;9:<<<<<<<<<<<<<:::78 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:285:241:560 147 seq2 37 99 35M = 200 198 GAAATTACAAAATATAGTTGAAAGCTCTAACAATA <<<<<<<<<<;<<<<;<<<<<<<<<<<<;<;;;<. MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:389:889 83 seq2 37 99 36M = 205 204 GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG <<<<<<<<<<<<<<<<<<<<;<<<<<<<;9;;<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:127:725:381 147 seq2 39 99 35M = 209 204 AATTACAAAATATAGTTGAAAGCTCTAACAATAGA <<<<<<<<<<<<<<<<<<<<<;<<<<;;;;;<<8: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_93:5:66:372:343 147 seq2 40 99 35M = 228 223 ATTACAAAATATAGTTGAAAGATCTAACAATAGAC <<<<<<<<<<8<<<<<6<<<8&8<<<<<58<:<:: MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_65:6:67:800:450 83 seq2 41 99 35M = 221 215 TTACAAAATATAGTTGAAAGCTCTAACAATAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:90:1906:1528 147 seq2 41 99 35M = 222 216 TTACAAAATATAGTTGAAAGCTCTAACAATAGACT <<<<<<<<<<<<<<<:<<<:<<<<;<<<<<;:7:; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:117:284:589 147 seq2 43 99 35M = 210 202 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA ==================================0 MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:26:211:481 83 seq2 43 99 35M = 222 214 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA <<<<<<<<<<<<<<<<<<<<<<<7<<<<<:<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:85:923:726 83 seq2 43 99 35M = 199 191 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA <<<<<<<7<<<<<<<<<<<55<<<9<*<<<991<4 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:107:395:312 147 seq2 44 99 35M = 224 215 CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<;<;;<:<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:7:5:753:806 147 seq2 45 99 35M = 197 187 AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<7:-<;;3;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_103:3:277:921:474 147 seq2 45 99 35M = 241 231 AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC <<<<<<<<<<<<<<<:<<<<<<<<<<<5<<;;;;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_63:4:38:28:122 147 seq2 46 99 35M = 227 216 AAATATAGTTGAAAGCTCTAACAATAGACTAAACC <<<<<<;<<<<<<<;<<<<6<<<<<<:<<<<;;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS221_3:8:50:1203:1094 147 seq2 46 99 35M = 223 212 AAATATAGTTGAAAGCTCTAACAATAGACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:2:223:583:968 83 seq2 47 88 36M = 215 204 AATATAGTTGAAAGCTCTAACAATAGACTAAACCAA <<<<<<<29<<<<4<<<<<<<<<<<7<<7<..<<47 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:1:28:350:895 147 seq2 48 95 35M = 215 202 ATATAGTTGAAAGCTCTAACAATAGACTAAACCAA <<<<<<<<;<;<<<<<<<<<;;<<;<<<<<;;<;8 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:7:69:1130:832 83 seq2 50 94 35M = 231 216 ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC ;;2<;<;;<;9;<;;;;;;;7;8;;7;;;;77437 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS188_7:3:296:224:724 147 seq2 50 99 35M = 234 219 ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC <<<<;<<<<<<7;<<<<<6<<<06<<<<<<2(<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_595:4:319:250:718 147 seq2 52 99 35M = 240 223 AGTTGAAAGCTCTAACAATAGACTAAACCAAGCAG <<<<<<<<<<<;<<5<5;<851;85;)9;;8594; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_73:3:203:419:243 147 seq2 54 99 35M = 237 218 TTGAAAGCTCTAACAATAGACTAAACCAAGCAGAA <<<<<<<<<<<<<<<9<;<8<<<;<<<;<<<4<77 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:21:1601:1666 147 seq2 56 99 40M = 228 212 GAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAG 7<<<<<<<<:<<7<<<:<<<<<<4<<44<<914<;:5::: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:158:943:467 147 seq2 57 99 35M = 225 203 AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA <<<<<;<<<<<<<<<<<<<<;;<<<<<<<<<;8<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:54:91:1232 83 seq2 57 99 35M = 246 224 AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:29:833:612 147 seq2 58 99 35M = 224 201 AAGCTCTAACAATAGACTAAACCAAGCAGAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:1:189:503:110 147 seq2 63 79 35M = 229 201 CTAACAATAGACTAAACCAAGCAGAAGAAAGAGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:2 H1:i:0
+EAS114_28:2:114:938:216 83 seq2 63 99 36M = 218 191 CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_95:5:257:654:116 83 seq2 64 99 35M = 231 202 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<<<;:<<<<<<<<<88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_97:3:277:144:848 147 seq2 64 99 35M = 228 199 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<;<<<<<<<<<<<<<<<<<3<<9;;6; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_108:4:75:166:463 83 seq2 64 99 35M = 250 221 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<++3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:4
+B7_610:5:102:915:87 83 seq2 65 99 35M = 222 192 AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC <<<<<<<<<<<<<<<<<<<<;<<<<<3<<;<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:0
+EAS54_71:3:78:855:352 147 seq2 65 99 35M = 240 209 AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC <<<<<<<<;<<<<<<<<<;<<<<<<<<;<;<<:<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:0
+EAS56_57:2:206:873:186 147 seq2 66 99 35M = 227 196 ACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;53 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_93:6:238:514:194 147 seq2 68 99 35M = 265 232 AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<;<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:3:285:489:327 83 seq2 68 99 35M = 233 200 AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_67:1:15:381:715 83 seq2 72 99 35M = 237 200 GACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTT ;=====;===9==;===9;;;=4;9=====;==== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:199:818:124 83 seq2 73 99 35M = 266 228 ACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTG <<<<<<<<<<<<<<<<<;<<;<<;7<<<<<<9<9; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:182:1002:639 147 seq2 77 99 35M = 246 204 AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA <<<<<<<<<<<<<<<<<<<<<9-<<<<4<;<;;<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:945:2005 147 seq2 77 99 35M = 262 220 AACCAAGCAGAAGAAAGAGGCTCAGAACTTGAAGA <<<<<<<<<<<<<<<<<<<<%<<<<<<;<<<<<<< MF:i:18 Aq:i:44 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+B7_591:5:254:542:848 83 seq2 79 99 36M = 233 190 CCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAA <<<;<<<<<<<<<<<<<<<;4<;8<<<;;9<9;8;9 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:71:517:742 83 seq2 81 99 35M = 266 220 AAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAG <<<<<<<<<<<<;<<<<<<<<<<<<<48:4<<<<3 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:254:617:73 147 seq2 83 99 35M = 266 218 GCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<6;:;4% MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:13:1507:1146 83 seq2 84 99 35M = 278 229 CAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCT ;<9;;;;<<;;;;<<;<;;;;<;;<<;<;<99777 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:32:686:735 83 seq2 84 78 35M = 255 206 CAGAAGAAAGAGGTTCANANNNTGANGACAAGTCT <<<<<<<<<<<<<<<<<!<!!!<<<!<<<<<<<<< MF:i:-126 Aq:i:78 NM:i:5 UQ:i:0 H0:i:0 H1:i:0
+EAS56_57:3:112:729:591 83 seq2 86 99 35M = 283 232 GAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:17:1222:783 147 seq2 87 99 35M = 251 199 AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCGT <<<<<<<)<<<16<<;<<<6<4<:<4<+://<7)< MF:i:18 Aq:i:59 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS188_7:6:46:122:479 83 seq2 87 99 35M = 248 196 AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:313:531:169 147 seq2 89 99 36M = 250 197 GAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATG <<<<<<<<<<<<<;<<<<<<<<<<<:<<:<;<<;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:148:170:895 83 seq2 91 99 35M = 247 191 AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA <<<<<<<<<<9<<<<<6<<<<<<<<<<<<<<<<6< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:34:380:815 147 seq2 91 99 35M = 283 227 AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:210:809:735 147 seq2 93 99 35M = 291 233 GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:40:925:442 147 seq2 93 99 35M = 271 213 GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT ;<;<<<<<<<<<<<3;<7;:<;;<<<;<<:<32<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:169:256:888 147 seq2 94 99 35M = 270 210 AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT <<<<<<<<<<<<<<<<<<<<<<;;<;<<;<<:;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:117:156:84 83 seq2 95 99 35M = 285 225 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:35:522:294 147 seq2 95 99 35M = 272 212 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA ===============================:=:= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:41:653:1568 147 seq2 95 99 35M = 266 206 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA ;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:178:276:693 147 seq2 96 99 36M = 259 199 GTTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:223:440:667 83 seq2 97 99 35M = 282 220 TTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC <<<<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:194:470:416 83 seq2 98 99 35M = 265 202 TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC <<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:61:1000:1534 147 seq2 104 99 35M = 286 217 CTTGAAGACAAGTCTCTTATGAATTAACCCAGTCA <<<<4:<:<1)<<<<<<<+<:44<</7<<<)4:<) MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:145:383:182 147 seq2 105 99 35M = 291 221 TTGAAGACAAGTCTCTTATGAATTAACCCAGTCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:63:816:921 147 seq2 106 99 35M = 291 220 TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<4<846 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:77:1780:693 83 seq2 106 99 40M = 276 210 TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAA <<<<<<<<<<<<;<<:<<;<<<<<<<<<<<<;<<<;;:69 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:215:861:605 147 seq2 107 94 36M = 262 191 NAAGACAAGTCTCTTATGAATTAACCCAGTCAGACA !+++++++++++++++++++++++++++++++++++ MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS221_3:2:22:1623:709 83 seq2 107 99 35M = 287 215 GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC <<<<<<<<<7<<<<<<<:<<<<<<<<:85:<:2<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:54:436:1452 147 seq2 108 99 35M = 275 202 AAGACAAGTCTCTTATGAATTAACCCAGTCAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:42:333:516 147 seq2 109 99 35M = 296 222 AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA <<<<<5<*<2<<<<<<<<<<<<<<<<<<<<<<<</ MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:119:730:190 83 seq2 114 99 35M = 301 222 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<9<;;<<<;<<<<<<<8<<<1<<918<;;;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:63:727:203 83 seq2 114 99 35M = 278 199 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:27:577:849 147 seq2 114 99 35M = 316 237 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<<<<<<<<<<<<<<<<<<;:<<<;<<<<<<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:5:259:250 83 seq2 115 99 35M = 269 189 GTCTCTTATGAATTAACCCAGTCAGACAAAAATAA <<<<<<<<<<<<<<<<<<<<;<<<;5<<5<;7<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:17:989:186 83 seq2 120 91 35M = 299 214 TTATGAATTAACCCAGTCAGACAAAAATAAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<:<<;<7;:::: MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_45:2:33:1445:1357 83 seq2 121 85 35M = 299 213 TATGAATTAACCCAGTCAGACAAAAATAAAGAAAA ;;<;<<<<<<;;;<9:;:;;;;;:;:;;;;99777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:7
+EAS221_3:4:30:1452:1563 147 seq2 122 94 35M = 313 226 ATGAATTAACCAAGTCAGACAAAAATAAAGAAAAA <<<<<<<<<<<<<<:<<<<1<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_45:1:77:1000:1780 147 seq2 123 66 35M = 279 191 TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA ;;;:;;;;;;;/;;;7:4;;7;;;;;;;;;77777 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:6 H1:i:47
+EAS114_45:4:48:310:473 83 seq2 123 66 35M = 298 210 TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA <<<;<<;;;<<;;<;;;;;;;;;;;;;;;;89799 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:6 H1:i:47
+B7_591:2:279:124:41 83 seq2 124 69 36M = 307 219 GAATTAACCCAGTCAGACAAAAANNAAGAAAAAAGA <<<<<<<7/<8<<<<<<<<<<4*!!<<7<7<<5<<3 MF:i:18 Aq:i:0 NM:i:2 UQ:i:0 H0:i:0 H1:i:0
+EAS112_32:8:89:254:332 147 seq2 124 76 35M = 291 202 GAATTAACCCAGTCAGACAAAAATAAAGAAAAAAG ==================;=========;=7;;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:4 H1:i:36
+B7_597:7:103:731:697 83 seq2 125 72 35M = 304 214 AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA <<<<<<<<<<<<<<<<<<:<:<<6<<<<<<<:<;: MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:9 H1:i:55
+EAS139_11:2:71:83:58 147 seq2 148 77 9M2I24M = 349 236 AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS192_3:4:63:5:870 147 seq2 148 75 9M2I24M = 330 217 AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT <<;<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:2:29:1822:1881 147 seq2 150 74 7M2I31M = 328 218 AGAAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAGAAG <<<<<<<<<<<<4<<<<<<<<<<<<<<:<<<:<<;::::: MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS221_3:2:100:1147:124 147 seq2 150 99 35M = 345 230 AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS192_3:8:6:104:118 147 seq2 154 99 35M = 323 204 AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:6:185:96:948 83 seq2 160 99 36M = 324 200 TTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT <<<<<<<<<;6<<<<<<<<<;<<<;;<<<<<<<;<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:213:309:373 147 seq2 161 99 35M = 317 191 TTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT <;<<<<<<;<7<<<<<-<<<<<<<<<<<<<<4<7< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:30:466:652 83 seq2 163 98 35M = 332 204 AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA <<<<<<<<<<<<<<<<<<<<<<<<;<<<4;7<<<7 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:156:21:69 147 seq2 163 99 35M = 362 234 AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA <<<<<<<<<<<<<<<<<<<<<<<:<4<<<:<;<;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:197:52:58 147 seq2 165 99 35M = 323 193 AAATGAACAGAGCTTTCAAGAAGTATGAGATTATG <<<<<<<<<<<<<<<<<<9<<<<2<<<<<<;<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:214:946:229 147 seq2 165 99 35M = 339 209 AAATGAACAGAGCTTTCAAGAAGTATGATATTATG <<<<<<<<<<<<<<<<<::<;;;<;<;7<:<<7<2 MF:i:18 Aq:i:65 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS192_3:4:293:168:240 83 seq2 167 99 35M = 340 208 ATGAACAGAGCTTTCAAGAAGTATGAGATTATGTA <<<<;<<<;;;<;<<;;;<<;;<<::::<<;;+;7 MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:208:118:673 83 seq2 169 76 35M = 332 198 GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:71:478:175 147 seq2 171 99 35M = 317 181 ACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGT <<<<<<<<<<<;<<<<<;<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:177:24:389 147 seq2 175 99 35M = 365 225 AGCTTTCAAGAAGTATGAGATTATGTAAAGTAACT <<<<<<<<<<<<<<<<<<<<<<<<7<;;<;9969; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:14:1211:1332 147 seq2 178 99 35M = 351 208 TTTCAAGAAGTATGAGATTATGTAAAGTAACTGAA ;;.;;;;;;;3;;;;;6;;;;;;8;;;;;;63777 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:324:238:736 147 seq2 180 99 35M = 367 222 TCAAGAAGTATGAGATTATGTAAAGTAACTGAACC =================================== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:9:648:712 83 seq2 182 99 35M = 358 211 AAGAAGTATGAGATTATGTAAAGTAACTGAACCTA <9<;<<<<<<<;<<<<<8<<<<9<<;<<8)<:1<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:41:1308:619 147 seq2 184 99 35M = 360 211 GAAGTATGAGATTATGTAAAGTAACTGAACCTATG <6+<*<<<<<<<:<<<<<<<:<<&<<<<1<6<11: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:328:537:640 83 seq2 185 99 35M = 352 202 AAGTATGAGATTATGTAAAGTAACTGAACCTATGA <;<<<<<<;<<<<<<<<<:;<<8<<<;:<<<;<;9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:86:697:941 147 seq2 187 99 35M = 341 189 GTATGAGATTATGTAAAGTAACTGAACCTATGAGT =====================<=<==<<====;=5 MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:224:592:744 83 seq2 188 99 35M = 383 230 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<;<<<<<7<<<<<<<&<*<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:135:354:66 83 seq2 188 99 35M = 356 203 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<;<<<<<<<<<<;<<2<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:71:311:202 147 seq2 188 99 35M = 379 226 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<:4<<<<<<<<<<<<8;4;: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:50:30:15 83 seq2 192 39 35M = 358 201 AGATTATGTAAAGTAACTTAACCTATGAGTCCAAG +:79.68872.:9&:92/.299169/5+/6/3/&2 MF:i:18 Aq:i:10 NM:i:3 UQ:i:45 H0:i:0 H1:i:1
+EAS192_3:5:287:334:110 73 seq2 196 73 35M = 196 0 TATGTAAAGTAACTGAACCTATGAGTCACAGGTAT <<<<<<<<<<<<<<<<<<4;<<<<<<<::6<55:. MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:287:334:110 133 seq2 196 0 * = 196 0 GATGAATACTAAGATTGATGTAGCAGCTTTTGCAA .5+7)09<))&-&:33953<-./&&&)((;+3399 MF:i:-64
+B7_597:7:5:753:806 83 seq2 197 99 35M = 45 -187 ATGTAAAGTAACTGAACCTATGAGTCACAGGTATT ;:<:<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:149:572:877 147 seq2 197 99 36M = 334 173 ATGTAAAGTAACTGAACCTATGAGTCACAGGTATTC =>7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:85:923:726 147 seq2 199 99 35M = 43 -191 GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC <:<<<%3<<1<<86<<-<<<<<<<<<<<<6<<1<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:285:241:560 83 seq2 200 99 35M = 37 -198 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT :<<<<;<<,<<<<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:41:461:436 147 seq2 200 74 35M = 389 224 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT <<<<<<<<<<<<<<<<<<<:<<<<<<<<;<;;;:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:6:25:949:33 83 seq2 201 99 35M = 383 217 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG =;===/8========*==&;6=&=&:=6&:=::67 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:60:590:1760 83 seq2 201 99 35M = 376 210 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG <:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:86:693:234 147 seq2 202 82 35M = 388 221 AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA ;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:4:223:776 147 seq2 203 93 35M = 387 219 AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG <<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;<;2< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:88:84:1558 83 seq2 203 95 35M = 394 226 AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG <<;<<<<<<<<<<<<;;<<<<<<<::<<<<<<7&< MF:i:18 Aq:i:22 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_597:2:168:829:88 147 seq2 205 99 35M = 369 199 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<9;4;2 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:389:889 147 seq2 205 99 36M = 37 -204 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA ;<<;;56;==================8========8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:81:685:141 83 seq2 207 85 34M = 382 210 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA <<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:1312:1400 83 seq2 207 99 40M = 385 218 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<;<<<:<<:<;<:<<<;:;<<<<<<:<8<1;;:::88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:127:725:381 83 seq2 209 99 34M = 39 -204 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA +<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:19:736:559 83 seq2 209 99 35M = 370 196 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:117:284:589 83 seq2 210 99 35M = 43 -202 GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG ==8==;==================;========== MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:120:596:847 147 seq2 211 83 35M = 410 234 AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA <<<<<<<<<<<<<;<<<9<<<<<<<;:<62;58;2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_610:5:51:904:391 147 seq2 212 97 35M = 401 224 ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:96:1314:1448 147 seq2 213 93 35M = 388 210 CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA <<<<<<<<<<<<<<<<<<<<<<<<5<4<<<<-<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS139_19:3:73:1158:535 147 seq2 213 99 40M = 377 204 CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG <<<<<<<<<<<<<<<<<<<<<<8<;;<<<<<9<<9::8:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:223:583:968 147 seq2 215 88 36M = 47 -204 TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG 1<';<<&%-:<<<<<:66%<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:3:160:173:889 147 seq2 215 99 35M = 379 199 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA <<<<<<<<<<<<<<<<<<<<;0<7<<;<<<;7<09 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:28:350:895 83 seq2 215 95 35M = 48 -202 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA :<;<<<:;<-<<<<<4;77<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:45:707:147 147 seq2 216 99 35M = 424 243 ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<&<<<<:<<9<<<9<<<<75;;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:18:1757:95 83 seq2 216 45 35M = 374 193 ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<<<<<<<<1<:<<<<<<:<<<;:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_66:6:310:747:415 147 seq2 217 99 35M = 387 205 TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT <<<<<<<<<<<<<<<<<<:<<<<<;<<<<<;<;<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:114:938:216 147 seq2 218 99 36M = 63 -191 GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA <<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:179:629:513 147 seq2 220 99 35M = 409 224 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG <<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:88:55:1187 83 seq2 220 66 35M = 391 206 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG ;;<;;;<<99<<;;<;;;;;:;49;:;;;;87898 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:119:38:945 83 seq2 221 99 35M = 428 242 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA <<<<<<<<<<<<<<<8<<<<<8<<<8<;<<7<:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:67:800:450 147 seq2 221 99 35M = 41 -215 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA 9-<9<;<<<<9;5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:102:915:87 147 seq2 222 99 35M = 65 -192 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA ;<8<;;<<<<7;<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:113:367:659 147 seq2 222 72 35M = 390 203 CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA =9====8==========:=:=====9=:=&====5 MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS218_1:2:26:211:481 147 seq2 222 99 35M = 43 -214 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:90:1906:1528 83 seq2 222 99 35M = 41 -216 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<<<<<<<<<3:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:13:100:876 147 seq2 223 73 36M = 397 210 ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <8<<<*<2<7<<<6<<<<<<6<<8<<<<5<<<<4<9 MF:i:18 Aq:i:30 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS56_63:5:117:570:971 147 seq2 223 99 35M = 413 225 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <<<<<<<<<<<<<;;;<<<<6<7;9;<:;<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:50:1203:1094 83 seq2 223 99 35M = 46 -212 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <7<<<<<5:+63<<<<<<<<<<<<<<<<2<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:107:395:312 83 seq2 224 99 35M = 44 -215 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT ;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:29:833:612 83 seq2 224 99 35M = 58 -201 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <<;<<<;<::<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:158:943:467 83 seq2 225 99 35M = 57 -203 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT <:<<;;<:5<<<<<<<<<<<<<<<<<<;<<<;<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:201:768:529 147 seq2 225 99 35M = 396 206 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT ==========================1=======; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:11:994:584 83 seq2 226 97 35M = 417 226 GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT <<<<<<<<<<<7<<<<<<<<<<<<<6<<<<<<3<6 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:206:873:186 83 seq2 227 99 35M = 66 -196 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;<<;--7<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:4:38:28:122 83 seq2 227 99 35M = 46 -216 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;9;9;-1<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:66:372:343 83 seq2 228 99 35M = 40 -223 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG ;<1;89<<<<<;<9<<<<9<<<;8<9<;<<<<<;8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:277:144:848 83 seq2 228 99 35M = 64 -199 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG <<<)63<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:21:1601:1666 83 seq2 228 99 40M = 56 -212 TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA -;;3&1<<<<<<<<<<<<1<<<</<<<<<</<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_57:1:189:503:110 83 seq2 229 79 35M = 63 -201 ATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGA =;;6:============================== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:5:257:654:116 147 seq2 231 99 35M = 64 -202 TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA 0+37<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:69:1130:832 147 seq2 231 94 35M = 50 -216 TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA 6)377;3;;;;;;;;;1;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:254:542:848 147 seq2 233 99 36M = 79 -190 CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC ,:4<8<<<<<<<<<<<<<;:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:285:489:327 147 seq2 233 99 35M = 68 -200 CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA 9;;<<8<<<<<<<<<<<<;<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:163:611:211 147 seq2 234 99 35M = 405 206 TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC ============8===============;=6;;<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:296:224:724 83 seq2 234 99 35M = 50 -219 TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC 8<<<5<<<<<<<<<<<<<<<<<<<<7<<<<<;<9< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:58:271:612 83 seq2 236 99 35M = 415 214 AGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTA <;<<<<<<<<<7<<<<<<<<<<<<<<+47<<;<:: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:15:381:715 147 seq2 237 99 35M = 72 -200 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT <<<<<<<<<<<<<<9<<<<<<97;<<<<<<<<9<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:203:419:243 83 seq2 237 99 35M = 54 -218 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:41:1281:1785 83 seq2 237 99 35M = 399 197 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT <<<<<<<<<<<<<<<<<<<<<;<<<;<<<<<<<8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:218:858:445 83 seq2 239 99 35M = 421 217 AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT ;===5=;=======;==3======9;,79==;=== MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:319:250:718 83 seq2 240 99 35M = 52 -223 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG <;:<<<<;<<<:<<<<<<49:<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:92:493:891 83 seq2 240 99 35M = 408 203 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG <<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<8 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:78:855:352 83 seq2 240 99 34M = 65 -209 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT 2<<<<<<<9<<4<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:277:921:474 83 seq2 241 99 35M = 45 -231 AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:41:199:388 83 seq2 243 99 35M = 403 195 AGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGG ;;<<<<<;;<<<<<<;;<;;<<;;<<<<<<99999 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:307:481:625 83 seq2 245 99 36M = 410 201 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:134:126:465 83 seq2 245 99 35M = 434 224 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA <<<<<<<<<<<<<;<<<<<<<<<<<<<5<<:<<41 MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:44:153:969 147 seq2 245 95 35M = 447 237 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA *:::7<77<:<<<<:<<(597:<:<9//7<529/0 MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:182:1002:639 83 seq2 246 99 35M = 77 -204 AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG <<;;9;9<<<<<<;<7;<;<<<<;;<<<;<<7;<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:54:91:1232 147 seq2 246 99 35M = 57 -224 AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:204:737:61 147 seq2 247 99 35M = 437 225 AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT <<<<<<<<<<<<<<<<<<<<<<<<<:<<9<+4:<0 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:148:170:895 147 seq2 247 99 35M = 91 -191 AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT <<9<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:46:122:479 147 seq2 248 99 35M = 87 -196 AAGTGAGAAGTTTGGAAGAACTATTTGAGGAAGTA <<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS219_1:7:16:1343:1621 83 seq2 248 99 35M = 426 213 AAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTA <<<<<<<<8<<<<;<<<;<;<<<<<<<:;4;71:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:313:531:169 83 seq2 250 99 36M = 89 -197 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT 98;<;;<<;8<<<<<<<<<<<8<<<<<<<<8<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:75:166:463 147 seq2 250 99 35M = 64 -221 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<============================== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:130:260:553 83 seq2 250 99 34M = 439 224 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC <<<<<1<<<<<<<<<<6<<81</<4*2;7:+90( MF:i:18 Aq:i:42 NM:i:2 UQ:i:31 H0:i:1 H1:i:0
+EAS56_59:2:60:677:921 83 seq2 250 96 35M = 393 178 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:60:1037:1146 83 seq2 250 99 35M = 447 232 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<<<<<<<<<<<<<<<<<<<<<;<:;;;;;;< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:17:1222:783 83 seq2 251 99 35M = 87 -199 TGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT 6<<<8<69<8199<7<<<6<<<<<<<<<1:<:<<: MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:96:491:1891 147 seq2 253 99 35M = 409 191 AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG <:<<<<<::<<<<<<<<<<<<<<<<:<<::7<<:7 MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:75:615:555 83 seq2 255 99 35M = 416 196 AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG <<<<<<<<<<<<<<<<<<<<<;<;<<<29<;.484 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:32:686:735 147 seq2 255 78 35M = 84 -206 AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG <<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:65:85:1547 147 seq2 257 99 35M = 434 212 GTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:94:1655:1921 83 seq2 258 85 35M = 447 224 TTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAA <<<8<<<<<<<<<8<<8;8<;<;<;;<<9+868<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_610:7:177:469:800 83 seq2 259 99 35M = 433 209 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA <<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<<;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:178:276:693 83 seq2 259 99 36M = 96 -199 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAAC :;<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:14:697:541 83 seq2 259 99 35M = 432 208 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA <<<<<<<<<<<<<<<<<<<:<<<<<<<;;;;8;;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:37:156:134 147 seq2 261 99 35M = 443 217 GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC ;;;;;;;;;;9;;;;;;;;;;;;;;;9;;;77679 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:215:861:605 83 seq2 262 94 36M = 107 -191 GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC ;<<<<<;:<7:<<<;<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:945:2005 83 seq2 262 99 35M = 77 -220 GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCT 7<<<<;;<<;<<<<<7<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:52:751:360 147 seq2 263 99 35M = 443 215 AAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<:76<<<<;9:;: MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:238:514:194 83 seq2 265 99 35M = 68 -232 AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT <<6<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:194:470:416 147 seq2 265 99 35M = 98 -202 AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT <<<7<<;<<<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:71:517:742 147 seq2 266 99 35M = 81 -220 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:254:617:73 83 seq2 266 99 35M = 83 -218 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<:<<<9;<<<;;<:<-<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:199:818:124 147 seq2 266 99 35M = 73 -228 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:41:653:1568 83 seq2 266 99 35M = 95 -206 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT 977979;:;<;;;;;;<<5;<;<;<<<;;;;;;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:211:84:84 83 seq2 268 99 35M = 440 207 CTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAG <<<<<<<<<<<<<<<<:<<:<<:<<<44<4<<9<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:152:355:962 147 seq2 269 99 35M = 456 222 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <;<<<<<;8<<<<<<<<<;5;;88<<3<<<<<&0; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:285:395:450 83 seq2 269 99 35M = 458 224 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <<<<<<<;<<<;<<<<<;:<:7<;<;7<7<<;;7< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:15:568:42 89 seq2 269 69 35M = 269 -35 TTTTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT !!;:<8<;<<<8<<<<<<<<8<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:2 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:15:568:42 149 seq2 269 0 * = 269 35 TTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTATA !!!!!!!!!++++!!!!!!!!!!!!!!!!!!!,!, MF:i:-64
+EAS192_3:8:6:237:885 83 seq2 269 99 35M = 433 199 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <<<<<<<<9<<<<<<<<<<<<<<<<<<<<<;;;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:5:259:250 147 seq2 269 99 35M = 115 -189 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT 8<83;<<<<<<<<<<5<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:206:994:556 73 seq2 270 75 35M = 270 0 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:206:994:556 133 seq2 270 0 * = 270 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS54_71:4:169:256:888 83 seq2 270 99 34M = 94 -210 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT &<<:<;<<;;<8<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:317:72:221 147 seq2 270 99 35M = 422 187 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC ===========;=======;;:==6=;=====;== MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:40:925:442 83 seq2 271 99 35M = 93 -213 TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT =;================================= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:158:909:321 147 seq2 271 99 35M = 453 217 TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:35:522:294 83 seq2 272 99 35M = 95 -212 TTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:176:971:874 147 seq2 273 76 35M = 432 195 TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG <<<<<<<<<<<<<:<;<<<<<<<<<<<<<5<<<<7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:226:869:36 83 seq2 273 99 35M = 461 223 TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG :<<<<,:<;:.:<<:<<717,;2171717717116 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:106:595:322 147 seq2 274 99 35M = 440 201 GAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:54:436:1452 83 seq2 275 99 35M = 108 -202 AGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:77:1780:693 147 seq2 276 99 40M = 106 -210 GGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGAT :**::799<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:147:423:584 83 seq2 277 99 35M = 451 209 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;96 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:188:782:483 147 seq2 277 99 35M = 431 189 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<7<;77 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:78:1314:1275 83 seq2 277 99 35M = 469 227 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:63:727:203 147 seq2 278 99 35M = 114 -199 AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA <<;7<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:13:1507:1146 147 seq2 278 99 35M = 84 -229 AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA 88788;,;:-:2;;;;;;;;:;:;;;;;;;;;;;; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:77:1000:1780 83 seq2 279 66 35M = 123 -191 AGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAG 777774;;4-7;;;;;;:;;;:;;;<;;;;<<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:93:490:901 147 seq2 280 99 35M = 445 200 GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA <<<<<<<<<<<<<;<<<<<<<;<<<<<:<<1+4-8 MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:227:657:95 83 seq2 280 99 35M = 458 213 GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<85 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:57:324:546 147 seq2 281 99 36M = 458 213 TAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT <<<<<<<<<<<<<<<<<<<<<:<<<8:8<<;::;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:223:440:667 147 seq2 282 99 35M = 97 -220 AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT <<;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:274:1078 147 seq2 282 99 40M = 458 216 AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC <<<2<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;::::: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:196:511:896 147 seq2 283 99 35M = 446 198 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT <<<<<<<<<<<<<<<<<<<<<<<<;<<<4<88;<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:112:729:591 147 seq2 283 99 35M = 86 -232 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:34:380:815 83 seq2 283 99 35M = 91 -227 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT ;;;;<<<<<<;<<<<;<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:117:156:84 147 seq2 285 99 35M = 95 -225 TGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAG <;;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:61:1000:1534 83 seq2 286 99 35M = 104 -217 GGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGA <<;<<<<;;<<;6;<<<;<4;<<7<<<<<;<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:22:1623:709 147 seq2 287 99 35M = 107 -215 GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC <'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:7:682:201 147 seq2 288 99 35M = 452 199 GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA <<<<<<<7<<7<<<<77&;-9<97<76<;<<993< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:91:89:666 153 seq2 289 60 35M * 0 0 GAAAACCTCTTTAGTCTTGCTAGAGATTTAGACAT 74752;;4;;;;;;;;7);;;4;;;;)4;;;;;13 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:46:13:880 83 seq2 290 99 35M = 445 190 AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC <<<<<<<<<<<<<<<<<<<<;<7<3<<<9<+;;<9 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:187:715:521 147 seq2 291 99 35M = 451 195 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<<<<<<<<<<<<:<<<<<<<;<<;<;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:210:809:735 83 seq2 291 99 35M = 93 -233 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:145:383:182 83 seq2 291 99 35M = 105 -221 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:8:89:254:332 83 seq2 291 76 35M = 124 -202 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<:<;<<<<<<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:63:816:921 83 seq2 291 99 35M = 106 -220 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:280:662:939 83 seq2 294 99 35M = 442 183 CCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAA <<<<<<<<<<<<<;<<<;;7<<<<<<<<<<<<:8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:250:628:423 147 seq2 295 99 36M = 489 230 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG <<<<<<<<<<<<<<<<<<:;<<<<:<<<<;;;;;;4 MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:255:549:422 147 seq2 295 99 35M = 456 196 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT <<<<<<<<<<<<<<<<;<<<<<<<:<<<<<<;;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:2:491:1886 89 seq2 295 75 35M * 0 0 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT <<:<8:<<<:<<<<<<<<<<<9<<<<<<<<<<<<: MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:267:821:860 147 seq2 296 99 35M = 451 189 TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG ;<<<<<8<<<<<8<<;<8<<<<<5<;<<<<<2;<5 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:42:333:516 83 seq2 296 99 35M = 109 -222 TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG <<<<<<<<7<63<7<<<<<<<<<<<7<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:119:161:322 83 seq2 297 99 35M = 479 217 CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA <<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<</6 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:48:310:473 147 seq2 298 66 35M = 123 -210 TTTAGTCTTGCTAGAGATTTAGACATCTAAATGAA 77999;;6;;;;;;;;;;;;;;;9;;;;;;;;;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:159:273:253 153 seq2 299 76 35M * 0 0 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA <<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:181:392:500 83 seq2 299 99 35M = 470 206 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA <<<<<:<<<2<<<<;5<<<<29+<<)</65<7.24 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:17:989:186 147 seq2 299 91 35M = 120 -214 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA 87;38$<3=/<==============9========= MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:33:1445:1357 147 seq2 299 85 35M = 121 -213 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA 88888;;;;;;;:;;;;;;;:;9;;;;;;;;;;;; MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:119:730:190 147 seq2 301 99 35M = 114 -222 AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGA ;;;3;<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:62:969:12 83 seq2 303 99 35M = 464 196 TCTTGCTAGAGATTTAGACATCTAAATGAAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:103:731:697 147 seq2 304 72 35M = 125 -214 CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC :::;3:<<<<<<<:<<<<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:111:142:21 147 seq2 304 99 35M = 479 210 CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC <<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<;<;9 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:319:280:57 83 seq2 306 99 35M = 467 196 TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC ;==========;=====6;=========;=<;6;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:76:205:587 147 seq2 306 99 35M = 483 212 TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:279:124:41 147 seq2 307 69 36M = 124 -219 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA :17<8<<<:&<<<<<<:;'<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:10:349:1147 153 seq2 307 74 40M * 0 0 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA :/:::<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:16 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:22:490:2011 83 seq2 307 99 35M = 485 213 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:46:173:214 147 seq2 308 99 35M = 487 214 CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA <<<<<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<; MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:283:577:398 83 seq2 308 99 35M = 488 215 CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA <<<<<<<<<<<<<<<<<<<9<<<<<<<<<;<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:27:280:592 83 seq2 310 99 36M = 484 210 AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGA <<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<5< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:11:1238:1728 147 seq2 310 99 35M = 475 200 AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAG <<7<<<<<;<<<<<<<<<<<<;<<<;<<<<<<;;< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:118:121:760 89 seq2 311 77 36M * 0 0 GAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA :<<<;;<<<<6<;<<<;<<<<;<<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:318:679:883 153 seq2 313 75 35M * 0 0 GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT <<;4<<;<:<<7<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:30:1452:1563 83 seq2 313 94 35M = 122 -226 GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT <<39<<<59<<:<<+<<<6<<:<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:189:130:136 83 seq2 314 79 35M = 494 215 ATTTAGACATCTAAATGAAAGAGGCTCAAAGAATG ==<<=================<<====<<=;=6== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:27:577:849 83 seq2 316 99 35M = 114 -237 TTAGACATCTAAATGAAAGAGGCTCAAAGAATGCC 5:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:71:478:175 83 seq2 317 99 35M = 171 -181 TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA <<<<;<96<<<<;<<<<<<<<<77<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:38:999:463 83 seq2 317 39 35M = 503 221 TAGACATCTAAATGAAAGNNGCNNNAAGAATGCCA 7<<<<<<<<:07<<:<<7!!<<!!!::<88<<<<4 MF:i:-126 Aq:i:39 NM:i:5 UQ:i:0 H0:i:0 H1:i:0
+EAS54_71:8:215:830:609 89 seq2 317 71 33M * 0 0 AAGACATCTAAATGAAAGAGGCTCAAAGAATGC +<)<:<<:<<<<<<<<<9<<<<<;<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS188_7:7:213:309:373 83 seq2 317 99 35M = 161 -191 TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA <<<86<82<<<<<<<<<<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:45:1339:1807 153 seq2 319 64 35M * 0 0 GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG 77797;;:;::&:;;0:;8;;4;;:;;6;;;;;;; MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:197:52:58 83 seq2 323 99 35M = 165 -193 TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA <7;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:8:6:104:118 83 seq2 323 99 35M = 154 -204 TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:185:96:948 147 seq2 324 99 36M = 160 -200 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATA 6<;;<;<<;<<<<<747<<<<<<<<77<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:61:346:384 147 seq2 324 68 35M = 496 207 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT <<;<<<<<<<<9<;<<9;<6<2;<6<<<;9*558; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:177:800:714 147 seq2 324 76 35M = 497 208 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT <<<<<<<<<<<<<<<<<<<<<;<<<;<;<<<<<;< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:329:339:408 83 seq2 325 99 36M = 515 226 TAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:214:565:337 83 seq2 326 99 35M = 481 190 AAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC <;<<<<<<<<<<<<<<;<<<<9<<<<<;;;;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:296:401:60 89 seq2 327 68 35M * 0 0 AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA <<*<<<<7<<)<<3<<<9<<<<<<<<<<<<<<;<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:88:1413:14 89 seq2 327 76 35M * 0 0 AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA <<<<<<<<<<<;;;<<<<<<;<;;<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:34:649:318 147 seq2 328 65 35M = 481 188 ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACAT 9<<3<<<9<<<<<<<<<7<<9<<0<<.0<*:77,; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:29:1822:1881 83 seq2 328 74 40M = 150 -218 ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA ;87;;<<<;<5<5<<<<<<<;<<<<<<<<<<<<:<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:187:199:369 153 seq2 329 74 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT ;<><<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:23:268:529 153 seq2 329 71 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT 7;<<<<<<57;-<<<<<<:<77<<<<<<<;<;<<< MF:i:32 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:315:219:7 153 seq2 330 69 35M * 0 0 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG 7==::<2=8<<<=====>888<=2=>==>,>,>>8 MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:63:5:870 83 seq2 330 75 35M = 148 -217 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG :<;<;<<<4:;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:243:557:560 147 seq2 331 75 36M = 499 204 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<9<<<<<<<<<<<<<<<<<<;<<89<<9<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:270:430:269 147 seq2 331 99 36M = 519 224 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:6:284:442:747 89 seq2 331 75 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <;<<<<<:<;<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:71:31:1973 89 seq2 331 76 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <<<<<7<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:30:466:652 147 seq2 332 98 35M = 163 -204 AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA <<<<<;3;&<<<<<<<</6<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_61:3:208:118:673 147 seq2 332 76 35M = 169 -198 AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<;;<;<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:95:1530:28 147 seq2 332 74 35M = 490 193 AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA ;;;;;;;;;;:;;;;;;;8;;;;;;;;;;;77747 MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:104:965:517 73 seq2 333 77 35M = 333 0 AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:104:965:517 133 seq2 333 0 * = 333 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS54_65:7:155:629:357 147 seq2 333 99 35M = 521 223 AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA <<<<<<<<8<8<<6<<<<<<<<;<9<5<;<;;941 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:149:572:877 83 seq2 334 99 36M = 197 -173 GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA 6<94693<;<<<<;;<<<<<<<<<<;9<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:53:544:889 83 seq2 335 76 35M = 495 195 AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA <<<<<<<<;<<<<<<<<<<<<<<<<<;<<<<<;<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:226:370:91 83 seq2 335 99 35M = 482 182 AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA 8<<<;<8<8<;<<<8<<;7<7;8784<<,;864<& MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:119:651:88 147 seq2 337 99 35M = 527 225 GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:20:592:496 147 seq2 338 75 35M = 498 195 CTCAAAGAATGCCAGGAAGATACATTGCAAGACAG <<<<<<<<<<<<<<<<<<<<<<<<<==<<<<<<:< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:214:946:229 83 seq2 339 99 35M = 165 -209 ACAAAGAATGCCAGGAAGATACATTGCAAGACAGA )+<<<*<<77;8<;7<<8<4<;<88<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS188_7:5:163:982:695 83 seq2 339 77 35M = 499 195 TCAAAGAATGCCAGGAAGATACATTGCAAGACAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:14:1872:1521 147 seq2 339 62 35M = 500 196 TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA 7<<<<77<<<3<3<7.'<<<<<7<67<+.0%4*<4 MF:i:18 Aq:i:2 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS192_3:4:293:168:240 147 seq2 340 99 35M = 167 -208 CAAAGAATGCCAGGAAGATACATTGCAAGACAGAC +;;;;<8<<86<<<<<<<;;8;7;<;<8<8;<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:86:697:941 83 seq2 341 99 35M = 187 -189 AAAAAAATCCCGGAAGATACATTGCAAGACAGACT 1<<%<<<1:<58<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:4 UQ:i:67 H0:i:0 H1:i:0
+EAS54_71:4:14:88:306 83 seq2 341 99 34M = 521 215 AAAGAATGCCAGGAAGATACATTGCAAGACAGAC <<<<<<8<<<<<<;<<<3<<<8<<;<;;<15<:6 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:183:697:555 147 seq2 341 84 35M = 505 199 AAAGAATGCCAGGAAGATACATTGCCAGACAGACT =====================:===&==:;==5;; MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_57:3:41:739:907 147 seq2 344 99 35M = 520 211 GAATGCCAGGAAGATACATTGCAAGACAGACTTCA <<<<<<<<<<<<<<<<<<<<<<<<;<9<<<;;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:100:1147:124 83 seq2 345 99 35M = 150 -230 AATGCCAGGAAGATACATTGCAAGACAGACTTCAT <<<<96<<<<<<<<<<<<<<<<<<<<<<:<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:127:828:697 83 seq2 346 99 35M = 552 241 ATGCCAGGAAGATACATTGCAAGACAGACTTCATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:62:125:888 147 seq2 347 99 35M = 504 192 TGCCAGGAAGATACATTGCAAGACAGACTTCATCA <<<<<<<<<<<<<<<<<<<::<<<:7<::<:;<<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:1:1598:843 147 seq2 347 99 40M = 500 193 TGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATA <<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<8<4:8:: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:71:83:58 83 seq2 349 77 35M = 148 -236 CCAGGAAGATACATTGCAAGACAGACTTCATCAAG 8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:88:1454:418 147 seq2 349 99 35M = 522 208 CCAGGAAGATACATTGCAAGACAGACTTCATCAAG :<<:<<<<<<<<<<<::::<:<:<9<5<<<<<<8: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:36:649:554 147 seq2 350 99 35M = 523 208 CAGGAAGATACATTGCAAGACAGACTTCATCAAGA <<<<<4<<8<<<<<<8<6<<88<<<<<<<-;<;0; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:189:831:878 147 seq2 351 99 35M = 555 239 AGGAAGATACATTGCAAGACAGACTTCATCAAGAT :<<<2<<<<<<<<<<:8<8<<<<<<<<<<87489; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:14:1211:1332 83 seq2 351 99 35M = 178 -208 AGGAAGATACATTGCAAGACAGACTTCATCAAGAT 978961;;991;97;<;;<;<<;;;;;<;;<:8:< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:328:537:640 147 seq2 352 99 35M = 185 -202 GGAAGATACATTGCAAGACAGACTTCATCAAGATA ;:<<;<<<<<::<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:85:361:418 83 seq2 353 99 36M = 517 200 GAAGATACATTGCAAGACAGACTTCATCAAGATATG <<<<<<<<<<<<<;<<<<<<<<<<<<<<;4;<<<<3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:329:437:643 83 seq2 354 99 36M = 540 222 AAGATACATTGCAAGACAGACTTCATCAAGATATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<<<1 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:135:354:66 147 seq2 356 99 35M = 188 -203 GATACATTGCAAGACAGACTTCATCAAGATATGTA ;;;;7<<<<:<<<<;<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:9:648:712 147 seq2 358 99 35M = 182 -211 TACATTGCAAGACAGACTTCATCAAGATATGTAGT *;0;;;95<<<<7<<<;;<<<;;<<<<;<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1184:994 147 seq2 358 99 35M = 518 195 TACATTGCAAGACAGACTTCATCAAGATATGTAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<8< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:50:30:15 147 seq2 358 10 35M = 192 -201 TACATTGCAAGACAGTCGTCAGCAAGATATGTAGT 1-%-22&&)&11,&/&&176<&<<<222<,6,<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:26 H0:i:0 H1:i:0
+EAS51_66:4:322:350:374 147 seq2 360 99 35M = 546 221 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:41:745:603 147 seq2 360 99 35M = 536 211 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <<<<<<<<<<<<:<<<<<<<<<<<<<<<6<:8<<: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:138:186:459 147 seq2 360 97 35M = 518 193 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <*<<7<<0<7<<+<-:<<&<:6:4:0-:<<2.:5< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:41:1308:619 83 seq2 360 99 35M = 184 -211 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA 0<9476<<<<<0<<<2<&<0<.<<<<<<<<<.<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:125:884:276 147 seq2 362 99 35M = 541 214 TTGCAAGACAGACTTCATCAAGATATGTAGTCATC <<<<<<<<<<<8<<<<<<<<<<<<<<<<<<;;<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:156:21:69 83 seq2 362 99 35M = 163 -234 TTGCAAGACAGACTTCATCAAGATATGTAGTCATC <:3:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:66:1381:181 147 seq2 362 99 40M = 544 222 TTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACT <<6<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<::4:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:11:1261:1200 147 seq2 362 99 35M = 558 231 TTGCAAGACAGACTTCATCAAGTTATGTAGTCATC <<<<<<<<<<<;<<<<<<<<;<<<;<:<<8<<:<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_99:5:191:885:623 147 seq2 363 99 35M = 551 223 TGCAAGACAGACTTCATCAAGATATGTAGTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:53:783:78 83 seq2 363 99 35M = 561 233 TGCAAGACAGACTTCATCAAGATATGTAGTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<;<<;<7;<:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:177:24:389 83 seq2 365 99 35M = 175 -225 CAAGACAGACTTCATCAAGATATGTAGTCATCAGA +<<;<9<<<9<<;<<7<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:58:684:520 83 seq2 367 99 35M = 538 206 AGACAGACTTCATCAAGATATGTAGTCATCAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:71:187:824 83 seq2 367 99 35M = 534 202 AGACAGACTTCATCAAGATATGTAGTCATCAGACT ;===;======3==;==========4=;=7;;3;6 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:324:238:736 83 seq2 367 99 35M = 180 -222 AGACAGACTTCATCAAGATATGTAGTCATCAGACT <<<9<<<70,<<4<<<<<7<4<7<<<<<0<<<<<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:19:306:982 83 seq2 368 99 35M = 538 205 GACAGACTTCATCAAGATATGTAGTCATCAGACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:168:829:88 83 seq2 369 99 35M = 205 -199 ACAGACTTCATCAAGATATGTAGTCATCAGACTAT <,,;<838883;;;<<<<<;<8<8;<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:122:589:134 147 seq2 369 99 35M = 562 228 ACAGACTTCATCAAGATATGTAGTCATCAGACTAT <<:<<:<:<<<<<:<8<<<<<<<:<::<<<4:<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:303:970:243 147 seq2 370 99 35M = 564 229 CAGACTTCATCAAGATATGTAGTCATCAGACTATC <<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<8<8< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:19:736:559 147 seq2 370 99 35M = 209 -196 AAGACTTCATCAAGATATGTAGTCATCAGACTATC )<7<2;;4<<4<<<<;<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS51_66:3:246:711:981 83 seq2 371 99 35M = 559 223 AGACTTCATCAAGATATGTAGTCATCAGACTATCT <<<<<<<<;<<<<:;<<;;<:<<<4<<:4;00<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:89:1164:573 83 seq2 371 99 35M = 560 224 AGACTTCATCAAGAGATGTAGTCATCAGACTATCT <:<<;<2<<<<<<<&:2<;<;<<<<;,+;:<<4:< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS220_1:8:18:1757:95 147 seq2 374 45 35M = 216 -193 CTTCATCAAGATATGTAGTCATCAGACTATCTAAA <<<6<&:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:284:597:682 83 seq2 375 99 35M = 557 217 TTCATCAAGATATGTAGTCATCAGACTATCTAAAG <<<<<<<9<<<<<;<<6<<<<<;<9<<<<<<1;;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:10:394:392 83 seq2 376 99 35M = 542 201 TCATCAAGATATGTAGTCATCAGACTATCTAAATT <<<<<<<<<<<<<<<<<<<:<<<<<<;<<;;:6&; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:5:28:538:148 147 seq2 376 99 35M = 557 216 TCATCAAGATATGTAGTCATCAGACTATCTAAAGT <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<+771; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:60:590:1760 147 seq2 376 99 35M = 201 -210 TCATCAAGATATGTAGTCATCAGACTATCTAAAGT <8<-<<<<<<<82<<<4<<<<<<<<<<<<<8<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:1158:535 83 seq2 377 99 40M = 213 -204 AATAAAGATATGTAGTCATCAGACTATCTAAAGTCAACAT +;6+;<;<<<<<<<<<0<<;<<<;<<<8<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:2 UQ:i:20 H0:i:1 H1:i:0
+EAS188_7:3:182:104:921 83 seq2 378 99 35M = 575 232 ATCAAGATATGTAGTCATCAGACTATCTAAAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:160:173:889 83 seq2 379 99 35M = 215 -199 TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA ;)<</<8<<<<<<</<;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:71:311:202 83 seq2 379 99 35M = 188 -226 TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA ;6<;<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:315:201:673 147 seq2 381 45 36M = 542 197 AAGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:228:915:631 147 seq2 381 66 35M = 547 201 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA =================;==========4====== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:228:736:747 147 seq2 381 68 35M = 542 196 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA <<<<<<<<<;<<<<<<<;;<<;<<<<;::<;;7;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:263:689:572 83 seq2 381 68 35M = 553 207 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA <<<<;<<<<<;<<<<<<&;;<<<;<<:<+;;7;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:81:685:141 147 seq2 382 85 35M = 207 -210 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT ;+;(;)..=3.1=.7=;=8;==<4====;====== MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS114_32:1:208:971:600 147 seq2 382 99 35M = 559 212 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<8<<:<<<0;44<<:4<:< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:7:1864:1569 83 seq2 382 99 35M = 561 214 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<<<<<<<<<<:<<<8<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:224:592:744 147 seq2 383 99 35M = 188 -230 GATATGTAGTCATCAGACTATCTAAAGTCAACATG 6<6<<<<<<9+<6-<<<:<:<:<<<<<:<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:6:25:949:33 147 seq2 383 99 35M = 201 -217 GATATGTAGTCATCAGACTATCTAAAGTCAACATG -<4<666<<-7<5<<<<<(<<<<<<<<<<<<<<-< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS54_73:5:271:874:367 147 seq2 384 99 35M = 560 211 ATATGTAGTCATCAGACTATCTAAAGTCAACATTA <<<<<<<<<<<<<<4<;<;<:<;4<4<<99<7<+% MF:i:18 Aq:i:51 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS139_19:4:26:1312:1400 147 seq2 385 99 40M = 207 -218 TATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAA ::77:<;:+6<+<<<;<<74<<<;<<;<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS51_66:6:310:747:415 83 seq2 387 99 35M = 217 -205 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG ;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+EAS56_57:6:4:223:776 83 seq2 387 93 35M = 203 -219 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG <;9<;<0<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+EAS114_28:3:32:492:907 83 seq2 387 95 36M = 571 220 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGGA <<<<<<<<<<<<<<<<<<<;<;;<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_26:4:110:840:431 147 seq2 388 93 35M = 567 214 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA =====================5:======54=+3+ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_45:6:86:693:234 83 seq2 388 82 35M = 202 -221 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA 83997;<;;;;98;;3*6<<;<:8;;;;;<;;<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:3 H1:i:13
+EAS139_11:8:96:1314:1448 83 seq2 388 93 35M = 213 -210 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA <<<<7<<:<<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:3 H1:i:8
+EAS114_30:6:41:461:436 83 seq2 389 74 35M = 200 -224 TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA ;<986<;6<<<<<<<;<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:13
+EAS221_3:8:55:932:613 147 seq2 389 77 35M = 568 214 TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA <<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:10
+EAS1_97:5:219:174:684 147 seq2 390 71 35M = 560 205 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<8<8<<<7<<;<<<<<2<;&;;;;9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS56_57:5:24:284:360 147 seq2 390 76 35M = 567 212 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<<<<<<<;<<<<<<<;<9;<;99;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS114_26:1:113:367:659 83 seq2 390 72 35M = 222 -203 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<5<0&9;<3<<<<<9<<<<4<;<9<9<<<<7<3< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:17
+EAS114_32:5:109:199:592 147 seq2 390 72 35M = 576 221 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<;:<;;<<:;6<<;:;:<<+;;;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS114_45:4:88:55:1187 147 seq2 391 66 35M = 220 -206 GTCATCAGACTATCTAAAGTCAACATGAAGGAAAA 7769,7;;;;;;;;;;;;;;9;;;;;;;;;;;;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:7
+EAS56_59:2:60:677:921 147 seq2 393 96 35M = 250 -178 CATCAGACTATCTAAAGTCAACATGAAGGAAAAAA ========9==;======8==>============= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:4 H1:i:13
+EAS114_39:3:88:84:1558 147 seq2 394 95 35M = 203 -226 ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA ;;<<;<<;<<5<<<<<<;<<:<<<;<<<<<<;<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:2 H1:i:3
+EAS56_59:2:201:768:529 83 seq2 396 99 35M = 225 -206 CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT 3<:<9<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:13:100:876 83 seq2 397 73 36M = 223 -210 AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT ;9<$<<<$<<<<<<<<75<<<<<<<9<9<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:6 H0:i:1 H1:i:1
+EAS139_11:4:26:137:1382 83 seq2 397 99 35M = 579 217 AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC <<<<<<7<<<77<<<<<<</<<+<<<<<<7<+<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_67:3:197:261:624 83 seq2 398 99 35M = 587 224 GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT <<<<<<<<<<<;<<<<<<<;<<;<<<<<<;<<<9< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS218_4:3:41:1281:1785 147 seq2 399 99 35M = 237 -197 ACTATCTAAAGTCAACATGAAGGAAAAAAATTCTA <6<<<6<<<<<<:<<6<:<<<<<<<<<<<<6<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_610:5:51:904:391 83 seq2 401 97 35M = 212 -224 TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA ;<96<<<<<<7<<7<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_63:7:137:139:248 147 seq2 401 97 35M = 569 203 TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA <<<<<<<<<9<<<<<<<<<<;<<<<<<<;;<;<;< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:3 H1:i:2
+B7_610:7:15:696:693 147 seq2 403 34 35M = 570 202 TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT 2:+:7<<3<<<<<6+36<<<<<<<6<<6&<<;<.7 MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS114_45:2:41:199:388 147 seq2 403 99 35M = 243 -195 TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT 84898;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:163:611:211 83 seq2 405 99 35M = 234 -206 TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA <<<<9<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:114:19:769 147 seq2 405 90 35M = 572 202 TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA <<<<<*2;6;<<<4.;;<&;;<.<40)<);5-/7; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS51_64:7:92:493:891 147 seq2 408 99 35M = 240 -203 AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA <383<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:5:996:2000 147 seq2 408 99 35M = 575 202 AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_93:1:179:629:513 83 seq2 409 99 35M = 220 -224 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA <;,<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:84:1505:1037 83 seq2 409 99 35M = 586 212 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA <<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<::) MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS221_1:6:96:491:1891 83 seq2 409 99 35M = 253 -191 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA :;5<<7<;:<<;<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:307:481:625 147 seq2 410 99 36M = 245 -201 TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA ;4<<4<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+B7_610:5:120:596:847 83 seq2 410 83 35M = 211 -234 TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAG ;/<<:<;<<<<<<<<<<<<<;;<<<<<;<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:3:3:864:1888 83 seq2 411 99 35M = 579 203 CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA ;<<;;<<;;;<;;<<;<;<<;<<;8<<:<;79799 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:34:1614:558 83 seq2 411 99 35M = 569 193 CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA <<<<<<<<<<<7<<<<<8<<<<<<2<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:117:570:971 83 seq2 413 99 35M = 223 -225 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <,<9<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS112_34:8:45:800:733 147 seq2 413 99 35M = 607 229 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <<<</<<<<<<<<<<<<<<<2<9<<<<<5*5;599 MF:i:18 Aq:i:34 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS219_FC30151:7:87:1289:83 147 seq2 413 99 35M = 585 207 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<<<: MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:4:58:271:612 147 seq2 415 99 35M = 236 -214 ATGAAGGAAAAAAATTCTAAAATCAGCAAGAGCAA ;:2=<<;<<<<<<:67:<<:<<<<<<<<<<<<,<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:11 H0:i:0 H1:i:2
+EAS1_108:1:33:779:821 147 seq2 416 99 35M = 579 198 TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS112_34:6:75:615:555 147 seq2 416 99 35M = 255 -196 TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA ;<<<;<<<<<<<<<:;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS188_7:6:11:994:584 147 seq2 417 97 35M = 226 -226 GAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAG <<<<;<<<<<<<;<:<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS114_26:7:218:858:445 147 seq2 421 99 35M = 239 -217 GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA ;<<<<<<<8;:<<<<<<;<<:<<<<<<<<<<<<;< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_81:2:317:72:221 83 seq2 422 99 35M = 270 -187 AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC =========:======;==;=============== MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:70:766:2016 147 seq2 422 99 35M = 607 220 AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS56_53:4:45:707:147 83 seq2 424 99 35M = 216 -243 AAAAATTCTAAAATCAGCAAGAGAAAAGCATACAG <<<<<<;3<<<<<4;<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:16:1343:1621 147 seq2 426 99 35M = 248 -213 AAATTCTAAAATCAGCAAGAGAAAAGCATACAGTC ;<<9;7=====;;==<==================< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:184:912:258 83 seq2 428 99 35M = 582 189 ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:119:38:945 147 seq2 428 99 35M = 221 -242 ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT =;;8=====:========<================ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:95:235:746 147 seq2 430 99 35M = 598 203 TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT <<<<;<<<<<<<<79<<<<<<<<<<<<<<*;;;<9 MF:i:18 Aq:i:72 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS1_99:2:188:782:483 83 seq2 431 99 35M = 277 -189 CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA 7<<<<<<4<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:39:348:594 147 seq2 431 99 35M = 600 204 CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA <<;<<<<<<<<<;<;;<<<<<<<<<<;<<<:<:<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:176:971:874 83 seq2 432 76 9M1D26M = 273 -195 TAAAATCAGAAGAGAAAAGCATACAGTCATCTATA <<<<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:3:14:697:541 147 seq2 432 99 35M = 259 -208 TAAAAGCAGCAAGAGAAAAGCATACAGTCATCTAT 8<<<<&6<;8<<<<<<<<<<<<;<<<<;<<<<<<8 MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_610:7:177:469:800 147 seq2 433 99 35M = 259 -209 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA =<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:131:518:588 147 seq2 433 99 35M = 607 209 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<1<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:8:6:237:885 147 seq2 433 99 35M = 269 -199 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA <<<<1:<;:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:134:126:465 147 seq2 434 99 35M = 245 -224 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA <<;:&<3)<<7<:<<<<.:<<<<<8<<<<<<<<<< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:104:402:732 147 seq2 434 99 35M = 610 211 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA =========================7=;===;=:= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:65:85:1547 83 seq2 434 99 35M = 257 -212 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA <<<<<<;:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:85:686:696 147 seq2 435 99 35M = 594 193 AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA ==================<=====:==<=<;=:== MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:144:242:602 147 seq2 436 99 36M = 611 211 ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG ========================;=====<;;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:204:737:61 83 seq2 437 99 35M = 247 -225 TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG (7=72=;==2=====<===<<============== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:124:253:889 147 seq2 437 99 35M = 598 196 TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG <<<<<<6<<:<<<<<<<<<<<<<;;<<;<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:310:155:312 147 seq2 438 99 35M = 606 203 CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA ;<<<;<<<8<<<<<<<<<<<<;<<<<<8<<<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:78:692:671 83 seq2 438 99 35M = 610 207 CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA <<<<<<<<<<<<<;<<<<<<<:<<:<<<:8<<0;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:130:260:553 147 seq2 439 99 35M = 250 -224 AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA <*;<<7<);<<;9;<5<*<9<;<<;;<7<<<<<1< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:60:163:1612 147 seq2 439 99 35M = 617 213 AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA <<<<<<<<<21<<<<<<<<<3<--<+<<<+<<63< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:106:595:322 83 seq2 440 99 35M = 274 -201 GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA ;+<<<<<<<<<<<<<<<<<<;<<7<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:211:84:84 147 seq2 440 99 35M = 268 -207 GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA 6:<<:<<<<<<9<<<<<<<<<<<;<<<;;;<;<3; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:280:662:939 147 seq2 442 99 35M = 294 -183 AAGAGAAAAGCATACAGTCATCTATAAAGGAAATC <<;<;<<<<<:<<<;<<<;<<;<<<<<<<<<<<;< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:52:751:360 83 seq2 443 99 35M = 263 -215 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC <-<9<<<<<6<<<8<<;;<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:234:167:381 147 seq2 443 99 35M = 625 217 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<;;7<;; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:37:156:134 83 seq2 443 99 35M = 261 -217 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC 99998<<<<:<<<<<<<;<<><<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:93:490:901 83 seq2 445 99 35M = 280 -200 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<;<<<;<<<;<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:96:489:453 83 seq2 445 99 35M = 625 215 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:46:13:880 147 seq2 445 99 35M = 290 -190 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA =&====8==========0================= MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:167:905:852 147 seq2 445 99 36M = 647 238 AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT <<<7<<<<<<<<<<<<<<:<:<<:::&.<:<66:3< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS219_FC30151:3:13:674:1717 147 seq2 445 99 35M = 623 213 AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<%<<<<<<<<<<<<<<<<<<<;:;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS51_62:7:196:511:896 83 seq2 446 99 35M = 283 -198 GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT 8<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:154:118:488 147 seq2 447 99 35M = 624 212 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<<<<<<<<<<<<<<:7<<<<7<:;;:: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:44:153:969 83 seq2 447 95 35M = 245 -237 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<5<:7<72<51<7<*79<<<<<5<<<<<<<<<2< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:215:246:640 83 seq2 447 99 36M = 624 213 AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:94:1655:1921 147 seq2 447 85 35M = 258 -224 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<;:===<==;<==<;================; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:60:1037:1146 147 seq2 447 99 35M = 250 -232 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:23:536:229 83 seq2 448 99 35M = 614 201 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<:<8<:<<;<<<<<<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:130:865:838 147 seq2 448 99 35M = 649 236 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:239:1001:406 83 seq2 450 99 35M = 634 219 AGCATACAGTCATCTATAAAGGAAATCCCATCAGA <<<<<<7<<<<<<<<8<;<<<7<<<<36<<3<:33 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:147:423:584 147 seq2 451 99 35M = 277 -209 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA 27<;<3<<<+<<;<<<;;-4<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:187:715:521 83 seq2 451 99 35M = 291 -195 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <7<:<9<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:172:196:746 83 seq2 451 99 35M = 620 204 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:267:821:860 83 seq2 451 99 34M = 296 -189 GCATACAGTCATCTATAAAGGAAATCCCATCAGA $&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS56_61:7:7:682:201 83 seq2 452 99 35M = 288 -199 CATACAGTCATCTATAAAGGAAATCCCATCAGAAT 0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:82:13:897 147 seq2 453 99 35M = 606 188 ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA <<<<;<<<<<<;<;<;5<51;<1<<<<%<<<<,58 MF:i:18 Aq:i:41 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS56_53:6:180:695:621 83 seq2 453 99 35M = 637 219 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:158:909:321 83 seq2 453 99 35M = 271 -217 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:237:497:165 83 seq2 454 99 35M = 619 200 TACAGTCATCTATAAAGGAAATCCCATCAGAATAA 8===<8===========37=<===7=;7=8===== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:152:355:962 83 seq2 456 99 35M = 269 -222 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<.9.<;+;<;<<<<<<<<<<::<<:<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:4:255:549:422 83 seq2 456 99 35M = 295 -196 AAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<;;+<;4;<<<<<<<<<<<;<;<<;<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:2
+EAS220_1:4:100:20:1199 147 seq2 456 99 35M = 614 193 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA 7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:71:408:741 147 seq2 457 99 35M = 637 215 AGTCATCTATAAAGGAAATCCCATCAGAATAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:285:395:450 147 seq2 458 99 35M = 269 -224 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT 8)3<8+;<)<<<<<<<<97:7<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:4:854:140 83 seq2 458 72 35M = 638 215 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<6<<<:<6<<<:36:<<<<3<<8:.6<38::4< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:227:657:95 147 seq2 458 99 35M = 280 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT ;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:57:324:546 83 seq2 458 99 36M = 281 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAATG ;;5<;,<<<;;<<<<<<<97<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:274:1078 83 seq2 458 99 40M = 282 -216 GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT 9:*:64<<;<<<<<<<<<;8;<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:636:642 147 seq2 458 99 35M = 630 207 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:226:869:36 147 seq2 461 99 35M = 273 -223 ATATATAAAGGAAATCCCATCAGAATAACAATGGG <0/)</<<<:<<<<<)<<7<<<<<+55<<1<<<:< MF:i:18 Aq:i:59 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS192_3:4:312:915:751 83 seq2 461 99 35M = 621 195 ATCTATAAAGGAAATCCCATCAGAATAACAATGGG <2<<<<<<<8;<<<<<<<<:<<<<8<<<<<84,4: MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:96:899:106 83 seq2 462 99 35M = 636 209 TCTATAAAGGAAATCCCATCAGAATAACAATGGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:62:969:12 147 seq2 464 99 35M = 303 -196 TATAAAGGAAATCCCATCAGAATAACAATGGGCTT <<;<;<::<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:67:56:806 83 seq2 464 99 35M = 637 208 TATAAAGGAAATCCCATCAGAATAACAATGGGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<:7: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:37:611:267 83 seq2 464 99 35M = 610 181 TATAAAGGAAATCCCATAAGAATAACAATGGGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_93:7:319:280:57 147 seq2 467 99 35M = 306 -196 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:96:720:940 147 seq2 467 99 35M = 654 222 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<;<<<<<<<<<<;9<<8<<6<;:;<;;.;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:59:286:290 83 seq2 467 99 35M = 628 196 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<<;<<<;<<<<<<<<<<<<<;;;<<;7;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:236:841:20 147 seq2 467 99 35M = 652 220 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<<<<<<<<<<<7<<<<:<<9<<<<;<:<9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:49:656:507 83 seq2 468 99 35M = 637 204 AAGGAAATCCCATCAGAATAACAATGGGCTTCTCA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:78:1314:1275 147 seq2 469 99 35M = 277 -227 AGGAAATCCCATCAGAATAACAATGGGCTTCTCAG <<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<<<1< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:181:392:500 147 seq2 470 99 35M = 299 -206 GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC /5<<;(88<<<;<;<<6<<<<<7<<<<<<<7<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:133:8:379 147 seq2 470 99 35M = 653 218 GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC <<<<<<<<<<<<<<<<<<<<<<<<8;<<8<<<:6< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:198:929:684 147 seq2 471 99 35M = 624 188 GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA <7<<<<;<<<<<<<<<<<<;<<<<<:<<<<::<:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:181:582:435 83 seq2 471 99 35M = 629 193 GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:214:784:690 83 seq2 472 99 35M = 657 220 AAATCCCATCAGAATAACAATGGGCTTCTCAGCGG <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<4<44 MF:i:18 Aq:i:30 NM:i:1 UQ:i:19 H0:i:1 H1:i:0
+EAS114_39:3:11:1238:1728 83 seq2 475 99 35M = 310 -200 TCCCATCAGAATAACAATGGGCTTCTCAGCGGAAA :677<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS112_34:4:12:273:89 147 seq2 477 99 35M = 631 189 CCATCAGAATAACAATGGGCTTCTCAGCGGAAACC ==========<====:=========+===4414;; MF:i:18 Aq:i:71 NM:i:1 UQ:i:28 H0:i:1 H1:i:0
+EAS56_63:2:119:161:322 147 seq2 479 99 35M = 297 -217 ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT <83<;<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:2:111:142:21 83 seq2 479 99 35M = 304 -210 ATCAGAATAACAATGGGCTTCACAGCGGAAACCTT ;88<:<;;<6<;;<<<:<<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:28 NM:i:2 UQ:i:53 H0:i:0 H1:i:0
+EAS1_99:1:34:649:318 83 seq2 481 65 35M = 328 -188 AAGAATAACAATGGGCTTCACAGCGGAACCCTTAC )<7<<3<<<<<<+<1<;<8&<<<<<<<<<<<<<<< MF:i:-126 Aq:i:65 NM:i:3 UQ:i:59 H0:i:0 H1:i:0
+EAS114_30:6:214:565:337 147 seq2 481 99 35M = 326 -190 CAGAATAACAATGGGCTTCTCAGCAGAAACCTTAC ;;<;<1<9<<<8<<<<<;<<<<<<8<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:226:370:91 147 seq2 482 99 35M = 335 -182 AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA <':<6<;<<<;2<;<-7;;;<<<<<<<;;;<<7;< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:6:13:682:680 83 seq2 482 99 35M = 685 238 AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA <<<<<<<<<<<<<:<<<<<<<<<<;<;<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:2:273:348:37 147 seq2 483 99 36M = 688 241 GAATAACAATGGGCTTCTCAGCAGAAACCTTACACG <<<<<<<9<49<<<;<<<<*<<19<15;<</5<;.5 MF:i:18 Aq:i:41 NM:i:1 UQ:i:13 H0:i:1 H1:i:0
+EAS139_11:8:76:205:587 83 seq2 483 99 35M = 306 -212 GAATAACAATGGGCTTCTCAGCGGAAACCTTACGA 8<<5<<<<<<<<<<<<<<<<<<<<<<<<<7<<</< MF:i:18 Aq:i:28 NM:i:2 UQ:i:41 H0:i:0 H1:i:0
+B7_591:2:27:280:592 147 seq2 484 99 36M = 310 -210 AATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC <<<<<<<<<<<8<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_99:7:171:196:287 147 seq2 485 99 35M = 658 208 ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC <<<<<<<<<<<<<<<<<<<<<;6<<<<<<2:8<0: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:224:579:433 147 seq2 485 99 35M = 662 212 ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC <<<<<<<<<<<<<<<<<:<<<<<<<<<<<8<+8;: MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:22:490:2011 147 seq2 485 99 35M = 307 -213 ATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC <7<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_65:6:46:173:214 83 seq2 487 99 35M = 308 -214 AACAATGGGCTTCTCAGCAGAAACCTTACAAGCCA <<2<<<<<<<<<<<5<<5<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:4 H1:i:6
+EAS1_103:4:164:79:134 83 seq2 488 99 35M = 656 203 ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_32:2:283:577:398 147 seq2 488 99 35M = 308 -215 ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG ;8;;&<<<;<;67<;<;<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:29 NM:i:1 UQ:i:27 H0:i:0 H1:i:2
+EAS54_67:5:149:639:910 147 seq2 489 99 35M = 669 215 CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA <<<<<<<<<<<<<<<<<<<<<<<<7<;;<<;<<;< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:250:628:423 83 seq2 489 99 36M = 295 -230 CAATGGGCTTCTCAGCGGAAACCTTACAAGCCAGAA +<<4;;9;;7.;7<;7<;<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:1:242:419:512 147 seq2 490 94 35M = 672 217 AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA <<8<<<<<<<<<<<<<<<<<<<<<<<<;<8<(<30 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_45:1:95:1530:28 83 seq2 490 74 35M = 332 -193 AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA 77741(9;;994;5;;4;;1;;;;;1;<;<<<<;< MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:42 H1:i:45
+EAS192_3:6:326:887:180 147 seq2 492 73 35M = 672 215 TGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGC ;<<<<<;<<<<<<<<<8<<<<<<<<<<<<0<;;<+ MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:3 H1:i:7
+EAS1_99:1:86:871:319 83 seq2 494 71 35M = 651 192 GGCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGA <<<<<:<<<:<:<<<<<<<<<<<<8<<:<1;<::) MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:0 H1:i:4
+EAS56_57:1:189:130:136 147 seq2 494 79 35M = 314 -215 GGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGA 823;23<7<57<7<<<<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:63 H1:i:85
+EAS51_64:7:140:752:822 83 seq2 495 76 35M = 667 207 GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT <<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<;<:; MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:5
+EAS56_57:5:53:544:889 147 seq2 495 76 35M = 335 -195 GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT ,<;<<<;<<<<<<<<<:;;<<<<<;;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:2 H1:i:32
+EAS54_65:4:61:346:384 83 seq2 496 68 35M = 324 -207 CAACTAAGAAGAAACCTTACAAGCCAGAAGAGATT 7&$+&,<<+;;<;;<<6<<8<<<;<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:19 H0:i:1 H1:i:53
+EAS54_81:8:177:800:714 83 seq2 497 76 35M = 324 -208 TTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTG =;3=+=<:=<========8================ MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:29 H1:i:85
+B7_597:6:20:592:496 83 seq2 498 75 35M = 338 -195 TCTCAGCGGAAACCTTACAAGCCAGAAGAGATTGG 97<7;<;<;<<<<;<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:5 H1:i:48
+B7_591:5:243:557:560 83 seq2 499 75 36M = 331 -204 CTAAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT 69&<;&<&<<;6.<<<+<<<;;<<<<<<<<;<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:9
+EAS188_7:5:163:982:695 147 seq2 499 77 35M = 339 -195 CTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGA <:<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:7 H1:i:42
+EAS139_19:1:1:1598:843 83 seq2 500 99 40M = 347 -193 TCAGCGGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT 1)::6::<<;<98<<<<<<9<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:25 H0:i:1 H1:i:0
+EAS139_19:6:78:1029:512 147 seq2 500 99 40M = 656 196 TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT <0:;<<<<<<<<<:<<:;<<<;<7<<;<7;;;:6;::672 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:14:1872:1521 83 seq2 500 62 35M = 339 -196 TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT /1<%73&7<1<3577,<<<7/733<<<<<<<<1<< MF:i:18 Aq:i:2 NM:i:2 UQ:i:9 H0:i:1 H1:i:8
+EAS221_3:6:51:1486:1131 147 seq2 500 77 35M = 685 220 TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT <<<<<<<<<;<<<<<<<<<1<5<<8<<<'<;<<;1 MF:i:18 Aq:i:3 NM:i:0 UQ:i:0 H0:i:22 H1:i:22
+EAS192_3:6:45:183:25 147 seq2 501 95 35M = 672 206 CAGCGGAAACCTTACAAGCCAGAAGAGATTGGATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<86;<;:; MF:i:18 Aq:i:23 NM:i:1 UQ:i:27 H0:i:0 H1:i:2
+B7_597:4:38:999:463 147 seq2 503 39 35M = 317 -221 GCGGAAACCTTACAAGCCAGAAGAGATTGGATCTA .*:&<<0<0!<<+<<<<<<<<<<<<<0<<<<<<<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:25 H0:i:0 H1:i:1
+EAS114_45:1:30:1882:1210 147 seq2 503 82 35M = 665 197 GCAGAAACCTTACAAGCCAGAAGAGATTGGATCTA ;;::;;;;:;;;;;:;;;;;;9;;:7;;8:77777 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_108:6:222:579:961 147 seq2 504 99 35M = 679 210 CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<<<<<<<7<<:7;;;68 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:92:875:345 147 seq2 504 99 35M = 690 221 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_63:8:62:125:888 83 seq2 504 99 35M = 347 -192 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA ,;3<<<8;;3<,<<<8;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:2:23:127:880 83 seq2 504 99 35M = 686 217 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_66:8:43:972:506 147 seq2 505 99 35M = 686 216 AGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT <;<<<<<<<<<<<<6;<;<<<<<<<<<<:;;<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:183:697:555 83 seq2 505 84 35M = 341 -199 AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT <<<;&,.;);&96<84<<81<<&<<<9<<8<8<<1 MF:i:18 Aq:i:37 NM:i:2 UQ:i:16 H0:i:0 H1:i:1
+EAS221_3:8:65:463:703 83 seq2 506 99 35M = 693 222 GAAACCTTACAAGCCAGAAGAGATTGGATCTAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:101:752:996 147 seq2 508 99 35M = 687 214 AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT <<<<<<<<<<<<<<<;<<<<<9<<<<<<;<<;;;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:267:953:459 83 seq2 509 99 35M = 667 193 ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT <<<<<<<<<9<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:33:1240:846 83 seq2 509 99 35M = 685 211 ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT <<<<<<<<<<<<7<<2<;<<;<<<;<<<:6:<<<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:135:401:735 83 seq2 510 99 35M = 703 228 CCTTACAAGCCAGAAGAGATTGGATCTAATTTTTG <<<<<<<<<<<<<<<<<<<<<;<<<<<8<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:3:186:68 83 seq2 512 99 35M = 687 210 TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA <<<<<<<<<<<<;<<<<<<<<<<<<;;<<<<<&%8 MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_78:7:164:727:977 147 seq2 513 99 35M = 689 211 TACAAGCCAGAAGAGATTGGATCTAATTTTTCGAC <<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;;79; MF:i:18 Aq:i:75 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+B7_589:1:110:543:934 147 seq2 514 99 35M = 700 221 ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT <<<<<<<<<<<<;<<<<<;;<<<;;<<<<<,,;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:329:339:408 147 seq2 515 99 36M = 325 -226 CAATCCAGAAGAGATTGGATCTAATTTTTGGACTTC 7<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS56_59:5:325:544:349 147 seq2 515 99 35M = 716 236 CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:3:903:957 83 seq2 516 99 35M = 661 180 AAGCCAGAAGAGATTGGATCTAATTTTTGGACTTC <<<<<<<<<<<<<<<<;;<;<;<<<<<<66<;<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:85:361:418 147 seq2 517 99 36M = 353 -200 AGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT ;;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:138:186:459 83 seq2 518 97 35M = 360 -193 GCCAGAAGAGATTGGAGCTAATTTTTGGACTTCTT +/2/;<:<&7:7</<2&<<<&<<<<<<<<<8<<:3 MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_11:4:36:1184:994 83 seq2 518 99 35M = 358 -195 GCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT <84<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:270:430:269 83 seq2 519 99 36M = 331 -224 CCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA 28<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:295:882:282 147 seq2 520 99 35M = 691 206 CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA ========================<6<======8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:41:739:907 83 seq2 520 99 35M = 344 -211 CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA ;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:272:240:950 147 seq2 520 97 35M = 696 211 CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA 6<<&:<<<&<::;&7<<<3<;<<;<:;:<8:<<(< MF:i:18 Aq:i:25 NM:i:3 UQ:i:17 H0:i:0 H1:i:0
+EAS54_65:7:155:629:357 83 seq2 521 99 35M = 333 -223 AGAAGAGATTGGATCTAATTTTTGGACTTCTTAAA <<<<<<<<;<<<<<<<<<<<<6<<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:14:88:306 147 seq2 521 99 35M = 341 -215 AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA <1;<;<;<4<&<<<:<<<:<<<<;<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_108:5:115:193:231 147 seq2 522 99 35M = 684 197 GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG <<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:88:1454:418 83 seq2 522 99 35M = 349 -208 GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG <<<<<<<<<<6<96<<<1911<<<1<<<<<<<<<1 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:36:649:554 83 seq2 523 99 35M = 350 -208 AAGAGATTGGATCTAATTTTTGGACTTCTTAAAGA <<<<<888;<<<;<<<;<;<8<<<<8<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:119:651:88 83 seq2 527 99 35M = 337 -225 GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:57:826:977 147 seq2 528 99 35M = 693 200 ATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAA <<<<<<<<<<<<<<<<+<<<<<<<<6<9:6<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:285:417:147 83 seq2 529 99 35M = 712 218 TTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAA <<<<<<<<<<<<<<<;8<<<<<<<<<;6<:<;<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:160:130:351 83 seq2 530 99 35M = 697 202 TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA <<<<<<<<<<<<<<<;<<<<4<<<<<;<<<:<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:287:665:495 147 seq2 530 99 35M = 702 207 TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA ==========================98====8=8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:71:187:824 147 seq2 534 99 35M = 367 -202 TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT 0040;<7<<<<0<7<<<;<7*<<<<<7<<771<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:70:445:1289 83 seq2 535 99 35M = 702 202 CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG <<<<<<<<<<2<<<<<<<<<<:<<<<<<<;;;;<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:41:745:603 83 seq2 536 99 35M = 360 -211 TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT ;<<;;<;<8<<<<<<<<<<<;<<;<<<<<<<<<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:197:759:975 147 seq2 537 99 35M = 698 196 AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:140:253:322 83 seq2 537 99 35M = 689 187 AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC <<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:58:684:520 147 seq2 538 99 35M = 367 -206 ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA <85;;:<<<7<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:19:306:982 147 seq2 538 99 35M = 368 -205 ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA <<<<<<<<<9<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:273:562:954 83 seq2 539 99 35M = 722 218 TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:78:775:555 83 seq2 539 99 35M = 691 187 TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA 6:<<<<:<<<<6:<<)::8<6<<:<<)<::63832 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:49:330:699 147 seq2 540 99 35M = 722 217 TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAA ==;=================;======5;;;==5= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:329:437:643 147 seq2 540 99 36M = 354 -222 TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC 885<8;;<;3,8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:125:884:276 83 seq2 541 99 35M = 362 -214 TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC ,;;3,<7<;7<<===;============;====== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:315:201:673 83 seq2 542 45 36M = 381 -197 TTGGACTTATTAAAGAAAAAAAAACCTGTCAAACAC ;;;;<-;;&;;<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:3:10:394:392 147 seq2 542 99 35M = 376 -201 TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA 28-:;0-<0<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:228:736:747 83 seq2 542 68 35M = 381 -196 TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA <07<<&<;+<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:267:394:437 147 seq2 544 99 35M = 735 226 GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG <<<<<<<<<<;<;<<<<<;;<<<<<;<<:;8<;<8 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:66:1381:181 83 seq2 544 99 40M = 362 -222 GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT ;;;+;;&<7<<<+<<<<<<<;<;8<<<;<<<<8<<<;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:74:668:424 83 seq2 545 99 40M = 707 202 GACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:322:350:374 83 seq2 546 99 35M = 360 -221 ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA <+;8&84<<<:<<<<<<<<<<;<<<<<<<;<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:307:208:477 147 seq2 546 99 35M = 710 199 ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA <<<<<<<;<<;<<<<<<<<<<<<<<<<;:<<<88; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:228:915:631 83 seq2 547 66 35M = 381 -201 ATTATTAAAGAAAAAAAAACCTGTCAAACACGAAT &-))-*===/=========9====4========== MF:i:18 Aq:i:0 NM:i:2 UQ:i:13 H0:i:1 H1:i:0
+EAS1_93:5:246:177:525 83 seq2 549 98 35M = 738 224 TCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT <<<<<<<<<<<<<<<<<<<<<1<<<<<<;;;<8;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:93:634:323 83 seq2 550 99 35M = 721 206 CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT <<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<,<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:8:165:441:708 147 seq2 550 99 35M = 737 222 CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT =<===============================99 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:191:885:623 83 seq2 551 99 35M = 363 -223 TTAAAGAAAAAAAAACCTGTCAAACACGAATGTTA 66<<<<<<<<<<<<<2<<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:127:828:697 147 seq2 552 99 35M = 346 -241 TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT ;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:115:249:673 147 seq2 552 99 35M = 743 226 TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<6< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:263:689:572 147 seq2 553 68 35M = 381 -207 AAAGAAAAAAAAACCTGTCAAACACGAATGTTATG <9<2<<<<<<<<<22;;02<<<9<<;9<9<<;<<3 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:99:1632:76 83 seq2 553 99 40M = 705 192 AAAGAAAAAAAACCCTGTCAAACACGAATGTTATGCCCTG <<<<<<<<<<<<*<<<<8<9<<<<<<<<<9;;;;<18:;: MF:i:18 Aq:i:47 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS54_71:7:250:698:842 147 seq2 554 99 35M = 753 233 AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<24 MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:41:314:1173 83 seq2 554 99 35M = 718 199 AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC <;<<<<<<<;;<<<<<-<<<;;;<;8<*;;<<<<' MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:189:831:878 83 seq2 555 99 35M = 351 -239 AGAAAAAAAAACCTGTCAAACACGAATGTTATGCC <9<<<<<<<<<<;9<:<<<<<6<<<<<<<;<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:216:47:302 83 seq2 557 99 35M = 729 207 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<<<<7<<<<<<<<<<<<+<<<<<//6;< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:28:538:148 83 seq2 557 99 35M = 376 -216 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<<<7;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:284:597:682 147 seq2 557 99 35M = 375 -217 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<9;;7<;:<<<:<;<<<<<<<<;<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:11:1261:1200 83 seq2 558 99 35M = 362 -231 AAAAAAAACCTGTCAAACACGAATGTTATGCCCTG <<<<<<<:<<6<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:246:711:981 147 seq2 559 99 35M = 371 -223 AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC ;;:;7<<:5:<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:208:971:600 83 seq2 559 99 35M = 382 -212 AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC <<<<<<<3*+<4/<<<<7<<<<0<<:<8<<<<0<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:219:174:684 83 seq2 560 71 35M = 390 -205 AAAAAAACTGTCAAACACGAATGTTATGCCCTGCT <<<<:;+9<<<;<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS51_66:7:4:234:610 147 seq2 560 84 35M = 729 204 AAAAAACCTGTCAAACACGAATGTTATGCCCTCCT <<<<<<<<7;<<<;7<7;7;7<;-<-<&<<<0%06 MF:i:18 Aq:i:22 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_73:5:271:874:367 83 seq2 560 99 35M = 384 -211 AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT <<<<<<5;<<<:<<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:2:168:1878 83 seq2 560 37 35M = 743 218 AAAAAACCTGGCAAACACGAATGTTATGACATGTN ;<:;;<:<;<;<;;;;:;<;:::&9:&:68&6&*! MF:i:18 Aq:i:37 NM:i:5 UQ:i:61 H0:i:0 H1:i:1
+EAS221_1:6:89:1164:573 147 seq2 560 99 35M = 371 -224 AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT 3<<<6<%7<<08<<4<3<<103<1<<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:53:783:78 147 seq2 561 99 35M = 363 -233 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <;;;;<<0<,<<<<<<<<<;<<<;<;<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:570:902 147 seq2 561 99 35M = 730 204 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <<<<<<<<<<<;4<<:<<44<<<<<<<<<<<4<<+ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:7:1864:1569 147 seq2 561 99 35M = 382 -214 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:89:942:84 147 seq2 562 74 35M = 759 232 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:122:589:134 83 seq2 562 99 35M = 369 -228 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA ;<;4<<538<<;<<;<<<<';,:<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:77:1529:522 83 seq2 562 99 35M = 722 195 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA <<;<<<<<<<<<<<4<<4<;;:;2:7<<<2*<;;8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:48:805:860 83 seq2 563 78 35M = 755 227 AAACCTGTCAAACACGAATGTTATGCCCTGCTAAA <<<<<<<;<<<<<<<41;<<8<<<<<<<8+<4,+; MF:i:18 Aq:i:13 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:144:492:61 83 seq2 564 99 35M = 728 199 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<<;<<<<<<<<<<<;<<<<<<7:<<<<::;9;;6 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:303:970:243 83 seq2 564 99 35M = 370 -229 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<0+<<<,<4<:<:<<<<<<<<<<<::<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:78:806:800 147 seq2 564 99 40M = 717 193 AACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGC <<<<<<<<<<<<<<<<<<<4<<:<1<0<;<9;<:78:::: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:94:1440:2016 147 seq2 564 99 35M = 751 222 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<<<<<<<<<<<<<<<<<<;<<;;;<<:<8:::75 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:103:443:166 147 seq2 565 99 35M = 747 217 ACCTGTCAAACACGAATGTTATGCCCTGCTAAACT <<<<<<<<<<<<<<<<<<<<;<<<<<<<1<-;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:24:284:360 83 seq2 567 76 35M = 390 -212 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA :;<;:<<<;<<<<<<<<<<<<<<<<<;;<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:166:626:836 147 seq2 567 99 35M = 757 225 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA <<<<<<<<<<<<<<<<<<<<9<<<<<<<<;<;;;9 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:110:840:431 83 seq2 567 93 35M = 388 -214 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA 77<;7<<<<<<<<<4<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:116:738:142 83 seq2 568 99 35M = 722 189 TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG <<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<:;2 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:55:932:613 83 seq2 568 77 35M = 389 -214 TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:137:139:248 83 seq2 569 97 35M = 401 -203 GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC ;;;99<<<;<;;<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:34:1614:558 147 seq2 569 99 35M = 411 -193 GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC <<9<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:15:696:693 83 seq2 570 10 35M = 403 -202 TCAAACACGAATGTTAATCCCTGCTAAACTAATCA )6<:7<.7<6.<0&&<&3:&7<<7<0<<<<<<<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:50 H0:i:0 H1:i:0
+EAS114_28:3:32:492:907 147 seq2 571 95 36M = 387 -220 CAAACACGAATGTTATGCCCTGCTAAACTAAGCATC 8<;<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:114:19:769 83 seq2 572 90 35M = 405 -202 AAACACGAATGTTATGCCCTGCTAAACTAAGCATC 5+;+3/6;<+;/8<8*/<7/59<97147<;;9<7< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:182:104:921 147 seq2 575 99 35M = 378 -232 CACGAATGTTATGCCCTGCTAAACTAAGCATCATA ;<;<<<<<<:<<<<<:<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:5:996:2000 83 seq2 575 99 35M = 408 -202 CACGAATGTTATGCCCTGCTAAACTAAGCATCATA <<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:109:199:592 83 seq2 576 72 35M = 390 -221 ACGAATATTATGCCCTGCTAAACTAAGCATCATAA ;9<9<:&:<<<<;;<;;<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS219_1:3:90:219:528 147 seq2 576 75 35M = 758 217 ACGAATGTTATGCCCTGCTAAACTAAGCATCATAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:94:294:387 147 seq2 578 99 35M = 736 193 GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT <<<<<<<;<<<<<<<<<:<<<<<<<<<<<<;)7;; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:33:779:821 83 seq2 579 99 35M = 416 -198 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG <<730<<<<9<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:43:114:617 147 seq2 579 99 35M = 738 194 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG =============;=========;=========== MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:23:944:377 83 seq2 579 75 36M = 757 214 AATGTTATGCCCTGCTAAACTAAGCATCATAAATGA <<<<<<<<9<<<<;<<<<<<<<<;<7<<<<;8;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:3:864:1888 147 seq2 579 99 35M = 411 -203 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG 888588;;;;;;;;;;;;;;;;;;;;8;;;;;;;; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:26:137:1382 147 seq2 579 99 35M = 397 -217 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG <<-<8<<<<<<:<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:265:251:147 147 seq2 581 99 35M = 754 208 TGTTATGCCCTGCTAAACTAAGCATCATAAATGAA <<<<<<<<<<<<<<88<<<80:;<<<<<;:4;;:4 MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:184:912:258 147 seq2 582 99 35M = 428 -189 GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG <;;<<<<;:<<7<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:115:646:430 83 seq2 582 45 35M = 768 217 GTTATGCCCTGCTAAACTTAGCATCATAAATGAAG <7<<<<<<<<<<<<;<<<<<;<7<<<<;5;<;67< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:3:24:319:429 147 seq2 582 99 35M = 740 193 GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG <<<<<<<<<<<<<<<<;<<<<<<<<1<<-6<<</< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:8:49:182:192 83 seq2 582 99 35M = 750 203 GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG =====================;============< MF:i:18 Aq:i:49 NM:i:1 UQ:i:28 H0:i:0 H1:i:1
+EAS114_45:1:100:979:1863 83 seq2 583 85 35M = 757 209 TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG ;<;;;;;;;7;;;79;;77;9;;99;974;677-6 MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:53:458:581 73 seq2 583 77 35M = 583 0 TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:53:458:581 133 seq2 583 0 * = 583 0 CTCAATTAATTGTTTTATAAAACCTGTGAGTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<99<<<<< MF:i:-64
+B7_589:6:108:958:42 147 seq2 584 81 35M = 755 206 TATGCCCTGCTAAACTAAGCATCATAAATGAAGGG <<<<<<<<<<<<<<<<<<<<1<<<<<<9<<;<5<: MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:89:457:591 83 seq2 585 69 35M = 770 216 ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG <<<<<<<<<<<4<<<<<<<<<<<<8<7/4<<<<4+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:87:1289:83 83 seq2 585 99 35M = 413 -207 ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG <<<::<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:84:1505:1037 147 seq2 586 99 35M = 409 -212 TGCCCTGCTAAACTAAGCATCATAAATGAAGGGGA <<966<<7<<<<7<<<<9<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:197:261:624 147 seq2 587 99 35M = 398 -224 GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA 866;2:/;<<<;:<<<;<;;<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:118:41:489 147 seq2 588 76 35M = 779 226 CCCTGCTAAACTAAGCATCATAAATGAAGGGGAAA <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<95: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:157:361:309 83 seq2 589 99 35M = 747 193 CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_39:6:71:644:1792 147 seq2 589 84 35M = 754 200 CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT <<<<<<<;<<<<<<<<<<;<<<<<<<<<;<;:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_589:2:9:49:661 147 seq2 591 99 35M = 747 191 TGCTAAACTAAGCATCATAAATGAAGCGGAAATAA <<<<<<<<<<<<<<<<;<<<<<<;:<<;;;7<9;9 MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_71:2:85:686:696 83 seq2 594 99 34M = 435 -193 TAAACTAAGCATCATAAATGAAGTGGAAATAAAG :<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:1:177:522:118 69 seq2 594 0 * = 594 0 TCTCAATTAATTGTTTTATAAAACCTGTGAGTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<57<<<< MF:i:-64
+EAS188_7:1:177:522:118 137 seq2 594 49 35M = 594 0 TAAACTAAGCATCATAAATGAAGGGGAAATAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:103:870:105 83 seq2 595 44 35M = 778 214 AAACTAAGCATCATAAATGAAGGGGAAATAAAGTC <<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;<<7; MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_62:8:52:967:804 73 seq2 596 76 35M = 596 0 AACTAAGCATCATAAATGAAGGGGAAATAAAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:8:52:967:804 133 seq2 596 0 * = 596 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT ===============<=======<<===<====== MF:i:-64
+EAS1_108:6:95:235:746 83 seq2 598 99 35M = 430 -203 CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG ==&=;===7=3===8======;=;8===8=====; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:124:253:889 83 seq2 598 99 35M = 437 -196 CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG 8<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:174:650:125 83 seq2 600 76 35M = 770 201 AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:39:348:594 83 seq2 600 99 35M = 431 -204 AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC <<;;<;:<;<<<;<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:92:693:228 83 seq2 601 75 35M = 770 200 AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:285:349:797 147 seq2 604 76 35M = 773 200 ATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:82:13:897 83 seq2 606 99 35M = 453 -188 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT ,<2<;<<;<<<<;;;<<;<<<<<<<;;;;<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:310:155:312 83 seq2 606 99 35M = 438 -203 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT 2;<<;<<;<<;;/<<<<<<;<<<<8<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:45:178:1321 147 seq2 606 77 35M = 771 196 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:193:420:78 83 seq2 607 99 35M = 787 215 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:131:518:588 83 seq2 607 99 35M = 433 -209 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <.<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:45:800:733 83 seq2 607 99 35M = 413 -229 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <7<<7&<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:34 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:70:766:2016 83 seq2 607 99 35M = 422 -220 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:2:1217:398 147 seq2 608 99 40M = 780 212 TAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC <<<<<<<<<<<<<;<<<<<<<7<<<3<<<<;<<<<9:7:: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:73:1458:1337 147 seq2 609 99 35M = 806 232 AAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGAC <<<<<;;;<<<<<<<<<<<<<<<<<<<;<<7;;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:104:402:732 83 seq2 610 99 35M = 434 -211 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:37:611:267 147 seq2 610 99 35M = 464 -181 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:78:692:671 147 seq2 610 99 35M = 438 -207 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<);<<;;<<<<<;<<<<<<<<<<<<<6<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:144:242:602 83 seq2 611 99 36M = 436 -211 ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:6:1243:981 69 seq2 611 0 * = 611 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<8<<8<<<<2<<<<<<<<8<55<<8*<<8<<< MF:i:-64
+EAS219_FC30151:5:6:1243:981 137 seq2 611 68 35M = 611 0 ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAA <;<;;<<<;3;;3<<<;<<;<7%<<<.1<<<..<3 MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:291:404:199 147 seq2 612 76 36M = 777 197 TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:266:994:429 83 seq2 612 76 35M = 769 188 TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG =====================9=======4===:= MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:159:253:353 147 seq2 613 67 35M = 778 196 GAAGGGGAAATAAAGTCAAGTCTTTCCTGACAGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<0,%4(+, MF:i:18 Aq:i:67 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS1_108:5:175:149:296 147 seq2 614 99 35M = 811 232 AAGGGGAAATAAAGTCAAGCCTTTCCTGACAAGCA <<<<<<<<<<<<<<<<<<<49<<<<<<<<<<<<;4 MF:i:18 Aq:i:45 NM:i:1 UQ:i:19 H0:i:0 H1:i:1
+EAS56_65:1:23:536:229 147 seq2 614 99 35M = 448 -201 AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA <<99<<<<<;<<<;2<<<<<<;<<<9<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:100:20:1199 83 seq2 614 99 35M = 456 -193 AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA :<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:181:713:140 83 seq2 615 84 35M = 793 213 AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA <7<<<<<<<<<<<<7<7<6+<<<5;<;<2<;;+;; MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS139_19:6:82:1051:921 147 seq2 616 99 40M = 800 224 GGGGAAATAAAGTCAAGGCTTTCCTGACAAGCAAATGCTA <<<<<9<799<<<<7::/<<<9<7:9:;2:7552+9''66 MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS192_3:3:309:187:267 147 seq2 616 99 35M = 786 205 GGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAA <<<<<<<<<<<<<<<<<<<<<<<;<;<;<;68;;8 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:115:649:259 83 seq2 617 99 36M = 782 201 GGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<<9 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:261:267:597 147 seq2 617 86 35M = 787 205 GGGTAATAAAGTCAAGTCTTTCCTGACAAGCAAAT <<<<<<<<<;<<<<<7<<<<<<<<<:7<7<;44:; MF:i:18 Aq:i:41 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:4:123:1001:580 147 seq2 617 43 35M = 771 185 GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT =====!=====================1.8131*= MF:i:18 Aq:i:43 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS139_11:7:60:163:1612 83 seq2 617 99 35M = 439 -213 GGGAACTAAAGTCAAGTCTTTCCTGACAAGCAAAT -<<<<)<<<<<<<<<<<<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:59 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS54_65:4:325:795:213 147 seq2 618 99 35M = 790 207 GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<;<<<<;;<<<<<<<<<<<<;:<</;/;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:165:665:220 147 seq2 618 76 35M = 779 196 GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<<<<<<<<<<<<<<<;<;;<<<;;<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:22:206:150 147 seq2 619 99 35M = 792 208 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC ==========================::=5&;<2< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:237:497:165 147 seq2 619 99 35M = 454 -200 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC 9=:=======2=27======<>&<=,==4>4=>>= MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:82:1540:77 147 seq2 619 99 35M = 786 202 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:172:196:746 147 seq2 620 99 35M = 451 -204 AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT <<<;><<+<<<<:<<<<2<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:97:892:419 147 seq2 621 99 35M = 800 214 AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:312:915:751 147 seq2 621 99 35M = 461 -195 AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA <:-<<<99:::);:7<4;8<<<<<<<;<2<+8<;< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS1_93:4:325:352:67 147 seq2 622 99 35M = 794 207 ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA ==================<========<=<;-=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:83:731:540 83 seq2 623 99 35M = 804 216 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<;<<<<<<<<<<<<<:<7<*;&;<;;9 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:74:329:459 147 seq2 623 99 35M = 795 207 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9;599 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:13:674:1717 83 seq2 623 99 35M = 445 -213 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:141:415:738 69 seq2 624 0 * = 624 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<8<<< MF:i:-64
+EAS1_105:1:141:415:738 137 seq2 624 76 35M = 624 0 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<<<<<<<<<<<<<<<<<<<<:<<;<<;<<<<6: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:154:118:488 83 seq2 624 99 35M = 447 -212 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<;58<<95:<<;<;<<<;<<<;;<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:198:929:684 83 seq2 624 99 35M = 471 -188 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:215:246:640 147 seq2 624 99 36M = 447 -213 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:234:167:381 83 seq2 625 99 35M = 443 -217 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT <<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:96:489:453 147 seq2 625 99 35M = 445 -215 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<;;;<<<<5:<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:79:879:15 83 seq2 626 99 35M = 790 199 AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<2<;<<1< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:59:286:290 147 seq2 628 99 35M = 467 -196 TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT 77<<<<7<<<97<<,7<<<;<<<;<9<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:5:263:511:936 83 seq2 629 99 35M = 801 207 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<<<<<<<<<<;<<<<<;<<:<:<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:181:582:435 147 seq2 629 99 35M = 471 -193 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<;<<<<<;<<4<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:636:642 83 seq2 630 99 35M = 458 -207 AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC <<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:12:273:89 83 seq2 631 99 35M = 477 -189 AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA <:737<288<<<7<<<<<<<<<:9<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:239:1001:406 147 seq2 634 99 35M = 450 -219 CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA 0':.71;;:9==9=;====;=;============= MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:96:899:106 147 seq2 636 99 35M = 462 -209 TTCCTGACAAGCAAATGCTAAGATAATTCATCATC ;;;;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:67:56:806 147 seq2 637 99 35M = 464 -208 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA 844:8;7<88;8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:71:408:741 83 seq2 637 99 35M = 457 -215 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA ;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:6:180:695:621 147 seq2 637 99 35M = 453 -219 TACTGAAAAGCAAATGCTAAGATAATTCATCATCA ;&377<&<<;7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS114_30:6:49:656:507 147 seq2 637 99 35M = 468 -204 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA %44;;<:<<;<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:4:854:140 147 seq2 638 72 35M = 458 -215 CCTGACAAGCAAATGCTAAGATAATTCATCATCAC :9':<;<<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:85:1521:58 83 seq2 639 99 40M = 813 214 CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<9<<<<<<<<<<<<<7<<<<<<<<<<<<;;:7: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:57:1064:925 137 seq2 640 76 35M * 0 0 TGACAAGCAAATGCTAAGATAATTCATCATCACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:323:196:855 147 seq2 642 99 35M = 809 202 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:117:33:262 147 seq2 642 99 35M = 814 207 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:59:742:549 83 seq2 642 99 35M = 816 209 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:55:562:403 147 seq2 643 99 36M = 825 218 CAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<;<;: MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:97:743:602 147 seq2 644 99 35M = 821 211 AAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:167:905:852 83 seq2 647 99 36M = 445 -238 CAAATGCTAAGATAATTCATCATCACTAAACCAGTC +<<<9;7;<<+<<<<<39<;9<;9<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:130:865:838 83 seq2 649 99 35M = 448 -236 AATGCTAAGATAATTCATCATCACTAAACCAGTCC ;<:84<<<4<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:60:1420:660 147 seq2 649 99 35M = 808 194 AATGCTAAGATAATTCATCATCACTAAACCAGTCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:180:89:582 83 seq2 650 99 36M = 809 195 ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA <<<<<<<<<7<<<<<<<<<7<<<:<<<:<<::77:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:86:871:319 147 seq2 651 71 35M = 494 -192 TGCTAAGATAATTCATCATCACTAAACCAGTCCTA 7;+1;<:<<<<<<<<;<<;<<9<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:236:841:20 83 seq2 652 99 35M = 467 -220 GCTAAGATAATTCATCATCACTAAACCAGTCCTAT 7;<<<;<<<<;;<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:133:8:379 83 seq2 653 99 35M = 470 -218 ATAAGATAATTCATCATCACTAAACCAGTCCTATA &=========='==7==0=2====28===00==== MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_105:8:96:720:940 83 seq2 654 99 35M = 467 -222 TAAGATAATTCATCATCACTAAACCAGTCCTATAA *<<<<;<<<9<<;,<;0<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:71:994:576 83 seq2 655 99 35M = 805 185 AAGATAATTCATCATCACTAAACCAGTCCTATAAG <<<<<<<<<<<<<<<<<<<<<<<;<<5<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:164:79:134 147 seq2 656 99 35M = 488 -203 AGATAATTCATCATCACTAAACCAGTCCTATAAGA <;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:78:1029:512 83 seq2 656 99 40M = 500 -196 AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC ;;;;;<;;<<<.<<6;<<;<;8<<<<::<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:214:784:690 147 seq2 657 99 35M = 472 -220 GATAATTCATCATCACTAAACCAGTCCTATAAGAA -<7<<7<:<<2<<<<;<<<<<;<<<<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS220_1:4:6:1178:1105 83 seq2 657 93 35M = 830 208 GATAATTCATCATCACTAAACCAGTCCTATAAGAA <<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:171:196:287 83 seq2 658 99 35M = 485 -208 ATAATTCATCATCACTAAACCAGTCCTATAAGAAA <;;;98;<;&<;;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:220:801:282 83 seq2 660 99 36M = 837 213 AATTCATCATCACTAAACCAGTCCTATAAGAAATGC <<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS221_1:2:73:955:728 147 seq2 660 44 35M = 823 198 AATTCATCATCACTAAACCAGTCCTATAAGAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_105:1:3:903:957 147 seq2 661 99 35M = 516 -180 ATTCATCATCACTAAACCAGTCCTATAAGAAATGC <%12<&<<<;<:<<<<<<<<<7<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_65:2:224:579:433 83 seq2 662 99 35M = 485 -212 TTCATCATCACTAAACCAGTCCTATAAGAAATGCT '<08/8<+<</<<:<<<<<8<<9<38<<<<<<<<; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:209:824:866 147 seq2 665 73 35M = 828 198 ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:30:1882:1210 83 seq2 665 82 35M = 503 -197 ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA 776778;5;;;;8;;7:8;;;;;;;<<<;;;;;<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:181:476:394 147 seq2 666 99 35M = 847 216 TCATCACTAAACCAGTCCTATAAGAAATGCTCAAA <<<<<<<<<<<<<<<<<<<<<<<<<;<<:<<<:;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:267:953:459 147 seq2 667 99 35M = 509 -193 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA %<07<94========<<================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:140:752:822 147 seq2 667 76 35M = 495 -207 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA ;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:322:391:742 83 seq2 667 99 35M = 847 215 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:149:639:910 83 seq2 669 99 35M = 489 -215 TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA <;49;<<;;<<<<8;<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:242:419:512 83 seq2 672 94 35M = 490 -217 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT *:<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:45:183:25 83 seq2 672 95 35M = 501 -206 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT ;1<<;<<<;;;;<<<<<+<<<<<<<<<9<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:326:887:180 83 seq2 672 73 35M = 492 -215 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT 8:<<:<5<<<;7<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:145:635:390 147 seq2 673 99 35M = 860 222 TAAACCAGTCCTATAAGAAATGCTCAAAAGAATTG <<<<<<<<<<<<<<<<<<:<<<<<<<8<<<::;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:31:628:1820 147 seq2 675 98 35M = 828 188 AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:117:452:744 147 seq2 676 99 35M = 850 209 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<;<<<;<<<<<<<<<<:<<<<<<<;; MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:297:949:26 147 seq2 676 99 35M = 842 201 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:17:437:1378 147 seq2 676 99 35M = 847 206 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:222:579:961 83 seq2 679 99 35M = 504 -210 AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG =58====;==8=======;================ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:98:995:929 147 seq2 680 99 35M = 844 199 GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT <;<;<8<;<<;1;<<<<<;<;;;08;<;<1&0+8< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:76:1765:700 147 seq2 680 99 35M = 866 221 GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT ;;6;;;;;;;;;6;;;;6;;;;;;;;;;;;88878 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:68:306:409 83 seq2 682 99 40M = 856 214 CCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;:;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:115:193:231 83 seq2 684 99 35M = 522 -197 TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA =========7===========<============= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:57:1675:720 83 seq2 684 99 35M = 841 192 TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:13:682:680 147 seq2 685 99 35M = 482 -238 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<:<5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:51:1486:1131 83 seq2 685 77 35M = 500 -220 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<,<6<<<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:3 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:33:1240:846 147 seq2 685 99 35M = 509 -211 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:43:972:506 83 seq2 686 99 35M = 505 -216 TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT ;<<<<<<<+;<;<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:23:127:880 147 seq2 686 99 35M = 504 -217 TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT <<<<<<<<<%<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:101:752:996 83 seq2 687 99 35M = 508 -214 AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<<<<<<<7<7<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:3:186:68 147 seq2 687 99 35M = 512 -210 AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<;<<<<<&:,<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:273:348:37 83 seq2 688 99 36M = 483 -241 AGAAATGCGCAAAAGAATTGTAAAAGTCAAAATTAA 9;7;;0<++1<<<;<7<+;;1<<<;<17<<<<<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_78:7:164:727:977 83 seq2 689 99 35M = 513 -211 GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA ;<;<;<:<:<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:140:253:322 147 seq2 689 99 35M = 537 -187 GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA =;===;54:====================>>===> MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:146:374:692 83 seq2 690 99 35M = 874 219 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<<<<<<<<<<<<<</<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:92:875:345 83 seq2 690 99 35M = 504 -221 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<;<.;7<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:45:601:439 147 seq2 691 99 35M = 864 208 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<<<;<<<<<<<<<<<<<<<<4<<<<9<<<<<<;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:295:882:282 83 seq2 691 99 35M = 520 -206 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<:<8<-<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:78:775:555 147 seq2 691 99 35M = 539 -187 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<-<%4/<<<<<<<<<<<<<<<<<5<<<0<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:255:796:239 83 seq2 692 99 35M = 869 212 ATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGT <<<<<<<<6<<<<<<<<<<<<<<<<;6<<<:<:<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:57:826:977 83 seq2 693 99 35M = 528 -200 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT 875:6<<<<<<<<<<<<<<<;<<<<<<;8<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:187:996:432 83 seq2 693 99 36M = 860 203 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:65:463:703 147 seq2 693 99 35M = 506 -222 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT <<3<9<<<<<<<8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:288:384:444 147 seq2 696 99 35M = 855 194 TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:272:240:950 83 seq2 696 97 35M = 520 -211 TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA 37<<<<<<<<<<<<<<<<<<<<<<;;<;<<<<<<; MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:160:130:351 147 seq2 697 99 35M = 530 -202 CAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAAT 4<;;<;<<<-<<<<<<<<<<;;<<<<;<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:189:530:40 147 seq2 698 99 36M = 883 221 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATAC <<<<<<<<<<;<<<<<:<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:168:247:414 83 seq2 698 99 35M = 876 213 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA <<<<<<<<<<<<<<<<*<<<<<<<<<;:6<<<<<; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:197:759:975 83 seq2 698 99 35M = 537 -196 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:29:411:1208 83 seq2 698 99 40M = 882 224 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC <<<<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:110:543:934 83 seq2 700 99 35M = 514 -221 AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT <<<<<5<<;<<<<<<;<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:287:665:495 83 seq2 702 99 35M = 530 -207 GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA ===,9=;;====7=====5===;==1========= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:70:445:1289 147 seq2 702 99 35M = 535 -202 GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA <<<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:172:827:592 147 seq2 703 99 35M = 899 231 AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC =;=======;==;===:==========;==9<<.3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:135:401:735 147 seq2 703 99 35M = 510 -228 AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC <<::7<<<<<<::<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:39:208:644 83 seq2 704 99 35M = 859 190 ATTGTAAAAGTCAAAATTAAAGTTCAATACTCACC <;<<<<<;;:<<;;<<<<<<;;;;;;.<;<79997 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:99:1632:76 147 seq2 705 99 40M = 553 -192 TTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATA 4641::<<4<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:52:1144:509 83 seq2 706 99 35M = 867 196 TGTAAAAGTCAAAATTAAAGTTCAATACTCACCAT <<<<<<<<<<<<<<<<<<<;<<<<<<<;<;<<;<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:116:157:612 83 seq2 707 99 35M = 889 217 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:36:481:1079 147 seq2 707 99 40M = 881 214 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::8 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:74:668:424 147 seq2 707 99 40M = 545 -202 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA :::::<<96<<<<<;<<<;<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:122:398:994 147 seq2 708 99 35M = 871 198 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA <:<9<<<<<<4<<<;9<<<<<98<;<<<:;<;<;7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1231:1381 83 seq2 708 99 35M = 891 218 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:57:366:844 147 seq2 708 99 40M = 877 209 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::7: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:307:208:477 83 seq2 710 99 35M = 546 -199 AAAGTCAAAATTAAAGTTCAATACTCACCATCATA <<<<<.<<<<<<<<<<<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:285:417:147 147 seq2 712 99 35M = 529 -218 AGTCAAAATTAAAGTTCAATACTCACCATCATAAA <..)<<<<;<<<<7<;-<<;<<<<<;8<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:325:544:349 83 seq2 716 99 35M = 515 -236 AAAATTAAAGTTCAATACTCACCATCATAAATACA <<<<57<<<7<;6<<<<;<7<7;<<7<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:33:357:858 147 seq2 716 99 35M = 870 189 AAAATTAAAGTTCAATACTCACCATCATAAATACA <<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:78:806:800 83 seq2 717 99 40M = 564 -193 AAATTAAAGTTCAATACTCACCATCATAAATACACACAAA ::;9:<<<;<<:<<<<:<.<1:<<1<<<<<<;<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:41:314:1173 147 seq2 718 99 35M = 554 -199 AATTAAAGTTCAATACTCACCATCATAAATACACA <<2**<<82/<<<<<<<<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:82:963:128 147 seq2 719 99 35M = 905 221 ATTAAAGTTCAATACTCACCATCATAAATACACAC <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:240:719:799 83 seq2 720 99 35M = 900 215 TTAAAGTTCAATACTCACCATCATAAATACACACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:93:634:323 147 seq2 721 99 35M = 550 -206 TAAAGTTCAATACTCACCATCATAAATACACACAA <<<<;<;<<<<;;<<2<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:12:1335:1372 147 seq2 721 99 40M = 906 225 TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTA <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<99::.: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:116:738:142 147 seq2 722 99 35M = 568 -189 AAAGTTCAATACTCACCATCATAAATACACACAAA <:<7;+:<<:<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:49:330:699 83 seq2 722 99 35M = 540 -217 AAAGTTCAATACTCACCATCATAAATACACACAAA ===/=;========;=;================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:273:562:954 147 seq2 722 99 35M = 539 -218 AAAGTTCAATACTCACCATCATAAATACACACAAA ;<<+;95<<<;5;<<;:<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:77:1529:522 147 seq2 722 99 35M = 562 -195 AAAGTTCAATACTCACCATCATAAATACACACAAA <<<;7;,<<<<<<.<,6<<6<<<<<<<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1467:1447 147 seq2 722 99 35M = 898 211 AAAGTTCAATACTCACCATCATAAATACACACAAA <<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:251:819:772 83 seq2 726 99 36M = 881 191 TTCAATACTCACCATCATAAATACACACAAAAGTAC <3<<<9<9<3<</<<<<<<59<3<9<<</9/++*/' MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:144:492:61 147 seq2 728 99 35M = 564 -199 AAATACTCACCATCATAAATACACACAAAAGTACA +;;3;,:7<:;<<7<<<<<<<;;<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS54_73:7:200:65:291 83 seq2 728 99 35M = 930 237 CAATACTCACCATCATAAATACACACAAAAGTACA <<<<1<<<<<<<<<<<<<<<<<<<:<8<<<<:<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:130:609:467 83 seq2 728 99 35M = 877 184 CAATACTCACCATCATAAATACACACAAAAGTACA ==8=====;==8==;=4=;;8=====;6=177.== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:216:47:302 147 seq2 729 99 35M = 557 -207 AATACTCACCATCATAAATACACACAAAAGTACAA <<;<8<:<6<<<;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:4:234:610 83 seq2 729 84 35M = 560 -204 AAAAATCAACATCACAAATACACACAAAAGTACAA <:+:'+&<+'<+'2&<:<7<2<':2<:<<7<7<<< MF:i:18 Aq:i:22 NM:i:4 UQ:i:31 H0:i:0 H1:i:0
+EAS54_81:8:271:180:509 83 seq2 729 99 35M = 896 202 AATACTCACCATCATAAATACACACAAAAGTACAA =============================='==== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:41:530:663 147 seq2 730 99 35M = 908 213 ATACTCACCATCATAAATACACACAAAATTACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:22 H0:i:1 H1:i:0
+EAS114_39:4:30:570:902 83 seq2 730 99 35M = 561 -204 ATACTCACCATCATAAATACGCACAAAAGTACAAA <:<6:6<&:<<6<<<<<<<<.<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS1_105:1:87:430:995 83 seq2 731 67 35M = 909 213 TACTCACCATCATAAATACACACAAAATTACAAAA <<;<<7;;;<;<<777;7(77;;1;7;%117;,7( MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS114_28:7:215:863:521 147 seq2 732 99 36M = 890 194 ACTCACCATCATAAATACACACAAAAGTACAAAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:267:394:437 83 seq2 735 99 35M = 544 -226 AAACATCATAAATACACACAAAAGTACAAAACTCA &<&,<8.<;<<<;<8<8<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS1_108:6:94:294:387 83 seq2 736 99 35M = 578 -193 ACCATCATAAATACACACAAAAGTACAAAACTCAC 779=53=9===;=:=;=========;========= MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:38:332:54 147 seq2 737 99 36M = 904 203 CCATCATAAATACACACAAAAGTACAAAACTCACAG <;<<<<<<<<<<<<<<<<<<<<<<<<<<<0;;;<;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:8:165:441:708 83 seq2 737 99 35M = 550 -222 CCATCATAAATACACACAAAAGTACAAAACTCACA 6+<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:246:177:525 147 seq2 738 98 35M = 549 -224 CATCATAAATACACACAAAAGTAAAAAACTCACAG %<(4<2<<<<<:<;<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:5:43:114:617 83 seq2 738 99 35M = 579 -194 AATCATAAATACACACAAAAGTACAAAACTCACAG +=22=6=================9=========== MF:i:18 Aq:i:52 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS1_99:8:152:778:228 147 seq2 739 99 35M = 915 211 ATCATAAATACACACAAAAGTACAAAACTCACAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:24:319:429 83 seq2 740 99 35M = 582 -193 TAATAAATACACACAAAAGTACAAAACTCACAGGT 0%=3%=3====<=9=====89==93==9=6===== MF:i:18 Aq:i:56 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_66:5:210:674:911 83 seq2 740 99 35M = 904 199 TCATAAATACACACAAAAGTACAAAACTCACAGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:88:451:1773 83 seq2 742 99 35M = 902 195 ATAAATACACACAAAAGTACAAAACTCACAGGTTT ;;:::<:;:<<;:6::;:;;:::;;<;;;367177 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:2:168:1878 147 seq2 743 37 35M = 560 -218 TAAATACACACAAAAGTAGAAAACGCACCAGTTTT *3/6)9.;;;;;;;;5;;);;;3;(;;;+(;7.)3 MF:i:-126 Aq:i:37 NM:i:4 UQ:i:32 H0:i:0 H1:i:0
+EAS188_7:5:115:249:673 83 seq2 743 99 35M = 552 -226 TAAATACACACAAAAGTACAAAACTCACAGGTTTT :<<<;<<<;<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:178:187:610 83 seq2 744 99 35M = 903 194 AAATACACACAAAAGTACAAAACTCACAGGTTTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:9:49:661 83 seq2 747 99 35M = 591 -191 TACACACAAAAGTACAAAACTCACAGGTTTTATAA <<6<5<<<<<<<<<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:157:361:309 147 seq2 747 99 35M = 589 -193 TACACACAAAAGTACAAAACTCACAGGTTTTATAA :<-<5<0<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:103:443:166 83 seq2 747 99 35M = 565 -217 TACACACAAAAGTACAAAACTCACAGGTTTTATAA 7<4<4<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:8:49:182:192 147 seq2 750 99 35M = 582 -203 ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC <5<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:12:630:707 83 seq2 751 99 35M = 915 199 CACAAAAGTACAAAACTCACAGGTTTTATAAAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:94:1440:2016 83 seq2 751 99 35M = 564 -222 CACAAAAGTACAAAACTCACAGGTTTTATAAAACA :<8<<<<9<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:206:741:810 147 seq2 753 99 35M = 929 210 CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:-;<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:250:698:842 83 seq2 753 99 34M = 554 -233 AAAAAGTACAAAACTCACAGGTTTTATAAAACAA )<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS54_81:6:265:251:147 83 seq2 754 99 35M = 581 -208 AAAAGTACAAAACTCACAGGTTTTATAAAACAATT <<<<::<8<<<;<;8<8<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:71:644:1792 83 seq2 754 84 35M = 589 -200 AAAAGTACAAAACTCACAGGTTTTATAAAACAATT <<<<;<<<<<<:;/<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:108:958:42 83 seq2 755 81 35M = 584 -206 AAAGTACAAAACTCACAGGTTTTATAAAACAATTA <<<;;</<<<<;<<<<<<<<<<<<<<<<<<<<<<+ MF:i:18 Aq:i:9 NM:i:1 UQ:i:27 H0:i:0 H1:i:3
+B7_597:8:48:805:860 147 seq2 755 78 35M = 563 -227 AAAGTACAAAACTCACAGGTTTTATAAAACAATTA <<<;3<;7<<97<7<<<<7<4<<<<<<<<<<;8<+ MF:i:18 Aq:i:13 NM:i:1 UQ:i:27 H0:i:0 H1:i:3
+B7_591:3:179:496:161 147 seq2 756 99 36M = 919 199 AAGTACAAAACTCACAGGTTTTATAAAACAATTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+ MF:i:18 Aq:i:49 NM:i:2 UQ:i:53 H0:i:1 H1:i:0
+EAS56_59:3:166:626:836 83 seq2 757 99 35M = 567 -225 AGTACAAAACTCACAGGTTTTATAAAACAATTAAT <;;7<<<<<<;<7;<<<<<<<<<<<<7<<<<<<<+ MF:i:18 Aq:i:28 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS114_28:5:23:944:377 147 seq2 757 75 36M = 579 -214 AGTACAAAACTCACAGGTTTTATAAAACAATTAATT <;7;8<<<<:<;<:<<<<<<<<<<<<<;<<<<<<<; MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_45:1:100:979:1863 147 seq2 757 85 35M = 583 -209 ATTACAAAACTCACAGGTTTTATAAAACAATTAAT 6&,*3;6;66;9(572692;;;79;4)9;96;59+ MF:i:18 Aq:i:23 NM:i:3 UQ:i:51 H0:i:0 H1:i:0
+EAS219_1:3:90:219:528 83 seq2 758 75 35M = 576 -217 GTACAAAACTCACAGGTTTTATAAAACAATTAATT ;:<5<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:5:89:942:84 83 seq2 759 74 35M = 562 -232 TACAAAACTCACAGGTTTTATAAAACAATTAATTG ===================>=>>>==>>===>==> MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:6:159:493:275 83 seq2 760 72 35M = 939 214 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA =====3============================= MF:i:-126 Aq:i:72 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_11:1:81:1019:558 147 seq2 760 77 35M = 926 201 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA <<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7< MF:i:-126 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_62:7:162:195:761 147 seq2 767 30 18M4I13M = 922 190 TCACAGGTTTTATAAAACAATTAATTGAGACTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;; MF:i:-126 Aq:i:30 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_597:3:115:646:430 147 seq2 768 45 17M4I14M = 582 -217 CACAGGTTTTATAAAACAATTAATTGAGACTACAG 5;5<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:45 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:6:243:209:110 147 seq2 768 48 17M4I14M = 920 187 CACAGGTTTTATAAAACAATTAATTGAGACTACAG <<<<<;<;<<<;<<<<<<<<<<<;<:;<<:;;+85 MF:i:-126 Aq:i:48 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:2:266:994:429 147 seq2 769 76 16M4I15M = 612 -188 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA </<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:5:32:461:154 83 seq2 769 71 16M4I15M = 945 211 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<+<;; MF:i:-126 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:6:7:492:1088 83 seq2 769 57 16M4I15M = 926 192 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<<<<<<<<<<7<:<<<<<<6; MF:i:-126 Aq:i:57 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_95:6:174:650:125 147 seq2 770 76 15M4I16M = 600 -201 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG ===;=============================== MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_59:6:89:457:591 147 seq2 770 69 15M4I16M = 585 -216 CAGGTTTTATAAAACAATTAATTGAGACTACATAG 797<<9<<<<<<<3<7<<<<<<<<<<)<<<<<07< MF:i:-126 Aq:i:69 NM:i:1 UQ:i:15 H0:i:0 H1:i:0
+EAS114_39:2:38:670:564 83 seq2 770 73 15M4I16M = 930 195 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG <<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;<5<; MF:i:-126 Aq:i:73 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS188_7:4:92:693:228 147 seq2 770 75 14M4I17M = 601 -200 AAGGTTTTATAAAAAAATTAATTGAGACTACAGAG 6=77=<<=======&==================== MF:i:-126 Aq:i:75 NM:i:1 UQ:i:28 H0:i:0 H1:i:0
+EAS218_1:4:61:1369:440 147 seq2 770 47 15M4I16M = 964 229 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<8 MF:i:-126 Aq:i:47 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_26:4:123:1001:580 83 seq2 771 43 14M4I17M = 617 -185 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC <.00..3<6<<<<<<<3;<<08<<<<<6<<<<<<< MF:i:-126 Aq:i:43 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:4:10:1312:1558 147 seq2 771 76 14M4I17M = 928 192 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC 5<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<;8;< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS220_1:8:45:178:1321 83 seq2 771 77 14M4I17M = 606 -196 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC <<<<<<<<<<<<<<<<<:<<:<<<<<<<<<<<<<< MF:i:-126 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_59:5:125:137:58 147 seq2 772 76 13M4I18M = 932 195 GGTTTTATAAAACAATTAATTGAGACTACAGAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS192_3:3:285:349:797 83 seq2 773 76 12M4I19M = 604 -200 GTTTTAAAAAACCAATAATTGAGACTACAGAGCAA ;;<<<7.:<<<..<.<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:1 UQ:i:13 H0:i:0 H1:i:0
+EAS114_45:5:56:1757:1319 147 seq2 775 67 10M4I21M = 957 217 TTTATAAAACAATTAATTGAGACTACAGAGCAACT ;;;;9;;;;;;;;;;;;;4;9;98;;;;;9388&7 MF:i:-126 Aq:i:67 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_591:3:291:404:199 83 seq2 777 76 8M4I24M = 612 -197 TATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS54_65:7:159:253:353 83 seq2 778 67 7M4I24M = 613 -196 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <8<<<<:<<;;<<<<<<<<<<<;<<<<<<<<<<<< MF:i:-126 Aq:i:67 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_57:1:122:38:103 147 seq2 778 79 7M4I24M = 972 229 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<<<<<<<<<<;<<<<<<<<3<<<<9<8;< MF:i:-126 Aq:i:79 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS188_4:5:103:870:105 147 seq2 778 44 7M4I24M = 595 -214 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<<<<<<<=<:<;<<<<<<<<<<*<<<<<< MF:i:-126 Aq:i:44 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_105:8:24:718:322 147 seq2 779 23 35M = 953 209 ACAATTAATTGAGACTACAGACCAATTATGTAAAA 5/7<3+<;<1<<1<95<.&&.&&.<&)5)1)17<% MF:i:-126 Aq:i:23 NM:i:3 UQ:i:18 H0:i:0 H1:i:0
+EAS51_64:6:118:41:489 83 seq2 779 76 35M = 588 -226 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <+<<;<<<38<<<<5<<3<<<<3<<8<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_61:3:165:665:220 83 seq2 779 76 35M = 618 -196 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:6:238:803:383 83 seq2 779 75 35M = 954 210 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <<<<<<<<<<<<;<<<<<;<;<<;<<;<<<9<;<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_105:3:232:364:583 83 seq2 780 71 35M = 956 211 CAATTAATTGAGACTACAGAGCAACTAGGTAAAAA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:-126 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:2:2:1217:398 83 seq2 780 99 40M = 608 -212 CAATTAATTGAGACTACAGAGCAACTAGGTAAAAAATTAA +;;:9<<66<<<;+<<7<<<<;<<+;<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:3 UQ:i:73 H0:i:1 H1:i:0
+B7_593:2:81:435:410 83 seq2 782 99 36M = 966 220 ATTAATTGAGACTACAGAGCAACTAGGTAAAAAATT <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<;<<;; MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+B7_593:3:115:649:259 147 seq2 782 99 36M = 617 -201 ATTAATTGAGAATACAGAGCAACTAGGTAAAAAATT ;<;<<;<<<<;&<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:3 UQ:i:58 H0:i:0 H1:i:1
+EAS1_93:3:181:93:694 147 seq2 783 99 35M = 954 206 TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT ++<<<<<<;<<<<<<:;8<<;<<<5;<;<<<+<<< MF:i:18 Aq:i:28 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS114_30:1:188:863:790 147 seq2 783 98 35M = 969 221 TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT ++<;<<;;;:<<<<:<:<<:1<<1<<<6:6;4;;4 MF:i:18 Aq:i:27 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS1_93:2:313:711:530 147 seq2 784 99 35M = 968 219 TAATTGAGACTACAGAGCAACTAGGTAAAAAATTA +<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<: MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_589:7:154:26:712 83 seq2 786 99 35M = 959 208 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:185:87:475 147 seq2 786 99 36M = 949 199 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:69:1593:819 147 seq2 786 99 40M = 977 231 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTAC <<<<<<<<<<<<<<;<<<<<;;<:<<<<<:<<<<<:777: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:309:187:267 83 seq2 786 99 35M = 616 -205 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <:0;<;<4<<7<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:82:1540:77 83 seq2 786 99 35M = 619 -202 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <48;<;</;<<<<<<:<<0<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:193:420:78 147 seq2 787 99 35M = 607 -215 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA 81<<;<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:261:267:597 83 seq2 787 86 35M = 617 -205 TTGAGAATAAAGAGCAACTAGGTAAAAAATTAACA *-1<9<+1<+<<<<:<<;9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:2 UQ:i:20 H0:i:0 H1:i:1
+EAS56_59:4:262:928:237 83 seq2 787 99 35M = 971 219 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:262:53:888 147 seq2 787 99 35M = 965 213 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<;<<<<<<<<<<;<<;<;<;6<<;<;;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:138:211:582 83 seq2 788 99 35M = 957 204 TGAGACTACAGAGCAAATAGGTAAAAAATTAACAT <<;<<<<<<<<<<<<<&;<;<7<<;<<<<<<<5<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:7:113:408:211 83 seq2 789 99 35M = 952 198 GAGACTACAGAGCAACTAGGTAAAAAATTAACATT <<<<<<<<<<<<<<<:&<<<&:<<<<<<<<<<;:/ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:79:879:15 147 seq2 790 99 35M = 626 -199 AGACTACAGAGCAACTAGGTAAAAAATTAACATTA <;;5;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:325:795:213 83 seq2 790 99 35M = 618 -207 AGACTACAGAGCAACTAGGTAAAAAATTAACATTA <<<0<<;<<<<;<<;:<<<<<<<<<<<;<<<<<9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:22:206:150 83 seq2 792 99 35M = 619 -208 AAAAAAGAGCAACTAGGTAAAAAATTAACATTACA 8&)<)<<<<+<<+<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:3 UQ:i:21 H0:i:1 H1:i:0
+EAS56_59:5:181:713:140 147 seq2 793 84 35M = 615 -213 CTACAGAGCAACAAGGTAAAAAATTAACATTACAA 78<+<7<-7;;;&<5<7<<<<7<<<<<<<<<<<7< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:7:76:306:561 147 seq2 794 89 35M = 987 228 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC <<)<<<<<<8<<8<<<<<<<;;;<<1<<3;=7<<9 MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:325:352:67 83 seq2 794 99 35M = 622 -207 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC ;<8<<<;;<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:310:287:420 83 seq2 794 99 35M = 965 206 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:74:329:459 83 seq2 795 99 35M = 623 -207 ACAGAGCAACTAGGTAAAAAATTAACATTACAACA </<;<8/<<9<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:57:1342:1166 83 seq2 796 99 35M = 964 203 CAGAGCAACTAGGTAAAAAATTAACATTACAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:542:428 147 seq2 797 99 35M = 965 203 AGAGCAACTAGGTAAAAAATTAACATTACAACAGG 7<4<<<6<<,<9)<<<<6<,<<7<<7<<<<<<<<1 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:97:892:419 83 seq2 800 99 35M = 621 -214 GCAACTAGGTAAAAAATTAACATTACAACAGGAAC ;8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:82:1051:921 83 seq2 800 99 40M = 616 -224 GCAAATAGGTAAAAAATTAACATTACAACAGGAACAAAAC 3-::-7<;+:9<;<<<5<;9,::53-;:3<<<<9<<3<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS1_95:5:263:511:936 147 seq2 801 99 35M = 629 -207 CAAATAGGTAAAAAATTAACATTACAACAGGAACA +<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS114_26:7:157:876:302 147 seq2 801 99 35M = 964 198 CAACTAGGTAAAAAATTAACATTACAACACGAACA 2<<;<<<22<<<<<<77<<<<22<7<<<<%-<<1< MF:i:18 Aq:i:66 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_65:2:127:288:655 147 seq2 803 99 35M = 999 231 ACTAGGTAAAAAATTAACATTACAACAGGAACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:83:731:540 147 seq2 804 99 35M = 623 -216 CTAGGTAAAAAATTAACATTACAACAGGAACAAAA ;7<:+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:82:843:1838 83 seq2 804 99 35M = 999 230 CTAGGTAAAAAATTAACATTACAACAGGAACAAAA ;<<;:;;<<<;;<<<<;;<<;;;;;<;;;;68887 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:71:994:576 147 seq2 805 99 35M = 655 -185 TAGGTAAAAAATTAACATTACAACAGGAACAAAAC <<9;;<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:24:415:944 83 seq2 805 99 35M = 974 204 TAGGTAAAAAATTAACATTACAACAGGAACAAAAC <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:73:1458:1337 83 seq2 806 99 35M = 609 -232 AGGTAAAAAATTAACATTACAACAGGAACAAAACC <</<<<<<<<6:<::<<<1<<:<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:142:353:398 147 seq2 807 99 35M = 977 205 GGTAAAAAATTAACATTACAACAGGAACAAAACCT =================================9= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:46:522:426 147 seq2 807 99 35M = 964 192 GGTAAAAAATTAACATTACAACAGGAACAAAACCT =======================:==;<===78== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:59:871:351 147 seq2 808 99 35M = 963 190 GTAAAAAATTAACATTACAACAGGAACAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:235:505:553 147 seq2 808 99 35M = 987 214 GTAAAAAATTAACATTACAACAGGAACAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:60:1420:660 83 seq2 808 99 35M = 649 -194 GTAAAAAATTAACATTACAACAGGAACAAAACCTC 99<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:180:89:582 147 seq2 809 99 36M = 650 -195 TAAAAAATTAACATTACAACAGGAACAAAACCTCAT ;<<<<<<4<<<:<<<<<<<<<6<<<<<<<<<<;<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:323:196:855 83 seq2 809 99 35M = 642 -202 TAAAAAATTAACATTACAACAGGAACAAAACCTCA &<<<<<<09<<7<7;<;<<0<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:295:547:216 147 seq2 809 99 35M = 970 196 TAAAAAATTAACATTACAACAGGAACAAAACCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:126:361:250 83 seq2 810 99 35M = 1002 227 AAAAAATTAACATTACAACAGGAACAAAACCTCAT <<<<<<;9<<<<<<<<<<<<<<;;;<<<;<664;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:266:133:789 83 seq2 810 99 35M = 988 213 AAAAAATTAACATTACAACAGGAACAAAACCTCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:175:149:296 83 seq2 811 99 35M = 614 -232 AAAAATTAACATTACAACAGGAACAAAACCTCATA =;==26==;==;================7====== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:136:260:254 83 seq2 813 99 35M = 988 210 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:85:1521:58 147 seq2 813 99 40M = 639 -214 AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT :::86<<:<<8<<<<;<<8<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:164:719:947 83 seq2 813 99 35M = 1005 227 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:50:257:341 147 seq2 813 99 35M = 971 193 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<6<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:117:33:262 83 seq2 814 99 35M = 642 -207 AATTAACATTACAACAGGAACAAAACCTCATATAT <<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:90:706:1276 147 seq2 814 99 35M = 980 201 AATTAACATTACAACAGGAACAAAACCTCATATAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:116:966:193 147 seq2 815 99 35M = 967 187 ATTAACATTACAACAGGAACAAAACCTCATATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:59:742:549 147 seq2 816 99 35M = 642 -209 TTAACATTACAACAGGAACAAAACCTCATATATCA -<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:74:213:877 83 seq2 816 99 35M = 996 215 TTAACATTACAACAGGAACAAAACCTCATATATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_610:3:85:219:371 147 seq2 817 99 35M = 967 185 TAACATTACAACAGGAACAAAACCTCATATATCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:176:653:957 147 seq2 819 82 35M = 982 198 ACATTACAACAGGAACAAAACCTCATATATCAATA ????????????<<???@<<<<<@<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:64:526:339 147 seq2 819 96 35M = 1019 235 ACATTACAACAGGAACAAAACCTCATATATCAATA <<<<<<<<;<<<<<<<<<<7<:<<<<<<<<<8:<: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:97:743:602 83 seq2 821 99 34M = 644 -211 ATTACAACAGGAACAAAACCTCATATATCAATAT <(&<:<<&<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+B7_610:2:75:887:149 147 seq2 823 99 35M = 1004 216 TACAACAGGAACAAAACCTCATATATCAATATTAA <<<<<<<<<<<<<<;<<<<<<<;<<<<<<<;<;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS221_1:2:73:955:728 83 seq2 823 44 35M = 660 -198 TACAACAGGAACAAAACCTCATATATCAATATTAA ;<-<<6<;<<<6<<<<;7<6<<<<<<<<<<<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:3 H1:i:18
+EAS1_108:2:102:543:160 147 seq2 825 99 35M = 977 187 CAACAGGAACAAAACCTCATATATCAATATTAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_28:2:55:562:403 83 seq2 825 99 36M = 643 -218 CAACAGGAACAAAACCTCATATATCAATATTAACTT +<<&<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+B7_593:1:19:695:59 83 seq2 826 99 36M = 988 198 AACAGGAACAAAACCTCATATATCAATATTAACTTT <<<<<<<<<<<;<<<<<<<<<;<<;;<;<<7<<<<; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS221_1:2:8:327:522 147 seq2 826 99 35M = 1001 210 AACAGGAACAAAACCTCATATATCAATATTAACTT <<<<<<<<<<:<<<<<<<<<<:<<<<<<<<<:<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS114_45:6:90:561:850 147 seq2 827 85 35M = 1004 212 ACAGGAACAAAACCTCATATATCAATATTAACTTT ;;;;;;;;;;;;;;;;;;;;;;;;9;9;6;77777 MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:2 H1:i:25
+EAS56_61:5:209:824:866 83 seq2 828 73 35M = 665 -198 CAGCAACAAAACCTCATATATCAATATTAACTTTG ;<:&<<:<<<<;<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:1 UQ:i:5 H0:i:1 H1:i:7
+EAS139_11:2:31:628:1820 83 seq2 828 98 35M = 675 -188 CAGGAACAAAACCTCATATATCAATATTAACTTTG <<<<<<:<<<<:6<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS220_1:4:6:1178:1105 147 seq2 830 93 35M = 657 -208 GGAACAAAACCTCATATATCAATATTAACTTTGAA <:<<9<<<<::7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:11
+EAS114_28:4:305:707:258 83 seq2 831 58 36M = 992 197 GAACAAAACCTCATATATCAATATTAACTTTGAATA 9<<<<<<<<<<<<;<<-<<;;<;<<9<<;<<+99;7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:2 H1:i:9
+EAS54_67:3:114:736:433 147 seq2 832 63 35M = 998 201 AACAAAACCTCATATATCAATATTAACTTTGAATA ;<<9<8;<<<<8<8<;<<;;;0<<8;<;<<47;;; MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_591:7:157:447:758 83 seq2 833 99 36M = 994 197 ACAAAACCTCATATATCAATATTAACTTTGAATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_591:4:159:508:571 83 seq2 834 84 36M = 989 191 CAAAACCTCATATATCAATATTAACTTTGAATAAAA <<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_65:7:68:825:405 147 seq2 835 30 35M = 1015 215 AAAACCTCATATATCAATATTAACTTTGAATAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+B7_593:3:102:856:670 83 seq2 836 99 36M = 1025 225 AAACCTCATATATCAATATTAACTTTGAATAAAAAG <<<<<<<;<<<;<<;:<<<<<<<<<<:;;<<;<<<7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:260:827:289 147 seq2 836 99 35M = 999 198 AAACCTCATATATCAATATTAACTTTGAATAAAAA <<<<2<<<<;<<<<;<<<<<<:<<<&-<8<<88<3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_28:1:220:801:282 147 seq2 837 99 36M = 660 -213 AACCTCATATATCAATATTAACTTTGAATAAAAAGG ;7;87;===;==;====:===<==7=========== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:57:1675:720 147 seq2 841 99 35M = 684 -192 TCATATATCAATATTAACTTTGAATAAAAAGGGAT <,<<<<<<:<<<<<<<<:9<<<<<<<<;<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:297:949:26 83 seq2 842 99 35M = 676 -201 CATATATCAATATTAACTTTGAATAAAAAGGGATT 5<;<;<;:<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:76:34:691 89 seq2 843 58 35M * 0 0 ATATATCAATATTAACTTTGAATAAAAAGGGATTA <<<<<<16<<<<<916<<<499<966161919<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:98:995:929 83 seq2 844 99 35M = 680 -199 TATAACAATATTAACTTTGAATAAAAAGGGATTAA &<+<'7<<+<&<<<7+4<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:63 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS139_19:3:58:923:1915 147 seq2 846 99 40M = 1007 201 TATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCC <<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<::::: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:181:476:394 83 seq2 847 99 35M = 666 -216 AACAATATTAACTTTGAATAAAAAGGGATTAAATT <+;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS112_32:7:322:391:742 147 seq2 847 99 35M = 667 -215 ATCAATATTAACTTTGAATAAAAAGGGATTAAATT <63<<<<9<<<:<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:17:437:1378 83 seq2 847 99 35M = 676 -206 ATCAATATTAACTTTGAATAAAAAGGGATTAAATT <<7<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:155:375:623 147 seq2 849 99 35M = 1029 215 CAATATTAACTTTGAATAAAAAGGGATTAAATTCC 0<<<<<;<<<<<<<<<<<<<4<<8<<<<<<<<;<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:29:729:70 147 seq2 850 51 35M = 1009 194 ANTATTANCTTTGANNAAAAAGGGATTAAATTCCC :!<:<<8!::::5:!!:.77::33888633:8777 MF:i:-126 Aq:i:51 NM:i:3 UQ:i:0 H0:i:0 H1:i:0
+EAS54_65:7:117:452:744 83 seq2 850 99 35M = 676 -209 AATATTAACTTTGAATAAAAAGGGATTAAATTCCC <;;<;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:288:384:444 83 seq2 855 99 35M = 696 -194 TAACTTTGAATAAAAAGGGATTAAATTCCCCCACT ;=9;;<====<=;=/=9;<========<======= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:133:514:754 147 seq2 855 63 36M = 1036 217 TAAATTTGAATAAAAAGGGATTAAATTCCCCCACTT ***&,,,+(*,*********+*)*(***(**((*)( MF:i:18 Aq:i:19 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_19:5:68:306:409 147 seq2 856 99 40M = 682 -214 AACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG ::2:7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:155:758:710 147 seq2 859 98 35M = 1048 224 TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG =======8================6=:7===:=:= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:39:208:644 147 seq2 859 99 35M = 704 -190 TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG 78899;;;;4;;;;;;;;;;;;;;;;;;8;;8;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:16:438:245 89 seq2 860 65 35M * 0 0 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA 8*8<5'<77;;;;;7<7<<7-<;<<<;;<<<;;79 MF:i:32 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:145:635:390 83 seq2 860 99 35M = 673 -222 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA +9;<<;<<<<<;;;<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:187:996:432 147 seq2 860 99 36M = 693 -203 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG ;<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:123:924:645 147 seq2 861 84 36M = 1045 220 TGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA <<<<<<<<<<<<;<<<<<<;<<<<<<<6:<7<1<+< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:146:961:63 147 seq2 861 86 35M = 1041 215 TGAATAAAAAGGGCTTAAATTCCCCCACTTAAGGG <<+<<<<::+1<;&<<88<<<<;;.<0;;85(;(8 MF:i:18 Aq:i:37 NM:i:2 UQ:i:12 H0:i:0 H1:i:1
+EAS114_30:6:4:665:771 69 seq2 862 0 * = 862 0 GTGCTTTATCTGATATCAATGCCGATAAACTGCCT <<<<<<<<<<<<%<8<3:7:77<(7,:3(:&2:(0 MF:i:-64
+EAS114_30:6:4:665:771 137 seq2 862 71 35M = 862 0 GAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA <;<<;<18<;<8<<<<;<;;<<<<1<<<<6;;;;; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:45:601:439 83 seq2 864 99 35M = 691 -208 ATAAAAAGGGATTAAATTCCCCCACTTAAGAGATA <8<<<<<<1<<<<<<<<)<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:126:966:514 147 seq2 865 99 35M = 1027 197 TAAAAAGGGATTAAATTCCCCCACTTAAGAGATAT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:76:1765:700 83 seq2 866 99 35M = 680 -221 AAAAAGGGATTAAATTCCCCCACTTAAGAGATATA 77777;;;;7;7;<;;;;+;;<9<<<79;<1<<77 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:155:807:19 83 seq2 867 99 35M = 1074 242 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<<<<<<<<<<<<<<9+<<<<<<9<<9;4<<<<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:226:885:729 83 seq2 867 98 35M = 1037 205 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<;<<<<<<;<;<<<<<<<:;<<;4;%;<<;<<. MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:1:156:196 83 seq2 867 77 40M = 1042 215 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGG <<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<:;9:9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:52:1144:509 147 seq2 867 99 35M = 706 -196 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<<:<<<<<<<<<<;::;:<;<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:73:735:329 83 seq2 868 99 35M = 1035 202 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA ================;==;====;=;=======; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:11:801:386 147 seq2 868 97 35M = 1061 228 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA <<<<<<<<<<8<<<<<:4<::<854:5<:::;4+4 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:150:94:843 83 seq2 868 75 35M = 1050 217 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA <<<<<<<<7<<<6<<<<<<<<<<<6<<62<<<<<2 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:255:796:239 147 seq2 869 99 35M = 692 -212 AAGGGATTAAATTCCCCCACTTAAGAGATAGAGAT <<3;;<7:<<<;(7<<7;<<;<<<<<<<<<7<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:22 H0:i:0 H1:i:1
+B7_589:5:147:405:738 147 seq2 870 99 35M = 1048 213 AGGGATTAAATTCCCCCACTTAAGAGATATAGATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:33:357:858 83 seq2 870 99 35M = 716 -189 AGGGATTAAATTCCCCCACTTAAGAGATATAGATT <;<:<<<<<<<<<;<9<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:122:398:994 83 seq2 871 99 35M = 708 -198 GGGATTAAATTCCCCCACTTAAGAGATATAGATTG 95:<9<<<<:9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_105:2:146:374:692 147 seq2 874 99 35M = 690 -219 ATTAAATTCCCCCACTTAAGAGATATAGATTGGCA <4:<<<1:<:<::<<<;<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:119:428:415 147 seq2 876 99 36M = 1037 197 TAAATTCCCCCACTTAAGAGATATAGATTGGCAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;<;;; MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:168:247:414 147 seq2 876 99 35M = 698 -213 TAAATTCCCCCACTTAAGAGATATAGATTGGCAGA ,;;;,146<6;6<<8<<<<1<8<<<<<<<<<<;1< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:130:609:467 147 seq2 877 99 35M = 728 -184 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAA ===:2===;<====>==>=>=>=>>>==>>>=>>> MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:57:366:844 83 seq2 877 99 40M = 708 -209 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT ;;;7:8&555<,;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:236:475:254 147 seq2 880 99 35M = 1051 206 TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG <<<<<<<<<<<<<<<<<<<<<<<<<:::<:;</;/ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:251:819:772 147 seq2 881 99 36M = 726 -191 TCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT 6+7++1<<%<<<<<<<+<+<9<<99<9<<<<<<9<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:36:481:1079 83 seq2 881 99 40M = 707 -214 TCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAA :11+)*<4;<<<<<<<<<;;<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:29:411:1208 147 seq2 882 99 40M = 698 -224 CCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAA 766+6<996<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:62:1076:540 83 seq2 882 99 35M = 1066 219 CCCCCACTTAAGAGATATAGATTGGCAGAACAGAT <<<<<<<<<<;<<<<<<<<<<<<<<<<;;<<;<7; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:189:530:40 83 seq2 883 99 36M = 698 -221 CCCCACTTAAGAGATATAGATTGGCAGAACAGATTT 883;<<<<<<<<<:<<<<<<<<3<;<<<<<<<<;<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:113:856:319 147 seq2 884 99 35M = 1067 216 CCCACTTAAGAGATATAGATTGGCAGAACAGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:55:296:1457 83 seq2 884 99 35M = 1061 212 CCCACTTAAGAGATATAGATTGGCAGAACAGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:15:881:1932 83 seq2 886 92 35M = 1061 210 CACTTAAGAGATATAGATTGGCAGAACAGATTTAA <<<<<<<<<<<<<<<;<<<<:<<<2<26<8<<;;. MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:116:157:612 147 seq2 889 99 35M = 707 -217 TTAAGAGATATAGATTGGCAGTACAGATTTAAAAA ;;<<<<<<<<<<<<<<<<;<</<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS114_28:7:215:863:521 83 seq2 890 99 36M = 732 -194 TAAGAGATATAGATTGGCAGAACAGATTTAAAAACA ;<<<<<<<<<<<<<;<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:254:572:431 147 seq2 891 97 35M = 1048 192 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<<<<<<<<<<<;<<<<<<<<<<<99;;;;; MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:273:424:207 147 seq2 891 99 35M = 1066 210 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <,<,<9<<9<<<<<<<<<<79<,599,<191<99+ MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:4:571:820 147 seq2 891 99 35M = 1071 215 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<<<<<<9<<;9<;;;<;6;:<<<3:;;;:6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1231:1381 147 seq2 891 99 35M = 708 -218 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<;<<<<<<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:66:718:481 83 seq2 891 99 40M = 1072 221 AAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAAC <<<<<<<<<<<<<<;<<<<<<<<;<<<<<<<;<<<:1:;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:22:632:176 147 seq2 894 99 36M = 1091 233 AGATATAGATTGGCAGAACAGATTTAAAAACATGAA <<<<<;<<<<<<;<<;<:<<<:<<:<<<;<<<;;;: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:271:180:509 147 seq2 896 99 35M = 729 -202 ATATAGATTGGCAGAACAGATTTAAAAACATGAAC <<<<<<<<<9<:<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:198:564:731 147 seq2 898 99 35M = 1089 226 ATAGATTGGCAGAACAGATTTAAAAACATGAACTA <<<<<;<<<<<<;<<:<<;9<<<<<<<<1;<<58< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1467:1447 83 seq2 898 99 35M = 722 -211 ATAGATTGGCAGAACAGATTTAAAAACATGAACTA <<<<<::<<:<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:172:827:592 83 seq2 899 99 35M = 703 -231 TAGATTGGCAGAACAGATTTAAAAACATGAACTAA 8<<<<;7;7<<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:240:719:799 147 seq2 900 99 35M = 720 -215 AGATTGGCAGAACAGATTTAAAAACATGAACTAAC <:<<<<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:24:1345:1627 73 seq2 900 78 35M = 900 0 AGATTGGCAGAACAGATTTAAAAACATGAACTAAC <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<8<3 MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:24:1345:1627 133 seq2 900 0 * = 900 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS139_19:1:58:726:1746 147 seq2 900 99 40M = 1061 201 AGATTGGCAGAACAGATTTAAAAACATGAACTAACTATAT <<<<<<<<<<<<<<<<<<<6<<<<8<<<<<<<<:8:8:88 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:88:451:1773 147 seq2 902 99 35M = 742 -195 ATTGGCAGAACAGATTTAAAAACATGAACTAACTA 973776;;;;;;;;;::;;;;;;;;;;;;;;3;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:178:187:610 147 seq2 903 99 35M = 744 -194 TTGGCAGAACAGATTTAAAAACATGAACTAACTAT 66:,:<7<<<<<<<1<<<<<<<<<<<<<<<2<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:38:332:54 83 seq2 904 99 36M = 737 -203 TGGCAGAACAGATTTAAAAACATGAACTAACTATAT 8;;&<;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:210:674:911 147 seq2 904 99 35M = 740 -199 TGGCAGAACAGATTTAAAAACATGAACTAACTATA 27;2<;<<5<<<<;;<<<<<;<<<<<<;<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:82:963:128 83 seq2 905 99 35M = 719 -221 GGCAGAACAGATTTAAAAACATGAACTAACTATAT 585<;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:12:1335:1372 83 seq2 906 99 40M = 721 -225 GAAGAACAGATTTAAAAACATGAACTAACTATATGCTGTT :&;;;<*<<<9<<<<<<<<<<<<<<4<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_39:1:98:641:1040 147 seq2 907 99 35M = 1085 213 CAGAACAGATTTAAAAACATGAACTAACTATATGC <<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:41:530:663 83 seq2 908 99 35M = 730 -213 AGAACAGATTTAAAAACATGAACTAACTATATGCT =8=;*=5==;;=====:=====;===;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:87:430:995 147 seq2 909 67 35M = 731 -213 GAAAAGAGTTAAAAACATGAACTAACTATATGCTG 1<4%81<..1<<<<<0<<<<<0.<<9<<(<6<<6< MF:i:18 Aq:i:30 NM:i:2 UQ:i:17 H0:i:0 H1:i:1
+B7_595:3:85:964:950 147 seq2 910 99 35M = 1095 220 AACAGATTTAAAAACATGAACTAACTATATGCTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:68:570:705 83 seq2 910 99 35M = 1100 225 AACAGATTTAAAAACATGAACTAACTATATGCTGT <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:198:503:669 83 seq2 912 99 35M = 1107 230 CAGATTTAAAAACATGAACTAACTATATGCTGTTT <<<<<<<<<<;8<<<<<;<<<<<<;<;<8<<8<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:273:545:1001 147 seq2 913 99 35M = 1088 210 AGATTTAAAAACATGAACTAACTATATGCTGTTTA <<<<<<<<<<<<<<<;;<<<<<<;<8;28<8;<<8 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:152:778:228 83 seq2 915 99 35M = 739 -211 ATTTAAAAACATGAACTAACTATATGCTGTTTACA <;;7=<<<<<<;<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:53:463:1132 147 seq2 915 99 40M = 1109 234 ATTTAAAAACATGAACTAACTATATGCTGTTTACANGAAA <<<<<<<<<<<<<<<<<<<<<;<<<8<<<<<<<8<!1488 MF:i:18 Aq:i:71 NM:i:1 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:12:630:707 147 seq2 915 99 35M = 751 -199 ATTTAAAAACATGAACTAACTATATGCTGTTTACA <:<<<<<<<;<<<<<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:179:119:876 147 seq2 917 60 35M = 1112 230 TTAAAAACATGAACTAACTATATGCTGTTTACCAG <<<<<<<7<<<<<<<8<<<6<<<<<<7<<<:0&<0 MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:1
+EAS1_97:6:308:667:658 83 seq2 918 10 35M = 1116 233 TAAAAACATGAACTAACTATATCCTTCTTACAATA 9<96<<<;<96<<9<51<<<<<1:9++<9*%4;*5 MF:i:18 Aq:i:10 NM:i:4 UQ:i:45 H0:i:0 H1:i:0
+EAS114_28:5:163:832:715 147 seq2 918 99 36M = 1085 203 TAAAAACATGAACTAACTATATGCTGTTTACAAGAA <<0;<9<<<<<<<<<<<<9<<<<<<<<<<<<;;;<6 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:179:496:161 83 seq2 919 99 36M = 756 -199 AAAAACATGAACTAACTATATGCTGTTTACAAGAAA <<<<<9<<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:13:325:483 147 seq2 919 99 35M = 1101 217 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_103:7:139:578:951 147 seq2 919 98 35M = 1095 211 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<0;; MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_108:8:19:929:765 83 seq2 919 98 35M = 1069 185 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;77< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:5:214:644:390 147 seq2 919 72 35M = 1082 198 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:6:243:209:110 83 seq2 920 48 35M = 768 -187 AAAACATGAACTAACTATATGCTGTTTACAAGAAA ;<;;;:<:<:;<<;;<;<;<;7<<;<<;;<;<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:247:900:123 83 seq2 920 99 35M = 1123 238 AAAACATGAACTAACTATATGCTGTTTACAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_62:7:162:195:761 83 seq2 922 30 35M = 767 -190 AACATGAACTAACTATATGCTGTTTACAAGAAACT <<8<<:<<:<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_103:2:184:980:396 147 seq2 923 99 35M = 1092 204 ACATGAACTAACTATATGCTGTTTACAAGAAACTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:162:272:415 83 seq2 923 83 35M = 1112 224 ACATGAACTAACTATATGCTGTTTACAAGAAACTC <<<<<<<<<<<<<<<<<<<<<<;<<<<<9;<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:184:237:476 147 seq2 925 99 35M = 1101 211 ATGAACTAACTATATGCTGTTTACAAGAAACTCAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:202:341:984 83 seq2 926 99 35M = 1094 203 TGAACTAACTATATGCTGTTTACAAGAAACTCATT =========================4;======== MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:107:738:484 83 seq2 926 75 35M = 1097 206 TGAACTAACTATATGCTGTTTACAAGAAACTCATT <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:7:492:1088 147 seq2 926 57 35M = 769 -192 TGAACTAACTATATGCTGTTTACAAGAAACTCATT 4;<<75<<::<:<<<-<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_11:1:81:1019:558 83 seq2 926 77 35M = 760 -201 TGAACTAACTATATGCTGTTTACAAGAAACTCATT <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:10:1312:1558 83 seq2 928 76 35M = 771 -192 AACTAACTATATGCTGTTTACAAGAAACTCATTAA <<:<<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:206:741:810 83 seq2 929 99 34M = 753 -210 ACTAACTATATGCTGTTTACAAGAAACTCATTAA <3<<;5<<<<<;:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:200:65:291 147 seq2 930 99 35M = 728 -237 CTAACTATATGCTGTTTACAAGAAACTCATTAATA ;9<;3<<9<7<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:38:670:564 147 seq2 930 73 35M = 770 -195 CTAACTATATGCTGTTTACAAGAAACTCATTAATA 3<<<3:<<<<<:;<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:57:1114:2032 83 seq2 931 99 35M = 1102 206 TAACTATATGCTGTTTACAAGAAACTCATTAATAA <7<<<<<<<<<<<<<<<<<777<<<7<<<<<3<<7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:125:137:58 83 seq2 932 76 35M = 772 -195 AACTATATGCTGTTTACAAGAAACTCATTAATAAA <<9;<<<<<;<;<<<<;<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:1:38:250:647 147 seq2 933 71 35M = 1100 202 ACTATATGCTGTTTACAAGAAACTCATTAATAAAT <<<<<<<9<<9<<<<<<<6<<<<<<<<<<8<779% MF:i:18 Aq:i:0 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS192_3:6:116:464:261 83 seq2 934 99 35M = 1107 208 CTATATGCTGTTTACAAGAAACTCATTAATAAAGA <<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<;;8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:168:69:249 147 seq2 936 99 35M = 1125 224 ATATGCTGTTTACAAGAAACTCATTAATAAAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:246:647:765 147 seq2 937 99 35M = 1119 217 TATGCTGTTTACAAGAAACTCATTAATAAAGACAT ;<<<<<<<<<;<&<<3+3<<<3<<9&</:/87</8 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:307:113:346 147 seq2 938 99 35M = 1123 220 ATGCTGTTTACAAGAAACTCATTAATAAAGACATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<8 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:159:493:275 147 seq2 939 72 35M = 760 -214 TGCTGTTTACAAGAAACTCATTAATAAAGACATGA 4949;<<<<<<<<<<<6<;<<<<;<<<<<*<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:257:288:731 83 seq2 939 99 34M = 1131 227 TGCTGTTTACAAGAAACTCATTAATAAAGACATG <<<<<<<<8<8<<;<;<<<;<<<5<;;88.8<6< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:231:815:626 147 seq2 940 99 35M = 1119 214 GCTGTTTACAAGAAACTCATTAATAAAGACATGAG <;<<<<9<<<<<<<<<<<<<<<<<;<<;5<<<;:; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:93:77:1338 147 seq2 940 10 35M = 1098 193 GCTGCTTACAAGAAGCGCATTAATAAAGACATGAG <<<<*<2<<<:<4<&<6<8<4<::<8<<<<82;;7 MF:i:18 Aq:i:0 NM:i:3 UQ:i:35 H0:i:0 H1:i:0
+EAS114_45:2:54:1886:719 83 seq2 941 99 35M = 1125 219 CTGTTTACAAGAAACTCATTAATAAAGACATGAGT ;;;9;;<;;;9;;;;;:;<9;:;;;;9;;;99799 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:94:273:165 83 seq2 945 99 35M = 1128 218 TTACAAGAAACTCATTAATAAAGACATGAGTTCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;:7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:32:461:154 147 seq2 945 71 35M = 769 -211 TTACAAGAAACTCATTAATAAAGACATGAGTTCAG ;;</<<<<<;:<.<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:303:131:673 147 seq2 947 99 36M = 1112 201 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:10:106:737 147 seq2 947 99 35M = 1106 194 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <<<;<1<;<<<<<<9<<<<;;<<<<<99<<94008 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:214:950:32 147 seq2 947 99 35M = 1132 220 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT >>=>>>>==>=>>>==>=>=:=====;=:=6:::6 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:10:686:1024 147 seq2 947 99 35M = 1103 191 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:53:61:31 147 seq2 949 99 35M = 1122 208 AAGAAACTCATTAATAAAGACATGAGTTCAGATAA <<<7;<7<<<;7<;;<7<7<7<;5<73<<</%;/; MF:i:18 Aq:i:66 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS114_28:6:185:87:475 83 seq2 949 99 36M = 786 -199 AAGAAACTCATTAATAAAGACATGAGTTCAGGTAAA <<4<<<+<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:235:899:847 83 seq2 950 99 35M = 1112 197 AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA <<3<;<<<<<<<<<;;<<<<<<<+<<<+6<8<3/< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:193:661:771 147 seq2 952 99 35M = 1129 212 AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG <<<<<<<<<;<<<;;;<<<<<;<<<=;<:;5:9:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:113:408:211 147 seq2 952 99 35M = 789 -198 AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG <:;:;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:24:718:322 83 seq2 953 23 35M = 779 -209 AACTCATTAATAATGTCATGAGTTCAGGTAAAGGG 5:+:0;**&+<00&<&<<<5<28<<;;<83<<<<< MF:i:18 Aq:i:23 NM:i:2 UQ:i:10 H0:i:0 H1:i:0
+EAS56_61:5:263:314:696 147 seq2 953 99 35M = 1117 199 AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG <<<<<<<<<<<<<<;<<<<<<<<<<<<:<<;<775 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:93:312:331 147 seq2 953 99 35M = 1145 227 AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:181:93:694 83 seq2 954 99 35M = 783 -206 ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG <4;8<<+<<:<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:238:803:383 147 seq2 954 75 35M = 779 -210 ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG ;;<;;<<<<<<<<<<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:44:77:1255 147 seq2 955 99 35M = 1113 193 CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT ;;;;;;;8;;;7;8;;;;;;;;;;886;;;76777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:232:364:583 147 seq2 956 71 35M = 780 -211 TCATTAATAAAGACATGAGTTCAGGTAAAGGGGTG ;%;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:256:354:173 147 seq2 957 99 36M = 1121 200 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:138:211:582 147 seq2 957 99 35M = 788 -204 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG :<8;<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:61:631:567 83 seq2 957 99 35M = 1131 209 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:56:1757:1319 83 seq2 957 67 35M = 775 -217 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG &7778<<<<<8<;<<:::;<:<4<<:<:;8<8<;< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:154:26:712 147 seq2 959 99 35M = 786 -208 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:10:975:766 147 seq2 959 99 35M = 1166 242 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGAAA <<<<<<<<;<<<<;<:<<;<6;;<<<:6-:+1+;; MF:i:18 Aq:i:64 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_73:5:220:733:736 83 seq2 959 99 35M = 1143 219 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<5<<;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:46:1566:668 147 seq2 959 99 35M = 1148 224 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:59:871:351 83 seq2 963 99 35M = 808 -190 TAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAG ;<<<<<:<;<<<4;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:46:522:426 83 seq2 964 99 35M = 807 -192 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA <<<<<:<<<<<<1/<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:157:876:302 83 seq2 964 99 35M = 801 -198 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA ===:=8=;==:892=,28==88==28====8=;;8 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:61:1369:440 83 seq2 964 47 35M = 770 -229 AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA <<<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS221_1:6:57:1342:1166 147 seq2 964 99 35M = 796 -203 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA <<<<<;<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:310:287:420 147 seq2 965 99 35M = 794 -206 AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT <<<<;<;<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:262:53:888 83 seq2 965 99 35M = 787 -213 AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:542:428 83 seq2 965 99 35M = 797 -203 AAGACATGAGTTCAGGTACAGGGGTGGAAAAAGAT <<876</3<8874:<8:<)<5<<<;<<<<7<<<:< MF:i:18 Aq:i:41 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+B7_593:2:81:435:410 147 seq2 966 99 36M = 782 -220 AGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT ;<;;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:85:219:371 83 seq2 967 99 35M = 817 -185 GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT <<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:116:966:193 83 seq2 967 99 35M = 815 -187 GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT =================================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:432:228 147 seq2 967 99 35M = 1145 213 GACATGAGTTCAGGGAAAGGGGTGGAAAAAGATGT <<<<<<<<<<<<<<8<<<<<<<<<<<<:<<<<<;; MF:i:18 Aq:i:47 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+B7_610:1:12:88:200 147 seq2 968 99 35M = 1133 200 ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT <<<<<<<<<<<;<<<<<<<;<<<:<<<<<<9<<5< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:313:711:530 83 seq2 968 99 35M = 784 -219 ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT <7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:74:866:49 147 seq2 969 99 35M = 1143 209 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ====================9==91==<=6==;:= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:248:17:435 83 seq2 969 99 35M = 1139 205 CATGAGTTCAGGAAAAGGGGTGGAAAAAGATGTTC <<<<8<<<888<+<<<<<;<:<<<<8<<<<<;3<3 MF:i:18 Aq:i:43 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS114_30:1:188:863:790 83 seq2 969 98 35M = 783 -221 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ;<7<<<55<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:75:1503:1399 147 seq2 969 99 40M = 1130 201 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC <<<<<<<<<<<<<<<<<<9<<<;<<<<<<;<<<<:::711 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:56:155:49 83 seq2 970 99 35M = 1145 210 ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT <<<<<<<<<<<<<<<<<<<<<<;<<;<<<;<9<9; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:295:547:216 83 seq2 970 99 35M = 809 -196 ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:262:928:237 147 seq2 971 99 35M = 787 -219 TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA ;<<<<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS219_1:1:50:257:341 83 seq2 971 99 35M = 813 -193 TGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:122:38:103 83 seq2 972 79 35M = 778 -229 GAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTAC ===;3<===:=======<================= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:82:670:302 83 seq2 973 99 35M = 1146 208 AGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:24:415:944 147 seq2 974 99 35M = 805 -204 GTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC <;;<<<<:<<<<<<<;<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:108:440:208 83 seq2 975 99 35M = 1142 202 TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA <<<;<<<<<<<<<</<<<<;<<<;<<;<;<64/:+ MF:i:18 Aq:i:43 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+B7_595:3:229:543:583 83 seq2 976 99 35M = 1139 198 TCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAA <<<<<<<<<<8<8<9<<<<8<<588<<<<*<2:2* MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:142:353:398 83 seq2 977 99 35M = 807 -205 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA =================================== MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:102:543:160 83 seq2 977 99 35M = 825 -187 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA 9==9=====;=====================<=== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:191:40:536 147 seq2 977 66 35M = 1167 225 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA <<<<<<<<8<<;<<8<<;<;;<<8<<<<<</<74/ MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:272:328:400 147 seq2 977 99 35M = 1151 209 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<7<;:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:69:1593:819 83 seq2 977 99 40M = 786 -231 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA );::7<<<<:;<<<<<<<<<<<<<<<9<<9<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:3:133:707:886 83 seq2 978 99 35M = 1146 203 AGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAAC <<<<7;<<<<<<<<<;<<<<<<<<<<<<<5<;66< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:4:92:411:955 83 seq2 979 99 36M = 1149 206 GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_61:8:60:358:494 83 seq2 979 44 35M = 1179 235 GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA <<<<<<<<<<<<<<<<<<<<<<<<<<:<:<<;;4; MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:7:41:34:211 147 seq2 980 99 35M = 1164 219 GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3:;5; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:40:1291:1045 83 seq2 980 99 35M = 1167 222 GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG <<<<<<<<<5<<5<<<<7<<<<<<<<<5<9<&%73 MF:i:18 Aq:i:39 NM:i:2 UQ:i:9 H0:i:1 H1:i:0
+EAS218_1:8:90:706:1276 83 seq2 980 99 35M = 814 -201 GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <;<<<<<<<;<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_32:4:5:396:292 147 seq2 981 99 35M = 1155 209 TAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGA <<<<<<<<<<<<<<;;<<<<:<<<<;;<;;3/&+8 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:176:653:957 83 seq2 982 82 35M = 819 -198 AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA ===::=============<==<====<======== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_71:6:264:705:89 83 seq2 983 99 34M = 1155 207 AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA <<<<<<<<<<;8<<<<<<<<<<<<<<<&<<,;;( MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:66:757:918 147 seq2 985 99 35M = 1143 193 GGGGTGGAAAAAGATGTTCTACGCAAACAGAAACC =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:114:506:971 147 seq2 986 99 35M = 1150 199 GGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA =================================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:220:809:850 83 seq2 986 60 35M = 1187 236 GGGGGGAAAAAGATGTGCTACACAAAAAGATTCCA <<;7;<<0::8<-6:<0624-*<&-93-,8+(&08 MF:i:-126 Aq:i:60 NM:i:4 UQ:i:64 H0:i:0 H1:i:0
+B7_589:7:76:306:561 83 seq2 987 89 35M = 794 -228 GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA 9<7<<9<<<<<<7<<71<71*7<<<<<<<<<<1<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS192_3:6:235:505:553 83 seq2 987 99 35M = 808 -214 GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA ;8518<<<<<;<;<<<;<<;<.<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:19:695:59 147 seq2 988 99 36M = 826 -198 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAAT ;+;8<<<<<<<<<<<5<<+<:<<;<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:136:260:254 147 seq2 988 99 35M = 813 -210 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA ;:;;<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:5:266:133:789 147 seq2 988 99 35M = 810 -213 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA 9;;<<<<<<<<<<<<5<<;<5<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:4:159:508:571 147 seq2 989 84 36M = 834 -191 TGGAAAAAGATGTTCTACGCAAACAGAAACCAAATG 9<6<<<<<<<<<<<;<<;<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:166:84:766 147 seq2 990 99 35M = 1167 212 GGAAAAAGATGTTCTACGCAAACAGAAACCAAATG <<<<<<<<;<<<<<<<<;<<<<<<;<<<7<;::93 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_61:6:283:963:234 83 seq2 992 99 35M = 1157 200 AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG <<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:4:184:659:377 83 seq2 992 99 35M = 1173 216 AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:305:707:258 147 seq2 992 58 36M = 831 -197 AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA 3<<7<,;<<<<0<66<6+<%<<<.<<<<<<<<<9<< MF:i:18 Aq:i:17 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS219_1:7:20:1444:328 83 seq2 993 99 35M = 1149 191 AAAAGATGTTCTACGCAAACAGAAACCAAATGAGA <<<<;<<<<<<<<;<<<<<<<<;<<<<<;<;;8:7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:157:447:758 147 seq2 994 99 36M = 833 -197 AAAGATGTTCTACGCAAACAGAAACCAAATGAGAGA <<<;<<5<</<<6<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:37:763:1437 147 seq2 994 99 35M = 1191 232 AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG ;;;;;6;;;;;;;;;:;6;5;5;;;;;76;767/7 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:94:1273:1462 147 seq2 995 99 35M = 1166 206 AAGATGTTCTACGCAAACAGAAACCAAATGAGAGA <<<<<<<<<<<<:<<<<<<<<:<<<<:6:7;744; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:74:213:877 147 seq2 996 99 35M = 816 -215 AGATGTTCTACGCAAACAGAAACCAAATGAGAGAA <<<<<<<&<<-<-<<<7<<<<<77<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:168:61:867 147 seq2 997 99 35M = 1188 226 GATGTTCTACGCAAACAGAAACCAAATGAGAGAAG ====7====================7======6== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:307:252:632 147 seq2 998 99 35M = 1142 179 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<;; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:37:604:389 83 seq2 998 99 35M = 1188 225 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<3<<<<<4<<<<<9<2;949<;35:95 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:147:687:428 83 seq2 998 99 35M = 1159 196 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:114:736:433 83 seq2 998 63 35M = 832 -201 ATGTTCTACGCAAACAGAAACCAAGTGAGAGAAGG <9<9+9;<6<9<<;9<<<<<;<<<99<<<<<<<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:24 H0:i:0 H1:i:1
+B7_597:8:35:118:589 147 seq2 999 99 35M = 1188 224 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<<9 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:127:288:655 83 seq2 999 99 35M = 803 -231 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA <<:<3<<:<.<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:260:827:289 83 seq2 999 99 35M = 836 -198 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA 6;99+<<<<<<<<<<<<<<6<<<<<7<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:82:843:1838 147 seq2 999 99 35M = 804 -230 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA 888829;;;;;;;;;;;;;;:;;;;;;;;;;;;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:64:350:174 147 seq2 1000 99 35M = 1166 201 GTTCTACGCAAACAGAAACCAAATGAGAGAAGGAG <<<<<<<<<<<<<<<<<<<<<:<<<<<6<<<<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:8:327:522 83 seq2 1001 99 35M = 826 -210 TTCTACGCAAACAGAAACCAAATGAGAGAAGGAGT ;;4;<-<-<<<7<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:126:361:250 147 seq2 1002 99 35M = 810 -227 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA 72:;7</<<<:<-7<<:<<<<<<<:<6<+:<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:571:366 147 seq2 1002 99 35M = 1194 227 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA <<<<<<<<<<<<<<<<<<<<<<<<<7<:<<99;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:202:275:776 147 seq2 1002 99 36M = 1196 230 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAG <<<<<<<<<<<<<<<<<<<<<;<<9<;;<<<;<;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:194:998:663 147 seq2 1002 99 35M = 1165 198 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:30:599:589 83 seq2 1003 99 36M = 1188 221 CTACGCAAACAGAAACCAAATGAGAGAAGGAGCAGC <<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;<&<<; MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS112_34:4:92:412:435 83 seq2 1003 89 35M = 1184 216 CTACGCAAACAGAAACCAANTGAGAGAAGGAGTAG <<<<<<<4<<<<<<<<<66!<<<<<<6<<77<<97 MF:i:18 Aq:i:43 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+B7_610:2:75:887:149 83 seq2 1004 99 35M = 823 -216 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC :<:<0<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:2:1422:1820 147 seq2 1004 99 35M = 1164 195 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC ;7;;;;;;;;:;;;;;;;;;;;;;;;;;;;77777 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:90:561:850 83 seq2 1004 85 35M = 827 -212 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC 78376<;;9<;<<;:9<<<6;<;<;;8;;<;/;;; MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:164:719:947 147 seq2 1005 99 35M = 813 -227 ACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCT ===,=========6====)================ MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:154:952:558 83 seq2 1007 99 35M = 1173 201 GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:58:923:1915 83 seq2 1007 99 40M = 846 -201 GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA :+;;;8<<<<<<,<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:253:175:31 83 seq2 1008 72 35M = 1187 214 CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<:<;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:29:729:70 83 seq2 1009 51 35M = 850 -194 AAACAGAAACCAAATGAGAGAAGGAGTAGCTATAC <<<:<<<<<<7<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:174:157:573 147 seq2 1012 99 35M = 1191 214 CAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:197:399:319 147 seq2 1012 99 35M = 1189 212 TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA +<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;;<<; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_65:7:68:825:405 83 seq2 1015 30 35M = 835 -215 AAACCAAATGAGAGAAGGAGTAGCTATACTTATAT <<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:13:701:55 83 seq2 1015 99 36M = 1187 208 AAACCAAATGAGAGAAGGAGTAGCTATACTTATATC <<<<<<<<<9<<<9<<<<<<6<<<<<<<6<<6<<6+ MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:128:555:941 153 seq2 1016 10 36M * 0 0 AACCAAAAGAGAGAAGGAGTAGTTATACACATATCA 55--555560355$55555555.57757$7555577 MF:i:32 Aq:i:10 NM:i:4 UQ:i:58 H0:i:0 H1:i:0
+EAS219_FC30151:1:53:140:421 147 seq2 1016 99 35M = 1185 204 AACCAAATGAGAGAAGGAGTAGCTATACTTATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:64:526:339 83 seq2 1019 96 35M = 819 -235 CAAATGAGAGAAGGAGTATCTATACTTATATCAGA 3<<<7<<;<<<<<<<<<<<;<<<<;<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS192_3:3:194:378:230 147 seq2 1022 99 35M = 1198 211 ATGAGAGAAGGAGTAGCTATACTTATATCAGATAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:45:239:851 147 seq2 1023 61 35M = 1211 223 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA <<88;<208<9<;6<<<6269;94<&401-662&2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:39:956:676 147 seq2 1023 99 35M = 1191 203 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA ;;;;;;;;;;;;9;;;;;;;;;;;;;;;9957777 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:15:1763:1143 83 seq2 1023 99 35M = 1193 205 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:309:109:987 147 seq2 1024 99 35M = 1194 205 GAGAGAAGGAGTAGCTATACTTATATCAGATAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<9<<<;<;;; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_593:3:102:856:670 147 seq2 1025 99 36M = 836 -225 AGAGAAGGAGTAGCTATACTTATATCAGATAAAGCA ;;<<<<:<<<:<<4<<<<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_610:6:107:252:533 147 seq2 1025 60 35M = 1173 183 AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:3
+EAS56_65:4:126:966:514 83 seq2 1027 99 35M = 865 -197 AGAAGAAGTAGCTATACTTATATCAGATAAAGCAC <4<<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:1 H1:i:1
+EAS114_26:1:171:527:247 147 seq2 1027 67 35M = 1194 202 AGAAGGAGTAGCTAGACTTATATCAGATAAAGCAC =4==4===8==99=&=8+9=19+.2.6'=99+999 MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:3
+EAS1_105:1:234:185:359 147 seq2 1029 46 35M = 1183 189 AAGGAGTAGCTATACTTATATCAGATAAAGCACAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;9--: MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:11
+EAS51_66:3:155:375:623 83 seq2 1029 99 35M = 849 -215 AAGGAGTAGCTATACTTATATCAGATAAAGCACAC ;;;;<<:<<<<;<<;<<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:5:4:939:2021 147 seq2 1031 99 40M = 1197 206 GGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAAT <<<<<<<<<<<<<<<<<<<<<97<<<;<<;<7;<<:48:: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS220_1:2:50:513:882 147 seq2 1031 99 35M = 1192 196 GGAGTAGCTATACTTATATCAGATAAAGCACACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS1_103:5:188:20:592 147 seq2 1032 95 35M = 1202 205 GAGTAGCTATACTTATATCAGATAAAGCACACTTT <<<<<<<<<<<<<<<<<<<<;;<<<<:<<<;<;;< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:3 H1:i:16
+EAS114_45:3:35:896:1588 147 seq2 1032 91 35M = 1205 208 GAGTAGCTATACTTATATCAGATAAAGCACACTTT ;;;;;;;;;;;;;;;;;;;;8;;;;;8;;;88989 MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:3 H1:i:18
+EAS1_108:6:73:735:329 147 seq2 1035 99 35M = 868 -202 TAGCTATACTTATATCAGATAAAGCACACTTTAAA ;;;9;<<7<<<<<<<<<<<<<<<<<<<2<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:133:514:754 83 seq2 1036 63 36M = 855 -217 AGCTATACTTATATCAGATAAAGCACACTTTAAATC ;;4;<;<;<<<<<<<<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS218_1:4:62:561:531 147 seq2 1036 99 35M = 1203 202 AGCTATACTTATATCAGATAAAGCACACTTTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_593:6:119:428:415 83 seq2 1037 99 36M = 876 -197 GCTATACTTATATCAGATAAAGCACACTTTAAATCA 84<<<<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:2:226:885:729 147 seq2 1037 98 35M = 867 -205 GCTGAACTTACATCAGATAAAGCACACTTTAAATC /*220%.(;<%<3.<<<4<<<<86;<8<<8<<<<< MF:i:18 Aq:i:30 NM:i:3 UQ:i:36 H0:i:0 H1:i:1
+EAS1_108:1:189:863:213 147 seq2 1039 99 35M = 1202 198 TATACTTATATCAGATAAAGCACACTTTAAATCAA <<<<<<<<<<<<<<<<<<<<;<<<;<<<<;7<9;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_597:4:146:961:63 83 seq2 1041 86 35M = 861 -215 TACTTATATCAGATAAAGCACACTTTAAATCAACA 7;;<<<<<;<<<7<<<<<<<<;;<<;<;<<;<<<7 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:68:996:104 83 seq2 1041 70 35M = 1214 208 TACTTATATCAGATAAAGCACACTTTAAATCAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:47:1791:444 147 seq2 1041 74 35M = 1213 207 TACTTATATCAGATAAAGCACACTTTAAATCAACA ;3;;;;;;;;;;;;;;;;;;;;;;;;;;;877977 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:1:156:196 147 seq2 1042 77 40M = 867 -215 ACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTA :::::<<<<<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:70:1349:1788 147 seq2 1043 99 35M = 1203 195 ATTATATCAGATAAAGCACACTTTAAATCAACAAC &<8<<<85:580;<:0-><;>588>9<>7:<0<9; MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:2:30:644:942 83 seq2 1045 83 35M = 1229 219 TATATCAGATAAAGCACACTTTAAATCAACAACAG <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<9;<9< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_591:2:123:924:645 83 seq2 1045 84 36M = 861 -220 TATATCAGATAAAGCACACTTTAAATCAACAACAGT ;<<<<*<<<<<<</7<2<8<<<<<<<4<<<<<<<<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_589:5:147:405:738 83 seq2 1048 99 35M = 870 -213 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA <9/<:<<<<<<<<7</<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_61:3:155:758:710 83 seq2 1048 98 35M = 859 -224 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA =46=4=5===:========:=7=7======11=== MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_73:7:254:572:431 83 seq2 1048 97 35M = 891 -192 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA <63<;<;<<<:7<:<7;<:<<<<:<<<<7<<<<:< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_57:7:33:954:724 147 seq2 1049 97 35M = 1210 196 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA ;<<<<<<<<<<<<<8<<<<:<;;<<;;<;<<;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_63:6:102:816:260 83 seq2 1049 99 35M = 1225 211 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:5:197:914:256 83 seq2 1049 97 35M = 1204 190 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8;::: MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_65:4:150:94:843 147 seq2 1050 0 35M = 868 -217 CAGATACATCCCACTTTAAATCAACCACAGTAAAA 4<9<41*747*7<:9<:7:::<72;+<;::<7<<< MF:i:18 Aq:i:0 NM:i:4 UQ:i:47 H0:i:0 H1:i:0
+EAS1_108:5:321:712:224 147 seq2 1051 58 35M = 1220 204 AGATAAAGCACACTTTAAATCAACAACAGAAAAAT <<<<<<<<2<<<<<<<<<<<<<<<:<<<<(<<:<, MF:i:18 Aq:i:28 NM:i:1 UQ:i:7 H0:i:1 H1:i:2
+EAS114_32:3:236:475:254 83 seq2 1051 99 35M = 880 -206 AGATAAAGCACACTTTAAATCAACAACAGTAAAAT <:<<<<<;9<7<;<<<<<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:72:1288:1211 83 seq2 1052 84 35M = 1235 218 GATAAAGCACACTTTAAATCAACAACAGTAAAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_65:2:264:157:150 83 seq2 1054 30 35M = 1238 219 TAAAGCACACTTTAAATCAACAACAGTAAAATAAA <<<<<<9<9<<<<.9;<<9&<97<;9933309605 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_95:7:310:800:761 147 seq2 1055 99 35M = 1249 229 AAAGCACACTTTAAATCAACAACAGTAAAATAAAA ===========================+======= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:88:465:1877 83 seq2 1055 99 35M = 1212 192 AAAGCACACTTTAAATCAACAACAGTAAAATAAAA <<<<<<<<<<;<<<<<<<<<<<<<<<<7<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:66:891:294 147 seq2 1057 99 35M = 1233 211 AGCACACTTTAAATCAACAACAGTAAAATAAAACA <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:100:735:530 147 seq2 1058 99 35M = 1257 234 GCACACTTTAAATCAACAACAGTAAAATAAAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:68:440:424 83 seq2 1060 99 35M = 1237 212 ACACTTTAAATCAACAACAGTAAAATAAAACAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS220_1:8:66:1046:167 83 seq2 1060 99 35M = 1241 216 ACACTTTAAATCAACAACAGTAAAATAAAACAAAG <<<<<:<<<<<<<<<<<<<9<;77<9<7<<;<9;- MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_81:6:11:801:386 83 seq2 1061 97 35M = 868 -228 CACTATAAATCAACAACAGTAAAATAAAACAAAGG 5<2:$6<<<38<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:3 H0:i:1 H1:i:1
+EAS114_28:2:141:7:963 147 seq2 1061 85 36M = 1240 215 CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA <<<<<<<<<<<<;<:<<<<<<1<<&<;<;<<;,<;5 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:55:296:1457 147 seq2 1061 99 35M = 884 -212 CACTTTAAATCAACAACAGTAAAATAAAACAAAGG -<%63<<<<<1<<<<<5<<<<<<<<<<<<<<<7<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:1:58:726:1746 83 seq2 1061 99 40M = 900 -201 CAATTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTC &:&::;<<<76<<:<<6<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS221_1:8:15:881:1932 147 seq2 1061 92 35M = 886 -210 CACTTTAAATCAACAACAGTAAAATAAAACAAAGG )<4<<<<<<<4<<4<<4<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_95:5:284:212:932 83 seq2 1063 10 35M = 1257 229 CTTTAAATCAACAACAATAAAAAAAAACAAAGGAG <<9<<<<<<<<<<<<<&&<<<<5<<<<8<<<1:<: MF:i:18 Aq:i:0 NM:i:2 UQ:i:25 H0:i:0 H1:i:0
+EAS139_19:4:18:1335:1514 83 seq2 1063 99 40M = 1235 212 CTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCAT <<<;<<<<<<<<<<<<<<<;<:<<;<<<<<<;<;<;;;9; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:273:424:207 83 seq2 1066 99 35M = 891 -210 TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:62:1076:540 147 seq2 1066 99 35M = 882 -219 TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC 6<<;:+=====5=:6===================2 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:113:856:319 83 seq2 1067 99 33M = 884 -216 AAATCAACAACAGTAAAATAAAACAAAGGAGGT <<<77<<:<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:19:929:765 147 seq2 1069 98 35M = 919 -185 ATCAACAACAGTAAAATAAAACAAAGGAGGTCATC <3+<<;<<;<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:88:54:900 147 seq2 1069 68 35M = 1257 223 ATCAACAACAGAAAAATAAAACAAAGGAGGTCATC .....&.....,....................... MF:i:18 Aq:i:19 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS56_63:7:109:22:383 147 seq2 1071 99 35M = 1244 208 CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<;<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:4:571:820 83 seq2 1071 99 35M = 891 -215 CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT &<<7<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:255:441:47 83 seq2 1072 99 35M = 1237 200 AACAACAGTAAAATAAAACAAAGGAGGTCATCATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<6<;:<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:66:718:481 147 seq2 1072 99 40M = 891 -221 AACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATG ::5::1<;;<<<<<<1<<<<<<<<<<<<7<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:155:807:19 147 seq2 1074 99 35M = 867 -242 CAACAGTAAAATAAAACAAAGGAGGTCATCATACA :==4=5:====:============:========== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:43:1229:1855 147 seq2 1074 99 35M = 1244 205 CAACAGTAAAATAAAACAAAGGAGGTCATCATACA <<<<<<<<<<<<<<<<<<<<<<<<<4<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:125:875:553 83 seq2 1075 99 36M = 1233 194 AACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:118:775:467 147 seq2 1075 99 35M = 1245 205 AACAGTAAAATAAAACAAAGGAGGTCATCATACAA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:301:161:195 83 seq2 1076 75 35M = 1239 198 ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:54:695:952 83 seq2 1076 99 35M = 1264 223 ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:77:589:741 147 seq2 1078 99 35M = 1263 220 AGTAAAATAAAACAAAGGAGGTCATCATACAATGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:200:263:280 147 seq2 1078 99 35M = 1236 193 AGTAAAATAAAACAAAGGAGGTCATCATACAATGA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;8<;1 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:64:199:1288 83 seq2 1079 77 35M = 1240 196 GTAAAATAAAACAAAGGAGGTCATCATACAATGAT <<<<<<<<<<<<<<;<<<<<<<<<<<<<<;<<<;< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:27:228:31 83 seq2 1082 99 35M = 1264 217 AAATAAAACAAAGGAGGTCATCATACAATGATAAA <<<<<<<<<<<<<<<<<;9<:;<<<<<<75<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:214:644:390 83 seq2 1082 72 35M = 919 -198 AAATAAAACAAAGGAGGTCATGATACAATGATAAA <<<;<<<<<<<<<<<<<<<<<&<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_45:2:79:554:354 83 seq2 1082 63 35M = 1242 195 AAATAAAACAAAGGAGGTCATCATACAATGATAAA 17;<;;+<<;;;;93;;:;3;;;;1;;;;<77744 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:303:542:924 147 seq2 1083 76 35M = 1242 194 AATAAAACAAAGGAGGTCATCATACAATGATAAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:8:26:242:35 83 seq2 1084 99 35M = 1251 202 ATAAAACAAAGGAGGTCATCATACAATGATAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:163:832:715 83 seq2 1085 99 36M = 918 -203 TAAAACAAAGGAGGTCATCATACAATGATAAAAAGA ;<<<<9<<<<<<<<;;<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:98:641:1040 83 seq2 1085 99 35M = 907 -213 TAAAACAAAGGAGGTCATCATACAATGATAAAAAG 4<<<<7<<<<<<<<<:<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:32:562:1695 83 seq2 1085 76 35M = 1258 208 TAAAACAAAGGAGGTCATCATACAATGATAAAAAG <<<<<<<<<<<<<<8<<<<<:<<<<<<<:<8<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:6:758:988 147 seq2 1087 99 35M = 1253 201 AAACAAAGGAGGTCATCATACAATGATAAAAAGAT 3+;0;0;;;0;;;;;;5;;;9;;;;90;;;57560 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:273:545:1001 83 seq2 1088 99 35M = 913 -210 AACAAAGGAGGTCATCATACAATGATAAAAAGATC <7(<<72;<2;27<;:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:74:656:272 147 seq2 1088 99 35M = 1245 192 AACAAAGGAGGTCATCATACAATGATAAAAAGATC <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:198:564:731 83 seq2 1089 99 35M = 898 -226 ACAAAGGAGGTCATCATACAATGATAAAAAGATCA <6<;<<<<<<:7<<;<<<8<<+<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:23:885:274 83 seq2 1089 99 35M = 1289 235 ACAAAGGAGGTCATCATACAATGATAAAAAGATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:22:632:176 83 seq2 1091 99 36M = 894 -233 AAAGGAGGTCATCATACAATGATAAAAAGATCAATT <9<<<<<<<-;<;<<7;6;<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:184:980:396 83 seq2 1092 99 35M = 923 -204 AAGGAGGTCATCATACAATGATAAAAAGATCAATT <<;;<77;;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:110:984:98 83 seq2 1092 99 36M = 1270 214 AAGGAGGTCATCATACAATGATAAAAAGATCAATTC 98<<<<<<2<<<<<<;;<;;<<<5;5;<<;;<<<<+ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:202:341:984 147 seq2 1094 99 35M = 926 -203 GGAGGTCATCATACAATGATAAAAAGATCAATTCA <<<(<8&<92<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:219:40:833 147 seq2 1094 99 35M = 1278 219 GGAGGTCATCATACAATGATAAAAAGATCAATTCA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:23:1126:1886 83 seq2 1094 99 35M = 1268 209 GGAGGTCATCATACAATGATAAAAAGATCAATTCA 7<<<7<<<<<<<<7<<<<<<<<<<<<<;8<;<<5< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:85:964:950 83 seq2 1095 99 35M = 910 -220 GAGGTCATCATACAATGATAAAAAGATCAATTCAG <<8::<<;;<<<;<<6<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:139:578:951 83 seq2 1095 98 35M = 919 -211 GAGGTCATCATACAATGATAAAAAGATCAATTCAG ;<0;:&<:9<<<7<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:107:738:484 147 seq2 1097 75 35M = 926 -206 GGTCATCATACAATGATAAAAAGATCAATTCAGCA .8/<<<7<8<<<<<<<<<<<<<<<<9<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:4:93:77:1338 83 seq2 1098 10 35M = 940 -193 GTCATCATACAATGAAAAAAAGATCAATTCAGCAA <<7<7<<<<<1<7<<&97;;<1<;1<<7<;7<<;< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_610:8:68:570:705 147 seq2 1100 99 35M = 910 -225 CATCATACAATGATAAAAAGATCAATTCAGCAAGA 4<;4<;;:<<<<<<<<;<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS51_62:1:38:250:647 83 seq2 1100 71 35M = 933 -202 AATAATAAAATGATAAAAAGATCAATTCAGCAAGA +<&+<1<,<<7<<7<<<<<<<1,<<<<7<<2<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:34 H0:i:0 H1:i:3
+EAS1_93:8:13:325:483 83 seq2 1101 99 35M = 919 -217 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA ;:;<;=:========;==========;======== MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:128:584:952 147 seq2 1101 99 35M = 1277 211 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA <<<<<<<<<<<<<<+<;<<<<<<;<<<;<<<+<66 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:184:237:476 83 seq2 1101 99 35M = 925 -211 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA <;2<;<4<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+EAS51_64:6:300:622:86 147 seq2 1102 99 35M = 1264 197 TCATACAATGATAAAAAGATCAATTCAGCAAGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:57:1114:2032 147 seq2 1102 99 35M = 931 -206 TATTACAATGATAAAAAGATCAATTCAGCAAGAAG ;+!5<4<<<<<<<<<<<<<;<&<;7<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:10 H0:i:1 H1:i:6
+B7_593:3:310:193:629 147 seq2 1103 99 36M = 1267 200 CATACAATGATAAAAAGATCAATTCAGCAAGAAGAT <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:6:529:366 83 seq2 1103 99 35M = 1291 223 CATACAATGATAAAAAGATCAATTCAGCAAGAAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:10:686:1024 83 seq2 1103 99 35M = 947 -191 CATACAATGATAAAAAGATCAATTCAGCAAGAAGA &<<<3<<<<<<<<<<<<<<7<<<<<<<<<<7<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS114_45:7:14:978:1296 147 seq2 1104 90 35M = 1249 180 ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT ;6;;;;;;;;;;;:;;;;;;;6;;;;;;;;77777 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS56_57:2:237:855:581 83 seq2 1105 87 35M = 1271 201 TACAATGATAAAAAGATCAATTCAGCAAGAAGATA <;4<7<<<;47<<74<:*<<2:<<7.799:2<<9: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+EAS139_19:7:85:262:751 147 seq2 1105 99 40M = 1305 240 TACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::92 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:10:106:737 83 seq2 1106 99 35M = 947 -194 ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT <-<<;<<<<<<<<<<<;<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+B7_610:6:143:620:158 147 seq2 1107 99 35M = 1283 211 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA <<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_67:6:198:503:669 147 seq2 1107 99 35M = 912 -230 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA 5<<:<<;<<<<<<<;;<<9<<<<<<<<;<<<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:6:116:464:261 147 seq2 1107 99 35M = 934 -208 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA ;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_73:5:263:557:988 83 seq2 1108 84 35M = 1289 216 AATGATAAAAAGATCAATTCAGCAAGAAGATATAA <<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<;<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:8
+EAS139_19:1:53:463:1132 83 seq2 1109 99 40M = 915 -234 ATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCC ;::;:<<<<<<<<:<<;<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:1528:799 83 seq2 1109 96 35M = 1306 232 ATGATAAAAAGATCAATTCAGCAAGAAGATATAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:7
+EAS54_81:7:324:472:791 83 seq2 1110 89 35M = 1274 199 TGATAAAAAGATCAATTCAGCAAGAAGATATAACC <<<<<<<<:<<<<<<<<<<<<<<:<<<<<<<<<:3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_61:8:4:173:814 147 seq2 1111 99 35M = 1289 213 GATAAAAAGATCAATTCAGCAAGAAGATATAACCA =====================<==========;== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_593:3:303:131:673 83 seq2 1112 99 36M = 947 -201 ATAAAAAGATCAATTCAGCAAGAAGATATAACCATC <;<<<<<<<<:<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:235:899:847 147 seq2 1112 99 35M = 950 -197 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT <7<<<<<<<<:<<<<:<</<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_105:8:179:119:876 83 seq2 1112 60 35M = 917 -230 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT <<<<<<<7<<<<<<;;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_59:2:162:272:415 147 seq2 1112 83 35M = 923 -224 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT =7=======;5==<<6==1==<============= MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_45:6:44:77:1255 83 seq2 1113 99 35M = 955 -193 TAAAAAGATCAATTCAGCAAGAAGATATAACCATC 79998;;;9:;<696<;.<;;<<;<;<;<;;;<8; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:162:257:203 147 seq2 1114 99 35M = 1301 222 AAAAAGATCAATTCAGCAAGAAGATATAACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:55:464:146 83 seq2 1114 99 35M = 1295 216 AAAAAGATCAATTCAGCAAGAAGATATAACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:308:667:658 147 seq2 1116 34 35M = 918 -233 AAAGATCACTTCAGCAATAAGATATAACCATCCTA <9;;;45;&<;&.<5683;84+<;<;+8<;<<8;< MF:i:18 Aq:i:10 NM:i:2 UQ:i:23 H0:i:0 H1:i:0
+EAS56_57:4:98:862:154 147 seq2 1116 99 35M = 1290 209 AAAGATCAATTCAGCAAGAAGATATAACCATCCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<9<:99<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_61:5:263:314:696 83 seq2 1117 99 35M = 953 -199 AAGATCAATTCAGCAAGAAGATATAACCATCCTAC <<;<;:<<<<7<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:83:1456:1854 147 seq2 1117 99 35M = 1275 193 AAGATCAATTCAGCAAGAAGATATAACCATCCTAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:231:815:626 83 seq2 1119 99 35M = 940 -214 GATCAATACAGCAAGAAGATATAACCATCCTACTA '<4%<<<22<<,<<;<<4;<<<<<<<<<<<<<<7< MF:i:18 Aq:i:41 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS114_32:4:246:647:765 83 seq2 1119 99 35M = 937 -217 GATCAATTCAGCAAGAAGATATAACCATCCTACTA 9<+,<<&,39<,<;<<<<<<<&<<<<;0<<3;<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:256:354:173 83 seq2 1121 99 36M = 957 -200 TCAATTCAGCAAGAAGATATAACCATCCTACTAAAT -9<<:9<<;6<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:53:61:31 83 seq2 1122 99 35M = 949 -208 CAATTCAGCAAGAAGATATAACCATCCTACTAAAT 5;;<95<<5<<<<<<<<<<:5;<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:308:509:948 83 seq2 1123 99 36M = 1298 211 AATTCAGCAAGAAGATATAACCATCCTACTAAATAC <9<<<<<<<;<7<<;<<<<<<<;<<<<7<<;2;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:247:900:123 147 seq2 1123 99 35M = 920 -238 AATTCAGCAAGAAGATATAACCATCCTACTAAATA ;;;;.<<4<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:307:113:346 83 seq2 1123 99 35M = 938 -220 AATTCAGCAAGAAGATATAACCATCCTACTAAATA <<<<9<<1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:168:69:249 83 seq2 1125 99 35M = 936 -224 TTCAGCAAGAAGATATAACCATCCTACTAAATACA ;0;<;;<<<<<<<<<<<<<;<<<8<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:54:1886:719 147 seq2 1125 99 35M = 941 -219 TTCAGCAAGAAGATATAACCATCCTACTAAATACA 883777;;:;;;;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:94:273:165 147 seq2 1128 99 35M = 945 -218 AGAAAGAAGATATAACCATCCTACTAAATACATAT ;3&;;:<<:<-<-<<8:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_95:7:155:530:532 147 seq2 1128 99 35M = 1319 226 AGCAAGAAGATATAACCATCCTACTAAATACATAT =================================== MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:61:1885:163 147 seq2 1128 99 40M = 1281 193 AGCAAGAAGATATAACCATCCTACTAAATACATATGCACC <<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<9::::4 MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:193:661:771 83 seq2 1129 99 35M = 952 -212 GCAAGAAGATATAACCATCCTACTAAATACATATG :&<<<<<<<<<<<<<;<<<;<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:75:1503:1399 83 seq2 1130 99 40M = 969 -201 CAAGAAGATATAACCATCCTACTAAATACATATGCACCTA &;;8;<<<;<<<<,6<<70<<7<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:42:28:552 147 seq2 1131 99 35M = 1294 198 AAGAAGATATAACCATCCTACTAAATACATATGCA <<<<<<<<<<<<<<<<<<<<<<<<;<;<3<:;9;8 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:61:631:567 147 seq2 1131 99 35M = 957 -209 AAGAAGATATAACCATCCTACTAAATACATATGCA <<7<<<<<<<<</<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:257:288:731 147 seq2 1131 99 35M = 939 -227 AAGAAGATATAACCATCCTACTAAATACATATGCA <<:<<7<<<<<;<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:214:950:32 83 seq2 1132 99 35M = 947 -220 AGAAGATATAACCATCCTACTAAATACATATGCAC =&==4======:;==6<==:=============== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:1:12:88:200 83 seq2 1133 99 35M = 968 -200 GAAGATATAACCATCCTACTAAATACATATGCACC 9<<;<<<;<;6;<;:<<<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:256:444:399 147 seq2 1133 99 35M = 1289 191 GAAGATATAACCATCCTACTAAATACATATGCACC <<<<<<<<<<<<<<<<<<<<<<<<<;;<<<-;<<8 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:174:753:617 83 seq2 1136 75 35M = 1299 198 GATATAACCATCCTACTAAATACATATGCACCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:115:226:443 83 seq2 1137 99 35M = 1314 212 ATATAACCATCCTACTAAATACATATGCACCTAAC <<<<<<<<<<<<<<<<;<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:26:1867:162 147 seq2 1137 70 35M = 1299 197 ATATAACCATCCTACTAAATACATATGCACCTAAC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78698 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:308:66:538 83 seq2 1138 99 35M = 1321 218 TATAACCATCCTACTAAATACATATGCACCTAACA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:229:543:583 147 seq2 1139 99 35M = 976 -198 ATAACCATCCTACTAAATACATATGCACCTAACAC </<;+5<855;<6<<<<;<<<<<<9<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:17:595:863 147 seq2 1139 89 35M = 1289 185 ATAACCATCCTACTAAATACACATGCACCTAACTC :<4:<<1:<<<9<+<+1<%<7&&9-71<17)7</4 MF:i:18 Aq:i:33 NM:i:2 UQ:i:19 H0:i:0 H1:i:1
+EAS51_62:7:248:17:435 147 seq2 1139 99 35M = 969 -205 ATAACCATCCTACTAAATACATATGCACCTAACAC <1<<88++<:<<:;<;<<<:<<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:35:186:412 83 seq2 1139 99 35M = 1306 202 ATAACCATCCTACTAAATACATATGCACCTAACAC <<<<<<<<4<<<<<:<<<<<<:<<<<<<<<<;;<: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:307:252:632 83 seq2 1142 99 35M = 998 -179 ACCATCCTGCTAAATACATATGCACCTAACACAAG <77<;,5<,9<<<<<<;<<<<<7<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS1_108:7:108:440:208 147 seq2 1142 99 35M = 975 -202 CCCATCCTACTAAATACATATGCACCTAACACAAG +35:486<<4<<<<<<<<<<<-<<<<<7<<)<<<- MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS1_95:7:74:866:49 83 seq2 1143 99 35M = 969 -209 CCAACCTACTAAATACATATGCACCTAACACAAGA :8<&<<<<7<<<<:<<<<<<8<5<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_61:2:66:757:918 83 seq2 1143 99 35M = 985 -193 CCATCCTACTAAATACATATGCACCTAACACAAGA <9<45;<<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:220:733:736 147 seq2 1143 99 35M = 959 -219 CCATCCTACTAAATACATATGCACCTAACACAAGA :;<77;<<9<<<<<9;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:175:289:351 83 seq2 1144 99 35M = 1319 210 CATCCTACTAAATACATATGCACCTAACACAAGAC <<<<<<<<<<;<<<<<<<<;<<<<<<<<<<<9<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:56:155:49 147 seq2 1145 99 35M = 970 -210 ATCCTACTAAATACATATGCACCTAACACAAGACT ;:5;;<5<<<<<<<<<<<<<<<<<<<<<<<<<<<= MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:299:336:613 83 seq2 1145 99 35M = 1293 183 ATCCTACTAAATACATATGCACCTAACACAAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:432:228 83 seq2 1145 99 35M = 967 -213 ATCCTACTAAATACATATGCACCTAACACAAGACT <76<<<:<<<<<<<;<:<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:93:312:331 83 seq2 1145 99 35M = 953 -227 ATCCTACTAAATACATATGCACCTAACACAAGACT <;;:;<6<<<<;<:<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:133:707:886 147 seq2 1146 99 35M = 978 -203 ACCTAATAAATACATATGCACCTAACACAAGACTA %5-2;&6<<<<<;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:9 H0:i:1 H1:i:0
+EAS51_62:3:50:312:219 147 seq2 1146 99 35M = 1288 177 TCCTACTAAATACATATGCACCTAACACAAGACTA <<<<<<<<<<<;<<<<<;<;<<<;<<<<<<;;;;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:82:670:302 147 seq2 1146 99 35M = 973 -208 TCCTACTAAATACATATGCACCTAACACAAGACTA %448<7<<<<<<7<<<<<&<<7<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:47:591:698 83 seq2 1146 99 35M = 1313 202 TCCTACTAAATACATATGCACCTAACACAAGACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:122:430:882 83 seq2 1147 99 35M = 1338 226 CCTACTAAATACATATGCACCTAACACAAGACTAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:46:1566:668 83 seq2 1148 99 35M = 959 -224 CTACTAAATACATATGCACCTAACACAAGACTACC 5<<:<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:92:411:955 147 seq2 1149 99 36M = 979 -206 TACTAAATACATATGCACCTAACACAAGACTACCCA 2<+<<<<9<<<<<<<;+<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:96:419:327 83 seq2 1149 99 35M = 1331 217 TACTAAATACATATGCACCTAACACAAGACTACCC <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;;9<9 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:20:1444:328 147 seq2 1149 99 35M = 993 -191 TACTAAATACATATGCACCTAACACAAGACTACCC 9<3<<==;=<===;=<=====<<===========< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:198:59:675 147 seq2 1150 99 35M = 1315 200 ACTAAATACATATGCACCTAACACAAGACTATCCT <.<<<<<<;<<<<<<<<<<<**<;<;2<;6;&*2& MF:i:18 Aq:i:45 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS54_61:7:114:506:971 83 seq2 1150 99 35M = 986 -199 ACTAAATACATATGCACCTAACACAAGACTACCCA ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:94:356:809 147 seq2 1151 99 35M = 1334 218 CTAAATACATATGCACCTAACACAAGACTACCCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:155:541:234 147 seq2 1151 99 35M = 1319 203 CTAAATACATATGCACCTAACACAAGACTACCCAG <<7<<<<<<<<<<<<<<<4<<<<<<<<<<<;;;08 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:272:328:400 83 seq2 1151 99 35M = 977 -209 CTAAATACATATGCACCTAACACAAGACTACCCAG 4;<<<<<7<;<<<-<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:283:186:707 147 seq2 1154 99 36M = 1321 203 AATACATATGCACCTAACACAAGACTACCCAGATTC <<<<<<<<<<<<<<<<<<<<<<;<<<<<;<;<<<<8 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:86:660:932 83 seq2 1154 99 35M = 1338 219 AATACATATGCACCTAACACAAGACTACCCAGATT ================================9:= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:264:705:89 147 seq2 1155 99 35M = 983 -207 AAACATATGCACCTAACACAAGACTACCCAGATTC <(<2<&<)<<<7<8<<<<<<<<<<.<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS114_32:4:5:396:292 83 seq2 1155 99 35M = 981 -209 ATACATATGCACCTAACACAAGACTACCCAGATTC <:<6<7<:<:;;;<<<;<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:178:342:866 147 seq2 1155 72 35M = 1311 191 ATACATATGCACCTAACACAAGACTACCCAGATTC ;<<<<<;<<<8<<;<;<3<8/<<<<6<<</<8;<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:155:809:543 147 seq2 1156 99 35M = 1352 231 TACATATGCACCTAACACAAGACTACCCAGATTCA <<<<<<<<<<<<<<<<7<;<<<<<<<<<<<1<;<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:119:880:781 83 seq2 1157 99 35M = 1312 190 ACATATGCACCTAACACAAGACTACCCAGATTCAT <<<<<<<<<<<<<<<<<<<<<<<<+<<<<7<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:283:963:234 147 seq2 1157 99 35M = 992 -200 ACATATGCACCTAACACAAGACTACCCAGATTCAT <5<;<;97;;:;<<7<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:28:745:352 83 seq2 1159 99 35M = 1329 205 ATATGCACCTAACACAAGACTACCCAGATTCATAA <<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:147:687:428 147 seq2 1159 99 35M = 998 -196 ATATGCACCTAACACAAGACTACCCAGATTCATAA ;1<''48;4)<<:<<<<;<<6;<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:101:809:776 83 seq2 1160 99 35M = 1326 201 TATGCACCTAACACAAGACTACCCAGATTCATAAA <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:35:538:1882 147 seq2 1160 98 35M = 1337 212 TATGCACCTAACACAAGACTACCCAGATTCATAAA ;);43.50;3;93;;4;3;;;9-7.;*;;966*75 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:41:34:211 83 seq2 1164 99 35M = 980 -219 CACCTAACACAAGACTACCCAGATTCATAAAACAA 7</::<<7<<<<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:2:1422:1820 83 seq2 1164 99 35M = 1004 -195 CACCTAACACAAGACTACCCAGATTCATAAAACAA *4617;;4;1;;79;/7&,4;9;;;7<;;<<<;<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:194:998:663 83 seq2 1165 99 35M = 1002 -198 ACCTAACACAAGACTACCCAGATTCATAAAACAAA ;</<<<7<<<<;<<8<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:10:975:766 83 seq2 1166 99 35M = 959 -242 AATAACACAAGACTACCCAGATTCATAAAACAAAT ++4<<+<+<<<<8<<22;<<<<<2<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:2 UQ:i:24 H0:i:1 H1:i:0
+EAS114_39:6:94:1273:1462 83 seq2 1166 99 35M = 995 -206 CCTAACACAAGACTACCCAGATTCATAAAACAAAT 8.<<<;<:<<<<;<<;;;<<<;<;<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:64:350:174 83 seq2 1166 99 35M = 1000 -201 CCTAACACAAGACTACCCAGATTCATAAAACAAAT 709<<;<;<<<<<<<;7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:166:84:766 83 seq2 1167 99 35M = 990 -212 ATAACACAAGACTACCCAGATTCATAAAACAAATA %8<=+<-<<<</<<<<8<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_108:2:85:580:481 147 seq2 1167 99 35M = 1359 227 CTAACACAAGACTACCCAGATTCATAAAACAAATA <<<<<<<<<<<<<:<<<<<<<<<<<<;<<<<6:<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:191:40:536 83 seq2 1167 66 35M = 977 -225 ATAAAAAAAGACTACCCAGATTCATAAAACAAATA +1<<,<&<<:<.;<7/7<<<<;.<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:27 H0:i:1 H1:i:0
+EAS218_1:2:40:1291:1045 147 seq2 1167 99 35M = 980 -222 CTAACACAAGACTACCCAGATTCATAAAACAAATA *<<<9<<<<<<:0<9<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:221:881:916 83 seq2 1168 96 35M = 1327 194 TAACACAAGACTACCCAGATTCATAAAACAAATAC <<;<<8<<;<<<<<<<;<<<<28<:<8<:;<;;;< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:35:392:2042 147 seq2 1168 99 35M = 1332 199 TAACACAAGACTACCCAGATTCATAAAACNAATAC ======;==========<<=======7=;!<7;;; MF:i:18 Aq:i:72 NM:i:1 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:192:714:341 147 seq2 1170 99 35M = 1346 211 ACACAAGACTACCCAGATTCATAAAACAAATACTA <<9<<<<<<<<<<<8<<<<<;<<;8<<<88;;;;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:189:876:833 147 seq2 1173 99 36M = 1349 212 CAAGACTACCCAGATTCATAAAACAAATACTACTAG <<<<<<<<<<<8<8<<<<<;<;;<<;<<<<<;<<<6 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:299:743:762 147 seq2 1173 99 36M = 1345 208 CAAGACTACCCAGATTCATAAAACAAATACTACTAG <<<;<<<<<<<<<:;<<<.<:<<<<<<<<<<;;;;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:107:252:533 83 seq2 1173 60 35M = 1025 -183 CAAGACTACCCAGATTCATAAAACAAATACTACTA 3<<<<+<<96<<<<<<;<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS1_97:5:154:952:558 147 seq2 1173 99 35M = 1007 -201 AAAGACTACCCAGATTCATAAAACAAATACTACTA %<<9;;<<;;;<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_63:4:184:659:377 147 seq2 1173 99 35M = 992 -216 CAAAACTACCCAGATTCATAAAACAAATACTACTA 1;<+<;<6;66<<;<<<<;;<<<8<<<<8<<;<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+B7_595:6:137:811:130 147 seq2 1175 99 35M = 1351 211 AGACTACCCAGATTCATAAAACAAATACTACTAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:124:367:72 147 seq2 1175 99 35M = 1377 237 AGACTACCCAGATTCATAAAACAAATACTACTAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:8:60:358:494 147 seq2 1179 44 35M = 979 -235 TACCCAGATTCATAAAACAAATACTACTAGACCTA 7<77;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:6 H1:i:36
+EAS114_30:7:319:11:255 147 seq2 1179 92 35M = 1337 193 TACCCAGATTCATAAAACAAATACTACTAGACCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<: MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:10
+B7_610:7:26:749:174 83 seq2 1183 78 35M = 1357 209 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <<<<<<<<<<<<<<<<<<<<<<;<9<8<<<9<;94 MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:6 H1:i:31
+EAS1_103:7:112:578:782 83 seq2 1183 89 35M = 1366 218 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:5 H1:i:25
+EAS1_105:1:234:185:359 83 seq2 1183 46 35M = 1029 -189 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:9
+EAS112_34:4:92:412:435 147 seq2 1184 89 35M = 1003 -216 AGATTCATAAAACAAATACTACTAGACCTAAGAGG <;<52:=,====:=========<============ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:24:105:1046 83 seq2 1184 99 35M = 1377 228 AGATTCATAAAACAAATACTACTAGACCTAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:4 H1:i:2
+EAS1_97:2:128:629:484 147 seq2 1185 96 35M = 1359 209 GATTCATAAAACAAATACTACTAGACCTAAGAGGG <<49<<<<<9<<<<99<<<<<<<<<<<<+<-)7)) MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:4 H1:i:45
+EAS219_FC30151:1:53:140:421 83 seq2 1185 99 35M = 1016 -204 GATTCATAAAACAAATACTACTAGACCTAAGAGGG <<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:99:557:427 147 seq2 1186 99 35M = 1342 191 ATTCATAAAACAAATACTACTAGACCTAAGAGGGA <<<<<<<<<<<<<<<<<<<<<<:<<<<+;<7:8:; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:253:175:31 147 seq2 1187 72 35M = 1008 -214 TTCATAAAACAAATACTACTAGACCTAAGAGGGAT ;+;<;<<<<<<<<9<<9<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:13:701:55 147 seq2 1187 99 36M = 1015 -208 TTCATAAAACAAATACTACTAGACCTAAGAGGGATG 0:+<7<;9<;<<<<<<<3<<<<<;;<<<:<<3<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:220:809:850 147 seq2 1187 60 35M = 986 -236 TTCATAAAACAAATACTACTAGACCTAAGAGGGAT 9+5<;*<<<2:0<<8:<*00<<<:<*<<<<<<<<& MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:30:599:589 147 seq2 1188 99 36M = 1003 -221 TCATAAAACAAATACTACTAGACCTAAGAGGGATGA 90<;<<<<<<<<+<<<;;<;<;<<<<<<<<6<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:35:118:589 83 seq2 1188 99 35M = 999 -224 TCATAAAACAAATACTACTAGACCTAAGAGGGATG 67<<<<<;<<<<<<<:7<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:37:604:389 147 seq2 1188 99 35M = 998 -225 TCATAAAACAAATACTACTAGACCTAAGAGGGATG 00;:;========9========<9========<== MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:168:61:867 83 seq2 1188 99 35M = 997 -226 TCATAAAACAAATACTACTAGACCTAAGAGGGATG ;7<<<<<<<<<<<<<7<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:197:399:319 83 seq2 1189 99 35M = 1012 -212 CAAAAAACAAATACTACTAGACCTAAGAGGGATGA &<+==<<5<<<8<89;;<<<<<<8<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS114_32:5:267:170:250 147 seq2 1189 99 35M = 1377 223 CATAAAACAAATACTACTAGACCTAAGAGGGATGA <<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:174:157:573 83 seq2 1191 99 35M = 1012 -214 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 8<<<<4<<<<<<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:39:956:676 83 seq2 1191 99 35M = 1023 -203 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 899985;;<;:9;;:9<;:9:5;<;;;<;<;<<<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:37:763:1437 83 seq2 1191 99 35M = 994 -232 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 79979;<;<;;;<;;;;;;6:;<:;<:8;<<<<;< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:50:513:882 83 seq2 1192 99 35M = 1031 -196 AAAACAAATACTACTAGACCTAAGAGGGATGAGAA <<<<:<<<<<:<<:<<<<::<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:15:1763:1143 147 seq2 1193 99 35M = 1023 -205 AAACAAATACTACTAGACCTAAGAGGGATGAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:571:366 83 seq2 1194 99 35M = 1002 -227 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<;<<<<<:<<<;<<<;;;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:166:532:438 83 seq2 1194 99 35M = 1386 227 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<<<<<<<<<<<<<<;<<;<<;<<<<;<;:;;<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:309:109:987 83 seq2 1194 99 35M = 1024 -205 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<<<<<:<<;<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:171:527:247 83 seq2 1194 67 35M = 1027 -202 AACAAATGCTACTAGACCTAAGAGGGATGAGAAAT <547*9)&&7+;+<<7<<<;<<<;3<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:8:139:727:808 147 seq2 1195 99 35M = 1363 203 ACAAATACTACTAGACCTAAGAGGGATGAGAAATT <<<<<<<<<<<<<:<;<<<<<<<<9;<;9<6;<<9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:202:275:776 83 seq2 1196 99 36M = 1002 -230 CAAATACTACTAGACCTAAGAGGGATGAGAAATTAC ;<<<<;;<<<<<<<;<<<<<<<;<<<<<<<<<<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:12:484:836 147 seq2 1197 99 35M = 1372 210 AAATACTACTAGACCTAAGAGGGATGAGAAATTAC <<<<<<<<<<<<<<<<<7<:<<<<<<9<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:21:553:57 83 seq2 1197 99 35M = 1358 196 AAATACTACTAGACCTAAGAGGGATGAGAAATTAC <<<<<<<<<<<;;<<<;<<;<<;<<<;;9<;<;<9 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:4:939:2021 83 seq2 1197 99 40M = 1031 -206 AAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAAT ;;;;:8;<5:<<<7/<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:194:378:230 83 seq2 1198 99 35M = 1022 -211 AATACTACTAGACCTAAGAGGGATGAGAAATTACC <<;<8<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:68:242:834 147 seq2 1200 99 36M = 1386 222 TACTACTAGACCTAAGAGGGATGAGAAATTACCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:2:22:471:500 147 seq2 1200 99 35M = 1365 200 TACTACTAGACCTAAGAGGGATGAGAAATTACCTA =======<=<====:<2===9==;=;9;;=;;;;5 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:139:989:144 147 seq2 1201 99 35M = 1387 221 ACTACTAGACCTAAGAGGGATGAGAAATTACCTAA <<<<<<<<<<<<6<<<<<<<<<;<<<<<<<;;<;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:188:20:592 83 seq2 1202 95 35M = 1032 -205 CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT 2<<7;<<<<,;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:189:863:213 83 seq2 1202 99 35M = 1039 -198 CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT 7:<7<<<<44;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:62:561:531 83 seq2 1203 99 35M = 1036 -202 TACTAGACCTAAGAGGGATGAGAAATTACCTAATT <<7<<<<:<8<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:70:1349:1788 83 seq2 1203 99 35M = 1043 -195 TACTAGACCTAAGAGGGATGAGAAATTACCTAATT <7;<<8<74;;<1<<71<;7<;;<;<7<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:197:914:256 147 seq2 1204 97 35M = 1049 -190 ACTAGACCTAAGAGGGATGAGAAATTACCTAATTG <5;<8<5/;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:35:896:1588 83 seq2 1205 91 35M = 1032 -208 CTAGACCTAAGAGGGATGAGAAATTACCTAATTGG 77999:.:<<;<;;;<<;<;<<<<<;<;;<<<<;; MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:43:47:279 147 seq2 1206 99 35M = 1405 234 TAGACCTAAGAGGGATGAGAAGTTACCTAATTGGT <<<<<<<<<<<<<;:<-<<<<<<<<<<<<:;;+7; MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:2:211:954:174 83 seq2 1207 99 35M = 1393 221 AGACCTAAGAGGGATGAGAAATTACCTAATTGGTA ===============================777= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:5:1219:137 83 seq2 1209 99 35M = 1384 210 ACCTAAGAGGGATGAGAAATTACATAATTGGTACA <<<<<<<<<<<<<<<<<<<<<<<(<<<<<<:9<;= MF:i:18 Aq:i:45 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS56_57:7:33:954:724 83 seq2 1210 97 35M = 1049 -196 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA ;<;<;<<-7;<<;<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:176:402:458 147 seq2 1210 99 36M = 1376 202 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;;<; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:81:687:1379 147 seq2 1210 99 35M = 1366 191 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:45:239:851 83 seq2 1211 61 35M = 1023 -223 CTAAGAGGGATGAGAAATTACCTAATTGGTACAAT *2*0<<<<<<<<<<<<<<<<9<<3<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_65:5:312:985:871 147 seq2 1212 99 35M = 1369 192 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<9<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:38:557:1441 147 seq2 1212 99 35M = 1381 204 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:88:465:1877 147 seq2 1212 99 35M = 1055 -192 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<:<<<<<<<<:<<<<<<<<<<<<7;<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:149:123:265 147 seq2 1213 99 35M = 1395 217 AAGAGGGATGAGAAATTACCTAATTGGTACAATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:47:1791:444 83 seq2 1213 74 35M = 1041 -207 AAGAGGGATGAGAAATTACCTAATTGGTACAATGT 978879;:;;<:;;<<;:<9<<<<;6;;;;<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+EAS51_62:3:68:996:104 147 seq2 1214 70 35M = 1041 -208 AGAGGGATGAGAAATTACCTAATTGGTACAATGTA <1<8<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_593:2:68:140:542 83 seq2 1217 95 36M = 1398 217 GGGATGAGAAATTACCTAATTGGTACAATGTACAAT <<<8;<<;<<<<<;<<;<<<<<8;<-<8<82;;;-8 MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+EAS188_7:7:67:719:786 147 seq2 1218 43 35M = 1383 200 GGATGAGAAATTACCTAATTGGTACACTGTACAAT ;;<<<<<<&<<:13&<1<<<:<<<)/&/))<'6-< MF:i:18 Aq:i:13 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_108:5:321:712:224 83 seq2 1220 58 35M = 1051 -204 ATGAGAAATTACCTAATTGGTACAATGTACAATAT =;===7;===7=========;=:;=========;= MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_26:4:100:238:596 147 seq2 1220 56 35M = 1403 218 ATGAGAAATTACCTAATTGGTACAATGTACAATAT ======9=====;=======5===;====/=;=== MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:13
+EAS51_62:7:312:236:655 147 seq2 1222 99 35M = 1412 225 GAGAAATTACCTAATTGGTACAATGTACAATATTC <<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS56_63:6:102:816:260 147 seq2 1225 99 35M = 1049 -211 AAATTACCTAATTGGTACAATGTACAATATTCTGA <<<<<<::<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:34:144:868 147 seq2 1226 76 35M = 1412 221 AATTACCTAATTGGTACAATGTACAATATTCTGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:215:516:299 83 seq2 1226 99 35M = 1406 215 AATTACCTAATTGGTACAATGTACAATATTCTGAT <<<<<<;<<<<;;;;<;;<<<<;<<9<;<<1;7/; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:81:12:1231 147 seq2 1228 99 35M = 1391 198 TTACCTAATTGGTACAATGTACAATATTCTGATGA <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<4<<6 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:30:644:942 147 seq2 1229 83 35M = 1045 -219 TACCTAATTGGTACAATGTACAATATTCTGATGAT 85%+;<<9;<9<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:41:519:609 147 seq2 1229 99 35M = 1401 207 TACCTAATTGGTACAATGGACAATATTCTGATGAT 1<<<<<<<<<<<<<<<4<-:<+6<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+B7_591:7:116:814:89 83 seq2 1231 99 36M = 1408 213 CCTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<<<<<<<<<<<<<<<<<<:<<<<;<<;<<66< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:169:714:644 147 seq2 1231 99 35M = 1437 241 CCTAATTGGTACAATGTACAATATTCTGATGATGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:73:420:812 83 seq2 1232 66 35M = 1414 217 CTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<1<<<<::1<7<:<96<9<:<<:4<70:11< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:17:1179:393 83 seq2 1232 99 35M = 1412 215 CTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:4< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:118:829:36 83 seq2 1233 99 35M = 1417 219 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<<<<<<<:<2<<<<<<:<<<<<<<<<<<<71;< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:125:875:553 147 seq2 1233 99 36M = 1075 -194 TAATTGGTACAATGTACAATATTCTGATGATGGTTA -;<;:;<<;6<<<<<<6<;<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_32:4:7:282:424 83 seq2 1233 83 35M = 1397 199 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<3<<<9<<<<3<<<<<9<<<9,<;;9;&*;3,. MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:447:488 147 seq2 1233 99 35M = 1412 214 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:66:891:294 83 seq2 1233 99 35M = 1057 -211 TAATTGGTACAATGTACAATATTCTGATGATGGTT :<<5;;<<<4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:8:72:44:435 83 seq2 1235 76 35M = 1392 192 ATTGGTACAATGTACAATATTCTGATGATGGTTAA <<<<<<<<<<<2;<;<<;<<<;<<8<82<;22<8& MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS139_19:4:18:1335:1514 147 seq2 1235 99 40M = 1063 -212 ATTGGTACAATGTACAATATTCTGATGATGGTTACACTAA ::/::<<;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:72:1288:1211 147 seq2 1235 84 35M = 1052 -218 ATTGGTACAATGTACAATATTCTGATGATGGTTAC <);<:<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:200:263:280 83 seq2 1236 99 35M = 1078 -193 TTGGTACAATGTACAATATTCTGATGATGGTTACA )<<<8<:<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:68:440:424 147 seq2 1237 99 35M = 1060 -212 TGGTACAATGTACAATATTCTGATGATGGTTACAC <<2<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:255:441:47 147 seq2 1237 99 35M = 1072 -200 TGGTACAATGTACAATATTCTGATGATGGTTACAC ;;7<;:<<<<<<<<<<;<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:174:557:872 147 seq2 1237 99 35M = 1423 221 TGGTACAATGTACAATATTCTGATGATGGTTACAC <<<<<<<<<<<<<:<<<<<<<7<<;<<6:<<2117 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_64:3:255:45:399 147 seq2 1238 99 35M = 1404 201 GGTACAATGTACAATATTCTGATGATGGTTACACT <<3<8<<8<0<<;<<<0<<<</+8<611<<;71;7 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:264:157:150 147 seq2 1238 30 35M = 1054 -219 GGAAAAATGGACAAGATTCTGATGAGGGTTACACT .3%:+<<*;*<2<<1<1*,*<<7<<+<<<&<<<<< MF:i:-126 Aq:i:30 NM:i:3 UQ:i:35 H0:i:0 H1:i:0
+EAS139_19:5:95:944:247 83 seq2 1238 99 40M = 1424 226 GGTACAATGTACAATATTCTGATGATGGTTACACTAAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:;::: MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:301:161:195 147 seq2 1239 75 35M = 1076 -198 GTACAATGTACAATATTCTGATGATGGTTACACTA ''6%6<6<<<4<<<<<<<<)<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:141:7:963 83 seq2 1240 85 36M = 1061 -215 TACAATGTACAATATTCTGATGATGGTTACACTAAA 95+<<9<<5<;;<<;<<;'<<<<<;<<<7<9<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:6:76:282:1668 83 seq2 1240 99 35M = 1401 196 TACAATGTACAATATTCTGATGATGGTTACACTAA <<<<<<<<<<<<<<<<<<;<<;<<<<<<;<;<<<8 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:64:199:1288 147 seq2 1240 77 35M = 1079 -196 TACAATGTACAATATTCTGATGATGGTTACACTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:49:911:980 147 seq2 1241 99 35M = 1434 228 ACAATGTACAATATTCTGATGATGGTTACACTAAA <<<<<<<<<<;<<<<<<<8<<<<;<;<<88-<;33 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:66:1046:167 147 seq2 1241 99 35M = 1060 -216 ACAATGTACAATATTCTGATGATGGTTACACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:303:542:924 83 seq2 1242 76 35M = 1083 -194 CAATGTACAATATTCTGATGATGGTTACACTAAAA +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:2:79:554:354 147 seq2 1242 63 35M = 1082 -195 CAATGTACAATATTCTGATGATGGTTACACTAAAA 98988;7;;;;:;;;;;;;;;;:;;;:;;;;;9;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:248:122:558 147 seq2 1243 99 35M = 1436 228 AATGTACAATATTCTGATGATGGTTACACTAAAAG <<<<:<<<<<<<<<<<<<;<<<<:<6:4<<::6:6 MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:109:22:383 83 seq2 1244 99 35M = 1071 -208 ATGTACAATATTCTGATGATGGTTACACTAAAAGC <;9;<8<<<<<<;<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:43:1229:1855 83 seq2 1244 99 35M = 1074 -205 ATGTACAATATTCTGATGATGGTTACACTAAAAGC 8<<<<;8<<<;;5<<28<<<<<<<<<<<<7;;<<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:74:656:272 83 seq2 1245 99 35M = 1088 -192 TGTACAATATTCTGATGATGGTTACACTAAAAGCC ;;;</<<<<<5;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_65:7:118:775:467 83 seq2 1245 99 35M = 1075 -205 TGTACAATATTCTGATGATGGTTACACTAAAAGCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_593:7:15:244:876 83 seq2 1246 43 36M = 1440 230 GTACAATATTCTGATGATGGTTACACTAAAAGCCCA <<<<<<;<<<<<<<<;<<;;;<<<<<:<<<9;<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:63:28:1549 147 seq2 1247 77 35M = 1439 227 TACAATATTCTGATGATGGTTACACTAAAAGCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7;<<<<7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:310:800:761 83 seq2 1249 99 35M = 1055 -229 CAATATTCTGATGATGGTTACACTAAAAGCCCATA 1<<:<:<:<<<<:<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:978:1296 83 seq2 1249 90 35M = 1104 -180 CAATATTCTGATGATGGTTACACTAAAAGCCCATA 77177;9;2:;;:;;(;;9;<;;;;:;;;:7;<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:8:26:242:35 147 seq2 1251 99 35M = 1084 -202 ATATTTTGATGATGGTTACACTAAAAGCCCATACT <<<77!!7<;<<<;;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:0 H0:i:1 H1:i:8
+EAS114_45:7:6:758:988 83 seq2 1253 99 35M = 1087 -201 ATTCTGATGATGGTTACACTAAAAGCCCATACTTT 3-7*73;;399:9;9;7<-(<;;<;;:;9::;;7; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:315:412:921 83 seq2 1254 99 35M = 1424 205 TTCTGATGATGGTTACACTACAAGCCCATACTGTA <;<;<<<<<<<;<<<<<<<<8<<<;<<:<<;;+<8 MF:i:18 Aq:i:45 NM:i:2 UQ:i:33 H0:i:0 H1:i:1
+EAS114_30:3:215:840:760 147 seq2 1256 99 35M = 1416 195 CTGATGATGGTTACACTAAAAGCCCATACTTTCCT <<<<<<<<<<<<<<<;<<<88<+<<:<;3585,+: MF:i:18 Aq:i:66 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS1_95:5:284:212:932 147 seq2 1257 10 35M = 1063 -229 TGATGATGGTTACGCTAAAAGTCCATGCTTTACTG 82%<8:<-:<<:**:<-<<8<)/2/<:/<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:42 H0:i:0 H1:i:0
+EAS1_97:4:290:121:79 147 seq2 1257 99 35M = 1420 198 TGATGATGGTTACACTAAAAGCCCATACTTTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<7;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:88:54:900 83 seq2 1257 68 35M = 1069 -223 TGATGATGGTTACACTAAAAGCCCATACTTCACTG ============;=================;9=== MF:i:18 Aq:i:19 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS188_7:3:100:735:530 83 seq2 1257 99 35M = 1058 -234 TGATGATGGTTACACTAAAAGCCCATACTTTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:32:562:1695 147 seq2 1258 76 35M = 1085 -208 GATGATGGTTACACTAAAAGCCCATACTTTACTGC :5:::<88/<:<<<<<<<<<7<9<<&<959<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:173:627:465 147 seq2 1260 99 36M = 1444 220 TGATGGTTACACTAAAAGCCCATACTTTACTGCTAC <<<<<<<<<<<<<<<<<<<<<<<;<<<<<2;;4;;7 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_95:1:77:589:741 83 seq2 1263 99 35M = 1078 -220 TGGTTACACTAAAAGCCCATACTTTACTGCTACTC 8=;;==606;========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:27:228:31 147 seq2 1264 99 35M = 1082 -217 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA 99;;;<<<<<<:<<;<;<<;<<<<;<<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:54:695:952 147 seq2 1264 99 35M = 1076 -223 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA 277%<9<4)<<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:300:622:86 83 seq2 1264 99 35M = 1102 -197 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA <:<<<:<6;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:71:62:254 147 seq2 1264 99 35M = 1438 209 GGTTACACTAAAAGCCCATACTTTCCTGCTACTCA <<<<<<7<<<<7<<<<<3<<<<<<&<<.<<::<:% MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_28:1:168:609:646 83 seq2 1264 99 36M = 1436 208 GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA <<<<<<<<<<<;<<<<<:<8<<<<;<<<<<4<<<9< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:84:92:1246 147 seq2 1265 99 35M = 1437 207 GTTACACTAAAAGCCCATACTTTACTGCTACTCAA <<<<<<<<<<<<<<<<5<:<<5<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:310:193:629 83 seq2 1267 99 36M = 1103 -200 TACACTAAAAGCCCATACTTTACTGCTACTCAATAT 9<9<6;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:111:379:700 73 seq2 1268 0 35M = 1268 0 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT 7<<:<<<<02<<6&<</<<</+9/98*<966/3/< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:111:379:700 133 seq2 1268 0 * = 1268 0 CGCACTGGCAATATTTGTGTGTTTACTTTTTTGCA :1+&;;6;:;918;);;):,19.9:).):::.&3( MF:i:-64
+EAS114_30:6:137:741:866 147 seq2 1268 99 35M = 1429 196 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT <<<<8<<;;;<<<<;<<<;;;<;4<<8;<<;%<8; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:23:1126:1886 147 seq2 1268 99 35M = 1094 -209 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT 5*.:.5<<::<<<<<<<<:5<<<<<<<<<<:2<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:21:423:169 83 seq2 1270 99 35M = 1468 233 ACTAAAAGCCCATACTTTACTGCTACTCAATATAT <<<<<;<<<<<<;<<<<<;;<<<<<<<<9+:5<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:110:984:98 147 seq2 1270 99 36M = 1092 -214 ACTAAAACCCCATACTTTACTGCTACTCAATATATC :81<<<<+;;8<+<8<<<<<;<<<8;<<<<<<<<8; MF:i:18 Aq:i:70 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS219_FC30151:5:54:1351:910 83 seq2 1270 99 35M = 1448 213 ACTAAAAGCCCATACTTTACTGCTACTCAATATAT <<<<<<8<<<<<<<<<<<<<<<<<<<<<<18<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:237:855:581 147 seq2 1271 87 35M = 1105 -201 CTAAACGCCCATACTTTACTGCTACTCAATATATC /+<<<&)2;66;/;;+<;;3133<3<3;9;<999< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_59:8:80:542:549 147 seq2 1271 99 35M = 1443 207 CTAAAAGCCCATACTTTACTGCTACTCAATATATC <<<<<<<<;<<<<<<<<:<<<<-<;;<;7<;3;9; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:7:1347:375 147 seq2 1271 99 35M = 1436 200 CTAAAAGCCCATACTTTACTGCTACTCAATATATC ;;;;;;;;;;;;;;;;;;;;9;;;8;;;;;97777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:191:540:493 83 seq2 1273 99 35M = 1432 194 AAAAGCCCATACTTTACTGCTACTCAATATATCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:324:472:791 147 seq2 1274 89 35M = 1110 -199 AAAGCCAATACTTTACTGCTACTCAATATATCCAT <<.)5*&;;11<<<,5<33:-<<6<<<<:<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS220_1:8:83:1456:1854 83 seq2 1275 99 35M = 1117 -193 AAGCCCATACTTTACTGCTACTCAATATATCCATG <<67<:<8<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:290:247:509 147 seq2 1276 99 35M = 1450 209 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<<<<<<<<<4<<<<<<92<;;;<;96;19 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:90:629:652 83 seq2 1276 99 35M = 1456 215 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<<<<<<<<<<<<<<<<<:<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:39:1671:1928 147 seq2 1276 99 35M = 1453 212 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<;<<<<;<<<<<4<<<;3<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:128:584:952 83 seq2 1277 99 35M = 1101 -211 GCCCATACTTTACTGCTACTCAATATATCCATGTA 7<;9;0:<<<:<<:<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:28:979:519 147 seq2 1278 99 35M = 1439 196 CCCATACTTTACTGCTACTCAATATATCCATGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:219:40:833 83 seq2 1278 99 35M = 1094 -219 CCCATACTTTACTGCTACTCAATATATCCATGTAA <<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:289:207:323 147 seq2 1279 99 35M = 1462 218 CCATACTTTACTGCTACTCAATATATCCATGTAAC <<<:<<<<<:<<<<<<<<<<;<<899<<13)939; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:45:758:616 147 seq2 1280 99 35M = 1473 228 CATACTTTACTGCTACTCAATATATCCATGTAACA <<<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<;;< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:42:804:114 147 seq2 1281 99 35M = 1452 206 ATACTTTACTGCTACTCAATATATCCATGTAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;;<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:61:1885:163 83 seq2 1281 99 40M = 1128 -193 ATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG ;:;;;;<<8<<:<<:<;<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:282:962:46 83 seq2 1282 99 35M = 1437 190 TACTTTACTGCTACTCAATATATCCATGTAACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:143:620:158 83 seq2 1283 99 35M = 1107 -211 ACTTTACTGCTACTCAATATATCCATGTAACAAAT <4;<;<;<;6<<7<;<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:50:312:219 83 seq2 1288 99 35M = 1146 -177 ACTGCTACTCAATATATCCATGTAACAAATCTGCG <,;83:<::6<<<<<<<;:<;<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:256:444:399 83 seq2 1289 99 35M = 1133 -191 CTGCTACTCAATATATCCATGTAACAAATCTGCGC ;+549<:<.<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:17:595:863 83 seq2 1289 89 35M = 1139 -185 AAGCTACTCAATATATCCATGTAACAAATCTGCGC ))55))+2&<<,:5<,0657<<<<:<:<:<<<<<< MF:i:18 Aq:i:33 NM:i:2 UQ:i:16 H0:i:1 H1:i:0
+EAS1_105:6:23:885:274 147 seq2 1289 99 35M = 1089 -235 CTACTACTCAATATATCCATGTAACAAATCTGCGC 2+*27==;;==<<.;:<=<=<============== MF:i:18 Aq:i:51 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_61:8:4:173:814 83 seq2 1289 99 35M = 1111 -213 CTGCTACTCAATATATCCATGTAACAAATCTGCGC <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:263:557:988 147 seq2 1289 84 35M = 1108 -216 CTGCTACTCAATATATCCATGTAACAAATCTGCGC 1-41:<15+<<<<<<599<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:2:326:153:231 147 seq2 1290 43 35M = 1477 222 TGCTACTCAATATATCCATGTAACAAATCTGCGCT <<<<<<<<<9<<<<<<<<<,<<<<<<8<<8.;.;4 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:98:862:154 83 seq2 1290 99 35M = 1116 -209 TGCTACTCAATATATCCATGTAACAAATCTGCGCT 856:;7<:<<9<<<9<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:6:529:366 147 seq2 1291 99 35M = 1103 -223 GCTACTCAATATATCCATGTAACAAATCTGCGCTT 9;8;8<:<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:299:336:613 147 seq2 1293 99 35M = 1145 -183 TACTCAATATATCCATGTAACAAATCTGCGCTTGT 1;4(+<<5<4<1<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_597:2:42:28:552 83 seq2 1294 99 35M = 1131 -198 ACTCAATATATCCATGTAACAAATCTGCGCTTGTA </8:<<:<<<;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_39:3:55:464:146 147 seq2 1295 99 35M = 1114 -216 CTCAATATATCCATGTAACAAATCTGCGCTTGTAC ;(;;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_67:6:109:953:668 83 seq2 1297 99 35M = 1485 223 CAATATATCCATGTAACAAATCTGCGCTTGTACTT ;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<8<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:1:82:946:392 147 seq2 1297 99 40M = 1493 236 CAATATATCCATGTAACAAATCTGCGCTTGTACTTCAAAA <<<<<<<<<<<<<<<<<<<<<<<<<8<<<8<<8<<:4488 MF:i:18 Aq:i:74 NM:i:1 UQ:i:19 H0:i:1 H1:i:0
+EAS114_28:3:308:509:948 147 seq2 1298 99 36M = 1123 -211 AATATATCCATGTAACAAATCTGCGCTTGTACTTCT ;;+;;;.8<<;;;<<<<<<<<<<<<<8<<<<<;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:174:753:617 147 seq2 1299 75 35M = 1136 -198 ATATATCCATGTAACAAATCTGCGCTTGTACTTCT <;<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:26:1867:162 83 seq2 1299 70 35M = 1137 -197 ATATATCCATGTAACAAATCTGCGCTTGTACTTCT 97999:;<<9;;<:<<;;;<;;<<<<<<<;;<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:162:257:203 83 seq2 1301 99 35M = 1114 -222 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA <;<;:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:62:841:1994 89 seq2 1301 70 35M = 1301 -35 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA 87878;;6:;;:<<<<:<:;;;<;<<<;<;;<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:62:841:1994 149 seq2 1301 0 * = 1301 35 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS139_19:7:44:1807:833 83 seq2 1301 99 40M = 1449 188 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<<<<<<<<<<<<<<<<<<;<;<<<;<<9<<<<<89;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:280:607:113 147 seq2 1303 99 35M = 1468 200 ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT ===================;===;=====<=7=9: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:260:147:818 147 seq2 1303 82 35M = 1497 229 ATCCATGTAACAAATCTGCGCTTTTACTTCTAAAT <<<<<<3<<<<<;<<<<)<1<<<&<7<<<;<4/9< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_71:7:194:867:616 83 seq2 1303 99 34M = 1481 213 ATCCATGTAACAAATCTGCGCTTGTACTTCTATT <8<<<<<<<<<<<8<<4<<<<<<8<<3<<5<&(+ MF:i:18 Aq:i:67 NM:i:2 UQ:i:23 H0:i:1 H1:i:0
+EAS139_19:7:85:262:751 83 seq2 1305 99 40M = 1105 -240 CCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAC 22;99;<<8<<<<<<<;<;<<<<<;<<;<<<<<<<<<<<+ MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_81:6:35:186:412 147 seq2 1306 99 35M = 1139 -202 CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<4:6<;<&<:4<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:1528:799 147 seq2 1306 96 35M = 1109 -232 CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:124:978:501 147 seq2 1307 99 36M = 1499 228 ATGTAACAAATCTGCGCTTGTACTTCTAAATCTATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:88:866:774 147 seq2 1307 99 35M = 1478 206 ATGTAACAAATCTGCTCTTGTACTTCTAAATCTAT <<<;<<<<<;<<<<<<<<<<<<<<<<<68<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:6:4:1131:104 147 seq2 1307 99 35M = 1487 215 ATGTAACAAATCTGCGCTTGTACTTCTAAATCTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:178:342:866 83 seq2 1311 72 35M = 1155 -191 AACAAATCTGCGCTTGTACTTCTAAATCTATAAAA <<9<<<&;;<<<<77<;<<<5;:<<<:<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:119:880:781 147 seq2 1312 99 35M = 1157 -190 ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA ;8<<;<<<<:<84<<<<:<<<<<<<<<<<<<5<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_591:2:46:220:58 83 seq2 1313 99 36M = 1483 206 CAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<:<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:47:591:698 147 seq2 1313 99 35M = 1146 -202 CAAATCTGCGCTTGTACTTCTAAATCTATAACAAA 7;;;;:<<:<:<<<<<7<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:1:115:226:443 147 seq2 1314 99 35M = 1137 -212 AAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA <<;;<;<<<<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:198:59:675 83 seq2 1315 99 35M = 1150 -200 AATCTGCGCTTGTACTTCTAAATCTATAACAAAAT <<<<<4<4<:<<<;7<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_3:2:76:1729:813 147 seq2 1317 99 35M = 1506 224 TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:147:360:141 83 seq2 1319 47 35M = 1501 218 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:7:155:530:532 83 seq2 1319 99 35M = 1128 -226 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA :<<<><<8<<<<<><<<<<><<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_62:4:308:614:911 83 seq2 1319 90 35M = 1493 209 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<8< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_65:3:155:541:234 83 seq2 1319 99 35M = 1151 -203 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 78;<7<<<<<<<<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:175:289:351 147 seq2 1319 99 35M = 1144 -210 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 9;;:+<<<<<;<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:283:186:707 83 seq2 1321 99 36M = 1154 -203 CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT 889;<7;<7<<7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:3:308:66:538 147 seq2 1321 99 35M = 1138 -218 CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT 996999;<9;<:<<<<<:<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:5:11:555:330 147 seq2 1321 99 35M = 1492 206 CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<4<;< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:84:411:336 73 seq2 1322 75 35M * 0 0 GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT <<<;<<<;<<<<<<<<<<<<:<<;<<<<<<;8<;< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:52:1278:1478 147 seq2 1322 47 35M = 1513 226 GCTTGTACTTCTAAATCTATAACAAAATTAAAATT <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<9<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_53:3:101:809:776 147 seq2 1326 99 35M = 1160 -201 GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC <<<-<;7;<<<<:;<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:221:881:916 147 seq2 1327 96 35M = 1168 -194 TAATTCTAAATCTAGAACAAAATTAAAATTTAACA 44%-4(5<;9/,:<68:1<:8<:<<84;<<<<<;< MF:i:18 Aq:i:24 NM:i:3 UQ:i:41 H0:i:0 H1:i:0
+EAS1_105:1:28:745:352 147 seq2 1329 99 35M = 1159 -205 CTTCTAAATCTATAACAAAATTAAAATTTAACAAA 4;;*;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_45:2:23:1754:796 83 seq2 1329 99 35M = 1488 194 CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA ;<<;<;<;<;<;<<;;;;;<<<<;;<<<<<97999 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:96:419:327 147 seq2 1331 99 35M = 1149 -217 TCTAAATCTATAACAAAATTAAAATTTAACAAAAG ;1<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_97:4:274:287:423 147 seq2 1332 75 35M = 1515 218 CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:35:392:2042 83 seq2 1332 99 35M = 1168 -199 ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT +<<<<</<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:2:94:356:809 83 seq2 1334 99 35M = 1151 -218 AAATCTATAACAAAATTAAAATTTAACAAAAGTAA <<<<3<<<<;;<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS114_30:7:319:11:255 83 seq2 1337 92 35M = 1179 -193 TCTATAAAAAAATTAAAATTTAACAAAAGTAAATA ;8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:35:538:1882 83 seq2 1337 98 35M = 1160 -212 TCTATAACAAAATTAAAATTTAACAAAAGTAAATA 73797;;3<;;<6;;<<<;8:;:;<;:<:;<<;;; MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS51_66:1:64:182:741 153 seq2 1338 10 35M * 0 0 AAAAAAACAAATTAAACTCTAACAAAAGTAAATAA (+;1&(9*%0<*(*&<*5,/+<,&<&<<6<<<<<< MF:i:32 Aq:i:10 NM:i:6 UQ:i:63 H0:i:0 H1:i:0
+EAS54_61:4:86:660:932 147 seq2 1338 99 35M = 1154 -219 ATATAAAAAAATTAAAATTTAACAAAAGTAAATAA &<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_53:8:122:430:882 147 seq2 1338 99 35M = 1147 -226 CTATAAAAAAATTAAAATTTAACAAAAGTAAATAA 0<<:<<<<<<<:3<<<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:99:557:427 83 seq2 1342 99 35M = 1186 -191 AACAAAATTAAAATTTAACAAAAGTAAATAAAACA <<-<<<<9<<<<<:<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+B7_593:5:299:743:762 83 seq2 1345 99 36M = 1173 -208 AAAATTAAAATTTAACAAAAGTAAATAAAACACATA ;<<<1<<<<<+<;<;7<<;<<<<<<<<<;<<;;<<7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:303:428:326 83 seq2 1345 74 35M = 1515 205 AAAATTAAAATTTAACAAAAGTAAATAAAACACAT <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:192:714:341 83 seq2 1346 99 35M = 1170 -211 AAATTAAAATTTAACAAAAGTAAATAAAACACATA <<<3;<<<<9:<<</<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:189:876:833 83 seq2 1349 99 36M = 1173 -212 TTAAAATTTAACAAAAGTAAATAAAACACATAGCTA 7;<<<<:;;<</<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:37:79:581 147 seq2 1349 68 35M = 1533 219 TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT <>4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1> MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_19:2:82:154:1333 83 seq2 1349 77 40M = 1511 202 TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;:;: MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS188_7:1:290:286:763 83 seq2 1349 75 35M = 1515 201 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<7<<<<<<<<<<<<<<<8<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:3:248:1491 73 seq2 1349 99 35M * 0 0 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8:< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:6:1064:1805 83 seq2 1350 99 35M = 1502 187 TAAAATTTAACAAAAGTAAATAAAACACATAGCTA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:137:811:130 83 seq2 1351 99 35M = 1175 -211 AAAATTTAACAAAAGTAAATAAAACACATAGCTAA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:155:809:543 83 seq2 1352 99 35M = 1156 -231 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<+0<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:41:468:459 83 seq2 1352 75 35M = 1513 196 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:31:622:216 73 seq2 1354 99 35M * 0 0 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<96<7 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:105:854:975 147 seq2 1354 71 35M = 1523 202 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<7:<;;;;5 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:26:749:174 147 seq2 1357 78 35M = 1183 -209 TAACAAAAGTAAATAAAACACATAGCTAAAACTAA (<<)<<<<6<<<<<<<<<<&:<3<<<6<<<)<:<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:21:553:57 147 seq2 1358 99 35M = 1197 -196 AACAAAAGTAAATAAAACACATAGCTAAAACTAAA <<+<<<<<<<<<;<<<<8<<<<<<8<<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:128:629:484 83 seq2 1359 96 35M = 1185 -209 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA :(::<</*;<<99<<<-<;<<<<4<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS1_108:2:85:580:481 83 seq2 1359 99 35M = 1167 -227 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA =)====77========8=3====3=========== MF:i:18 Aq:i:71 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+B7_589:8:139:727:808 83 seq2 1363 99 35M = 1195 -203 AAGTAAATAAAACACATAGCTAAAACTAAAAAAGC <<;<<<<<<<<<;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:2:22:471:500 83 seq2 1365 99 35M = 1200 -200 GTAAATAAAACACATAGCTAAAACTAAAAAAGCAA =9===0====;=77<==8;====;=========== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:112:578:782 147 seq2 1366 89 35M = 1183 -218 AAAATAAAACACATAGCTAAAACTAAAAAAGCAAA +<<<%<<<<6<;<<<<6:<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS221_3:4:81:687:1379 83 seq2 1366 99 35M = 1210 -191 TAAATAAAACACATAGCTAAAACTAAAAAAGCAAA <<<<<<<<<<<:<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:320:20:250 83 seq2 1367 77 35M = 1532 200 AAATAAAACACATAGCTAAAACTAAAAAAGCAAAA <<<<<<<<<<<<<<<<<;<<<<<<<<<;+:<;<<3 MF:i:18 Aq:i:6 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:312:985:871 83 seq2 1369 99 35M = 1212 -192 ATAAAACACATAGCTAAAACTAAAAAAGCAAAAAC <8<<<<.<.<<<<:<<<<<.<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:12:484:836 83 seq2 1372 99 35M = 1197 -210 AAACACATAGCTAAAACTAAAAAAGCAAAAACAAA <<<<</<4<<&7<<<<;<<<<<<<<<<<<<1<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:176:402:458 83 seq2 1376 99 36M = 1210 -202 AAATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA </<+<4&;<<<<7<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS139_11:7:50:1229:1313 147 seq2 1376 77 35M = 1528 187 ACATAGCTAAAACTAAAAAAGCAAAAACAAAAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:124:367:72 83 seq2 1377 99 35M = 1175 -237 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA ,<<<8,<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:267:170:250 83 seq2 1377 99 35M = 1189 -223 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA -<;<5-:<<<<;<<<<<<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:24:105:1046 147 seq2 1377 99 35M = 1184 -228 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +<<<</<<<<<.<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:38:557:1441 83 seq2 1381 99 35M = 1212 -204 GATAAAAATAAAAAAGCAAAAACAAAAACTATGCT <&<<<<<,<<<<<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:2 UQ:i:16 H0:i:0 H1:i:1
+EAS188_7:7:67:719:786 83 seq2 1383 43 35M = 1218 -200 TAAAAAAAAAAAAGCAAAAACAAAAACTATGCTAA $<<;<-1<<<8<<*&<;<;,<<3<<<<33<<<33< MF:i:18 Aq:i:13 NM:i:2 UQ:i:28 H0:i:1 H1:i:0
+EAS114_39:2:5:1219:137 147 seq2 1384 99 35M = 1209 -210 AAAACTAAAAAAGCAAAAACAAAAACTATGCTAAG <<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:68:242:834 83 seq2 1386 99 36M = 1200 -222 AAATAAAAAAGCAAAAACAAAAACTATGCTAAGTAT <<68<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS51_66:3:166:532:438 147 seq2 1386 99 35M = 1194 -227 AACTAAAAAAGCAAAAACAAAAACTATGCTAAGTA <<&7<<<<<<<+<<<<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:139:989:144 83 seq2 1387 99 35M = 1201 -221 ACTAAAAAAGCAAAAACAAAAACTATGCTAAGTAT <&<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:81:12:1231 83 seq2 1391 99 35M = 1228 -198 AAAAAGCAAAAACAAAAACTATGCTAAGTATTGGT <<<<<<<7<<<<<<<5<'<6/<<<5<<<<<<2<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:8:72:44:435 147 seq2 1392 76 35M = 1235 -192 AAAAGCAAAAACAAAAACTATGCTAAGTATTGGTA <<<<;7;<<<<;<<<<<<<<<<;<<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:211:954:174 147 seq2 1393 99 35M = 1207 -221 AAAGAAAAAACAAAAACTATGCTAAGTATTGGTAA ====*=====6======================== MF:i:18 Aq:i:75 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+B7_595:7:149:123:265 83 seq2 1395 99 35M = 1213 -217 AGCAAAAACAAAAACTATGCTAAGTATTGGTAAAG <;&<<<<<:<<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:7:282:424 147 seq2 1397 83 35M = 1233 -199 CAAAAACAAAAACTATGCTAAGTATTGTTAAAGAT 1<<<<<9<<<<<31<77;;;;7<3<<2+;<3<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+B7_593:2:68:140:542 147 seq2 1398 95 36M = 1217 -217 AAAAACAAAAACTATGCTAAGTATTGGTAAAGATGT ;;<<;7<<<<<<:<<<:<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:76:282:1668 147 seq2 1401 99 35M = 1240 -196 AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG <<<<<:<<<8<8<<<<<::<<<<7<<<<<<2<<<8 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:41:519:609 83 seq2 1401 99 35M = 1229 -207 AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG <4;<;<<<<<<<<;4:<<;<<<<<<<<<<<;<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:100:238:596 83 seq2 1403 56 35M = 1220 -218 CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG 4<<<<;<3<3&<3<1<5<31<<3<<<<<<2<<;<, MF:i:18 Aq:i:17 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS51_64:3:255:45:399 83 seq2 1404 99 35M = 1238 -201 AAAAACTATGCTAAGTATTGGTAAAGATGTGGGGA <5<5<4$;;7/<<<177&7;<<<<<<;<<4<<<<< MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:43:47:279 83 seq2 1405 99 35M = 1206 -234 AAAACTATGCTAAGTATTGGTAAAGATGTGGGGAA <:<<79<<<19<<<1<<9<<+<<<<<3<3<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:215:516:299 147 seq2 1406 99 35M = 1226 -215 AAGCTATGCTAAGTATTGGTAAAGATGTGGGGAAA ;;))7<8:855<<4<;:<<87<<<7<<;<<<*3<< MF:i:18 Aq:i:64 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+B7_591:7:116:814:89 147 seq2 1408 99 36M = 1231 -213 ACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAA :38<;<;<<<<;<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:34:144:868 83 seq2 1412 76 35M = 1226 -221 AGCTAAGGAATGGGAAAGGTGTGGGGAAAAAAGTA &9+&7<&&0&<6<.0<<7<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:4 UQ:i:50 H0:i:0 H1:i:0
+EAS51_62:7:312:236:655 83 seq2 1412 99 35M = 1222 -225 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<8;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:17:1179:393 147 seq2 1412 99 35M = 1232 -215 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:447:488 83 seq2 1412 99 35M = 1233 -214 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<3<<<<<<6<<<<<<<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:73:420:812 147 seq2 1414 66 35M = 1232 -217 CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA 5'<<<,<&,<<,<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:215:840:760 83 seq2 1416 99 35M = 1256 -195 AAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACT <<<8<::<;;<<<:<7<7<;;;<<<<<<<<<<;<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:118:829:36 147 seq2 1417 99 35M = 1233 -219 AGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTC <8<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:290:121:79 83 seq2 1420 99 35M = 1257 -198 ATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCA <1<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:174:557:872 83 seq2 1423 99 35M = 1237 -221 GGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAAT .77<:<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:315:412:921 147 seq2 1424 99 35M = 1254 -205 GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATA 4-<79;<<<4:;:<<<<<<<<4<<<38<<;<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:95:944:247 147 seq2 1424 99 40M = 1238 -226 GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCT :7::;<<<<<;;<<<<<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:137:741:866 83 seq2 1429 99 35M = 1268 -196 GATGAGGGGAAAAAAGTAAACTCTCAAATATTGCT <;0:%<:9<<<:<<<<;<<:<<;0;<<<<<::<<6 MF:i:18 Aq:i:70 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS188_7:6:191:540:493 147 seq2 1432 99 35M = 1273 -194 GTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGT <<9<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:49:911:980 83 seq2 1434 99 35M = 1241 -228 GGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGG 44:7<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:248:122:558 83 seq2 1436 99 35M = 1243 -228 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA <;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:609:646 147 seq2 1436 99 36M = 1264 -208 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ;;<<<<=======;;:;======;==<========= MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:7:1347:375 83 seq2 1436 99 35M = 1271 -200 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA 47999<<<;;;;;;:5;:;<;;<;;;;;<;;;;;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:282:962:46 147 seq2 1437 99 35M = 1282 -190 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG 69<<<<<:<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:169:714:644 83 seq2 1437 99 35M = 1231 -241 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ;<<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:84:92:1246 83 seq2 1437 99 35M = 1265 -207 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG <<<<<<<<<<<<<<<8<<<<<<5<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:71:62:254 83 seq2 1438 99 35M = 1264 -209 AAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGT <<<<<<;8<<<<;<:<<<<<<<;<<;<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:28:979:519 83 seq2 1439 99 35M = 1278 -196 AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA <<<<<6<<<<<<<<<<<<<<<8<<<<<<<<6<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:63:28:1549 83 seq2 1439 77 35M = 1247 -227 AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:15:244:876 147 seq2 1440 43 36M = 1246 -230 AAAAGTAAACTCTCAAATATTGCTAGTGTGAGTATA ;<<<7<<<<<.2<-<<<<<<<<<:<<<<<<<<<2<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_59:8:80:542:549 83 seq2 1443 99 35M = 1271 -207 AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA =9====7=;=======;;==;========<===== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:173:627:465 83 seq2 1444 99 36M = 1260 -220 GTAAACTCTCAAATATTGCTAGTGGGAGTATAAATT :<<<<;<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:54:1351:910 147 seq2 1448 99 35M = 1270 -213 ACTCTCAAATATTGCTAGTGGGAGTATAAATTGTT <7<7;;<<<<<;<<;;<<;<<<<<<<<<<<<<<;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:44:1807:833 147 seq2 1449 99 40M = 1301 -188 CTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCAC :6:9:<<<6<88<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:290:247:509 83 seq2 1450 99 35M = 1276 -209 TCTCAAATATTGCTAGTGGGAGTATAAATTGTTTT 49';<<<<<8;<;;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:42:804:114 83 seq2 1452 99 35M = 1281 -206 TCAAATATTGCTAGTGGGAGTATAAATTGTTTTCC ;9<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:39:1671:1928 83 seq2 1453 99 35M = 1276 -212 CAAATATTGCTAGTGGGAGTATAAATTGTTTTCCA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:90:629:652 147 seq2 1456 99 35M = 1276 -215 ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT <:<7::<:<<<<<8<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:289:207:323 83 seq2 1462 99 35M = 1279 -218 CTAGTGGGAGTATAAATTGATTTCCACTTTGGAAA &</<7<<:<7::<<<<+3<-7<<:<7<<<<<<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS1_95:7:280:607:113 83 seq2 1468 99 35M = 1303 -200 GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT 18<-<<<<<<<<<<<<<8<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:21:423:169 147 seq2 1468 99 35M = 1270 -233 GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT ;376;0<<<<99<<<<<<-;<4<<<<<<<<<;<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:45:758:616 83 seq2 1473 99 35M = 1280 -228 ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA <<;<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:2:326:153:231 83 seq2 1477 43 35M = 1290 -222 ATTGTTTTCAACTTTGGAAAACAATTTGGTAATTT ::6=68=<*$;*=========6============= MF:i:18 Aq:i:0 NM:i:1 UQ:i:3 H0:i:0 H1:i:1
+EAS192_3:3:88:866:774 83 seq2 1478 99 35M = 1307 -206 TTGTTTTCCACTTTGGAAAACAATTTGGTAATTTC <<<;<<<<:<<<<<:<8<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:194:867:616 147 seq2 1481 99 35M = 1303 -213 TTTTCCACTTTGGAAAACAATTTGGTAATTTCGTT 38:;;:<:<<<<;<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:46:220:58 147 seq2 1483 99 36M = 1313 -206 TTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTT 98<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:109:953:668 147 seq2 1485 99 35M = 1297 -223 CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT <:)9<<<<<<<<8:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:4:1131:104 83 seq2 1487 99 35M = 1307 -215 ACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTT 61;;;<<<<<<<<<;:<<<:<<;<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:23:1754:796 147 seq2 1488 99 35M = 1329 -194 CTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTT 88897;;;;:;:;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:11:555:330 83 seq2 1492 99 35M = 1321 -206 GGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTT 6;6;9766+<<<<9:2=<===6============= MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:308:614:911 147 seq2 1493 90 35M = 1319 -209 AAAAACAATTTGGTAATTTAGTTTTTTTTTTTTTC %<<<;:<::<6,<<<<<<:<:<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:2 UQ:i:31 H0:i:0 H1:i:1
+EAS139_19:1:82:946:392 83 seq2 1493 99 40M = 1297 -236 GAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTC :;:;:,::<:;<<<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:260:147:818 83 seq2 1497 82 35M = 1303 -229 AAAATTTGGTAATTTAGTTTTTTTTTTTTTCTTTT 6.=..++==6=76==&===========99====== MF:i:18 Aq:i:41 NM:i:2 UQ:i:18 H0:i:0 H1:i:1
+B7_591:5:124:978:501 83 seq2 1499 99 36M = 1307 -228 AATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTC <9<;<<::<;<<;<4<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:147:360:141 147 seq2 1501 47 13M1D22M = 1319 -218 TTTGGTAATTTAGTTTTTTTTTTTTCTTTTCTCTT <86<<<<73<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:0
+EAS114_39:3:6:1064:1805 147 seq2 1502 99 35M = 1350 -187 TTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTT ;88<;<;;<<;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:76:1729:813 83 seq2 1506 99 35M = 1317 -224 TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT <+6<<<&1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS54_65:6:326:71:741 153 seq2 1509 0 35M * 0 0 TCTCGTTTTTTTTTCTTTCTTTTCTCTTTTTTTTT !!<66<<<<<<<<<&<<7&<<<<:<*<<<<<<<<1 MF:i:32 Aq:i:0 NM:i:2 UQ:i:22 H0:i:1 H1:i:12
+EAS112_34:6:145:144:263 73 seq2 1509 0 35M * 0 0 TTTCGTTTTTTTTTTTTTTTTTTCCCCTTTCTTTT <<<<<<<<<<<<<<<<+4+4&+&(&&*2&8&&&)& MF:i:32 Aq:i:0 NM:i:4 UQ:i:29 H0:i:0 H1:i:0
+EAS1_105:1:329:407:872 73 seq2 1510 0 35M * 0 0 TTCGTTTTTTTTTTTTTTTTTTCCCTTTTTTTTTT <<<<<<<<<<<<<<<<<<6;<<&4::<++<(&;<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:46 H0:i:0 H1:i:0
+EAS139_19:2:82:154:1333 147 seq2 1511 77 40M = 1349 -202 TTTTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTTTTT :5'::<<<;<<<<<<</3<<<&4&7<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS56_63:3:41:468:459 147 seq2 1513 0 35M = 1352 -196 TTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTT +;<<<<<<<<<<<;&<<;;88&<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS114_28:6:11:151:750 153 seq2 1513 5 36M * 0 0 GTTTTTATTTTTTTCCTCTCTCTTTTTTTTTTTTTT :'1:%4;4<<<+;6;&9+6;/<<<<<<<<<<<<<<< MF:i:32 Aq:i:5 NM:i:3 UQ:i:41 H0:i:0 H1:i:3
+EAS139_11:5:52:1278:1478 83 seq2 1513 47 35M = 1322 -226 GTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTT .8::<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:9 H1:i:85
+B7_591:2:309:798:997 153 seq2 1514 0 36M * 0 0 TTTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 466;<<744077+&7097&%&4<9<<<9<<<::<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:5 H0:i:12 H1:i:85
+EAS1_93:6:218:144:794 89 seq2 1514 0 35M = 1514 -35 TTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT ;92/;5:<6)+<5)67</9<&<&<<<:<<<57<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:22 H1:i:85
+EAS1_93:6:218:144:794 149 seq2 1514 0 * = 1514 35 GGGTGCATTGCTATGTTGCGGTCGCTTTGCCTCCT ++(3:&)5<9035<3):-<53<+&&-+)<<&)&<6 MF:i:-64
+EAS1_97:6:222:305:337 153 seq2 1514 0 35M * 0 0 TTTTTTTTTTTTTTTTTTCCCTTTTTTTTTTTTTT ;;;;;<<';<<<<*;<<<78;7<7<;<<<<<<<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:32 H0:i:0 H1:i:37
+EAS1_105:3:7:35:528 89 seq2 1514 0 35M * 0 0 TTTTTTTTTTGTTCTTTACTCTTTTTTTTTTTTTT <<<<<<<<<<5<<<(<<%<<-8<<<<<<<<<8<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:24 H0:i:0 H1:i:0
+EAS54_65:2:182:924:833 137 seq2 1514 0 35M * 0 0 TTTTTTTTTTTTTATTTGCGCTTTTTTTTTTTTTT <<<<<<<<<<<<<)7<<)3/:07<<9<9<<==<7< MF:i:32 Aq:i:0 NM:i:3 UQ:i:30 H0:i:0 H1:i:0
+EAS54_81:8:78:735:536 153 seq2 1514 0 35M * 0 0 TTTTTTTTTTTTTCATTTCTCTTTTTTTTTTTTTT ;9<<<<<<<.7<9'%1<<)2::<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:4 H0:i:0 H1:i:15
+EAS56_59:5:232:336:46 137 seq2 1514 0 35M * 0 0 ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT +<<<<<<<<<<<<6<<<<;<6<<&&<,3<<<<3,, MF:i:32 Aq:i:0 NM:i:3 UQ:i:50 H0:i:0 H1:i:0
+EAS188_4:5:308:552:77 89 seq2 1514 0 35M * 0 0 TTTTCTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT 1;-<%<;8<<<<<&<5-<58:5:<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:4 H0:i:30 H1:i:85
+B7_597:5:125:957:753 137 seq2 1515 0 35M * 0 0 TTTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTT <8<<<;<8;8//++(,(+++&++(/+008880;;/ MF:i:32 Aq:i:0 NM:i:2 UQ:i:14 H0:i:0 H1:i:1
+EAS1_97:4:274:287:423 83 seq2 1515 0 35M = 1332 -218 TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 7<<<<9<<9<<<.<<<<90-<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:12 H1:i:85
+EAS54_71:8:234:21:950 89 seq2 1515 0 33M * 0 0 TTTTTTTTTTTTCTCCTCTCTTTTTTTTTTTTT <<<<<<<<<&<;2;&-<,<+;<<<7<<<;<;<; MF:i:32 Aq:i:0 NM:i:2 UQ:i:17 H0:i:0 H1:i:7
+EAS56_61:6:256:67:461 85 seq2 1515 0 * = 1515 35 TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT !!7181!63:6-:!-163(-1%-18<<4<<<<<<< MF:i:-64
+EAS56_61:6:256:67:461 153 seq2 1515 0 35M = 1515 -35 TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT *.%53.:)1+9;3397;1795507+335;.&51)5 MF:i:64 Aq:i:0 NM:i:2 UQ:i:14 H0:i:2 H1:i:85
+EAS56_65:8:317:83:500 153 seq2 1515 0 35M * 0 0 TTTTTTTTTTTTCTTTTCTCCTTTTTTTTTTGTTT ;;;;;<<<<<<<3<<<)-;31<<)97<;9<<:<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:41 H0:i:0 H1:i:0
+EAS114_30:2:303:428:326 147 seq2 1515 0 35M = 1345 -205 TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 4<;<<;<;<4<<8;;;;.8+;<<;<8<;<;<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:11 H1:i:85
+EAS188_7:1:290:286:763 147 seq2 1515 75 35M = 1349 -201 TTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTT <<<<;<<<<<<<&<<<<&77<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:29 H1:i:85
+B7_591:7:89:67:709 89 seq2 1516 0 36M * 0 0 TTTTTTTTTTTGTCTTCTCTTTTTTTTTTTTTTTTT :7:::9:7:<<7<'<<477<<<<<<<<<:<<<<<:< MF:i:32 Aq:i:0 NM:i:2 UQ:i:28 H0:i:0 H1:i:17
+EAS56_65:3:47:64:359 89 seq2 1516 0 35M * 0 0 TTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTTT <<<6<<<<<<<4<4</9<4@<<;<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:33 H0:i:0 H1:i:6
+EAS56_65:4:296:78:421 89 seq2 1518 0 35M = 1518 -35 TCTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTT !!<<<:<<<<..<::<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:1 UQ:i:4 H0:i:85 H1:i:85
+EAS56_65:4:296:78:421 149 seq2 1518 0 * = 1518 35 TGTTGGTGTTCGTTTTTTCTCCTGTTTCTTTTTCT <<*<4<<<;:<0<<<<<<<<+;<9<<1<<;<<<+: MF:i:-64
+EAS1_95:4:238:124:196 89 seq2 1519 0 35M * 0 0 TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT <0<9.<5.5<<<<9<1<<5<<85<5<<<9<:<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS54_65:7:56:57:985 85 seq2 1519 0 * = 1519 35 TTCTGTCTTCTCTCCTGTCTTCTTTTCTCTTCTTT <9'<.<7<<2<<;77<7<<<<7<7<<<<7<<<2<< MF:i:-64
+EAS54_65:7:56:57:985 153 seq2 1519 0 35M = 1519 -35 TTTTTTCTCTTTTCTCTTTTTTTTTTTTTTTTTTT 666666*6&1666+64666666666&266666666 MF:i:64 Aq:i:0 NM:i:1 UQ:i:9 H0:i:85 H1:i:85
+EAS56_61:3:5:45:441 89 seq2 1519 0 35M * 0 0 TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT ;;58:<:<(:<<11<&<1<<;<<<<><<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:82 H1:i:85
+B7_589:6:33:356:636 73 seq2 1520 0 35M * 0 0 TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT <<<<<<<8;<<<<<<<<<<<<<7<<<<<<<;;3&3 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:14 H1:i:85
+EAS114_45:6:86:859:1779 137 seq2 1520 0 35M * 0 0 TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT ;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699 MF:i:32 Aq:i:0 NM:i:1 UQ:i:26 H0:i:0 H1:i:15
+EAS54_71:8:105:854:975 83 seq2 1523 71 33M = 1354 -202 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG <<<<;<:<<;<&<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS51_62:4:187:907:145 153 seq2 1524 28 35M * 0 0 TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT <<<+;;,6<<<<6<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:28 NM:i:3 UQ:i:59 H0:i:0 H1:i:0
+EAS54_71:4:284:269:882 73 seq2 1524 0 34M * 0 0 TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA <;<<<<<8<7<8;<<<;<7<<<<<;272;73&&) MF:i:32 Aq:i:0 NM:i:1 UQ:i:17 H0:i:0 H1:i:85
+EAS56_63:4:141:9:811 137 seq2 1524 10 35M * 0 0 TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT <<<;<<<<<<<;<;<:<<<;<<<<<<<<..));;. MF:i:32 Aq:i:0 NM:i:3 UQ:i:47 H0:i:2 H1:i:27
+EAS114_30:6:277:397:932 73 seq2 1524 0 35M * 0 0 TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:8(,0%( MF:i:32 Aq:i:0 NM:i:3 UQ:i:42 H0:i:2 H1:i:85
+EAS139_11:7:50:1229:1313 83 seq2 1528 77 35M = 1376 -187 TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA <<<<,<&<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:11 H0:i:3 H1:i:7
+EAS54_65:3:320:20:250 147 seq2 1532 77 35M = 1367 -200 TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA +'''/<<<<7:;+<;::<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:6 NM:i:2 UQ:i:24 H0:i:1 H1:i:2
+EAS114_26:7:37:79:581 83 seq2 1533 68 35M = 1349 -219 TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA 3,,,===6===<===<;=====-============ MF:i:18 Aq:i:27 NM:i:2 UQ:i:23 H0:i:0 H1:i:1
diff --git a/tests/data/lambdaNEB.fa b/tests/data/lambdaNEB.fa
new file mode 100644
index 0000000..33011e5
--- /dev/null
+++ b/tests/data/lambdaNEB.fa
@@ -0,0 +1,608 @@
+>lambda_NEB3011
+GGGCGGCGACCTCGCGGGTTTTCGCTATTTATGAAAATTTTCCGGTTTAAGGCGTTTCCGTTCTTCTTCGTCATAACTTA
+ATGTTTTTATTTAAAATACCCTCTGAAAAGAAAGGAAACGACAGGTGCTGAAAGCGAGCTTTTTGGCCTCTGTCGTTTCC
+TTTCTCTGTTTTTGTCCGTGGAATGAACAATGGAAGTCAACAAAAAGCAGCTGGCTGACATTTTCGGTGCGAGTATCCGT
+ACCATTCAGAACTGGCAGGAACAGGGAATGCCCGTTCTGCGAGGCGGTGGCAAGGGTAATGAGGTGCTTTATGACTCTGC
+CGCCGTCATAAAATGGTATGCCGAAAGGGATGCTGAAATTGAGAACGAAAAGCTGCGCCGGGAGGTTGAAGAACTGCGGC
+AGGCCAGCGAGGCAGATCTCCAGCCAGGAACTATTGAGTACGAACGCCATCGACTTACGCGTGCGCAGGCCGACGCACAG
+GAACTGAAGAATGCCAGAGACTCCGCTGAAGTGGTGGAAACCGCATTCTGTACTTTCGTGCTGTCGCGGATCGCAGGTGA
+AATTGCCAGTATTCTCGACGGGCTCCCCCTGTCGGTGCAGCGGCGTTTTCCGGAACTGGAAAACCGACATGTTGATTTCC
+TGAAACGGGATATCATCAAAGCCATGAACAAAGCAGCCGCGCTGGATGAACTGATACCGGGGTTGCTGAGTGAATATATC
+GAACAGTCAGGTTAACAGGCTGCGGCATTTTGTCCGCGCCGGGCTTCGCTCACTGTTCAGGCCGGAGCCACAGACCGCCG
+TTGAATGGGCGGATGCTAATTACTATCTCCCGAAAGAATCCGCATACCAGGAAGGGCGCTGGGAAACACTGCCCTTTCAG
+CGGGCCATCATGAATGCGATGGGCAGCGACTACATCCGTGAGGTGAATGTGGTGAAGTCTGCCCGTGTCGGTTATTCCAA
+AATGCTGCTGGGTGTTTATGCCTACTTTATAGAGCATAAGCAGCGCAACACCCTTATCTGGTTGCCGACGGATGGTGATG
+CCGAGAACTTTATGAAAACCCACGTTGAGCCGACTATTCGTGATATTCCGTCGCTGCTGGCGCTGGCCCCGTGGTATGGC
+AAAAAGCACCGGGATAACACGCTCACCATGAAGCGTTTCACTAATGGGCGTGGCTTCTGGTGCCTGGGCGGTAAAGCGGC
+AAAAAACTACCGTGAAAAGTCGGTGGATGTGGCGGGTTATGATGAACTTGCTGCTTTTGATGATGATATTGAACAGGAAG
+GCTCTCCGACGTTCCTGGGTGACAAGCGTATTGAAGGCTCGGTCTGGCCAAAGTCCATCCGTGGCTCCACGCCAAAAGTG
+AGAGGCACCTGTCAGATTGAGCGTGCAGCCAGTGAATCCCCGCATTTTATGCGTTTTCATGTTGCCTGCCCGCATTGCGG
+GGAGGAGCAGTATCTTAAATTTGGCGACAAAGAGACGCCGTTTGGCCTCAAATGGACGCCGGATGACCCCTCCAGCGTGT
+TTTATCTCTGCGAGCATAATGCCTGCGTCATCCGCCAGCAGGAGCTGGACTTTACTGATGCCCGTTATATCTGCGAAAAG
+ACCGGGATCTGGACCCGTGATGGCATTCTCTGGTTTTCGTCATCCGGTGAAGAGATTGAGCCACCTGACAGTGTGACCTT
+TCACATCTGGACAGCGTACAGCCCGTTCACCACCTGGGTGCAGATTGTCAAAGACTGGATGAAAACGAAAGGGGATACGG
+GAAAACGTAAAACCTTCGTAAACACCACGCTCGGTGAGACGTGGGAGGCGAAAATTGGCGAACGTCCGGATGCTGAAGTG
+ATGGCAGAGCGGAAAGAGCATTATTCAGCGCCCGTTCCTGACCGTGTGGCTTACCTGACCGCCGGTATCGACTCCCAGCT
+GGACCGCTACGAAATGCGCGTATGGGGATGGGGGCCGGGTGAGGAAAGCTGGCTGATTGACCGGCAGATTATTATGGGCC
+GCCACGACGATGAACAGACGCTGCTGCGTGTGGATGAGGCCATCAATAAAACCTATACCCGCCGGAATGGTGCAGAAATG
+TCGATATCCCGTATCTGCTGGGATACTGGCGGGATTGACCCGACCATTGTGTATGAACGCTCGAAAAAACATGGGCTGTT
+CCGGGTGATCCCCATTAAAGGGGCATCCGTCTACGGAAAGCCGGTGGCCAGCATGCCACGTAAGCGAAACAAAAACGGGG
+TTTACCTTACCGAAATCGGTACGGATACCGCGAAAGAGCAGATTTATAACCGCTTCACACTGACGCCGGAAGGGGATGAA
+CCGCTTCCCGGTGCCGTTCACTTCCCGAATAACCCGGATATTTTTGATCTGACCGAAGCGCAGCAGCTGACTGCTGAAGA
+GCAGGTCGAAAAATGGGTGGATGGCAGGAAAAAAATACTGTGGGACAGCAAAAAGCGACGCAATGAGGCACTCGACTGCT
+TCGTTTATGCGCTGGCGGCGCTGCGCATCAGTATTTCCCGCTGGCAGCTGGATCTCAGTGCGCTGCTGGCGAGCCTGCAG
+GAAGAGGATGGTGCAGCAACCAACAAGAAAACACTGGCAGATTACGCCCGTGCCTTATCCGGAGAGGATGAATGACGCGA
+CAGGAAGAACTTGCCGCTGCCCGTGCGGCACTGCATGACCTGATGACAGGTAAACGGGTGGCAACAGTACAGAAAGACGG
+ACGAAGGGTGGAGTTTACGGCCACTTCCGTGTCTGACCTGAAAAAATATATTGCAGAGCTGGAAGTGCAGACCGGCATGA
+CACAGCGACGCAGGGGACCTGCAGGATTTTATGTATGAAAACGCCCACCATTCCCACCCTTCTGGGGCCGGACGGCATGA
+CATCGCTGCGCGAATATGCCGGTTATCACGGCGGTGGCAGCGGATTTGGAGGGCAGTTGCGGTCGTGGAACCCACCGAGT
+GAAAGTGTGGATGCAGCCCTGTTGCCCAACTTTACCCGTGGCAATGCCCGCGCAGACGATCTGGTACGCAATAACGGCTA
+TGCCGCCAACGCCATCCAGCTGCATCAGGATCATATCGTCGGGTCTTTTTTCCGGCTCAGTCATCGCCCAAGCTGGCGCT
+ATCTGGGCATCGGGGAGGAAGAAGCCCGTGCCTTTTCCCGCGAGGTTGAAGCGGCATGGAAAGAGTTTGCCGAGGATGAC
+TGCTGCTGCATTGACGTTGAGCGAAAACGCACGTTTACCATGATGATTCGGGAAGGTGTGGCCATGCACGCCTTTAACGG
+TGAACTGTTCGTTCAGGCCACCTGGGATACCAGTTCGTCGCGGCTTTTCCGGACACAGTTCCGGATGGTCAGCCCGAAGC
+GCATCAGCAACCCGAACAATACCGGCGACAGCCGGAACTGCCGTGCCGGTGTGCAGATTAATGACAGCGGTGCGGCGCTG
+GGATATTACGTCAGCGAGGACGGGTATCCTGGCTGGATGCCGCAGAAATGGACATGGATACCCCGTGAGTTACCCGGCGG
+GCGCGCCTCGTTCATTCACGTTTTTGAACCCGTGGAGGACGGGCAGACTCGCGGTGCAAATGTGTTTTACAGCGTGATGG
+AGCAGATGAAGATGCTCGACACGCTGCAGAACACGCAGCTGCAGAGCGCCATTGTGAAGGCGATGTATGCCGCCACCATT
+GAGAGTGAGCTGGATACGCAGTCAGCGATGGATTTTATTCTGGGCGCGAACAGTCAGGAGCAGCGGGAAAGGCTGACCGG
+CTGGATTGGTGAAATTGCCGCGTATTACGCCGCAGCGCCGGTCCGGCTGGGAGGCGCAAAAGTACCGCACCTGATGCCGG
+GTGACTCACTGAACCTGCAGACGGCTCAGGATACGGATAACGGCTACTCCGTGTTTGAGCAGTCACTGCTGCGGTATATC
+GCTGCCGGGCTGGGTGTCTCGTATGAGCAGCTTTCCCGGAATTACGCCCAGATGAGCTACTCCACGGCACGGGCCAGTGC
+GAACGAGTCGTGGGCGTACTTTATGGGGCGGCGAAAATTCGTCGCATCCCGTCAGGCGAGCCAGATGTTTCTGTGCTGGC
+TGGAAGAGGCCATCGTTCGCCGCGTGGTGACGTTACCTTCAAAAGCGCGCTTCAGTTTTCAGGAAGCCCGCAGTGCCTGG
+GGGAACTGCGACTGGATAGGCTCCGGTCGTATGGCCATCGATGGTCTGAAAGAAGTTCAGGAAGCGGTGATGCTGATAGA
+AGCCGGACTGAGTACCTACGAGAAAGAGTGCGCAAAACGCGGTGACGACTATCAGGAAATTTTTGCCCAGCAGGTCCGTG
+AAACGATGGAGCGCCGTGCAGCCGGTCTTAAACCGCCCGCCTGGGCGGCTGCAGCATTTGAATCCGGGCTGCGACAATCA
+ACAGAGGAGGAGAAGAGTGACAGCAGAGCTGCGTAATCTCCCGCATATTGCCAGCATGGCCTTTAATGAGCCGCTGATGC
+TTGAACCCGCCTATGCGCGGGTTTTCTTTTGTGCGCTTGCAGGCCAGCTTGGGATCAGCAGCCTGACGGATGCGGTGTCC
+GGCGACAGCCTGACTGCCCAGGAGGCACTCGCGACGCTGGCATTATCCGGTGATGATGACGGACCACGACAGGCCCGCAG
+TTATCAGGTCATGAACGGCATCGCCGTGCTGCCGGTGTCCGGCACGCTGGTCAGCCGGACGCGGGCGCTGCAGCCGTACT
+CGGGGATGACCGGTTACAACGGCATTATCGCCCGTCTGCAACAGGCTGCCAGCGATCCGATGGTGGACGGCATTCTGCTC
+GATATGGACACGCCCGGCGGGATGGTGGCGGGGGCATTTGACTGCGCTGACATCATCGCCCGTGTGCGTGACATAAAACC
+GGTATGGGCGCTTGCCAACGACATGAACTGCAGTGCAGGTCAGTTGCTTGCCAGTGCCGCCTCCCGGCGTCTGGTCACGC
+AGACCGCCCGGACAGGCTCCATCGGCGTCATGATGGCTCACAGTAATTACGGTGCTGCGCTGGAGAAACAGGGTGTGGAA
+ATCACGCTGATTTACAGCGGCAGCCATAAGGTGGATGGCAACCCCTACAGCCATCTTCCGGATGACGTCCGGGAGACACT
+GCAGTCCCGGATGGACGCAACCCGCCAGATGTTTGCGCAGAAGGTGTCGGCATATACCGGCCTGTCCGTGCAGGTTGTGC
+TGGATACCGAGGCTGCAGTGTACAGCGGTCAGGAGGCCATTGATGCCGGACTGGCTGATGAACTTGTTAACAGCACCGAT
+GCGATCACCGTCATGCGTGATGCACTGGATGCACGTAAATCCCGTCTCTCAGGAGGGCGAATGACCAAAGAGACTCAATC
+AACAACTGTTTCAGCCACTGCTTCGCAGGCTGACGTTACTGACGTGGTGCCAGCGACGGAGGGCGAGAACGCCAGCGCGG
+CGCAGCCGGACGTGAACGCGCAGATCACCGCAGCGGTTGCGGCAGAAAACAGCCGCATTATGGGGATCCTCAACTGTGAG
+GAGGCTCACGGACGCGAAGAACAGGCACGCGTGCTGGCAGAAACCCCCGGTATGACCGTGAAAACGGCCCGCCGCATTCT
+GGCCGCAGCACCACAGAGTGCACAGGCGCGCAGTGACACTGCGCTGGATCGTCTGATGCAGGGGGCACCGGCACCGCTGG
+CTGCAGGTAACCCGGCATCTGATGCCGTTAACGATTTGCTGAACACACCAGTGTAAGGGATGTTTATGACGAGCAAAGAA
+ACCTTTACCCATTACCAGCCGCAGGGCAACAGTGACCCGGCTCATACCGCAACCGCGCCCGGCGGATTGAGTGCGAAAGC
+GCCTGCAATGACCCCGCTGATGCTGGACACCTCCAGCCGTAAGCTGGTTGCGTGGGATGGCACCACCGACGGTGCTGCCG
+TTGGCATTCTTGCGGTTGCTGCTGACCAGACCAGCACCACGCTGACGTTCTACAAGTCCGGCACGTTCCGTTATGAGGAT
+GTGCTCTGGCCGGAGGCTGCCAGCGACGAGACGAAAAAACGGACCGCGTTTGCCGGAACGGCAATCAGCATCGTTTAACT
+TTACCCTTCATCACTAAAGGCCGCCTGTGCGGCTTTTTTTACGGGATTTTTTTATGTCGATGTACACAACCGCCCAACTG
+CTGGCGGCAAATGAGCAGAAATTTAAGTTTGATCCGCTGTTTCTGCGTCTCTTTTTCCGTGAGAGCTATCCCTTCACCAC
+GGAGAAAGTCTATCTCTCACAAATTCCGGGACTGGTAAACATGGCGCTGTACGTTTCGCCGATTGTTTCCGGTGAGGTTA
+TCCGTTCCCGTGGCGGCTCCACCTCTGAATTTACGCCGGGATATGTCAAGCCGAAGCATGAAGTGAATCCGCAGATGACC
+CTGCGTCGCCTGCCGGATGAAGATCCGCAGAATCTGGCGGACCCGGCTTACCGCCGCCGTCGCATCATCATGCAGAACAT
+GCGTGACGAAGAGCTGGCCATTGCTCAGGTCGAAGAGATGCAGGCAGTTTCTGCCGTGCTTAAGGGCAAATACACCATGA
+CCGGTGAAGCCTTCGATCCGGTTGAGGTGGATATGGGCCGCAGTGAGGAGAATAACATCACGCAGTCCGGCGGCACGGAG
+TGGAGCAAGCGTGACAAGTCCACGTATGACCCGACCGACGATATCGAAGCCTACGCGCTGAACGCCAGCGGTGTGGTGAA
+TATCATCGTGTTCGATCCGAAAGGCTGGGCGCTGTTCCGTTCCTTCAAAGCCGTCAAGGAGAAGCTGGATACCCGTCGTG
+GCTCTAATTCCGAGCTGGAGACAGCGGTGAAAGACCTGGGCAAAGCGGTGTCCTATAAGGGGATGTATGGCGATGTGGCC
+ATCGTCGTGTATTCCGGACAGTACGTGGAAAACGGCGTCAAAAAGAACTTCCTGCCGGACAACACGATGGTGCTGGGGAA
+CACTCAGGCACGCGGTCTGCGCACCTATGGCTGCATTCAGGATGCGGACGCACAGCGCGAAGGCATTAACGCCTCTGCCC
+GTTACCCGAAAAACTGGGTGACCACCGGCGATCCGGCGCGTGAGTTCACCATGATTCAGTCAGCACCGCTGATGCTGCTG
+GCTGACCCTGATGAGTTCGTGTCCGTACAACTGGCGTAATCATGGCCCTTCGGGGCCATTGTTTCTCTGTGGAGGAGTCC
+ATGACGAAAGATGAACTGATTGCCCGTCTCCGCTCGCTGGGTGAACAACTGAACCGTGATGTCAGCCTGACGGGGACGAA
+AGAAGAACTGGCGCTCCGTGTGGCAGAGCTGAAAGAGGAGCTTGATGACACGGATGAAACTGCCGGTCAGGACACCCCTC
+TCAGCCGGGAAAATGTGCTGACCGGACATGAAAATGAGGTGGGATCAGCGCAGCCGGATACCGTGATTCTGGATACGTCT
+GAACTGGTCACGGTCGTGGCACTGGTGAAGCTGCATACTGATGCACTTCACGCCACGCGGGATGAACCTGTGGCATTTGT
+GCTGCCGGGAACGGCGTTTCGTGTCTCTGCCGGTGTGGCAGCCGAAATGACAGAGCGCGGCCTGGCCAGAATGCAATAAC
+GGGAGGCGCTGTGGCTGATTTCGATAACCTGTTCGATGCTGCCATTGCCCGCGCCGATGAAACGATACGCGGGTACATGG
+GAACGTCAGCCACCATTACATCCGGTGAGCAGTCAGGTGCGGTGATACGTGGTGTTTTTGATGACCCTGAAAATATCAGC
+TATGCCGGACAGGGCGTGCGCGTTGAAGGCTCCAGCCCGTCCCTGTTTGTCCGGACTGATGAGGTGCGGCAGCTGCGGCG
+TGGAGACACGCTGACCATCGGTGAGGAAAATTTCTGGGTAGATCGGGTTTCGCCGGATGATGGCGGAAGTTGTCATCTCT
+GGCTTGGACGGGGCGTACCGCCTGCCGTTAACCGTCGCCGCTGAAAGGGGGATGTATGGCCATAAAAGGTCTTGAGCAGG
+CCGTTGAAAACCTCAGCCGTATCAGCAAAACGGCGGTGCCTGGTGCCGCCGCAATGGCCATTAACCGCGTTGCTTCATCC
+GCGATATCGCAGTCGGCGTCACAGGTTGCCCGTGAGACAAAGGTACGCCGGAAACTGGTAAAGGAAAGGGCCAGGCTGAA
+AAGGGCCACGGTCAAAAATCCGCAGGCCAGAATCAAAGTTAACCGGGGGGATTTGCCCGTAATCAAGCTGGGTAATGCGC
+GGGTTGTCCTTTCGCGCCGCAGGCGTCGTAAAAAGGGGCAGCGTTCATCCCTGAAAGGTGGCGGCAGCGTGCTTGTGGTG
+GGTAACCGTCGTATTCCCGGCGCGTTTATTCAGCAACTGAAAAATGGCCGGTGGCATGTCATGCAGCGTGTGGCTGGGAA
+AAACCGTTACCCCATTGATGTGGTGAAAATCCCGATGGCGGTGCCGCTGACCACGGCGTTTAAACAAAATATTGAGCGGA
+TACGGCGTGAACGTCTTCCGAAAGAGCTGGGCTATGCGCTGCAGCATCAACTGAGGATGGTAATAAAGCGATGAAACATA
+CTGAACTCCGTGCAGCCGTACTGGATGCACTGGAGAAGCATGACACCGGGGCGACGTTTTTTGATGGTCGCCCCGCTGTT
+TTTGATGAGGCGGATTTTCCGGCAGTTGCCGTTTATCTCACCGGCGCTGAATACACGGGCGAAGAGCTGGACAGCGATAC
+CTGGCAGGCGGAGCTGCATATCGAAGTTTTCCTGCCTGCTCAGGTGCCGGATTCAGAGCTGGATGCGTGGATGGAGTCCC
+GGATTTATCCGGTGATGAGCGATATCCCGGCACTGTCAGATTTGATCACCAGTATGGTGGCCAGCGGCTATGACTACCGG
+CGCGACGATGATGCGGGCTTGTGGAGTTCAGCCGATCTGACTTATGTCATTACCTATGAAATGTGAGGACGCTATGCCTG
+TACCAAATCCTACAATGCCGGTGAAAGGTGCCGGGACCACCCTGTGGGTTTATAAGGGGAGCGGTGACCCTTACGCGAAT
+CCGCTTTCAGACGTTGACTGGTCGCGTCTGGCAAAAGTTAAAGACCTGACGCCCGGCGAACTGACCGCTGAGTCCTATGA
+CGACAGCTATCTCGATGATGAAGATGCAGACTGGACTGCGACCGGGCAGGGGCAGAAATCTGCCGGAGATACCAGCTTCA
+CGCTGGCGTGGATGCCCGGAGAGCAGGGGCAGCAGGCGCTGCTGGCGTGGTTTAATGAAGGCGATACCCGTGCCTATAAA
+ATCCGCTTCCCGAACGGCACGGTCGATGTGTTCCGTGGCTGGGTCAGCAGTATCGGTAAGGCGGTGACGGCGAAGGAAGT
+GATCACCCGCACGGTGAAAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGTAACAGCGGCAACCG
+GCATGACCGTGACGCCTGCCAGCACCTCGGTGGTGAAAGGGCAGAGCACCACGCTGACCGTGGCCTTCCAGCCGGAGGGC
+GTAACCGACAAGAGCTTTCGTGCGGTGTCTGCGGATAAAACAAAAGCCACCGTGTCGGTCAGTGGTATGACCATCACCGT
+GAACGGCGTTGCTGCAGGCAAGGTCAACATTCCGGTTGTATCCGGTAATGGTGAGTTTGCTGCGGTTGCAGAAATTACCG
+TCACCGCCAGTTAATCCGGAGAGTCAGCGATGTTCCTGAAAACCGAATCATTTGAACATAACGGTGTGACCGTCACGCTT
+TCTGAACTGTCAGCCCTGCAGCGCATTGAGCATCTCGCCCTGATGAAACGGCAGGCAGAACAGGCGGAGTCAGACAGCAA
+CCGGAAGTTTACTGTGGAAGACGCCATCAGAACCGGCGCGTTTCTGGTGGCGATGTCCCTGTGGCATAACCATCCGCAGA
+AGACGCAGATGCCGTCCATGAATGAAGCCGTTAAACAGATTGAGCAGGAAGTGCTTACCACCTGGCCCACGGAGGCAATT
+TCTCATGCTGAAAACGTGGTGTACCGGCTGTCTGGTATGTATGAGTTTGTGGTGAATAATGCCCCTGAACAGACAGAGGA
+CGCCGGGCCCGCAGAGCCTGTTTCTGCGGGAAAGTGTTCGACGGTGAGCTGAGTTTTGCCCTGAAACTGGCGCGTGAGAT
+GGGGCGACCCGACTGGCGTGCCATGCTTGCCGGGATGTCATCCACGGAGTATGCCGACTGGCACCGCTTTTACAGTACCC
+ATTATTTTCATGATGTTCTGCTGGATATGCACTTTTCCGGGCTGACGTACACCGTGCTCAGCCTGTTTTTCAGCGATCCG
+GATATGCATCCGCTGGATTTCAGTCTGCTGAACCGGCGCGAGGCTGACGAAGAGCCTGAAGATGATGTGCTGATGCAGAA
+AGCGGCAGGGCTTGCCGGAGGTGTCCGCTTTGGCCCGGACGGGAATGAAGTTATCCCCGCTTCCCCGGATGTGGCGGACA
+TGACGGAGGATGACGTAATGCTGATGACAGTATCAGAAGGGATCGCAGGAGGAGTCCGGTATGGCTGAACCGGTAGGCGA
+TCTGGTCGTTGATTTGAGTCTGGATGCGGCCAGATTTGACGAGCAGATGGCCAGAGTCAGGCGTCATTTTTCTGGTACGG
+AAAGTGATGCGAAAAAAACAGCGGCAGTCGTTGAACAGTCGCTGAGCCGACAGGCGCTGGCTGCACAGAAAGCGGGGATT
+TCCGTCGGGCAGTATAAAGCCGCCATGCGTATGCTGCCTGCACAGTTCACCGACGTGGCCACGCAGCTTGCAGGCGGGCA
+AAGTCCGTGGCTGATCCTGCTGCAACAGGGGGGGCAGGTGAAGGACTCCTTCGGCGGGATGATCCCCATGTTCAGGGGGC
+TTGCCGGTGCGATCACCCTGCCGATGGTGGGGGCCACCTCGCTGGCGGTGGCGACCGGTGCGCTGGCGTATGCCTGGTAT
+CAGGGCAACTCAACCCTGTCCGATTTCAACAAAACGCTGGTCCTTTCCGGCAATCAGGCGGGACTGACGGCAGATCGTAT
+GCTGGTCCTGTCCAGAGCCGGGCAGGCGGCAGGGCTGACGTTTAACCAGACCAGCGAGTCACTCAGCGCACTGGTTAAGG
+CGGGGGTAAGCGGTGAGGCTCAGATTGCGTCCATCAGCCAGAGTGTGGCGCGTTTCTCCTCTGCATCCGGCGTGGAGGTG
+GACAAGGTCGCTGAAGCCTTCGGGAAGCTGACCACAGACCCGACGTCGGGGCTGACGGCGATGGCTCGCCAGTTCCATAA
+CGTGTCGGCGGAGCAGATTGCGTATGTTGCTCAGTTGCAGCGTTCCGGCGATGAAGCCGGGGCATTGCAGGCGGCGAACG
+AGGCCGCAACGAAAGGGTTTGATGACCAGACCCGCCGCCTGAAAGAGAACATGGGCACGCTGGAGACCTGGGCAGACAGG
+ACTGCGCGGGCATTCAAATCCATGTGGGATGCGGTGCTGGATATTGGTCGTCCTGATACCGCGCAGGAGATGCTGATTAA
+GGCAGAGGCTGCGTATAAGAAAGCAGACGACATCTGGAATCTGCGCAAGGATGATTATTTTGTTAACGATGAAGCGCGGG
+CGCGTTACTGGGATGATCGTGAAAAGGCCCGTCTTGCGCTTGAAGCCGCCCGAAAGAAGGCTGAGCAGCAGACTCAACAG
+GACAAAAATGCGCAGCAGCAGAGCGATACCGAAGCGTCACGGCTGAAATATACCGAAGAGGCGCAGAAGGCTTACGAACG
+GCTGCAGACGCCGCTGGAGAAATATACCGCCCGTCAGGAAGAACTGAACAAGGCACTGAAAGACGGGAAAATCCTGCAGG
+CGGATTACAACACGCTGATGGCGGCGGCGAAAAAGGATTATGAAGCGACGCTGAAAAAGCCGAAACAGTCCAGCGTGAAG
+GTGTCTGCGGGCGATCGTCAGGAAGACAGTGCTCATGCTGCCCTGCTGACGCTTCAGGCAGAACTCCGGACGCTGGAGAA
+GCATGCCGGAGCAAATGAGAAAATCAGCCAGCAGCGCCGGGATTTGTGGAAGGCGGAGAGTCAGTTCGCGGTACTGGAGG
+AGGCGGCGCAACGTCGCCAGCTGTCTGCACAGGAGAAATCCCTGCTGGCGCATAAAGATGAGACGCTGGAGTACAAACGC
+CAGCTGGCTGCACTTGGCGACAAGGTTACGTATCAGGAGCGCCTGAACGCGCTGGCGCAGCAGGCGGATAAATTCGCACA
+GCAGCAACGGGCAAAACGGGCCGCCATTGATGCGAAAAGCCGGGGGCTGACTGACCGGCAGGCAGAACGGGAAGCCACGG
+AACAGCGCCTGAAGGAACAGTATGGCGATAATCCGCTGGCGCTGAATAACGTCATGTCAGAGCAGAAAAAGACCTGGGCG
+GCTGAAGACCAGCTTCGCGGGAACTGGATGGCAGGCCTGAAGTCCGGCTGGAGTGAGTGGGAAGAGAGCGCCACGGACAG
+TATGTCGCAGGTAAAAAGTGCAGCCACGCAGACCTTTGATGGTATTGCACAGAATATGGCGGCGATGCTGACCGGCAGTG
+AGCAGAACTGGCGCAGCTTCACCCGTTCCGTGCTGTCCATGATGACAGAAATTCTGCTTAAGCAGGCAATGGTGGGGATT
+GTCGGGAGTATCGGCAGCGCCATTGGCGGGGCTGTTGGTGGCGGCGCATCCGCGTCAGGCGGTACAGCCATTCAGGCCGC
+TGCGGCGAAATTCCATTTTGCAACCGGAGGATTTACGGGAACCGGCGGCAAATATGAGCCAGCGGGGATTGTTCACCGTG
+GTGAGTTTGTCTTCACGAAGGAGGCAACCAGCCGGATTGGCGTGGGGAATCTTTACCGGCTGATGCGCGGCTATGCCACC
+GGCGGTTATGTCGGTACACCGGGCAGCATGGCAGACAGCCGGTCGCAGGCGTCCGGGACGTTTGAGCAGAATAACCATGT
+GGTGATTAACAACGACGGCACGAACGGGCAGATAGGTCCGGCTGCTCTGAAGGCGGTGTATGACATGGCCCGCAAGGGTG
+CCCGTGATGAAATTCAGACACAGATGCGTGATGGTGGCCTGTTCTCCGGAGGTGGACGATGAAGACCTTCCGCTGGAAAG
+TGAAACCCGGTATGGATGTGGCTTCGGTCCCTTCTGTAAGAAAGGTGCGCTTTGGTGATGGCTATTCTCAGCGAGCGCCT
+GCCGGGCTGAATGCCAACCTGAAAACGTACAGCGTGACGCTTTCTGTCCCCCGTGAGGAGGCCACGGTACTGGAGTCGTT
+TCTGGAAGAGCACGGGGGCTGGAAATCCTTTCTGTGGACGCCGCCTTATGAGTGGCGGCAGATAAAGGTGACCTGCGCAA
+AATGGTCGTCGCGGGTCAGTATGCTGCGTGTTGAGTTCAGCGCAGAGTTTGAACAGGTGGTGAACTGATGCAGGATATCC
+GGCAGGAAACACTGAATGAATGCACCCGTGCGGAGCAGTCGGCCAGCGTGGTGCTCTGGGAAATCGACCTGACAGAGGTC
+GGTGGAGAACGTTATTTTTTCTGTAATGAGCAGAACGAAAAAGGTGAGCCGGTCACCTGGCAGGGGCGACAGTATCAGCC
+GTATCCCATTCAGGGGAGCGGTTTTGAACTGAATGGCAAAGGCACCAGTACGCGCCCCACGCTGACGGTTTCTAACCTGT
+ACGGTATGGTCACCGGGATGGCGGAAGATATGCAGAGTCTGGTCGGCGGAACGGTGGTCCGGCGTAAGGTTTACGCCCGT
+TTTCTGGATGCGGTGAACTTCGTCAACGGAAACAGTTACGCCGATCCGGAGCAGGAGGTGATCAGCCGCTGGCGCATTGA
+GCAGTGCAGCGAACTGAGCGCGGTGAGTGCCTCCTTTGTACTGTCCACGCCGACGGAAACGGATGGCGCTGTTTTTCCGG
+GACGTATCATGCTGGCCAACACCTGCACCTGGACCTATCGCGGTGACGAGTGCGGTTATAGCGGTCCGGCTGTCGCGGAT
+GAATATGACCAGCCAACGTCCGATATCACGAAGGATAAATGCAGCAAATGCCTGAGCGGTTGTAAGTTCCGCAATAACGT
+CGGCAACTTTGGCGGCTTCCTTTCCATTAACAAACTTTCGCAGTAAATCCCATGACACAGACAGAATCAGCGATTCTGGC
+GCACGCCCGGCGATGTGCGCCAGCGGAGTCGTGCGGCTTCGTGGTAAGCACGCCGGAGGGGGAAAGATATTTCCCCTGCG
+TGAATATCTCCGGTGAGCCGGAGGCGTATTTCCGTATGTCGCCGGAAGACTGGCTGCAGGCAGAAATGCAGGGTGAGATT
+GTGGCGCTGGTCCACAGCCACCCCGGTGGTCTGCCCTGGCTGAGTGAGGCCGACCGGCGGCTGCAGGTGCAGAGTGATTT
+GCCGTGGTGGCTGGTCTGCCGGGGGACGATTCATAAGTTCCGCTGTGTGCCGCATCTCACCGGGCGGCGCTTTGAGCACG
+GTGTGACGGACTGTTACACACTGTTCCGGGATGCTTATCATCTGGCGGGGATTGAGATGCCGGACTTTCATCGTGAGGAT
+GACTGGTGGCGTAACGGCCAGAATCTCTATCTGGATAATCTGGAGGCGACGGGGCTGTATCAGGTGCCGTTGTCAGCGGC
+ACAGCCGGGCGATGTGCTGCTGTGCTGTTTTGGTTCATCAGTGCCGAATCACGCCGCAATTTACTGCGGCGACGGCGAGC
+TGCTGCACCATATTCCTGAACAACTGAGCAAACGAGAGAGGTACACCGACAAATGGCAGCGACGCACACACTCCCTCTGG
+CGTCACCGGGCATGGCGCGCATCTGCCTTTACGGGGATTTACAACGATTTGGTCGCCGCATCGACCTTCGTGTGAAAACG
+GGGGCTGAAGCCATCCGGGCACTGGCCACACAGCTCCCGGCGTTTCGTCAGAAACTGAGCGACGGCTGGTATCAGGTACG
+GATTGCCGGGCGGGACGTCAGCACGTCCGGGTTAACGGCGCAGTTACATGAGACTCTGCCTGATGGCGCTGTAATTCATA
+TTGTTCCCAGAGTCGCCGGGGCCAAGTCAGGTGGCGTATTCCAGATTGTCCTGGGGGCTGCCGCCATTGCCGGATCATTC
+TTTACCGCCGGAGCCACCCTTGCAGCATGGGGGGCAGCCATTGGGGCCGGTGGTATGACCGGCATCCTGTTTTCTCTCGG
+TGCCAGTATGGTGCTCGGTGGTGTGGCGCAGATGCTGGCACCGAAAGCCAGAACTCCCCGTATACAGACAACGGATAACG
+GTAAGCAGAACACCTATTTCTCCTCACTGGATAACATGGTTGCCCAGGGCAATGTTCTGCCTGTTCTGTACGGGGAAATG
+CGCGTGGGGTCACGCGTGGTTTCTCAGGAGATCAGCACGGCAGACGAAGGGGACGGTGGTCAGGTTGTGGTGATTGGTCG
+CTGATGCAAAATGTTTTATGTGAAACCGCCTGCGGGCGGTTTTGTCATTTATGGAGCGTGAGGAATGGGTAAAGGAAGCA
+GTAAGGGGCATACCCCGCGCGAAGCGAAGGACAACCTGAAGTCCACGCAGTTGCTGAGTGTGATCGATGCCATCAGCGAA
+GGGCCGATTGAAGGTCCGGTGGATGGCTTAAAAAGCGTGCTGCTGAACAGTACGCCGGTGCTGGACACTGAGGGGAATAC
+CAACATATCCGGTGTCACGGTGGTGTTCCGGGCTGGTGAGCAGGAGCAGACTCCGCCGGAGGGATTTGAATCCTCCGGCT
+CCGAGACGGTGCTGGGTACGGAAGTGAAATATGACACGCCGATCACCCGCACCATTACGTCTGCAAACATCGACCGTCTG
+CGCTTTACCTTCGGTGTACAGGCACTGGTGGAAACCACCTCAAAGGGTGACAGGAATCCGTCGGAAGTCCGCCTGCTGGT
+TCAGATACAACGTAACGGTGGCTGGGTGACGGAAAAAGACATCACCATTAAGGGCAAAACCACCTCGCAGTATCTGGCCT
+CGGTGGTGATGGGTAACCTGCCGCCGCGCCCGTTTAATATCCGGATGCGCAGGATGACGCCGGACAGCACCACAGACCAG
+CTGCAGAACAAAACGCTCTGGTCGTCATACACTGAAATCATCGATGTGAAACAGTGCTACCCGAACACGGCACTGGTCGG
+CGTGCAGGTGGACTCGGAGCAGTTCGGCAGCCAGCAGGTGAGCCGTAATTATCATCTGCGCGGGCGTATTCTGCAGGTGC
+CGTCGAACTATAACCCGCAGACGCGGCAATACAGCGGTATCTGGGACGGAACGTTTAAACCGGCATACAGCAACAACATG
+GCCTGGTGTCTGTGGGATATGCTGACCCATCCGCGCTACGGCATGGGGAAACGTCTTGGTGCGGCGGATGTGGATAAATG
+GGCGCTGTATGTCATCGGCCAGTACTGCGACCAGTCAGTGCCGGACGGCTTTGGCGGCACGGAGCCGCGCATCACCTGTA
+ATGCGTACCTGACCACACAGCGTAAGGCGTGGGATGTGCTCAGCGATTTCTGCTCGGCGATGCGCTGTATGCCGGTATGG
+AACGGGCAGACGCTGACGTTCGTGCAGGACCGACCGTCGGATAAGACGTGGACCTATAACCGCAGTAATGTGGTGATGCC
+GGATGATGGCGCGCCGTTCCGCTACAGCTTCAGCGCCCTGAAGGACCGCCATAATGCCGTTGAGGTGAACTGGATTGACC
+CGAACAACGGCTGGGAGACGGCGACAGAGCTTGTTGAAGATACGCAGGCCATTGCCCGTTACGGTCGTAATGTTACGAAG
+ATGGATGCCTTTGGCTGTACCAGCCGGGGGCAGGCACACCGCGCCGGGCTGTGGCTGATTAAAACAGAACTGCTGGAAAC
+GCAGACCGTGGATTTCAGCGTCGGCGCAGAAGGGCTTCGCCATGTACCGGGCGATGTTATTGAAATCTGCGATGATGACT
+ATGCCGGTATCAGCACCGGTGGTCGTGTGCTGGCGGTGAACAGCCAGACCCGGACGCTGACGCTCGACCGTGAAATCACG
+CTGCCATCCTCCGGTACCGCGCTGATAAGCCTGGTTGACGGAAGTGGCAATCCGGTCAGCGTGGAGGTTCAGTCCGTCAC
+CGACGGCGTGAAGGTAAAAGTGAGCCGTGTTCCTGACGGTGTTGCTGAATACAGCGTATGGGAGCTGAAGCTGCCGACGC
+TGCGCCAGCGACTGTTCCGCTGCGTGAGTATCCGTGAGAACGACGACGGCACGTATGCCATCACCGCCGTGCAGCATGTG
+CCGGAAAAAGAGGCCATCGTGGATAACGGGGCGCACTTTGACGGCGAACAGAGTGGCACGGTGAATGGTGTCACGCCGCC
+AGCGGTGCAGCACCTGACCGCAGAAGTCACTGCAGACAGCGGGGAATATCAGGTGCTGGCGCGATGGGACACACCGAAGG
+TGGTGAAGGGCGTGAGTTTCCTGCTCCGTCTGACCGTAACAGCGGACGACGGCAGTGAGCGGCTGGTCAGCACGGCCCGG
+ACGACGGAAACCACATACCGCTTCACGCAACTGGCGCTGGGGAACTACAGGCTGACAGTCCGGGCGGTAAATGCGTGGGG
+GCAGCAGGGCGATCCGGCGTCGGTATCGTTCCGGATTGCCGCACCGGCAGCACCGTCGAGGATTGAGCTGACGCCGGGCT
+ATTTTCAGATAACCGCCACGCCGCATCTTGCCGTTTATGACCCGACGGTACAGTTTGAGTTCTGGTTCTCGGAAAAGCAG
+ATTGCGGATATCAGACAGGTTGAAACCAGCACGCGTTATCTTGGTACGGCGCTGTACTGGATAGCCGCCAGTATCAATAT
+CAAACCGGGCCATGATTATTACTTTTATATCCGCAGTGTGAACACCGTTGGCAAATCGGCATTCGTGGAGGCCGTCGGTC
+GGGCGAGCGATGATGCGGAAGGTTACCTGGATTTTTTCAAAGGCAAGATAACCGAATCCCATCTCGGCAAGGAGCTGCTG
+GAAAAAGTCGAGCTGACGGAGGATAACGCCAGCAGACTGGAGGAGTTTTCGAAAGAGTGGAAGGATGCCAGTGATAAGTG
+GAATGCCATGTGGGCTGTCAAAATTGAGCAGACCAAAGACGGCAAACATTATGTCGCGGGTATTGGCCTCAGCATGGAGG
+ACACGGAGGAAGGCAAACTGAGCCAGTTTCTGGTTGCCGCCAATCGTATCGCATTTATTGACCCGGCAAACGGGAATGAA
+ACGCCGATGTTTGTGGCGCAGGGCAACCAGATATTCATGAACGACGTGTTCCTGAAGCGCCTGACGGCCCCCACCATTAC
+CAGCGGCGGCAATCCTCCGGCCTTTTCCCTGACACCGGACGGAAAGCTGACCGCTAAAAATGCGGATATCAGTGGCAGTG
+TGAATGCGAACTCCGGGACGCTCAGTAATGTGACGATAGCTGAAAACTGTACGATAAACGGTACGCTGAGGGCGGAAAAA
+ATCGTCGGGGACATTGTAAAGGCGGCGAGCGCGGCTTTTCCGCGCCAGCGTGAAAGCAGTGTGGACTGGCCGTCAGGTAC
+CCGTACTGTCACCGTGACCGATGACCATCCTTTTGATCGCCAGATAGTGGTGCTTCCGCTGACGTTTCGCGGAAGTAAGC
+GTACTGTCAGCGGCAGGACAACGTATTCGATGTGTTATCTGAAAGTACTGATGAACGGTGCGGTGATTTATGATGGCGCG
+GCGAACGAGGCGGTACAGGTGTTCTCCCGTATTGTTGACATGCCAGCGGGTCGGGGAAACGTGATCCTGACGTTCACGCT
+TACGTCCACACGGCATTCGGCAGATATTCCGCCGTATACGTTTGCCAGCGATGTGCAGGTTATGGTGATTAAGAAACAGG
+CGCTGGGCATCAGCGTGGTCTGAGTGTGTTACAGAGGTTCGTCCGGGAACGGGCGTTTTATTATAAAACAGTGAGAGGTG
+AACGATGCGTAATGTGTGTATTGCCGTTGCTGTCTTTGCCGCACTTGCGGTGACAGTCACTCCGGCCCGTGCGGAAGGTG
+GACATGGTACGTTTACGGTGGGCTATTTTCAAGTGAAACCGGGTACATTGCCGTCGTTGTCGGGCGGGGATACCGGTGTG
+AGTCATCTGAAAGGGATTAACGTGAAGTACCGTTATGAGCTGACGGACAGTGTGGGGGTGATGGCTTCCCTGGGGTTCGC
+CGCGTCGAAAAAGAGCAGCACAGTGATGACCGGGGAGGATACGTTTCACTATGAGAGCCTGCGTGGACGTTATGTGAGCG
+TGATGGCCGGACCGGTTTTACAAATCAGTAAGCAGGTCAGTGCGTACGCCATGGCCGGAGTGGCTCACAGTCGGTGGTCC
+GGCAGTACAATGGATTACCGTAAGACGGAAATCACTCCCGGGTATATGAAAGAGACGACCACTGCCAGGGACGAAAGTGC
+AATGCGGCATACCTCAGTGGCGTGGAGTGCAGGTATACAGATTAATCCGGCAGCGTCCGTCGTTGTTGATATTGCTTATG
+AAGGCTCCGGCAGTGGCGACTGGCGTACTGACGGATTCATCGTTGGGGTCGGTTATAAATTCTGATTAGCCAGGTAACAC
+AGTGTTATGACAGCCCGCCGGAACCGGTGGGCTTTTTTGTGGGGTGAATATGGCAGTAAAGATTTCAGGAGTCCTGAAAG
+ACGGCACAGGAAAACCGGTACAGAACTGCACCATTCAGCTGAAAGCCAGACGTAACAGCACCACGGTGGTGGTGAACACG
+GTGGGCTCAGAGAATCCGGATGAAGCCGGGCGTTACAGCATGGATGTGGAGTACGGTCAGTACAGTGTCATCCTGCAGGT
+TGACGGTTTTCCACCATCGCACGCCGGGACCATCACCGTGTATGAAGATTCACAACCGGGGACGCTGAATGATTTTCTCT
+GTGCCATGACGGAGGATGATGCCCGGCCGGAGGTGCTGCGTCGTCTTGAACTGATGGTGGAAGAGGTGGCGCGTAACGCG
+TCCGTGGTGGCACAGAGTACGGCAGACGCGAAGAAATCAGCCGGCGATGCCAGTGCATCAGCTGCTCAGGTCGCGGCCCT
+TGTGACTGATGCAACTGACTCAGCACGCGCCGCCAGCACGTCCGCCGGACAGGCTGCATCGTCAGCTCAGGAAGCGTCCT
+CCGGCGCAGAAGCGGCATCAGCAAAGGCCACTGAAGCGGAAAAAAGTGCCGCAGCCGCAGAGTCCTCAAAAAACGCGGCG
+GCCACCAGTGCCGGTGCGGCGAAAACGTCAGAAACGAATGCTGCAGCGTCACAACAATCAGCCGCCACGTCTGCCTCCAC
+CGCGGCCACGAAAGCGTCAGAGGCCGCCACTTCAGCACGAGATGCGGTGGCCTCAAAAGAGGCAGCAAAATCATCAGAAA
+CGAACGCATCATCAAGTGCCGGTCGTGCAGCTTCCTCGGCAACGGCGGCAGAAAATTCTGCCAGGGCGGCAAAAACGTCC
+GAGACGAATGCCAGGTCATCTGAAACAGCAGCGGAACGGAGCGCCTCTGCCGCGGCAGACGCAAAAACAGCGGCGGCGGG
+GAGTGCGTCAACGGCATCCACGAAGGCGACAGAGGCTGCGGGAAGTGCGGTATCAGCATCGCAGAGCAAAAGTGCGGCAG
+AAGCGGCGGCAATACGTGCAAAAAATTCGGCAAAACGTGCAGAAGATATAGCTTCAGCTGTCGCGCTTGAGGATGCGGAC
+ACAACGAGAAAGGGGATAGTGCAGCTCAGCAGTGCAACCAACAGCACGTCTGAAACGCTTGCTGCAACGCCAAAGGCGGT
+TAAGGTGGTAATGGATGAAACGAACAGAAAAGCCCACTGGACAGTCCGGCACTGACCGGAACGCCAACAGCACCAACCGC
+GCTCAGGGGAACAAACAATACCCAGATTGCGAACACCGCTTTTGTACTGGCCGCGATTGCAGATGTTATCGACGCGTCAC
+CTGACGCACTGAATACGCTGAATGAACTGGCCGCAGCGCTCGGGAATGATCCAGATTTTGCTACCACCATGACTAACGCG
+CTTGCGGGTAAACAACCGAAGAATGCGACACTGACGGCGCTGGCAGGGCTTTCCACGGCGAAAAATAAATTACCGTATTT
+TGCGGAAAATGATGCCGCCAGCCTGACTGAACTGACTCAGGTTGGCAGGGATATTCTGGCAAAAAATTCCGTTGCAGATG
+TTCTTGAATACCTTGGGGCCGGTGAGAATTCGGCCTTTCCGGCAGGTGCGCCGATCCCGTGGCCATCAGATATCGTTCCG
+TCTGGCTACGTCCTGATGCAGGGGCAGGCGTTTGACAAATCAGCCTACCCAAAACTTGCTGTCGCGTATCCATCGGGTGT
+GCTTCCTGATATGCGAGGCTGGACAATCAAGGGGAAACCCGCCAGCGGTCGTGCTGTATTGTCTCAGGAACAGGATGGAA
+TTAAGTCGCACACCCACAGTGCCAGTGCATCCGGTACGGATTTGGGGACGAAAACCACATCGTCGTTTGATTACGGGACG
+AAAACAACAGGCAGTTTCGATTACGGCACCAAATCGACGAATAACACGGGGGCTCATGCTCACAGTCTGAGCGGTTCAAC
+AGGGGCCGCGGGTGCTCATGCCCACACAAGTGGTTTAAGGATGAACAGTTCTGGCTGGAGTCAGTATGGAACAGCAACCA
+TTACAGGAAGTTTATCCACAGTTAAAGGAACCAGCACACAGGGTATTGCTTATTTATCGAAAACGGACAGTCAGGGCAGC
+CACAGTCACTCATTGTCCGGTACAGCCGTGAGTGCCGGTGCACATGCGCATACAGTTGGTATTGGTGCGCACCAGCATCC
+GGTTGTTATCGGTGCTCATGCCCATTCTTTCAGTATTGGTTCACACGGACACACCATCACCGTTAACGCTGCGGGTAACG
+CGGAAAACACCGTCAAAAACATTGCATTTAACTATATTGTGAGGCTTGCATAATGGCATTCAGAATGAGTGAACAACCAC
+GGACCATAAAAATTTATAATCTGCTGGCCGGAACTAATGAATTTATTGGTGAAGGTGACGCATATATTCCGCCTCATACC
+GGTCTGCCTGCAAACAGTACCGATATTGCACCGCCAGATATTCCGGCTGGCTTTGTGGCTGTTTTCAACAGTGATGAGGC
+ATCGTGGCATCTCGTTGAAGACCATCGGGGTAAAACCGTCTATGACGTGGCTTCCGGCGACGCGTTATTTATTTCTGAAC
+TCGGTCCGTTACCGGAAAATTTTACCTGGTTATCGCCGGGAGGGGAATATCAGAAGTGGAACGGCACAGCCTGGGTGAAG
+GATACGGAAGCAGAAAAACTGTTCCGGATCCGGGAGGCGGAAGAAACAAAAAAAAGCCTGATGCAGGTAGCCAGTGAGCA
+TATTGCGCCGCTTCAGGATGCTGCAGATCTGGAAATTGCAACGAAGGAAGAAACCTCGTTGCTGGAAGCCTGGAAGAAGT
+ATCGGGTGTTGCTGAACCGTGTTGATACATCAACTGCACCTGATATTGAGTGGCCTGCTGTCCCTGTTATGGAGTAATCG
+TTTTGTGATATGCCGCAGAAACGTTGTATGAAATAACGTTCTGCGGTTAGTTAGTATATTGTAAAGCTGAGTATTGGTTT
+ATTTGGCGATTATTATCTTCAGGAGAATAATGGAAGTTCTATGACTCAATTGTTCATAGTGTTTACATCACCGCCAATTG
+CTTTTAAGACTGAACGCATGAAATATGGTTTTTCGTCATGTTTTGAGTCTGCTGTTGATATTTCTAAAGTCGGTTTTTTT
+TCTTCGTTTTCTCTAACTATTTTCCATGAAATACATTTTTGATTATTATTTGAATCAATTCCAATTACCTGAAGTCTTTC
+ATCTATAATTGGCATTGTATGTATTGGTTTATTGGAGTAGATGCTTGCTTTTCTGAGCCATAGCTCTGATATCCAAATGA
+AGCCATAGGCATTTGTTATTTTGGCTCTGTCAGCTGCATAACGCCAAAAAATATATTTATCTGCTTGATCTTCAAATGTT
+GTATTGATTAAATCAATTGGATGGAATTGTTTATCATAAAAAATTAATGTTTGAATGTGATAACCGTCCTTTAAAAAAGT
+CGTTTCTGCAAGCTTGGCTGTATAGTCAACTAACTCTTCTGTCGAAGTGATATTTTTAGGCTTATCTACCAGTTTTAGAC
+GCTCTTTAATATCTTCAGGAATTATTTTATTGTCATATTGTATCATGCTAAATGACAATTTGCTTATGGAGTAATCTTTT
+AATTTTAAATAAGTTATTCTCCTGGCTTCATCAAATAAAGAGTCGAATGATGTTGGCGAAATCACATCGTCACCCATTGG
+ATTGTTTATTTGTATGCCAAGAGAGTTACAGCAGTTATACATTCTGCCATAGATTATAGCTAAGGCATGTAATAATTCGT
+AATCTTTTAGCGTATTAGCGACCCATCGTCTTTCTGATTTAATAATAGATGATTCAGTTAAATATGAAGGTAATTTCTTT
+TGTGCAAGTCTGACTAACTTTTTTATACCAATGTTTAACATACTTTCATTTGTAATAAACTCAATGTCATTTTCTTCAAT
+GTAAGATGAAATAAGAGTAGCCTTTGCCTCGCTATACATTTCTAAATCGCCTTGTTTTTCTATCGTATTGCGAGAATTTT
+TAGCCCAAGCCATTAATGGATCATTTTTCCATTTTTCAATAACATTATTGTTATACCAAATGTCATATCCTATAATCTGG
+TTTTTGTTTTTTTGAATAATAAATGTTACTGTTCTTGCGGTTTGGAGGAATTGATTCAAATTCAAGCGAAATAATTCAGG
+GTCAAAATATGTATCAATGCAGCATTTGAGCAAGTGCGATAAATCTTTAAGTCTTCTTTCCCATGGTTTTTTAGTCATAA
+AACTCTCCATTTTGATAGGTTGCATGCTAGATGCTGATATATTTTAGAGGTGATAAAATTAACTGCTTAACTGTCAATGT
+AATACAAGTTGTTTGATCTTTGCAATGATTCTTATCAGAAACCATATAGTAAATTAGTTACACAGGAAATTTTTAATATT
+ATTATTATCATTCATTATGTATTAAAATTAGAGTTGTGGCTTGGCTCTGCTAACACGTTGCTCATAGGAGATATGGTAGA
+GCCGCAGACACGTCGTATGCAGGAACGTGCTGCGGCTGGCTGGTGAACTTCCGATAGTGCGGGTGTTGAATGATTTCCAG
+TTGCTACCGATTTTACATATTTTTTGCATGAGAGAATTTGTACCACCTCCCACCGACCATCTATGACTGTACGCCACTGT
+CCCTAGGACTGCTATGTGCCGGAGCGGACATTACAAACGTCCTTCTCGGTGCATGCCACTGTTGCCAATGACCTGCCTAG
+GAATTGGTTAGCAAGTTACTACCGGATTTTGTAAAAACAGCCCTCCTCATATAAAAAGTATTCGTTCACTTCCGATAAGC
+GTCGTAATTTTCTATCTTTCATCATATTCTAGATCCCTCTGAAAAAATCTTCCGAGTTTGCTAGGCACTGATACATAACT
+CTTTTCCAATAATTGGGGAAGTCATTCAAATCTATAATAGGTTTCAGATTTGCTTCAATAAATTCTGACTGTAGCTGCTG
+AAACGTTGCGGTTGAACTATATTTCCTTATAACTTTTACGAAAGAGTTTCTTTGAGTAATCACTTCACTCAAGTGCTTCC
+CTGCCTCCAAACGATACCTGTTAGCAATATTTAATAGCTTGAAATGATGAAGAGCTCTGTGTTTGTCTTCCTGCCTCCAG
+TTCGCCGGGCATTCAACATAAAAACTGATAGCACCCGGAGTTCCGGAAACGAAATTTGCATATACCCATTGCTCACGAAA
+AAAAATGTCCTTGTCGATATAGGGATGAATCGCTTGGTGTACCTCATCTACTGCGAAAACTTGACCTTTCTCTCCCATAT
+TGCAGTCGCGGCACGATGGAACTAAATTAATAGGCATCACCGAAAATTCAGGATAATGTGCAATAGGAAGAAAATGATCT
+ATATTTTTTGTCTGTCCTATATCACCACAAAATGGACATTTTTCACCTGATGAAACAAGCATGTCATCGTAATATGTTCT
+AGCGGGTTTGTTTTTATCTCGGAGATTATTTTCATAAAGCTTTTCTAATTTAACCTTTGTCAGGTTACCAACTACTAAGG
+TTGTAGGCTCAAGAGGGTGTGTCCTGTCGTAGGTAAATAACTGACCTGTCGAGCTTAATATTCTATATTGTTGTTCTTTC
+TGCAAAAAAGTGGGGAAGTGAGTAATGAAATTATTTCTAACATTTATCTGCATCATACCTTCCGAGCATTTATTAAGCAT
+TTCGCTATAAGTTCTCGCTGGAAGAGGTAGTTTTTTCATTGTACTTTACCTTCATCTCTGTTCATTATCATCGCTTTTAA
+AACGGTTCGACCTTCTAATCCTATCTGACCATTATAATTTTTTAGAATGGTTTCATAAGAAAGCTCTGAATCAACGGACT
+GCGATAATAAGTGGTGGTATCCAGAATTTGTCACTTCAAGTAAAAACACCTCACGAGTTAAAACACCTAAGTTCTCACCG
+AATGTCTCAATATCCGGACGGATAATATTTATTGCTTCTCTTGACCGTAGGACTTTCCACATGCAGGATTTTGGAACCTC
+TTGCAGTACTACTGGGGAATGAGTTGCAATTATTGCTACACCATTGCGTGCATCGAGTAAGTCGCTTAATGTTCGTAAAA
+AAGCAGAGAGCAAAGGTGGATGCAGATGAACCTCTGGTTCATCGAATAAAACTAATGACTTTTCGCCAACGACATCTACT
+AATCTTGTGATAGTAAATAAAACAATTGCATGTCCAGAGCTCATTCGAAGCAGATATTTCTGGATATTGTCATAAAACAA
+TTTAGTGAATTTATCATCGTCCACTTGAATCTGTGGTTCATTACGTCTTAACTCTTCATATTTAGAAATGAGGCTGATGA
+GTTCCATATTTGAAAAGTTTTCATCACTACTTAGTTTTTTGATAGCTTCAAGCCAGAGTTGTCTTTTTCTATCTACTCTC
+ATACAACCAATAAATGCTGAAATGAATTCTAAGCGGAGATCGCCTAGTGATTTTAAACTATTGCTGGCAGCATTCTTGAG
+TCCAATATAAAAGTATTGTGTACCTTTTGCTGGGTCAGGTTGTTCTTTAGGAGGAGTAAAAGGATCAAATGCACTAAACG
+AAACTGAAACAAGCGATCGAAAATATCCCTTTGGGATTCTTGACTCGATAAGTCTATTATTTTCAGAGAAAAAATATTCA
+TTGTTTTCTGGGTTGGTGATTGCACCAATCATTCCATTCAAAATTGTTGTTTTACCACACCCATTCCGCCCGATAAAAGC
+ATGAATGTTCGTGCTGGGCATAGAATTAACCGTCACCTCAAAAGGTATAGTTAAATCACTGAATCCGGGAGCACTTTTTC
+TATTAAATGAAAAGTGGAAATCTGACAATTCTGGCAAACCATTTAACACACGTGCGAACTGTCCATGAATTTCTGAAAGA
+GTTACCCCTCTAAGTAATGAGGTGTTAAGGACGCTTTCATTTTCAATGTCGGCTAATCGATTTGGCCATACTACTAAATC
+CTGAATAGCTTTAAGAAGGTTATGTTTAAAACCATCGCTTAATTTGCTGAGATTAACATAGTAGTCAATGCTTTCACCTA
+AGGAAAAAAACATTTCAGGGAGTTGACTGAATTTTTTATCTATTAATGAATAAGTGCTTACTTCTTCTTTTTGACCTACA
+AAACCAATTTTAACATTTCCGATATCGCATTTTTCACCATGCTCATCAAAGACAGTAAGATAAAACATTGTAACAAAGGA
+ATAGTCATTCCAACCATCTGCTCGTAGGAATGCCTTATTTTTTTCTACTGCAGGAATATACCCGCCTCTTTCAATAACAC
+TAAACTCCAACATATAGTAACCCTTAATTTTATTAAAATAACCGCAATTTATTTGGCGGCAACACAGGATCTCTCTTTTA
+AGTTACTCTCTATTACATACGTTTTCCATCTAAAAATTAGTAGTATTGAACTTAACGGGGCATCGTATTGTAGTTTTCCA
+TATTTAGCTTTCTGCTTCCTTTTGGATAACCCACTGTTATTCATGTTGCATGGTGCACTGTTTATACCAACGATATAGTC
+TATTAATGCATATATAGTATCGCCGAACGATTAGCTCTTCAGGCTTCTGAAGAAGCGTTTCAAGTACTAATAAGCCGATA
+GATAGCCACGGACTTCGTAGCCATTTTTCATAAGTGTTAACTTCCGCTCCTCGCTCATAACAGACATTCACTACAGTTAT
+GGCGGAAAGGTATGCATGCTGGGTGTGGGGAAGTCGTGAAAGAAAAGAAGTCAGCTGCGTCGTTTGACATCACTGCTATC
+TTCTTACTGGTTATGCAGGTCGTAGTGGGTGGCACACAAAGCTTTGCACTGGATTGCGAGGCTTTGTGCTTCTCTGGAGT
+GCGACAGGTTTGATGACAAAAAATTAGCGCAAGAAGACAAAAATCACCTTGCGCTAATGCTCTGTTACAGGTCACTAATA
+CCATCTAAGTAGTTGATTCATAGTGACTGCATATGTTGTGTTTTACAGTATTATGTAGTCTGTTTTTTATGCAAAATCTA
+ATTTAATATATTGATATTTATATCATTTTACGTTTCTCGTTCAGCTTTTTTATACTAAGTTGGCATTATAAAAAAGCATT
+GCTTATCAATTTGTTGCAACGAACAGGTCACTATCAGTCAAAATAAAATCATTATTTGATTTCAATTTTGTCCCACTCCC
+TGCCTCTGTCATCACGATACTGTGATGCCATGGTGTCCGACTTATGCCCGAGAAGATGTTGAGCAAACTTATCGCTTATC
+TGCTTCTCATAGAGTCTTGCAGACAAACTGCGCAACTCGTGAAAGGTAGGCGGATCCCCTTCGAAGGAAAGACCTGATGC
+TTTTCGTGCGCGCATAAAATACCTTGATACTGTGCCGGATGAAAGCGGTTCGCGACGAGTAGATGCAATTATGGTTTCTC
+CGCCAAGAATCTCTTTGCATTTATCAAGTGTTTCCTTCATTGATATTCCGAGAGCATCAATATGCAATGCTGTTGGGATG
+GCAATTTTTACGCCTGTTTTGCTTTGCTCGACATAAAGATATCCATCTACGATATCAGACCACTTCATTTCGCATAAATC
+ACCAACTCGTTGCCCGGTAACAACAGCCAGTTCCATTGCAAGTCTGAGCCAACATGGTGATGATTCTGCTGCTTGATAAA
+TTTTCAGGTATTCGTCAGCCGTAAGTCTTGATCTCCTTACCTCTGATTTTGCTGCGCGAGTGGCAGCGACATGGTTTGTT
+GTTATATGGCCTTCAGCTATTGCCTCTCGGAATGCATCGCTCAGTGTTGATCTGATTAACTTGGCTGACGCCGCCTTGCC
+CTCGTCTATGTATCCATTGAGCATTGCCGCAATTTCTTTTGTGGTGATGTCTTCAAGTGGAGCATCAGGCAGACCCCTCC
+TTATTGCTTTAATTTTGCTCATGTAATTTATGAGTGTCTTCTGCTTGATTCCTCTGCTGGCCAGGATTTTTTCGTAGCGA
+TCAAGCCATGAATGTAACGTAACGGAATTATCACTGTTGATTCTCGCTGTCAGAGGCTTGTGTTTGTGTCCTGAAAATAA
+CTCAATGTTGGCCTGTATAGCTTCAGTGATTGCGATTCGCCTGTCTCTGCCTAATCCAAACTCTTTACCCGTCCTTGGGT
+CCCTGTAGCAGTAATATCCATTGTTTCTTATATAAAGGTTAGGGGGTAAATCCCGGCGCTCATGACTTCGCCTTCTTCCC
+ATTTCTGATCCTCTTCAAAAGGCCACCTGTTACTGGTCGATTTAAGTCAACCTTTACCGCTGATTCGTGGAACAGATACT
+CTCTTCCATCCTTAACCGGAGGTGGGAATATCCTGCATTCCCGAACCCATCGACGAACTGTTTCAAGGCTTCTTGGACGT
+CGCTGGCGTGCGTTCCACTCCTGAAGTGTCAAGTACATCGCAAAGTCTCCGCAATTACACGCAAGAAAAAACCGCCATCA
+GGCGGCTTGGTGTTCTTTCAGTTCTTCAATTCGAATATTGGTTACGTCTGCATGTGCTATCTGCGCCCATATCATCCAGT
+GGTCGTAGCAGTCGTTGATGTTCTCCGCTTCGATAACTCTGTTGAATGGCTCTCCATTCCATTCTCCTGTGACTCGGAAG
+TGCATTTATCATCTCCATAAAACAAAACCCGCCGTAGCGAGTTCAGATAAAATAAATCCCCGCGAGTGCGAGGATTGTTA
+TGTAATATTGGGTTTAATCATCTATATGTTTTGTACAGAGAGGGCAAGTATCGTTTCCACCGTACTCGTGATAATAATTT
+TGCACGGTATCAGTCATTTCTCGCACATTGCAGAATGGGGATTTGTCTTCATTAGACTTATAAACCTTCATGGAATATTT
+GTATGCCGACTCTATATCTATACCTTCATCTACATAAACACCTTCGTGATGTCTGCATGGAGACAAGACACCGGATCTGC
+ACAACATTGATAACGCCCAATCTTTTTGCTCAGACTCTAACTCATTGATACTCATTTATAAACTCCTTGCAATGTATGTC
+GTTTCAGCTAAACGGTATCAGCAATGTTTATGTAAAGAAACAGTAAGATAATACTCAACCCGATGTTTGAGTACGGTCAT
+CATCTGACACTACAGACTCTGGCATCGCTGTGAAGACGACGCGAAATTCAGCATTTTCACAAGCGTTATCTTTTACAAAA
+CCGATCTCACTCTCCTTTGATGCGAATGCCAGCGTCAGACATCATATGCAGATACTCACCTGCATCCTGAACCCATTGAC
+CTCCAACCCCGTAATAGCGATGCGTAATGATGTCGATAGTTACTAACGGGTCTTGTTCGATTAACTGCCGCAGAAACTCT
+TCCAGGTCACCAGTGCAGTGCTTGATAACAGGAGTCTTCCCAGGATGGCGAACAACAAGAAACTGGTTTCCGTCTTCACG
+GACTTCGTTGCTTTCCAGTTTAGCAATACGCTTACTCCCATCCGAGATAACACCTTCGTAATACTCACGCTGCTCGTTGA
+GTTTTGATTTTGCTGTTTCAAGCTCAACACGCAGTTTCCCTACTGTTAGCGCAATATCCTCGTTCTCCTGGTCGCGGCGT
+TTGATGTATTGCTGGTTTCTTTCCCGTTCATCCAGCAGTTCCAGCACAATCGATGGTGTTACCAATTCATGGAAAAGGTC
+TGCGTCAAATCCCCAGTCGTCATGCATTGCCTGCTCTGCCGCTTCACGCAGTGCCTGAGAGTTAATTTCGCTCACTTCGA
+ACCTCTCTGTTTACTGATAAGTTCCAGATCCTCCTGGCAACTTGCACAAGTCCGACAACCCTGAACGACCAGGCGTCTTC
+GTTCATCTATCGGATCGCCACACTCACAACAATGAGTGGCAGATATAGCCTGGTGGTTCAGGCGGCGCATTTTTATTGCT
+GTGTTGCGCTGTAATTCTTCTATTTCTGATGCTGAATCAATGATGTCTGCCATCTTTCATTAATCCCTGAACTGTTGGTT
+AATACGCTTGAGGGTGAATGCGAATAATAAAAAAGGAGCCTGTAGCTCCCTGATGATTTTGCTTTTCATGTTCATCGTTC
+CTTAAAGACGCCGTTTAACATGCCGATTGCCAGGCTTAAATGAGTCGGTGTGAATCCCATCAGCGTTACCGTTTCGCGGT
+GCTTCTTCAGTACGCTACGGCAAATGTCATCGACGTTTTTATCCGGAAACTGCTGTCTGGCTTTTTTTGATTTCAGAATT
+AGCCTGACGGGCAATGCTGCGAAGGGCGTTTTCCTGCTGAGGTGTCATTGAACAAGTCCCATGTCGGCAAGCATAAGCAC
+ACAGAATATGAAGCCCGCTGCCAGAAAAATGCATTCCGTGGTTGTCATACCTGGTTTCTCTCATCTGCTTCTGCTTTCGC
+CACCATCATTTCCAGCTTTTGTGAAAGGGATGCGGCTAACGTATGAAATTCTTCGTCTGTTTCTACTGGTATTGGCACAA
+ACCTGATTCCAATTTGAGCAAGGCTATGTGCCATCTCGATACTCGTTCTTAACTCAACAGAAGATGCTTTGTGCATACAG
+CCCCTCGTTTATTATTTATCTCCTCAGCCAGCCGCTGTGCTTTCAGTGGATTTCGGATAACAGAAAGGCCGGGAAATACC
+CAGCCTCGCTTTGTAACGGAGTAGACGAAAGTGATTGCGCCTACCCGGATATTATCGTGAGGATGCGTCATCGCCATTGC
+TCCCCAAATACAAAACCAATTTCAGCCAGTGCCTCGTCCATTTTTTCGATGAACTCCGGCACGATCTCGTCAAAACTCGC
+CATGTACTTTTCATCCCGCTCAATCACGACATAATGCAGGCCTTCACGCTTCATACGCGGGTCATAGTTGGCAAAGTACC
+AGGCATTTTTTCGCGTCACCCACATGCTGTACTGCACCTGGGCCATGTAAGCTGACTTTATGGCCTCGAAACCACCGAGC
+CGGAACTTCATGAAATCCCGGGAGGTAAACGGGCATTTCAGTTCAAGGCCGTTGCCGTCACTGCATAAACCATCGGGAGA
+GCAGGCGGTACGCATACTTTCGTCGCGATAGATGATCGGGGATTCAGTAACATTCACGCCGGAAGTGAATTCAAACAGGG
+TTCTGGCGTCGTTCTCGTACTGTTTTCCCCAGGCCAGTGCTTTAGCGTTAACTTCCGGAGCCACACCGGTGCAAACCTCA
+GCAAGCAGGGTGTGGAAGTAGGACATTTTCATGTCAGGCCACTTCTTTCCGGAGCGGGGTTTTGCTATCACGTTGTGAAC
+TTCTGAAGCGGTGATGACGCCGAGCCGTAATTTGTGCCACGCATCATCCCCCTGTTCGACAGCTCTCACATCGATCCCGG
+TACGCTGCAGGATAATGTCCGGTGTCATGCTGCCACCTTCTGCTCTGCGGCTTTCTGTTTCAGGAATCCAAGAGCTTTTA
+CTGCTTCGGCCTGTGTCAGTTCTGACGATGCACGAATGTCGCGGCGAAATATCTGGGAACAGAGCGGCAATAAGTCGTCA
+TCCCATGTTTTATCCAGGGCGATCAGCAGAGTGTTAATCTCCTGCATGGTTTCATCGTTAACCGGAGTGATGTCGCGTTC
+CGGCTGACGTTCTGCAGTGTATGCAGTATTTTCGACAATGCGCTCGGCTTCATCCTTGTCATAGATACCAGCAAATCCGA
+AGGCCAGACGGGCACACTGAATCATGGCTTTATGACGTAACATCCGTTTGGGATGCGACTGCCACGGCCCCGTGATTTCT
+CTGCCTTCGCGAGTTTTGAATGGTTCGCGGCGGCATTCATCCATCCATTCGGTAACGCAGATCGGATGATTACGGTCCTT
+GCGGTAAATCCGGCATGTACAGGATTCATTGTCCTGCTCAAAGTCCATGCCATCAAACTGCTGGTTTTCATTGATGATGC
+GGGACCAGCCATCAACGCCCACCACCGGAACGATGCCATTCTGCTTATCAGGAAAGGCGTAAATTTCTTTCGTCCACGGA
+TTAAGGCCGTACTGGTTGGCAACGATCAGTAATGCGATGAACTGCGCATCGCTGGCATCACCTTTAAATGCCGTCTGGCG
+AAGAGTGGTGATCAGTTCCTGTGGGTCGACAGAATCCATGCCGACACGTTCAGCCAGCTTCCCAGCCAGCGTTGCGAGTG
+CAGTACTCATTCGTTTTATACCTCTGAATCAATATCAACCTGGTGGTGAGCAATGGTTTCAACCATGTACCGGATGTGTT
+CTGCCATGCGCTCCTGAAACTCAACATCGTCATCAAACGCACGGGTAATGGATTTTTTGCTGGCCCCGTGGCGTTGCAAA
+TGATCGATGCATAGCGATTCAAACAGGTGCTGGGGCAGGCCTTTTTCCATGTCGTCTGCCAGTTCTGCCTCTTTCTCTTC
+ACGGGCGAGCTGCTGGTAGTGACGCGCCCAGCTCTGAGCCTCAAGACGATCCTGAATGTAATAAGCGTTCATGGCTGAAC
+TCCTGAAATAGCTGTGAAAATATCGCCCGCGAAATGCCGGGCTGATTAGGAAAACAGGAAAGGGGGTTAGTGAATGCTTT
+TGCTTGATCTCAGTTTCAGTATTAATATCCATTTTTTATAAGCGTCGACGGCTTCACGAAACATCTTTTCATCGCCAATA
+AAAGTGGCGATAGTGAATTTAGTCTGGATAGCCATAAGTGTTTGATCCATTCTTTGGGACTCCTGGCTGATTAAGTATGT
+CGATAAGGCGTTTCCATCCGTCACGTAATTTACGGGTGATTCGTTCAAGTAAAGATTCGGAAGGGCAGCCAGCAACAGGC
+CACCCTGCAATGGCATATTGCATGGTGTGCTCCTTATTTATACATAACGAAAAACGCCTCGAGTGAAGCGTTATTGGTAT
+GCGGTAAAACCGCACTCAGGCGGCCTTGATAGTCATATCATCTGAATCAAATATTCCTGATGTATCGATATCGGTAATTC
+TTATTCCTTCGCTACCATCCATTGGAGGCCATCCTTCCTGACCATTTCCATCATTCCAGTCGAACTCACACACAACACCA
+TATGCATTTAAGTCGCTTGAAATTGCTATAAGCAGAGCATGTTGCGCCAGCATGATTAATACAGCATTTAATACAGAGCC
+GTGTTTATTGAGTCGGTATTCAGAGTCTGACCAGAAATTATTAATCTGGTGAAGTTTTTCCTCTGTCATTACGTCATGGT
+CGATTTCAATTTCTATTGATGCTTTCCAGTCGTAATCAATGATGTATTTTTTGATGTTTGACATCTGTTCATATCCTCAC
+AGATAAAAAATCGCCCTCACACTGGAGGGCAAAGAAGATTTCCAATAATCAGAACAAGTCGGCTCCTGTTTAGTTACGAG
+CGACATTGCTCCGTGTATTCACTCGTTGGAATGAATACACAGTGCAGTGTTTATTCTGTTATTTATGCCAAAAATAAAGG
+CCACTATCAGGCAGCTTTGTTGTTCTGTTTACCAAGTTCTCTGGCAATCATTGCCGTCGTTCGTATTGCCCATTTATCGA
+CATATTTCCCATCTTCCATTACAGGAAACATTTCTTCAGGCTTAACCATGCATTCCGATTGCAGCTTGCATCCATTGCAT
+CGCTTGAATTGTCCACACCATTGATTTTTATCAATAGTCGTAGTCATACGGATAGTCCTGGTATTGTTCCATCACATCCT
+GAGGATGCTCTTCGAACTCTTCAAATTCTTCTTCCATATATCACCTTAAATAGTGGATTGCGGTAGTAAAGATTGTGCCT
+GTCTTTTAACCACATCAGGCTCGGTGGTTCTCGTGTACCCCTACAGCGAGAAATCGGATAAACTATTACAACCCCTACAG
+TTTGATGAGTATAGAAATGGATCCACTCGTTATTCTCGGACGAGTGTTCAGTAATGAACCTCTGGAGAGAACCATGTATA
+TGATCGTTATCTGGGTTGGACTTCTGCTTTTAAGCCCAGATAACTGGCCTGAATATGTTAATGAGAGAATCGGTATTCCT
+CATGTGTGGCATGTTTTCGTCTTTGCTCTTGCATTTTCGCTAGCAATTAATGTGCATCGATTATCAGCTATTGCCAGCGC
+CAGATATAAGCGATTTAAGCTAAGAAAACGCATTAAGATGCAAAACGATAAAGTGCGATCAGTAATTCAAAACCTTACAG
+AAGAGCAATCTATGGTTTTGTGCGCAGCCCTTAATGAAGGCAGGAAGTATGTGGTTACATCAAAACAATTCCCATACATT
+AGTGAGTTGATTGAGCTTGGTGTGTTGAACAAAACTTTTTCCCGATGGAATGGAAAGCATATATTATTCCCTATTGAGGA
+TATTTACTGGACTGAATTAGTTGCCAGCTATGATCCATATAATATTGAGATAAAGCCAAGGCCAATATCTAAGTAACTAG
+ATAAGAGGAATCGATTTTCCCTTAATTTTCTGGCGTCCACTGCATGTTATGCCGCGTTCGCCAGGCTTGCTGTACCATGT
+GCGCTGATTCTTGCGCTCAATACGTTGCAGGTTGCTTTCAATCTGTTTGTGGTATTCAGCCAGCACTGTAAGGTCTATCG
+GATTTAGTGCGCTTTCTACTCGTGATTTCGGTTTGCGATTCAGCGAGAGAATAGGGCGGTTAACTGGTTTTGCGCTTACC
+CCAACCAACAGGGGATTTGCTGCTTTCCATTGAGCCTGTTTCTCTGCGCGACGTTCGCGGCGGCGTGTTTGTGCATCCAT
+CTGGATTCTCCTGTCAGTTAGCTTTGGTGGTGTGTGGCAGTTGTAGTCCTGAACGAAAACCCCCCGCGATTGGCACATTG
+GCAGCTAATCCGGAATCGCACTTACGGCCAATGCTTCGTTTCGTATCACACACCCCAAAGCCTTCTGCTTTGAATGCTGC
+CCTTCTTCAGGGCTTAATTTTTAAGAGCGTCACCTTCATGGTGGTCAGTGCGTCCTGCTGATGTGCTCAGTATCACCGCC
+AGTGGTATTTATGTCAACACCGCCAGAGATAATTTATCACCGCAGATGGTTATCTGTATGTTTTTTATATGAATTTATTT
+TTTGCAGGGGGGCATTGTTTGGTAGGTGAGAGATCTGAATTGCTATGTTTAGTGAGTTGTATCTATTTATTTTTCAATAA
+ATACAATTGGTTATGTGTTTTGGGGGCGATCGTGAGGCAAAGAAAACCCGGCGCTGAGGCCGGGTTATTCTTGTTCTCTG
+GTCAAATTATATAGTTGGAAAACAAGGATGCATATATGAATGAACGATGCAGAGGCAATGCCGATGGCGATAGTGGGTAT
+CATGTAGCCGCTTATGCTGGAAAGAAGCAATAACCCGCAGAAAAACAAAGCTCCAAGCTCAACAAAACTAAGGGCATAGA
+CAATAACTACCGATGTCATATACCCATACTCTCTAATCTTGGCCAGTCGGCGCGTTCTGCTTCCGATTAGAAACGTCAAG
+GCAGCAATCAGGATTGCAATCATGGTTCCTGCATATGATGACAATGTCGCCCCAAGACCATCTCTATGAGCTGAAAAAGA
+AACACCAGGAATGTAGTGGCGGAAAAGGAGATAGCAAATGCTTACGATAACGTAAGGAATTATTACTATGTAAACACCAG
+GCATGATTCTGTTCCGCATAATTACTCCTGATAATTAATCCTTAACTTTGCCCACCTGCCTTTTAAAACATTCCAGTATA
+TCACTTTTCATTCTTGCGTAGCAATATGCCATCTCTTCAGCTATCTCAGCATTGGTGACCTTGTTCAGAGGCGCTGAGAG
+ATGGCCTTTTTCTGATAGATAATGTTCTGTTAAAATATCTCCGGCCTCATCTTTTGCCCGCAGGCTAATGTCTGAAAATT
+GAGGTGACGGGTTAAAAATAATATCCTTGGCAACCTTTTTTATATCCCTTTTAAATTTTGGCTTAATGACTATATCCAAT
+GAGTCAAAAAGCTCCCCTTCAATATCTGTTGCCCCTAAGACCTTTAATATATCGCCAAATACAGGTAGCTTGGCTTCTAC
+CTTCACCGTTGTTCGGCCGATGAAATGCATATGCATAACATCGTCTTTGGTGGTTCCCCTCATCAGTGGCTCTATCTGAA
+CGCGCTCTCCACTGCTTAATGACATTCCTTTCCCGATTAAAAAATCTGTCAGATCGGATGTGGTCGGCCCGAAAACAGTT
+CTGGCAAAACCAATGGTGTCGCCTTCAACAAACAAAAAAGATGGGAATCCCAATGATTCGTCATCTGCGAGGCTGTTCTT
+AATATCTTCAACTGAAGCTTTAGAGCGATTTATCTTCTGAACCAGACTCTTGTCATTTGTTTTGGTAAAGAGAAAAGTTT
+TTCCATCGATTTTATGAATATACAAATAATTGGAGCCAACCTGCAGGTGATGATTATCAGCCAGCAGAGAATTAAGGAAA
+ACAGACAGGTTTATTGAGCGCTTATCTTTCCCTTTATTTTTGCTGCGGTAAGTCGCATAAAAACCATTCTTCATAATTCA
+ATCCATTTACTATGTTATGTTCTGAGGGGAGTGAAAATTCCCCTAATTCGATGAAGATTCTTGCTCAATTGTTATCAGCT
+ATGCGCCGACCAGAACACCTTGCCGATCAGCCAAACGTCTCTTCAGGCCACTGACTAGCGATAACTTTCCCCACAACGGA
+ACAACTCTCATTGCATGGGATCATTGGGTACTGTGGGTTTAGTGGTTGTAAAAACACCTGACCGCTATCCCTGATCAGTT
+TCTTGAAGGTAAACTCATCACCCCCAAGTCTGGCTATGCAGAAATCACCTGGCTCAACAGCCTGCTCAGGGTCAACGAGA
+ATTAACATTCCGTCAGGAAAGCTTGGCTTGGAGCCTGTTGGTGCGGTCATGGAATTACCTTCAACCTCAAGCCAGAATGC
+AGAATCACTGGCTTTTTTGGTTGTGCTTACCCATCTCTCCGCATCACCTTTGGTAAAGGTTCTAAGCTTAGGTGAGAACA
+TCCCTGCCTGAACATGAGAAAAAACAGGGTACTCATACTCACTTCTAAGTGACGGCTGCATACTAACCGCTTCATACATC
+TCGTAGATTTCTCTGGCGATTGAAGGGCTAAATTCTTCAACGCTAACTTTGAGAATTTTTGTAAGCAATGCGGCGTTATA
+AGCATTTAATGCATTGATGCCATTAAATAAAGCACCAACGCCTGACTGCCCCATCCCCATCTTGTCTGCGACAGATTCCT
+GGGATAAGCCAAGTTCATTTTTCTTTTTTTCATAAATTGCTTTAAGGCGACGTGCGTCCTCAAGCTGCTCTTGTGTTAAT
+GGTTTCTTTTTTGTGCTCATACGTTAAATCTATCACCGCAAGGGATAAATATCTAACACCGTGCGTGTTGACTATTTTAC
+CTCTGGCGGTGATAATGGTTGCATGTACTAAGGAGGTTGTATGGAACAACGCATAACCCTGAAAGATTATGCAATGCGCT
+TTGGGCAAACCAAGACAGCTAAAGATCTCGGCGTATATCAAAGCGCGATCAACAAGGCCATTCATGCAGGCCGAAAGATT
+TTTTTAACTATAAACGCTGATGGAAGCGTTTATGCGGAAGAGGTAAAGCCCTTCCCGAGTAACAAAAAAACAACAGCATA
+AATAACCCCGCTCTTACACATTCCAGCCCTGAAAAAGGGCATCAAATTAAACCACACCTATGGTGTATGCATTTATTTGC
+ATACATTCAATCAATTGTTATCTAAGGAAATACTTACATATGGTTCGTGCAAACAAACGCAACGAGGCTCTACGAATCGA
+GAGTGCGTTGCTTAACAAAATCGCAATGCTTGGAACTGAGAAGACAGCGGAAGCTGTGGGCGTTGATAAGTCGCAGATCA
+GCAGGTGGAAGAGGGACTGGATTCCAAAGTTCTCAATGCTGCTTGCTGTTCTTGAATGGGGGGTCGTTGACGACGACATG
+GCTCGATTGGCGCGACAAGTTGCTGCGATTCTCACCAATAAAAAACGCCCGGCGGCAACCGAGCGTTCTGAACAAATCCA
+GATGGAGTTCTGAGGTCATTACTGGATCTATCAACAGGAGTCATTATGACAAATACAGCAAAAATACTCAACTTCGGCAG
+AGGTAACTTTGCCGGACAGGAGCGTAATGTGGCAGATCTCGATGATGGTTACGCCAGACTATCAAATATGCTGCTTGAGG
+CTTATTCGGGCGCAGATCTGACCAAGCGACAGTTTAAAGTGCTGCTTGCCATTCTGCGTAAAACCTATGGGTGGAATAAA
+CCAATGGACAGAATCACCGATTCTCAACTTAGCGAGATTACAAAGTTACCTGTCAAACGGTGCAATGAAGCCAAGTTAGA
+ACTCGTCAGAATGAATATTATCAAGCAGCAAGGCGGCATGTTTGGACCAAATAAAAACATCTCAGAATGGTGCATCCCTC
+AAAACGAGGGAAAATCCCCTAAAACGAGGGATAAAACATCCCTCAAATTGGGGGATTGCTATCCCTCAAAACAGGGGGAC
+ACAAAAGACACTATTACAAAAGAAAAAAGAAAAGATTATTCGTCAGAGAATTCTGGCGAATCCTCTGACCAGCCAGAAAA
+CGACCTTTCTGTGGTGAAACCGGATGCTGCAATTCAGAGCGGCAGCAAGTGGGGGACAGCAGAAGACCTGACCGCCGCAG
+AGTGGATGTTTGACATGGTGAAGACTATCGCACCATCAGCCAGAAAACCGAATTTTGCTGGGTGGGCTAACGATATCCGC
+CTGATGCGTGAACGTGACGGACGTAACCACCGCGACATGTGTGTGCTGTTCCGCTGGGCATGCCAGGACAACTTCTGGTC
+CGGTAACGTGCTGAGCCCGGCCAAACTCCGCGATAAGTGGACCCAACTCGAAATCAACCGTAACAAGCAACAGGCAGGCG
+TGACAGCCAGCAAACCAAAACTCGACCTGACAAACACAGACTGGATTTACGGGGTGGATCTATGAAAAACATCGCCGCAC
+AGATGGTTAACTTTGACCGTGAGCAGATGCGTCGGATCGCCAACAACATGCCGGAACAGTACGACGAAAAGCCGCAGGTA
+CAGCAGGTAGCGCAGATCATCAACGGTGTGTTCAGCCAGTTACTGGCAACTTTCCCGGCGAGCCTGGCTAACCGTGACCA
+GAACGAAGTGAACGAAATCCGTCGCCAGTGGGTTCTGGCTTTTCGGGAAAACGGGATCACCACGATGGAACAGGTTAACG
+CAGGAATGCGCGTAGCCCGTCGGCAGAATCGACCATTTCTGCCATCACCCGGGCAGTTTGTTGCATGGTGCCGGGAAGAA
+GCATCCGTTACCGCCGGACTGCCAAACGTCAGCGAGCTGGTTGATATGGTTTACGAGTATTGCCGGAAGCGAGGCCTGTA
+TCCGGATGCGGAGTCTTATCCGTGGAAATCAAACGCGCACTACTGGCTGGTTACCAACCTGTATCAGAACATGCGGGCCA
+ATGCGCTTACTGATGCGGAATTACGCCGTAAGGCCGCAGATGAGCTTGTCCATATGACTGCGAGAATTAACCGTGGTGAG
+GCGATCCCTGAACCAGTAAAACAACTTCCTGTCATGGGCGGTAGACCTCTAAATCGTGCACAGGCTCTGGCGAAGATCGC
+AGAAATCAAAGCTAAGTTCGGACTGAAAGGAGCAAGTGTATGACGGGCAAAGAGGCAATTATTCATTACCTGGGGACGCA
+TAATAGCTTCTGTGCGCCGGACGTTGCCGCGCTAACAGGCGCAACAGTAACCAGCATAAATCAGGCCGCGGCTAAAATGG
+CACGGGCAGGTCTTCTGGTTATCGAAGGTAAGGTCTGGCGAACGGTGTATTACCGGTTTGCTACCAGGGAAGAACGGGAA
+GGAAAGATGAGCACGAACCTGGTTTTTAAGGAGTGTCGCCAGAGTGCCGCGATGAAACGGGTATTGGCGGTATATGGAGT
+TAAAAGATGACCATCTACATTACTGAGCTAATAACAGGCCTGCTGGTAATCGCAGGCCTTTTTATTTGGGGGAGAGGGAA
+GTCATGAAAAAACTAACCTTTGAAATTCGATCTCCAGCACATCAGCAAAACGCTATTCACGCAGTACAGCAAATCCTTCC
+AGACCCAACCAAACCAATCGTAGTAACCATTCAGGAACGCAACCGCAGCTTAGACCAAAACAGGAAGCTATGGGCCTGCT
+TAGGTGACGTCTCTCGTCAGGTTGAATGGCATGGTCGCTGGCTGGATGCAGAAAGCTGGAAGTGTGTGTTTACCGCAGCA
+TTAAAGCAGCAGGATGTTGTTCCTAACCTTGCCGGGAATGGCTTTGTGGTAATAGGCCAGTCAACCAGCAGGATGCGTGT
+AGGCGAATTTGCGGAGCTATTAGAGCTTATACAGGCATTCGGTACAGAGCGTGGCGTTAAGTGGTCAGACGAAGCGAGAC
+TGGCTCTGGAGTGGAAAGCGAGATGGGGAGACAGGGCTGCATGATAAATGTCGTTAGTTTCTCCGGTGGCAGGACGTCAG
+CATATTTGCTCTGGCTAATGGAGCAAAAGCGACGGGCAGGTAAAGACGTGCATTACGTTTTCATGGATACAGGTTGTGAA
+CATCCAATGACATATCGGTTTGTCAGGGAAGTTGTGAAGTTCTGGGATATACCGCTCACCGTATTGCAGGTTGATATCAA
+CCCGGAGCTTGGACAGCCAAATGGTTATACGGTATGGGAACCAAAGGATATTCAGACGCGAATGCCTGTTCTGAAGCCAT
+TTATCGATATGGTAAAGAAATATGGCACTCCATACGTCGGCGGCGCGTTCTGCACTGACAGATTAAAACTCGTTCCCTTC
+ACCAAATACTGTGATGACCATTTCGGGCGAGGGAATTACACCACGTGGATTGGCATCAGAGCTGATGAACCGAAGCGGCT
+AAAGCCAAAGCCTGGAATCAGATATCTTGCTGAACTGTCAGACTTTGAGAAGGAAGATATCCTCGCATGGTGGAAGCAAC
+AACCATTCGATTTGCAAATACCGGAACATCTCGGTAACTGCATATTCTGCATTAAAAAATCAACGCAAAAAATCGGACTT
+GCCTGCAAAGATGAGGAGGGATTGCAGCGTGTTTTTAATGAGGTCATCACGGGATCCCATGTGCGTGACGGACATCGGGA
+AACGCCAAAGGAGATTATGTACCGAGGAAGAATGTCGCTGGACGGTATCGCGAAAATGTATTCAGAAAATGATTATCAAG
+CCCTGTATCAGGACATGGTACGAGCTAAAAGATTCGATACCGGCTCTTGTTCTGAGTCATGCGAAATATTTGGAGGGCAG
+CTTGATTTCGACTTCGGGAGGGAAGCTGCATGATGCGATGTTATCGGTGCGGTGAATGCAAAGAAGATAACCGCTTCCGA
+CCAAATCAACCTTACTGGAATCGATGGTGTCTCCGGTGTGAAAGAACACCAACAGGGGTGTTACCACTACCGCAGGAAAA
+GGAGGACGTGTGGCGAGACAGCGACGAAGTATCACCGACATAATCTGCGAAAACTGCAAATACCTTCCAACGAAACGCAC
+CAGAAATAAACCCAAGCCAATCCCAAAAGAATCTGACGTAAAAACCTTCAACTACACGGCTCACCTGTGGGATATCCGGT
+GGCTAAGACGTCGTGCGAGGAAAACAAGGTGATTGACCAAAATCGAAGTTACGAACAAGAAAGCGTCGAGCGAGCTTTAA
+CGTGCGCTAACTGCGGTCAGAAGCTGCATGTGCTGGAAGTTCACGTGTGTGAGCACTGCTGCGCAGAACTGATGAGCGAT
+CCGAATAGCTCGATGCACGAGGAAGAAGATGATGGCTAAACCAGCGCGAAGACGATGTAAAAACGATGAATGCCGGGAAT
+GGTTTCACCCTGCATTCGCTAATCAGTGGTGGTGCTCTCCAGAGTGTGGAACCAAGATAGCACTCGAACGACGAAGTAAA
+GAACGCGAAAAAGCGGAAAAAGCAGCAGAGAAGAAACGACGACGAGAGGAGCAGAAACAGAAAGATAAACTTAAGATTCG
+AAAACTCGCCTTAAAGCCCCGCAGTTACTGGATTAAACAAGCCCAACAAGCCGTAAACGCCTTCATCAGAGAAAGAGACC
+GCGACTTACCATGTATCTCGTGCGGAACGCTCACGTCTGCTCAGTGGGATGCCGGACATTACCGGACAACTGCTGCGGCA
+CCTCAACTCCGATTTAATGAACGCAATATTCACAAGCAATGCGTGGTGTGCAACCAGCACAAAAGCGGAAATCTCGTTCC
+GTATCGCGTCGAACTGATTAGCCGCATCGGGCAGGAAGCAGTAGACGAAATCGAATCAAACCATAACCGCCATCGCTGGA
+CTATCGAAGAGTGCAAGGCGATCAAGGCAGAGTACCAACAGAAACTCAAAGACCTGCGAAATAGCAGAAGTGAGGCCGCA
+TGACGTTCTCAGTAAAAACCATTCCAGACATGCTCGTTGAAACATACGGAAATCAGACAGAAGTAGCACGCAGACTGAAA
+TGTAGTCGCGGTACGGTCAGAAAATACGTTGATGATAAAGACGGGAAAATGCACGCCATCGTCAACGACGTTCTCATGGT
+TCATCGCGGATGGAGTGAAAGAGATGCGCTATTACGAAAAAATTGATGGCAGCAAATACCGAAATATTTGGGTAGTTGGC
+GATCTGCACGGATGCTACACGAACCTGATGAACAAACTGGATACGATTGGATTCGACAACAAAAAAGACCTGCTTATCTC
+GGTGGGCGATTTGGTTGATCGTGGTGCAGAGAACGTTGAATGCCTGGAATTAATCACATTCCCCTGGTTCAGAGCTGTAC
+GTGGAAACCATGAGCAAATGATGATTGATGGCTTATCAGAGCGTGGAAACGTTAATCACTGGCTGCTTAATGGCGGTGGC
+TGGTTCTTTAATCTCGATTACGACAAAGAAATTCTGGCTAAAGCTCTTGCCCATAAAGCAGATGAACTTCCGTTAATCAT
+CGAACTGGTGAGCAAAGATAAAAAATATGTTATCTGCCACGCCGATTATCCCTTTGACGAATACGAGTTTGGAAAGCCAG
+TTGATCATCAGCAGGTAATCTGGAACCGCGAACGAATCAGCAACTCACAAAACGGGATCGTGAAAGAAATCAAAGGCGCG
+GACACGTTCATCTTTGGTCATACGCCAGCAGTGAAACCACTCAAGTTTGCCAACCAAATGTATATCGATACCGGCGCAGT
+GTTCTGCGGAAACCTAACATTGATTCAGGTACAGGGAGAAGGCGCATGAGACTCGAAAGCGTAGCTAAATTTCATTCGCC
+AAAAAGCCCGATGATGAGCGACTCACCACGGGCCACGGCTTCTGACTCTCTTTCCGGTACTGATGTGATGGCTGCTATGG
+GGATGGCGCAATCACAAGCCGGATTCGGTATGGCTGCATTCTGCGGTAAGCACGAACTCAGCCAGAACGACAAACAAAAG
+GCTATCAACTATCTGATGCAATTTGCACACAAGGTATCGGGGAAATACCGTGGTGTGGCAAAGCTTGAAGGAAATACTAA
+GGCAAAGGTACTGCAAGTGCTCGCAACATTCGCTTATGCGGATTATTGCCGTAGTGCCGCGACGCCGGGGGCAAGATGCA
+GAGATTGCCATGGTACAGGCCGTGCGGTTGATATTGCCAAAACAGAGCTGTGGGGGAGAGTTGTCGAGAAAGAGTGCGGA
+AGATGCAAAGGCGTCGGCTATTCAAGGATGCCAGCAAGCGCAGCATATCGCGCTGTGACGATGCTAATCCCAAACCTTAC
+CCAACCCACCTGGTCACGCACTGTTAAGCCGCTGTATGACGCTCTGGTGGTGCAATGCCACAAAGAAGAGTCAATCGCAG
+ACAACATTTTGAATGCGGTCACACGTTAGCAGCATGATTGCCACGGATGGCAACATATTAACGGCATGATATTGACTTAT
+TGAATAAAATTGGGTAAATTTGACTCAACGATGGGTTAATTCGCTCGTTGTGGTAGTGAGATGAAAAGAGGCGGCGCTTA
+CTACCGATTCCGCCTAGTTGGTCACTTCGACGTATCGTCTGGAACTCCAACCATCGCAGGCAGAGAGGTCTGCAAAATGC
+AATCCCGAAACAGTTCGCAGGTAATAGTTAGAGCCTGCATAACGGTTTCGGGATTTTTTATATCTGCACAACAGGTAAGA
+GCATTGAGTCGATAATCGTGAAGAGTCGGCGAGCCTGGTTAGCCAGTGCTCTTTCCGTTGTGCTGAATTAAGCGAATACC
+GGAAGCAGAACCGGATCACCAAATGCGTACAGGCGTCATCGCCGCCCAGCAACAGCACAACCCAAACTGAGCCGTAGCCA
+CTGTCTGTCCTGAATTCATTAGTAATAGTTACGCTGCGGCCTTTTACACATGACCTTCGTGAAAGCGGGTGGCAGGAGGT
+CGCGCTAACAACCTCCTGCCGTTTTGCCCGTGCATATCGGTCACGAACAAATCTGATTACTAAACACAGTAGCCTGGATT
+TGTTCTATCAGTAATCGACCTTATTCCTAATTAAATAGAGCAAATCCCCTTATTGGGGGTAAGACATGAAGATGCCAGAA
+AAACATGACCTGTTGGCCGCCATTCTCGCGGCAAAGGAACAAGGCATCGGGGCAATCCTTGCGTTTGCAATGGCGTACCT
+TCGCGGCAGATATAATGGCGGTGCGTTTACAAAAACAGTAATCGACGCAACGATGTGCGCCATTATCGCCTAGTTCATTC
+GTGACCTTCTCGACTTCGCCGGACTAAGTAGCAATCTCGCTTATATAACGAGCGTGTTTATCGGCTACATCGGTACTGAC
+TCGATTGGTTCGCTTATCAAACGCTTCGCTGCTAAAAAAGCCGGAGTAGAAGATGGTAGAAATCAATAATCAACGTAAGG
+CGTTCCTCGATATGCTGGCGTGGTCGGAGGGAACTGATAACGGACGTCAGAAAACCAGAAATCATGGTTATGACGTCATT
+GTAGGCGGAGAGCTATTTACTGATTACTCCGATCACCCTCGCAAACTTGTCACGCTAAACCCAAAACTCAAATCAACAGG
+CGCCGGACGCTACCAGCTTCTTTCCCGTTGGTGGGATGCCTACCGCAAGCAGCTTGGCCTGAAAGACTTCTCTCCGAAAA
+GTCAGGACGCTGTGGCATTGCAGCAGATTAAGGAGCGTGGCGCTTTACCTATGATTGATCGTGGTGATATCCGTCAGGCA
+ATCGACCGTTGCAGCAATATCTGGGCTTCACTGCCGGGCGCTGGTTATGGTCAGTTCGAGCATAAGGCTGACAGCCTGAT
+TGCAAAATTCAAAGAAGCGGGCGGAACGGTCAGAGAGATTGATGTATGAGCAGAGTCACCGCGATTATCTCCGCTCTGGT
+TATCTGCATCATCGTCTGCCTGTCATGGGCTGTTAATCATTACCGTGATAACGCCATTACCTACAAAGCCCAGCGCGACA
+AAAATGCCAGAGAACTGAAGCTGGCGAACGCGGCAATTACTGACATGCAGATGCGTCAGCGTGATGTTGCTGCGCTCGAT
+GCAAAATACACGAAGGAGTTAGCTGATGCTAAAGCTGAAAATGATGCTCTGCGTGATGATGTTGCCGCTGGTCGTCGTCG
+GTTGCACATCAAAGCAGTCTGTCAGTCAGTGCGTGAAGCCACCACCGCCTCCGGCGTGGATAATGCAGCCTCCCCCCGAC
+TGGCAGACACCGCTGAACGGGATTATTTCACCCTCAGAGAGAGGCTGATCACTATGCAAAAACAACTGGAAGGAACCCAG
+AAGTATATTAATGAGCAGTGCAGATAGAGTTGCCCATATCGATGGGCAACTCATGCAATTATTGTGAGCAATACACACGC
+GCTTCCAGCGGAGTATAAATGCCTAAAGTAATAAAACCGAGCAATCCATTTACGAATGTTTGCTGGGTTTCTGTTTTAAC
+AACATTTTCTGCGCCGCCACAAATTTTGGCTGCATCGACAGTTTTCTTCTGCCCAATTCCAGAAACGAAGAAATGATGGG
+TGATGGTTTCCTTTGGTGCTACTGCTGCCGGTTTGTTTTGAACAGTAAACGTCTGTTGAGCACATCCTGTAATAAGCAGG
+GCCAGCGCAGTAGCGAGTAGCATTTTTTTCATGGTGTTATTCCCGATGCTTTTTGAAGTTCGCAGAATCGTATGTGTAGA
+AAATTAAACAAACCCTAAACAATGAGTTGAAATTTCATATTGTTAATATTTATTAATGTATGTCAGGTGCGATGAATCGT
+CATTGTATTCCCGGATTAACTATGTCCACAGCCCTGACGGGGAACTTCTCTGCGGGAGTGTCCGGGAATAATTAAAACGA
+TGCACACAGGGTTTAGCGCGTACACGTATTGCATTATGCCAACGCCCCGGTGCTGACACGGAAGAAACCGGACGTTATGA
+TTTAGCGTGGAAAGATTTGTGTAGTGTTCTGAATGCTCTCAGTAAATAGTAATGAATTATCAAAGGTATAGTAATATCTT
+TTATGTTCATGGATATTTGTAACCCATCGGAAAACTCCTGCTTTAGCAAGATTTTCCCTGTATTGCTGAAATGTGATTTC
+TCTTGATTTCAACCTATCATAGGACGTTTCTATAAGATGCGTGTTTCTTGAGAATTTAACATTTACAACCTTTTTAAGTC
+CTTTTATTAACACGGTGTTATCGTTTTCTAACACGATGTGAATATTATCTGTGGCTAGATAGTAAATATAATGTGAGACG
+TTGTGACGTTTTAGTTCAGAATAAAACAATTCACAGTCTAAATCTTTTCGCACTTGATCGAATATTTCTTTAAAAATGGC
+AACCTGAGCCATTGGTAAAACCTTCCATGTGATACGAGGGCGCGTAGTTTGCATTATCGTTTTTATCGTTTCAATCTGGT
+CTGACCTCCTTGTGTTTTGTTGATGATTTATGTCAAATATTAGGAATGTTTTCACTTAATAGTATTGGTTGCGTAACAAA
+GTGCGGTCCTGCTGGCATTCTGGAGGGAAATACAACCGACAGATGTATGTAAGGCCAACGTGCTCAAATCTTCATACAGA
+AAGATTTGAAGTAATATTTTAACCGCTAGATGAAGAGCAAGCGCATGGAGCGACAAAATGAATAAAGAACAATCTGCTGA
+TGATCCCTCCGTGGATCTGATTCGTGTAAAAAATATGCTTAATAGCACCATTTCTATGAGTTACCCTGATGTTGTAATTG
+CATGTATAGAACATAAGGTGTCTCTGGAAGCATTCAGAGCAATTGAGGCAGCGTTGGTGAAGCACGATAATAATATGAAG
+GATTATTCCCTGGTGGTTGACTGATCACCATAACTGCTAATCATTCAAACTATTTAGTCTGTGACAGAGCCAACACGCAG
+TCTGTCACTGTCAGGAAAGTGGTAAAACTGCAACTCAATTACTGCAATGCCCTCGTAATTAAGTGAATTTACAATATCGT
+CCTGTTCGGAGGGAAGAACGCGGGATGTTCATTCTTCATCACTTTTAATTGATGTATATGCTCTCTTTTCTGACGTTAGT
+CTCCGACGGCAGGCTTCAATGACCCAGGCTGAGAAATTCCCGGACCCTTTTTGCTCAAGAGCGATGTTAATTTGTTCAAT
+CATTTGGTTAGGAAAGCGGATGTTGCGGGTTGTTGTTCTGCGGGTTCTGTTCTTCGTTGACATGAGGTTGCCCCGTATTC
+AGTGTCGCTGATTTGTATTGTCTGAAGTTGTTTTTACGTTAAGTTGATGCAGATCAATTAATACGATACCTGCGTCATAA
+TTGATTATTTGACGTGGTTTGATGGCCTCCACGCACGTTGTGATATGTAGATGATAATCATTATCACTTTACGGGTCCTT
+TCCGGTGATCCGACAGGTTACG
diff --git a/tests/data/lambdaNEB.fa.fai b/tests/data/lambdaNEB.fa.fai
new file mode 100644
index 0000000..064af36
--- /dev/null
+++ b/tests/data/lambdaNEB.fa.fai
@@ -0,0 +1 @@
+lambda_NEB3011 48502 16 80 81
diff --git a/tests/data/polymerase/internal.polymerase.bam b/tests/data/polymerase/internal.polymerase.bam
new file mode 100644
index 0000000..5a9a3c2
Binary files /dev/null and b/tests/data/polymerase/internal.polymerase.bam differ
diff --git a/tests/data/polymerase/internal.scraps.bam b/tests/data/polymerase/internal.scraps.bam
new file mode 100644
index 0000000..ee501d3
Binary files /dev/null and b/tests/data/polymerase/internal.scraps.bam differ
diff --git a/tests/data/polymerase/internal.subreads.bam b/tests/data/polymerase/internal.subreads.bam
new file mode 100644
index 0000000..a352448
Binary files /dev/null and b/tests/data/polymerase/internal.subreads.bam differ
diff --git a/tests/data/polymerase/internal_hq.hqregion.bam b/tests/data/polymerase/internal_hq.hqregion.bam
new file mode 100644
index 0000000..e59134a
Binary files /dev/null and b/tests/data/polymerase/internal_hq.hqregion.bam differ
diff --git a/tests/data/polymerase/internal_hq.scraps.bam b/tests/data/polymerase/internal_hq.scraps.bam
new file mode 100644
index 0000000..154d2a1
Binary files /dev/null and b/tests/data/polymerase/internal_hq.scraps.bam differ
diff --git a/tests/data/polymerase/internal_polymerase.fasta b/tests/data/polymerase/internal_polymerase.fasta
new file mode 100644
index 0000000..9fb8832
--- /dev/null
+++ b/tests/data/polymerase/internal_polymerase.fasta
@@ -0,0 +1,2 @@
+>m130615_051803_richard_c100541252550000001823084511241346_s1_p0/66617/2659_7034
+CCAGTTTCTCTCTCACGTCACACCCATGAAAAGCAATGGATCTCTCTCTACACAACACAGAGCAAAGCGGAGGTTGGAGCTGTGAAAAAAAGAGATTGAGAATCCAATCCTTAGACCTCTATTAAGTCGACAACACCGCAGAGAACAAGCATCCTATCTGTGTCATTATCCGGTGGTGTTGGAGAGTTTGATATTATACAACAATAAAATACATATAATAGTAGAAATTCATCCCACAACAAAATCTTTATTAGGGTAAGTAGAAGCTTATCTATGAAACTGGGTTCATAAAAAGTTAAGAAAGAATAACAATAGATATAAAGAGGAACACACAAGTTGAATTTTATCGCATATAGCAATTAATCAAGAGGAATTGCAGGTTTTAATCTCATGGCTTTGAGCCTACTATTCTATGAGCTTGGGCTTACACACAGTGTCTTGACCGTAGATGCAGATCTTCTCCTCCAAACACACTAAACACCACCTTCACAA [...]
diff --git a/tests/data/polymerase/production.polymerase.bam b/tests/data/polymerase/production.polymerase.bam
new file mode 100644
index 0000000..9c192da
Binary files /dev/null and b/tests/data/polymerase/production.polymerase.bam differ
diff --git a/tests/data/polymerase/production.scraps.bam b/tests/data/polymerase/production.scraps.bam
new file mode 100644
index 0000000..c8c20df
Binary files /dev/null and b/tests/data/polymerase/production.scraps.bam differ
diff --git a/tests/data/polymerase/production.subreads.bam b/tests/data/polymerase/production.subreads.bam
new file mode 100644
index 0000000..9c56583
Binary files /dev/null and b/tests/data/polymerase/production.subreads.bam differ
diff --git a/tests/data/polymerase/production_hq.hqregion.bam b/tests/data/polymerase/production_hq.hqregion.bam
new file mode 100644
index 0000000..2993089
Binary files /dev/null and b/tests/data/polymerase/production_hq.hqregion.bam differ
diff --git a/tests/data/polymerase/production_hq.scraps.bam b/tests/data/polymerase/production_hq.scraps.bam
new file mode 100644
index 0000000..1c392fc
Binary files /dev/null and b/tests/data/polymerase/production_hq.scraps.bam differ
diff --git a/tests/data/segfault.bam b/tests/data/segfault.bam
new file mode 100644
index 0000000..c091600
Binary files /dev/null and b/tests/data/segfault.bam differ
diff --git a/tests/data/temp.bam b/tests/data/temp.bam
new file mode 100644
index 0000000..efba168
Binary files /dev/null and b/tests/data/temp.bam differ
diff --git a/tests/data/temp.sam b/tests/data/temp.sam
new file mode 100644
index 0000000..85cb839
--- /dev/null
+++ b/tests/data/temp.sam
@@ -0,0 +1,3310 @@
+ at HD VN:1.0 SO:coordinate
+ at SQ SN:seq1 LN:1575
+ at SQ SN:seq2 LN:1584
+B7_591:4:96:693:509 73 seq1 1 99 36M * 0 0 CACTAGTGGCTCATTGTAAATGTGTGGTTTAACTCG <<<<<<<<<<<<<<<;<<<<<<<<<5<<<<<;:<;7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:152:368:113 73 seq1 3 99 35M * 0 0 CTAGTGGCTCATTGTAAATGTGTGGTTTAACTCGT <<<<<<<<<<0<<<<655<<7<<<:9<<3/:<6): MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:8:5:734:57 137 seq1 5 99 35M * 0 0 AGTGGCTCATTGTAAATGTGTGGTTTAACTCGTCC <<<<<<<<<<<7;71<<;<;;<7;<<3;);3*8/5 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:289:587:906 137 seq1 6 63 36M * 0 0 GTGGCTCATTGTAATTTTTTGTTTTAACTCTTCTCT (-&----,----)-)-),'--)---',+-,),''*, MF:i:-126 Aq:i:63 NM:i:5 UQ:i:38 H0:i:0 H1:i:0
+EAS56_59:8:38:671:758 137 seq1 9 99 35M * 0 0 GCTCATTGTAAATGTGTGGTTTAACTCGTCCATGG <<<<<<<<<<<<<<<;<;7<<<<<<<<7<<;:<5% MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:18:467:281 73 seq1 13 99 35M * 0 0 ATTGTAAATGTGTGGTTTAACTCGTCCCTGGCCCA <<<<<<<<;<<<8<<<<<;8:;6/686&;(16666 MF:i:18 Aq:i:39 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_28:5:296:340:699 137 seq1 13 99 36M * 0 0 ATTGTAAATGTGTGGTTTAACTCGTCCATGGCCCAG <<<<<;<<<;<;<<<<<<<<<<<8<8<3<8;<;<0; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:194:894:408 73 seq1 15 99 35M * 0 0 TGTAAATGTGTGGTTTAACTCGTCCATTGCCCAGC <<<<<<<<<7<<;<<<<;<<<7;;<<<*,;;572< MF:i:18 Aq:i:43 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS188_4:8:12:628:973 89 seq1 18 75 35M * 0 0 AAATGTGTGGTTTAACTCGTCCATGGCCCAGCATT ==;=:;:;;:====;=;===:=======;==;=== MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:68:402:50 137 seq1 22 99 35M * 0 0 GTGTGGTTTAACTCGTCCATGGCCCAGCATTTGGG <<<<<<<<<<<<<<:<<<9<6;9;;&697;7&<55 MF:i:18 Aq:i:66 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_30:6:298:115:564 137 seq1 22 99 35M * 0 0 GTGTGGTTTAACTCGTCCATGGCCCAGCATTAGGG <<<<<<<<<<<<<;<<<;<<<;<<<;<:<<;;5;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:188:662:155 73 seq1 24 99 36M * 0 0 GTGGTTTAACTCGTCCATGGCCCAGCATTAGGGAGC <<<<<<<<<<<<<<<<<<:;<<<4<<+<<14991;4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:225:608:291 73 seq1 28 99 35M * 0 0 TTTAACTCGTCCATGGCCCAGCATTAGGGATCTGT <<<<<<<<<<<<<<8&<<<;6<9;;+2++(%59(< MF:i:18 Aq:i:58 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_66:7:328:397:316 73 seq1 29 99 35M * 0 0 TTAACTCGTCCATGGCCCAGCATTAGGGAGCTGTG <<<<<<<<<<<<<6=<<<;<<5<<<+<15:'<;;4 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:257:960:682 73 seq1 31 75 35M * 0 0 AACTCGTCCATGGCCCAGCATTAGGGAGCTGTGGA <<<<<<<<<<<;<<<<<<<<<<<<<<<<<<9;;9< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:143:69:578 83 seq1 36 98 35M = 185 184 GTACATGGCCCAGCATTAGGGAGCTGTGGACCCCG ===;=====48=844;=;+=5==*57,2+5&,5+5 MF:i:18 Aq:i:35 NM:i:2 UQ:i:38 H0:i:0 H1:i:1
+EAS114_32:5:78:583:499 147 seq1 37 74 35M = 229 227 TCCATGGCCCAGCATTAGGGCGCTGTGGACCCTGC <<8;<<<<<<1<<-1<+8<<&;:555;5-*77/51 MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_93:7:252:171:323 147 seq1 43 99 35M = 234 226 GCCCAGCATTAGGGAGCTGTGGACCCTGCAGCCTG <<<):<<<<<<<<<:<<<&5<<2<562<<<<-7-- MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:106:316:452 83 seq1 49 99 36M = 224 211 CATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTTG ;<<;<<<<;<;;;;7;<;<<<;<<;<<;4:<<;+&+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_589:8:113:968:19 147 seq1 50 99 35M = 219 204 ATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGGGG <<<<;<;<<<<<<:;;;.;;<75;);;;<.2+(;5 MF:i:18 Aq:i:63 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_65:3:321:311:983 83 seq1 51 99 35M = 228 212 TTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGG <<<;<<<<<<<<+;;<47;<9;94430499<88+6 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:155:12:674 147 seq1 52 99 36M = 224 208 TAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<+:9-<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:51:1429:1043 147 seq1 59 99 35M = 209 185 CTGTGGACCCTGCAGCCTGGCTGTGGGGGGCGCCG <<<<<<<<<<<<<:<<<;<<<<:):;<;;-15)+1 MF:i:18 Aq:i:68 NM:i:2 UQ:i:22 H0:i:1 H1:i:0
+B7_591:5:42:540:501 83 seq1 60 99 36M = 224 200 TGTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG <<<<<<<<<<<<<<<<<<<<<<.;<<<<,804,858 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:223:142:410 83 seq1 60 99 35M = 235 210 TGTGGACCCTGCAGCCTGGCTGGGGGGGGCGCAGT <<<<<<<<<<<<<<:<5<<2<<(<:<<<:5,((7( MF:i:18 Aq:i:39 NM:i:2 UQ:i:32 H0:i:0 H1:i:1
+EAS1_108:1:65:787:74 147 seq1 61 88 35M = 213 187 GTGGACCCTGCAGCCTGGCTGGGGGGGGCACGGGG <<<<<8-82<2823;-<;822222888,*(2%2-2 MF:i:18 Aq:i:21 NM:i:5 UQ:i:51 H0:i:0 H1:i:0
+EAS56_61:6:227:259:597 83 seq1 61 99 35M = 248 222 GTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG <<<<<<<<<<;;<<<6;8:68333;<8(8,1,$$+ MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:243:10:911 147 seq1 63 99 35M = 236 208 GGACCCTGCAGCCTGGCTGTGGGGGCCGCTGTGGG <<;<<<<<<<<<<7<<<<<7<<<<<:4<((<%;<+ MF:i:18 Aq:i:64 NM:i:2 UQ:i:22 H0:i:1 H1:i:0
+EAS221_1:2:90:986:1224 147 seq1 67 99 35M = 267 235 CCTGCAGCCTGGCTGTGGGGGCCGCAGCGGGTGGG <<:<<<<<<<<<<<<0<<<<<)<<63<+<<2'<-< MF:i:18 Aq:i:41 NM:i:3 UQ:i:39 H0:i:0 H1:i:1
+EAS54_67:3:175:730:949 147 seq1 70 99 35M = 230 195 GCAGCCTGGCTGTGGGGGCCGCAGTGGCTGAGGGG <<<<<<<<<<8<;<<<<<0(<<;;,<<7<4%7626 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:76:493:708 83 seq1 73 44 35M = 229 191 GCCTGGCTGTGGGGGCACCAGCCGCTGCGGGGGGT <<<<1<<1<;626<;<''+;-'';+2'+;;)6--+ MF:i:-126 Aq:i:44 NM:i:5 UQ:i:34 H0:i:0 H1:i:0
+EAS1_97:7:20:979:96 147 seq1 79 99 35M = 254 210 CTGTGGGGGCCGCAGTGGCTGAGGGGGGGAGGGGC <<<<<<;<<<<<7<<,<<,:;,<<<<17)++':.' MF:i:18 Aq:i:37 NM:i:4 UQ:i:43 H0:i:0 H1:i:1
+EAS114_26:3:284:261:124 147 seq1 79 99 35M = 263 219 CTGTGGGGGCCGCAGTGGGTGAGGGGTGGAGGGGG ============'8====':=+====,=8,8'=++ MF:i:18 Aq:i:39 NM:i:5 UQ:i:64 H0:i:0 H1:i:1
+EAS221_1:2:29:1486:672 83 seq1 79 99 35M = 256 212 CTGTGGGGGCCGCAGTGGCTGAGGGGTGCAGAGCC <<<<<<<<<<<<<;<;<<<<<;<<<<8;;;<8;-; MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:218:877:489 147 seq1 80 10 35M = 250 205 TGTGGGGGCCGCAGTGGCTGGGGGGGGGCGGGCGG <<<<<<<;<<<07640<2<9(<9<<&9%(<(6%%3 MF:i:18 Aq:i:10 NM:i:6 UQ:i:34 H0:i:0 H1:i:0
+EAS51_64:7:242:862:732 73 seq1 95 66 35M = 95 0 GGCTGAGGGGTGCAGAGCCGAGTCACGGGGTTGCC <<<<<<<<<<<<<<<;<<<:<;+<3<::3<';:'; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:242:862:732 133 seq1 95 0 * = 95 0 GGGTCTATGTGAACAAAGGCACTAAACACAGCTGT <<<<<<<<<<8<<<<<78<<<378<<<77755++2 MF:i:-64
+EAS56_57:6:190:289:82 69 seq1 100 0 * = 100 0 CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA <<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<; MF:i:-64
+EAS56_57:6:190:289:82 137 seq1 100 73 35M = 100 0 AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC <<<<<<;<<<<<<<<<<;<<;<<<<;8<6;9;;2; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:190:727:308 83 seq1 103 99 35M = 263 195 GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<844 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:141:80:875 83 seq1 110 99 35M = 265 190 AGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAA <<<<<<<<<<<<<<<<<<<<<<:<<8;<<8+7;-7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:40:1128:1940 147 seq1 112 99 35M = 291 214 CCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACC <<<<<<<<<<<<<<<<<<<;<<5;;<<<9;;;;7: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:290:319:736 69 seq1 113 0 * = 113 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<<<<:7:<.<<<<7<<.<.<<.9*<4<:<4%74 MF:i:-64
+EAS51_62:5:290:319:736 137 seq1 113 73 35M = 113 0 CGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCT ==;=======7====6=;==:;;====66=::27: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:132:493:921 69 seq1 119 0 * = 119 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<<<<<<<<<<<<<<<<<;<<<<77;0<;;6777 MF:i:-64
+B7_597:2:132:493:921 137 seq1 119 75 35M = 119 0 ACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTG <<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;88: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:283:799:560 147 seq1 121 66 35M = 283 197 GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGAC <<<<+<<<<8<<<+<<<<<;<<:07;8;7402447 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:225:195:543 83 seq1 123 99 35M = 299 211 GGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTG <<<<<<<<<<<<<<<<<<<<<<<9<<;::388998 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:114:714:317 83 seq1 126 99 35M = 311 220 TGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5;<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:70:147:84 147 seq1 128 73 35M = 285 192 CCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;(5<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:187:227:818 147 seq1 129 99 35M = 290 196 CAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:77:29:126 83 seq1 131 99 35M = 315 219 GCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCT <<<<<<<<<<3<<<<<<<;;;7<;<<449<-:977 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:327:795:103 83 seq1 133 99 35M = 302 204 ACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:139:117:262 69 seq1 135 0 * = 135 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<7<<<<<<<<<<<<<<<<<<<;<;<<<<<37;3 MF:i:-64
+EAS114_30:3:139:117:262 137 seq1 135 76 35M = 135 0 AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG <<<<;<<<<<<<<<<<<<:<<<<<:<<8<<<<:<: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:29:817:854 73 seq1 135 77 35M = 135 0 AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:29:817:854 133 seq1 135 0 * = 135 0 GTTCTCAAGGTTGTTGCAAGGGGGTTTATGTGAAC <<<<<<<<<<<<<<<1..;:;;;;1%407)07&7. MF:i:-64
+EAS192_3:6:170:169:57 147 seq1 138 99 35M = 296 193 GGCTTGACCTCTGGTGACTGCCAGAGCTGCTGGCC <<<<<;<<<<<<;<<<<<<<<<<<<:<<<<<;;+% MF:i:18 Aq:i:45 NM:i:2 UQ:i:30 H0:i:0 H1:i:1
+B7_595:4:84:802:737 83 seq1 140 68 35M = 284 179 CTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAG <<<<<<<<<<;9<9<<<;<<;73;<<<<<37;1+. MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:78:583:670 147 seq1 142 99 35M = 316 209 TAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCT <<<<<<<<<<;;;<;;<<<:7;5;<5;;<2--8-; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:90:435:691 83 seq1 147 99 35M = 318 206 TCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGT <<<<<<<<<<;<<<;<<<<:<<<;<81;<<1;784 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:13:122:187 147 seq1 153 99 35M = 343 225 GACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCCTT <<<<<<<;<;<<<;<<<<:;6<<<<;;;;:<<%%< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS221_1:6:69:735:1915 83 seq1 154 99 35M = 321 202 ACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTT <<<<<<<<;<<<<<<<<<;<<<<;<8<<<<;1:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:66:959:1311 147 seq1 159 95 35M = 336 212 CAGAGCTGCTGGCAAGCTAGAGGCCCATCTGGAGC ;;4;;;+;;;-01;;&-;;4;;&;;73)(&**274 MF:i:18 Aq:i:31 NM:i:2 UQ:i:12 H0:i:0 H1:i:1
+EAS56_57:6:325:759:288 83 seq1 163 99 35M = 341 213 GCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCT 8<;<<<<81<<<<<;<<;<<<;9</;6;;809034 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:82:926:112 83 seq1 164 99 35M = 328 199 CTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTC <;<<<<<<<<<5<<<<<<<<<<<<<<<;<<1:<4< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:324:728:956 83 seq1 165 99 35M = 322 192 TGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCT <<<<<<<<<<<<<<<<<<<<8<<<:<::;;;;<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:294:525:849 147 seq1 167 99 35M = 340 208 CTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAA <<<<<<<<<<<<<<<<<<<<<<9+<:<<<<9;;15 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:159:125:297 147 seq1 170 99 35M = 337 202 GCAAGCTAGAGTCCCATTTGGAGCCACTCTAAGAC <<<<<<<<<<<<<<;<<<;<;<<6;)<:9;26;39 MF:i:18 Aq:i:43 NM:i:2 UQ:i:26 H0:i:0 H1:i:1
+EAS54_65:6:164:797:930 83 seq1 173 99 35M = 332 194 AGCTAGAGACCCATTTGGAGCCCCTCTAAGCCGTT <<<<<<<<<<<<<<<;;;:<<<<<;<;<<<<<,:: MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_81:7:293:355:321 147 seq1 174 99 35M = 356 217 GCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTC <<<:<;<<<<<<<;<<<<<<<<<;<<;4<<<:+:< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:653:400 147 seq1 175 99 35M = 340 200 CTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCT <;<9<<+<2<9<,;;64;<<<<;8<00*1<48:+8 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:62:1109:804 147 seq1 176 99 35M = 350 209 TAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTA <<<<<<<<<<<<<:<<:<<<<<<:<:<<<<;;;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:303:402:142 147 seq1 181 99 35M = 343 197 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT <8<<<<<<<<<<<<<<<<<<<<<<<46<648;;'; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:321:642:388 147 seq1 181 99 35M = 357 209 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:1:1140:1206 147 seq1 181 99 35M = 368 222 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT ;;;;;;;;;;;;;:9;;7;;:;:;97;:;:88888 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:155:68:326 83 seq1 182 99 36M = 332 186 CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:19:886:279 83 seq1 182 99 35M = 337 190 CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTA <9<<<<<<<<<<<<6<28:<<85<<<<<2<;<9<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:143:69:578 147 seq1 185 98 35M = 36 -184 ATTGGGAGCCCCTCTAAGCCGTTCTATTTGTAATG 222&<21<<<<12<7<01<<<<<0<<<<<<<20<< MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_71:4:13:981:659 149 seq1 187 0 * = 188 35 CGGGACAATGGACGAGGTAAACCGCACATTGACAA +)---3&&3&--+0)&+3:7777).333:<06<<< MF:i:-64
+EAS54_71:4:13:981:659 89 seq1 188 37 34M = 187 -35 TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA ()&)06636;;<664*6;<<<<<<<<<<<<<<<1 MF:i:64 Aq:i:0 NM:i:2 UQ:i:14 H0:i:0 H1:i:1
+B7_610:1:37:652:403 147 seq1 193 99 35M = 347 189 CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT <<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:282:274:50 147 seq1 193 99 35M = 371 213 CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT <<<<<<<<<<<<<<<<<;<<<<<99<9<5909;5; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:133:460:542 83 seq1 195 99 36M = 356 197 CCTATAAGCCGTTCTATTTGTAATGAAAACTATATT <<<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_73:5:44:498:945 83 seq1 195 82 35M = 377 217 CCTATAAGCCGTTCTATTTGTAATGAAAACTATAT ;<;<<<<<<<<<<9<;<:<<<<<<:<<<<;:;<3< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:1:139:152:856 83 seq1 198 99 35M = 392 229 CTAAGCCGTTCTATTTGTAATGAAAACTATATTTA <<<<<<<<;<<<<<<<<<<;<;<<<;<<<<;<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:323:639:311 147 seq1 200 99 36M = 357 193 AAGCCGTTCTATTTGTAATGAAAACTATATTTAGGC <<<<<<<<<<<<<<<<<<<2<<<<<<;<<<<<<81< MF:i:18 Aq:i:70 NM:i:1 UQ:i:23 H0:i:1 H1:i:0
+EAS114_39:2:18:967:582 147 seq1 200 99 35M = 398 233 AAGCCGTTCTATTTGTAATGAAAACTATATTTATG <<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:186:850:838 83 seq1 205 99 35M = 389 219 GTTCTATTTGTAATGAAAACTATATTTATGCTATT <<<<<;<<<<<<<<<<<:<<<<<;<<<;</<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:126:558:408 147 seq1 206 99 35M = 368 197 TTCTATTTGTAATGAAAACTATATTTATGCTATTC <<<<<<<<<<<<<:<<<<<<<<<<<<<<7<;<<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:157:643:175 147 seq1 206 99 35M = 380 209 TTCTATTTGTAATGAAAACTATATTTATGCTATTC <<<<<<<<;<<<<<<<<<<<<<<<<<<<)<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:141:711:813 83 seq1 209 99 35M = 370 196 TATTTGTAATGAAAACTATATTTATGCTATTCAGT <<<<<<<<<<;<<<<<<<<<<<<<<;<<<<<<:+< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:115:538:276 147 seq1 209 99 35M = 360 186 TATTTGTAATGAAAACTATATTTATGCTATTCAGT <<<<<<<<;<<<;;<<<;<:<<<:<<<<<<;;;7; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:51:1429:1043 83 seq1 209 99 35M = 59 -185 TATTTGTAATGAAAACTATATTTATGCTATTCAGT 9<5<<<<<<<<<<<<<9<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:176:168:513 147 seq1 210 99 35M = 410 235 ATTTGTAATGAAAACTATATTTATGCTATTCAGTT <<<<;<<<<<<<<<<<<<<<<<<<:&<<<<:;0;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:282:817:710 83 seq1 211 99 35M = 384 208 TTTGTAATGAAAACTATATTTATGCTATTCAGTTC <<<<<<<<<<<<<<<<<<<<<<<;:<<<<:8,<<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:65:787:74 83 seq1 213 88 35M = 61 -187 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 44848=:1661/66==?:<=:?6><<<<1>><<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:240:264:231 89 seq1 213 66 35M = 213 -35 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 9;,;;62<9<)29<<<;96<<<;<<7<<<<<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:240:264:231 149 seq1 213 0 * = 213 35 CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA %15+5022))0&<<)0)+7:4+&<0<<:0<<<7<< MF:i:-64
+EAS1_93:7:14:426:613 83 seq1 214 99 35M = 379 200 GTAATGAAAACTATATTTATGCTATTCAGTTCTAA ======;=;==========;;==3=;==-=<;<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:173:995:93 147 seq1 215 99 35M = 382 202 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<<<<<<<<<<<<<7:<<<<;:<:<<<<:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:195:348:703 147 seq1 215 99 35M = 353 173 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<;<<<<<;:<<<<<<<<<<<<:<1:<:7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:62:879:264 147 seq1 216 99 35M = 396 215 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:83:452:970 83 seq1 216 99 35M = 379 198 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT ==========================;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:64:1318:1711 83 seq1 218 99 35M = 389 206 TGAAAACTATATTTATGCTATTCAGTTCTAAATAT <<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:113:968:19 83 seq1 219 99 35M = 50 -204 GAAAACTATATTTATGCTATTCAGTTCTAAATATA 8;<;8;9<<<<<<<9<:<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:160:896:275 147 seq1 220 99 35M = 387 202 AAAACTATATTTATGCTATTCAGTTCTAAATATAG ============<====<==<====<==<==;=:6 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:181:191:418 147 seq1 221 99 36M = 387 202 AAACTATATTTATGCTATTCAGTTCTAAATATAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<988 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:242:354:637 83 seq1 222 99 36M = 417 231 AACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<6<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:77:789 147 seq1 223 99 35M = 396 208 ACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<:<4<<9<:7<<<:<<<7<<<<<<<<<<9<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:42:540:501 147 seq1 224 99 36M = 60 -200 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:155:12:674 83 seq1 224 99 36M = 52 -208 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<;<<<<;<<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:106:316:452 147 seq1 224 99 36M = 49 -211 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT :<<<<<;<<<<:<<:<<<<<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:89:525:113 147 seq1 227 78 40M = 397 210 TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG <1<7<6;+0;7;7'<70;-<7<:<:<<5<<:9<5:7:%:7 MF:i:18 Aq:i:39 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS54_65:3:321:311:983 147 seq1 228 99 35M = 51 -212 ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA ;;4;;<7<<<<<<77<<<<<<<<<<17<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:76:493:708 147 seq1 229 44 35M = 73 -191 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA 5/)63.&1517(544(055(0454&7706566679 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:125:628:79 147 seq1 229 99 35M = 400 205 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA ==================<6<====<<:<==7;:: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:78:583:499 83 seq1 229 74 35M = 37 -227 TTTACGCTATTCAGTACTAAATATAGAAATTGAAA &6&9774&<;67<44&-4<;<9<7<<<<<;<<<<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:27 H0:i:0 H1:i:1
+EAS54_67:3:175:730:949 83 seq1 230 99 35M = 70 -195 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC <<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:84:275:1572 147 seq1 230 99 35M = 394 199 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC /6;;;4;;;;;;;;7;;4;.4;;;;;6;;;77077 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:248:753:731 83 seq1 231 99 35M = 402 206 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA <<<<<<<<<<<8<<<<<<<<<<<<:<<<<&<:<.: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:9:1289:215 83 seq1 231 99 35M = 394 198 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA ;;;;;;9;;;67;;;;;99;9;;;;;;;;977747 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:188:802:71 147 seq1 232 99 35M = 415 218 ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG <<<<<<<<<;<<<<<9<<<:<<<:<<<<<<:<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:252:171:323 83 seq1 234 99 35M = 43 -226 GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT ;8<;<=3=6==:====;;======;========== MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:223:142:410 147 seq1 235 99 35M = 60 -210 CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG 8;<<<;<<<<;<<<<<<;<;<<<<<<<<<<<<;<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:243:10:911 83 seq1 236 99 35M = 63 -208 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;<;;;<4;9:<<<;<<;<<<<<;;<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:5:730:1436 147 seq1 236 99 35M = 403 202 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:57:1672:1890 89 seq1 236 75 40M = 236 -40 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA :;;;9<8;;*<<<<<<:<<<<<<<<1:<<<<<<<<<<<7< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:57:1672:1890 149 seq1 236 0 * = 236 40 CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA -+)%)'-'+,,<066,))090+:&486083:5&&:<<5<0 MF:i:-64
+EAS1_105:2:299:360:220 83 seq1 237 99 35M = 403 201 ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG <<<<<<<9<9<<<<<<<<<<<<<<<<<5<;<0<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:24:1037:84 147 seq1 238 99 35M = 415 212 TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<;:<57< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:86:823:683 147 seq1 240 99 35M = 408 203 CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT <<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;9<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:130:568:978 83 seq1 246 88 35M = 434 223 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC 7<<;<<;<7<:;<7<<<<<<<<);4;+<7+3+%;< MF:i:18 Aq:i:24 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS114_45:4:73:1208:495 147 seq1 246 99 35M = 431 220 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC ;;;;;;;;;;;;;;;;;;;;;;;;5;;;;;37377 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:264:642:506 83 seq1 247 99 35M = 420 208 AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT <<;<<<<<<;<<<;:;;:;;<<;<<<<;*+;*&.4 MF:i:18 Aq:i:56 NM:i:3 UQ:i:28 H0:i:1 H1:i:0
+EAS114_28:5:104:350:749 147 seq1 247 99 36M = 415 204 AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <<8<<<<<<<<<<<;<<<<<<<<0;<<<9;<85;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:227:259:597 147 seq1 248 99 35M = 61 -222 AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:113:809:364 83 seq1 250 99 35M = 413 198 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<7<;<;<<<4 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:218:877:489 83 seq1 250 86 35M = 80 -205 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG 9<<<8<<<;<9<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:20:979:96 83 seq1 254 99 35M = 79 -210 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA '9996;(:;-<;1<<<<=<<<<=<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:259:219:114 83 seq1 254 99 35M = 411 192 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA <<<<<<<<<<<<<<<;<<<<<<7<7<<<<<0<<9< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:13:1034:1144 83 seq1 256 99 35M = 429 208 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<<<<<<<<<<<<<<<<<<<<<<<3<<<;<<;<++ MF:i:18 Aq:i:69 NM:i:2 UQ:i:48 H0:i:1 H1:i:0
+EAS221_1:2:29:1486:672 147 seq1 256 99 35M = 79 -212 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<:<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<++ MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS139_11:7:46:695:738 147 seq1 259 74 35M = 428 204 TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG <;<<<<;<<),&4<3<<7&7<0;)).3;79;7<;0 MF:i:-126 Aq:i:74 NM:i:3 UQ:i:18 H0:i:0 H1:i:0
+EAS139_11:8:26:1221:222 147 seq1 261 99 35M = 446 220 AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:190:727:308 147 seq1 263 99 35M = 103 -195 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:284:261:124 83 seq1 263 99 35M = 79 -219 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ===27===.====&===========;;======== MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:141:80:875 147 seq1 265 99 35M = 110 -190 AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA 6/<;84<;<;<<<<<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:24:1135:563 147 seq1 266 99 40M = 446 220 GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC <<<<:<<<<:1:<<<<<<.<<<<<<<<;<;;;43+:30:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:90:986:1224 83 seq1 267 99 35M = 67 -235 CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC <7*37;;;;;;;9<<;<7<<<<<<<<<<<;;<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:287:492:169 83 seq1 269 99 36M = 449 216 GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC <<<7<<<<<<<<<<<<<<<<<<<<<<<8;;<;6<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:48:9:409 83 seq1 271 75 18M5I12M = 464 228 GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:1:87:1222:878 147 seq1 272 10 40M = 435 203 TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA &+6<6&<:<<9<1112<<;)9227</);;;2-79;)/769 MF:i:18 Aq:i:10 NM:i:3 UQ:i:41 H0:i:0 H1:i:0
+B7_591:7:200:192:373 147 seq1 275 75 14M5I17M = 451 212 AGTGCCTTTGTTCACATAGACCCCCTTGCAACAACC <<<<<<<<<<<<<<<<<<<<<<<<<:<:<;5<<;<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_65:1:163:846:223 147 seq1 278 74 11M5I19M = 463 220 GCCTTTGTTCACATAGACCCCCTTGCAACAACCTT <<<<;<<;4<<<;;9<<<<<+<<;<</27;;47;. MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:7:283:799:560 83 seq1 283 66 35M = 121 -197 ACATAGACCCCCTTGCAACAACCTTGAGAACCCCA <4<6<8;;6<<<+;<:<<;<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:66 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_595:4:84:802:737 147 seq1 284 68 35M = 140 -179 CATAGACCCCCTTGCAACAACCTTGAGAACCCCAG +<1<-;69;;;;8;:<<6<;<<<<<<<<<<<<<<< MF:i:-126 Aq:i:68 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_66:5:308:400:602 147 seq1 285 71 35M = 470 220 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG ;<<<<<<<<<<<<<<<<<<<<<<<<;;;<<;<;76 MF:i:-126 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS54_81:2:285:367:932 147 seq1 285 74 35M = 440 190 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG ===========;======;=====;=======5== MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:1:70:147:84 83 seq1 285 73 35M = 128 -192 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG <<<:<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<; MF:i:-126 Aq:i:73 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_62:3:314:386:190 83 seq1 287 98 35M = 459 207 AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA ++<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS56_65:1:53:272:944 83 seq1 287 99 35M = 447 195 CAACCCCCTTGCAACAACCTTGCGAACCCCAGGGA <<<<<<<<<<<<.7<.<<<<<<-<-<<<<<&<222 MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS188_7:5:112:51:128 147 seq1 287 99 35M = 477 225 AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA ++<<<<<<<<<<<<<5<<<<<<<<<<<<<<;<;<6 MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS56_57:6:44:280:641 147 seq1 288 99 35M = 454 201 AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA ;<<<<<<<<<<66<;<<<<<;<<2;;;<<;;;;,; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:75:946:1035 83 seq1 288 99 35M = 480 227 AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA <<<<<<<<<<;<<<;<<<<<<<8;<6<<<<44<:4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:187:227:818 83 seq1 290 99 35M = 129 -196 CCCCCTTGCAACAACCTTGAGAACCCCAGGGAATT <<9<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:40:1128:1940 83 seq1 291 99 35M = 112 -214 CCCCTTACAACAACCTTGAGAACCCCAGGGAATTT <<<:///77:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS54_71:4:72:63:435 83 seq1 293 99 34M = 490 232 CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG <<<<<<<<<<<<<<<<<<<<;<<<;<;;39:7:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:271:244:568 83 seq1 294 99 35M = 481 222 CTTGCAACAACCTTGAGAACCCCAGGGAATTTGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:82:902:868 83 seq1 295 99 35M = 471 211 TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA <<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:313:83:546 147 seq1 296 99 35M = 454 193 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<;<<<<<<<<<<<<<<4<<<:<;<<9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:57:786:414 147 seq1 296 99 35M = 453 192 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<<<<<<<<<<<<<<:<<:<<:;;7<7 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:260:985:520 147 seq1 296 99 35M = 468 207 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<<<<<<<<;:;<<;<:<<<,:1;)<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:170:169:57 83 seq1 296 99 35M = 138 -193 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA 778<:<<<9<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:199:327:965 147 seq1 297 91 35M = 494 232 NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT !,+*+++++++++++*+++++++**)+*+**+(** MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+B7_610:5:147:68:353 147 seq1 299 99 35M = 486 222 AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT <;<;<<7<<<<<<<7<<;;<7<4<8<<<8.;4;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:225:195:543 147 seq1 299 99 35M = 123 -211 AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT ;;8;;+;(<<<<<<<<7;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:303:184:14 147 seq1 301 99 35M = 479 213 CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA <<<<<<8<0<<<<-<-98<<--<<<6;076;75+& MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:326:309:149 147 seq1 301 99 35M = 467 201 CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA <<<<<<<<<<<<<<<<<<<<:<<<<<<<<<;;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:327:795:103 147 seq1 302 99 35M = 133 -204 AACCTTGAGAACCCCAGGGAATTTGTCAATGTCAG ;::;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:110:355:323 83 seq1 303 99 35M = 477 209 ACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGG <<<<<<<<<<<<<<<<<<<<<<<<;<<<<;;<<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:18:1418:237 83 seq1 304 99 35M = 503 234 CCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<7< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:112:203:90 147 seq1 305 99 35M = 470 200 CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA <<:<<<<<<<<.<<<<<<<<<<<<6<:867<8884 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:319:246:304 83 seq1 305 99 35M = 472 202 CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:114:714:317 147 seq1 311 99 35M = 126 -220 AACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGC ;8<;:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:327:991:508 83 seq1 312 99 35M = 495 218 ACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCA <<<<<<<<<<<<<<<<<<<<<;<;:<7:47;:75; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:77:29:126 147 seq1 315 99 35M = 131 -219 ACAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT ()9;;<<<<<<<<<<5<<<7<<<<<<;<<<;7<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS219_1:1:37:1004:1136 83 seq1 315 99 35M = 473 193 CCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT <<<<<<<<<<<<<<;<<<;<<<<<:<<;;369<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:78:583:670 83 seq1 316 99 35M = 142 -209 CAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTT 8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:90:435:691 147 seq1 318 99 35M = 147 -206 GGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGT ;;<;;;+<<:<<<:<;;<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:69:735:1915 147 seq1 321 99 35M = 154 -202 AATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAG <<::<<<7<<<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:324:728:956 147 seq1 322 99 35M = 165 -192 ATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGT <;;;;5;<<0<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:269:280:716 83 seq1 323 99 35M = 490 202 TTTGTCAATGTCAGGGAAGGAGCATTTTTTCAGTT <<<<<<<<<2<<:2:1<<7/2/:3<<<<*<3($<< MF:i:18 Aq:i:58 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_73:3:88:24:744 147 seq1 325 84 35M = 484 194 TGTCAATGTCAGGGAAGGAGCATTTTTGAAGTTTA <7*:<<::.'<<<<:<<:<<'<63'6+'303*%%+ MF:i:18 Aq:i:21 NM:i:5 UQ:i:53 H0:i:0 H1:i:0
+EAS1_108:7:82:926:112 147 seq1 328 99 35M = 164 -199 CAATGTCAGGGAAGGAGCATTTTGTCAGTTGCCAA <1:/<*6<<6<<<<<6<<<<<<4<<<<82<+<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS56_63:7:185:213:330 147 seq1 328 99 35M = 502 209 CAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAA <<<<<<<<<;<<;<<<<<;<<<<;;;<<;<<;<38 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:277:458:330 147 seq1 329 99 36M = 490 197 AATGTCAGGGAAGGAGCCTTTTGTCAGTTACCAAAT <<7<<<<<<<<<2<<<%,<6<&<<,<<<<:<<<<(7 MF:i:18 Aq:i:41 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+B7_595:1:81:1000:375 147 seq1 329 90 35M = 524 230 NATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAA !.............................+.(+. MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS220_1:8:33:672:473 83 seq1 330 99 35M = 515 220 ATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAAT <<<<<<<<7<7<7<<62<<<<66<15*/99*5241 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:164:797:930 147 seq1 332 99 35M = 173 -194 GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGT ;;:;8<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:155:68:326 147 seq1 332 99 36M = 182 -186 GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTG ;<<<:6<<<<<<6<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:202:39:380 83 seq1 334 99 35M = 513 214 CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT <<<<<<<<<<<<<<<<<;<<:;<<18<84:<&<+< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:42:1091:1726 83 seq1 334 99 35M = 502 203 CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT <<<<<<<<<<<<<<<<<<<<<<8<<<<<<8:<.<: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:66:959:1311 83 seq1 336 95 35M = 159 -212 GGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT 67.68:4::6;;;7:6:;:5;8;;<<:;;<;;;;< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:200:559:765 83 seq1 337 99 36M = 521 220 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTAT <<<<<<<<<<<<<<7<<<<<<;<<;;4<7<9;<<-; MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:328:669:662 83 seq1 337 99 34M = 512 210 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT <<<<<<<<<<<<<<<<<<<<<<<<+9;<;;.<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:159:125:297 83 seq1 337 99 35M = 170 -202 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA 89<;;8<<;<;<4<;<8<<<<;;8<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:19:886:279 147 seq1 337 99 35M = 182 -190 GAAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA 9%<2)2.2::<;<<<2<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:67 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+B7_595:1:209:653:400 83 seq1 340 99 35M = 175 -200 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA <69<98<+<<6<<4<<<<</4<<:<4<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:294:525:849 83 seq1 340 99 35M = 167 -208 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA ;<;:;:<;<;<<<3<<<;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:87:1375:1303 147 seq1 340 99 35M = 529 224 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA <<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:325:759:288 147 seq1 341 99 35M = 163 -213 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC 9;<9<;<;;<;<;<;<<<:<;<<<;<<<<<;<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:76:786:458 147 seq1 341 99 35M = 502 196 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC <<.<<<<2<<:84<:<<<:<8<<)<)429<2<<8< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:210:880:606 147 seq1 341 99 35M = 518 212 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT <<<<<<<<<<<<<<<<<<;<<<<<<:<<<<3<<8& MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS192_3:3:257:611:440 83 seq1 341 99 35M = 524 218 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC <<<<<<<<<<<<<<<<<<<<8<<<<;<<<<8<<+5 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:303:402:142 83 seq1 343 99 35M = 181 -197 AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA ;;;;;<9<<8;<<<<7<<;<<<<;<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:13:122:187 83 seq1 343 99 35M = 153 -225 AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA <<&<;;<<<;7<<<<;<;<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:80:885:513 147 seq1 344 99 35M = 507 198 GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG <<<<<<<<<<<<<<<<<<<:<<<<2:<;<<75<7; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:90:1873:89 83 seq1 344 99 35M = 531 222 GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<7<<<7 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:1:37:652:403 83 seq1 347 99 35M = 193 -189 TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG <;<<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:28:701:724 147 seq1 347 99 35M = 521 209 TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG <<<<<<7<<<<<<7::<:<<-<<::::::<747:: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:66:655:769 83 seq1 348 99 35M = 515 202 TTTGTCAGTTACCAAATGTGTTTATTACCAGAGGG 8;<<<<<8<<<<<;<<<7<;<<<<<;<7<27<;;7 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:231:339:551 147 seq1 350 99 35M = 527 212 TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT <<<<<<;<<<<<<;<<<<<<<<<<;5<<46;<;:1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:129:694:359 147 seq1 350 88 35M = 525 210 TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT ============+7=======:==;;;'=;==7;= MF:i:18 Aq:i:43 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+EAS220_1:2:62:1109:804 83 seq1 350 99 35M = 176 -209 TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT <<<<<:<<<::<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:157:935:374 83 seq1 353 99 35M = 512 194 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <<<<<<<<<<;<<;;<<<<<<<<<::8'5++;+11 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:103:111:720 83 seq1 353 99 36M = 512 195 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGAG <<<<<<<<<<<<<<<<<<<<<<<<<5<<<5;<5<:; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:311:100:539 147 seq1 353 99 35M = 508 190 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <<<<;<<<<;<<<<<;<<<<<<<<<:<::;7;<0; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:195:348:703 83 seq1 353 99 35M = 215 -173 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <9<<9</<<<<<<<<<<<<<<2<8<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:72:308:839 147 seq1 354 99 40M = 517 203 AGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG <<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<99494416: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:133:460:542 147 seq1 356 99 36M = 195 -197 TTACCAAATGTGTTTATTACCAGAGGGATGGAGGGA ;:;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:293:355:321 83 seq1 356 99 35M = 174 -217 TTACCAAATGTGTTTATTACCAGAGGGATGGAGGG <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:323:639:311 83 seq1 357 99 36M = 200 -193 TACCAAATGTGTTTATTACCAGAGGGATGGAGGGAA -94<<<<<<<4<<<<<<<<2<<<<<7<<<-<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:321:642:388 83 seq1 357 99 33M = 181 -209 TACCAAATGTGTTTATTACCAGAGGGATGGAGG 19<<<<<8<<<<<<<<;<<<<<<<<<<7<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:4:262:456:74 83 seq1 357 99 35M = 504 182 TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA <<<<<<<<<<<<<<<<<<<<:;;:;7:<::7<7:3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:95:426:791 83 seq1 359 99 35M = 547 223 CCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG <<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<,<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:115:538:276 83 seq1 360 99 35M = 209 -186 CAAATGTGTTTATTACCAGAGGGATGGAGGGAAGA :<<<<<<<<;;<5<<;<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:196:533:921 83 seq1 361 99 35M = 526 200 AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAG =====1========8===:===7======971=3= MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:121:380:656 83 seq1 362 99 35M = 542 215 AATGTGTTTATTACCAGAGGGATGGAGGGAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<:<:<<83<:<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:34:970:1374 83 seq1 363 99 35M = 520 192 ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG <<<<<<<<<<<<<<;7<77;<<;<;;9;;:86::: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:29:1061:574 147 seq1 363 99 35M = 563 235 ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG <<<<<<<<<<<<<<<<<<;<<<<<<;<<8<:<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:124:243:35 83 seq1 364 60 35M = 544 215 TGTGTTTATTACCAGAGGGATGGAGGGAAGAGCGA <<<<<;;<<<<<<:<<<.<<<:++5+:1(;1;$<( MF:i:18 Aq:i:60 NM:i:1 UQ:i:3 H0:i:1 H1:i:0
+EAS114_30:2:272:750:698 147 seq1 365 80 35M = 538 208 GTGTTTATTACCAGAGGGATGGAGGGATGACGGAC <)<<<<<7;<<<4<;7<<<<78068:(%<3*861, MF:i:18 Aq:i:37 NM:i:2 UQ:i:13 H0:i:0 H1:i:1
+EAS56_53:3:126:558:408 83 seq1 368 99 35M = 206 -197 TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT <:<<:;;<<<<<<<<8<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:1:1140:1206 83 seq1 368 99 35M = 181 -222 TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT 77977::99;;;:;;<;;;:;;;<<;<;;;;<;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:141:711:813 147 seq1 370 99 35M = 209 -196 TATTACCAGAGGGATGGAGGGAAGAGGGACGCTGA =<5<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:282:274:50 83 seq1 371 99 35M = 193 -213 ATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAA </7;/:<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:485:482 83 seq1 371 94 35M = 530 194 ATTACCAGAGGGATGAAGGGAAGAGGGACGCTGAA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<:<:89< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_63:1:119:446:185 147 seq1 372 99 35M = 562 225 TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG <<<<<<<7<<<4<<<<9<<54<:<7<5:<::7-5; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:168:69:605 147 seq1 373 67 36M = 565 228 TACCCGAGGGATGGAGGGTAGAGGGACGCTGAAGTG <<<4(<<<<<<<<<<<<<(1<6<-<2<<7<<6<<++ MF:i:18 Aq:i:26 NM:i:4 UQ:i:59 H0:i:0 H1:i:0
+EAS114_32:6:78:909:394 147 seq1 373 81 35M = 554 216 TACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGA <<<<<<8<<<&<<<-<<<14,4;<<-0<2+<)/82 MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:5:41:118:1246 83 seq1 374 99 35M = 548 209 ACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAA <<<<<<<<<<<<<<<<<<<<<<<</<<<<<<1<<( MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:44:498:945 147 seq1 377 82 35M = 195 -217 ATAGGGATGGAGGGAAGAGGGCCGCTGAAGAACTT <%*50<7<4<<<7<,<<.<8/,9<:</<<<;<;<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:15 H0:i:0 H1:i:1
+EAS114_39:5:50:972:1286 147 seq1 377 99 35M = 559 217 AGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTT <<<<<<<<<<<<<<<<<;<<<<<<<<<6<<7:7:; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:82:164:1924 147 seq1 378 99 35M = 542 199 GAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTT <<<<<<<<<<<<<<<<<<<<8<<<<<<3<<'<7<8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:14:426:613 147 seq1 379 99 35M = 214 -200 AGGGAGGGAGGGAAGAGGGACGCTGAAGAACTTTG :<<<<&<<<<<<<<<<<<<<6<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_61:4:83:452:970 147 seq1 379 99 35M = 216 -198 AGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTG <<<39<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:157:643:175 83 seq1 380 99 35M = 206 -209 GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA ;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:61:1797:113 83 seq1 380 99 35M = 551 206 GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA <<<<<<;<<<<;:<3<<<<;;<<<8<<;:<<;3<. MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:90:828:633 147 seq1 381 99 36M = 537 192 GGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATG <<<<<<<<<<<8<;96<;<<<<<99<2<<;<96<8; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:61:433:385 147 seq1 381 99 35M = 579 233 GGATGGAGGGAAGAGGGACGCTGAAGCACTTTGAT <<<<<<<<<<<<<<<<<;<<;<<6<<)91<<;;,; MF:i:18 Aq:i:43 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+EAS1_93:2:173:995:93 83 seq1 382 99 35M = 215 -202 GCTGGAGGGAAGAGGGACGCTGAAGAACTTTGATG <(0<<9<<<7<<<<<<7<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:73 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_71:3:254:32:275 83 seq1 382 99 34M = 575 228 GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT <<<<<<<<<<<<<<<<<<<<<<;;<:<::<:2*< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:282:817:710 147 seq1 384 99 35M = 211 -208 TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC 366=6;======8====:========;======== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:75:217:337 147 seq1 386 99 35M = 568 217 GAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT ;;;;;;;;;;;;;;;;;;8;;;;;;;;;;;88787 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:181:191:418 83 seq1 387 99 36M = 221 -202 AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:160:896:275 83 seq1 387 99 35M = 220 -202 AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTC ;;;9;<<<<<<;<;;<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:88:1656:896 83 seq1 387 99 40M = 538 191 AGGGAAGAGGGATGCTGAAGAACTTTGATGCCCTCTTCTT <<<9<<<<<<<9<<<;<<<<<<<<<;6<<;7<<<<::9:; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_597:8:186:850:838 147 seq1 389 99 35M = 205 -219 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <;<;<;<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:64:1318:1711 147 seq1 389 99 35M = 218 -206 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:78:1478:1446 83 seq1 389 99 35M = 560 206 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<:<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:82:879:246 147 seq1 391 99 35M = 576 220 AAGAGGGACGCTGAAGAATTTTGATGCCCTCTTCT <<<<<<<<<<<<<<<<<<&<<<77<<-<<<6<62< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_610:1:139:152:856 147 seq1 392 99 35M = 198 -229 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT <<<<<;<<<<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:162:503:769 83 seq1 392 99 35M = 571 214 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT ========================:========== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:216:988:883 147 seq1 392 99 35M = 584 227 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT <<<<<<<<<<<<8;<;88<;8;;;;828;8;8;;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:118:523:591 147 seq1 393 99 35M = 563 205 GAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTC <<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<;;<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:3:168:741:680 147 seq1 394 99 35M = 562 203 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC <<<<<<<<<<<<<<<<<<<<<<<<<1<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:9:1289:215 147 seq1 394 99 35M = 231 -198 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC 7747*7;;;;+;;:2;7;:1;;9:;:;:;;:;::; MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:84:275:1572 83 seq1 394 99 35M = 230 -199 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC 777777::7:;74;:;:7;:::;;;;:;;8;;;<; MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:77:789 83 seq1 396 99 35M = 223 -208 GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA 9<;<:<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:62:879:264 83 seq1 396 99 35M = 216 -215 GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA ====:=<============================ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:89:525:113 83 seq1 397 78 40M = 227 -210 GACGCTGAAGAACTTTGATTCCCTCTTCTTCCAAAGATGA );:+4-&<<+<<:<+<)<<<7<8<8:<:<<:<82::<<2< MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_39:2:18:967:582 83 seq1 398 99 35M = 200 -233 ACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAG <:<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:140:522:212 147 seq1 399 99 35M = 568 204 CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA <<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<;95; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:125:628:79 83 seq1 400 99 34M = 229 -205 GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA 95&<<<<<<<63<<<6<<<<8<;<<8<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:185:312:167 147 seq1 401 99 35M = 562 196 CTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATG ===========================;855;=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:248:753:731 147 seq1 402 99 35M = 231 -206 TGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGA 7;55;=,=89=====3===9=======9======= MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:299:360:220 147 seq1 403 99 35M = 237 -201 GAAGAACTTAGATGCCCTCTTCTTCCAAAGATGAA 66<;;4;<<()<<4<<<<<<;<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS114_45:6:5:730:1436 83 seq1 403 99 35M = 236 -202 GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA 7977979;;;;;;;;;7;3<;2<;26;<;<<;;<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:134:868:252 83 seq1 404 99 36M = 595 227 AAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:165:431:857 83 seq1 406 99 35M = 559 188 GAACTTTGATGCCCTCTTCTTCCAAAGATGAAACG <<<<<<<<<<<<<<<<<<<<<<<6&:<7<:76,;; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:86:823:683 83 seq1 408 99 35M = 240 -203 ACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCG <4<<<<<<<<:<<6<<7<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:176:168:513 83 seq1 410 99 35M = 210 -235 TTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTA ;0;;;7:<<<<<<<;<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:259:219:114 147 seq1 411 99 35M = 254 -192 TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA 666<:6/:6::6::<:::<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:84:1013:1074 89 seq1 411 71 35M = 411 -35 TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA 8;;<;8744<7<<4<<47<<<<<<7<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:84:1013:1074 149 seq1 411 0 * = 411 35 GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC <7<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-64
+EAS54_81:7:325:150:465 83 seq1 412 99 35M = 598 221 TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<3;;: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:179:13:782 147 seq1 412 99 35M = 568 191 TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC <<<<<<<<<<<<<<<<<:<<:7<<<<::<7<:-:1 MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:113:809:364 147 seq1 413 99 35M = 250 -198 GATGCCCTCTTCTTCCAAAGATGAAACGCGTAACT ;<;;;<<<:<6<<<::<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:188:802:71 83 seq1 415 99 35M = 232 -218 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC ;;;;<:::<<<<<7<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:204:264:413 83 seq1 415 96 34M = 593 213 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG <<<<<<<<<<<<<;:59<+<<:<<<9<<;:62<) MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:104:350:749 83 seq1 415 99 36M = 247 -204 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCG ;<93;9;<3;<<<;<<<<<;<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:24:1037:84 83 seq1 415 99 35M = 238 -212 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC <;<<;<<<7<<7&<<<<<<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:242:354:637 147 seq1 417 99 36M = 222 -231 CCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT 8<;;;;;<<<8;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:37:761:635 83 seq1 418 99 35M = 581 198 CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT <6<<<<<<6<<<<<<<<<<<<<<<<<8<8<<4<4< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:44:1578:1674 83 seq1 418 99 35M = 573 190 CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT ;<<;<<;<<;;;;;9<;9;;<9:;;<:;9;76669 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:120:63:653 83 seq1 420 99 35M = 598 213 TCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<9<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:264:642:506 147 seq1 420 99 35M = 247 -208 ACTTCATCCAAAGATGAAACGCGTAACTGCGCTCT &;(-/)-1&:<<9<25<<<<2<1<';8<<<:888< MF:i:18 Aq:i:56 NM:i:2 UQ:i:13 H0:i:1 H1:i:0
+EAS188_7:3:101:572:491 83 seq1 425 99 35M = 600 210 TTCCAAAGATGAAACGCGTAACTGCGCTCTCATTC <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<1<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:27:1881:486 147 seq1 427 99 35M = 607 215 CCAAAGATGAAACGCGTAACTGCGCTCTCATTCAC ;;;;;;;;;;;;;;1;;;;;;;;78;8;8;8878/ MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:120:14:944 147 seq1 428 99 35M = 621 228 CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT <<<<<<<<<<<<<<<;<<<<<;<<<<<<<:;8;;7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:46:695:738 83 seq1 428 74 35M = 259 -204 CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT <<<<2<5<<-<<<<<<<4<<<<<<<<<<<<<<3<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:13:1034:1144 147 seq1 429 99 35M = 256 -208 AAAGATGAAACGCGTAACTGCGCTCTCATTCACTC <<:%<9)<<<<<<8<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:91:360:585 83 seq1 430 99 35M = 586 191 AAGATGAAACGCGTAACTGCGCTCTCATTCACTCC <<<<9<<<<<;<<<;<<77<<<;<;;<;;<;<;;< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:73:1208:495 83 seq1 431 99 35M = 246 -220 AGATGAAACGCGTAACTGCGCTCTCATTCACTCCA 8-889<<;<;;:<;<;;;;;;<<;;<;;;;<<;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:16:1081:1894 147 seq1 431 99 35M = 624 228 AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA <<<<<<<<<<<<<<<<<<8<<<<;<<;<<<<<<<+ MF:i:18 Aq:i:45 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS188_4:7:35:408:348 85 seq1 433 0 * = 433 35 GGTTCTCAAGGTTGTTGCAATGGGGTCTATGTGAA .73<;<<:77<<<<<<<<<<-<<;<<<<<<<<<<< MF:i:-64
+EAS188_4:7:35:408:348 153 seq1 433 35 35M = 433 -35 AAGAAACGCGTAACTGCGCTCTCATACACTCCAGC 4,'3<6;)2);<3<-6<;<;7+7<5+<<<7<<<<< MF:i:64 Aq:i:0 NM:i:2 UQ:i:21 H0:i:0 H1:i:1
+EAS56_53:4:130:568:978 147 seq1 434 88 35M = 246 -223 TGAAACGCGAAACTGCACTCTCATTCACTCCAGCT --;066;;62<<<2&<+<+<2;<<2<<<;<<<7<< MF:i:18 Aq:i:24 NM:i:2 UQ:i:27 H0:i:0 H1:i:0
+EAS139_19:1:87:1222:878 83 seq1 435 34 40M = 272 -203 TCAGCGCGTCACTCCGCTCTCATTCACCCCAGCTCCCTGT !!;*:885<&<<<)8&<:<<<8<8<::*<4<88<<<8<<< MF:i:18 Aq:i:10 NM:i:6 UQ:i:42 H0:i:0 H1:i:0
+EAS51_64:6:143:763:480 85 seq1 436 0 * = 436 35 CTGAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA ;<&-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-64
+EAS51_64:6:143:763:480 153 seq1 436 70 35M = 436 -35 AAACGCGTAACTGCGCTCTCATTCACTCCAGCTCC ::3<:6<<<:<<<<7<<<<<<<<)6<<<1<<<<;< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:145:607:216 147 seq1 437 99 35M = 596 194 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC <<<<<<<<8<<<<<<<<<<4<<<7<:<<1<<;;99 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:46:285:790 89 seq1 437 72 35M = 437 -35 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ;;<8<;<<<<88<8<<;;<;<<;<<<<<<<<;<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:46:285:790 149 seq1 437 0 * = 437 35 TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG !!<<3<<<;;<<<<<<<<<;<;7<<7<<<<<<;<< MF:i:-64
+EAS56_59:4:329:577:757 85 seq1 437 0 * = 437 35 TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG !!<<<<9;<:<<;<<<<<<<<;<<<<<<<<<<<<< MF:i:-64
+EAS56_59:4:329:577:757 153 seq1 437 72 35M = 437 -35 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ;;;888;<<<<<<6<<<2;<<<<<<;<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:57:722:347 147 seq1 439 99 35M = 599 195 CGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:285:367:932 83 seq1 440 74 35M = 285 -190 GCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGT 9=5==;=;7===;==;=================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:38:842:395 73 seq1 442 77 35M * 0 0 GTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<93<;9 MF:i:32 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:14:601:624 147 seq1 446 99 35M = 622 211 CTGCGCTCTCATTCACTCCAGCTCCCTGTCAACCC <<1<<<<<<<<<<<<<<<<<3<<::<<7<<1,<:( MF:i:18 Aq:i:69 NM:i:2 UQ:i:18 H0:i:1 H1:i:0
+EAS114_45:3:3:1377:1663 83 seq1 446 99 35M = 626 215 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<;;;;<:;;:<;;<;;<;:;;<;9;;::977676 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:26:1221:222 83 seq1 446 99 35M = 261 -220 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<<<<<<:<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:82:566:1096 83 seq1 446 99 35M = 621 210 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:24:1135:563 83 seq1 446 99 40M = 266 -220 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA 6+96:87<&8<<79:<;<<<<:<<;<<<<<<;;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:53:272:944 147 seq1 447 99 35M = 287 -195 TGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAA &94<4&8.6<6&;<:0:8;;:6;<;:<*<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:287:492:169 147 seq1 449 99 36M = 269 -216 CGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG ;/;6<<<<4(<(<<<<6<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:49:163:904 147 seq1 450 99 35M = 616 201 GCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78958 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:200:192:373 83 seq1 451 75 36M = 275 -212 CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC <<<8<<<4<4<<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:253:285:104 147 seq1 451 99 35M = 627 211 CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA ======================:========7==; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:151:159:43 83 seq1 452 99 35M = 645 228 TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC <<<<<<<;<<<8<<<;<;8<<<<7<77;;79<09+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:1:115:868:887 147 seq1 452 99 35M = 650 233 TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC >>>>>>>>>>>>>>;<>>>>><<>>>;<+<</;;1 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:57:786:414 83 seq1 453 99 35M = 296 -192 CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC ;;;8;1;:<<<<;<::;;<<<<;<;;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:197:170:559 89 seq1 453 71 35M = 453 -35 CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC <:<;;:<5<5<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:197:170:559 149 seq1 453 0 * = 453 35 TTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAACA :;;;;<<<<<<8<<<<<<<<<<<<<<<<<<<<<<< MF:i:-64
+EAS1_103:7:313:83:546 83 seq1 454 99 35M = 296 -193 TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT ;)<994<;<<<<<<<;<<<<<<<<<<<<<<5<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:44:280:641 83 seq1 454 99 35M = 288 -201 TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT 9;<<9;9;;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:60:837:923 147 seq1 457 61 36M = 641 220 TTCACGCCAGCTCCCTGTCACCCAATGGACCTCTGA <<<<<4<<+<<*<<<<88<<<<<'*<4-+<<4&<40 MF:i:18 Aq:i:24 NM:i:2 UQ:i:24 H0:i:0 H1:i:1
+EAS114_45:5:85:401:1190 147 seq1 458 99 35M = 652 229 TCACTCCAGCTCCCTGTCACCCAATGGACCTGTGA 4;;;1;;;;;;.6;;;(;;/;/;3;;;7;(3&063 MF:i:18 Aq:i:55 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:314:386:190 147 seq1 459 98 35M = 287 -207 CACTCCAGCTCCCTGTCACCCAATGGACCTGTGAT 76;%;<<3<9;<69<<<7;;;<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:2:831:692 83 seq1 462 99 35M = 634 207 TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC <<<<<<<<;<<<<<<<<<<9<<:9<<<;;96<796 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:163:846:223 83 seq1 463 74 35M = 278 -220 CCAGCTCCCTGTCACCCAATGGACCTGTGATATCT <7<5<*<<<<0<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:48:9:409 147 seq1 464 75 35M = 271 -228 CAGCTCCCTGTCACCCAATGGACCTGTGATATCTG <<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:134:751:831 83 seq1 465 99 36M = 651 222 AGCTCCCTGTCACCCAATGGACCTGTGATATCTGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<948 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:326:309:149 83 seq1 467 99 35M = 301 -201 CTCCCTGTCACCCAATGGACCTGTGATATCTGGAT ;;<<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:260:985:520 83 seq1 468 99 35M = 296 -207 TCCCTGTCACCCAATGGACCTGTGATATCTGGATT ;9;7<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:112:203:90 83 seq1 470 99 35M = 305 -200 CCTGTCACCCAATGGACCTGTGATATCTGGATTCT ;<;:;<;;;<<<<<<<<<:<<<7<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:308:400:602 83 seq1 470 71 35M = 285 -220 CCTGTCACCCAATGGACCTGTGATATCTGGATTCT ;77;2<<;<7<<;<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:82:902:868 147 seq1 471 99 35M = 295 -211 CTGTCACCCAATGGACCTGTGATATCTGGATTCTG <<;;<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:153:977:200 147 seq1 472 99 35M = 640 203 TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ;<<;<<<<7<<;;;;;<<6<<<<<86;;8<;8;6; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:319:246:304 147 seq1 472 99 35M = 305 -202 TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ;;<;;;<<<<8;<<<<;<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:37:1004:1136 147 seq1 473 99 35M = 315 -193 GTCACCCAATGGACCTGTGATATCTGGATTCTGGG </8<<<<7<+<<<<<<<,<<<<<<<<<6<<<<1<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:59:396:359 83 seq1 474 99 35M = 670 231 TCACCCAATGGACCTGTGATATCTGGATTCTGGGA <<9;;<;<;;;;<;;9;;;;;<;;;;;<;;77677 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:45:1769:1130 147 seq1 476 99 35M = 635 194 ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA ;;;;;;;;;;;;9;;;;;;19;;;9;;;;176777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:110:355:323 147 seq1 477 99 35M = 303 -209 CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT 6069;1<<;4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:28:708:463 83 seq1 477 99 36M = 672 231 CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<:<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:112:51:128 83 seq1 477 99 35M = 287 -225 CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT ;9<;;:<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:303:184:14 83 seq1 479 99 35M = 301 -213 CAATGGACCTGTGATATCTGGATTCTGGGAAATTC :<<.<;;7<:<<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:84:101:328 147 seq1 480 99 35M = 673 228 AATGGACCTGTGATATCTGGATTCTGGGAAATTCT <<<;<<<<<<<<;<<<<<<<<<<:<;;<44;;<;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:228:354:203 83 seq1 480 99 34M = 643 198 AATGGACCTGTGATATCTGGATTCTGGGAAATTC 88<<<8<<<<<<<<<8<<<<<<<<<4<<<4/9/; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:38:856:336 83 seq1 480 99 33M = 656 211 AATGGACCTGTGATATCTGGATTCTGGGAAATT <<<<<<<<<<<;;<;<;<:69<<;<5-500373 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:75:946:1035 147 seq1 480 99 35M = 288 -227 AATGGACCTGTGATATCTGGATTCTGGGAAATTCT <<)4</<5<<<<<<<<<<<<<<<<<<<<<66<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:271:244:568 147 seq1 481 99 35M = 294 -222 ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT ;<<<<<<;<;<<<<<<<<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:129:477:427 83 seq1 481 99 35M = 652 206 ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT <<<<<<<<<<<<<<<<<<;;<<<<::<9<;<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:262:297:601 147 seq1 482 99 35M = 635 188 TGGACCTGTGATATCTGGATTCTGGGAAATTCTTC <<<<;<<9<<57<<7<<<;<<;77-;;53<<;;<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:88:24:744 83 seq1 484 84 35M = 325 -194 GTCCTGTGATATCTGGATTCTGGGAAATTCTTCAT 4%++88;-9<;<<<+8<<<:<;8:<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+B7_610:5:147:68:353 83 seq1 486 99 35M = 299 -222 CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC <<;;<<<<<<<<+;<<;<<0;<<<<;<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS51_78:7:316:961:576 83 seq1 488 65 35M = 666 213 TGTGATATCTGGATTCTGGGAAATTCTTCATCCCG <<<<<<<;<<<<;<<:<<;<;<<:;<9+34;;6%/ MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_61:8:7:171:402 83 seq1 489 99 35M = 682 228 GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG <<<<<<<<<<<<<<<;/<<<<;<<<<<;<<1<<<4 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:277:458:330 83 seq1 490 99 36M = 329 -197 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGAC <<<<<8;<<<1<;7<<<;<<<<<<<<7<<7<<<<;7 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:269:280:716 147 seq1 490 99 35M = 323 -202 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA 6;<;;6:;<<<;64;<<<<<<<<;<<;<<;<<<<< MF:i:18 Aq:i:58 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:72:63:435 147 seq1 490 99 35M = 293 -232 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA ::<;<<<<;;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:46:900:610 83 seq1 491 99 35M = 684 228 GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC <<<<<<<<<<<<;<<<<<<<<<<<<<<<<<;;4;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:467:475 83 seq1 493 99 35M = 683 225 TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC <<<<<<<<<<<<;;;<<<<<<<<<:<<<<:+<<;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:201:959:19 83 seq1 493 99 35M = 681 223 TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC <<<<<<<<<<<<<<;<<<:<;<<;<<;+;+<3494 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:240:593:842 83 seq1 494 99 35M = 660 201 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ============<================9===:= MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:29:381:169 147 seq1 494 99 35M = 641 182 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT <<<<<<<<<<<2<288;<<;<<:4<:<<;&92929 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:199:327:965 83 seq1 494 91 35M = 297 -232 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT <5<:<<<58<:<<<<<<8<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:87:323:895 83 seq1 494 99 35M = 671 212 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ;<<;;;;<<;<959;;;<;:<<;9<;;;4377788 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:327:991:508 147 seq1 495 99 35M = 312 -218 TCTGGATTCTGGGAAATTCTTCATCCTGGACCCTG 0:;::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:6:882:784 147 seq1 496 99 35M = 686 225 CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGA <<<<<<<<<<<<<:<<<<<<<<<<<<:6::::<,2 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:175:705:982 83 seq1 496 89 36M = 660 200 CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG <<<<;<<;<<<<<<<<<<<<<;<<+<:;39;+<40< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:30:92:753 83 seq1 497 99 35M = 673 211 TGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:245:323:744 147 seq1 499 99 35M = 679 215 GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG <;<<<<<<<<<<<<<<<<<<<<<;<+<<<<<<<4< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:76:786:458 83 seq1 502 99 35M = 341 -196 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT ;<;:7<.<<<<<8;<<<<<<<6<;8<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:185:213:330 83 seq1 502 99 35M = 328 -209 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT ;4<<<;<<<<<<<<;<<;;;<<<<9<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:42:1091:1726 147 seq1 502 99 35M = 334 -203 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT 4443838<4<8<87<<3</8<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:12:158:458 83 seq1 503 84 36M = 675 208 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT <77<<<7<<<<<<<<<<<<5<4;<<;5<;;+2<+;; MF:i:18 Aq:i:15 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:277:590:364 147 seq1 503 99 35M = 681 213 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC <<<<<8<<<<<<<<;<<<<<;;<7<<;;7858;;8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:18:1418:237 147 seq1 503 99 35M = 304 -234 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC <<:<<<<<<<<:<<<<<<<<<:<<<<<<<<<<<<: MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:4:262:456:74 147 seq1 504 99 35M = 357 -182 TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT 862;<<<:;<;<<<;;;<<<<;;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:186:989:869 83 seq1 505 99 34M = 655 185 GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT <<<<<<<<<<<<<<<<<<<<7;:<<<<<<<<<$< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:80:885:513 83 seq1 507 99 35M = 344 -198 GAAATTCTTCATCCTGGACCCTGAGAGATTCTGCA <7<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:311:100:539 83 seq1 508 99 35M = 353 -190 AAATTCTTCATCCTGGACCCTGAGAGATTCTGCAG ;<;<<;;<;<<;<<<<<;9<<<;<<<<<<<<9<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:199:511:426 147 seq1 509 99 35M = 669 195 AATTCTTCATCCTGGACCCTGAGAGATTCTGCAGC <<<<<<<<<<<<<<;<<<<<<:<<<<<<<<<;:<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:26:227:1053 83 seq1 510 99 35M = 663 188 ATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:172:622:707 83 seq1 511 99 35M = 685 209 TTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCC <<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<5:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:157:935:374 147 seq1 512 99 35M = 353 -194 TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCA 94988994.<:<+42::<<<<<:<:<4<<<<;<1< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:103:111:720 147 seq1 512 99 36M = 353 -195 TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG ;4<<<;)<<-<9<;<<7<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:328:669:662 147 seq1 512 99 35M = 337 -210 TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA 4<<;<<8<.<88.<<;4<<<<<<<4<.<<<<7<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS51_64:5:202:39:380 147 seq1 513 99 35M = 334 -214 CTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG /92/;2<+2<<<<64<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:66:655:769 147 seq1 515 99 35M = 348 -202 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT 8<<;:69<;:;9<2<*9<;6<<<<<17<;<3+<;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:7:526:343 83 seq1 515 99 35M = 698 218 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT <<<<<<<<<<<<<<<:<<<5<<<<<<5;<<<+8<; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:33:672:473 147 seq1 515 99 35M = 330 -220 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT 5<70<<55<4<24.5<<<<<<<<<6<<<<<<2<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:72:308:839 83 seq1 517 99 40M = 354 -203 ATCGTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT :8:.:<;<<5<<<<<<<<<<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:2 UQ:i:40 H0:i:0 H1:i:1
+EAS56_61:1:210:880:606 83 seq1 518 99 35M = 341 -212 TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA .<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:80:760:490 83 seq1 520 99 34M = 686 201 CTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAG <<<<<<<<<<8<;<7<<<<<<;<;;<2<;<<<1, MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:34:970:1374 147 seq1 520 99 35M = 363 -192 CTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGA <6<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:1:200:559:765 147 seq1 521 99 36M = 337 -220 TGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT 8<;;4<3;<;<<<<<<5<<;;<<98;;<<<<;<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_53:8:28:701:724 83 seq1 521 99 35M = 347 -209 TGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGAT .;..3;8.8<8;<<;9<9<<<7;<<<<<<<<7<<7 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:318:345:156 147 seq1 522 99 35M = 695 208 GGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT <<<<<<<<:<<<<<<<<5<:5<<<3:'<72')*;9 MF:i:18 Aq:i:39 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+B7_595:1:81:1000:375 83 seq1 524 90 35M = 329 -230 ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGC ;8<;+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:13:1155:631 147 seq1 524 99 40M = 668 184 ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTG <<<<<<;<<;<<<<<<;<<<<<9<;<;94<<%<<<7:777 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:257:611:440 147 seq1 524 99 35M = 341 -218 ACCCTGAGAGATTCTGCAGCCCAGATCCAGATTGC 2<;;8<;;<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:6:129:694:359 83 seq1 525 88 35M = 350 -210 CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT 7777<7<7;77+<3<<;<<;<<<<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:6:11:285:1567 147 seq1 525 99 35M = 685 195 CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:1:196:533:921 147 seq1 526 99 35M = 361 -200 CCTGAGAGATTCTGCAGCCCAGATCCAGATTGCTT 7<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:2:6:251:1557 147 seq1 526 99 35M = 700 209 CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:20:492:850 83 seq1 526 78 35M = 694 203 CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT <7<<<<<<<<<<<.<54<7&<<<7<74<2<<<2<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:231:339:551 83 seq1 527 99 35M = 350 -212 CTGAGAGATTCTGCAGCCCAGATCCAGATTGCTTG <;<<;<<<<<<<<<<;:<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:4:68:1122:79 83 seq1 528 99 40M = 687 199 TGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCT <<<<<<<<<<<<<;<<<<;<<<<<<;<<<4;<<4;99::; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:87:1375:1303 83 seq1 529 99 35M = 340 -224 GAGAGATTCTGCAGCCCAGATCCAGATTGCTTGTG :<;<(<<<<<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS220_1:8:46:485:482 147 seq1 530 94 35M = 371 -194 AGAGATTCTGCAGCCCAGATCCAGATTGCTTGTGG <<<<<::<<<<<<<<6<<<<<<<<<6<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_4:7:90:1873:89 147 seq1 531 99 35M = 344 -222 GAGATTCTGCAGCCCAGATCCAGATTGCTTGTGGT <<<<;49<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:5:238:31:968 83 seq1 534 99 35M = 717 218 ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG 9======8====*=====,=1=======<=7:::, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:78:773:660 147 seq1 534 99 36M = 711 213 ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGA <<<<<<<<;<<<<<<<<<8<8<<;<<<;<<;7<<4: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:90:828:633 83 seq1 537 99 36M = 381 -192 CTGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG <<<;<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_30:2:272:750:698 83 seq1 538 80 35M = 365 -208 TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG 0<;8;64;<<<;<;.<+;:<4;4<;<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:3:88:1656:896 147 seq1 538 99 40M = 387 -191 TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCTGC 6/8::*9/*3*'<88<:9*<<<8<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_61:6:126:541:194 147 seq1 540 97 35M = 730 225 CAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGC <<<<<<<<8<<<<<8<<<<<<<<<8<<<428+<80 MF:i:18 Aq:i:43 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS114_28:4:9:55:730 147 seq1 540 99 36M = 722 218 CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT >>=>>+==>>==<==<=8=><:;8/;7</5724-2; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:278:918:892 83 seq1 541 99 35M = 720 214 AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT =============:====================8 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:243:876:758 83 seq1 541 99 35M = 712 206 AGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;78<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_65:5:121:380:656 147 seq1 542 99 35M = 362 -215 GCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTG :;<<;<<1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:82:164:1924 83 seq1 542 99 35M = 378 -199 GCCCAGCACCAGATTGCTTGTGGTCTGACAGGCTG 6<<<<<<-<<<<<<<<<2<<06<9<<<<<1<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS114_30:6:163:312:891 83 seq1 543 99 35M = 709 201 CCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGC <<<<<<<<<;<<<<<<<<<<<<<<<<:;;<;;<;0 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:124:243:35 147 seq1 544 60 35M = 364 -215 GCATATCCAGATTGCTGGTGGTCTGACAGGCAGCA &+<+;<694;+&99<<2<;423<26<-<<<<,<3< MF:i:-126 Aq:i:60 NM:i:2 UQ:i:28 H0:i:0 H1:i:0
+B7_591:1:191:462:705 83 seq1 545 99 36M = 721 212 CAGATCCAGATTGCTTGTGGTCTGACAGGCTGCAAC <<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<::<6 MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:8:95:426:791 147 seq1 547 99 35M = 359 -223 GNTCCAGATTGCTTGTGGTCTGACAGGCTGCAACT !!!!<<<<<;;<<<<;<<;<;;<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:23 H0:i:1 H1:i:0
+EAS218_4:5:41:118:1246 147 seq1 548 99 35M = 374 -209 CTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTG <<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:27:973:518 83 seq1 549 99 35M = 691 177 TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT <<<<<<<<<<<<<<;<<<<7<<<<<<<<88;0:8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:4:679:110 83 seq1 549 99 35M = 705 191 TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT <<<<<<<<<<<<<<<<<<<;<<<<<<<<::<;;:7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:297:283:948 147 seq1 550 99 35M = 727 212 CCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTG <<<<<<<<<<<<<<<<<<<<<<<:<<9;)+1;19- MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:61:1797:113 147 seq1 551 99 35M = 380 -206 CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA <<0<<&<<<<;<<4;;3<;<:<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS188_7:6:205:873:464 83 seq1 552 99 35M = 743 226 AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG <<<<<<<<<7<<<<<<<<<<<<:<<,:<:<<<<:: MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:33:1168:1762 83 seq1 552 99 35M = 728 211 AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG <<<<<<<<<<<<<<<<;<<;<;<<<<<<<<:;2:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:78:909:394 83 seq1 554 81 35M = 373 -216 ATTGCTTGGTGTCTGACAGGCTGCAACTGTGAGCC 6167&+&&/&//734/3<<<9*<;;3<3<;9<<3< MF:i:18 Aq:i:21 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+EAS1_103:2:226:302:758 147 seq1 556 99 35M = 751 230 TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT <<<<<<<;;;,<;<92;66<;))42<&2&(/1!!! MF:i:18 Aq:i:33 NM:i:2 UQ:i:9 H0:i:0 H1:i:1
+EAS114_28:5:206:671:49 147 seq1 557 99 36M = 719 198 GCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCA <<<<<<;<<<<8<<<;;<<<3<<8<8<35+,55;,3 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:165:431:857 147 seq1 559 99 35M = 406 -188 TTGGGGTCTGACAGGCTGCAACTGTGAGCCATCAC ''7'/;'1%0447<<<*<6<<<*<*<<<<6<<<<< MF:i:18 Aq:i:53 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS114_39:5:50:972:1286 83 seq1 559 99 35M = 377 -217 TTGTGGTCTGACAGGCTGCAACTGTGAGCCATCAC :;;7;7;;0<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:288:552:440 147 seq1 560 87 35M = 747 222 TGTGGTCTGACAGGCTGCAACTGTGAGCCTTCCAT <<<<71<77<<<:<<<&<4<<77<16<88&36+%% MF:i:18 Aq:i:26 NM:i:4 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:8:78:1478:1446 147 seq1 560 99 35M = 389 -206 TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA <8,8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:275:851:240 83 seq1 561 99 35M = 743 217 GTGGTCTGACAGGCTGCAACTGTGAGCCATCACAA <<<<<<<<<<<<<<<<<<<<<<<:<<4<7<<<<<< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:185:312:167 83 seq1 562 99 35M = 401 -196 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<8:<8<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:1:119:446:185 83 seq1 562 99 35M = 372 -225 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +70730;<0<77;;<<<<<9<<<<<<9<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:3:168:741:680 83 seq1 562 99 35M = 394 -203 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<5<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:67:1797:1931 83 seq1 562 99 35M = 750 223 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:228:182:717 83 seq1 563 99 35M = 729 201 GGTCTGACAGGCTGCAACTGTGAGCCATCCCCATG <=9============5==5=<,59<=1=<&;&;;7 MF:i:18 Aq:i:66 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS112_34:7:118:523:591 83 seq1 563 99 35M = 393 -205 GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG 4:--&0:67<<8:<<<<<<<<<<<:4<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:29:1061:574 83 seq1 563 99 35M = 363 -235 GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG <87<5<<9<<<66<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:168:69:605 83 seq1 565 67 36M = 373 -228 TCTGACAGGCGGCAACTGTGAGCCATCACAATGAAC '<'<144<0<&<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS221_3:4:90:247:212 83 seq1 567 99 35M = 733 201 TGACAGGCTGCAACTGTGAGCCATCACAATGAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<8< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:140:522:212 83 seq1 568 99 35M = 399 -204 GACAGGCTGCAACTGTGAGCCATCACAATGAACAA :;8;:::<<:<<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:179:13:782 83 seq1 568 99 35M = 412 -191 GACAGTCTACAACTGTGAGCCATCACAATGAACAA &37.3&;3'*<3<;9<9<<5<<<<<<<<<9<<<<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS114_45:3:75:217:337 83 seq1 568 99 35M = 386 -217 GACAGGCTGCAACTGTGAGCCATCACAATGAACAA 4779797;;;<;:4;;<<<77<;;;7<<;<;<;<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:168:528:288 147 seq1 570 99 35M = 740 205 CAGGCTGCAACTGTGAGCCATCACAATGAACAACA <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<;<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:162:503:769 147 seq1 571 99 35M = 392 -214 AGGCTGCAACTGTGAGCCATCACAATGAACAACAG ;:;1;=8=;:+=====;&==7============== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:163:618:570 147 seq1 571 99 35M = 751 215 AGGCTGCAACTGTGAGCCATCACAATGAACAACAG <<<<<<<8<<<<<<<<<<<<<+<.7<<..<;&;8; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:251:121:479 147 seq1 572 99 35M = 750 213 GGCTGCAACTGTGAGCCATCACAATGAACAACAGG <<<<<<<<<<<;:<<<<;:;:<:<;:188;7:<+( MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:44:1578:1674 147 seq1 573 99 35M = 418 -190 GCTGCAACTGTGAGCCATCACAATGAACAACAGGA 62631;;4;;;8;;48;;7;8;;;;;;;;;8;;;; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:263:74:407 147 seq1 574 99 35M = 754 215 CTGCAACTGTGAGCCATCACAATGAACAACAGGAA <<<<2<<<<<<:<<<9<<4<<<<:<<<<9<999.7 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:254:32:275 147 seq1 575 99 35M = 382 -228 TGCAACTGTGAGCCATCACAATGAACAACAGGAAG (6+<;+6:9<<:7:<95<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:82:879:246 83 seq1 576 99 35M = 391 -220 ACAACTGTGAGCCATCACAATGAACAACAGGAAGA %+=661;&===:&==1<5======1========== MF:i:18 Aq:i:43 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_71:4:165:397:25 147 seq1 576 99 35M = 759 217 GCAACTGTGAGCCATCACAATGAACAACAGGAAGA <<7<<<<<<)97<6<:3:60:3+37-37+<:33:3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:148:776:486 147 seq1 578 99 35M = 755 212 AACTGTGAGCCATCACAATGAACAACAGGAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:59:1576:946 83 seq1 578 99 35M = 761 218 AACTGTGAGCCATCACAATGAACAACAGGAAGAAA <:<<<<<<<<<<<<:<:<<<<<<<8<<::1<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:61:433:385 83 seq1 579 99 35M = 381 -233 ACTGTGAGCCATCACAATGAACAACAGGAAGAAAA <*97<<<<&9<<;<&<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:37:761:635 147 seq1 581 99 35M = 418 -198 TGTGAGCCATCACAATGAACAACAGGAAGAAAAGG +37:<088<+<<;<<;<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:178:192:499 147 seq1 582 99 35M = 768 221 GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT <<<<<<<;<1<<<<<<;<<;6<<3666;;;;;/6/ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:93:945:176 83 seq1 582 99 35M = 745 198 GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT <<<<<<<<<<<<<<<<<<<<<;<<<<;;<;:7;<3 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:216:988:883 83 seq1 584 99 35M = 392 -227 AAGCCAACACAATGAACAACAGGAAGAAAAGGTCT (=/1+=&:=&======<==<=============== MF:i:18 Aq:i:68 NM:i:2 UQ:i:12 H0:i:1 H1:i:0
+EAS114_39:1:12:884:219 83 seq1 584 99 35M = 756 207 GAGCCATCACAATGAACAACAGGAAGAAAAGGTCT <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<5:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:61:628:681 147 seq1 586 99 36M = 746 196 GCCATCACAATGAACAACAGGAAGAAAAGGTCTTTC <<<<<<<<<<<<<<<<<<<;<<<<<<<:<<;;;;;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:91:360:585 147 seq1 586 99 35M = 430 -191 GACATCACAATGAACAACAGGAAGAAAAGGTCTTT 5&&<<3:;<<<<<<)<<3<<<<<<<;;<<<<;<<< MF:i:18 Aq:i:67 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS139_11:6:89:1151:1878 83 seq1 587 99 35M = 757 205 CCATCACAATGAACAACAGGAAGAAAAGGTCTTTC <;;<<<<<;;;<<<<4;;::;<;8;;<;;8:<8<4 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:40:1596:1433 83 seq1 587 99 40M = 756 209 CCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG <<<<<<<<<<<<<<<<<<<<<<<<;<<<<1<<<<<::;:: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:4:1620:413 83 seq1 588 99 35M = 768 215 CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA <<<<<<<<<<6<<<6<<<;<6<9-1<;<&66<<<2 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:65:1928:1125 83 seq1 588 99 35M = 784 231 CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA <<;<<<7<<7<;<7<<<<<<<7<<<<;<.-;<+88 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:123:998:248 147 seq1 589 99 35M = 776 222 ATCACAATGAACAACAGGAAGAAAAGGTCTTTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<<68< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:240:603:890 147 seq1 590 99 36M = 740 186 TCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA <<<<<<<<<<<<<<<<<<;<:<<:<<;<<<<<8865 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:20:762:748 147 seq1 591 99 35M = 777 221 CACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:246:313:499 83 seq1 592 99 35M = 757 200 ACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG <<<<<<<<<<<<<;<;<<<<<<<<;<<<<<;;<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:6:7:858:437 83 seq1 593 99 35M = 773 215 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG <<<<<<<<<<<<<<<<<<<<<;<3<<<<<<<<<33 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:150:933:810 147 seq1 593 99 35M = 755 197 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG =================================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:204:264:413 147 seq1 593 96 35M = 415 -213 CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG 1==(4=::;/7::&===;====/=;===;;===== MF:i:18 Aq:i:27 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+EAS139_11:3:65:556:1505 147 seq1 593 99 35M = 790 232 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:62:386:959 83 seq1 594 99 35M = 752 193 AATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGT <<8<<<<;<<<<-<<87;</<;<+<;5<+;;<3;+ MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:134:868:252 147 seq1 595 99 36M = 404 -227 ATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGA <;<<<8<<<<<<<<<<<<<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:252:19:955 83 seq1 596 84 35M = 771 210 TGAACAAAAGGAAGAAAAGGTCTTTCAAAAGGTGA <<<<<<<<<<4<<<<9<<+9)9<<4:9+<<0<909 MF:i:18 Aq:i:41 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_67:4:145:607:216 83 seq1 596 99 35M = 437 -194 TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA /;<<&<<8<<<<<<<<<<<<<;872<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_65:8:140:924:923 147 seq1 597 99 35M = 767 205 GAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGAT <<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<5;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:120:63:653 147 seq1 598 99 35M = 420 -213 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:204:779:181 147 seq1 598 99 35M = 779 216 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<<<<<5<<:<<<<<8<<,<<<<<<<<<<91<91< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:325:150:465 147 seq1 598 99 35M = 412 -221 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<:<<<<<<<<;<:<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:57:722:347 83 seq1 599 99 35M = 439 -195 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:266:842 147 seq1 599 99 35M = 784 220 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT =====)===========8=====7882855355'5 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:183:852:253 147 seq1 599 99 35M = 773 209 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<;;<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:30:887:404 147 seq1 600 99 35M = 789 224 CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG <<<<<<<<<<;<<<<<<<<<<<<<<<<:(<<<7;7 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:101:572:491 147 seq1 600 99 35M = 425 -210 CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG 8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:73:730:487 83 seq1 604 99 35M = 770 201 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT <<<<<<<<<<<<<<<<<<<9<<<<<<:<<<;<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:172:896:83 83 seq1 604 99 34M = 786 217 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT <<<<<<<<<<<<<<<<<:;;+;<<<<<<<<9;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:154:762:630 147 seq1 604 99 35M = 792 223 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:99:756:130 147 seq1 606 99 35M = 798 227 GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:11:360:1577 83 seq1 606 99 35M = 781 210 GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT <<<<<<<<<<<<<<<<<4<;;<<;;<;<<<8<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:27:1881:486 83 seq1 607 99 35M = 427 -215 AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC 99797;;9:<:;;;<;;;;<<<;;;;<;<;;<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:5:497:687 83 seq1 607 99 35M = 789 217 AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:142:63:937 147 seq1 609 99 36M = 777 204 GAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC <<<<<<<<<<<<<<<<<:<<<<<<<<<;<<:<<:<: MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:36:485:632 147 seq1 610 99 36M = 784 210 AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<;<18; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:8:36:927:478 83 seq1 610 99 35M = 798 223 AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC <<<<<<<<<<<<<<<<;<<<<<:<:<<<<8<9;<8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:169:862:829 147 seq1 611 99 35M = 772 195 AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA <<<<<<<<<<<<<<<<<;<<<;<;<<<<:<;;<78 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:63:424:1643 147 seq1 614 99 35M = 798 219 GGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACC ;;<<<<<<;<<<<<<<<<<5;9;<<<<<<<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:20:41:138 83 seq1 615 99 35M = 774 194 GTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCT <<<<<<<<<<<<<<<<<<<<<<<<7<;<<<<<(<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:49:163:904 83 seq1 616 99 35M = 450 -201 TCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTC 79779<<<<<;;;;9;;<<7<;*9<<<7<<;<<;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:135:543:760 83 seq1 619 99 35M = 787 203 TTCAAAAGGTGATGTGTGTTCTCATCAACCTCATA <<<<;;<;<<<<<<<9<<<<<<<<<<<;<<<<5<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:131:742:561 147 seq1 620 99 35M = 790 205 TCAAAAGGTGATGTGTGTTCTCATCAACCTCATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:120:14:944 83 seq1 621 99 35M = 428 -228 CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA :;<<;<;<;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:82:566:1096 147 seq1 621 99 35M = 446 -210 CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA <<<<<<<<<<:<<<<<<<:<<<<<<:<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:14:601:624 83 seq1 622 99 35M = 446 -211 AAAAGGTGATGTGTGTTCTCATCAACCTCATACAC 1;;;;==5===.(=9=5=========8====;=== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:5:538:401 83 seq1 624 99 40M = 788 204 AAGGTGATGTGTGTTCTCATCAACCTCATACACACACATG <<<<;<<<<<<<<<<<<<<<;<::7<<;<53:<98;;;;; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:16:1081:1894 83 seq1 624 99 35M = 431 -228 AAGGTGATGTGTGTTCTCATCAACCTCATACACAC ;5;;&<;<<<<<<<<;<;<<;<<<;<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:3:1377:1663 147 seq1 626 99 35M = 446 -215 GGTGATGTGTGTTCTCATCAACCTCATACACACAC 6-88663;8;81;;66;8;;89939;;;67;2;;; MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:253:285:104 83 seq1 627 99 35M = 451 -211 GTGATGTGTGTTCTCATCAACCTCATACACACACA 2<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:66:1282:1215 83 seq1 627 99 35M = 794 202 GTGATGTGTGTTCTCATCAACCTCATACACACACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:2:1200:1076 147 seq1 629 99 35M = 786 192 GATGTGTGTTCTCATCAACCTCATACACACACATG ;;;;;;;;;;/;;;;;;;;6;;9;489;;;88888 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:194:688:289 83 seq1 631 99 35M = 795 199 TGTGTGTTCTCATCAACCTCATACACACACATGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:19:855:491 83 seq1 631 99 35M = 783 187 TGTGTGTTCTCATCAACCTCATACACACACATGGT <<<<<<<<<<<;<<.:<<<<;;;<4<:<:<7<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:215:133:909 83 seq1 631 99 34M = 789 193 TGTGTGTTCTCATCAACCTCATACACACACATGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<996( MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:35:378:681 83 seq1 632 99 35M = 812 215 GTGTGTTCTCATCAACCTCATACACACACATGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:40:758:116 147 seq1 632 99 40M = 814 222 GTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:7262 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:2:831:692 147 seq1 634 99 35M = 462 -207 GTGTTCTCATCAACCTCATACACACACATGGTTTA 2749'979<9<<<6;<<<0<;<<<<<3<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:162:594:858 83 seq1 634 99 35M = 818 219 GTGTTCTCATCAACCTCATACACACACATGGTTTA <<<<<<<<<<<<<<<<<9<;<<<<<<<<<<3<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:233:478:792 83 seq1 634 99 35M = 791 192 GTGTTCTCATCAACCTCATACACACACATGGTTTA <<<<<<<<<<<<<<<<<<<+<<<<<<<9<<<+;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:262:297:601 83 seq1 635 99 35M = 482 -188 TGTTCTCATCAACCTCATACACACACATGGTTTAG ;;<26;;;<;<7;<<<<<99<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:45:1769:1130 83 seq1 635 99 35M = 476 -194 TGTTCTCATCAACCTCATACACACACATGGTTTAG 88989;<;97;9<<;<;;;;9<98<<<<<<<;<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:153:977:200 83 seq1 640 99 35M = 472 -203 TCATCAACCTCATACACACACATGGTTTAGGGGTA 1:<83<<9;;9<<9;;<<;<<;;;;<;;<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:60:837:923 83 seq1 641 61 36M = 457 -220 CATCAACCGCATACACTCACATGGTTTAGGGGTATA 0<4<<<02.<99+<+&!<<<<+<<<<<<<<<<<<3< MF:i:18 Aq:i:24 NM:i:2 UQ:i:13 H0:i:0 H1:i:0
+EAS51_66:3:29:381:169 83 seq1 641 99 35M = 494 -182 CATCAACCTCATACACACACATGGTTTAGGGGTAT 2<82<;66<:<;<:<;<;<8<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:96:836:737 83 seq1 642 99 35M = 841 234 ATCAACCTCATACACACACATGGTTTAGGGGTATA <<<<<<71<<<<<<<<<<899<:5<<<96858<<. MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:228:354:203 147 seq1 643 99 35M = 480 -198 TCAACCTCATACACACACATGGTTTAGGGGTATAA %1<851<5<<<982<<<<<<<<::<<<<7<<<<3< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:151:159:43 147 seq1 645 99 35M = 452 -228 AACCTCATACACACACATGGTTTAGGGGTATAATA ;;4;6<<;<<<<7<77<6;<6<<<<<;;<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:182:404:693 147 seq1 646 99 35M = 812 201 ACCTCATACACACACATGGTTTAGGGGTATAATAC <<<<<<<<<<<<<<<<<<<<<<:::<6<;<94;77 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:4:841:339 147 seq1 646 99 35M = 793 182 ACCTCATACACACACATGGTTTAGGGGTATAATAC <<<<<<<<<<<<<<<<<;<7<<&;;<5<+<;7<<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:156:857:494 147 seq1 648 99 35M = 838 225 CTCATACACACACATGGTTTAGGGGTATAATACCT <<<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<:<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:165:464:123 83 seq1 650 99 35M = 814 199 CATACACACACATGGTTTAGGGGTATAATACCTCT ===============7==============8==== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:1:115:868:887 83 seq1 650 99 35M = 452 -233 CATACACACACATGGTTTAGGGGTATAATACCTCT ==;==8=;=;========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:134:751:831 147 seq1 651 99 36M = 465 -222 ATACACACACATGGTTTAGGGGTATAATACCTCTAC ;:<4<8<<<;<;<<5<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:192:716:235 147 seq1 651 99 35M = 798 182 ATACACACACATGGTTTAGGGGTATAATACCTCTA ======================9==:<==:;;69; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:40:594:752 83 seq1 651 99 35M = 831 215 ATACACACACATGGTTTAGGGGTATAATACCTCTA <<<<<<<<<<;<<<;<<<::;<:;<;:<;;;<;<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:184:17:636 89 seq1 652 76 35M = 652 -35 TACACACACATGGTTTAGGGGTATAATACCTCTAC 8<89<<:<<<;;;<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:184:17:636 149 seq1 652 0 * = 652 35 TTTTTTTTTTTTTTTTTTTTTTTTTTTTCACAGGT !!!!!!!!!!!!!!!!!!!!!!!!!!!77777777 MF:i:-64
+EAS1_108:8:129:477:427 147 seq1 652 99 35M = 481 -206 TACACACACATGGTTTAGGGGTATAATACCTCTAC <<<9;<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:130:912:658 147 seq1 652 99 35M = 841 224 TACACACACATGGTTTAGGGGTATAATACCTCTAC <<<<<;<<<<<<;<<<<<<<<<<<<<<<<<7<;;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:85:401:1190 83 seq1 652 99 35M = 458 -229 TACACACACATGGTTTAGGGGTATAATACCTCTAC 64778:;69739:;+9::7;;;<;6<;7;;;;;7< MF:i:18 Aq:i:55 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:4:1502:1911 147 seq1 652 99 40M = 802 190 TACACACACATGGTTTAGGGGTATAATACCTCTACATGGC <<<:4<<<<<<;<<<<;9;5<95<;<<;9+;1612:1::: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:198:691:595 147 seq1 655 99 35M = 847 227 ACACACATGGTTTAGGGGTATAATACCTCTACATG ==============&===============;7;=1 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:186:989:869 147 seq1 655 99 35M = 505 -185 ACACACATGGTTTAGGGGTATAATACCTCTACATG ;<<;:<<<7:<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:38:856:336 147 seq1 656 99 35M = 480 -211 CACACATGGTTTAGGGGTATAATACCTCTACATGG 2;4;4<:;6:5:<<;:;<<;<<;<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:49:271:588 147 seq1 658 99 35M = 830 207 CACATGGTTTAGGGGTATAATACCTCTACATGGCT <<<<<<<<<<<<<<5:<<<<<<:<<<<<<<:7%9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:240:593:842 147 seq1 660 99 35M = 494 -201 CATGGTTTAGGGGTATAATACCTCTACATGGCTGA *<<<;<<6<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:175:705:982 147 seq1 660 89 36M = 496 -200 CATGGTTTAGGGGTATAATACCTCTACATGGCTGAT ')'''''')'''''*')*)'*)')))+,'*)+'*,! MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS221_3:6:26:227:1053 147 seq1 663 99 35M = 510 -188 GGTTTAGGGGTATAATACCTCTACATGGCTGATTA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:316:961:576 147 seq1 666 65 35M = 488 -213 TTACGGGTGTAATCTCTCTACATGGCTAATTATGA (++%%+++),+,+*++,+,,-,**+,-&-,+-+-- MF:i:-126 Aq:i:65 NM:i:5 UQ:i:36 H0:i:0 H1:i:0
+EAS56_63:5:96:788:614 147 seq1 667 99 35M = 862 230 TAGGGGTATAATACCTCTACATGGCTGATTATGAA <<<<<<<<<<<<<<<<<<<<<<;6;<<;;<;;7;9 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:13:1155:631 83 seq1 668 99 40M = 524 -184 AGGGGTATAATACCTCTACATGGCTGATTATGAAAACAAT ;:398<<;<<<<<;<3<;;<<<<;;<<<<<<<<<<;<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:199:511:426 83 seq1 669 99 35M = 509 -195 GGGGTATAATACCTCTACATGGCTGATTATGAAAA <:7:<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:124:241:608 83 seq1 670 99 35M = 856 221 GGGTATAATACCTCTACATGGCTGATTATGAAAAC <<<<<<<<<;<<<<<<<<<;;<<<;<<<<;;8;;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:59:396:359 147 seq1 670 99 35M = 474 -231 GGGTATAATACCTCTACATGGCTGATTATGAAAAC 28288;;;;;;;;;::;;;;:;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:87:323:895 147 seq1 671 99 35M = 494 -212 GGTATAATACCTCTACATGGCTGATTATGAAAACA 55777;;;939;9;;9;;;;9;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:28:708:463 147 seq1 672 99 36M = 477 -231 GTATAATACCTCTACATGGCTGATTATGAAAACAAT ;;<;<<====3=====5=================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:84:101:328 83 seq1 673 99 35M = 480 -228 TATAATACCTCTACATGGCTGATTATGAAAACAAT <<<<<<<<:<<<<<<<<<6<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:30:92:753 147 seq1 673 99 35M = 497 -211 TATAATACCTCTACATGGCTGATTATGAAAACAAT <<<<<<;<<<<<<:<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:8:88:90:59 73 seq1 674 37 35M = 674 0 ATAATACCTCTACATGTCTGATTATGAAAACAATG <<<<<<<4;7;<<<;;47;&9..1;6&4<755;1; MF:i:64 Aq:i:0 NM:i:1 UQ:i:19 H0:i:0 H1:i:1
+EAS112_32:8:88:90:59 133 seq1 674 0 * = 674 0 TGCACCTCCCTGTTCACCTAGATGCTAGGAGGACA =7595=92=72.=+5(:4=9092((.2&(&%07%. MF:i:-64
+B7_593:1:12:158:458 147 seq1 675 84 36M = 503 -208 TAATAATGCTACATGGATGATTATGAAATCAATGTT ++++++$((+*+++++++++++++&+++++++++++ MF:i:18 Aq:i:15 NM:i:5 UQ:i:40 H0:i:0 H1:i:0
+B7_593:4:28:781:723 83 seq1 676 99 36M = 855 215 AATACCTCTACATGGCTGATTATGAAAACAATGTTC <<<<<<<<<7<<<;;<<;;<<;<5<4<7<;7<+:<9 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:27:856:401 147 seq1 679 99 35M = 871 227 ACCTCTACATGGCTGATTATGAAAACAATGTTCCC ======6===;2==;===;=+=92=;5+=&556:6 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:245:323:744 83 seq1 679 99 35M = 499 -215 ACCTCTACATGGCTGATTATGAAAACAATGTTCCC /.848299;&;9;9;=2.=7========;;===== MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:31:948:254 83 seq1 680 99 35M = 849 204 CCTCTACATGGCTGATTATGAAAACAATGTTCCCC <<<<<<<<<<<<<<<<<<<;<<<<<:<<8<;;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:277:590:364 83 seq1 681 99 35M = 503 -213 CTCTACATGGCTGATTATGAAAACAATGTTCCCCA :::<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:201:959:19 147 seq1 681 99 35M = 493 -223 CTCTACATGGCTGATTATTAAAACAATGTTCCCCA ;4;.9<:0&/<5<::<<9/.<<<<<<<<<<<<;<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS56_61:8:7:171:402 147 seq1 682 99 35M = 489 -228 TCTACATGGCTGATTATGAAAACAATGTTCCCCAG :086::::847:<7<<7<<<<<<;7<<;<<<<7<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:67:317:249 83 seq1 683 26 35M = 840 192 CTACATGGCTGATTATGAAATCTATGTTCCCCATA <<<<<<;<<<<;:;<<7;<<.<&3<;;<<(;;6.< MF:i:18 Aq:i:26 NM:i:3 UQ:i:31 H0:i:0 H1:i:0
+EAS51_64:4:189:467:475 147 seq1 683 99 35M = 493 -225 CTACATGGCTGATTATGAAAACAATGTTCCCCAGA *.;*;7<75<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:46:900:610 147 seq1 684 99 35M = 491 -228 TACATGGCTGATTATGAAAACAATGTTCCCCAGAT <;5<;<<<;<<<<<<;<<<<<<<<<<8<<<<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:232:351:909 83 seq1 685 80 36M = 843 194 ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC <<<<<99<<<<<<99<7<'<9<<<6<<+<;7;<<&; MF:i:18 Aq:i:39 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS139_11:6:11:285:1567 83 seq1 685 99 35M = 525 -195 ACATGGCTGATTATGAAAACAATGTTCCCCAGATA <8<4<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:172:622:707 147 seq1 685 99 35M = 511 -209 ACATGGCTGATTATGAAAACAATGTTCCCCAGATA 92<3996;<<<<<<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:6:882:784 83 seq1 686 99 35M = 496 -225 CATGGCTGATTATGAAAACAATGTTCCCCAGATAC 4;7<;64<<:<<4<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:80:760:490 147 seq1 686 99 35M = 520 -201 CATGGCTGATTATGAAAACAATGTTCCCCAGATAC %::::+<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:68:1122:79 147 seq1 687 99 40M = 528 -199 ATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCC ::77*:1<<<<<<<<<<<<<<<:;<<<;<<<<<<8<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:264:988:663 83 seq1 688 99 35M = 875 222 TGGCTGATTATGAAAACAATGTTCCCCAGATACCA <<<<<<<<<<<1<4<<<4<<0<;<-<74*(<&51- MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:3:233:911 147 seq1 688 99 35M = 868 215 TGGCTGATTATGAAAACAATGTTCCCCAGATACCA <<<<<<<<<<<<<<<<<;<<<<<<<<<<;<;<<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:187:925:547 83 seq1 689 99 35M = 857 203 GGCTGATTATGAAAACAATGTTCCCAAGATACCAT 43<<<:9<;;;:7<<<<6<:<8<-4-/,81<(48: MF:i:18 Aq:i:37 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS56_65:5:75:637:650 147 seq1 691 99 35M = 868 212 CTGATTATGAAAACAATGTTCCCCAGATACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:27:973:518 147 seq1 691 99 35M = 549 -177 CTGATTATGAAAACAATGTTCCCCAGATACCATCC +<<<<<<9<<<<<<<<<<<;<;<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:20:492:850 147 seq1 694 10 35M = 526 -203 AGTATGAAAACAATGTTCCCCAGATGCCGTCCCGG :.5:+.;;&91:;79:766:1:9+6&:1&&:+:)) MF:i:18 Aq:i:10 NM:i:4 UQ:i:31 H0:i:0 H1:i:0
+EAS51_64:4:318:345:156 83 seq1 695 99 35M = 522 -208 TTATGAAAACAATGTTCCCCAGATACCATCCCTGT ;8<8<<<<<;<<:<<;<;77<<<<<;<<;<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:5:863:302 83 seq1 698 99 35M = 866 203 TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:7:526:343 147 seq1 698 99 35M = 515 -218 TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT (7:;;;<<;;;<1<1<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS114_26:2:73:513:102 83 seq1 698 99 35M = 868 205 TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT ===========================;======= MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:6:251:1557 83 seq1 700 99 35M = 526 -209 AAAACAATGTTCCCCAGATACCATCCCTGTCTTAC <<<<<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:147:64:416 83 seq1 701 99 35M = 870 204 AAACAATGTCCCCCAGATACCATCCCTGTCTTACT <<<<<<<<<<<<<<<;<<<<<;<<<<;;:<;;;;; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_595:3:297:637:86 147 seq1 704 99 35M = 869 200 CAATGTTCCCCAGATACCATCCCTGTCTTACTTCC <<<<<<<<<<<<;+<+;<;<:<<<<<9<<957<;( MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:160:272:398 147 seq1 705 99 35M = 891 221 AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA 9<<<3<<<<<<<<<<<9<<;8<<<<;<+.;;89.. MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:4:679:110 147 seq1 705 99 35M = 549 -191 AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:163:312:891 147 seq1 709 99 35M = 543 -201 TTCCCCAGATACCGTCCCTGTCTTACTTCCAGCTC 0.<;;8<<<0<<<<<<<<<<6<<<<<<8<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_28:3:78:773:660 83 seq1 711 99 36M = 534 -213 CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC 7<;7<<<7;9<<8;<<<<<<;<<<<<<<<<<7<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:5:63:875:1339 147 seq1 711 99 35M = 879 203 CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCC <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:243:876:758 147 seq1 712 99 35M = 541 -206 CCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC 0%3<1;.70;3363;31;<<<<<<6<<<;<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:104:153:698 147 seq1 713 99 36M = 896 219 CCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAG ;<<<<<<;6<<<<<<<<<<;<<<<;<;;;<.<::50 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:86:498:373 147 seq1 716 99 35M = 894 213 GATACCATCCCTGTCTTACTTCCAGCTCACCAGAG <<<<<<<<<<<<<<<<<<<<<<<5:<<<:<;7+67 MF:i:18 Aq:i:69 NM:i:1 UQ:i:25 H0:i:1 H1:i:0
+EAS1_95:6:87:734:888 147 seq1 717 99 35M = 900 218 ATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG ===========;8=========;;=;====;;3(; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:238:31:968 147 seq1 717 99 35M = 534 -218 ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG =(.7=5%===9:7==+==77=============== MF:i:18 Aq:i:69 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_65:3:290:558:349 83 seq1 719 99 35M = 869 185 ACCATCCCTGTCTTACTTCCAGCTCCCCAGCGGGA <<<;<<;<;<188<<<8::<686+4:<<6:&3)*& MF:i:18 Aq:i:59 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_28:5:206:671:49 83 seq1 719 99 36M = 557 -198 ACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA ;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:278:918:892 147 seq1 720 99 35M = 541 -214 CCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA =6=3=<===&========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:191:462:705 147 seq1 721 99 36M = 545 -212 CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAG <<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:9:55:730 83 seq1 722 99 36M = 540 -218 ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC <:<;;<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:45:462:455 147 seq1 723 99 35M = 874 186 TCCCTGTCTTACTTCCAGCTCCCCAGACGGAACGC <<<<<<8<<<;<;<<<;<<<<<<<6;8&:80;733 MF:i:18 Aq:i:43 NM:i:2 UQ:i:27 H0:i:0 H1:i:1
+EAS114_28:2:149:650:44 147 seq1 726 99 36M = 902 212 CTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC <<<<<<<<<<<<<<<<<<<<<<<<<;6<<;<<7<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:297:283:948 83 seq1 727 99 35M = 550 -212 TGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC 6;;3;6<<66<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:33:1168:1762 147 seq1 728 99 35M = 552 -211 GTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCA 79<9;3<<<4<<<97<;;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:228:182:717 147 seq1 729 99 35M = 563 -201 TCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAA 778;8;474<<<;2;;<2<<<<<<<<;<;;9<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:8:1351:1986 147 seq1 729 99 35M = 911 217 TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA <<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS51_64:4:163:31:455 147 seq1 730 99 35M = 886 191 CTTACTTCCAGCTCCCCAGAGGGACAGCTNNCAAC <+<<<<<<<;0+<<<<;06070-9(0(9<!!5)05 MF:i:18 Aq:i:31 NM:i:3 UQ:i:7 H0:i:0 H1:i:1
+EAS54_61:6:126:541:194 83 seq1 730 97 35M = 540 -225 AGTACGACCAGCTCCCCAGAGGGAAAGCTTTCAAC +%&:/+(46=47&71/2==;=;8====28212=== MF:i:18 Aq:i:43 NM:i:4 UQ:i:40 H0:i:1 H1:i:0
+EAS51_62:7:178:286:414 147 seq1 731 99 35M = 907 211 TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG <<<<<<<<<<<<<<<<8<<<<<<<<<1<<<1;998 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:35:361:546 147 seq1 731 99 35M = 892 196 TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG <<<<<<<<<<<<<<<<;<5<<<<<;<2<<<:<8<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:90:247:212 147 seq1 733 99 35M = 567 -201 ACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCT 7655:;87;<;;;8<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:149:354:667 83 seq1 734 99 35M = 888 189 CTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTT <<<<<<<<<<<<<<<<<<<><<<<<<<<;<:<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:240:603:890 83 seq1 740 99 36M = 590 -186 GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA ;+&+//&<<<<<<<<<<9<<<8<<<<9<<<<<<<<< MF:i:18 Aq:i:66 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_591:7:129:956:115 147 seq1 740 99 36M = 927 223 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;877- MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:168:528:288 83 seq1 740 99 35M = 570 -205 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC 8<%<31;<<;<;<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:275:851:240 147 seq1 743 99 35M = 561 -217 CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT 66614/&3616630666&66666&66666868666 MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS188_7:6:205:873:464 147 seq1 743 99 35M = 552 -226 CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT <-((+:+;289<--;<;-;<:;;<<<;;<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:37:610:260 147 seq1 745 99 35M = 913 203 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC <<<;<;<<7<<<<<<<<<<<<<<;6<963;;;3;1 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:93:945:176 147 seq1 745 99 35M = 582 -198 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC 6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:61:628:681 83 seq1 746 99 36M = 586 -196 CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT 95<<<<<<<<;<<<<;<<<:<<;;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:288:552:440 83 seq1 747 87 35M = 560 -222 AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT 9<<%'%<<.2<<<<<<<<5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:2 UQ:i:33 H0:i:0 H1:i:0
+EAS56_53:2:170:265:818 147 seq1 748 10 35M = 920 207 GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT <<<<<(5/959<8.<9<8<<<2<&59&&:22:8+( MF:i:18 Aq:i:10 NM:i:3 UQ:i:17 H0:i:0 H1:i:0
+B7_595:2:251:121:479 83 seq1 750 99 35M = 572 -213 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<6'..663;&<<;<<9<<<9<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:67:1797:1931 147 seq1 750 99 35M = 562 -223 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:226:302:758 83 seq1 751 99 35M = 556 -230 GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG ;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:163:618:570 83 seq1 751 99 35M = 571 -215 GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG <9774<88&:8<:8<8:8<8<<<<<;88<88<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_97:3:73:292:429 83 seq1 752 99 35M = 920 203 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC <<<<<<<<<<7<<;<<<<<<<2<<<5<<<<<:%)< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_108:3:82:356:253 83 seq1 752 99 35M = 927 210 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC ===================<========;===39= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:62:386:959 147 seq1 752 99 35M = 594 -193 AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC %;71131((<<6<92(+<1<<;<-3<8<<;<;;<< MF:i:18 Aq:i:57 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_62:3:263:74:407 83 seq1 754 99 35M = 574 -215 AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT ;;88<::+;<)<5<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:67:620:344 83 seq1 755 99 35M = 905 185 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT <<<<2<:2<<<<<<7<<<<:<<*<<<<<<***3<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:148:776:486 83 seq1 755 99 35M = 578 -212 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT ;:<<<;<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:150:933:810 83 seq1 755 99 35M = 593 -197 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT :89===:=:=;;==;==================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:102:467:897 83 seq1 756 97 35M = 940 219 GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT <<<<9<<<<9<2<<<&,/</<<<<7<<;&&<$;*< MF:i:18 Aq:i:37 NM:i:2 UQ:i:8 H0:i:1 H1:i:0
+EAS114_39:1:12:884:219 147 seq1 756 99 35M = 584 -207 GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTT 7;::<:<<<7<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:40:1596:1433 147 seq1 756 99 40M = 587 -209 GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT -:8:1841<4;<88<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:7:761:623 83 seq1 757 99 35M = 938 216 CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG <<<<<<<<<<<<<8<<<<;;<0<<<<<;;<;<;;& MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:246:313:499 147 seq1 757 99 35M = 592 -200 CTTTAAACGCTTCTAGCCATTTCTTTTGGCATTTG +;77%;;;&:;:7;<<<<<6<:<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS139_11:6:89:1151:1878 147 seq1 757 99 35M = 587 -205 CTTTCAACGATTCTAGCCATTTCTTTTGGCATTTG 8<66,,<<<<<<:<<<<<9<<<:<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_71:4:165:397:25 83 seq1 759 99 34M = 576 -217 TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC &(33'60;-'+'<7;<<*3-<;;183<<<;<;<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:59:1576:946 147 seq1 761 99 35M = 578 -218 CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT 9<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:256:407:470 147 seq1 762 99 35M = 939 212 AACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTC <<<<<<<<;<;<<<<<<<<<;;<</<<;;83;7;9 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:148:437:481 147 seq1 764 99 36M = 949 221 CGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGA <<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<;0;8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:140:924:923 83 seq1 767 99 35M = 597 -205 TTTTAGCCATTTCTTTTGGCATTTGCCTTCAGACC <<&<<;;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_103:4:143:560:194 83 seq1 768 99 35M = 946 213 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC <<<<;;<<<<<<<<<<<6<;<<<<;;<<;9<999< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:178:192:499 83 seq1 768 99 35M = 582 -221 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC 86<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:4:1620:413 147 seq1 768 99 35M = 588 -215 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC -<<<7<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:73:730:487 147 seq1 770 99 35M = 604 -201 TAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTA <;;<<2;<;<<<;0<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:179:389:585 147 seq1 770 24 35M = 953 218 TGGCCACTTTTTATCGCATTTCCCTTTAGAACCTA <.4<9.4+.+'&-220<+<4<6<<20*6;<0(9<% MF:i:-126 Aq:i:24 NM:i:7 UQ:i:103 H0:i:0 H1:i:0
+B7_595:1:252:19:955 147 seq1 771 84 35M = 596 -210 AGCCAGTTCTTTTGGCATTTGCCTTCAGACCCTCC <8<884<<<<<<68<<<<<<<2<;<<;<+<<<;<< MF:i:18 Aq:i:41 NM:i:2 UQ:i:46 H0:i:0 H1:i:1
+EAS54_71:4:169:862:829 83 seq1 772 99 34M = 611 -195 GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC ,1<6<<<<<7<<<<<<<<<<<<<<<<<7<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:6:7:858:437 147 seq1 773 99 35M = 593 -215 CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC 7;<4;;:;80<;<;<<<<<<:<<;<<<;;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:183:852:253 83 seq1 773 99 35M = 599 -209 CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC ;<9<;<<<<<<<<;<<<<<;<<<;<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:20:41:138 147 seq1 774 99 35M = 615 -194 CATTTCTTTTGGCATTTGCCTTCAGACCCTACACG ;;;<;<<<::<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:123:998:248 83 seq1 776 99 35M = 589 -222 TTTCTTTTGGCATTTGCCTTCAGACCCTACACGAA ;:;5;<;:<9<<<<<:<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:142:63:937 83 seq1 777 99 36M = 609 -204 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAATG ;;;<;<<<<;<<<<<;:<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:20:762:748 83 seq1 777 99 35M = 591 -221 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT =:747;7=;;==7=;==7===7==7;========= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:149:953:349 83 seq1 777 99 35M = 915 173 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT <<<<<<<<;<<<<<<<<<<<;7:<:<<:<:;;::; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:46:981:766 147 seq1 778 99 35M = 933 190 TCTTTTGGCATTTGCCTTCAGACCCTACACGAATG <<<<<<<<<<<<<;<<<<<-<;<<<<-<-<;-:6; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:204:779:181 83 seq1 779 99 35M = 598 -216 CTTTTGGCATTTGCCTTCAGACCCTACACGAATGC ;:;/*<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:11:360:1577 147 seq1 781 99 35M = 606 -210 TTTGGCATTTGCCTTCAGACCCTACACGAATGCGT 1<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:5:491:391 83 seq1 782 99 35M = 917 170 TTGGCATTTGCCTTCAGACCCTACACGAATGCGTC =========;===;==:4=========;3;==7;= MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:186:199:927 83 seq1 783 99 35M = 802 54 TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT <77<<<<2<;<<<<<06<<<<<<<<60<<684/6& MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:19:855:491 147 seq1 783 99 35M = 631 -187 TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT 8<<<<;:<<<<:<<<<<:<;;<<<<<<<;<<<;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:36:485:632 83 seq1 784 99 36M = 610 -210 GGCATTTGCCTTCAGACCCTACACGAATGCGTCTCT 0;;;<<;<<<;<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:266:842 83 seq1 784 99 35M = 599 -220 GGCATTTGCCTTCAGACCCTACACGAATGCGTCTC <9<<6;9<;9;;<<<<;;;9<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:65:1928:1125 147 seq1 784 99 35M = 588 -231 GGCATTTGCCTTCAGACCCTACACGAATACGTCTC <+<<<2<4<<<0<<4<<<<<6<<<6<<<'<<<<0< MF:i:18 Aq:i:41 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+EAS221_3:4:66:584:407 147 seq1 785 99 35M = 954 204 GCATTTGCCTTCAGACCCTACACGAATGCGTCTCT <<<*9<9<<<1<<<<<<<<*<59<4<)<2<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:172:896:83 147 seq1 786 99 35M = 604 -217 CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA ;<.5.;;<+;<<<<<<<4<<<<<<<;<<<<<;<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:2:1200:1076 83 seq1 786 99 35M = 629 -192 CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA 7779779;9;:;;4;;9;;:7;<<<7;;;:<;<<; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:135:543:760 147 seq1 787 99 35M = 619 -203 ATTTGCCTTCAGACCCTACACGAATGCGTCTCTAC ;;.;;8;<8;<<32;<<<<<7<<<<<9<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:5:538:401 147 seq1 788 99 40M = 624 -204 TTTGCCTTCACACCCTACACGAATGCGTCTCTGCCACAGG 671&7::49:&0<<<(<::<&<<<:<<<<<<<&<<<<1<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:10 H0:i:0 H1:i:1
+EAS54_71:6:215:133:909 147 seq1 789 99 35M = 631 -193 TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA 7758;<;<;8<<<<;<;<<<<<:;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:30:887:404 83 seq1 789 99 35M = 600 -224 TTGCCTTCAGACCCTGCACGAATGCGTCTCTACCA <<<<5<;::<<<;<<.<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS219_1:1:5:497:687 147 seq1 789 99 35M = 607 -217 TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA <8<<8<<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:131:742:561 83 seq1 790 99 35M = 620 -205 TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC <:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:65:556:1505 83 seq1 790 99 35M = 593 -232 TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC <6<8<<4<8;;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:233:478:792 147 seq1 791 99 35M = 634 -192 GCCTTCAGACCCTACACGAATGCGTCTCTACCACA 6<;9:<<9-<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:66:257:524 83 seq1 791 99 35M = 959 203 GCCTTCAGACCCTACACGAATGCGTCTCTACCACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<% MF:i:18 Aq:i:73 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_53:4:154:762:630 83 seq1 792 99 35M = 604 -223 CCTTCAGACCCTACACGAATGCGTCTCTACCACAG <<-::<91<<<<;<;<<<<;<<<<<<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:4:841:339 83 seq1 793 99 35M = 646 -182 CTTCAGACCCTACACGAATGCGTCTCTACCACAGG 77-):22<<<33;<5<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:66:1282:1215 147 seq1 794 99 35M = 627 -202 TTCAGACCCTACACGAATGCGTCTCTACCACAGGG ::;<;<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:194:688:289 147 seq1 795 99 35M = 631 -199 TCAGACCCTACACGAATGCGTCTCTACCACAGGGG ;8;%28<;<<<<<<<<;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:8:36:927:478 147 seq1 798 99 35M = 610 -223 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ,6;;;3;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:99:756:130 83 seq1 798 99 35M = 606 -227 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:192:716:235 83 seq1 798 99 35M = 651 -182 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT <5<<<8<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:63:424:1643 83 seq1 798 99 35M = 614 -219 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT 9+<<<+7<<<<<<<<<<<<<<<<<8<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:14:360:580 83 seq1 799 99 35M = 963 199 ACCCTACACGAATGCGTCTCTACCACAGGGGGCGG ===========3===;5<==8;====79==.=5'5 MF:i:18 Aq:i:68 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS51_78:7:186:199:927 147 seq1 802 99 35M = 783 -54 CTACGCGAATGCGTCTCTACCACAGGGGGCTGCGC -;++)6<*8+;&<&/<<<<7<<71<<<<<6<<<7< MF:i:18 Aq:i:57 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS139_19:3:4:1502:1911 83 seq1 802 99 40M = 652 -190 CTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTT :+:::5/;99<;<&<*<-9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:187:791:153 83 seq1 803 99 35M = 958 190 TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG <<<<<<<<<<<<<<<<<<<<<:+;;<;<88*6;68 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:63:527:1923 83 seq1 803 99 35M = 981 213 TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG <<<<<<<<<<<<<<<<<:<<<<3<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:31:98:804 83 seq1 805 99 35M = 982 212 CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGC =======9===;============5=;9=;=;==& MF:i:18 Aq:i:74 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS218_4:7:89:1487:520 147 seq1 805 99 35M = 997 227 CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGT 8<<<6/<<<<<<<<<:<<8<:<<3<<:668<86<3 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:69:88:1154 83 seq1 805 99 35M = 992 222 CACGAATGCGTCTCTACCACAGGCGGCTGCGCGGT <<<<<<<<<<<<<<<<<<<<<<<2<<<<:<<<<<7 MF:i:18 Aq:i:47 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS114_26:1:99:212:522 147 seq1 806 99 35M = 1002 231 ACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT ================8==;====;=;===1==:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:35:378:681 147 seq1 812 99 35M = 632 -215 GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT :<5-<);;;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:182:404:693 83 seq1 812 99 35M = 646 -201 GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT <;7;;4<<<<<<<7<<7<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:119:761:239 83 seq1 813 99 35M = 999 221 CGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATC <<<<<<<<<<<<6<<<<<<;<2<<<<;<<<<<;;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:165:464:123 147 seq1 814 99 35M = 650 -199 GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA 9;<)<<%<<9<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:40:758:116 83 seq1 814 99 40M = 632 -222 GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG 25/8/:<75:2<<<<<<7<<;<<<<<<<88;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:55:506:125 83 seq1 817 99 35M = 982 200 TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA <<<<<<<<<;<9<;<<;558<<<<5(5*<<<<<51 MF:i:18 Aq:i:35 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:162:594:858 147 seq1 818 99 35M = 634 -219 CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA 90;<99;==99==;4=:========;=====;=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:55:74:1040 83 seq1 818 99 35M = 975 192 CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:100:708:1984 83 seq1 819 99 35M = 1015 231 TACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<7%: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:92:367:1495 147 seq1 820 99 35M = 987 202 ACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<6<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:49:905:27 147 seq1 821 68 35M = 1000 214 CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA <<;<.89<9.<2<9<:91+447.9,04&000(,+( MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS218_4:7:87:964:826 147 seq1 822 99 35M = 999 212 CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<1<<8;4;;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:38:1576:1923 147 seq1 822 99 35M = 987 200 CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;<<;< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:337:968 83 seq1 823 85 35M = 981 193 ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT <<<<<;<<<<<<<<<<<<<<<<<<<;<<;;<;;;; MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:187:294:947 83 seq1 823 99 35M = 1002 214 ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT <<<<<<<<<<<<<<<<:<<<<<&<<%:<)7;7::4 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:49:271:588 83 seq1 830 99 35M = 658 -207 GCTGCGCGGTTTCCCATCATGAAGCACTGAACTTC :0=:===:<===;;===;================= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:40:594:752 147 seq1 831 99 35M = 651 -215 CTGCGCGGTTTCCCATCATGAAGCACTGAACTTCC ;7;9<;;;<;<;:<<;;<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:163:757:432 83 seq1 837 99 35M = 1013 211 GGTTTCCCATCATGAAGCACTGAACTTCCACGTCT <<<<<<<;<<<<<<<<;<;<<<<<<<<<<<<83:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:156:857:494 83 seq1 838 99 35M = 648 -225 GTTTCCCATCATGAAGCACTGAACTTCCACGTCTC <<<8<:5<<;<<8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:84:91:614 147 seq1 839 99 35M = 1019 215 TTTCCCATCATGAAGCACTGATCTTCCACGTCTCA ;4<<<<<-84<<<;<<<<8<7.<4<<;77&:%<:: MF:i:18 Aq:i:39 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS51_64:7:152:918:824 147 seq1 839 99 35M = 1033 229 TTTCCCATCATGAAGCACTGAACTTCCACGTCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:67:317:249 147 seq1 840 26 35M = 683 -192 TTCCCATCATGACGCACCGAACTTCCACGTCTCAT .5;7;++;<8.;&:7<<.5<<<<7<<7<<<<<<;7 MF:i:-126 Aq:i:26 NM:i:2 UQ:i:18 H0:i:0 H1:i:0
+EAS51_62:7:96:836:737 147 seq1 841 99 35M = 642 -234 TCCCATCATGAAGCACTGAACTTCCACGTCTCATC 1<;<7;;1;8;;8:<<1<;<<;<<<<<<<<<<;<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:130:912:658 83 seq1 841 99 35M = 652 -224 TCCCATCATGAAGCACTGAACTTCCACGTCTCATC ;=;;;<<<<<=55=;==<=======<========= MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:75:934:439 147 seq1 842 99 35M = 1001 194 CCCATCATGAAGCACTGAACTTCCACGTCTCATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:212:329:348 147 seq1 842 99 35M = 1020 212 CCCATCATGAAGCACTGAACTTCCACGTCTCATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:49:183:435 147 seq1 843 99 35M = 1005 197 CCATCATGAAGCACTGAACTTCCACGTCTCATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:;8;: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:280:133:495 83 seq1 843 99 35M = 1015 207 CCATCATGAAGCACTGAACTTCCACGTCTCATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:232:351:909 147 seq1 843 80 36M = 685 -194 CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG :8%3<8====130=8==+===;=3=8===48==;3* MF:i:18 Aq:i:39 NM:i:1 UQ:i:15 H0:i:0 H1:i:1
+EAS221_1:8:77:781:676 147 seq1 846 99 35M = 1010 199 TCATGAAGCACTGAACTTCCACGTATCATCTAGGG <<<<<<<5<<5<<<<<<<<<<<<13<<2<<<<<,< MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS1_95:2:198:691:595 83 seq1 847 99 35M = 655 -227 CATGAAGCACTGAACTTCCACGTCTCATCTAGGGG :=:;=;===========;================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:31:948:254 147 seq1 849 99 35M = 680 -204 TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA 7;;;98<<7<<<<<<<<<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:278:440:902 83 seq1 851 99 35M = 1032 216 AAGCACTGAACTTCCACGTCTCATCTAGGGGAACA =========<==<==============:;;=;=;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:74:674:124 147 seq1 854 99 35M = 1041 222 CACTGAACTTCCACGTCTCATCTAGGGGAACAGGG <<<<<<<<<<<<:<;<<<<;<<<<;9;<<;;.;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:28:781:723 147 seq1 855 99 36M = 676 -215 ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG 8488<::;4;;<:;;;::<;7<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:28:474:566 147 seq1 855 99 36M = 1018 199 ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG <<<<<<<<<<<<<<<<<<<<<<<:<;<;;<<7;8;< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:124:241:608 147 seq1 856 99 35M = 670 -221 CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG 9;;<<;<<<;<<<;<:<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:187:925:547 147 seq1 857 99 35M = 689 -203 TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG ((988+&8<<;<09<;<<9<<4<<-<99<<;<9<; MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:9:512:826 83 seq1 859 99 35M = 1021 197 AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG 67<<<;;;<;;<<;;<;<:;9;;;9;;;;<59777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:194:696:490 83 seq1 862 99 35M = 1026 199 TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC <<<<<<<<<<<<<<<<<<<;5<<<<<:<1<8<<<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:96:788:614 83 seq1 862 99 35M = 667 -230 TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC ;9;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:81:786:340 147 seq1 863 99 35M = 1033 205 TCCACGTCTCATCTAGGGGAACAGAGAGGTGCACT <<<<7<<<<<<<<<<<<<<7<<;<&<<;;7<7;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS192_3:7:298:644:697 147 seq1 863 99 35M = 1035 207 TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT <<<<<<<<<<<<<<<::;;;6<8:;;9;98;668; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:178:305:843 147 seq1 864 99 35M = 1037 208 CCACGTCTCATCTAGGGGAACAGGGAGGTGCACTA <<<<<<<<<<<<<<<<<<<:<<<<<;<<:<<:<;: MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:5:863:302 147 seq1 866 99 35M = 698 -203 ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT :4:29:<<<9;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:30:788:376 83 seq1 866 99 35M = 1038 207 ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT <<<<<<<<<<<<:<<<<<<<<:<;<<(<7;7;:(; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:143:310:958 147 seq1 868 99 35M = 1048 215 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<<<<<<<<8<8<<<<<;;7<<<;6;<<+4;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:3:233:911 83 seq1 868 99 35M = 688 -215 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:75:637:650 83 seq1 868 99 35M = 691 -212 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:73:513:102 147 seq1 868 99 35M = 698 -205 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC ==::===8=>=====>=>=>>>=>>==>=>>>>>> MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:297:637:86 83 seq1 869 99 35M = 704 -200 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG <:75<;<;;<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS54_65:3:290:558:349 147 seq1 869 99 35M = 719 -185 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG 2;2;;'5&;<<5<<;5/<<<<<7<<;+;<<+1<8< MF:i:18 Aq:i:59 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS1_95:3:308:956:873 83 seq1 870 99 35M = 1068 233 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC <<<<<<<<<<<<<;<;<;1<<<<<.<9<;<<<<+; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:147:64:416 147 seq1 870 99 35M = 701 -204 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC /;49;:6<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:812:345 147 seq1 871 99 36M = 1036 201 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC <<<<<<<7<;<<7<;77;3<&0-;<5<;6<1'13<: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:134:243:630 147 seq1 871 99 35M = 1052 216 TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT <<<:<<<<</<<<-<<<<6/<-<:<5+<::-2</2 MF:i:18 Aq:i:39 NM:i:2 UQ:i:29 H0:i:0 H1:i:1
+EAS54_81:2:27:856:401 83 seq1 871 99 35M = 679 -227 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCT .'=.93======;;====;======;===;=;=== MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:45:462:455 83 seq1 874 99 35M = 723 -186 TCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCA 62*<;;;;<<;<<9;;<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:264:988:663 147 seq1 875 99 35M = 688 -222 CGAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC (%<:4<4<<7<<1-:<1766<66<<<<+<:<;8;< MF:i:18 Aq:i:60 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_63:1:145:71:26 147 seq1 875 99 35M = 1040 200 CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC <<<<<<<<<<<<<<<<<;<;;<<;<;<9<9;;99; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:101:825:28 147 seq1 879 99 35M = 1079 235 GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC <<86<<;<78<<<)<;4<67<;<;<74-7;,;8,; MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_4:5:63:875:1339 83 seq1 879 99 35M = 711 -203 GGGAACAGGGAGGTGCACTAATGCGCTCCACGCCC ;;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:290:270:557 83 seq1 880 99 35M = 1052 207 GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA <<<<<<<<<<<<<;<<<<9<:;<<<<<<5<0<<;+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:134:853:558 147 seq1 880 99 35M = 1071 226 GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA ==========================9=9=;<;<5 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:282:567:481 83 seq1 880 88 35M = 1064 219 GGAACAGGGAGGCGCACTAATGCGCTCCACGCCCA <<<<<<<<<<<<3<7<7<<<<;<<0)<<<<<<<<3 MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS114_30:1:154:818:165 147 seq1 881 99 35M = 1041 195 GAACAGGGAGGTGCACTAATGCGCTCCACGCCCAA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<:7;:; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:301:54:240 147 seq1 882 99 35M = 1061 214 AACAGGGAGGTGCACTAATGCGCTCCACGCCCAAG <<<<:<9<<<<:<<<<9<<<<<<690<<6</<(83 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:12:402:843 147 seq1 885 99 35M = 1072 222 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:262:965:756 83 seq1 885 99 35M = 1069 219 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<9;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:30:816:90 147 seq1 885 99 35M = 1057 207 AGGGAGGTGCACTAATGCGCTCCACGCCCCAGCCC <<<<<<<<<<<<<<<<<<<:<<<<<<::1&(1::7 MF:i:18 Aq:i:69 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS188_7:4:171:104:398 147 seq1 885 99 35M = 1066 216 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC =========)===97===3===4===4==,)=/)= MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:163:31:455 83 seq1 886 99 35M = 730 -191 GGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCT 8;<<;<<<78+<=</<<=;23<=<<<<<<<<<<<< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:149:354:667 147 seq1 888 99 35M = 734 -189 GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC ;<;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:18:571:1110 83 seq1 888 99 35M = 1070 217 GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC 7<<<<<<<<<<<<;<<<<<<<<<<<<788<<<;6< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:312:837:406 147 seq1 889 99 35M = 1048 194 AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:160:272:398 83 seq1 891 99 35M = 705 -221 GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA 3:,<,;;<<;<<1<<<<<<<;<;<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:228:587:504 83 seq1 891 65 35M = 1050 194 GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA <<<<7<<7;7<<3<<<<7<<<<<*3<<<<74<:<* MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:35:361:546 83 seq1 892 99 35M = 731 -196 TGCACTAATGCGCTCCACGCCCAAGCCCTTCTCAC :4;4;;<<;4<8<;;<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:84:438:1505 83 seq1 893 99 40M = 1068 215 GCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTC 35<<:;9<;<;5<<<:<3<<7:<9/<)<<:::9<&5;;+1 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:277:482:316 147 seq1 894 99 35M = 1098 239 CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG <<<<<<<<<<<<<<;<;<<<:<;<<<<;<<<1<1; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:86:498:373 83 seq1 894 99 35M = 716 -213 CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG ):)4:<5<<<<;89<<<969<<<:<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:236:498:526 147 seq1 895 99 35M = 1048 188 ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:43:1120:878 83 seq1 895 99 35M = 1075 215 ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT <<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<=7;7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:104:153:698 83 seq1 896 99 36M = 713 -219 CTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTT 69<<)9<<:5:6<<<16:<6/<6<1<<<<<:<:<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:166:42:147 83 seq1 898 99 35M = 1048 185 AATGCGCTCCACGCCCAAGCCCTTCTAACAGTTTC <<;<<<<<<<<<<<<<<<<;6<<64;)<<7;7;;; MF:i:18 Aq:i:43 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+B7_595:2:178:77:424 83 seq1 900 99 35M = 1058 193 TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG <<<<<<<<<<<<<<<6<<;<<<<<<<<6<;<<<<6 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:87:734:888 83 seq1 900 99 35M = 717 -218 TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG 56<<86;:<<<4;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:149:650:44 83 seq1 902 99 36M = 726 -212 CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC ;8<<</<<:<<595<<9<<<<<<<<<<<<<<3<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:552:234 83 seq1 903 99 35M = 1094 226 GCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC <<<<<<<<<<<<<;<<<<<<<<9<969<<<<3<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:58:703:72 147 seq1 905 99 35M = 1088 218 TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC 2<7<<<<<<<<<<<8:<<<<8<(<8<:::8.::<3 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:242:4:593 83 seq1 905 99 35M = 1086 216 TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC <<<<<<<<<<<8<<<<-<<<<<88;<;<<8<;88< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:67:620:344 147 seq1 905 99 35M = 755 -185 CCCCCGCCCAAGCCCTTCTCACAGTTTCTGCCCCC +++*+++#++++++,++++++++,,+,&+,,,,+, MF:i:18 Aq:i:33 NM:i:2 UQ:i:19 H0:i:1 H1:i:0
+EAS51_62:7:178:286:414 83 seq1 907 99 35M = 731 -211 CACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAG 68;38::<<;<<8;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:174:987:334 147 seq1 908 99 35M = 1082 209 ACACCCAAGCCCTTCTCACAGTTTCTGCCCCCAGC <<;4<<<<;;</4<4<+<<<<<;<<<<<</<93+2 MF:i:18 Aq:i:41 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS219_FC30151:1:55:8:1412 147 seq1 910 99 35M = 1072 197 GCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:8:1351:1986 83 seq1 911 99 35M = 729 -217 CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG <8;<<<<<<<<<<<;<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:37:610:260 83 seq1 913 99 35M = 745 -203 CAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGT /74<.<4.&<<<:<<<<::<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:228:189:826 83 seq1 914 99 35M = 1112 233 AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT ;9=========;=1======9=====1;=<3=:6; MF:i:18 Aq:i:45 NM:i:1 UQ:i:16 H0:i:0 H1:i:1
+EAS56_59:3:149:953:349 147 seq1 915 99 35M = 777 -173 AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG 2;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:24:1374:211 83 seq1 915 99 35M = 1064 184 AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG ;;:<<;<;:;;;;;;;;;;<::;;;6;;2+74917 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:5:491:391 147 seq1 917 99 35M = 782 -170 CCCTGCTCACAGTTTCTGCCCCCAGCATGGTTGTA -/+5-.&&:5+:92=6===========9======= MF:i:18 Aq:i:62 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS114_32:2:306:119:56 83 seq1 919 99 35M = 1083 199 CTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:216:381:608 147 seq1 920 99 35M = 1075 190 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<;;+<6:<;26; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:73:292:429 147 seq1 920 99 35M = 752 -203 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG ;6;6;<<<<<;<<<<;<<<<<<<<7<<<<<<5<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:170:265:818 83 seq1 920 73 35M = 748 -207 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG 3+;%;.;;<<9+;3;;;<<<;57<1<;<<<<<<<; MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:278:906:933 83 seq1 920 99 35M = 1071 186 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<. MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:190:95:706 83 seq1 920 99 35M = 1078 193 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<9<<<<<;;<;<;;<<;<;;<, MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:278:848:765 83 seq1 920 99 35M = 1088 203 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:29:249:878 147 seq1 921 99 35M = 1077 191 TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG <<<<<<<<<<<<<<<<<<<<<<:<:<<=<<:<<6& MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:259:467:737 147 seq1 923 99 36M = 1102 215 TCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCA <<<<<<<<<<<<7<<<<<<<'<<.<<<<<<;;;<67 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:24:195:604 147 seq1 923 99 35M = 1098 210 TCACAGTTTCTGCCCCCAGCATGGTTGTACTGTGC <;<<<<<<<<<89<<<<<868<8;6<8;3(38&<8 MF:i:18 Aq:i:65 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_32:4:42:923:169 147 seq1 925 99 35M = 1099 209 ACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAA 9<<<;9<<<<<;<;<<.<<;<;6<<<<1;8<<-0; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:29:529:379 147 seq1 926 99 35M = 1117 226 CAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT <<<<<<<<8<<<<<<<<<<<<<<<<<;<672;<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:26:785:882 147 seq1 926 99 35M = 1107 216 CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT <<<0<<<<<<<<<6,<<)<<<<<<<&<<0<<,<'< MF:i:18 Aq:i:39 NM:i:1 UQ:i:21 H0:i:0 H1:i:1
+B7_591:7:129:956:115 83 seq1 927 99 36M = 740 -223 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC <<:<9<4<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:82:356:253 147 seq1 927 99 35M = 752 -210 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA 97;7<<;;<<<<<7;<<:<<<9<<;<<<9<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:134:379:893 83 seq1 927 99 35M = 1095 203 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA <<<<<<<<<<<<<5<<<<;<<<<<;<:5;<<4+<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:256:404:584 83 seq1 928 99 35M = 1096 203 GTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC <<<<<<<<<<<<<<<<<<<<<7<3;<:;;3:3:</ MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:76:333:905 147 seq1 929 99 35M = 1076 182 TTTCTGCCCCCAGCATGGTTGTACTGGGCAATACA <<<<<7;<;<<6<<6<<7<<7<)&<4+6)0+<;(0 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:11:646:628 83 seq1 930 99 36M = 1106 212 TTCTGCCCCCAGCATGGTTGTACTGGGCAATACATG <<<<<<<<<<6<<<<<<<<<<<<</<;<<<<<<6<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:136:389:320 83 seq1 930 99 35M = 1100 205 TTCTGCCCCCAGCATGGTTGTACTGGGCAATACAT 7<<<<<;<<7<6<<;;<;<;;677<6;(27;<(97 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:93:334:858 83 seq1 932 99 35M = 1106 209 CTGCCCCCAGCATGGTTGTACTTGGCAATACATGA <<<<<<<<;<<<<;;<<9<<<<&;&<<9<9;/;&; MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:3:46:981:766 83 seq1 933 99 35M = 778 -190 TGCCCCCAGCATGGTTGTACTGGGCAATACATGAG /<<<;/;<<316<<<3<<<<7<<<7<<<;<<<<<7 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:209:159:130 83 seq1 934 99 34M = 1109 210 GCCCCCAGCATGGTTGTACTGGGCAATACATGAG <<<<<<8<<<<<<&<<+7<<4<<<22<;<<<<3< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:111:796:737 83 seq1 936 99 35M = 1112 211 CCCCAGCATGGTTGTACTGGGCAATACATGTGATT <<<<<<<<<<<<<<<:<<;7;<<<<993<4%:%<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:4:15:856:340 83 seq1 936 99 35M = 1093 192 CCCCAGCATGGTTGCACTGGGCAATACATGAGATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<77<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:5:7:761:623 147 seq1 938 99 35M = 757 -216 CCGGCATGGTTGTACTGGGCAATACATGAGATTAT ::';-8);<<<<;<1<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS1_97:5:84:927:843 83 seq1 938 99 35M = 1138 235 CCAGCATGGTTGTACTGGGCAATACATGAGATTAT <<<<<<<<<<<<<;9;;4;<<0<<7<<9<;<:<5< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:273:901:459 83 seq1 938 99 35M = 1098 195 CCAGCATGGTTGTACTGGGCAATACATGAGATTAT <<8<<<;<;8<;<;<;7+8<788<;;22<27;77; MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:256:407:470 83 seq1 939 99 35M = 762 -212 CAGCATGGTTGTACTGGGCAATACATGAGATTATT 7.47;0;;5<4033*<<<<<9,<<<<<;<<<<<3< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:77:251:446 147 seq1 939 99 35M = 1110 206 CAGCATGGTTGTACTGGGCAATACATGAGATTATT <<9<<<<<<<<<<<<<97<<<<<<<<<96<<<+<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:102:467:897 147 seq1 940 97 35M = 756 -219 AGCATGGTTGTACAGGGCAATACATGAGATTATTA 83333<+02<:<.&<+<.<::7<<::<<<<:<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS221_1:6:92:1807:1185 83 seq1 940 99 35M = 1119 214 AGCATGGTTGTACTGGGCAATACATGAGATTATTA <<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:142:858:903 83 seq1 943 99 35M = 1121 213 ATGGTTGTACTGGGCAATACATGAGATTATTAGGA ======;====5=======9======;===3=5=; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:143:560:194 147 seq1 946 99 35M = 768 -213 GTTGTACTGGGCAATACATGAGATTATTAGGAAAT 9:<;7<:::<:<;<<<<<<<<<<:<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:148:437:481 83 seq1 949 99 36M = 764 -221 GTACTGGGCAATACATGAGATTATTAGGAAATGCTT <<<;<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:75:917:886 147 seq1 951 99 35M = 1110 194 ACTGGGCAATACATGAGATTATTAGGAAATGCTTT <<<<<<<<<<<<<<:<<<<<<<<<71<<<:6<:8< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:118:851:285 147 seq1 953 99 35M = 1133 215 TGGGCAATACATGAGATTATTAGGAAATGCTTTAC <<<<<<<<<<<<<<<<<<<<<<<;;<;<:<<<<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:179:389:585 83 seq1 953 24 35M = 770 -218 TGTGAAATGAATGAGATTATTAGGAAATGCTTTAC ;<)<;*;9*+<;<<,,<,<4<4<<<<<;<4<9494 MF:i:18 Aq:i:24 NM:i:4 UQ:i:53 H0:i:0 H1:i:0
+EAS114_30:7:269:944:220 147 seq1 953 99 35M = 1147 229 TGGGCAATACATGAGATTATTAGGAAATGCTTTAC <<<<<<<8<<<<<<<<<<<<<<<;<<<<<;<<;81 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:93:1002:845 147 seq1 954 99 35M = 1129 210 GGGCAATACATGAGATTATTAGGAAATGCTTTACT <<<<<<<<<<<<<<<<<<<<<:<<;<<<;<<<</< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:66:584:407 83 seq1 954 99 35M = 785 -204 GGGCAATACATGAGATTATTAGGAAATGCTTTACT <<84<<<766<<<.6<<<<<<4<<7<<<<<<<7<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:63:48:631 147 seq1 957 99 35M = 1143 221 CAATACATGAGATTATTAGGAAATGCTTTACTGTC <<<<<<;<<7</<<<<<<;;;<<<;<;<<7;;);< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:187:791:153 147 seq1 958 99 35M = 803 -190 AATACATGAGATTATTAGGAAATGCTTTACTGTCA :;55&<99<<1<;<<8<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:72:1809:1398 83 seq1 958 99 35M = 1145 222 AATACATGAGATTATTAGGAAATGCTTTACTGTCA <<<<<<<<<<<<<<<<<<::<9<<<<<<<<<6<<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:66:257:524 147 seq1 959 99 35M = 791 -203 ATACATGAGATTATTAGGAAATGCTTTACTGTCAT <;<<<<<<<<3<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:247:522:670 147 seq1 960 99 35M = 1121 196 TACATGAGATTATTAGGAAATGCTTTACTGTCATA <<<<<<<<<<<<<<<;<<<<<<<<<<<<<5;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:37:400:627 147 seq1 961 99 35M = 1154 228 ACATGAGATTATTAGGAAATGCTTTACTGTCATAA <<<<<<7+<<<<<<2615<<6<<<<5<<1<<;:74 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:329:177:267 147 seq1 962 99 35M = 1139 212 CATGAGATTATTAGGAAATGCTTTACTGTCATAAC <<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<9; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:166:203:416 147 seq1 963 99 35M = 1136 208 ATGAGATTATTAGGAAATGCTTTACTGTCATAACT <<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<<97< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:14:360:580 147 seq1 963 99 35M = 799 -199 ATGAGATTATTAGGAAATGCTTTACTGTCATAACT <,1<;<;;<<<<<1<<<;<7<<6<:;;<<<<<<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:193:38:987 147 seq1 964 99 35M = 1158 229 TGAGATTATTAGGAAATGCTTTACTGTCATAACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;:;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:39:59:738 147 seq1 965 99 35M = 1142 212 GAGATTATTAGGAAATGCTTTACTGTCATAATTAT 3<8.<<<<<<<-<<<<3<388;;880<0<0)-722 MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS51_66:4:209:92:210 147 seq1 965 99 35M = 1156 226 GAGATTATTAGGAAATGCTTTACTGTCATAACTAT <<<<<<<<<<<<<<<<;<<<<<<<5<7<<;;;<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:86:308:648 83 seq1 970 99 35M = 1161 226 TATTAGGAAATGCTTTACTGTCATAACTATGAAGA =8=====;=8======;=======35==;=;.;25 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:206:563:262 147 seq1 971 99 35M = 1137 201 ATTAGGAAATGCTTTACTGTCATAACTATGAAGAG <<<<<<<<<;<<<<<<<<<<<<;<<<<<<<-;<4; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:82:822:767 83 seq1 972 99 35M = 1165 228 TTAGGAAATGCTTTACTGTCATAACTATGAAGAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<.<,< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:207:926:427 147 seq1 973 99 35M = 1159 221 TAGGAAATGCTTTACTGTCATAACTATGAAGAGAC <<<<<<7<<<<<;<<<<<6:<;<6<&<58<<6::: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:144:28:475 83 seq1 974 99 35M = 1167 228 AGGAAATGCTTTACTGTCATAACTATGAAGAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<::8< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:55:74:1040 147 seq1 975 99 35M = 818 -192 GGAAATGCTTTACTGTCATAACTATGAAGAGACTA ;;;;;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:274:176:479 83 seq1 976 99 35M = 1144 203 GAAATGCTTTACTGTCATAACTATGAAGAGACTAT <<<<<<<<<<<<<;<<<<<<<<<<;<<9<59<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:337:968 147 seq1 981 10 35M = 823 -193 GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA %454<75!7<+!990<9<6<<<<6<</<<<<<<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:24 H0:i:0 H1:i:0
+EAS114_28:7:157:786:424 83 seq1 981 99 36M = 1171 226 GCTTTACTGTCATAACTATGAAGAGACTATTGCCAG <<<<<<<<<<<<<;<<<<<<;<<;<<;<<<<+4:70 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:63:527:1923 147 seq1 981 99 35M = 803 -213 GCTTTACTGTCATAACCATGAAGAGACTATTGCCA 9<<<8<-8;;8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:7:55:506:125 147 seq1 982 99 35M = 817 -200 CTTTACTGTCATAACTATGAAGAGACTACTGCCAG 118%67;1;8,4:187<4>::1:818;;&::<>.; MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_81:2:31:98:804 147 seq1 982 99 35M = 805 -212 CTTTACTGTCATAACTATGAAGAGACTATTGCCAG ====;========7===================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:235:805:373 147 seq1 983 99 35M = 1146 198 TTTACTGTCATAACTATGAAGAGACTATTTCCAGA <<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99; MF:i:18 Aq:i:74 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS114_28:5:11:868:62 83 seq1 983 99 36M = 1154 207 TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT <<<<<<<<<<<<<<<<<<<<:<<<;<<<<(7:7039 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:280:512:316 147 seq1 984 99 35M = 1159 210 TTACTGTCATAACTATGAAGAGACTATTGCCAGCT ==<========6==4==6;;==:===;=2/:+8%6 MF:i:18 Aq:i:68 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:5:292:122:666 83 seq1 985 99 35M = 1159 209 TACTGTCATAACTATGAAGAGACTATTGTCAGATG <<<<<<6<<<<<<<<8;<<<<<<<<<<3&9+;;(; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_53:1:23:403:981 83 seq1 985 99 35M = 1151 201 TACTGTCATAACTATGAAGAGACTATTGCCAGATG <8<<<;<<<<<<;<<<<<<8;<<<9<9,3;,6(91 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:33:1566:588 83 seq1 985 76 35M = 1166 216 TACTGTCATAACTATGAAGAGCCTATTGCCAGATG <;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797 MF:i:18 Aq:i:37 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS139_11:7:92:367:1495 83 seq1 987 99 35M = 820 -202 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA <8<88<<<<7<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:38:1576:1923 83 seq1 987 99 35M = 822 -200 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA 8;<98<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:190:481:295 147 seq1 990 99 35M = 1161 206 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<<<<<<<<<<<<<<<<<<<<<9<<<<<9<7<2:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:168:117:441 83 seq1 990 99 35M = 1151 196 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<3<<<<<<<<<<<<<<<<<<<+<<17;<;:<995 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:239:796:221 147 seq1 992 99 35M = 1160 203 ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC <<<7<<7<<7<<7<;<<<<<,;;,+'<+/+99%:' MF:i:18 Aq:i:37 NM:i:4 UQ:i:26 H0:i:0 H1:i:1
+EAS220_1:4:69:88:1154 147 seq1 992 99 35M = 805 -222 ATAACTATGAAGAGACTATTGCCAGATGAACCACA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:34:956:1309 83 seq1 994 99 35M = 1168 209 AACTATGAAGAGACTATTGCCAGATGAACCACACA <<<<<<7<<<<<<<<<<<6<<<<<<<<<<<:<8<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:229:717:121 83 seq1 995 99 35M = 1150 190 ACTATGAAGAGACTATTGCCAGATGAACCACACAC =================<)=<4<0=.<<<71;41& MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS219_1:1:67:191:668 83 seq1 995 99 35M = 1134 174 ACTATGAAGAGACTATTGCCAGATGAACCACACCT <<<<<<<<<<<<<<<<<6<<;<;<;<<<<<<6;%2 MF:i:18 Aq:i:74 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_64:3:309:303:278 147 seq1 996 99 35M = 1178 217 CTATGAAGAGACTATTGCCAGATGAACCACACATT <<<<<<<<<<<<<<<<+<<+<<7<<<<<5<<<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:60:1020:1259 83 seq1 996 99 35M = 1157 196 CTATGAAGAGACTATTGCCAGATGAACCACACATT <;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:89:1487:520 83 seq1 997 99 35M = 805 -227 TATGAAGAGACTATTGCCAGATGAACCACACATTA 4;;/<<<<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:15:805:420 147 seq1 998 35 35M = 1164 201 ATGAAGAGACTATTCACATGTGAACCACACATTTA ;73;;;;67.;1<<+*.;*&<4947<&474&*9*( MF:i:-126 Aq:i:35 NM:i:4 UQ:i:33 H0:i:0 H1:i:0
+EAS56_57:3:119:761:239 147 seq1 999 99 35M = 813 -221 TGAAGAGACTATTGCCAGATGAACCACACATTAAT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:142:457:584 83 seq1 999 99 35M = 1160 196 TGAAGAGACTATTTCCAGATGAACCACACATTAAT <<<<<<<<<<<<</<<,6<66<<<;<;;<*4744. MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS218_4:7:87:964:826 83 seq1 999 99 35M = 822 -212 TGAAGAGACTATTGCCAGATGAACCACACATTAAT )6<<<<<<:;<6<<::<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:49:905:27 83 seq1 1000 68 35M = 821 -214 GAAGAGACTATTGCCAGTTGAACCACACATTAATA 99515<<&<<6595-56%;86&<;<<<6<<<<6;< MF:i:18 Aq:i:31 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS1_108:3:75:934:439 83 seq1 1001 99 35M = 842 -194 AAGAGACTATTGCCAGATGAACCACACATTAATAC ==7=:=========================<==== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:99:212:522 83 seq1 1002 99 35M = 806 -231 AGAGACTATTGCCAGATGAACCACACATTAATACT <1<16<7<3<<;;<8<<<<<<<<<<<<;<<<<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:187:294:947 147 seq1 1002 99 35M = 823 -214 AGAGACTATTGCCAGATGAACCACACATTAATACT <<:<<8181;<8<<<<<<<<8<<<<<<<<<<<<<: MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:2:152:860:286 147 seq1 1004 99 35M = 1171 202 AGACTATTGCCAGATGAACCACACATTAATACTAT <;<<<;<<0:<3<:<<2<<<<<7+<7+47<9(999 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:49:183:435 83 seq1 1005 99 35M = 843 -197 GACTATTGCCAGATGAACCACACATTAATACTATG 1<7<<<<;:<<<<<;<<<;<<<;<;<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:63:854:610 147 seq1 1005 99 35M = 1180 210 GACTATTGCCAGATGAACCACACATTAATACTATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:12:276:1797 83 seq1 1006 99 35M = 1190 219 ACTATTGCCAGATGAACCACACATTAATACTATGT <<<<<<<<<<<<:</<<9<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:190:42:671 147 seq1 1008 99 36M = 1192 220 TATTGCCAGATGAACCACACATTAATACTATGTTTC <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:67:692:110 83 seq1 1009 99 35M = 1175 201 ATTGCCAGATGAACCACACATTAATACTATGTTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:61:183:767 83 seq1 1010 99 35M = 1195 220 TTGCCAGATGAACCACACCTTAATACTATGTTTCT <<<<<<<<<<;<<<9<9<+<<<8<<<<<<;8<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS221_1:8:77:781:676 83 seq1 1010 99 35M = 846 -199 TTGCCAGATGAACCACACATTAATACTATGTTTCT :<;<2<<<<<<26<<<<6<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:21:132:1423 83 seq1 1012 99 35M = 1178 201 GCCAGATGAACCACACATTAATACTATGTTTCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:163:757:432 147 seq1 1013 99 35M = 837 -211 CCAGATGAACCACACATTAATACTATGTTTCTCAT 1+<8<<<<<<;<5<;<<<<<;5<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_30:3:302:288:657 83 seq1 1013 99 35M = 1173 195 CCAGATGAACCACACATTAATACTATGTTTCTTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:97:1584:777 83 seq1 1013 99 35M = 1200 222 CCAGATGAACCACACATTAATACTATGTTTCTTAT <<;<;;;;<;<;<<;;;;;;;;;;;;;;:;79979 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:280:133:495 147 seq1 1015 99 35M = 843 -207 AGATGAACCACACATTAATACTATGTTTCTTATCT <:<9:<<7:<6<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:100:708:1984 147 seq1 1015 99 35M = 819 -231 AGATGAACCACACATTAATACTATGTTTCTTATCT :8<(8<)9<;<<<<+<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:182:313:319 83 seq1 1016 99 35M = 1180 199 GATGAACCACACATTAATACTATGTTTCTTATCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<;<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:41:474:283 83 seq1 1018 99 35M = 1182 199 TGAACCACACATTAATACTATGTTTCTTATCTGCA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<+<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:28:474:566 83 seq1 1018 99 36M = 855 -199 TGAACCACACATTAATACTATGTTTCTTATCTGCAC ;<<<+<<<<5<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:84:91:614 83 seq1 1019 99 35M = 839 -215 GAACCACACATTAATACTATGTTTCTTATCTGCAC <<;;<<<7<<<<<<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:159:222:274 83 seq1 1019 99 35M = 1189 205 GAACCACACATTAATACTATGTTTCTTATCTGCAC =;9====;=9==59=+==9========9===5;7= MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:62:603:1552 147 seq1 1019 99 35M = 1180 196 GAACCACACATTAATACTATGTTTCTTATCTGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:212:329:348 83 seq1 1020 99 34M = 842 -212 AACCACACATTAATACTATGTTTCTTATCTGCAC 8<6:<:<<<;<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:233:97:262 83 seq1 1021 99 34M = 1175 189 ACCACACATTAATACTATGTTTCTTATCTGCCCA <<<<<<<<<<<;<;<<:<<<<<<<<<<<<.<&77 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_45:7:9:512:826 147 seq1 1021 99 35M = 859 -197 ACCACACATTAATACTATGTTTCTTATCTGCACAT 76777:;;;;;;;;;;;;;;;;;;;;;;;;;:;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:29:794:282 147 seq1 1025 99 36M = 1196 207 CACATTAATACTATGTTTCTTATCTGCACATTACTA <<<<<<<<<<<<<<<<<<<<<;<<<&<<;:<<8<<8 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:278:524:521 147 seq1 1025 99 35M = 1224 234 CACATTAATACTATGTTTCTTATCTGCACATTACT <<<;<<;<<<<<<<;<<<<<<<<<<7;5;<<<;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:39:966:551 83 seq1 1026 99 35M = 1205 214 ACATTAATACTATGTTTCTTATCTGCACATTACTA <<<<<<<<<<<<<<<<<<<<<<<<:<;<&<<&<<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:194:696:490 147 seq1 1026 99 35M = 862 -199 ACATTAATACTATGTTTCTTATCTGCACATTACTA ========;======;==========8==:===== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:305:565:952 83 seq1 1030 99 36M = 1213 219 TAATACTATGTTTCTTATCTGCACATTACTACCCTG 7<<<<<<<<<7<<<<<<<<<7<<<;;<;<;<<<<<+ MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:287:258:321 83 seq1 1030 99 35M = 1194 199 TAATACTATGTTTCTTATCTGCACATTACTACCCT <<<<<<<<<<<;<<<<<<<<42:<+<<<;<<;;;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:278:440:902 147 seq1 1032 99 35M = 851 -216 ATACTATGTTTCTTATCTGCACATTACTACCCTGC <;7;4<;<;;;<<;<;;;<<<<<9<<<;<<<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:180:905:36 83 seq1 1033 99 35M = 1212 214 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ==========8===;;=========;==77%41=; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:152:918:824 83 seq1 1033 99 35M = 839 -229 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:81:786:340 83 seq1 1033 99 35M = 863 -205 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ;<;<<<;<<;<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:196:11:27 147 seq1 1035 65 36M = 1198 199 CTATGTTTCTTATCTGCNCATTACTACCCTGCAATT <<<<<<<<;<<<<<<<8!4<<<;+<88;8<+2,8<; MF:i:18 Aq:i:24 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS192_3:7:298:644:697 83 seq1 1035 99 35M = 863 -207 CTATGTTTCTTATCTGCACATTACTACCCTGCAAT 8:<8;<;:7;<<;4;:+<7<<<<;<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:812:345 83 seq1 1036 99 36M = 871 -201 TATGTTTCTTATCTGCACATTACTACCCTGCAATTA ;<;<<<<5<<<:<;<:<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:178:305:843 83 seq1 1037 99 35M = 864 -208 ATGTTTCTTATCTGCACATTACTACCCTGCAATTA <<<<<<<4<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:30:788:376 147 seq1 1038 99 35M = 866 -207 TGTTTCTTATCTGCACATTACTACCCTGCAATTAA :5<<4:88;9<<<<<;<<<<;<8<;<<<<1<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:1:145:71:26 83 seq1 1040 99 35M = 875 -200 TTTCTTATCTGCACATTACTACCCTGCAATTAATA 882;8;<;;887<<<;;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:157:42:763 147 seq1 1040 99 35M = 1203 198 TTTCTTATCTGCACATTACTACCCTGCAATTATTA <<;<;<<<<<;<:4<<<<<<<<<;;4<<<:;;+;+ MF:i:18 Aq:i:61 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+B7_589:8:74:674:124 83 seq1 1041 99 35M = 854 -222 TTCTTATCTGCACATTACTACCCTGCAATTAATAT ;;;;;<<:<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:154:818:165 83 seq1 1041 99 35M = 881 -195 TTCTTATCTGCACATTACTACCCTGCAATTAATAT ;;;;<<<;<;;<;<<<<;<<;;;<<;<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:319:174:811 83 seq1 1044 99 35M = 1242 233 TTATCTGCACATTTCTACCCTGCAATTAATATAAT <<<<<<<<<;<<<<<<<<<;;<<<<<<<8<<;9<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:3:87:133:930 147 seq1 1044 99 40M = 1198 194 TTATCTGCACATTACTACCCTGCAATTAATATAATTGTGT <<<7<<<<;<<;7<<7<<;;<<<;<5;<;;;5;;<:/48: MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:44:1466:425 147 seq1 1044 99 35M = 1213 204 TTATCTGCACATTACTACCCTGCAATTAATATAAT <<<<<<<<<<<<<<<<<<<<<;<<<<<<;<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:236:498:526 83 seq1 1048 99 35M = 895 -188 CAGCACATTACTACCCTGCAATTAATATAATTGTG <%88<;<:8<<<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_64:3:143:310:958 83 seq1 1048 99 35M = 868 -215 CTGCACATTACTACCCTGCAATTAATATAATTGTG 84<;<6<<<<;<<<;;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:312:837:406 83 seq1 1048 99 35M = 889 -194 CTGCACATTACTACCCTGCAATTAATATAATTGTG ;<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:166:42:147 147 seq1 1048 99 35M = 898 -185 CTGCACATTACTACCCTGCAATTAATATAATTGTG 3.7;;;;:<<<77<<3<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:279:763:945 83 seq1 1048 99 36M = 1210 198 CTGCACATTACTACCCTGCAATTAATATAATTGTGT <<<<<<<<<<<<<<<<<<<4:<<47<:<;<<</<9< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:82:998:566 147 seq1 1050 99 35M = 1227 212 GCACATTACTACCCTGCAATTAATATAATTGTGTC <<<<<<<:<<0<<<<:<82<<::<4<<;<<4<4<; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:228:587:504 147 seq1 1050 65 35M = 891 -194 GCACATTACGACCCGGCAAGGTGTATAATTGTGTC ;4;4;&&82&04+&&48;3&3&*<7<47<<;-<-8 MF:i:-126 Aq:i:65 NM:i:6 UQ:i:47 H0:i:0 H1:i:0
+B7_595:6:290:270:557 147 seq1 1052 99 35M = 880 -207 ACATTACTACCCTGCAATTAATATAATTGTGTCCA 87:9;;;<851+:5.<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:134:243:630 83 seq1 1052 99 35M = 871 -216 ACATTACTACCCTGCAATTAATATAATTGTGTCCA 63<;37:<*&:<<<,,*<<:7<<7<<<<<<<::<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:47:303:887 147 seq1 1052 96 35M = 1240 223 ACATTACTACCCTGCCATTAATATACTTGTGTCCA <<;;<+<9<<<<<9<(6<;//</<8(<<89;6084 MF:i:18 Aq:i:25 NM:i:2 UQ:i:14 H0:i:0 H1:i:0
+EAS221_3:8:74:770:1712 147 seq1 1052 99 35M = 1208 191 ACATTACTACCCTGCAATTAATATAATTGTGTCCA <<<<<<<<<<<<<<<<<<<5<<<<<<<<<<<<7<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:29:575:453 147 seq1 1056 99 36M = 1228 208 TACTACCCTGCAATTAATATAATTGTGTCCATTTAC <<<<<<<<<<<<<<<<<<<<<<<<7<1<:<9<&<98 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:5:318:177:383 147 seq1 1056 99 35M = 1251 230 TACTACCCTGCAATTAATATAATTGTGTCCATGTA ;<<<<<<<<;<<<<<<<<<<<<<<<<<<7<;1'<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:179:549:753 83 seq1 1056 99 35M = 1218 197 TACTACCCTGCAATTAATATAATTGTGTCCATGTA <<<<<<<<<<<<<<<<<<<<<<<<8<7<<<:<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:30:816:90 83 seq1 1057 99 35M = 885 -207 ACTACCCTGCAATTAATATAATTGTGTCCATGTAC :<3:%9299<<<<<<<<<5<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:178:77:424 147 seq1 1058 99 35M = 900 -193 CTACCCTGCAATTAATATAATTGTGTCCATGTACA :5:8<;<;:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:301:54:240 83 seq1 1061 99 35M = 882 -214 CCCTGCAATTAATATAATTGTGTCCATGTACACAC &..*3===1=========5.5==5===4====:5= MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:91:521:517 83 seq1 1061 99 35M = 1239 213 CCCTGCAATTAATATAATTGTGTCCATGTACACAC <<<<<<<<<<<<<<<<9<<<<<<<<<<8<<;;;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:24:1374:211 147 seq1 1064 99 35M = 915 -184 TGCAATTAATATAATTGTGTCCATGTACACACGCT 77661;;;5;;:;;:;:;;;;;;8:;;;:;;;;;: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:282:567:481 147 seq1 1064 88 35M = 880 -219 TGCAATTAATATAATTGTGTCCACGTACACACGCT <9<6<;<9<<<;<<<;<5<7<5</7<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS188_7:4:171:104:398 83 seq1 1066 99 35M = 885 -216 CAATTAATATAATTGTGTCCATGTACACACGCTGT 79<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:9:80:353 147 seq1 1067 99 35M = 1233 201 AATTAATATAATTGTGTCCATGTACACACGCTGTC <<<<<<<<<<<<<<<<<<<<<6<<<;;<<5<<2;2 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:42:920:522 147 seq1 1067 99 35M = 1244 212 AATTAATATAATTGTGTCCATGTACACACGCTGTT <<<<<<<<<<<<<:<<<<<<<:<<<<<<<:;;::& MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_95:3:308:956:873 147 seq1 1068 99 35M = 870 -233 ATAAAAATAAGTGTGTCCATGTACACACGCTGTCC 91.97&9499&-1*98*19999839999.9&9799 MF:i:18 Aq:i:31 NM:i:3 UQ:i:23 H0:i:0 H1:i:1
+EAS139_19:6:84:438:1505 147 seq1 1068 99 40M = 893 -215 ATTAATATAATTGTGTCCATGTACACACTCTGTCCTATGT :0::413::;:::0:179::3<;<:<9<&6<<<;<019<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS51_62:3:55:340:837 147 seq1 1069 99 35M = 1238 204 TTAATATAATTGTGTCCATGTACACACGCTGTCCT <<;<<;<<<<<8<;<<<;<7<<<;<<<<<93+79( MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:262:965:756 147 seq1 1069 99 35M = 885 -219 TTAATATAATTGTGTCCATGTACACACGCTGTCCT <<:<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:18:571:1110 147 seq1 1070 99 35M = 888 -217 TAATATAATTGTGTCCATGTACACACGCTGTCCTA 9<<;<;==;;=;=<;<=================== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:40:918:950 147 seq1 1071 99 35M = 1247 211 AATATAATTGTGTCCATGTACACACGCTTTCCTTT =========,=9=====2=7===7=0==&=+3=-= MF:i:18 Aq:i:65 NM:i:2 UQ:i:17 H0:i:1 H1:i:0
+EAS1_97:2:59:882:980 147 seq1 1071 99 35M = 1263 227 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <<<<<<<<<8<<<<<9<+<<<9<<<1<<77889+6 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:134:853:558 83 seq1 1071 99 35M = 880 -226 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <<<<8<<<7<<<<;;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:278:906:933 147 seq1 1071 99 35M = 920 -186 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <88::<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:12:402:843 83 seq1 1072 99 35M = 885 -222 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <7<+<<11<9<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:160:434:853 147 seq1 1072 99 35M = 1259 222 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <<<<<<<<<<<<<<<<<<<<<<,<<<<:<<<<,<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:55:8:1412 83 seq1 1072 99 35M = 910 -197 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:219:294:861 147 seq1 1073 99 35M = 1244 206 TATAATTGTGTCCATGTACACACGCTGTCCTCTGT <<<<<<<<<<<<<9<<<5<9<<<9<<544<<'<+: MF:i:18 Aq:i:69 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS220_1:4:14:1665:1772 147 seq1 1073 84 35M = 1263 225 TATAATGGTGTCCATGTACACACGCTGTCCTATGT <<<<<7*<<<<<<<<<78<5<<7<<5<556<(73( MF:i:18 Aq:i:39 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+B7_591:3:45:294:380 147 seq1 1074 80 36M = 1233 195 ATAATTGTGTCCATGTACACACGATGTCATATGTAC <<<<<<<<9<<<<<<<<<70<<7<6272&:3<+</% MF:i:18 Aq:i:39 NM:i:2 UQ:i:32 H0:i:0 H1:i:1
+EAS1_108:7:222:538:267 83 seq1 1074 99 35M = 1228 189 ATAATTGTGTCCATGTACACACGCTGTCCTATTTA <<<<<<<<<<<<<<<<<<<<<;<<<<74;;39%6+ MF:i:18 Aq:i:67 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:216:381:608 83 seq1 1075 99 35M = 920 -190 TAATTGTGTCCATGTACACTCGCTGTCCTATGTAC 55<99<<<99;<;<<(<39&7<<<<<<<<<<<<<9 MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_67:1:138:186:274 83 seq1 1075 99 35M = 1231 191 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC =39====9===;=;=;=9=;=====;===-=+=-7 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:43:1120:878 147 seq1 1075 99 35M = 895 -215 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC <<<;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:166:776:590 147 seq1 1075 99 35M = 1252 212 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC <<<<<</<<<<<<<<<<<<<'<=<:26.</79<:: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:76:333:905 83 seq1 1076 99 35M = 929 -182 AATTGTGTCCATGTACACACGCTGTCCTATGTACT <<;<<<<;7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:29:249:878 83 seq1 1077 99 35M = 921 -191 ATTGTGTCCATGTACACACGCTGTCCTATGTACTT <,;<9<;<:<<<<<<<<<<<<<<<<<<<<<<><<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:190:95:706 147 seq1 1078 99 35M = 920 -193 TTGTGTCCATGTACACACGCTGTCCTATGTACTTA 9;97437;<;;<<;<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:101:825:28 83 seq1 1079 99 35M = 879 -235 TGTGTCCATGTACACACGCTGTCCTATGTACTTAT 0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:188:460:1000 83 seq1 1080 99 35M = 1251 206 GTGTCCATGTACACACGCTGTCCTATGTACTTATC <<<<<<<<<<<<<<<<7<<;:4;44<;;:8;;9;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:268:523:511 83 seq1 1081 99 35M = 1241 195 TGTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<;<<<<6<:9<<3<44 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:54:263:585 83 seq1 1081 99 36M = 1254 209 TGTCCATGTACACACGCTGTCCTATGTACTTATCAT <<<<<<<<<<<<<<<<<<<:;<<;<:;::<<;;:;4 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:174:987:334 83 seq1 1082 99 35M = 908 -209 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ,;<;;<<<&<<<1<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:224:932:942 83 seq1 1082 99 34M = 1250 203 GTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:12:1296:358 83 seq1 1082 96 35M = 1252 205 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ;;;6;7;7;;;;;7;9;;-*1;9;699/99/7477 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:306:119:56 147 seq1 1083 99 35M = 919 -199 TCCATGTACACACGCTGTCCTATGTACTTATCATG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:66:179:118 147 seq1 1084 99 35M = 1262 213 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;<<6<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:110:584:649 83 seq1 1084 99 35M = 1266 217 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<::<38 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:28:315:310 147 seq1 1085 99 35M = 1242 192 CATGTACACACGCTGTCCTATGTACTTATCATGAC <<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:242:4:593 147 seq1 1086 99 35M = 905 -216 ATATACACACGCTGTCCTATGTACTTATCATGACT 1.%55877+8+88808887+7;7;18:8;;;.&;8 MF:i:18 Aq:i:53 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:131:946:353 147 seq1 1087 99 35M = 1249 197 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<;<<<<;;<<<<<<<;<:52;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:4:1732:88 83 seq1 1087 99 35M = 1265 213 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<<<<<2<8;8<;<8;<2;2:<:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:58:703:72 83 seq1 1088 99 35M = 905 -218 GTACACACGCTGTCCTATGTACTTATCATGACTCT 5&<<7;+95;7'6<<<<<.<<<<<;<<9<7<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:113:694:725 147 seq1 1088 99 35M = 1266 213 GTACACACGCTGTCCTATGTACTTATCATGACTCT <<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:278:848:765 147 seq1 1088 99 35M = 920 -203 GTACACACGCTGTCCTATGTACTTATCATGACTCT 7;;<;5<55<<;;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:234:787:12 147 seq1 1092 97 35M = 1257 200 ACACGCTGGCCTATGTACTTATAATGACTCTATCC <;<<<9<<&+9;3;<993;<9<+94;9&41;08%9 MF:i:18 Aq:i:24 NM:i:2 UQ:i:15 H0:i:0 H1:i:0
+EAS218_1:4:15:856:340 147 seq1 1093 99 35M = 936 -192 CACGCTGTCCTATGTACTTATCATGACTCTATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:258:266:101 147 seq1 1094 99 35M = 1285 226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA <<<<<<<<<<<<<<<<<<5<;,<-2<<<<;68<<6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:552:234 147 seq1 1094 99 35M = 903 -226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA ::;:=;=99=====;;====;==========<=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:134:379:893 147 seq1 1095 99 35M = 927 -203 CGCTGTCCTATGTACTTATCATGACTCTATCCCAA 7137::;<<<<<<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:256:404:584 147 seq1 1096 99 35M = 928 -203 ACTGTCCTATGTACTTATCATGACTCTATCCCAAA &&326+23<3<<<+:<</<<8<<<:7:<<<<<<<< MF:i:18 Aq:i:60 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_30:4:317:378:535 147 seq1 1096 99 35M = 1258 197 GCTGTCCTATGTACTTATCATGACTCTATCCCAAA <<<<<<<<<<<<:<<<<<<<<<;<<;<8<;:7:1( MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:277:482:316 83 seq1 1098 99 35M = 894 -239 TGTCCTATGTACTTATCATGACTCTATCCCAAATT 9998;<<<<<;;<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:273:901:459 147 seq1 1098 99 35M = 938 -195 TGTCCTATGTACTTATCATGACTCTATCCCAAATT 4;+/+7,;<8+&<;;82;;<8<8<2<;<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:316:25:230 147 seq1 1098 99 35M = 1273 210 TGTCCTATGTACTTATCATGACTCTATCCCAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<);2;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:24:195:604 83 seq1 1098 99 35M = 923 -210 TGTCCTATGTACTTATCATGACTCTATCCCAAATT ;6<02;<<<<59<<;<;<<<<9<3<<<<<<<<<;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:42:923:169 83 seq1 1099 99 35M = 925 -209 TTCCTATGTACTTATCATGAATCTATCCCAAATTC &;972<;&<9<,;;;<<<;<&99<<;<;;3<<3<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:10 H0:i:0 H1:i:1
+EAS114_45:6:59:1548:1096 147 seq1 1099 99 35M = 1297 233 GTCCTATGTACTTATCATGACTCTATCCCAAATTC ;.;;;;;;;;6;;;;;;;;;;;;;;;73;;77777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:136:389:320 147 seq1 1100 99 35M = 930 -205 TCCTATGTACTTATCATGACTCTATCCCAAATTCC .5:,666<)<8<:<<:66<<<<<<<<<<5<<7<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:122:342:296 83 seq1 1100 99 35M = 1256 191 TCCTATGTACTTATCATGACTCTATCCCAAATTCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<*<<<<9< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:259:467:737 83 seq1 1102 99 36M = 923 -215 CTATGTACTTATCATGACTCTATCCCAAATTCCCAA 8<<<<<<<:<<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:71:832:743 147 seq1 1102 99 35M = 1290 223 CTATGTACTTATCATGACTCTATCCCAAATTCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<*<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:105:521:563 147 seq1 1103 72 35M = 1267 199 TATGTACTTATCATGACTCTATCCCAAATTCCCAA ;<)<9995<9<<59<7<<<<7<7<35,0,544<3( MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:201:195:757 147 seq1 1103 99 35M = 1298 230 TATGTACTTATCATGACTCTATCCCAAATTCCCAA <<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;;8 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:6:585:132 147 seq1 1105 23 36M = 1276 207 TGTACTTATCATGTTTCTTTCCTAATTTTTCAATTA 6666166&6)+61))646+6&)&%&-44))1'144' MF:i:-126 Aq:i:23 NM:i:7 UQ:i:59 H0:i:0 H1:i:0
+EAS1_105:2:179:532:82 83 seq1 1105 99 35M = 1285 215 TGTACTTATCATGACTCTATCCCAAATTCCCAATT <<<<<<<<<<<<<<<<<<<<3<;<;<<<<:<8<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:11:646:628 147 seq1 1106 99 36M = 930 -212 GTACTTATCATGACTCTATCCCAAATTCCCAATTAC <<<3<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:93:334:858 147 seq1 1106 99 35M = 932 -209 GTACTTATCATGACTCTATCCCAAATTCCCAATTA ;<;+;;<<;<<<<<;<<<<;;8<<<<8<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:26:785:882 83 seq1 1107 99 35M = 926 -216 TACTTATCATGACTCTATCCCAAATTCCCAATTAC <<&5&<<<<5.;5<'<<;.76<<<<<7<7<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:4:54:989:654 83 seq1 1108 99 35M = 1296 223 ACTTATCATGACTCTATCCCAAATTCCCAATTACG <<<<<<<<<<<<<<<9<<<<<<9<<<<<1<<<88; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:202:326:680 147 seq1 1108 78 35M = 1268 195 ACTTATCATGACTCTATCCCAAATTCTCAATTACG <<<<<<<4<<<*<<<*<<<7..:7<3*:7.7<+.; MF:i:18 Aq:i:37 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+B7_597:3:53:616:842 147 seq1 1109 99 35M = 1288 214 CTTATCATGACTCTATCCCAAATTCCCACTTACGT <<<<<<<<<<<<<<<<<<<;07<<<<<-&<<-<4; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_71:4:209:159:130 147 seq1 1109 99 35M = 934 -210 CTTATCATGACTCTATCCCAAATTCCCAATTACGT ;:6<:<8::;<<<;<-<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:75:917:886 83 seq1 1110 99 35M = 951 -194 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<8<<<<<<8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:286:753:854 147 seq1 1110 99 35M = 1288 213 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<<<<<<<<<<<<<<<3<<<<<<9999<;<<9; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:290:146:36 83 seq1 1110 99 35M = 1280 205 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<<<<<<<<<<<<<<<<<<<<8<<<<<;;<;;< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:93:1475:542 147 seq1 1110 99 35M = 1254 179 TTATCATGACTCTATCCCAAATTCCCAATTACGTC ;;;;;;;;;;;;;;;;;;;;;;9;;;9;;;77777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:77:251:446 83 seq1 1110 99 35M = 939 -206 TTATCATGACTCTATCCCAAATGCCCAATTACGTC <<24,:8<<<:1<<<:35<:<:,<<<<<<:5:<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS1_105:3:176:431:647 147 seq1 1112 99 35M = 1285 208 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <<<<<<<<<<<<<<<<2<<<<<<<<6<<<<9<<6< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:111:796:737 147 seq1 1112 99 35M = 936 -211 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <3<<<<<<<<<<<7<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:228:189:826 147 seq1 1112 99 35M = 914 -233 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT :74=:.==1========================== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:35:631:594 147 seq1 1112 99 35M = 1271 194 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:29:529:379 83 seq1 1117 99 35M = 926 -226 GACTCTATCCCAAATTCCCAATTACGTCCTATCTT ;<<<:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:74:596:137 83 seq1 1119 91 35M = 1294 210 CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT <<<<<<<<<</4<<<<<<*<:6<<<<<<<<;/3<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:92:1807:1185 147 seq1 1119 99 35M = 940 -214 CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT <<<<<<9<<<<<<<<<<<<<<<<<<<<<<><<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:57:735:151 83 seq1 1121 94 35M = 1314 228 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<<<<8<<8<:<<*<:<<<4<<<;,<<<<:<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:142:858:903 147 seq1 1121 99 35M = 943 -213 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:247:522:670 83 seq1 1121 99 35M = 960 -196 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC ;;;9;:<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:75:732:442 83 seq1 1121 99 40M = 1293 212 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<;<<<<<9<<<;<<;<<<5<<;8<<<<<<<<;:9%% MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:183:645:699 83 seq1 1122 86 35M = 1281 194 TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT <<9<9<<<<<<<<<;<<;<<*175;173<;;;<-/ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:175:437:950 147 seq1 1126 99 35M = 1298 207 CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:59 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:93:1002:845 83 seq1 1129 99 35M = 954 -210 AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA <<::;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:50:542:881 147 seq1 1132 99 35M = 1324 227 TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA <<<<<4<09<<9<<2<<<<<<<<<<<2/.&2<%<7 MF:i:18 Aq:i:63 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_99:3:118:851:285 83 seq1 1133 99 35M = 953 -215 CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC 3+7<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:67:191:668 147 seq1 1134 99 35M = 995 -174 CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA <<<<<7<<7<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:166:203:416 83 seq1 1136 99 35M = 963 -208 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC <<<<<<<<::<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:15:1497:1530 83 seq1 1136 99 35M = 1314 213 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC 0<;;;9;;86<;;;<<&<<.<<;)3;7;654-471 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:206:563:262 83 seq1 1137 99 35M = 971 -201 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:40:352:151 83 seq1 1137 99 35M = 1327 225 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:67:302:762 83 seq1 1138 99 36M = 1313 211 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<;;65;<-<;<:8<<<3 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:84:927:843 147 seq1 1138 99 35M = 938 -235 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT 588;<:<<<<<<<6<<<<;<<<:/<<3<:;<*<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:147:479:41 147 seq1 1139 99 35M = 1322 218 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<::6<<;<<<;;9;;6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:329:177:267 83 seq1 1139 99 35M = 962 -212 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:72:916:763 147 seq1 1142 99 35M = 1340 233 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT </:8<8)<<<<:<<<<<;.89<:67<.;<<7+336 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:124:128:489 83 seq1 1142 99 35M = 1348 241 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT <<<<<<<<<<<<<<<<<6:6<<-4<::;;<<:48< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:39:59:738 83 seq1 1142 99 35M = 965 -212 GTCCTATGTTCTTCTTAGGGAAGAACAGCTTAGGT ;.;4;<;3<<9<<9<&<<9<<<<<;<9<;<<;9<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS1_99:6:63:48:631 83 seq1 1143 99 35M = 957 -221 TCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTA ;*:;;<2<<2779;:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:274:176:479 147 seq1 1144 99 35M = 976 -203 CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT 7)<<7<626<<7<<<<<<<<<<<<<<<<<<<3<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:72:1809:1398 147 seq1 1145 99 35M = 958 -222 CTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATC ;:;;:<7:7<:<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:235:805:373 83 seq1 1146 99 35M = 983 -198 TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA <<;<<<<<<9<9<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:269:944:220 83 seq1 1147 99 35M = 953 -229 ATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAA <;<;8<<;7<<<<<;<<-<<<<<<;<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:174:597:66 147 seq1 1148 99 35M = 1307 194 TCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAAT <<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;6;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:229:717:121 147 seq1 1150 99 35M = 995 -190 TTCTTCTGAGGGAAGAACAGCTTAGGTATCAATTT 6;-;7<<(<<<<<8<18<7<<<<<<<<<;<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS56_53:1:23:403:981 147 seq1 1151 99 35M = 985 -201 TCTTCATAGGGAAGAACAGCTTAGGTATCAATTTG (;3+<&3<</7<<<<<<;<<<<<<<<<<<<</<2< MF:i:18 Aq:i:65 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS112_32:7:168:117:441 147 seq1 1151 99 35M = 990 -196 TCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTG ;;;;3;<<<<<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:52:1455:1212 83 seq1 1153 99 40M = 1304 191 TTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCT <9<<<99<;<<9<;<-<<<6<<75;;<*%<5<3+.8:*5; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:37:400:627 83 seq1 1154 99 35M = 961 -228 TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTG 474*;<<9<;<<<;<<:<<<<<<;<<<<<<;<<;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:11:868:62 147 seq1 1154 99 36M = 983 -207 TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGT ;;77;;7<<<<<<<<7<<<;<7<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:209:92:210 83 seq1 1156 99 35M = 965 -226 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT ;9;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:128:394:455 147 seq1 1156 99 35M = 1313 192 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT ======6==========;===9==;5===;==;== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:316:949:122 83 seq1 1156 99 35M = 1321 200 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0<:<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:60:1020:1259 147 seq1 1157 99 35M = 996 -196 TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:193:38:987 83 seq1 1158 99 35M = 964 -229 AGGGAAGAACAGCTTAGGTATCAATTTTGTGTTCT <<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_93:5:292:122:666 147 seq1 1159 99 35M = 985 -209 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG <;<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:280:512:316 83 seq1 1159 99 35M = 984 -210 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG ;9===;======;7==;;======;=====;==== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:207:926:427 83 seq1 1159 99 35M = 973 -221 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG ;;7<<;4<<<2<<;<<<<<<<<<<7<;<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:239:796:221 83 seq1 1160 99 35M = 992 -203 GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT ;;<<;<<;<<<+:<<<4<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:142:457:584 147 seq1 1160 99 35M = 999 -196 GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT 8::<:<<9<<.<:<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:190:481:295 83 seq1 1161 99 35M = 990 -206 GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG ;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:86:308:648 147 seq1 1161 99 35M = 970 -226 GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG <7<<<;<<<<+;<<<2<5<<<77;<<2<;;<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:182:23:585 83 seq1 1163 99 35M = 1336 208 AGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:216:650:516 83 seq1 1164 99 36M = 1326 198 GAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:15:805:420 83 seq1 1164 35 35M = 998 -201 GAACAGTTTAGGTATCAATTTGGTGTTCTTTGTAA <64<59&996<(64<)7).68<0<0<<7741<1:< MF:i:18 Aq:i:35 NM:i:2 UQ:i:24 H0:i:0 H1:i:1
+EAS56_65:6:82:822:767 147 seq1 1165 99 35M = 972 -228 AACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA <<9<<<<<<<<<<;;<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:33:1566:588 147 seq1 1166 76 35M = 985 -216 ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG -6246;;97;77;;97;;;;;;9;7;79;)&;37; MF:i:18 Aq:i:37 NM:i:1 UQ:i:22 H0:i:0 H1:i:1
+EAS1_93:1:20:635:509 147 seq1 1167 99 35M = 1333 201 CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT <<<<<<<<<;<<<<;<<<;<;;;<<<;<<<<<<(8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:144:28:475 147 seq1 1167 99 35M = 974 -228 CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT ;;;9;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:36:1402:1709 147 seq1 1168 99 35M = 1326 193 AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC <<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<:9<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:34:956:1309 147 seq1 1168 99 35M = 994 -209 AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC 9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:157:784:936 147 seq1 1169 99 35M = 1356 222 GCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCT <<<<<<<<<<<<<<<<<:<<<<<<;<<<<814<4< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:2:152:860:286 83 seq1 1171 99 35M = 1004 -202 TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA 2;5;8<<;5<<<;<2<8<<<<<<;8<;<<<<;<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:157:786:424 147 seq1 1171 99 36M = 981 -226 TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG ;<;2;;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:33:1407:94 147 seq1 1172 99 35M = 1360 223 TAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG ;;;;;;;6:;;:::7;:;;;;:::;;;;:;47771 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:302:288:657 147 seq1 1173 99 35M = 1013 -195 AGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGG <:5<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:233:97:262 147 seq1 1175 99 35M = 1021 -189 GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA --;;7<;<;;:;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:67:692:110 147 seq1 1175 99 35M = 1009 -201 GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA ;;<<8<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:68:692:347 147 seq1 1176 99 36M = 1351 211 TATCAATTTGGTGTTCTGTGTAAAGTCTCATGGAGC <<<<<<<<<+6<;<<<<3<:<<<<6<8<<<&*/;*0 MF:i:18 Aq:i:64 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS51_64:3:309:303:278 83 seq1 1178 99 35M = 996 -217 TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC <:<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:21:132:1423 147 seq1 1178 99 35M = 1012 -201 TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC :<<<<<6<<;<<;<5<;<<<<<<;<6<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:63:854:610 83 seq1 1180 99 35M = 1005 -210 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT :.5;2<:88<<72:<<;<<7<8;<;/<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:182:313:319 147 seq1 1180 99 35M = 1016 -199 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT </<;185;8<;;87<;8<<<<8<;83<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:62:603:1552 83 seq1 1180 99 35M = 1019 -196 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT 8::;:<<6<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:145:144:796 83 seq1 1181 99 35M = 1372 226 ATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTC <<<<<<<<<<<<<<;<<<<<<;<<<<<<4;4;<;/ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:41:474:283 147 seq1 1182 99 35M = 1018 -199 TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC 6/;;;88;;<:;48<<<<<;<;<<<<<<<<<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:329:458:365 83 seq1 1186 99 35M = 1364 213 GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT ==========================9======== MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:159:222:274 147 seq1 1189 99 35M = 1019 -205 GTCTGGGGAAAGTCTCAGGGAGCCGTCCGTGTCCT ''7*<&<'<<<<.<2<<<<<<<<<<+<<<8<8<<; MF:i:18 Aq:i:37 NM:i:3 UQ:i:17 H0:i:0 H1:i:1
+EAS114_32:6:88:162:587 83 seq1 1189 99 35M = 1372 218 TTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCT <;<<<<<<<<<;<5<;<;<<7<++<<2&*:322+7 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:148:340:479 83 seq1 1190 99 35M = 1364 209 TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC <<<<<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:12:276:1797 147 seq1 1190 99 35M = 1006 -219 TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC )9<02)<<<<<<<<<<<<<1<<<<&<<<<9<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:190:42:671 83 seq1 1192 99 36M = 1008 -220 TGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA <<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:321:271:138 83 seq1 1193 99 35M = 1394 236 GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA <<<<<<<<<<<<<<<<<<<<<;9<<;<<;;<88;& MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:154:669:853 147 seq1 1193 99 35M = 1371 213 GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA ============<===.====<:=<9=<<<9;:;2 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:287:258:321 147 seq1 1194 99 35M = 1030 -199 TGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCAT :.<9<)<;<9<.<<:<:+5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:61:183:767 147 seq1 1195 99 35M = 1010 -220 GTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATC 6&.;;<3<363<<<<<<<<8<<<6<<<<3<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:29:794:282 83 seq1 1196 99 36M = 1025 -207 TAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG 7<<<<45::-<<<<<;<<-;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:313:827:992 83 seq1 1197 99 35M = 1379 217 AAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG <<<<6<<<<:<<<<<66<<<:33:<<<80<;6<8+ MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:196:11:27 83 seq1 1198 65 36M = 1035 -199 AAGACCCAGTTAGCCGTCCGTGTCCTCCCATCTGGC 96&6<'<7:!!<,:;+7<<6:<<<<<<<<<7<7;:< MF:i:18 Aq:i:24 NM:i:4 UQ:i:27 H0:i:0 H1:i:0
+EAS139_19:3:87:133:930 83 seq1 1198 99 40M = 1044 -194 CAGTCTCAGGGCGCCGTCCGTTTCCTCCCATCTGGCCTCG )8&)907)-;9&,<<9)<;<<0<;<<99<<<<<<;<<9<< MF:i:18 Aq:i:39 NM:i:3 UQ:i:28 H0:i:0 H1:i:1
+EAS114_45:7:97:1584:777 147 seq1 1200 99 35M = 1013 -222 GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC 66746,9::9;;;;:;;;;;;;;;;;;;;;:;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:127:153:861 83 seq1 1202 99 35M = 1374 207 CTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTC <<<<<<<<<<<<<<<<<<<<<<<=<*<<<24;;:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:157:42:763 83 seq1 1203 99 35M = 1040 -198 TCTGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCG 4++;((2(5;24<./<:<<<<<<<<;<<88<<<<9 MF:i:18 Aq:i:61 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:4:91:267:655 83 seq1 1204 99 35M = 1365 196 CAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGT <<<<<<<<<<<<<<<<<<<<<;:;;7<9477<74; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:39:966:551 147 seq1 1205 99 35M = 1026 -214 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC 8;;;;;<<6'<<<+8<<<1<<<<4<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:61:38:1182 147 seq1 1205 99 35M = 1388 218 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:47:352:1492 83 seq1 1205 99 40M = 1385 220 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGCCCACTA :<<<::<24<04-&<;<<2<<<&<60)&<5<<6*8:)9+* MF:i:18 Aq:i:53 NM:i:3 UQ:i:28 H0:i:1 H1:i:0
+EAS221_3:8:74:770:1712 83 seq1 1208 99 35M = 1052 -191 GAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCAC 3.&::6<<<9<6:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:279:763:945 147 seq1 1210 99 36M = 1048 -198 GCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT +9:-+<:1-44<<':<;<+<-<<<;:<<;;<<<<<0 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:306:388:342 147 seq1 1211 99 35M = 1398 222 CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT ================5====:=====;==1=4== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:180:905:36 147 seq1 1212 99 35M = 1033 -214 CCTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG 6%%<;<662<<*;<<<8<<:<<<<<<<<<<<<<<; MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:2:19:752:816 83 seq1 1212 99 35M = 1394 217 CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG <<<<<<<<<<<<<<<<<<<8<7;<;<<767277;6 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:305:565:952 147 seq1 1213 99 36M = 1030 -219 GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT 5(<1<147<81<*8--8<<<7<91<<<;+<+<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:44:1466:425 83 seq1 1213 99 35M = 1044 -204 GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGG 6-<<9<<:<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:68:64:783 147 seq1 1214 99 35M = 1402 223 TCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT <<<<<<<<<<<<<<<<<;;<<<<<<;<<<9:<<:9 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:64:37:257 147 seq1 1215 99 35M = 1389 209 CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT ================<=====;===8;4====== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:20:413:1334 83 seq1 1215 99 35M = 1370 190 CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT 7<<;<<<.;<;67;7;;;:;;3;<59+...77677 MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:179:549:753 147 seq1 1218 99 35M = 1056 -197 TGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTC :77<</<<<::<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:16:823:343 83 seq1 1223 99 35M = 1403 215 TCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAA ================================4== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:266:556:252 83 seq1 1224 99 35M = 1392 203 CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA <<<<<<<<<<<<<<<<<;<<<<<<4;;<;;;<7;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:278:524:521 83 seq1 1224 99 35M = 1025 -234 CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA 7777,<;<<7<<<<;;<<;;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:72:1426:1883 83 seq1 1226 99 35M = 1405 214 CATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:82:998:566 83 seq1 1227 99 35M = 1050 -212 ATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCT <9<9<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:29:575:453 83 seq1 1228 99 36M = 1056 -208 TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTG ;<<<;;<:<<<;<;<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:222:538:267 147 seq1 1228 99 35M = 1074 -189 TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTT 52/8-<<7<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:138:186:274 147 seq1 1231 99 35M = 1075 -191 GGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGG <;<<<<<6;<<<<<3<<36;3;<9<<<<<<3;<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:137:895:681 83 seq1 1232 99 35M = 1418 221 GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<-8<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:71:636:533 83 seq1 1232 99 35M = 1398 201 GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC <<<<<<<<<<<<<<<<<<<<<<<7<<<5<<<-847 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:45:294:380 83 seq1 1233 80 36M = 1074 -195 CCTCGTCCACACTGGTTCGCTTGAAAGCTTGGGCTG ;<+<7<<<<;7<,<7<<<+/7;<<;<<;7<<<;<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_66:8:9:80:353 83 seq1 1233 99 35M = 1067 -201 CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT ;;5;:8<:<:;:;<<<<;<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:73:302:1574 83 seq1 1233 99 35M = 1429 231 CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT <<<<<<<<<<;<<<<<<<<<<<<+:;<<;:8;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:131:779:345 147 seq1 1237 99 35M = 1399 197 GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA ============================9====;= MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:159:71:155 83 seq1 1237 99 35M = 1428 226 GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA =========;=<======;=:=3;==;=6<==;=; MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:55:340:837 83 seq1 1238 99 35M = 1069 -204 TCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAAT 61378<::<<<5:<;;:<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:91:521:517 147 seq1 1239 99 35M = 1061 -213 CCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATG 8;8<4=:===7===9=============<====== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:47:303:887 83 seq1 1240 96 35M = 1052 -223 CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA <;<6<;<;<8<<<8<<<<;<<<.<<<<<<<8<8;< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:74:570:695 147 seq1 1240 99 35M = 1436 231 CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA =========================7====;8<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:268:523:511 147 seq1 1241 99 35M = 1081 -195 ACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGAT 8<7<99<<<<<<<<<:<<<<<<4<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:319:174:811 147 seq1 1242 99 35M = 1044 -233 CACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATG ;7;3<<3.<<<<<<<<<<<4<<<<<<<<<<<<<0< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:28:315:310 83 seq1 1242 99 35M = 1085 -192 AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG +%,768<<:<:<2<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:4 UQ:i:70 H0:i:1 H1:i:0
+EAS1_108:1:328:614:638 83 seq1 1243 99 35M = 1428 220 ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGC <<<<<<<<<<<<<<<<<<<<4/;<<9<<<<7<<*: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:63:930:152 147 seq1 1243 99 35M = 1410 202 ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATTC <<<<;<<<<<<<7<<;::<<)726;)<99<)&;&+ MF:i:18 Aq:i:59 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_59:1:219:294:861 83 seq1 1244 99 35M = 1073 -206 CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC ;,;<;<<<;&<<<<<<<5<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:42:920:522 83 seq1 1244 99 35M = 1067 -212 CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC ;;;;;99<;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:87:89:696 83 seq1 1245 99 36M = 1419 210 TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<:;<<<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:166:979:531 147 seq1 1245 99 35M = 1410 200 TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCC <<</<<<<<<<<<9<<9<<;<7<<<<9<<<9<,)6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:40:918:950 83 seq1 1247 99 35M = 1071 -211 GTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCT =0=&&33======;=====.=============== MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:131:946:353 83 seq1 1249 99 35M = 1087 -197 TCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTG <<:<<66<<<6<<4<<<:8<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:224:932:942 147 seq1 1250 99 35M = 1082 -203 CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG <;<<;;<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:318:177:383 83 seq1 1251 99 35M = 1056 -230 TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC 5:9;7;777<<7<<<<<<<<<<<<<<<<<<<<<<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:188:460:1000 147 seq1 1251 99 35M = 1080 -206 TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC +;+077<7;<57<;;8<<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:12:1296:358 147 seq1 1252 96 35M = 1082 -205 CTTGAAAGCTTGGTCTGTAATGATGCCCCTTGGCC -770074;;6;&42;:2;;;:;;;;:;;/:;;;;: MF:i:18 Aq:i:37 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS188_4:5:166:776:590 83 seq1 1252 99 35M = 1075 -212 CTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCC <;:;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:54:263:585 147 seq1 1254 99 36M = 1081 -209 TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATC 1:::6<<<<;;;<4<<<<<<<<6<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:93:1475:542 83 seq1 1254 99 35M = 1110 -179 TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT 98987:9:<:;:;;;;;<<;<;<;;;;<<<;;;<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:122:342:296 147 seq1 1256 99 35M = 1100 -191 AAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCA <:;:<<<;<2<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:234:787:12 83 seq1 1257 97 35M = 1092 -200 AAGCTTGGGCTGTAATGATGCCCCTTGGCCATCAC ;;.<;;994<;9<<;;;<<<<<<<7<<<<<<<<<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:317:378:535 83 seq1 1258 99 35M = 1096 -197 AGCTTGGGCTGTAATGATGCCCCTTGGCCATCACC ;7;':<77<<;<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:160:434:853 83 seq1 1259 99 35M = 1072 -222 GCTTGGGCTGTAATGATGCCCCTTGGCCATCACCC ;;*4;<;<<<;<<<<<<<8<<<;<<<<<<<<8<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:18:1498:1475 147 seq1 1260 99 35M = 1427 202 CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG <<<<<7<<<<<<+<<-3<<3<:<2<1<<:<<<<<+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+B7_593:2:104:744:280 83 seq1 1262 64 36M = 1421 195 TGGGCTGTAATGATGCCCCTTGTCCATCACCCGGTC <<<<<<<<<<<<<<;<;<<<<:4<<4<<0<;80+;: MF:i:18 Aq:i:21 NM:i:2 UQ:i:34 H0:i:0 H1:i:1
+EAS1_95:4:66:179:118 83 seq1 1262 99 35M = 1084 -213 TGGGCTGTAATGATGCCCCTTGGCCATCACCCAGT <<99<<<<<<<<<<<<<<<<<<<9<<<:<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:277:194:143 83 seq1 1262 99 35M = 1444 217 TGGGCTGTAATGATGCCCCTTGGCCATCACCCGGT <<<<<<<<<<<;<<<<<<<<<<9;<<<8</<<6<: MF:i:18 Aq:i:72 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS1_97:2:59:882:980 83 seq1 1263 99 35M = 1071 -227 GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC 7339%<6<<<<<;<<9<<8<<<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS220_1:4:14:1665:1772 83 seq1 1263 84 35M = 1073 -225 GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC <&7<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_57:2:259:42:969 147 seq1 1265 99 35M = 1426 196 GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC <<<<<;<<;<<3<<<;9<36<<29;<<;;;</;<2 MF:i:18 Aq:i:69 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:4:4:1732:88 147 seq1 1265 99 35M = 1087 -213 GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC :<4<:<<:<::<<<<<::<<<<<:<:<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:2:110:584:649 147 seq1 1266 99 35M = 1084 -217 CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ++:4686<<68<;<;<;<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_59:5:113:694:725 83 seq1 1266 99 35M = 1088 -213 CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ;::<<:<:<<<<<<<<<<:<:<<<<<<;<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:8:58:369:244 147 seq1 1266 99 35M = 1436 205 CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:105:521:563 83 seq1 1267 10 35M = 1103 -199 TGTAATGCTGCCCCTTGGCCATCCCCCGGTCCCTG /8)-8/6(98<967<3<<979<<1<<<7<<<<7<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:45 H0:i:0 H1:i:0
+EAS188_4:5:202:326:680 83 seq1 1268 78 35M = 1108 -195 GTAATGATGCCCCTTGGCCATCACCCGGTCCCTGC +33<81<:*<;<;;30;<<<;<<<8<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS192_3:6:216:292:528 83 seq1 1269 99 35M = 1438 204 TAATGATGCCCCTTGGCCATCACCCAGTCCCTGCC <;<;<<<<<<<;<<<<<<<<;;;;:;;:<%<;1;: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1864:477 147 seq1 1270 99 35M = 1465 230 AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:35:631:594 83 seq1 1271 99 35M = 1112 -194 ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC <<<<4<<<<<.<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS112_34:8:103:812:255 83 seq1 1272 99 35M = 1461 224 TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCC <<<<<<<<<<<<<<<9<<;<<<39;;<;32:7;7+ MF:i:18 Aq:i:69 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS188_7:4:259:869:641 83 seq1 1272 99 35M = 1435 198 TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCA <<<<<<<<<<<<<<<<<<<<<,;<:<<<<<<<<<1 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:316:25:230 83 seq1 1273 99 35M = 1098 -210 GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT 8;8;<<;<;;<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:6:38:1071:155 83 seq1 1274 99 35M = 1465 226 ATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATC <<<<<<<<<<<<<:<<<<<<<<8<<<:<<:;;8:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:6:585:132 83 seq1 1276 23 36M = 1105 -207 GCCCCTTGACCACCACCCAGTCCCTGCCCCATCTCT :<473$'<+5;7*+<7<&<37<7<<<<7;;7<<:<7 MF:i:18 Aq:i:23 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+B7_595:6:47:720:789 83 seq1 1278 90 35M = 1455 212 CCCTTGGCCATCACCCGGTCCCGGCCCCTTCTCTT <<72<<<<<<<<;;<7;,0<2;*7<2;<*;;<<64 MF:i:18 Aq:i:25 NM:i:3 UQ:i:44 H0:i:0 H1:i:0
+EAS192_3:6:185:868:496 147 seq1 1278 99 35M = 1442 199 CCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTT <<<<<<<<<<<<;<<<;<<<<<<<<<<<9<<;<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:290:146:36 147 seq1 1280 99 35M = 1110 -205 CTTTCCCATCCCCCGGTCCCTGCCCCATCTCTTGT 7;%%%<8-4<(<<<7<<<:<:<<<<<<<<<<<<<< MF:i:18 Aq:i:25 NM:i:4 UQ:i:37 H0:i:0 H1:i:0
+B7_593:5:267:71:603 83 seq1 1281 99 36M = 1446 201 TTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<9; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:183:645:699 147 seq1 1281 86 35M = 1122 -194 GTGGCCCTCCCCCATTCCCTGCCCCATCTCTTGTA &)))2-&420<<<'--<6:6-<7<<<+:7<65<<< MF:i:18 Aq:i:21 NM:i:4 UQ:i:37 H0:i:0 H1:i:0
+EAS1_105:2:179:532:82 147 seq1 1285 99 35M = 1105 -215 CCATCACCCGGTCCCTGCCCCATCTCTTGTAATCT <:96<6<<<<89<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:3:176:431:647 83 seq1 1285 99 35M = 1112 -208 CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT <(9(<<<7;<<7<<<<<<<7<<<<<<7<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:258:266:101 83 seq1 1285 99 35M = 1094 -226 CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT %==/7&8=======:===6================ MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:179:735:569 147 seq1 1286 99 35M = 1461 210 CATCACCCGGTCCCTGCCCCATCTCTTGTAATCTC <<<<<<<<<<<<<<<<<<<<3<<<<<<<<4/<;<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:3:200:712:439 147 seq1 1286 99 35M = 1435 184 CGTCACCCGGTCCCTGCCCCATCTCTTGTAATCTC <7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:49 H0:i:0 H1:i:0
+EAS1_103:5:319:165:698 83 seq1 1287 99 35M = 1485 233 ATCACCCAGTCCCTGCCCCATATCTTGTAATCTCT <<<<<<<<<<<<<<<<<<<3<9<<<<<<<;<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:24 H0:i:0 H1:i:1
+B7_597:3:53:616:842 83 seq1 1288 99 35M = 1109 -214 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:286:753:854 83 seq1 1288 99 35M = 1110 -213 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ;<2<<<,57:<<9<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:1256:204 83 seq1 1288 99 35M = 1467 214 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC <<<<<;;;;;;<;;;;;;;<;<;;;;<:-;79697 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:289:132:526 83 seq1 1289 99 36M = 1472 219 CACCCGGTCCCTGCCCCATCTCTTGTAATCTCTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_1:4:71:832:743 83 seq1 1290 99 35M = 1102 -223 ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:102:511:946 83 seq1 1291 26 35M = 1461 205 CCCAGTCCCTGCCCCATCTCGGGTAATCTCTCTCC <<9<<;<<<<;<<<<;<<7;%<5<<0<<<)<.<.+ MF:i:18 Aq:i:26 NM:i:2 UQ:i:31 H0:i:0 H1:i:0
+EAS114_39:5:42:1223:1087 83 seq1 1293 99 35M = 1479 221 CAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTT <<<<<<<<<<<<<5<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:75:732:442 147 seq1 1293 99 40M = 1121 -212 CGGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC 7,*&28<61:88<.7<:<<:6<1<85:<:1<5<&::<<&< MF:i:18 Aq:i:60 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS54_73:3:23:502:103 147 seq1 1294 99 35M = 1486 227 AGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTT <2<<<<<<<<<<.<<<<<<<:1&:<<<7<<<<<<: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:74:596:137 147 seq1 1294 91 35M = 1119 -210 GGTCCCTGCCCCATCGCTTGTAATCTCTCGCCTTT +40778449779049'+*87489498949%89948 MF:i:18 Aq:i:22 NM:i:3 UQ:i:32 H0:i:0 H1:i:0
+EAS51_66:8:36:688:722 83 seq1 1295 99 35M = 1469 209 GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:60:182:718 147 seq1 1295 99 35M = 1485 225 GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT <<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:4:54:989:654 147 seq1 1296 99 35M = 1108 -223 TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT ,<1<2<<<;9)9<<;<<;<<<4<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:9:203:653 147 seq1 1296 99 35M = 1488 227 TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT <<<<<<<<<<<<<<<<<<<<<<::<9<<<<<;;;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:322:631:245 147 seq1 1297 99 36M = 1474 213 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC <<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<5; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:59:1548:1096 83 seq1 1297 99 35M = 1099 -233 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG 88888;;88;;;;8;;9;;;<<<<<<<<<<<<<<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:52:1779:1664 83 seq1 1297 99 35M = 1462 200 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG <<<<<<<<<<<<<<<<<<71<<<<<<<<<<<<<<% MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:218:173:667 83 seq1 1298 99 35M = 1448 185 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC <<<<<<<<<<<<<<<6<<<<<<<<<<<<<<<<<.< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:175:437:950 83 seq1 1298 99 35M = 1126 -207 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC ;;5:;;9<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:201:195:757 83 seq1 1298 99 35M = 1103 -230 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC :<':<:<<46<:<;:<;<;<<9<<<<<<<<;<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:8:377:655 83 seq1 1299 99 35M = 1473 209 CTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:50:950:562 83 seq1 1301 99 35M = 1473 207 GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGC <<<<<<<<<<<<<<<&<<8<<<<<<<5<:<+<:+; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:153:543:671 83 seq1 1301 99 34M = 1465 199 GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:33:1193:664 147 seq1 1301 99 40M = 1474 213 GCCCCATCTCTTGTAATCTCTCTCCTTTTTTCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%:<'<9:::9 MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:253:59:242 83 seq1 1302 99 35M = 1478 211 CCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<</<<9;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:52:1455:1212 147 seq1 1304 99 40M = 1153 -191 CCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGT 6::4::;4%;9:<79)<:<;<<:4::7<<9<&+71<9;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:316:176:543 83 seq1 1305 99 35M = 1469 199 CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC ====<=9===<<<=====9====<<=3==,96==9 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:50:1339:1154 147 seq1 1305 99 35M = 1481 211 CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC ==========<<==============;==7<;<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:169:292:652 83 seq1 1306 99 35M = 1510 239 ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<6<<-<<<<8< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:11:706:1030 83 seq1 1306 92 35M = 1469 198 ATCTCTTGTAATCTCTCTCATCTTTGCTGCATCCC <<<2<<2<<<<<<<<<<<<0<&<<<+<:2<4<<): MF:i:18 Aq:i:26 NM:i:2 UQ:i:20 H0:i:0 H1:i:0
+EAS221_3:6:70:843:706 83 seq1 1306 99 35M = 1449 178 ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<5<<5<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:174:597:66 83 seq1 1307 99 35M = 1148 -194 TCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCT 9<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:7:1547:1933 147 seq1 1308 99 35M = 1497 224 CTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTG <<<<<<<<<<<<<<<<<<<<<<<:<<8<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:117:411 147 seq1 1309 99 36M = 1482 209 TCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTC <<<<<<<<<<<<<<<<<<<<<<7<<:<<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:53:156:845 83 seq1 1311 99 35M = 1487 211 TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT <<<<<<8<<<.<<<<.6<<--<-<<<<<<<6<<<< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:90:1403:1635 83 seq1 1311 99 35M = 1480 204 TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT <<;<;<<<<;<;<;;<<<<<9;<.;;<:;99.979 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:67:302:762 147 seq1 1313 99 36M = 1138 -211 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC :8;88<;<<<;<<8<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:270:448:491 83 seq1 1313 99 35M = 1501 223 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC <<<<<<<<<<<<<<<<<<&<<.<<<<<<<:;;;<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:82:932:400 83 seq1 1313 97 34M = 1486 208 GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT <<<<<<8<1<<<<8+<<&<<<8<<<<<<<+(,/8 MF:i:18 Aq:i:25 NM:i:2 UQ:i:15 H0:i:0 H1:i:0
+EAS54_81:2:128:394:455 83 seq1 1313 99 35M = 1156 -192 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC ;=;9.=5=;=9====;;================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:57:735:151 147 seq1 1314 94 35M = 1121 -228 TAAACTCTCACCTTATTGCTGCATCCCTGTCTTCC 07;+79:;<)<<9<+8<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:3 UQ:i:28 H0:i:0 H1:i:0
+EAS114_28:6:51:506:878 147 seq1 1314 99 36M = 1501 223 TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCT <<<<<<<<<<<<<<<<<4<<<<<<<<<<0<<<<<:; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:15:1497:1530 147 seq1 1314 99 35M = 1136 -213 TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC 77778:;;;:;;;;:9;:;;;;;;;;;9;:;;;;; MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:9:1595:1826 83 seq1 1316 99 35M = 1494 213 ATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:73:273:488 147 seq1 1318 99 35M = 1512 229 CTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTG <<<<<2<88<88<<<8<<1<<<<<<68<<<;<;<* MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:199:760:42 147 seq1 1318 24 35M = 1489 206 CTCTCTAATTTTTGCTGCTTCCATGTCTTACTCTG +2&2&2&22222220222&220-222-22-22-22 MF:i:-126 Aq:i:24 NM:i:5 UQ:i:51 H0:i:0 H1:i:0
+EAS1_95:7:61:702:720 147 seq1 1320 99 35M = 1500 215 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC ==============;=======&=========3:= MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:41:576:1016 147 seq1 1320 99 35M = 1503 218 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<<<<<;<<<;<<<<<<<<<<<4<::< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:115:683:296 83 seq1 1320 99 35M = 1514 229 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<<8<<<<<<<<<<6<<<<3<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:63:1265:820 83 seq1 1320 99 35M = 1480 195 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<27<<<<<<<<<<<<<<<<<<<<03< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:92:288:1354 147 seq1 1321 99 40M = 1480 199 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT <<<<<<:<<<<<<<<<<<8<<:<<<<;;<8<<<8<:8+:: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:316:949:122 147 seq1 1321 99 35M = 1156 -200 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT 59899<<<<;;<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:37:1626:862 147 seq1 1321 99 35M = 1489 203 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:147:479:41 83 seq1 1322 99 35M = 1139 -218 CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTT ;:;:;<::<:<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:936:1509 147 seq1 1322 99 40M = 1502 220 CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTTATTT <<<<<<<<<7<<7<<<<<<<;<<<<<<<<<:<:<;%8::: MF:i:18 Aq:i:75 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_62:6:50:542:881 83 seq1 1324 99 35M = 1132 -227 CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA +2<<<;<3;29<6<5;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:71:85:629 147 seq1 1324 99 35M = 1484 195 CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA <<<<<<<<<<9<<<<<<<<<<<<<<<<<5<9<<+6 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:191:948:257 147 seq1 1325 99 35M = 1493 203 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT :<<<<<<<<9<:<<<<<<:<<<<;<<<<8<<<<7< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:249:986:224 83 seq1 1325 99 35M = 1499 209 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT =========5======7878===98==7=9==.-= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:6:1067:91 147 seq1 1325 99 35M = 1483 193 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<:8<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:216:650:516 147 seq1 1326 99 36M = 1164 -198 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ;9;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:18:376:416 147 seq1 1326 99 35M = 1510 219 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGTTT <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;:(<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS114_28:5:209:778:588 147 seq1 1326 99 36M = 1514 224 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT <<<<<<<<;<<<<<<<<<;<<<;<8<8<<<<;7;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:36:1402:1709 83 seq1 1326 99 35M = 1168 -193 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT ;;;:<<<;<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:40:352:151 147 seq1 1327 99 35M = 1137 -225 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ;=;;5=:-=9=====;;================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:139:331:63 83 seq1 1327 99 35M = 1486 194 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ====================<<============= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:11:1274:1230 147 seq1 1327 99 35M = 1507 215 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:36:678:316 83 seq1 1328 99 35M = 1500 207 TTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTA <<<<<<<<<<<<<<;<<<<<<<<<;<<<<,2<<<) MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:102:825:507 147 seq1 1330 99 35M = 1501 206 TGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:171:343:758 83 seq1 1331 99 36M = 1494 199 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<<<<<<<<<<<;<<<<59<<<9;<<3 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:85:1224:625 83 seq1 1331 99 35M = 1532 236 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTCCTT <<<<<<<<<;<<;<<7<<:<<7.<<<:&7<<.<;< MF:i:18 Aq:i:70 NM:i:1 UQ:i:13 H0:i:1 H1:i:0
+EAS188_7:5:308:354:124 83 seq1 1331 99 35M = 1507 211 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTT <<<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:7:22:22:934 147 seq1 1332 99 35M = 1500 203 CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<6<<<;<<<;84;<<48;<;6;<;) MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:71:707:568 147 seq1 1332 99 35M = 1518 221 CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:123:610:472 83 seq1 1333 99 35M = 1504 206 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT <<<<<<<<<<:<<<<<<<<<<<<<+:<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:20:635:509 83 seq1 1333 99 35M = 1167 -201 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT 50<59<<9<9<<<<<<<<<<<<<<<<<<<6<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:92:213:217 83 seq1 1333 99 35M = 1515 217 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:47:471:858 147 seq1 1335 99 35M = 1487 187 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<;<<<<<<<<9<<<4;;<<<<;<<<<<.<<4;<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:90:406:631 147 seq1 1335 99 35M = 1525 225 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<<<<<<<<<<<<<<<<:<<<<:;<<<<;<<8;<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:81:1723:1820 83 seq1 1335 99 35M = 1524 224 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:182:23:585 147 seq1 1336 99 35M = 1163 -208 ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT 9:<<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:150:508:757 147 seq1 1336 99 35M = 1483 182 ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<,< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:261:504:780 147 seq1 1337 99 35M = 1501 199 TCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTT <<<<<<<<<<<<<<<<<<<</2<<<9<<<5<<,<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:324:515:230 147 seq1 1339 99 35M = 1512 207 CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG <<;<<<<<<<<<<<<<<<:<<<<8<<<4<<4<<34 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:72:916:763 83 seq1 1340 99 35M = 1142 -233 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT <;;:<<<<<<<;<<;;;<<<<<<<<<;;<;<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:194:168:684 83 seq1 1340 99 36M = 1512 208 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<7<<.<<6-<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:113:43:634 147 seq1 1340 99 35M = 1500 195 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTTTT <<<<<<<<<<<<.<<<<<<<<<<<<</<<2;;%%; MF:i:18 Aq:i:45 NM:i:2 UQ:i:8 H0:i:1 H1:i:0
+EAS54_71:5:16:434:204 147 seq1 1340 99 35M = 1522 216 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT =================;)===8===:==7;<+%; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:246:205:734 73 seq1 1340 65 35M = 1340 0 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT <<<4<<6666<<6<:<<<3<<<:'<<:<<<<;6<+ MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:246:205:734 133 seq1 1340 0 * = 1340 0 CTCCAGGGAAGTTATCTCTCATCTAGANNNNNTTG <<<<<<:/<<<,6'</7;<-+9<<;<7!!!!!8<, MF:i:-64
+EAS54_65:3:102:884:63 147 seq1 1341 99 35M = 1481 175 TGTCTTCCTCTGTCTTGATTTCCTTGTTGTTGGTT <<<<<<<<<<<<<<<<<3<<<%<<<9<<9<<7+;< MF:i:18 Aq:i:43 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS51_64:3:67:782:132 83 seq1 1343 99 35M = 1498 190 TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;4<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:70:348:972 147 seq1 1343 99 35M = 1528 220 TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT <.<<3+.7<<7<<:78:<<7<:<7:<3<<7.:::< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:9:206:901 83 seq1 1344 99 35M = 1517 208 CTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTC <<<<<<<<<<<<<<<<<<<<<<5<<5<<%%:<<<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:21:443:404 83 seq1 1345 99 35M = 1529 219 TTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCT <<<<<<<<<<<<<<<<<<<<<7<<;<<;+<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:148:286:316 147 seq1 1347 99 35M = 1531 219 CCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGT <<<<<<<<+<<7<<<<<<<6<<<6<142<<<6<2< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:77:48:860 83 seq1 1348 99 35M = 1521 208 CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT =========;===========9==*;5=;=;=,7= MF:i:18 Aq:i:45 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS51_64:6:124:128:489 147 seq1 1348 99 35M = 1142 -241 CTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTT ::55<<<8<<<6<<;<<<<<<<<7<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:213:54:878 137 seq1 1348 99 35M * 0 0 CTCTGTCTTGATTTACTTGTTGTTGGTTTTTTGTT <<<<<<<<<;<<<<<<<<:<<:<<++<<<<%<%<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:4:73:42:1038 147 seq1 1349 99 35M = 1513 199 TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT <<<<<<<<<<<<<<<<<<<<<<<:<<<<<.<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:320:505:814 83 seq1 1350 99 35M = 1515 200 CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC <<<<<<<<<<<<<<<<;<<8<<76<<<<;<&<<<7 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_593:2:68:692:347 83 seq1 1351 99 36M = 1176 -211 TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTT 9<;;;;<<<:<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:252:428:683 137 seq1 1351 99 35M * 0 0 TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT <<<<<<;<<<<<<<<7<<7<<&+<<<<:<&<<<4< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:73:182:444 83 seq1 1354 99 34M = 1533 214 CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT <<<<;;<<<<<<<<<<<<;<;<<<<<:<<<<<7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:63:267:545 147 seq1 1354 99 35M = 1524 205 CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTG <<<<<<<<<<<<:<<<<<::<<<<<<.<<<;;;;5 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:177:562:806 83 seq1 1356 99 35M = 1515 194 TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTTTT <;<29<99<<;<<<9<20<9<<5;;<<<<<<<+.< MF:i:18 Aq:i:35 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS51_62:7:157:784:936 83 seq1 1356 99 35M = 1169 -222 TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTT <:<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:345:87 147 seq1 1360 99 35M = 1513 188 TTACTTGTTGTTGGTTTTCTGTTTCTTTTTTTGAT <<<<<<<<<<<<<<<<<<<<;<<<-<<<6<<<+8< MF:i:18 Aq:i:71 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS114_45:1:33:1407:94 83 seq1 1360 99 35M = 1172 -223 TTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGAT 77477;4;;;;;44;;;;;;7;;;;;;;9;;;;;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:2:434:715 147 seq1 1363 99 35M = 1527 199 CTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTT <<<<<<<<<<<<<<<<<;<<<<<<<0<<<68<<<+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:4:137:319:642 137 seq1 1363 99 35M * 0 0 CTTGTTGTTGGTTTTCTGTTTCTTTTTTTGATTTT <<<<<<<<<27<<<<<<<<<<<<<<&;<<&3;;<% MF:i:18 Aq:i:41 NM:i:2 UQ:i:9 H0:i:0 H1:i:1
+B7_610:3:148:340:479 147 seq1 1364 99 35M = 1190 -209 TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:329:458:365 147 seq1 1364 99 35M = 1186 -213 TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG ====:==9========>==7>==9>=7=>=>>=>> MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:91:267:655 147 seq1 1365 99 35M = 1204 -196 TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT ;,:;5:<6:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:91:856:504 83 seq1 1366 99 35M = 1520 189 GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT <<<<<<<<<<<<<<7<<<<<<<7<<<&;<<<&&<& MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_108:2:170:326:433 83 seq1 1367 99 35M = 1535 203 TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG =====<=9===:=<:==2=======2:===9==/5 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:132:717:233 83 seq1 1368 99 35M = 1529 196 TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA <<<<<<<<<<<<;<<<<<<<<<<<7<<<<&-<4<1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:14:420:712 83 seq1 1368 99 40M = 1525 197 TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA <<<<<<<<<<<<;<<<<<<<;<<<-;<<<&,<&*8111:6 MF:i:18 Aq:i:66 NM:i:3 UQ:i:21 H0:i:1 H1:i:0
+EAS114_39:4:43:1047:1626 147 seq1 1369 99 35M = 1523 189 GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA <<<<<<<<<<<<<<<<<<<:<<<:<<<<:+;-4:( MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:20:413:1334 147 seq1 1370 99 35M = 1215 -190 TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG 88878777;:;:1:;9;;;6;;;6;9;;;;;296; MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:154:669:853 83 seq1 1371 99 35M = 1193 -213 TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA <::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:117:857:942 83 seq1 1372 99 35M = 1527 190 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC <<<<<<<<<<<<<<<<<<<<<<<<<:6<;;7;9<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:145:144:796 147 seq1 1372 99 35M = 1181 -226 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC ;<<<;<<<<<<<<<;<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:88:162:587 147 seq1 1372 99 35M = 1189 -218 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC 386;;388-<8;<;68<<;;<;<6<<<8<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:73:108:1621 83 seq1 1373 99 35M = 1532 194 GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA <<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:127:153:861 147 seq1 1374 99 35M = 1202 -207 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT :;:6;9<<1;<<95<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:152:765:744 147 seq1 1374 99 35M = 1534 195 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT <<<<<<<<<<<<<<<<<<:<<<<<<<<&<7293<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:313:827:992 147 seq1 1379 99 35M = 1197 -217 TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC '187:1'<75<.*<<:5<..<<*<<917<<7<<17 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:7:268:263 89 seq1 1381 22 35M = 1381 -35 TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA ',)*&2<$7+<<<'<-<7<<<<<<<7<<</4/;<< MF:i:64 Aq:i:0 NM:i:4 UQ:i:22 H0:i:0 H1:i:0
+EAS51_64:3:7:268:263 149 seq1 1381 0 * = 1381 35 TCGTACAGAAGTTTAATGGAGCCTTGGGACCTTAC !!66'&+/&'8+2''1+'611'&6&+/&+.&+1'& MF:i:-64
+EAS139_19:1:47:352:1492 147 seq1 1385 99 40M = 1205 -220 TTTGTTTTGTATGGTGGAAGACATAATCCCACGCTTCCTA +7+/7+/%%1'6+3++1;:</<<5<)27<<9<)9<<9<7< MF:i:18 Aq:i:53 NM:i:3 UQ:i:14 H0:i:1 H1:i:0
+EAS139_11:5:61:38:1182 83 seq1 1388 99 35M = 1205 -218 GTTTGATTTGGTGGAAGACATAATCCCACGCTTCC 9:;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:64:37:257 83 seq1 1389 99 35M = 1215 -209 TTTGATTTGGTGGAAGACATAATCCCACGCTTCCT ;47<<47+9<4<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:266:556:252 147 seq1 1392 99 35M = 1224 -203 GATTTGGTGGAAGACATAATCCCACGCTTCCTATG .8558<72<(<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:321:271:138 147 seq1 1394 99 35M = 1193 -236 TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA 261:5969==9=:=<==<================= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:19:752:816 147 seq1 1394 99 35M = 1212 -217 TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA +<<+<--/<<<<4<2<<<<45<<<:<<<<<<+<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:306:388:342 83 seq1 1398 99 35M = 1211 -222 GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG 9/<9;<<<;<;<<7<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS114_39:1:71:636:533 147 seq1 1398 99 35M = 1232 -201 GTGGAAGACATAATCCCACGCTTCCTATGGAAAGG ,51(<<8<:<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:131:779:345 83 seq1 1399 99 35M = 1237 -197 TGGAAGACATAATCCCACGCTTCCTATGGAAAGGT <<7<<<<<<<<:<<<<<<<<<<<<<;<<<<<<;<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:68:64:783 83 seq1 1402 99 35M = 1214 -223 AAGACATAATCCCACGCTTCCTATGGAAAGGTTGT <<9<8<6<<<<<;<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:16:823:343 147 seq1 1403 99 35M = 1223 -215 AGACATAACCCCACGCTTCCTATGGAAAGGTTGTT <<<:<<<;+;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS219_FC30151:5:72:1426:1883 147 seq1 1405 99 35M = 1226 -214 ACATAATCCCACGCTTCCTATGGAAAGGTTGTTGG ;9<;<;0<;<;<<<<;<<<;:<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:166:979:531 83 seq1 1410 99 35M = 1245 -200 ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT 81<<<3<*<<:<<<<<<<8<<<<<<<<<<<<:<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:63:930:152 83 seq1 1410 99 35M = 1243 -202 ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT ;:4:8;:::;=:8;=;========;=:======== MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:137:895:681 147 seq1 1418 99 35M = 1232 -221 CTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATG 4;5+6;<<<<<<<<<9;<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:87:89:696 147 seq1 1419 99 36M = 1245 -210 TTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGAT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:104:744:280 147 seq1 1421 64 36M = 1262 -195 CATATGGAAAGGTTGTTGGGATTTTTTTAATGATTC '&+74*0<'/.47:8<<<<;<7''6/1<<<.<<68< MF:i:18 Aq:i:21 NM:i:3 UQ:i:33 H0:i:0 H1:i:0
+EAS56_57:2:259:42:969 83 seq1 1426 99 35M = 1265 -196 GGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCA <<<6<<<<<<-<<<<<<;<<;<6<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:18:1498:1475 83 seq1 1427 99 35M = 1260 -202 GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA :<4<*7<<<<<<<:<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:328:614:638 147 seq1 1428 99 35M = 1243 -220 AAAGGTTGTTGGGAGATTTTTAATGATTCCTCAAT <<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:159:71:155 147 seq1 1428 99 35M = 1237 -226 AAAGGTTGTTGGGAGATTTTTAATGATTCCTCGAT 5;;9<<:<;:<<<<7<<7;<3<<<:<<<;<<<<<; MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_39:1:73:302:1574 147 seq1 1429 99 35M = 1233 -231 AAGGTTGTTGGGAGATTTTTAATGATTCCTCAATG 7<88;;<;;<;;<<<<<<<<<<<<<<<<<<<<<1< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:200:712:439 83 seq1 1435 99 35M = 1286 -184 GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA <;<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<7 MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:259:869:641 147 seq1 1435 99 35M = 1272 -198 GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA 99=:=9=99<=========<=<<============ MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:74:570:695 83 seq1 1436 99 35M = 1240 -231 TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT .;:8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:58:369:244 83 seq1 1436 99 35M = 1266 -205 TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT <<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:216:292:528 147 seq1 1438 99 35M = 1269 -204 GGGAGATTTTTAATGATTCCTCAATGTTAAAATGT ;:;;8<<<<<<<<<<<<<:<<;<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:185:868:496 83 seq1 1442 99 35M = 1278 -199 GATTTTTAATGATTCCTCAATGTTAAAATGTCTAT :;;<;;<<<<<<<<;4<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:277:194:143 147 seq1 1444 99 35M = 1262 -217 TTTTTAATGATTCCTCAATGTTAAAATGTCTATTT ;<<;<<<;8;<0<7<<<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:267:71:603 147 seq1 1446 99 36M = 1281 -201 TTTAATGATTCCTCAATGTTAAAATGTCTATTTTTG 9;;<;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:218:173:667 147 seq1 1448 99 35M = 1298 -185 TAATGATTCCTCAATGTTAAAATGTCTATTTTTGT <<<<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:70:843:706 147 seq1 1449 99 35M = 1306 -178 AATGATTCCTCAATGTTAAAATGTCTATTTTTGTC <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:47:720:789 147 seq1 1455 90 35M = 1278 -212 TCCTCAATGTTAAAATGTCTATTTTTGTCTTGACA /)040<.878<<<<;8<;<9<9;<<<<<<<<<<93 MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:102:511:946 147 seq1 1461 26 35M = 1291 -205 ATGTAAAAGTGACTGTTATTGTCTTGACACCCAAC <%-4:6<:/&46;/*;<*84<0<'<&*<2<<<<<< MF:i:-126 Aq:i:26 NM:i:5 UQ:i:78 H0:i:0 H1:i:0
+EAS112_34:8:103:812:255 147 seq1 1461 99 35M = 1272 -224 ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC 7:777:7<<::7<7<7<<:7<7<:<<<<<<<<<7< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:179:735:569 83 seq1 1461 99 35M = 1286 -210 ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC <5<3:<<<<5;8<<<55;<:</:<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:52:1779:1664 147 seq1 1462 99 35M = 1297 -200 TGTTAAAATGTCTATTTTTGTCTTGACACCCAACT 6;;:;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:153:543:671 147 seq1 1465 99 35M = 1301 -199 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT ;;;;;=;==================;========= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:38:1071:155 147 seq1 1465 99 35M = 1274 -226 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT <<62<<<<<<3<<<<</<<<<<<<%<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1864:477 83 seq1 1465 99 35M = 1270 -230 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:1256:204 147 seq1 1467 99 35M = 1288 -214 AAATGTCTATTTTTGTCTTGACACCCAACTAATAT 66777:;;37;;:;;0;:;;;;):;;:7;;;;;;; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:316:176:543 147 seq1 1469 99 35M = 1305 -199 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT <<)/3<<<&<*<<0<<8<<82</5<<<<<88<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:36:688:722 147 seq1 1469 99 35M = 1295 -209 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT <;;<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:11:706:1030 147 seq1 1469 92 35M = 1306 -198 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT +<5069+9<<<<+<;<<<<;<<77<7<<;<<;<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:289:132:526 147 seq1 1472 99 36M = 1289 -219 TCTATTTTTGTCTTGACACCCAACTAATATTTGTCT ;<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:50:950:562 147 seq1 1473 99 35M = 1301 -207 CTATTTTTGTCTTGACACCCTACTAATATTTGTCT <<3<<<8<;<<<<<<+<<8<&<<<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS188_4:5:8:377:655 147 seq1 1473 99 35M = 1299 -209 CTATTTTTGTCTTGACACCCAACTAATATTTGTCT ;<8;;:<;<<:<;<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:322:631:245 83 seq1 1474 99 36M = 1297 -213 TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:33:1193:664 83 seq1 1474 99 40M = 1301 -213 TATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAA ;;;;;;<;;-9<<<:</+9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:253:59:242 147 seq1 1478 99 35M = 1302 -211 TTTGTCTTGACACCCAACTAATATTTGTCTGAGCA <<<:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:42:1223:1087 147 seq1 1479 99 35M = 1293 -221 TTGTCTTGACACCCAACTAATATTTGTCTGAGCAA ;:<<<:<7<<<;;<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:90:1403:1635 147 seq1 1480 99 35M = 1311 -204 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA 86878;;;8;788;;;;;;;;;;;;;8;5;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:92:288:1354 83 seq1 1480 99 40M = 1321 -199 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGT ::::;;;<<<<9;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:63:1265:820 147 seq1 1480 99 35M = 1320 -195 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA <<<<<<3<<1<<<<<<<7<<<<<<<<<<<<<<<+< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:102:884:63 83 seq1 1481 99 35M = 1341 -175 GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA <;7;;<<8<;8;<<<8<<<<<<8<<<8;<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:50:1339:1154 83 seq1 1481 99 35M = 1305 -211 GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA 7;7;8;<5<:86<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:117:411 83 seq1 1482 99 36M = 1309 -209 TCTTGACACCCAACTAATATTTGTCTGAGCAAAACA ;88<<<<<:<7<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:150:508:757 83 seq1 1483 99 35M = 1336 -182 CTTGACACCCAACTAATATTTGTCTGAGCAAAACA 6;;;<8<6;8<<8<<<<<;<<<<;<<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:6:1067:91 83 seq1 1483 99 35M = 1325 -193 CTTGACACCCAACTAATATTTGTCTGAGCAAAACA 3<;<<:;9;<<7;;<;<<<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:71:85:629 83 seq1 1484 99 35M = 1324 -195 TTGACACCCAACTAATATTTGTCTGAGCAAAACAG ,,1<1<7&%<9+:<<9<<9<<<<<<<<5<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:319:165:698 147 seq1 1485 99 35M = 1287 -233 TGACACCCAACTAATATTTGTCTGAGCAAAACAGT ;5;2;<:;<<:<<<<<<<<<;:;<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:60:182:718 83 seq1 1485 99 35M = 1295 -225 TGACACCCAACTAATATTTGTCTGAGCAAAACAGT <<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:82:932:400 147 seq1 1486 97 35M = 1313 -208 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC <<;<<72<<7<<<<<<<<<<;<<<+7<<<<<<<<< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:23:502:103 83 seq1 1486 99 35M = 1294 -227 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC 4:386:6<:::<:<:4:+<::4<<<6<<<<<<<66 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:139:331:63 147 seq1 1486 99 35M = 1327 -194 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC 7===================:=:============ MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:53:156:845 147 seq1 1487 99 35M = 1311 -211 ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT 171(*00,0;;&;7=77=;5;;(;1:=5======= MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:47:471:858 83 seq1 1487 99 35M = 1335 -187 ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT /;9<<63<<<<3<;<<<<<<<<<<<<<<<<<<<9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:9:203:653 83 seq1 1488 99 35M = 1296 -227 CACCCAACTAATATTTGTCTGAGCAAAACAGTCTA 37))&<8<<<<<7<4<;<777<<:<<<<<<<<;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:199:760:42 83 seq1 1489 24 35M = 1318 -206 ACCCAATTAATATTTTTCTTAGCAAAACAGTCTAG 58*5.<+<<<<,4<<**<90**9<<<<<<4<<<<< MF:i:18 Aq:i:24 NM:i:3 UQ:i:34 H0:i:0 H1:i:0
+EAS218_1:4:37:1626:862 83 seq1 1489 99 35M = 1321 -203 ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG :663<<3<<<<<<<<<<:<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:191:948:257 83 seq1 1493 99 35M = 1325 -203 AACTAATATTTGTCTGAGCAAAACAGTCTAGATGA :;;;;<<<<<<5<5<<<<<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:171:343:758 147 seq1 1494 99 36M = 1331 -199 ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGA :+;;<<<<<;<;:<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:9:1595:1826 147 seq1 1494 99 35M = 1316 -213 ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAG ;76;;6:9<9<963;<<7<<<<<<<;<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:7:1547:1933 83 seq1 1497 99 35M = 1308 -224 AATATTTGACTGAGCAAAACAGTCTAGATGAGAGA <<<<<<<<-<<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS51_64:3:67:782:132 147 seq1 1498 99 35M = 1343 -190 ATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAG ;;<;;;<<;;<<<;<<<;<<<;<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:249:986:224 147 seq1 1499 99 35M = 1325 -209 TATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGA <<<3<;<;;<<;8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:61:702:720 83 seq1 1500 99 35M = 1320 -215 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <<<4<4+0;<<:<<<<<<<<-<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:113:43:634 83 seq1 1500 99 35M = 1340 -195 ATTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAA ;9;1;<5:<<<%<<<<;<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS56_53:7:22:22:934 83 seq1 1500 99 35M = 1332 -203 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <+72::72<<60<<<<<<<96<<<<0<<<<1<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:36:678:316 147 seq1 1500 99 35M = 1328 -207 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <<72.2,;;<)6<<<<:<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:102:825:507 83 seq1 1501 99 35M = 1330 -206 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC <05<<<<<<<7<<<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:261:504:780 83 seq1 1501 99 35M = 1337 -199 TTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAAC 80;8(;0==8+====;==49=============== MF:i:18 Aq:i:43 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_78:7:270:448:491 147 seq1 1501 99 35M = 1313 -223 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC 7;;;;+2;<<+<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:51:506:878 83 seq1 1501 99 36M = 1314 -223 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACT <970;49;<;+<<<:<<<;;<<<<<<<<<<<<<<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:936:1509 83 seq1 1502 99 40M = 1322 -220 TTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT 99;66:<<;-<<<<:<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:41:576:1016 83 seq1 1503 99 35M = 1320 -218 TGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTT :<;<<<<<6<<<<;<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:123:610:472 147 seq1 1504 99 35M = 1333 -206 GTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTC :<::+<<9<<9<<<<=<<<<<=<<<<<<<<?<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:308:354:124 147 seq1 1507 99 35M = 1331 -211 TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT %+<)2<<<<<<<<8<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:11:1274:1230 83 seq1 1507 99 35M = 1327 -215 TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT .<<<<<<<<<<<<<<<<5<<<<<<<<<<5<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:169:292:652 147 seq1 1510 99 35M = 1306 -239 GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA 79919-<-<<<<<<<<<<<<<<<<<<<6<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:18:376:416 83 seq1 1510 99 35M = 1326 -219 GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA 70<<<<<<<7<7<<<2<<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:194:168:684 147 seq1 1512 99 36M = 1340 -208 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT ;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:73:273:488 83 seq1 1512 99 35M = 1318 -229 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGG </<<:<<9;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:324:515:230 83 seq1 1512 99 34M = 1339 -207 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG 7<<1<<<7<+<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:345:87 83 seq1 1513 99 35M = 1360 -188 AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT <<;<<<<5<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:73:42:1038 83 seq1 1513 99 35M = 1349 -199 AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:209:778:588 83 seq1 1514 99 36M = 1326 -224 AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT ;8;98;;;<3<<<<<<<<<;<<;<<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:115:683:296 147 seq1 1514 99 35M = 1320 -229 AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTC <<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:92:213:217 147 seq1 1515 99 35M = 1333 -217 ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT <<<<<:<<<<<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:177:562:806 147 seq1 1515 99 35M = 1356 -194 ACAGTGTAGATGAGAGAGACCTTCCCTGGAGGTCT )2<9;'/:<5<<<:<<:<:&5:&<8,<<+:<&<<< MF:i:18 Aq:i:35 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS1_103:3:320:505:814 147 seq1 1515 99 35M = 1350 -200 ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT <2<;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:9:206:901 147 seq1 1517 99 35M = 1344 -208 AGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGA <<<<<<<<<<<<<.<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:71:707:568 83 seq1 1518 99 35M = 1332 -221 GTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGAT ;9;<;<<<<<;<<<<<;<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:91:856:504 147 seq1 1520 99 35M = 1366 -189 CTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGG :::<<:<<<<<<<<<<<<<<<<<<<<<:<:<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:77:48:860 147 seq1 1521 99 35M = 1348 -208 TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC ;8;8;<9<9<<<<<<<<<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:16:434:204 83 seq1 1522 99 34M = 1340 -216 AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC <:7:<<<<<<<<<<<9<<<+<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:43:1047:1626 83 seq1 1523 99 35M = 1369 -189 GATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGT <<4<<<<<<<<<<<:<<<;<<<<<:<7<<;<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:81:1723:1820 147 seq1 1524 99 35M = 1335 -224 ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT ;6;;;<<<<<<<<<<<2<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:63:267:545 83 seq1 1524 99 35M = 1354 -205 ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:90:406:631 83 seq1 1525 99 35M = 1335 -225 TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTT <<<:<:<<<-<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:14:420:712 147 seq1 1525 99 40M = 1368 -197 TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCC 1::::<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:2:434:715 83 seq1 1527 99 35M = 1363 -199 AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT <<<<<<<<<:;<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:117:857:942 147 seq1 1527 99 35M = 1372 -190 AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT <<;<<<<<<<9<<<8<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:70:348:972 83 seq1 1528 99 35M = 1343 -220 GAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTC <99<-7<<7<<<87<<<)<<<<<<8<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:132:717:233 147 seq1 1529 99 35M = 1368 -196 AGAGAACTTCCCTGGAGGTCTGATGGAGTTTCTCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:4:21:443:404 147 seq1 1529 99 35M = 1345 -219 AGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCC =9=9=9==:========================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:148:286:316 83 seq1 1531 99 35M = 1347 -219 AGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCT ;::::;9/:<9<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:85:1224:625 147 seq1 1532 99 35M = 1331 -236 GAACTCCCCTGGAGGTCTGATGGCGTTTCTCCCTC 17;;7&-;<;<;:<6<<:;<<<<<<<;<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS221_1:8:73:108:1621 147 seq1 1532 99 35M = 1373 -194 GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC <<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:73:182:444 147 seq1 1533 99 35M = 1354 -214 AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG :1<4;;::<<;<<<<;<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:152:765:744 83 seq1 1534 99 35M = 1374 -195 ACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGT 6<;6<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:170:326:433 147 seq1 1535 99 35M = 1367 -203 CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC :44<<<<<<<<<<:6<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:8:4:841:340 73 seq2 1 99 36M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAA <<<<<<<<;<<<<<<<<;<<<<<;<;:<<<<<<<;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:142:943:582 73 seq2 1 99 35M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA <<<<<<;<<<<<<:<<;<<<<;<<<;<<<:;<<<5 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:43:859:229 153 seq2 1 66 35M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA +37<=<.;<<7.;77<5<<0<<<;<<<27<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:286:923:549 73 seq2 2 99 35M * 0 0 TCAAATGAACTTCTGTAATTGAAAAATTCATTTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:117:578:853 73 seq2 5 99 35M * 0 0 AATGAACTTCTGTAATTGAAAAATTCATTTAAGAA <;<9<<<<<;<<;<<<<<<<<<<<,<98;<;;&92 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:289:472:86 137 seq2 6 99 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:302:997:951 73 seq2 6 69 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<<<<<<<<;<<:<<52<<:;;<6<<;<:<2:9/ MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:13:1729:1844 73 seq2 6 99 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<;;<;7<<<<4<<<<762;6<<<<<<<;6;618 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:43:239:977 137 seq2 7 99 36M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;7;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:233:191:520 73 seq2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<8<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:75:555:1591 137 seq2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:43:656:1866 137 seq2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;:; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:100:563:301 137 seq2 8 99 35M * 0 0 GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;8;;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:126:526:276 137 seq2 8 84 35M * 0 0 GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:161:366:544 137 seq2 11 99 35M * 0 0 CTTCTGTAATTGAAAAATTCATTTAAGAAATTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:326:652:890 73 seq2 12 99 35M * 0 0 TTCTGTAATTGAAAAATTCATTTAAGAAATTACAA <<<<<<<<<<2<<<<<<<<<<<<<<+<8:<<9998 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:238:441:727 73 seq2 16 99 35M * 0 0 GTAATTGAAAAATTCATTTAAGAAATTACAAAATA <<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:64:507:478 137 seq2 17 99 35M * 0 0 TAATTGAAAAATTCATTTAAGAAATTACAAAATAT <<<<<;<<<<<<<<<<<<<<<;;;<<<;<<8;<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:118:440:850 137 seq2 18 99 35M * 0 0 AATTGAAAAATTCATTTAAGAAATTACAAAATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<949<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:270:995:918 137 seq2 24 84 35M * 0 0 AAAATTCATTTAAGAAATTACAAAATATAGTTGAA <<<<<<<<<<<<<:<<<<<<8<8<8<<<<:<;4;4 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:305:819:245 73 seq2 25 98 35M * 0 0 AAATTCATTTAAGAAATTACAAAATATAGTTGAAA 8<<<<8<;<<<<<;<8<<8<8<<<<8<<<899<<+ MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_26:7:13:172:720 73 seq2 26 99 35M * 0 0 AATTCATTTAAGAAATTACAAAATATAGTTGAAAG ============:3<==:====<=9=3===;==83 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_63:7:34:334:825 73 seq2 30 99 35M * 0 0 CATTTAAGAAATTACAAAATATAGTTGAAAGCTCT <<<<<<<<<<<<<<<<<<<<<<<<3;<<<<6<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:32:1379:738 137 seq2 33 99 35M * 0 0 TTAAGAAATTACAAAATATAGTTGAAAGCTCTAAC ;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:5:70:318:1631 137 seq2 34 99 40M * 0 0 TAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGA <<<<<<;<<<<<<<<<<<<;9:<<<<<<<<<<<<<:::78 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:285:241:560 147 seq2 37 99 35M = 200 198 GAAATTACAAAATATAGTTGAAAGCTCTAACAATA <<<<<<<<<<;<<<<;<<<<<<<<<<<<;<;;;<. MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:389:889 83 seq2 37 99 36M = 205 204 GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG <<<<<<<<<<<<<<<<<<<<;<<<<<<<;9;;<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:127:725:381 147 seq2 39 99 35M = 209 204 AATTACAAAATATAGTTGAAAGCTCTAACAATAGA <<<<<<<<<<<<<<<<<<<<<;<<<<;;;;;<<8: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_93:5:66:372:343 147 seq2 40 99 35M = 228 223 ATTACAAAATATAGTTGAAAGATCTAACAATAGAC <<<<<<<<<<8<<<<<6<<<8&8<<<<<58<:<:: MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_65:6:67:800:450 83 seq2 41 99 35M = 221 215 TTACAAAATATAGTTGAAAGCTCTAACAATAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:90:1906:1528 147 seq2 41 99 35M = 222 216 TTACAAAATATAGTTGAAAGCTCTAACAATAGACT <<<<<<<<<<<<<<<:<<<:<<<<;<<<<<;:7:; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:117:284:589 147 seq2 43 99 35M = 210 202 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA ==================================0 MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:26:211:481 83 seq2 43 99 35M = 222 214 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA <<<<<<<<<<<<<<<<<<<<<<<7<<<<<:<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:85:923:726 83 seq2 43 99 35M = 199 191 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA <<<<<<<7<<<<<<<<<<<55<<<9<*<<<991<4 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:107:395:312 147 seq2 44 99 35M = 224 215 CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<;<;;<:<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:7:5:753:806 147 seq2 45 99 35M = 197 187 AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<7:-<;;3;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_103:3:277:921:474 147 seq2 45 99 35M = 241 231 AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC <<<<<<<<<<<<<<<:<<<<<<<<<<<5<<;;;;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_63:4:38:28:122 147 seq2 46 99 35M = 227 216 AAATATAGTTGAAAGCTCTAACAATAGACTAAACC <<<<<<;<<<<<<<;<<<<6<<<<<<:<<<<;;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS221_3:8:50:1203:1094 147 seq2 46 99 35M = 223 212 AAATATAGTTGAAAGCTCTAACAATAGACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:2:223:583:968 83 seq2 47 88 36M = 215 204 AATATAGTTGAAAGCTCTAACAATAGACTAAACCAA <<<<<<<29<<<<4<<<<<<<<<<<7<<7<..<<47 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:1:28:350:895 147 seq2 48 95 35M = 215 202 ATATAGTTGAAAGCTCTAACAATAGACTAAACCAA <<<<<<<<;<;<<<<<<<<<;;<<;<<<<<;;<;8 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:7:69:1130:832 83 seq2 50 94 35M = 231 216 ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC ;;2<;<;;<;9;<;;;;;;;7;8;;7;;;;77437 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS188_7:3:296:224:724 147 seq2 50 99 35M = 234 219 ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC <<<<;<<<<<<7;<<<<<6<<<06<<<<<<2(<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_595:4:319:250:718 147 seq2 52 99 35M = 240 223 AGTTGAAAGCTCTAACAATAGACTAAACCAAGCAG <<<<<<<<<<<;<<5<5;<851;85;)9;;8594; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_73:3:203:419:243 147 seq2 54 99 35M = 237 218 TTGAAAGCTCTAACAATAGACTAAACCAAGCAGAA <<<<<<<<<<<<<<<9<;<8<<<;<<<;<<<4<77 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:21:1601:1666 147 seq2 56 99 40M = 228 212 GAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAG 7<<<<<<<<:<<7<<<:<<<<<<4<<44<<914<;:5::: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:158:943:467 147 seq2 57 99 35M = 225 203 AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA <<<<<;<<<<<<<<<<<<<<;;<<<<<<<<<;8<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:54:91:1232 83 seq2 57 99 35M = 246 224 AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:29:833:612 147 seq2 58 99 35M = 224 201 AAGCTCTAACAATAGACTAAACCAAGCAGAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:1:189:503:110 147 seq2 63 79 35M = 229 201 CTAACAATAGACTAAACCAAGCAGAAGAAAGAGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:2 H1:i:0
+EAS114_28:2:114:938:216 83 seq2 63 99 36M = 218 191 CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_95:5:257:654:116 83 seq2 64 99 35M = 231 202 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<<<;:<<<<<<<<<88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_97:3:277:144:848 147 seq2 64 99 35M = 228 199 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<;<<<<<<<<<<<<<<<<<3<<9;;6; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_108:4:75:166:463 83 seq2 64 99 35M = 250 221 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<++3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:4
+B7_610:5:102:915:87 83 seq2 65 99 35M = 222 192 AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC <<<<<<<<<<<<<<<<<<<<;<<<<<3<<;<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:0
+EAS54_71:3:78:855:352 147 seq2 65 99 35M = 240 209 AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC <<<<<<<<;<<<<<<<<<;<<<<<<<<;<;<<:<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:0
+EAS56_57:2:206:873:186 147 seq2 66 99 35M = 227 196 ACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;53 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_93:6:238:514:194 147 seq2 68 99 35M = 265 232 AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<;<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:3:285:489:327 83 seq2 68 99 35M = 233 200 AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_67:1:15:381:715 83 seq2 72 99 35M = 237 200 GACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTT ;=====;===9==;===9;;;=4;9=====;==== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:199:818:124 83 seq2 73 99 35M = 266 228 ACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTG <<<<<<<<<<<<<<<<<;<<;<<;7<<<<<<9<9; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:182:1002:639 147 seq2 77 99 35M = 246 204 AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA <<<<<<<<<<<<<<<<<<<<<9-<<<<4<;<;;<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:945:2005 147 seq2 77 99 35M = 262 220 AACCAAGCAGAAGAAAGAGGCTCAGAACTTGAAGA <<<<<<<<<<<<<<<<<<<<%<<<<<<;<<<<<<< MF:i:18 Aq:i:44 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+B7_591:5:254:542:848 83 seq2 79 99 36M = 233 190 CCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAA <<<;<<<<<<<<<<<<<<<;4<;8<<<;;9<9;8;9 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:71:517:742 83 seq2 81 99 35M = 266 220 AAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAG <<<<<<<<<<<<;<<<<<<<<<<<<<48:4<<<<3 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:254:617:73 147 seq2 83 99 35M = 266 218 GCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<6;:;4% MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:13:1507:1146 83 seq2 84 99 35M = 278 229 CAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCT ;<9;;;;<<;;;;<<;<;;;;<;;<<;<;<99777 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:32:686:735 83 seq2 84 78 35M = 255 206 CAGAAGAAAGAGGTTCANANNNTGANGACAAGTCT <<<<<<<<<<<<<<<<<!<!!!<<<!<<<<<<<<< MF:i:-126 Aq:i:78 NM:i:5 UQ:i:0 H0:i:0 H1:i:0
+EAS56_57:3:112:729:591 83 seq2 86 99 35M = 283 232 GAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:17:1222:783 147 seq2 87 99 35M = 251 199 AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCGT <<<<<<<)<<<16<<;<<<6<4<:<4<+://<7)< MF:i:18 Aq:i:59 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS188_7:6:46:122:479 83 seq2 87 99 35M = 248 196 AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:313:531:169 147 seq2 89 99 36M = 250 197 GAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATG <<<<<<<<<<<<<;<<<<<<<<<<<:<<:<;<<;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:148:170:895 83 seq2 91 99 35M = 247 191 AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA <<<<<<<<<<9<<<<<6<<<<<<<<<<<<<<<<6< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:34:380:815 147 seq2 91 99 35M = 283 227 AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:210:809:735 147 seq2 93 99 35M = 291 233 GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:40:925:442 147 seq2 93 99 35M = 271 213 GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT ;<;<<<<<<<<<<<3;<7;:<;;<<<;<<:<32<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:169:256:888 147 seq2 94 99 35M = 270 210 AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT <<<<<<<<<<<<<<<<<<<<<<;;<;<<;<<:;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:117:156:84 83 seq2 95 99 35M = 285 225 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:35:522:294 147 seq2 95 99 35M = 272 212 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA ===============================:=:= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:41:653:1568 147 seq2 95 99 35M = 266 206 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA ;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:178:276:693 147 seq2 96 99 36M = 259 199 GTTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:223:440:667 83 seq2 97 99 35M = 282 220 TTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC <<<<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:194:470:416 83 seq2 98 99 35M = 265 202 TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC <<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:61:1000:1534 147 seq2 104 99 35M = 286 217 CTTGAAGACAAGTCTCTTATGAATTAACCCAGTCA <<<<4:<:<1)<<<<<<<+<:44<</7<<<)4:<) MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:145:383:182 147 seq2 105 99 35M = 291 221 TTGAAGACAAGTCTCTTATGAATTAACCCAGTCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:63:816:921 147 seq2 106 99 35M = 291 220 TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<4<846 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:77:1780:693 83 seq2 106 99 40M = 276 210 TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAA <<<<<<<<<<<<;<<:<<;<<<<<<<<<<<<;<<<;;:69 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:215:861:605 147 seq2 107 94 36M = 262 191 NAAGACAAGTCTCTTATGAATTAACCCAGTCAGACA !+++++++++++++++++++++++++++++++++++ MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS221_3:2:22:1623:709 83 seq2 107 99 35M = 287 215 GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC <<<<<<<<<7<<<<<<<:<<<<<<<<:85:<:2<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:54:436:1452 147 seq2 108 99 35M = 275 202 AAGACAAGTCTCTTATGAATTAACCCAGTCAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:42:333:516 147 seq2 109 99 35M = 296 222 AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA <<<<<5<*<2<<<<<<<<<<<<<<<<<<<<<<<</ MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:119:730:190 83 seq2 114 99 35M = 301 222 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<9<;;<<<;<<<<<<<8<<<1<<918<;;;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:63:727:203 83 seq2 114 99 35M = 278 199 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:27:577:849 147 seq2 114 99 35M = 316 237 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<<<<<<<<<<<<<<<<<<;:<<<;<<<<<<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:5:259:250 83 seq2 115 99 35M = 269 189 GTCTCTTATGAATTAACCCAGTCAGACAAAAATAA <<<<<<<<<<<<<<<<<<<<;<<<;5<<5<;7<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:17:989:186 83 seq2 120 91 35M = 299 214 TTATGAATTAACCCAGTCAGACAAAAATAAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<:<<;<7;:::: MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_45:2:33:1445:1357 83 seq2 121 85 35M = 299 213 TATGAATTAACCCAGTCAGACAAAAATAAAGAAAA ;;<;<<<<<<;;;<9:;:;;;;;:;:;;;;99777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:7
+EAS221_3:4:30:1452:1563 147 seq2 122 94 35M = 313 226 ATGAATTAACCAAGTCAGACAAAAATAAAGAAAAA <<<<<<<<<<<<<<:<<<<1<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_45:1:77:1000:1780 147 seq2 123 66 35M = 279 191 TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA ;;;:;;;;;;;/;;;7:4;;7;;;;;;;;;77777 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:6 H1:i:47
+EAS114_45:4:48:310:473 83 seq2 123 66 35M = 298 210 TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA <<<;<<;;;<<;;<;;;;;;;;;;;;;;;;89799 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:6 H1:i:47
+B7_591:2:279:124:41 83 seq2 124 69 36M = 307 219 GAATTAACCCAGTCAGACAAAAANNAAGAAAAAAGA <<<<<<<7/<8<<<<<<<<<<4*!!<<7<7<<5<<3 MF:i:18 Aq:i:0 NM:i:2 UQ:i:0 H0:i:0 H1:i:0
+EAS112_32:8:89:254:332 147 seq2 124 76 35M = 291 202 GAATTAACCCAGTCAGACAAAAATAAAGAAAAAAG ==================;=========;=7;;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:4 H1:i:36
+B7_597:7:103:731:697 83 seq2 125 72 35M = 304 214 AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA <<<<<<<<<<<<<<<<<<:<:<<6<<<<<<<:<;: MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:9 H1:i:55
+EAS139_11:2:71:83:58 147 seq2 148 77 9M2I24M = 349 236 AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS192_3:4:63:5:870 147 seq2 148 75 9M2I24M = 330 217 AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT <<;<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:2:29:1822:1881 147 seq2 150 74 7M2I31M = 328 218 AGAAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAGAAG <<<<<<<<<<<<4<<<<<<<<<<<<<<:<<<:<<;::::: MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS221_3:2:100:1147:124 147 seq2 150 99 35M = 345 230 AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS192_3:8:6:104:118 147 seq2 154 99 35M = 323 204 AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:6:185:96:948 83 seq2 160 99 36M = 324 200 TTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT <<<<<<<<<;6<<<<<<<<<;<<<;;<<<<<<<;<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:213:309:373 147 seq2 161 99 35M = 317 191 TTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT <;<<<<<<;<7<<<<<-<<<<<<<<<<<<<<4<7< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:30:466:652 83 seq2 163 98 35M = 332 204 AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA <<<<<<<<<<<<<<<<<<<<<<<<;<<<4;7<<<7 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:156:21:69 147 seq2 163 99 35M = 362 234 AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA <<<<<<<<<<<<<<<<<<<<<<<:<4<<<:<;<;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:197:52:58 147 seq2 165 99 35M = 323 193 AAATGAACAGAGCTTTCAAGAAGTATGAGATTATG <<<<<<<<<<<<<<<<<<9<<<<2<<<<<<;<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:214:946:229 147 seq2 165 99 35M = 339 209 AAATGAACAGAGCTTTCAAGAAGTATGATATTATG <<<<<<<<<<<<<<<<<::<;;;<;<;7<:<<7<2 MF:i:18 Aq:i:65 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS192_3:4:293:168:240 83 seq2 167 99 35M = 340 208 ATGAACAGAGCTTTCAAGAAGTATGAGATTATGTA <<<<;<<<;;;<;<<;;;<<;;<<::::<<;;+;7 MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:208:118:673 83 seq2 169 76 35M = 332 198 GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:71:478:175 147 seq2 171 99 35M = 317 181 ACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGT <<<<<<<<<<<;<<<<<;<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:177:24:389 147 seq2 175 99 35M = 365 225 AGCTTTCAAGAAGTATGAGATTATGTAAAGTAACT <<<<<<<<<<<<<<<<<<<<<<<<7<;;<;9969; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:14:1211:1332 147 seq2 178 99 35M = 351 208 TTTCAAGAAGTATGAGATTATGTAAAGTAACTGAA ;;.;;;;;;;3;;;;;6;;;;;;8;;;;;;63777 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:324:238:736 147 seq2 180 99 35M = 367 222 TCAAGAAGTATGAGATTATGTAAAGTAACTGAACC =================================== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:9:648:712 83 seq2 182 99 35M = 358 211 AAGAAGTATGAGATTATGTAAAGTAACTGAACCTA <9<;<<<<<<<;<<<<<8<<<<9<<;<<8)<:1<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:41:1308:619 147 seq2 184 99 35M = 360 211 GAAGTATGAGATTATGTAAAGTAACTGAACCTATG <6+<*<<<<<<<:<<<<<<<:<<&<<<<1<6<11: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:328:537:640 83 seq2 185 99 35M = 352 202 AAGTATGAGATTATGTAAAGTAACTGAACCTATGA <;<<<<<<;<<<<<<<<<:;<<8<<<;:<<<;<;9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:86:697:941 147 seq2 187 99 35M = 341 189 GTATGAGATTATGTAAAGTAACTGAACCTATGAGT =====================<=<==<<====;=5 MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:224:592:744 83 seq2 188 99 35M = 383 230 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<;<<<<<7<<<<<<<&<*<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:135:354:66 83 seq2 188 99 35M = 356 203 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<;<<<<<<<<<<;<<2<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:71:311:202 147 seq2 188 99 35M = 379 226 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<:4<<<<<<<<<<<<8;4;: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:50:30:15 83 seq2 192 39 35M = 358 201 AGATTATGTAAAGTAACTTAACCTATGAGTCCAAG +:79.68872.:9&:92/.299169/5+/6/3/&2 MF:i:18 Aq:i:10 NM:i:3 UQ:i:45 H0:i:0 H1:i:1
+EAS192_3:5:287:334:110 73 seq2 196 73 35M = 196 0 TATGTAAAGTAACTGAACCTATGAGTCACAGGTAT <<<<<<<<<<<<<<<<<<4;<<<<<<<::6<55:. MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:287:334:110 133 seq2 196 0 * = 196 0 GATGAATACTAAGATTGATGTAGCAGCTTTTGCAA .5+7)09<))&-&:33953<-./&&&)((;+3399 MF:i:-64
+B7_597:7:5:753:806 83 seq2 197 99 35M = 45 -187 ATGTAAAGTAACTGAACCTATGAGTCACAGGTATT ;:<:<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:149:572:877 147 seq2 197 99 36M = 334 173 ATGTAAAGTAACTGAACCTATGAGTCACAGGTATTC =>7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:85:923:726 147 seq2 199 99 35M = 43 -191 GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC <:<<<%3<<1<<86<<-<<<<<<<<<<<<6<<1<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:285:241:560 83 seq2 200 99 35M = 37 -198 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT :<<<<;<<,<<<<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:41:461:436 147 seq2 200 74 35M = 389 224 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT <<<<<<<<<<<<<<<<<<<:<<<<<<<<;<;;;:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:6:25:949:33 83 seq2 201 99 35M = 383 217 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG =;===/8========*==&;6=&=&:=6&:=::67 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:60:590:1760 83 seq2 201 99 35M = 376 210 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG <:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:86:693:234 147 seq2 202 82 35M = 388 221 AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA ;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:4:223:776 147 seq2 203 93 35M = 387 219 AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG <<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;<;2< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:88:84:1558 83 seq2 203 95 35M = 394 226 AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG <<;<<<<<<<<<<<<;;<<<<<<<::<<<<<<7&< MF:i:18 Aq:i:22 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_597:2:168:829:88 147 seq2 205 99 35M = 369 199 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<9;4;2 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:389:889 147 seq2 205 99 36M = 37 -204 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA ;<<;;56;==================8========8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:81:685:141 83 seq2 207 85 34M = 382 210 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA <<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:1312:1400 83 seq2 207 99 40M = 385 218 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<;<<<:<<:<;<:<<<;:;<<<<<<:<8<1;;:::88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:127:725:381 83 seq2 209 99 34M = 39 -204 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA +<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:19:736:559 83 seq2 209 99 35M = 370 196 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:117:284:589 83 seq2 210 99 35M = 43 -202 GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG ==8==;==================;========== MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:120:596:847 147 seq2 211 83 35M = 410 234 AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA <<<<<<<<<<<<<;<<<9<<<<<<<;:<62;58;2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_610:5:51:904:391 147 seq2 212 97 35M = 401 224 ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:96:1314:1448 147 seq2 213 93 35M = 388 210 CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA <<<<<<<<<<<<<<<<<<<<<<<<5<4<<<<-<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS139_19:3:73:1158:535 147 seq2 213 99 40M = 377 204 CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG <<<<<<<<<<<<<<<<<<<<<<8<;;<<<<<9<<9::8:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:223:583:968 147 seq2 215 88 36M = 47 -204 TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG 1<';<<&%-:<<<<<:66%<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:3:160:173:889 147 seq2 215 99 35M = 379 199 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA <<<<<<<<<<<<<<<<<<<<;0<7<<;<<<;7<09 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:28:350:895 83 seq2 215 95 35M = 48 -202 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA :<;<<<:;<-<<<<<4;77<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:45:707:147 147 seq2 216 99 35M = 424 243 ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<&<<<<:<<9<<<9<<<<75;;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:18:1757:95 83 seq2 216 45 35M = 374 193 ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<<<<<<<<1<:<<<<<<:<<<;:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_66:6:310:747:415 147 seq2 217 99 35M = 387 205 TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT <<<<<<<<<<<<<<<<<<:<<<<<;<<<<<;<;<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:114:938:216 147 seq2 218 99 36M = 63 -191 GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA <<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:179:629:513 147 seq2 220 99 35M = 409 224 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG <<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:88:55:1187 83 seq2 220 66 35M = 391 206 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG ;;<;;;<<99<<;;<;;;;;:;49;:;;;;87898 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:119:38:945 83 seq2 221 99 35M = 428 242 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA <<<<<<<<<<<<<<<8<<<<<8<<<8<;<<7<:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:67:800:450 147 seq2 221 99 35M = 41 -215 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA 9-<9<;<<<<9;5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:102:915:87 147 seq2 222 99 35M = 65 -192 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA ;<8<;;<<<<7;<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:113:367:659 147 seq2 222 72 35M = 390 203 CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA =9====8==========:=:=====9=:=&====5 MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS218_1:2:26:211:481 147 seq2 222 99 35M = 43 -214 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:90:1906:1528 83 seq2 222 99 35M = 41 -216 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<<<<<<<<<3:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:13:100:876 147 seq2 223 73 36M = 397 210 ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <8<<<*<2<7<<<6<<<<<<6<<8<<<<5<<<<4<9 MF:i:18 Aq:i:30 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS56_63:5:117:570:971 147 seq2 223 99 35M = 413 225 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <<<<<<<<<<<<<;;;<<<<6<7;9;<:;<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:50:1203:1094 83 seq2 223 99 35M = 46 -212 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <7<<<<<5:+63<<<<<<<<<<<<<<<<2<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:107:395:312 83 seq2 224 99 35M = 44 -215 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT ;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:29:833:612 83 seq2 224 99 35M = 58 -201 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <<;<<<;<::<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:158:943:467 83 seq2 225 99 35M = 57 -203 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT <:<<;;<:5<<<<<<<<<<<<<<<<<<;<<<;<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:201:768:529 147 seq2 225 99 35M = 396 206 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT ==========================1=======; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:11:994:584 83 seq2 226 97 35M = 417 226 GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT <<<<<<<<<<<7<<<<<<<<<<<<<6<<<<<<3<6 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:206:873:186 83 seq2 227 99 35M = 66 -196 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;<<;--7<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:4:38:28:122 83 seq2 227 99 35M = 46 -216 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;9;9;-1<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:66:372:343 83 seq2 228 99 35M = 40 -223 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG ;<1;89<<<<<;<9<<<<9<<<;8<9<;<<<<<;8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:277:144:848 83 seq2 228 99 35M = 64 -199 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG <<<)63<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:21:1601:1666 83 seq2 228 99 40M = 56 -212 TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA -;;3&1<<<<<<<<<<<<1<<<</<<<<<</<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_57:1:189:503:110 83 seq2 229 79 35M = 63 -201 ATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGA =;;6:============================== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:5:257:654:116 147 seq2 231 99 35M = 64 -202 TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA 0+37<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:69:1130:832 147 seq2 231 94 35M = 50 -216 TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA 6)377;3;;;;;;;;;1;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:254:542:848 147 seq2 233 99 36M = 79 -190 CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC ,:4<8<<<<<<<<<<<<<;:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:285:489:327 147 seq2 233 99 35M = 68 -200 CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA 9;;<<8<<<<<<<<<<<<;<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:163:611:211 147 seq2 234 99 35M = 405 206 TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC ============8===============;=6;;<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:296:224:724 83 seq2 234 99 35M = 50 -219 TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC 8<<<5<<<<<<<<<<<<<<<<<<<<7<<<<<;<9< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:58:271:612 83 seq2 236 99 35M = 415 214 AGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTA <;<<<<<<<<<7<<<<<<<<<<<<<<+47<<;<:: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:15:381:715 147 seq2 237 99 35M = 72 -200 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT <<<<<<<<<<<<<<9<<<<<<97;<<<<<<<<9<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:203:419:243 83 seq2 237 99 35M = 54 -218 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:41:1281:1785 83 seq2 237 99 35M = 399 197 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT <<<<<<<<<<<<<<<<<<<<<;<<<;<<<<<<<8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:218:858:445 83 seq2 239 99 35M = 421 217 AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT ;===5=;=======;==3======9;,79==;=== MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:319:250:718 83 seq2 240 99 35M = 52 -223 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG <;:<<<<;<<<:<<<<<<49:<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:92:493:891 83 seq2 240 99 35M = 408 203 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG <<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<8 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:78:855:352 83 seq2 240 99 34M = 65 -209 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT 2<<<<<<<9<<4<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:277:921:474 83 seq2 241 99 35M = 45 -231 AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:41:199:388 83 seq2 243 99 35M = 403 195 AGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGG ;;<<<<<;;<<<<<<;;<;;<<;;<<<<<<99999 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:307:481:625 83 seq2 245 99 36M = 410 201 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:134:126:465 83 seq2 245 99 35M = 434 224 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA <<<<<<<<<<<<<;<<<<<<<<<<<<<5<<:<<41 MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:44:153:969 147 seq2 245 95 35M = 447 237 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA *:::7<77<:<<<<:<<(597:<:<9//7<529/0 MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:182:1002:639 83 seq2 246 99 35M = 77 -204 AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG <<;;9;9<<<<<<;<7;<;<<<<;;<<<;<<7;<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:54:91:1232 147 seq2 246 99 35M = 57 -224 AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:204:737:61 147 seq2 247 99 35M = 437 225 AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT <<<<<<<<<<<<<<<<<<<<<<<<<:<<9<+4:<0 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:148:170:895 147 seq2 247 99 35M = 91 -191 AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT <<9<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:46:122:479 147 seq2 248 99 35M = 87 -196 AAGTGAGAAGTTTGGAAGAACTATTTGAGGAAGTA <<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS219_1:7:16:1343:1621 83 seq2 248 99 35M = 426 213 AAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTA <<<<<<<<8<<<<;<<<;<;<<<<<<<:;4;71:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:313:531:169 83 seq2 250 99 36M = 89 -197 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT 98;<;;<<;8<<<<<<<<<<<8<<<<<<<<8<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:75:166:463 147 seq2 250 99 35M = 64 -221 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<============================== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:130:260:553 83 seq2 250 99 34M = 439 224 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC <<<<<1<<<<<<<<<<6<<81</<4*2;7:+90( MF:i:18 Aq:i:42 NM:i:2 UQ:i:31 H0:i:1 H1:i:0
+EAS56_59:2:60:677:921 83 seq2 250 96 35M = 393 178 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:60:1037:1146 83 seq2 250 99 35M = 447 232 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<<<<<<<<<<<<<<<<<<<<<;<:;;;;;;< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:17:1222:783 83 seq2 251 99 35M = 87 -199 TGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT 6<<<8<69<8199<7<<<6<<<<<<<<<1:<:<<: MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:96:491:1891 147 seq2 253 99 35M = 409 191 AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG <:<<<<<::<<<<<<<<<<<<<<<<:<<::7<<:7 MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:75:615:555 83 seq2 255 99 35M = 416 196 AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG <<<<<<<<<<<<<<<<<<<<<;<;<<<29<;.484 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:32:686:735 147 seq2 255 78 35M = 84 -206 AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG <<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:65:85:1547 147 seq2 257 99 35M = 434 212 GTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:94:1655:1921 83 seq2 258 85 35M = 447 224 TTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAA <<<8<<<<<<<<<8<<8;8<;<;<;;<<9+868<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_610:7:177:469:800 83 seq2 259 99 35M = 433 209 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA <<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<<;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:178:276:693 83 seq2 259 99 36M = 96 -199 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAAC :;<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:14:697:541 83 seq2 259 99 35M = 432 208 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA <<<<<<<<<<<<<<<<<<<:<<<<<<<;;;;8;;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:37:156:134 147 seq2 261 99 35M = 443 217 GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC ;;;;;;;;;;9;;;;;;;;;;;;;;;9;;;77679 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:215:861:605 83 seq2 262 94 36M = 107 -191 GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC ;<<<<<;:<7:<<<;<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:945:2005 83 seq2 262 99 35M = 77 -220 GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCT 7<<<<;;<<;<<<<<7<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:52:751:360 147 seq2 263 99 35M = 443 215 AAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<:76<<<<;9:;: MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:238:514:194 83 seq2 265 99 35M = 68 -232 AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT <<6<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:194:470:416 147 seq2 265 99 35M = 98 -202 AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT <<<7<<;<<<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:71:517:742 147 seq2 266 99 35M = 81 -220 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:254:617:73 83 seq2 266 99 35M = 83 -218 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<:<<<9;<<<;;<:<-<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:199:818:124 147 seq2 266 99 35M = 73 -228 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:41:653:1568 83 seq2 266 99 35M = 95 -206 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT 977979;:;<;;;;;;<<5;<;<;<<<;;;;;;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:211:84:84 83 seq2 268 99 35M = 440 207 CTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAG <<<<<<<<<<<<<<<<:<<:<<:<<<44<4<<9<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:152:355:962 147 seq2 269 99 35M = 456 222 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <;<<<<<;8<<<<<<<<<;5;;88<<3<<<<<&0; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:285:395:450 83 seq2 269 99 35M = 458 224 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <<<<<<<;<<<;<<<<<;:<:7<;<;7<7<<;;7< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:15:568:42 89 seq2 269 69 35M = 269 -35 TTTTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT !!;:<8<;<<<8<<<<<<<<8<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:2 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:15:568:42 149 seq2 269 0 * = 269 35 TTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTATA !!!!!!!!!++++!!!!!!!!!!!!!!!!!!!,!, MF:i:-64
+EAS192_3:8:6:237:885 83 seq2 269 99 35M = 433 199 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <<<<<<<<9<<<<<<<<<<<<<<<<<<<<<;;;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:5:259:250 147 seq2 269 99 35M = 115 -189 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT 8<83;<<<<<<<<<<5<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:206:994:556 73 seq2 270 75 35M = 270 0 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:206:994:556 133 seq2 270 0 * = 270 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS54_71:4:169:256:888 83 seq2 270 99 34M = 94 -210 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT &<<:<;<<;;<8<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:317:72:221 147 seq2 270 99 35M = 422 187 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC ===========;=======;;:==6=;=====;== MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:40:925:442 83 seq2 271 99 35M = 93 -213 TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT =;================================= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:158:909:321 147 seq2 271 99 35M = 453 217 TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:35:522:294 83 seq2 272 99 35M = 95 -212 TTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:176:971:874 147 seq2 273 76 35M = 432 195 TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG <<<<<<<<<<<<<:<;<<<<<<<<<<<<<5<<<<7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:226:869:36 83 seq2 273 99 35M = 461 223 TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG :<<<<,:<;:.:<<:<<717,;2171717717116 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:106:595:322 147 seq2 274 99 35M = 440 201 GAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:54:436:1452 83 seq2 275 99 35M = 108 -202 AGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:77:1780:693 147 seq2 276 99 40M = 106 -210 GGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGAT :**::799<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:147:423:584 83 seq2 277 99 35M = 451 209 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;96 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:188:782:483 147 seq2 277 99 35M = 431 189 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<7<;77 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:78:1314:1275 83 seq2 277 99 35M = 469 227 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:63:727:203 147 seq2 278 99 35M = 114 -199 AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA <<;7<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:13:1507:1146 147 seq2 278 99 35M = 84 -229 AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA 88788;,;:-:2;;;;;;;;:;:;;;;;;;;;;;; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:77:1000:1780 83 seq2 279 66 35M = 123 -191 AGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAG 777774;;4-7;;;;;;:;;;:;;;<;;;;<<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:93:490:901 147 seq2 280 99 35M = 445 200 GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA <<<<<<<<<<<<<;<<<<<<<;<<<<<:<<1+4-8 MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:227:657:95 83 seq2 280 99 35M = 458 213 GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<85 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:57:324:546 147 seq2 281 99 36M = 458 213 TAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT <<<<<<<<<<<<<<<<<<<<<:<<<8:8<<;::;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:223:440:667 147 seq2 282 99 35M = 97 -220 AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT <<;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:274:1078 147 seq2 282 99 40M = 458 216 AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC <<<2<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;::::: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:196:511:896 147 seq2 283 99 35M = 446 198 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT <<<<<<<<<<<<<<<<<<<<<<<<;<<<4<88;<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:112:729:591 147 seq2 283 99 35M = 86 -232 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:34:380:815 83 seq2 283 99 35M = 91 -227 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT ;;;;<<<<<<;<<<<;<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:117:156:84 147 seq2 285 99 35M = 95 -225 TGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAG <;;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:61:1000:1534 83 seq2 286 99 35M = 104 -217 GGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGA <<;<<<<;;<<;6;<<<;<4;<<7<<<<<;<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:22:1623:709 147 seq2 287 99 35M = 107 -215 GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC <'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:7:682:201 147 seq2 288 99 35M = 452 199 GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA <<<<<<<7<<7<<<<77&;-9<97<76<;<<993< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:91:89:666 153 seq2 289 60 35M * 0 0 GAAAACCTCTTTAGTCTTGCTAGAGATTTAGACAT 74752;;4;;;;;;;;7);;;4;;;;)4;;;;;13 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:46:13:880 83 seq2 290 99 35M = 445 190 AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC <<<<<<<<<<<<<<<<<<<<;<7<3<<<9<+;;<9 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:187:715:521 147 seq2 291 99 35M = 451 195 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<<<<<<<<<<<<:<<<<<<<;<<;<;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:210:809:735 83 seq2 291 99 35M = 93 -233 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:145:383:182 83 seq2 291 99 35M = 105 -221 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:8:89:254:332 83 seq2 291 76 35M = 124 -202 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<:<;<<<<<<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:63:816:921 83 seq2 291 99 35M = 106 -220 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:280:662:939 83 seq2 294 99 35M = 442 183 CCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAA <<<<<<<<<<<<<;<<<;;7<<<<<<<<<<<<:8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:250:628:423 147 seq2 295 99 36M = 489 230 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG <<<<<<<<<<<<<<<<<<:;<<<<:<<<<;;;;;;4 MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:255:549:422 147 seq2 295 99 35M = 456 196 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT <<<<<<<<<<<<<<<<;<<<<<<<:<<<<<<;;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:2:491:1886 89 seq2 295 75 35M * 0 0 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT <<:<8:<<<:<<<<<<<<<<<9<<<<<<<<<<<<: MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:267:821:860 147 seq2 296 99 35M = 451 189 TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG ;<<<<<8<<<<<8<<;<8<<<<<5<;<<<<<2;<5 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:42:333:516 83 seq2 296 99 35M = 109 -222 TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG <<<<<<<<7<63<7<<<<<<<<<<<7<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:119:161:322 83 seq2 297 99 35M = 479 217 CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA <<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<</6 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:48:310:473 147 seq2 298 66 35M = 123 -210 TTTAGTCTTGCTAGAGATTTAGACATCTAAATGAA 77999;;6;;;;;;;;;;;;;;;9;;;;;;;;;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:159:273:253 153 seq2 299 76 35M * 0 0 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA <<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:181:392:500 83 seq2 299 99 35M = 470 206 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA <<<<<:<<<2<<<<;5<<<<29+<<)</65<7.24 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:17:989:186 147 seq2 299 91 35M = 120 -214 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA 87;38$<3=/<==============9========= MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:33:1445:1357 147 seq2 299 85 35M = 121 -213 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA 88888;;;;;;;:;;;;;;;:;9;;;;;;;;;;;; MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:119:730:190 147 seq2 301 99 35M = 114 -222 AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGA ;;;3;<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:62:969:12 83 seq2 303 99 35M = 464 196 TCTTGCTAGAGATTTAGACATCTAAATGAAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:103:731:697 147 seq2 304 72 35M = 125 -214 CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC :::;3:<<<<<<<:<<<<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:111:142:21 147 seq2 304 99 35M = 479 210 CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC <<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<;<;9 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:319:280:57 83 seq2 306 99 35M = 467 196 TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC ;==========;=====6;=========;=<;6;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:76:205:587 147 seq2 306 99 35M = 483 212 TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:279:124:41 147 seq2 307 69 36M = 124 -219 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA :17<8<<<:&<<<<<<:;'<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:10:349:1147 153 seq2 307 74 40M * 0 0 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA :/:::<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:16 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:22:490:2011 83 seq2 307 99 35M = 485 213 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:46:173:214 147 seq2 308 99 35M = 487 214 CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA <<<<<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<; MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:283:577:398 83 seq2 308 99 35M = 488 215 CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA <<<<<<<<<<<<<<<<<<<9<<<<<<<<<;<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:27:280:592 83 seq2 310 99 36M = 484 210 AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGA <<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<5< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:11:1238:1728 147 seq2 310 99 35M = 475 200 AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAG <<7<<<<<;<<<<<<<<<<<<;<<<;<<<<<<;;< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:118:121:760 89 seq2 311 77 36M * 0 0 GAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA :<<<;;<<<<6<;<<<;<<<<;<<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:318:679:883 153 seq2 313 75 35M * 0 0 GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT <<;4<<;<:<<7<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:30:1452:1563 83 seq2 313 94 35M = 122 -226 GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT <<39<<<59<<:<<+<<<6<<:<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:189:130:136 83 seq2 314 79 35M = 494 215 ATTTAGACATCTAAATGAAAGAGGCTCAAAGAATG ==<<=================<<====<<=;=6== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:27:577:849 83 seq2 316 99 35M = 114 -237 TTAGACATCTAAATGAAAGAGGCTCAAAGAATGCC 5:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:71:478:175 83 seq2 317 99 35M = 171 -181 TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA <<<<;<96<<<<;<<<<<<<<<77<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:38:999:463 83 seq2 317 39 35M = 503 221 TAGACATCTAAATGAAAGNNGCNNNAAGAATGCCA 7<<<<<<<<:07<<:<<7!!<<!!!::<88<<<<4 MF:i:-126 Aq:i:39 NM:i:5 UQ:i:0 H0:i:0 H1:i:0
+EAS54_71:8:215:830:609 89 seq2 317 71 33M * 0 0 AAGACATCTAAATGAAAGAGGCTCAAAGAATGC +<)<:<<:<<<<<<<<<9<<<<<;<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS188_7:7:213:309:373 83 seq2 317 99 35M = 161 -191 TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA <<<86<82<<<<<<<<<<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:45:1339:1807 153 seq2 319 64 35M * 0 0 GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG 77797;;:;::&:;;0:;8;;4;;:;;6;;;;;;; MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:197:52:58 83 seq2 323 99 35M = 165 -193 TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA <7;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:8:6:104:118 83 seq2 323 99 35M = 154 -204 TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:185:96:948 147 seq2 324 99 36M = 160 -200 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATA 6<;;<;<<;<<<<<747<<<<<<<<77<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:61:346:384 147 seq2 324 68 35M = 496 207 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT <<;<<<<<<<<9<;<<9;<6<2;<6<<<;9*558; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:177:800:714 147 seq2 324 76 35M = 497 208 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT <<<<<<<<<<<<<<<<<<<<<;<<<;<;<<<<<;< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:329:339:408 83 seq2 325 99 36M = 515 226 TAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:214:565:337 83 seq2 326 99 35M = 481 190 AAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC <;<<<<<<<<<<<<<<;<<<<9<<<<<;;;;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:296:401:60 89 seq2 327 68 35M * 0 0 AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA <<*<<<<7<<)<<3<<<9<<<<<<<<<<<<<<;<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:88:1413:14 89 seq2 327 76 35M * 0 0 AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA <<<<<<<<<<<;;;<<<<<<;<;;<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:34:649:318 147 seq2 328 65 35M = 481 188 ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACAT 9<<3<<<9<<<<<<<<<7<<9<<0<<.0<*:77,; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:29:1822:1881 83 seq2 328 74 40M = 150 -218 ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA ;87;;<<<;<5<5<<<<<<<;<<<<<<<<<<<<:<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:187:199:369 153 seq2 329 74 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT ;<><<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:23:268:529 153 seq2 329 71 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT 7;<<<<<<57;-<<<<<<:<77<<<<<<<;<;<<< MF:i:32 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:315:219:7 153 seq2 330 69 35M * 0 0 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG 7==::<2=8<<<=====>888<=2=>==>,>,>>8 MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:63:5:870 83 seq2 330 75 35M = 148 -217 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG :<;<;<<<4:;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:243:557:560 147 seq2 331 75 36M = 499 204 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<9<<<<<<<<<<<<<<<<<<;<<89<<9<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:270:430:269 147 seq2 331 99 36M = 519 224 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:6:284:442:747 89 seq2 331 75 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <;<<<<<:<;<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:71:31:1973 89 seq2 331 76 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <<<<<7<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:30:466:652 147 seq2 332 98 35M = 163 -204 AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA <<<<<;3;&<<<<<<<</6<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_61:3:208:118:673 147 seq2 332 76 35M = 169 -198 AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<;;<;<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:95:1530:28 147 seq2 332 74 35M = 490 193 AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA ;;;;;;;;;;:;;;;;;;8;;;;;;;;;;;77747 MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:104:965:517 73 seq2 333 77 35M = 333 0 AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:104:965:517 133 seq2 333 0 * = 333 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS54_65:7:155:629:357 147 seq2 333 99 35M = 521 223 AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA <<<<<<<<8<8<<6<<<<<<<<;<9<5<;<;;941 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:149:572:877 83 seq2 334 99 36M = 197 -173 GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA 6<94693<;<<<<;;<<<<<<<<<<;9<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:53:544:889 83 seq2 335 76 35M = 495 195 AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA <<<<<<<<;<<<<<<<<<<<<<<<<<;<<<<<;<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:226:370:91 83 seq2 335 99 35M = 482 182 AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA 8<<<;<8<8<;<<<8<<;7<7;8784<<,;864<& MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:119:651:88 147 seq2 337 99 35M = 527 225 GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:20:592:496 147 seq2 338 75 35M = 498 195 CTCAAAGAATGCCAGGAAGATACATTGCAAGACAG <<<<<<<<<<<<<<<<<<<<<<<<<==<<<<<<:< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:214:946:229 83 seq2 339 99 35M = 165 -209 ACAAAGAATGCCAGGAAGATACATTGCAAGACAGA )+<<<*<<77;8<;7<<8<4<;<88<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS188_7:5:163:982:695 83 seq2 339 77 35M = 499 195 TCAAAGAATGCCAGGAAGATACATTGCAAGACAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:14:1872:1521 147 seq2 339 62 35M = 500 196 TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA 7<<<<77<<<3<3<7.'<<<<<7<67<+.0%4*<4 MF:i:18 Aq:i:2 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS192_3:4:293:168:240 147 seq2 340 99 35M = 167 -208 CAAAGAATGCCAGGAAGATACATTGCAAGACAGAC +;;;;<8<<86<<<<<<<;;8;7;<;<8<8;<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:86:697:941 83 seq2 341 99 35M = 187 -189 AAAAAAATCCCGGAAGATACATTGCAAGACAGACT 1<<%<<<1:<58<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:4 UQ:i:67 H0:i:0 H1:i:0
+EAS54_71:4:14:88:306 83 seq2 341 99 34M = 521 215 AAAGAATGCCAGGAAGATACATTGCAAGACAGAC <<<<<<8<<<<<<;<<<3<<<8<<;<;;<15<:6 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:183:697:555 147 seq2 341 84 35M = 505 199 AAAGAATGCCAGGAAGATACATTGCCAGACAGACT =====================:===&==:;==5;; MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_57:3:41:739:907 147 seq2 344 99 35M = 520 211 GAATGCCAGGAAGATACATTGCAAGACAGACTTCA <<<<<<<<<<<<<<<<<<<<<<<<;<9<<<;;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:100:1147:124 83 seq2 345 99 35M = 150 -230 AATGCCAGGAAGATACATTGCAAGACAGACTTCAT <<<<96<<<<<<<<<<<<<<<<<<<<<<:<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:127:828:697 83 seq2 346 99 35M = 552 241 ATGCCAGGAAGATACATTGCAAGACAGACTTCATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:62:125:888 147 seq2 347 99 35M = 504 192 TGCCAGGAAGATACATTGCAAGACAGACTTCATCA <<<<<<<<<<<<<<<<<<<::<<<:7<::<:;<<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:1:1598:843 147 seq2 347 99 40M = 500 193 TGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATA <<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<8<4:8:: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:71:83:58 83 seq2 349 77 35M = 148 -236 CCAGGAAGATACATTGCAAGACAGACTTCATCAAG 8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:88:1454:418 147 seq2 349 99 35M = 522 208 CCAGGAAGATACATTGCAAGACAGACTTCATCAAG :<<:<<<<<<<<<<<::::<:<:<9<5<<<<<<8: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:36:649:554 147 seq2 350 99 35M = 523 208 CAGGAAGATACATTGCAAGACAGACTTCATCAAGA <<<<<4<<8<<<<<<8<6<<88<<<<<<<-;<;0; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:189:831:878 147 seq2 351 99 35M = 555 239 AGGAAGATACATTGCAAGACAGACTTCATCAAGAT :<<<2<<<<<<<<<<:8<8<<<<<<<<<<87489; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:14:1211:1332 83 seq2 351 99 35M = 178 -208 AGGAAGATACATTGCAAGACAGACTTCATCAAGAT 978961;;991;97;<;;<;<<;;;;;<;;<:8:< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:328:537:640 147 seq2 352 99 35M = 185 -202 GGAAGATACATTGCAAGACAGACTTCATCAAGATA ;:<<;<<<<<::<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:85:361:418 83 seq2 353 99 36M = 517 200 GAAGATACATTGCAAGACAGACTTCATCAAGATATG <<<<<<<<<<<<<;<<<<<<<<<<<<<<;4;<<<<3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:329:437:643 83 seq2 354 99 36M = 540 222 AAGATACATTGCAAGACAGACTTCATCAAGATATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<<<1 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:135:354:66 147 seq2 356 99 35M = 188 -203 GATACATTGCAAGACAGACTTCATCAAGATATGTA ;;;;7<<<<:<<<<;<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:9:648:712 147 seq2 358 99 35M = 182 -211 TACATTGCAAGACAGACTTCATCAAGATATGTAGT *;0;;;95<<<<7<<<;;<<<;;<<<<;<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1184:994 147 seq2 358 99 35M = 518 195 TACATTGCAAGACAGACTTCATCAAGATATGTAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<8< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:50:30:15 147 seq2 358 10 35M = 192 -201 TACATTGCAAGACAGTCGTCAGCAAGATATGTAGT 1-%-22&&)&11,&/&&176<&<<<222<,6,<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:26 H0:i:0 H1:i:0
+EAS51_66:4:322:350:374 147 seq2 360 99 35M = 546 221 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:41:745:603 147 seq2 360 99 35M = 536 211 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <<<<<<<<<<<<:<<<<<<<<<<<<<<<6<:8<<: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:138:186:459 147 seq2 360 97 35M = 518 193 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <*<<7<<0<7<<+<-:<<&<:6:4:0-:<<2.:5< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:41:1308:619 83 seq2 360 99 35M = 184 -211 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA 0<9476<<<<<0<<<2<&<0<.<<<<<<<<<.<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:125:884:276 147 seq2 362 99 35M = 541 214 TTGCAAGACAGACTTCATCAAGATATGTAGTCATC <<<<<<<<<<<8<<<<<<<<<<<<<<<<<<;;<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:156:21:69 83 seq2 362 99 35M = 163 -234 TTGCAAGACAGACTTCATCAAGATATGTAGTCATC <:3:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:66:1381:181 147 seq2 362 99 40M = 544 222 TTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACT <<6<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<::4:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:11:1261:1200 147 seq2 362 99 35M = 558 231 TTGCAAGACAGACTTCATCAAGTTATGTAGTCATC <<<<<<<<<<<;<<<<<<<<;<<<;<:<<8<<:<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_99:5:191:885:623 147 seq2 363 99 35M = 551 223 TGCAAGACAGACTTCATCAAGATATGTAGTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:53:783:78 83 seq2 363 99 35M = 561 233 TGCAAGACAGACTTCATCAAGATATGTAGTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<;<<;<7;<:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:177:24:389 83 seq2 365 99 35M = 175 -225 CAAGACAGACTTCATCAAGATATGTAGTCATCAGA +<<;<9<<<9<<;<<7<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:58:684:520 83 seq2 367 99 35M = 538 206 AGACAGACTTCATCAAGATATGTAGTCATCAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:71:187:824 83 seq2 367 99 35M = 534 202 AGACAGACTTCATCAAGATATGTAGTCATCAGACT ;===;======3==;==========4=;=7;;3;6 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:324:238:736 83 seq2 367 99 35M = 180 -222 AGACAGACTTCATCAAGATATGTAGTCATCAGACT <<<9<<<70,<<4<<<<<7<4<7<<<<<0<<<<<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:19:306:982 83 seq2 368 99 35M = 538 205 GACAGACTTCATCAAGATATGTAGTCATCAGACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:168:829:88 83 seq2 369 99 35M = 205 -199 ACAGACTTCATCAAGATATGTAGTCATCAGACTAT <,,;<838883;;;<<<<<;<8<8;<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:122:589:134 147 seq2 369 99 35M = 562 228 ACAGACTTCATCAAGATATGTAGTCATCAGACTAT <<:<<:<:<<<<<:<8<<<<<<<:<::<<<4:<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:303:970:243 147 seq2 370 99 35M = 564 229 CAGACTTCATCAAGATATGTAGTCATCAGACTATC <<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<8<8< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:19:736:559 147 seq2 370 99 35M = 209 -196 AAGACTTCATCAAGATATGTAGTCATCAGACTATC )<7<2;;4<<4<<<<;<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS51_66:3:246:711:981 83 seq2 371 99 35M = 559 223 AGACTTCATCAAGATATGTAGTCATCAGACTATCT <<<<<<<<;<<<<:;<<;;<:<<<4<<:4;00<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:89:1164:573 83 seq2 371 99 35M = 560 224 AGACTTCATCAAGAGATGTAGTCATCAGACTATCT <:<<;<2<<<<<<<&:2<;<;<<<<;,+;:<<4:< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS220_1:8:18:1757:95 147 seq2 374 45 35M = 216 -193 CTTCATCAAGATATGTAGTCATCAGACTATCTAAA <<<6<&:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:284:597:682 83 seq2 375 99 35M = 557 217 TTCATCAAGATATGTAGTCATCAGACTATCTAAAG <<<<<<<9<<<<<;<<6<<<<<;<9<<<<<<1;;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:10:394:392 83 seq2 376 99 35M = 542 201 TCATCAAGATATGTAGTCATCAGACTATCTAAATT <<<<<<<<<<<<<<<<<<<:<<<<<<;<<;;:6&; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:5:28:538:148 147 seq2 376 99 35M = 557 216 TCATCAAGATATGTAGTCATCAGACTATCTAAAGT <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<+771; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:60:590:1760 147 seq2 376 99 35M = 201 -210 TCATCAAGATATGTAGTCATCAGACTATCTAAAGT <8<-<<<<<<<82<<<4<<<<<<<<<<<<<8<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:1158:535 83 seq2 377 99 40M = 213 -204 AATAAAGATATGTAGTCATCAGACTATCTAAAGTCAACAT +;6+;<;<<<<<<<<<0<<;<<<;<<<8<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:2 UQ:i:20 H0:i:1 H1:i:0
+EAS188_7:3:182:104:921 83 seq2 378 99 35M = 575 232 ATCAAGATATGTAGTCATCAGACTATCTAAAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:160:173:889 83 seq2 379 99 35M = 215 -199 TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA ;)<</<8<<<<<<</<;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:71:311:202 83 seq2 379 99 35M = 188 -226 TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA ;6<;<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:315:201:673 147 seq2 381 45 36M = 542 197 AAGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:228:915:631 147 seq2 381 66 35M = 547 201 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA =================;==========4====== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:228:736:747 147 seq2 381 68 35M = 542 196 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA <<<<<<<<<;<<<<<<<;;<<;<<<<;::<;;7;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:263:689:572 83 seq2 381 68 35M = 553 207 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA <<<<;<<<<<;<<<<<<&;;<<<;<<:<+;;7;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:81:685:141 147 seq2 382 85 35M = 207 -210 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT ;+;(;)..=3.1=.7=;=8;==<4====;====== MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS114_32:1:208:971:600 147 seq2 382 99 35M = 559 212 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<8<<:<<<0;44<<:4<:< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:7:1864:1569 83 seq2 382 99 35M = 561 214 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<<<<<<<<<<:<<<8<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:224:592:744 147 seq2 383 99 35M = 188 -230 GATATGTAGTCATCAGACTATCTAAAGTCAACATG 6<6<<<<<<9+<6-<<<:<:<:<<<<<:<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:6:25:949:33 147 seq2 383 99 35M = 201 -217 GATATGTAGTCATCAGACTATCTAAAGTCAACATG -<4<666<<-7<5<<<<<(<<<<<<<<<<<<<<-< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS54_73:5:271:874:367 147 seq2 384 99 35M = 560 211 ATATGTAGTCATCAGACTATCTAAAGTCAACATTA <<<<<<<<<<<<<<4<;<;<:<;4<4<<99<7<+% MF:i:18 Aq:i:51 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS139_19:4:26:1312:1400 147 seq2 385 99 40M = 207 -218 TATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAA ::77:<;:+6<+<<<;<<74<<<;<<;<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS51_66:6:310:747:415 83 seq2 387 99 35M = 217 -205 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG ;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+EAS56_57:6:4:223:776 83 seq2 387 93 35M = 203 -219 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG <;9<;<0<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+EAS114_28:3:32:492:907 83 seq2 387 95 36M = 571 220 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGGA <<<<<<<<<<<<<<<<<<<;<;;<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_26:4:110:840:431 147 seq2 388 93 35M = 567 214 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA =====================5:======54=+3+ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_45:6:86:693:234 83 seq2 388 82 35M = 202 -221 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA 83997;<;;;;98;;3*6<<;<:8;;;;;<;;<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:3 H1:i:13
+EAS139_11:8:96:1314:1448 83 seq2 388 93 35M = 213 -210 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA <<<<7<<:<<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:3 H1:i:8
+EAS114_30:6:41:461:436 83 seq2 389 74 35M = 200 -224 TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA ;<986<;6<<<<<<<;<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:13
+EAS221_3:8:55:932:613 147 seq2 389 77 35M = 568 214 TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA <<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:10
+EAS1_97:5:219:174:684 147 seq2 390 71 35M = 560 205 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<8<8<<<7<<;<<<<<2<;&;;;;9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS56_57:5:24:284:360 147 seq2 390 76 35M = 567 212 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<<<<<<<;<<<<<<<;<9;<;99;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS114_26:1:113:367:659 83 seq2 390 72 35M = 222 -203 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<5<0&9;<3<<<<<9<<<<4<;<9<9<<<<7<3< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:17
+EAS114_32:5:109:199:592 147 seq2 390 72 35M = 576 221 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<;:<;;<<:;6<<;:;:<<+;;;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS114_45:4:88:55:1187 147 seq2 391 66 35M = 220 -206 GTCATCAGACTATCTAAAGTCAACATGAAGGAAAA 7769,7;;;;;;;;;;;;;;9;;;;;;;;;;;;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:7
+EAS56_59:2:60:677:921 147 seq2 393 96 35M = 250 -178 CATCAGACTATCTAAAGTCAACATGAAGGAAAAAA ========9==;======8==>============= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:4 H1:i:13
+EAS114_39:3:88:84:1558 147 seq2 394 95 35M = 203 -226 ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA ;;<<;<<;<<5<<<<<<;<<:<<<;<<<<<<;<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:2 H1:i:3
+EAS56_59:2:201:768:529 83 seq2 396 99 35M = 225 -206 CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT 3<:<9<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:13:100:876 83 seq2 397 73 36M = 223 -210 AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT ;9<$<<<$<<<<<<<<75<<<<<<<9<9<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:6 H0:i:1 H1:i:1
+EAS139_11:4:26:137:1382 83 seq2 397 99 35M = 579 217 AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC <<<<<<7<<<77<<<<<<</<<+<<<<<<7<+<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_67:3:197:261:624 83 seq2 398 99 35M = 587 224 GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT <<<<<<<<<<<;<<<<<<<;<<;<<<<<<;<<<9< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS218_4:3:41:1281:1785 147 seq2 399 99 35M = 237 -197 ACTATCTAAAGTCAACATGAAGGAAAAAAATTCTA <6<<<6<<<<<<:<<6<:<<<<<<<<<<<<6<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_610:5:51:904:391 83 seq2 401 97 35M = 212 -224 TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA ;<96<<<<<<7<<7<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_63:7:137:139:248 147 seq2 401 97 35M = 569 203 TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA <<<<<<<<<9<<<<<<<<<<;<<<<<<<;;<;<;< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:3 H1:i:2
+B7_610:7:15:696:693 147 seq2 403 34 35M = 570 202 TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT 2:+:7<<3<<<<<6+36<<<<<<<6<<6&<<;<.7 MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS114_45:2:41:199:388 147 seq2 403 99 35M = 243 -195 TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT 84898;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:163:611:211 83 seq2 405 99 35M = 234 -206 TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA <<<<9<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:114:19:769 147 seq2 405 90 35M = 572 202 TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA <<<<<*2;6;<<<4.;;<&;;<.<40)<);5-/7; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS51_64:7:92:493:891 147 seq2 408 99 35M = 240 -203 AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA <383<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:5:996:2000 147 seq2 408 99 35M = 575 202 AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_93:1:179:629:513 83 seq2 409 99 35M = 220 -224 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA <;,<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:84:1505:1037 83 seq2 409 99 35M = 586 212 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA <<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<::) MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS221_1:6:96:491:1891 83 seq2 409 99 35M = 253 -191 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA :;5<<7<;:<<;<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:307:481:625 147 seq2 410 99 36M = 245 -201 TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA ;4<<4<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+B7_610:5:120:596:847 83 seq2 410 83 35M = 211 -234 TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAG ;/<<:<;<<<<<<<<<<<<<;;<<<<<;<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:3:3:864:1888 83 seq2 411 99 35M = 579 203 CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA ;<<;;<<;;;<;;<<;<;<<;<<;8<<:<;79799 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:34:1614:558 83 seq2 411 99 35M = 569 193 CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA <<<<<<<<<<<7<<<<<8<<<<<<2<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:117:570:971 83 seq2 413 99 35M = 223 -225 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <,<9<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS112_34:8:45:800:733 147 seq2 413 99 35M = 607 229 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <<<</<<<<<<<<<<<<<<<2<9<<<<<5*5;599 MF:i:18 Aq:i:34 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS219_FC30151:7:87:1289:83 147 seq2 413 99 35M = 585 207 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<<<: MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:4:58:271:612 147 seq2 415 99 35M = 236 -214 ATGAAGGAAAAAAATTCTAAAATCAGCAAGAGCAA ;:2=<<;<<<<<<:67:<<:<<<<<<<<<<<<,<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:11 H0:i:0 H1:i:2
+EAS1_108:1:33:779:821 147 seq2 416 99 35M = 579 198 TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS112_34:6:75:615:555 147 seq2 416 99 35M = 255 -196 TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA ;<<<;<<<<<<<<<:;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS188_7:6:11:994:584 147 seq2 417 97 35M = 226 -226 GAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAG <<<<;<<<<<<<;<:<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS114_26:7:218:858:445 147 seq2 421 99 35M = 239 -217 GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA ;<<<<<<<8;:<<<<<<;<<:<<<<<<<<<<<<;< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_81:2:317:72:221 83 seq2 422 99 35M = 270 -187 AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC =========:======;==;=============== MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:70:766:2016 147 seq2 422 99 35M = 607 220 AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS56_53:4:45:707:147 83 seq2 424 99 35M = 216 -243 AAAAATTCTAAAATCAGCAAGAGAAAAGCATACAG <<<<<<;3<<<<<4;<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:16:1343:1621 147 seq2 426 99 35M = 248 -213 AAATTCTAAAATCAGCAAGAGAAAAGCATACAGTC ;<<9;7=====;;==<==================< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:184:912:258 83 seq2 428 99 35M = 582 189 ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:119:38:945 147 seq2 428 99 35M = 221 -242 ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT =;;8=====:========<================ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:95:235:746 147 seq2 430 99 35M = 598 203 TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT <<<<;<<<<<<<<79<<<<<<<<<<<<<<*;;;<9 MF:i:18 Aq:i:72 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS1_99:2:188:782:483 83 seq2 431 99 35M = 277 -189 CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA 7<<<<<<4<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:39:348:594 147 seq2 431 99 35M = 600 204 CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA <<;<<<<<<<<<;<;;<<<<<<<<<<;<<<:<:<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:176:971:874 83 seq2 432 76 9M1D26M = 273 -195 TAAAATCAGAAGAGAAAAGCATACAGTCATCTATA <<<<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:3:14:697:541 147 seq2 432 99 35M = 259 -208 TAAAAGCAGCAAGAGAAAAGCATACAGTCATCTAT 8<<<<&6<;8<<<<<<<<<<<<;<<<<;<<<<<<8 MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_610:7:177:469:800 147 seq2 433 99 35M = 259 -209 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA =<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:131:518:588 147 seq2 433 99 35M = 607 209 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<1<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:8:6:237:885 147 seq2 433 99 35M = 269 -199 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA <<<<1:<;:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:134:126:465 147 seq2 434 99 35M = 245 -224 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA <<;:&<3)<<7<:<<<<.:<<<<<8<<<<<<<<<< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:104:402:732 147 seq2 434 99 35M = 610 211 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA =========================7=;===;=:= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:65:85:1547 83 seq2 434 99 35M = 257 -212 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA <<<<<<;:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:85:686:696 147 seq2 435 99 35M = 594 193 AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA ==================<=====:==<=<;=:== MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:144:242:602 147 seq2 436 99 36M = 611 211 ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG ========================;=====<;;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:204:737:61 83 seq2 437 99 35M = 247 -225 TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG (7=72=;==2=====<===<<============== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:124:253:889 147 seq2 437 99 35M = 598 196 TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG <<<<<<6<<:<<<<<<<<<<<<<;;<<;<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:310:155:312 147 seq2 438 99 35M = 606 203 CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA ;<<<;<<<8<<<<<<<<<<<<;<<<<<8<<<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:78:692:671 83 seq2 438 99 35M = 610 207 CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA <<<<<<<<<<<<<;<<<<<<<:<<:<<<:8<<0;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:130:260:553 147 seq2 439 99 35M = 250 -224 AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA <*;<<7<);<<;9;<5<*<9<;<<;;<7<<<<<1< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:60:163:1612 147 seq2 439 99 35M = 617 213 AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA <<<<<<<<<21<<<<<<<<<3<--<+<<<+<<63< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:106:595:322 83 seq2 440 99 35M = 274 -201 GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA ;+<<<<<<<<<<<<<<<<<<;<<7<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:211:84:84 147 seq2 440 99 35M = 268 -207 GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA 6:<<:<<<<<<9<<<<<<<<<<<;<<<;;;<;<3; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:280:662:939 147 seq2 442 99 35M = 294 -183 AAGAGAAAAGCATACAGTCATCTATAAAGGAAATC <<;<;<<<<<:<<<;<<<;<<;<<<<<<<<<<<;< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:52:751:360 83 seq2 443 99 35M = 263 -215 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC <-<9<<<<<6<<<8<<;;<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:234:167:381 147 seq2 443 99 35M = 625 217 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<;;7<;; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:37:156:134 83 seq2 443 99 35M = 261 -217 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC 99998<<<<:<<<<<<<;<<><<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:93:490:901 83 seq2 445 99 35M = 280 -200 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<;<<<;<<<;<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:96:489:453 83 seq2 445 99 35M = 625 215 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:46:13:880 147 seq2 445 99 35M = 290 -190 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA =&====8==========0================= MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:167:905:852 147 seq2 445 99 36M = 647 238 AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT <<<7<<<<<<<<<<<<<<:<:<<:::&.<:<66:3< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS219_FC30151:3:13:674:1717 147 seq2 445 99 35M = 623 213 AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<%<<<<<<<<<<<<<<<<<<<;:;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS51_62:7:196:511:896 83 seq2 446 99 35M = 283 -198 GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT 8<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:154:118:488 147 seq2 447 99 35M = 624 212 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<<<<<<<<<<<<<<:7<<<<7<:;;:: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:44:153:969 83 seq2 447 95 35M = 245 -237 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<5<:7<72<51<7<*79<<<<<5<<<<<<<<<2< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:215:246:640 83 seq2 447 99 36M = 624 213 AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:94:1655:1921 147 seq2 447 85 35M = 258 -224 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<;:===<==;<==<;================; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:60:1037:1146 147 seq2 447 99 35M = 250 -232 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:23:536:229 83 seq2 448 99 35M = 614 201 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<:<8<:<<;<<<<<<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:130:865:838 147 seq2 448 99 35M = 649 236 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:239:1001:406 83 seq2 450 99 35M = 634 219 AGCATACAGTCATCTATAAAGGAAATCCCATCAGA <<<<<<7<<<<<<<<8<;<<<7<<<<36<<3<:33 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:147:423:584 147 seq2 451 99 35M = 277 -209 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA 27<;<3<<<+<<;<<<;;-4<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:187:715:521 83 seq2 451 99 35M = 291 -195 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <7<:<9<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:172:196:746 83 seq2 451 99 35M = 620 204 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:267:821:860 83 seq2 451 99 34M = 296 -189 GCATACAGTCATCTATAAAGGAAATCCCATCAGA $&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS56_61:7:7:682:201 83 seq2 452 99 35M = 288 -199 CATACAGTCATCTATAAAGGAAATCCCATCAGAAT 0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:82:13:897 147 seq2 453 99 35M = 606 188 ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA <<<<;<<<<<<;<;<;5<51;<1<<<<%<<<<,58 MF:i:18 Aq:i:41 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS56_53:6:180:695:621 83 seq2 453 99 35M = 637 219 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:158:909:321 83 seq2 453 99 35M = 271 -217 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:237:497:165 83 seq2 454 99 35M = 619 200 TACAGTCATCTATAAAGGAAATCCCATCAGAATAA 8===<8===========37=<===7=;7=8===== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:152:355:962 83 seq2 456 99 35M = 269 -222 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<.9.<;+;<;<<<<<<<<<<::<<:<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:4:255:549:422 83 seq2 456 99 35M = 295 -196 AAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<;;+<;4;<<<<<<<<<<<;<;<<;<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:2
+EAS220_1:4:100:20:1199 147 seq2 456 99 35M = 614 193 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA 7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:71:408:741 147 seq2 457 99 35M = 637 215 AGTCATCTATAAAGGAAATCCCATCAGAATAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:285:395:450 147 seq2 458 99 35M = 269 -224 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT 8)3<8+;<)<<<<<<<<97:7<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:4:854:140 83 seq2 458 72 35M = 638 215 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<6<<<:<6<<<:36:<<<<3<<8:.6<38::4< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:227:657:95 147 seq2 458 99 35M = 280 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT ;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:57:324:546 83 seq2 458 99 36M = 281 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAATG ;;5<;,<<<;;<<<<<<<97<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:274:1078 83 seq2 458 99 40M = 282 -216 GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT 9:*:64<<;<<<<<<<<<;8;<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:636:642 147 seq2 458 99 35M = 630 207 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:226:869:36 147 seq2 461 99 35M = 273 -223 ATATATAAAGGAAATCCCATCAGAATAACAATGGG <0/)</<<<:<<<<<)<<7<<<<<+55<<1<<<:< MF:i:18 Aq:i:59 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS192_3:4:312:915:751 83 seq2 461 99 35M = 621 195 ATCTATAAAGGAAATCCCATCAGAATAACAATGGG <2<<<<<<<8;<<<<<<<<:<<<<8<<<<<84,4: MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:96:899:106 83 seq2 462 99 35M = 636 209 TCTATAAAGGAAATCCCATCAGAATAACAATGGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:62:969:12 147 seq2 464 99 35M = 303 -196 TATAAAGGAAATCCCATCAGAATAACAATGGGCTT <<;<;<::<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:67:56:806 83 seq2 464 99 35M = 637 208 TATAAAGGAAATCCCATCAGAATAACAATGGGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<:7: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:37:611:267 83 seq2 464 99 35M = 610 181 TATAAAGGAAATCCCATAAGAATAACAATGGGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_93:7:319:280:57 147 seq2 467 99 35M = 306 -196 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:96:720:940 147 seq2 467 99 35M = 654 222 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<;<<<<<<<<<<;9<<8<<6<;:;<;;.;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:59:286:290 83 seq2 467 99 35M = 628 196 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<<;<<<;<<<<<<<<<<<<<;;;<<;7;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:236:841:20 147 seq2 467 99 35M = 652 220 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<<<<<<<<<<<7<<<<:<<9<<<<;<:<9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:49:656:507 83 seq2 468 99 35M = 637 204 AAGGAAATCCCATCAGAATAACAATGGGCTTCTCA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:78:1314:1275 147 seq2 469 99 35M = 277 -227 AGGAAATCCCATCAGAATAACAATGGGCTTCTCAG <<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<<<1< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:181:392:500 147 seq2 470 99 35M = 299 -206 GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC /5<<;(88<<<;<;<<6<<<<<7<<<<<<<7<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:133:8:379 147 seq2 470 99 35M = 653 218 GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC <<<<<<<<<<<<<<<<<<<<<<<<8;<<8<<<:6< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:198:929:684 147 seq2 471 99 35M = 624 188 GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA <7<<<<;<<<<<<<<<<<<;<<<<<:<<<<::<:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:181:582:435 83 seq2 471 99 35M = 629 193 GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:214:784:690 83 seq2 472 99 35M = 657 220 AAATCCCATCAGAATAACAATGGGCTTCTCAGCGG <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<4<44 MF:i:18 Aq:i:30 NM:i:1 UQ:i:19 H0:i:1 H1:i:0
+EAS114_39:3:11:1238:1728 83 seq2 475 99 35M = 310 -200 TCCCATCAGAATAACAATGGGCTTCTCAGCGGAAA :677<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS112_34:4:12:273:89 147 seq2 477 99 35M = 631 189 CCATCAGAATAACAATGGGCTTCTCAGCGGAAACC ==========<====:=========+===4414;; MF:i:18 Aq:i:71 NM:i:1 UQ:i:28 H0:i:1 H1:i:0
+EAS56_63:2:119:161:322 147 seq2 479 99 35M = 297 -217 ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT <83<;<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:2:111:142:21 83 seq2 479 99 35M = 304 -210 ATCAGAATAACAATGGGCTTCACAGCGGAAACCTT ;88<:<;;<6<;;<<<:<<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:28 NM:i:2 UQ:i:53 H0:i:0 H1:i:0
+EAS1_99:1:34:649:318 83 seq2 481 65 35M = 328 -188 AAGAATAACAATGGGCTTCACAGCGGAACCCTTAC )<7<<3<<<<<<+<1<;<8&<<<<<<<<<<<<<<< MF:i:-126 Aq:i:65 NM:i:3 UQ:i:59 H0:i:0 H1:i:0
+EAS114_30:6:214:565:337 147 seq2 481 99 35M = 326 -190 CAGAATAACAATGGGCTTCTCAGCAGAAACCTTAC ;;<;<1<9<<<8<<<<<;<<<<<<8<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:226:370:91 147 seq2 482 99 35M = 335 -182 AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA <':<6<;<<<;2<;<-7;;;<<<<<<<;;;<<7;< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:6:13:682:680 83 seq2 482 99 35M = 685 238 AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA <<<<<<<<<<<<<:<<<<<<<<<<;<;<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:2:273:348:37 147 seq2 483 99 36M = 688 241 GAATAACAATGGGCTTCTCAGCAGAAACCTTACACG <<<<<<<9<49<<<;<<<<*<<19<15;<</5<;.5 MF:i:18 Aq:i:41 NM:i:1 UQ:i:13 H0:i:1 H1:i:0
+EAS139_11:8:76:205:587 83 seq2 483 99 35M = 306 -212 GAATAACAATGGGCTTCTCAGCGGAAACCTTACGA 8<<5<<<<<<<<<<<<<<<<<<<<<<<<<7<<</< MF:i:18 Aq:i:28 NM:i:2 UQ:i:41 H0:i:0 H1:i:0
+B7_591:2:27:280:592 147 seq2 484 99 36M = 310 -210 AATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC <<<<<<<<<<<8<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_99:7:171:196:287 147 seq2 485 99 35M = 658 208 ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC <<<<<<<<<<<<<<<<<<<<<;6<<<<<<2:8<0: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:224:579:433 147 seq2 485 99 35M = 662 212 ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC <<<<<<<<<<<<<<<<<:<<<<<<<<<<<8<+8;: MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:22:490:2011 147 seq2 485 99 35M = 307 -213 ATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC <7<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_65:6:46:173:214 83 seq2 487 99 35M = 308 -214 AACAATGGGCTTCTCAGCAGAAACCTTACAAGCCA <<2<<<<<<<<<<<5<<5<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:4 H1:i:6
+EAS1_103:4:164:79:134 83 seq2 488 99 35M = 656 203 ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_32:2:283:577:398 147 seq2 488 99 35M = 308 -215 ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG ;8;;&<<<;<;67<;<;<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:29 NM:i:1 UQ:i:27 H0:i:0 H1:i:2
+EAS54_67:5:149:639:910 147 seq2 489 99 35M = 669 215 CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA <<<<<<<<<<<<<<<<<<<<<<<<7<;;<<;<<;< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:250:628:423 83 seq2 489 99 36M = 295 -230 CAATGGGCTTCTCAGCGGAAACCTTACAAGCCAGAA +<<4;;9;;7.;7<;7<;<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:1:242:419:512 147 seq2 490 94 35M = 672 217 AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA <<8<<<<<<<<<<<<<<<<<<<<<<<<;<8<(<30 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_45:1:95:1530:28 83 seq2 490 74 35M = 332 -193 AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA 77741(9;;994;5;;4;;1;;;;;1;<;<<<<;< MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:42 H1:i:45
+EAS192_3:6:326:887:180 147 seq2 492 73 35M = 672 215 TGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGC ;<<<<<;<<<<<<<<<8<<<<<<<<<<<<0<;;<+ MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:3 H1:i:7
+EAS1_99:1:86:871:319 83 seq2 494 71 35M = 651 192 GGCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGA <<<<<:<<<:<:<<<<<<<<<<<<8<<:<1;<::) MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:0 H1:i:4
+EAS56_57:1:189:130:136 147 seq2 494 79 35M = 314 -215 GGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGA 823;23<7<57<7<<<<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:63 H1:i:85
+EAS51_64:7:140:752:822 83 seq2 495 76 35M = 667 207 GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT <<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<;<:; MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:5
+EAS56_57:5:53:544:889 147 seq2 495 76 35M = 335 -195 GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT ,<;<<<;<<<<<<<<<:;;<<<<<;;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:2 H1:i:32
+EAS54_65:4:61:346:384 83 seq2 496 68 35M = 324 -207 CAACTAAGAAGAAACCTTACAAGCCAGAAGAGATT 7&$+&,<<+;;<;;<<6<<8<<<;<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:19 H0:i:1 H1:i:53
+EAS54_81:8:177:800:714 83 seq2 497 76 35M = 324 -208 TTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTG =;3=+=<:=<========8================ MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:29 H1:i:85
+B7_597:6:20:592:496 83 seq2 498 75 35M = 338 -195 TCTCAGCGGAAACCTTACAAGCCAGAAGAGATTGG 97<7;<;<;<<<<;<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:5 H1:i:48
+B7_591:5:243:557:560 83 seq2 499 75 36M = 331 -204 CTAAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT 69&<;&<&<<;6.<<<+<<<;;<<<<<<<<;<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:9
+EAS188_7:5:163:982:695 147 seq2 499 77 35M = 339 -195 CTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGA <:<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:7 H1:i:42
+EAS139_19:1:1:1598:843 83 seq2 500 99 40M = 347 -193 TCAGCGGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT 1)::6::<<;<98<<<<<<9<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:25 H0:i:1 H1:i:0
+EAS139_19:6:78:1029:512 147 seq2 500 99 40M = 656 196 TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT <0:;<<<<<<<<<:<<:;<<<;<7<<;<7;;;:6;::672 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:14:1872:1521 83 seq2 500 62 35M = 339 -196 TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT /1<%73&7<1<3577,<<<7/733<<<<<<<<1<< MF:i:18 Aq:i:2 NM:i:2 UQ:i:9 H0:i:1 H1:i:8
+EAS221_3:6:51:1486:1131 147 seq2 500 77 35M = 685 220 TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT <<<<<<<<<;<<<<<<<<<1<5<<8<<<'<;<<;1 MF:i:18 Aq:i:3 NM:i:0 UQ:i:0 H0:i:22 H1:i:22
+EAS192_3:6:45:183:25 147 seq2 501 95 35M = 672 206 CAGCGGAAACCTTACAAGCCAGAAGAGATTGGATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<86;<;:; MF:i:18 Aq:i:23 NM:i:1 UQ:i:27 H0:i:0 H1:i:2
+B7_597:4:38:999:463 147 seq2 503 39 35M = 317 -221 GCGGAAACCTTACAAGCCAGAAGAGATTGGATCTA .*:&<<0<0!<<+<<<<<<<<<<<<<0<<<<<<<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:25 H0:i:0 H1:i:1
+EAS114_45:1:30:1882:1210 147 seq2 503 82 35M = 665 197 GCAGAAACCTTACAAGCCAGAAGAGATTGGATCTA ;;::;;;;:;;;;;:;;;;;;9;;:7;;8:77777 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_108:6:222:579:961 147 seq2 504 99 35M = 679 210 CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<<<<<<<7<<:7;;;68 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:92:875:345 147 seq2 504 99 35M = 690 221 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_63:8:62:125:888 83 seq2 504 99 35M = 347 -192 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA ,;3<<<8;;3<,<<<8;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:2:23:127:880 83 seq2 504 99 35M = 686 217 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_66:8:43:972:506 147 seq2 505 99 35M = 686 216 AGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT <;<<<<<<<<<<<<6;<;<<<<<<<<<<:;;<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:183:697:555 83 seq2 505 84 35M = 341 -199 AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT <<<;&,.;);&96<84<<81<<&<<<9<<8<8<<1 MF:i:18 Aq:i:37 NM:i:2 UQ:i:16 H0:i:0 H1:i:1
+EAS221_3:8:65:463:703 83 seq2 506 99 35M = 693 222 GAAACCTTACAAGCCAGAAGAGATTGGATCTAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:101:752:996 147 seq2 508 99 35M = 687 214 AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT <<<<<<<<<<<<<<<;<<<<<9<<<<<<;<<;;;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:267:953:459 83 seq2 509 99 35M = 667 193 ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT <<<<<<<<<9<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:33:1240:846 83 seq2 509 99 35M = 685 211 ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT <<<<<<<<<<<<7<<2<;<<;<<<;<<<:6:<<<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:135:401:735 83 seq2 510 99 35M = 703 228 CCTTACAAGCCAGAAGAGATTGGATCTAATTTTTG <<<<<<<<<<<<<<<<<<<<<;<<<<<8<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:3:186:68 83 seq2 512 99 35M = 687 210 TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA <<<<<<<<<<<<;<<<<<<<<<<<<;;<<<<<&%8 MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_78:7:164:727:977 147 seq2 513 99 35M = 689 211 TACAAGCCAGAAGAGATTGGATCTAATTTTTCGAC <<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;;79; MF:i:18 Aq:i:75 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+B7_589:1:110:543:934 147 seq2 514 99 35M = 700 221 ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT <<<<<<<<<<<<;<<<<<;;<<<;;<<<<<,,;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:329:339:408 147 seq2 515 99 36M = 325 -226 CAATCCAGAAGAGATTGGATCTAATTTTTGGACTTC 7<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS56_59:5:325:544:349 147 seq2 515 99 35M = 716 236 CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:3:903:957 83 seq2 516 99 35M = 661 180 AAGCCAGAAGAGATTGGATCTAATTTTTGGACTTC <<<<<<<<<<<<<<<<;;<;<;<<<<<<66<;<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:85:361:418 147 seq2 517 99 36M = 353 -200 AGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT ;;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:138:186:459 83 seq2 518 97 35M = 360 -193 GCCAGAAGAGATTGGAGCTAATTTTTGGACTTCTT +/2/;<:<&7:7</<2&<<<&<<<<<<<<<8<<:3 MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_11:4:36:1184:994 83 seq2 518 99 35M = 358 -195 GCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT <84<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:270:430:269 83 seq2 519 99 36M = 331 -224 CCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA 28<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:295:882:282 147 seq2 520 99 35M = 691 206 CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA ========================<6<======8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:41:739:907 83 seq2 520 99 35M = 344 -211 CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA ;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:272:240:950 147 seq2 520 97 35M = 696 211 CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA 6<<&:<<<&<::;&7<<<3<;<<;<:;:<8:<<(< MF:i:18 Aq:i:25 NM:i:3 UQ:i:17 H0:i:0 H1:i:0
+EAS54_65:7:155:629:357 83 seq2 521 99 35M = 333 -223 AGAAGAGATTGGATCTAATTTTTGGACTTCTTAAA <<<<<<<<;<<<<<<<<<<<<6<<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:14:88:306 147 seq2 521 99 35M = 341 -215 AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA <1;<;<;<4<&<<<:<<<:<<<<;<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_108:5:115:193:231 147 seq2 522 99 35M = 684 197 GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG <<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:88:1454:418 83 seq2 522 99 35M = 349 -208 GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG <<<<<<<<<<6<96<<<1911<<<1<<<<<<<<<1 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:36:649:554 83 seq2 523 99 35M = 350 -208 AAGAGATTGGATCTAATTTTTGGACTTCTTAAAGA <<<<<888;<<<;<<<;<;<8<<<<8<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:119:651:88 83 seq2 527 99 35M = 337 -225 GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:57:826:977 147 seq2 528 99 35M = 693 200 ATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAA <<<<<<<<<<<<<<<<+<<<<<<<<6<9:6<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:285:417:147 83 seq2 529 99 35M = 712 218 TTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAA <<<<<<<<<<<<<<<;8<<<<<<<<<;6<:<;<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:160:130:351 83 seq2 530 99 35M = 697 202 TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA <<<<<<<<<<<<<<<;<<<<4<<<<<;<<<:<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:287:665:495 147 seq2 530 99 35M = 702 207 TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA ==========================98====8=8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:71:187:824 147 seq2 534 99 35M = 367 -202 TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT 0040;<7<<<<0<7<<<;<7*<<<<<7<<771<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:70:445:1289 83 seq2 535 99 35M = 702 202 CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG <<<<<<<<<<2<<<<<<<<<<:<<<<<<<;;;;<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:41:745:603 83 seq2 536 99 35M = 360 -211 TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT ;<<;;<;<8<<<<<<<<<<<;<<;<<<<<<<<<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:197:759:975 147 seq2 537 99 35M = 698 196 AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:140:253:322 83 seq2 537 99 35M = 689 187 AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC <<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:58:684:520 147 seq2 538 99 35M = 367 -206 ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA <85;;:<<<7<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:19:306:982 147 seq2 538 99 35M = 368 -205 ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA <<<<<<<<<9<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:273:562:954 83 seq2 539 99 35M = 722 218 TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:78:775:555 83 seq2 539 99 35M = 691 187 TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA 6:<<<<:<<<<6:<<)::8<6<<:<<)<::63832 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:49:330:699 147 seq2 540 99 35M = 722 217 TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAA ==;=================;======5;;;==5= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:329:437:643 147 seq2 540 99 36M = 354 -222 TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC 885<8;;<;3,8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:125:884:276 83 seq2 541 99 35M = 362 -214 TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC ,;;3,<7<;7<<===;============;====== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:315:201:673 83 seq2 542 45 36M = 381 -197 TTGGACTTATTAAAGAAAAAAAAACCTGTCAAACAC ;;;;<-;;&;;<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:3:10:394:392 147 seq2 542 99 35M = 376 -201 TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA 28-:;0-<0<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:228:736:747 83 seq2 542 68 35M = 381 -196 TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA <07<<&<;+<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:267:394:437 147 seq2 544 99 35M = 735 226 GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG <<<<<<<<<<;<;<<<<<;;<<<<<;<<:;8<;<8 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:66:1381:181 83 seq2 544 99 40M = 362 -222 GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT ;;;+;;&<7<<<+<<<<<<<;<;8<<<;<<<<8<<<;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:74:668:424 83 seq2 545 99 40M = 707 202 GACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:322:350:374 83 seq2 546 99 35M = 360 -221 ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA <+;8&84<<<:<<<<<<<<<<;<<<<<<<;<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:307:208:477 147 seq2 546 99 35M = 710 199 ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA <<<<<<<;<<;<<<<<<<<<<<<<<<<;:<<<88; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:228:915:631 83 seq2 547 66 35M = 381 -201 ATTATTAAAGAAAAAAAAACCTGTCAAACACGAAT &-))-*===/=========9====4========== MF:i:18 Aq:i:0 NM:i:2 UQ:i:13 H0:i:1 H1:i:0
+EAS1_93:5:246:177:525 83 seq2 549 98 35M = 738 224 TCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT <<<<<<<<<<<<<<<<<<<<<1<<<<<<;;;<8;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:93:634:323 83 seq2 550 99 35M = 721 206 CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT <<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<,<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:8:165:441:708 147 seq2 550 99 35M = 737 222 CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT =<===============================99 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:191:885:623 83 seq2 551 99 35M = 363 -223 TTAAAGAAAAAAAAACCTGTCAAACACGAATGTTA 66<<<<<<<<<<<<<2<<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:127:828:697 147 seq2 552 99 35M = 346 -241 TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT ;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:115:249:673 147 seq2 552 99 35M = 743 226 TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<6< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:263:689:572 147 seq2 553 68 35M = 381 -207 AAAGAAAAAAAAACCTGTCAAACACGAATGTTATG <9<2<<<<<<<<<22;;02<<<9<<;9<9<<;<<3 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:99:1632:76 83 seq2 553 99 40M = 705 192 AAAGAAAAAAAACCCTGTCAAACACGAATGTTATGCCCTG <<<<<<<<<<<<*<<<<8<9<<<<<<<<<9;;;;<18:;: MF:i:18 Aq:i:47 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS54_71:7:250:698:842 147 seq2 554 99 35M = 753 233 AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<24 MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:41:314:1173 83 seq2 554 99 35M = 718 199 AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC <;<<<<<<<;;<<<<<-<<<;;;<;8<*;;<<<<' MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:189:831:878 83 seq2 555 99 35M = 351 -239 AGAAAAAAAAACCTGTCAAACACGAATGTTATGCC <9<<<<<<<<<<;9<:<<<<<6<<<<<<<;<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:216:47:302 83 seq2 557 99 35M = 729 207 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<<<<7<<<<<<<<<<<<+<<<<<//6;< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:28:538:148 83 seq2 557 99 35M = 376 -216 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<<<7;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:284:597:682 147 seq2 557 99 35M = 375 -217 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<9;;7<;:<<<:<;<<<<<<<<;<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:11:1261:1200 83 seq2 558 99 35M = 362 -231 AAAAAAAACCTGTCAAACACGAATGTTATGCCCTG <<<<<<<:<<6<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:246:711:981 147 seq2 559 99 35M = 371 -223 AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC ;;:;7<<:5:<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:208:971:600 83 seq2 559 99 35M = 382 -212 AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC <<<<<<<3*+<4/<<<<7<<<<0<<:<8<<<<0<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:219:174:684 83 seq2 560 71 35M = 390 -205 AAAAAAACTGTCAAACACGAATGTTATGCCCTGCT <<<<:;+9<<<;<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS51_66:7:4:234:610 147 seq2 560 84 35M = 729 204 AAAAAACCTGTCAAACACGAATGTTATGCCCTCCT <<<<<<<<7;<<<;7<7;7;7<;-<-<&<<<0%06 MF:i:18 Aq:i:22 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_73:5:271:874:367 83 seq2 560 99 35M = 384 -211 AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT <<<<<<5;<<<:<<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:2:168:1878 83 seq2 560 37 35M = 743 218 AAAAAACCTGGCAAACACGAATGTTATGACATGTN ;<:;;<:<;<;<;;;;:;<;:::&9:&:68&6&*! MF:i:18 Aq:i:37 NM:i:5 UQ:i:61 H0:i:0 H1:i:1
+EAS221_1:6:89:1164:573 147 seq2 560 99 35M = 371 -224 AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT 3<<<6<%7<<08<<4<3<<103<1<<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:53:783:78 147 seq2 561 99 35M = 363 -233 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <;;;;<<0<,<<<<<<<<<;<<<;<;<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:570:902 147 seq2 561 99 35M = 730 204 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <<<<<<<<<<<;4<<:<<44<<<<<<<<<<<4<<+ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:7:1864:1569 147 seq2 561 99 35M = 382 -214 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:89:942:84 147 seq2 562 74 35M = 759 232 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:122:589:134 83 seq2 562 99 35M = 369 -228 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA ;<;4<<538<<;<<;<<<<';,:<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:77:1529:522 83 seq2 562 99 35M = 722 195 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA <<;<<<<<<<<<<<4<<4<;;:;2:7<<<2*<;;8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:48:805:860 83 seq2 563 78 35M = 755 227 AAACCTGTCAAACACGAATGTTATGCCCTGCTAAA <<<<<<<;<<<<<<<41;<<8<<<<<<<8+<4,+; MF:i:18 Aq:i:13 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:144:492:61 83 seq2 564 99 35M = 728 199 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<<;<<<<<<<<<<<;<<<<<<7:<<<<::;9;;6 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:303:970:243 83 seq2 564 99 35M = 370 -229 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<0+<<<,<4<:<:<<<<<<<<<<<::<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:78:806:800 147 seq2 564 99 40M = 717 193 AACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGC <<<<<<<<<<<<<<<<<<<4<<:<1<0<;<9;<:78:::: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:94:1440:2016 147 seq2 564 99 35M = 751 222 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<<<<<<<<<<<<<<<<<<;<<;;;<<:<8:::75 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:103:443:166 147 seq2 565 99 35M = 747 217 ACCTGTCAAACACGAATGTTATGCCCTGCTAAACT <<<<<<<<<<<<<<<<<<<<;<<<<<<<1<-;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:24:284:360 83 seq2 567 76 35M = 390 -212 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA :;<;:<<<;<<<<<<<<<<<<<<<<<;;<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:166:626:836 147 seq2 567 99 35M = 757 225 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA <<<<<<<<<<<<<<<<<<<<9<<<<<<<<;<;;;9 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:110:840:431 83 seq2 567 93 35M = 388 -214 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA 77<;7<<<<<<<<<4<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:116:738:142 83 seq2 568 99 35M = 722 189 TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG <<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<:;2 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:55:932:613 83 seq2 568 77 35M = 389 -214 TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:137:139:248 83 seq2 569 97 35M = 401 -203 GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC ;;;99<<<;<;;<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:34:1614:558 147 seq2 569 99 35M = 411 -193 GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC <<9<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:15:696:693 83 seq2 570 10 35M = 403 -202 TCAAACACGAATGTTAATCCCTGCTAAACTAATCA )6<:7<.7<6.<0&&<&3:&7<<7<0<<<<<<<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:50 H0:i:0 H1:i:0
+EAS114_28:3:32:492:907 147 seq2 571 95 36M = 387 -220 CAAACACGAATGTTATGCCCTGCTAAACTAAGCATC 8<;<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:114:19:769 83 seq2 572 90 35M = 405 -202 AAACACGAATGTTATGCCCTGCTAAACTAAGCATC 5+;+3/6;<+;/8<8*/<7/59<97147<;;9<7< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:182:104:921 147 seq2 575 99 35M = 378 -232 CACGAATGTTATGCCCTGCTAAACTAAGCATCATA ;<;<<<<<<:<<<<<:<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:5:996:2000 83 seq2 575 99 35M = 408 -202 CACGAATGTTATGCCCTGCTAAACTAAGCATCATA <<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:109:199:592 83 seq2 576 72 35M = 390 -221 ACGAATATTATGCCCTGCTAAACTAAGCATCATAA ;9<9<:&:<<<<;;<;;<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS219_1:3:90:219:528 147 seq2 576 75 35M = 758 217 ACGAATGTTATGCCCTGCTAAACTAAGCATCATAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:94:294:387 147 seq2 578 99 35M = 736 193 GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT <<<<<<<;<<<<<<<<<:<<<<<<<<<<<<;)7;; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:33:779:821 83 seq2 579 99 35M = 416 -198 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG <<730<<<<9<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:43:114:617 147 seq2 579 99 35M = 738 194 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG =============;=========;=========== MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:23:944:377 83 seq2 579 75 36M = 757 214 AATGTTATGCCCTGCTAAACTAAGCATCATAAATGA <<<<<<<<9<<<<;<<<<<<<<<;<7<<<<;8;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:3:864:1888 147 seq2 579 99 35M = 411 -203 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG 888588;;;;;;;;;;;;;;;;;;;;8;;;;;;;; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:26:137:1382 147 seq2 579 99 35M = 397 -217 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG <<-<8<<<<<<:<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:265:251:147 147 seq2 581 99 35M = 754 208 TGTTATGCCCTGCTAAACTAAGCATCATAAATGAA <<<<<<<<<<<<<<88<<<80:;<<<<<;:4;;:4 MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:184:912:258 147 seq2 582 99 35M = 428 -189 GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG <;;<<<<;:<<7<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:115:646:430 83 seq2 582 45 35M = 768 217 GTTATGCCCTGCTAAACTTAGCATCATAAATGAAG <7<<<<<<<<<<<<;<<<<<;<7<<<<;5;<;67< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:3:24:319:429 147 seq2 582 99 35M = 740 193 GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG <<<<<<<<<<<<<<<<;<<<<<<<<1<<-6<<</< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:8:49:182:192 83 seq2 582 99 35M = 750 203 GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG =====================;============< MF:i:18 Aq:i:49 NM:i:1 UQ:i:28 H0:i:0 H1:i:1
+EAS114_45:1:100:979:1863 83 seq2 583 85 35M = 757 209 TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG ;<;;;;;;;7;;;79;;77;9;;99;974;677-6 MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:53:458:581 73 seq2 583 77 35M = 583 0 TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:53:458:581 133 seq2 583 0 * = 583 0 CTCAATTAATTGTTTTATAAAACCTGTGAGTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<99<<<<< MF:i:-64
+B7_589:6:108:958:42 147 seq2 584 81 35M = 755 206 TATGCCCTGCTAAACTAAGCATCATAAATGAAGGG <<<<<<<<<<<<<<<<<<<<1<<<<<<9<<;<5<: MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:89:457:591 83 seq2 585 69 35M = 770 216 ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG <<<<<<<<<<<4<<<<<<<<<<<<8<7/4<<<<4+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:87:1289:83 83 seq2 585 99 35M = 413 -207 ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG <<<::<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:84:1505:1037 147 seq2 586 99 35M = 409 -212 TGCCCTGCTAAACTAAGCATCATAAATGAAGGGGA <<966<<7<<<<7<<<<9<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:197:261:624 147 seq2 587 99 35M = 398 -224 GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA 866;2:/;<<<;:<<<;<;;<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:118:41:489 147 seq2 588 76 35M = 779 226 CCCTGCTAAACTAAGCATCATAAATGAAGGGGAAA <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<95: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:157:361:309 83 seq2 589 99 35M = 747 193 CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_39:6:71:644:1792 147 seq2 589 84 35M = 754 200 CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT <<<<<<<;<<<<<<<<<<;<<<<<<<<<;<;:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_589:2:9:49:661 147 seq2 591 99 35M = 747 191 TGCTAAACTAAGCATCATAAATGAAGCGGAAATAA <<<<<<<<<<<<<<<<;<<<<<<;:<<;;;7<9;9 MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_71:2:85:686:696 83 seq2 594 99 34M = 435 -193 TAAACTAAGCATCATAAATGAAGTGGAAATAAAG :<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:1:177:522:118 69 seq2 594 0 * = 594 0 TCTCAATTAATTGTTTTATAAAACCTGTGAGTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<57<<<< MF:i:-64
+EAS188_7:1:177:522:118 137 seq2 594 49 35M = 594 0 TAAACTAAGCATCATAAATGAAGGGGAAATAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:103:870:105 83 seq2 595 44 35M = 778 214 AAACTAAGCATCATAAATGAAGGGGAAATAAAGTC <<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;<<7; MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_62:8:52:967:804 73 seq2 596 76 35M = 596 0 AACTAAGCATCATAAATGAAGGGGAAATAAAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:8:52:967:804 133 seq2 596 0 * = 596 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT ===============<=======<<===<====== MF:i:-64
+EAS1_108:6:95:235:746 83 seq2 598 99 35M = 430 -203 CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG ==&=;===7=3===8======;=;8===8=====; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:124:253:889 83 seq2 598 99 35M = 437 -196 CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG 8<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:174:650:125 83 seq2 600 76 35M = 770 201 AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:39:348:594 83 seq2 600 99 35M = 431 -204 AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC <<;;<;:<;<<<;<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:92:693:228 83 seq2 601 75 35M = 770 200 AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:285:349:797 147 seq2 604 76 35M = 773 200 ATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:82:13:897 83 seq2 606 99 35M = 453 -188 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT ,<2<;<<;<<<<;;;<<;<<<<<<<;;;;<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:310:155:312 83 seq2 606 99 35M = 438 -203 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT 2;<<;<<;<<;;/<<<<<<;<<<<8<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:45:178:1321 147 seq2 606 77 35M = 771 196 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:193:420:78 83 seq2 607 99 35M = 787 215 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:131:518:588 83 seq2 607 99 35M = 433 -209 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <.<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:45:800:733 83 seq2 607 99 35M = 413 -229 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <7<<7&<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:34 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:70:766:2016 83 seq2 607 99 35M = 422 -220 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:2:1217:398 147 seq2 608 99 40M = 780 212 TAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC <<<<<<<<<<<<<;<<<<<<<7<<<3<<<<;<<<<9:7:: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:73:1458:1337 147 seq2 609 99 35M = 806 232 AAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGAC <<<<<;;;<<<<<<<<<<<<<<<<<<<;<<7;;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:104:402:732 83 seq2 610 99 35M = 434 -211 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:37:611:267 147 seq2 610 99 35M = 464 -181 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:78:692:671 147 seq2 610 99 35M = 438 -207 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<);<<;;<<<<<;<<<<<<<<<<<<<6<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:144:242:602 83 seq2 611 99 36M = 436 -211 ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:6:1243:981 69 seq2 611 0 * = 611 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<8<<8<<<<2<<<<<<<<8<55<<8*<<8<<< MF:i:-64
+EAS219_FC30151:5:6:1243:981 137 seq2 611 68 35M = 611 0 ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAA <;<;;<<<;3;;3<<<;<<;<7%<<<.1<<<..<3 MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:291:404:199 147 seq2 612 76 36M = 777 197 TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:266:994:429 83 seq2 612 76 35M = 769 188 TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG =====================9=======4===:= MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:159:253:353 147 seq2 613 67 35M = 778 196 GAAGGGGAAATAAAGTCAAGTCTTTCCTGACAGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<0,%4(+, MF:i:18 Aq:i:67 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS1_108:5:175:149:296 147 seq2 614 99 35M = 811 232 AAGGGGAAATAAAGTCAAGCCTTTCCTGACAAGCA <<<<<<<<<<<<<<<<<<<49<<<<<<<<<<<<;4 MF:i:18 Aq:i:45 NM:i:1 UQ:i:19 H0:i:0 H1:i:1
+EAS56_65:1:23:536:229 147 seq2 614 99 35M = 448 -201 AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA <<99<<<<<;<<<;2<<<<<<;<<<9<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:100:20:1199 83 seq2 614 99 35M = 456 -193 AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA :<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:181:713:140 83 seq2 615 84 35M = 793 213 AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA <7<<<<<<<<<<<<7<7<6+<<<5;<;<2<;;+;; MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS139_19:6:82:1051:921 147 seq2 616 99 40M = 800 224 GGGGAAATAAAGTCAAGGCTTTCCTGACAAGCAAATGCTA <<<<<9<799<<<<7::/<<<9<7:9:;2:7552+9''66 MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS192_3:3:309:187:267 147 seq2 616 99 35M = 786 205 GGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAA <<<<<<<<<<<<<<<<<<<<<<<;<;<;<;68;;8 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:115:649:259 83 seq2 617 99 36M = 782 201 GGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<<9 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:261:267:597 147 seq2 617 86 35M = 787 205 GGGTAATAAAGTCAAGTCTTTCCTGACAAGCAAAT <<<<<<<<<;<<<<<7<<<<<<<<<:7<7<;44:; MF:i:18 Aq:i:41 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:4:123:1001:580 147 seq2 617 43 35M = 771 185 GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT =====!=====================1.8131*= MF:i:18 Aq:i:43 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS139_11:7:60:163:1612 83 seq2 617 99 35M = 439 -213 GGGAACTAAAGTCAAGTCTTTCCTGACAAGCAAAT -<<<<)<<<<<<<<<<<<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:59 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS54_65:4:325:795:213 147 seq2 618 99 35M = 790 207 GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<;<<<<;;<<<<<<<<<<<<;:<</;/;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:165:665:220 147 seq2 618 76 35M = 779 196 GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<<<<<<<<<<<<<<<;<;;<<<;;<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:22:206:150 147 seq2 619 99 35M = 792 208 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC ==========================::=5&;<2< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:237:497:165 147 seq2 619 99 35M = 454 -200 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC 9=:=======2=27======<>&<=,==4>4=>>= MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:82:1540:77 147 seq2 619 99 35M = 786 202 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:172:196:746 147 seq2 620 99 35M = 451 -204 AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT <<<;><<+<<<<:<<<<2<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:97:892:419 147 seq2 621 99 35M = 800 214 AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:312:915:751 147 seq2 621 99 35M = 461 -195 AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA <:-<<<99:::);:7<4;8<<<<<<<;<2<+8<;< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS1_93:4:325:352:67 147 seq2 622 99 35M = 794 207 ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA ==================<========<=<;-=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:83:731:540 83 seq2 623 99 35M = 804 216 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<;<<<<<<<<<<<<<:<7<*;&;<;;9 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:74:329:459 147 seq2 623 99 35M = 795 207 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9;599 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:13:674:1717 83 seq2 623 99 35M = 445 -213 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:141:415:738 69 seq2 624 0 * = 624 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<8<<< MF:i:-64
+EAS1_105:1:141:415:738 137 seq2 624 76 35M = 624 0 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<<<<<<<<<<<<<<<<<<<<:<<;<<;<<<<6: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:154:118:488 83 seq2 624 99 35M = 447 -212 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<;58<<95:<<;<;<<<;<<<;;<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:198:929:684 83 seq2 624 99 35M = 471 -188 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:215:246:640 147 seq2 624 99 36M = 447 -213 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:234:167:381 83 seq2 625 99 35M = 443 -217 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT <<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:96:489:453 147 seq2 625 99 35M = 445 -215 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<;;;<<<<5:<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:79:879:15 83 seq2 626 99 35M = 790 199 AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<2<;<<1< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:59:286:290 147 seq2 628 99 35M = 467 -196 TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT 77<<<<7<<<97<<,7<<<;<<<;<9<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:5:263:511:936 83 seq2 629 99 35M = 801 207 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<<<<<<<<<<;<<<<<;<<:<:<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:181:582:435 147 seq2 629 99 35M = 471 -193 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<;<<<<<;<<4<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:636:642 83 seq2 630 99 35M = 458 -207 AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC <<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:12:273:89 83 seq2 631 99 35M = 477 -189 AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA <:737<288<<<7<<<<<<<<<:9<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:239:1001:406 147 seq2 634 99 35M = 450 -219 CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA 0':.71;;:9==9=;====;=;============= MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:96:899:106 147 seq2 636 99 35M = 462 -209 TTCCTGACAAGCAAATGCTAAGATAATTCATCATC ;;;;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:67:56:806 147 seq2 637 99 35M = 464 -208 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA 844:8;7<88;8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:71:408:741 83 seq2 637 99 35M = 457 -215 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA ;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:6:180:695:621 147 seq2 637 99 35M = 453 -219 TACTGAAAAGCAAATGCTAAGATAATTCATCATCA ;&377<&<<;7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS114_30:6:49:656:507 147 seq2 637 99 35M = 468 -204 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA %44;;<:<<;<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:4:854:140 147 seq2 638 72 35M = 458 -215 CCTGACAAGCAAATGCTAAGATAATTCATCATCAC :9':<;<<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:85:1521:58 83 seq2 639 99 40M = 813 214 CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<9<<<<<<<<<<<<<7<<<<<<<<<<<<;;:7: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:57:1064:925 137 seq2 640 76 35M * 0 0 TGACAAGCAAATGCTAAGATAATTCATCATCACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:323:196:855 147 seq2 642 99 35M = 809 202 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:117:33:262 147 seq2 642 99 35M = 814 207 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:59:742:549 83 seq2 642 99 35M = 816 209 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:55:562:403 147 seq2 643 99 36M = 825 218 CAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<;<;: MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:97:743:602 147 seq2 644 99 35M = 821 211 AAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:167:905:852 83 seq2 647 99 36M = 445 -238 CAAATGCTAAGATAATTCATCATCACTAAACCAGTC +<<<9;7;<<+<<<<<39<;9<;9<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:130:865:838 83 seq2 649 99 35M = 448 -236 AATGCTAAGATAATTCATCATCACTAAACCAGTCC ;<:84<<<4<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:60:1420:660 147 seq2 649 99 35M = 808 194 AATGCTAAGATAATTCATCATCACTAAACCAGTCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:180:89:582 83 seq2 650 99 36M = 809 195 ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA <<<<<<<<<7<<<<<<<<<7<<<:<<<:<<::77:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:86:871:319 147 seq2 651 71 35M = 494 -192 TGCTAAGATAATTCATCATCACTAAACCAGTCCTA 7;+1;<:<<<<<<<<;<<;<<9<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:236:841:20 83 seq2 652 99 35M = 467 -220 GCTAAGATAATTCATCATCACTAAACCAGTCCTAT 7;<<<;<<<<;;<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:133:8:379 83 seq2 653 99 35M = 470 -218 ATAAGATAATTCATCATCACTAAACCAGTCCTATA &=========='==7==0=2====28===00==== MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_105:8:96:720:940 83 seq2 654 99 35M = 467 -222 TAAGATAATTCATCATCACTAAACCAGTCCTATAA *<<<<;<<<9<<;,<;0<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:71:994:576 83 seq2 655 99 35M = 805 185 AAGATAATTCATCATCACTAAACCAGTCCTATAAG <<<<<<<<<<<<<<<<<<<<<<<;<<5<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:164:79:134 147 seq2 656 99 35M = 488 -203 AGATAATTCATCATCACTAAACCAGTCCTATAAGA <;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:78:1029:512 83 seq2 656 99 40M = 500 -196 AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC ;;;;;<;;<<<.<<6;<<;<;8<<<<::<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:214:784:690 147 seq2 657 99 35M = 472 -220 GATAATTCATCATCACTAAACCAGTCCTATAAGAA -<7<<7<:<<2<<<<;<<<<<;<<<<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS220_1:4:6:1178:1105 83 seq2 657 93 35M = 830 208 GATAATTCATCATCACTAAACCAGTCCTATAAGAA <<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:171:196:287 83 seq2 658 99 35M = 485 -208 ATAATTCATCATCACTAAACCAGTCCTATAAGAAA <;;;98;<;&<;;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:220:801:282 83 seq2 660 99 36M = 837 213 AATTCATCATCACTAAACCAGTCCTATAAGAAATGC <<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS221_1:2:73:955:728 147 seq2 660 44 35M = 823 198 AATTCATCATCACTAAACCAGTCCTATAAGAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_105:1:3:903:957 147 seq2 661 99 35M = 516 -180 ATTCATCATCACTAAACCAGTCCTATAAGAAATGC <%12<&<<<;<:<<<<<<<<<7<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_65:2:224:579:433 83 seq2 662 99 35M = 485 -212 TTCATCATCACTAAACCAGTCCTATAAGAAATGCT '<08/8<+<</<<:<<<<<8<<9<38<<<<<<<<; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:209:824:866 147 seq2 665 73 35M = 828 198 ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:30:1882:1210 83 seq2 665 82 35M = 503 -197 ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA 776778;5;;;;8;;7:8;;;;;;;<<<;;;;;<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:181:476:394 147 seq2 666 99 35M = 847 216 TCATCACTAAACCAGTCCTATAAGAAATGCTCAAA <<<<<<<<<<<<<<<<<<<<<<<<<;<<:<<<:;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:267:953:459 147 seq2 667 99 35M = 509 -193 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA %<07<94========<<================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:140:752:822 147 seq2 667 76 35M = 495 -207 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA ;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:322:391:742 83 seq2 667 99 35M = 847 215 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:149:639:910 83 seq2 669 99 35M = 489 -215 TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA <;49;<<;;<<<<8;<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:242:419:512 83 seq2 672 94 35M = 490 -217 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT *:<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:45:183:25 83 seq2 672 95 35M = 501 -206 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT ;1<<;<<<;;;;<<<<<+<<<<<<<<<9<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:326:887:180 83 seq2 672 73 35M = 492 -215 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT 8:<<:<5<<<;7<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:145:635:390 147 seq2 673 99 35M = 860 222 TAAACCAGTCCTATAAGAAATGCTCAAAAGAATTG <<<<<<<<<<<<<<<<<<:<<<<<<<8<<<::;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:31:628:1820 147 seq2 675 98 35M = 828 188 AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:117:452:744 147 seq2 676 99 35M = 850 209 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<;<<<;<<<<<<<<<<:<<<<<<<;; MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:297:949:26 147 seq2 676 99 35M = 842 201 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:17:437:1378 147 seq2 676 99 35M = 847 206 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:222:579:961 83 seq2 679 99 35M = 504 -210 AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG =58====;==8=======;================ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:98:995:929 147 seq2 680 99 35M = 844 199 GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT <;<;<8<;<<;1;<<<<<;<;;;08;<;<1&0+8< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:76:1765:700 147 seq2 680 99 35M = 866 221 GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT ;;6;;;;;;;;;6;;;;6;;;;;;;;;;;;88878 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:68:306:409 83 seq2 682 99 40M = 856 214 CCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;:;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:115:193:231 83 seq2 684 99 35M = 522 -197 TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA =========7===========<============= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:57:1675:720 83 seq2 684 99 35M = 841 192 TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:13:682:680 147 seq2 685 99 35M = 482 -238 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<:<5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:51:1486:1131 83 seq2 685 77 35M = 500 -220 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<,<6<<<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:3 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:33:1240:846 147 seq2 685 99 35M = 509 -211 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:43:972:506 83 seq2 686 99 35M = 505 -216 TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT ;<<<<<<<+;<;<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:23:127:880 147 seq2 686 99 35M = 504 -217 TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT <<<<<<<<<%<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:101:752:996 83 seq2 687 99 35M = 508 -214 AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<<<<<<<7<7<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:3:186:68 147 seq2 687 99 35M = 512 -210 AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<;<<<<<&:,<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:273:348:37 83 seq2 688 99 36M = 483 -241 AGAAATGCGCAAAAGAATTGTAAAAGTCAAAATTAA 9;7;;0<++1<<<;<7<+;;1<<<;<17<<<<<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_78:7:164:727:977 83 seq2 689 99 35M = 513 -211 GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA ;<;<;<:<:<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:140:253:322 147 seq2 689 99 35M = 537 -187 GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA =;===;54:====================>>===> MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:146:374:692 83 seq2 690 99 35M = 874 219 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<<<<<<<<<<<<<</<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:92:875:345 83 seq2 690 99 35M = 504 -221 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<;<.;7<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:45:601:439 147 seq2 691 99 35M = 864 208 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<<<;<<<<<<<<<<<<<<<<4<<<<9<<<<<<;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:295:882:282 83 seq2 691 99 35M = 520 -206 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<:<8<-<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:78:775:555 147 seq2 691 99 35M = 539 -187 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<-<%4/<<<<<<<<<<<<<<<<<5<<<0<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:255:796:239 83 seq2 692 99 35M = 869 212 ATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGT <<<<<<<<6<<<<<<<<<<<<<<<<;6<<<:<:<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:57:826:977 83 seq2 693 99 35M = 528 -200 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT 875:6<<<<<<<<<<<<<<<;<<<<<<;8<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:187:996:432 83 seq2 693 99 36M = 860 203 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:65:463:703 147 seq2 693 99 35M = 506 -222 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT <<3<9<<<<<<<8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:288:384:444 147 seq2 696 99 35M = 855 194 TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:272:240:950 83 seq2 696 97 35M = 520 -211 TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA 37<<<<<<<<<<<<<<<<<<<<<<;;<;<<<<<<; MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:160:130:351 147 seq2 697 99 35M = 530 -202 CAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAAT 4<;;<;<<<-<<<<<<<<<<;;<<<<;<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:189:530:40 147 seq2 698 99 36M = 883 221 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATAC <<<<<<<<<<;<<<<<:<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:168:247:414 83 seq2 698 99 35M = 876 213 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA <<<<<<<<<<<<<<<<*<<<<<<<<<;:6<<<<<; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:197:759:975 83 seq2 698 99 35M = 537 -196 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:29:411:1208 83 seq2 698 99 40M = 882 224 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC <<<<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:110:543:934 83 seq2 700 99 35M = 514 -221 AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT <<<<<5<<;<<<<<<;<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:287:665:495 83 seq2 702 99 35M = 530 -207 GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA ===,9=;;====7=====5===;==1========= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:70:445:1289 147 seq2 702 99 35M = 535 -202 GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA <<<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:172:827:592 147 seq2 703 99 35M = 899 231 AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC =;=======;==;===:==========;==9<<.3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:135:401:735 147 seq2 703 99 35M = 510 -228 AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC <<::7<<<<<<::<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:39:208:644 83 seq2 704 99 35M = 859 190 ATTGTAAAAGTCAAAATTAAAGTTCAATACTCACC <;<<<<<;;:<<;;<<<<<<;;;;;;.<;<79997 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:99:1632:76 147 seq2 705 99 40M = 553 -192 TTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATA 4641::<<4<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:52:1144:509 83 seq2 706 99 35M = 867 196 TGTAAAAGTCAAAATTAAAGTTCAATACTCACCAT <<<<<<<<<<<<<<<<<<<;<<<<<<<;<;<<;<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:116:157:612 83 seq2 707 99 35M = 889 217 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:36:481:1079 147 seq2 707 99 40M = 881 214 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::8 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:74:668:424 147 seq2 707 99 40M = 545 -202 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA :::::<<96<<<<<;<<<;<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:122:398:994 147 seq2 708 99 35M = 871 198 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA <:<9<<<<<<4<<<;9<<<<<98<;<<<:;<;<;7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1231:1381 83 seq2 708 99 35M = 891 218 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:57:366:844 147 seq2 708 99 40M = 877 209 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::7: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:307:208:477 83 seq2 710 99 35M = 546 -199 AAAGTCAAAATTAAAGTTCAATACTCACCATCATA <<<<<.<<<<<<<<<<<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:285:417:147 147 seq2 712 99 35M = 529 -218 AGTCAAAATTAAAGTTCAATACTCACCATCATAAA <..)<<<<;<<<<7<;-<<;<<<<<;8<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:325:544:349 83 seq2 716 99 35M = 515 -236 AAAATTAAAGTTCAATACTCACCATCATAAATACA <<<<57<<<7<;6<<<<;<7<7;<<7<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:33:357:858 147 seq2 716 99 35M = 870 189 AAAATTAAAGTTCAATACTCACCATCATAAATACA <<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:78:806:800 83 seq2 717 99 40M = 564 -193 AAATTAAAGTTCAATACTCACCATCATAAATACACACAAA ::;9:<<<;<<:<<<<:<.<1:<<1<<<<<<;<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:41:314:1173 147 seq2 718 99 35M = 554 -199 AATTAAAGTTCAATACTCACCATCATAAATACACA <<2**<<82/<<<<<<<<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:82:963:128 147 seq2 719 99 35M = 905 221 ATTAAAGTTCAATACTCACCATCATAAATACACAC <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:240:719:799 83 seq2 720 99 35M = 900 215 TTAAAGTTCAATACTCACCATCATAAATACACACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:93:634:323 147 seq2 721 99 35M = 550 -206 TAAAGTTCAATACTCACCATCATAAATACACACAA <<<<;<;<<<<;;<<2<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:12:1335:1372 147 seq2 721 99 40M = 906 225 TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTA <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<99::.: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:116:738:142 147 seq2 722 99 35M = 568 -189 AAAGTTCAATACTCACCATCATAAATACACACAAA <:<7;+:<<:<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:49:330:699 83 seq2 722 99 35M = 540 -217 AAAGTTCAATACTCACCATCATAAATACACACAAA ===/=;========;=;================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:273:562:954 147 seq2 722 99 35M = 539 -218 AAAGTTCAATACTCACCATCATAAATACACACAAA ;<<+;95<<<;5;<<;:<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:77:1529:522 147 seq2 722 99 35M = 562 -195 AAAGTTCAATACTCACCATCATAAATACACACAAA <<<;7;,<<<<<<.<,6<<6<<<<<<<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1467:1447 147 seq2 722 99 35M = 898 211 AAAGTTCAATACTCACCATCATAAATACACACAAA <<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:251:819:772 83 seq2 726 99 36M = 881 191 TTCAATACTCACCATCATAAATACACACAAAAGTAC <3<<<9<9<3<</<<<<<<59<3<9<<</9/++*/' MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:144:492:61 147 seq2 728 99 35M = 564 -199 AAATACTCACCATCATAAATACACACAAAAGTACA +;;3;,:7<:;<<7<<<<<<<;;<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS54_73:7:200:65:291 83 seq2 728 99 35M = 930 237 CAATACTCACCATCATAAATACACACAAAAGTACA <<<<1<<<<<<<<<<<<<<<<<<<:<8<<<<:<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:130:609:467 83 seq2 728 99 35M = 877 184 CAATACTCACCATCATAAATACACACAAAAGTACA ==8=====;==8==;=4=;;8=====;6=177.== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:216:47:302 147 seq2 729 99 35M = 557 -207 AATACTCACCATCATAAATACACACAAAAGTACAA <<;<8<:<6<<<;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:4:234:610 83 seq2 729 84 35M = 560 -204 AAAAATCAACATCACAAATACACACAAAAGTACAA <:+:'+&<+'<+'2&<:<7<2<':2<:<<7<7<<< MF:i:18 Aq:i:22 NM:i:4 UQ:i:31 H0:i:0 H1:i:0
+EAS54_81:8:271:180:509 83 seq2 729 99 35M = 896 202 AATACTCACCATCATAAATACACACAAAAGTACAA =============================='==== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:41:530:663 147 seq2 730 99 35M = 908 213 ATACTCACCATCATAAATACACACAAAATTACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:22 H0:i:1 H1:i:0
+EAS114_39:4:30:570:902 83 seq2 730 99 35M = 561 -204 ATACTCACCATCATAAATACGCACAAAAGTACAAA <:<6:6<&:<<6<<<<<<<<.<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS1_105:1:87:430:995 83 seq2 731 67 35M = 909 213 TACTCACCATCATAAATACACACAAAATTACAAAA <<;<<7;;;<;<<777;7(77;;1;7;%117;,7( MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS114_28:7:215:863:521 147 seq2 732 99 36M = 890 194 ACTCACCATCATAAATACACACAAAAGTACAAAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:267:394:437 83 seq2 735 99 35M = 544 -226 AAACATCATAAATACACACAAAAGTACAAAACTCA &<&,<8.<;<<<;<8<8<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS1_108:6:94:294:387 83 seq2 736 99 35M = 578 -193 ACCATCATAAATACACACAAAAGTACAAAACTCAC 779=53=9===;=:=;=========;========= MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:38:332:54 147 seq2 737 99 36M = 904 203 CCATCATAAATACACACAAAAGTACAAAACTCACAG <;<<<<<<<<<<<<<<<<<<<<<<<<<<<0;;;<;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:8:165:441:708 83 seq2 737 99 35M = 550 -222 CCATCATAAATACACACAAAAGTACAAAACTCACA 6+<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:246:177:525 147 seq2 738 98 35M = 549 -224 CATCATAAATACACACAAAAGTAAAAAACTCACAG %<(4<2<<<<<:<;<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:5:43:114:617 83 seq2 738 99 35M = 579 -194 AATCATAAATACACACAAAAGTACAAAACTCACAG +=22=6=================9=========== MF:i:18 Aq:i:52 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS1_99:8:152:778:228 147 seq2 739 99 35M = 915 211 ATCATAAATACACACAAAAGTACAAAACTCACAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:24:319:429 83 seq2 740 99 35M = 582 -193 TAATAAATACACACAAAAGTACAAAACTCACAGGT 0%=3%=3====<=9=====89==93==9=6===== MF:i:18 Aq:i:56 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_66:5:210:674:911 83 seq2 740 99 35M = 904 199 TCATAAATACACACAAAAGTACAAAACTCACAGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:88:451:1773 83 seq2 742 99 35M = 902 195 ATAAATACACACAAAAGTACAAAACTCACAGGTTT ;;:::<:;:<<;:6::;:;;:::;;<;;;367177 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:2:168:1878 147 seq2 743 37 35M = 560 -218 TAAATACACACAAAAGTAGAAAACGCACCAGTTTT *3/6)9.;;;;;;;;5;;);;;3;(;;;+(;7.)3 MF:i:-126 Aq:i:37 NM:i:4 UQ:i:32 H0:i:0 H1:i:0
+EAS188_7:5:115:249:673 83 seq2 743 99 35M = 552 -226 TAAATACACACAAAAGTACAAAACTCACAGGTTTT :<<<;<<<;<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:178:187:610 83 seq2 744 99 35M = 903 194 AAATACACACAAAAGTACAAAACTCACAGGTTTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:9:49:661 83 seq2 747 99 35M = 591 -191 TACACACAAAAGTACAAAACTCACAGGTTTTATAA <<6<5<<<<<<<<<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:157:361:309 147 seq2 747 99 35M = 589 -193 TACACACAAAAGTACAAAACTCACAGGTTTTATAA :<-<5<0<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:103:443:166 83 seq2 747 99 35M = 565 -217 TACACACAAAAGTACAAAACTCACAGGTTTTATAA 7<4<4<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:8:49:182:192 147 seq2 750 99 35M = 582 -203 ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC <5<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:12:630:707 83 seq2 751 99 35M = 915 199 CACAAAAGTACAAAACTCACAGGTTTTATAAAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:94:1440:2016 83 seq2 751 99 35M = 564 -222 CACAAAAGTACAAAACTCACAGGTTTTATAAAACA :<8<<<<9<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:206:741:810 147 seq2 753 99 35M = 929 210 CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:-;<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:250:698:842 83 seq2 753 99 34M = 554 -233 AAAAAGTACAAAACTCACAGGTTTTATAAAACAA )<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS54_81:6:265:251:147 83 seq2 754 99 35M = 581 -208 AAAAGTACAAAACTCACAGGTTTTATAAAACAATT <<<<::<8<<<;<;8<8<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:71:644:1792 83 seq2 754 84 35M = 589 -200 AAAAGTACAAAACTCACAGGTTTTATAAAACAATT <<<<;<<<<<<:;/<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:108:958:42 83 seq2 755 81 35M = 584 -206 AAAGTACAAAACTCACAGGTTTTATAAAACAATTA <<<;;</<<<<;<<<<<<<<<<<<<<<<<<<<<<+ MF:i:18 Aq:i:9 NM:i:1 UQ:i:27 H0:i:0 H1:i:3
+B7_597:8:48:805:860 147 seq2 755 78 35M = 563 -227 AAAGTACAAAACTCACAGGTTTTATAAAACAATTA <<<;3<;7<<97<7<<<<7<4<<<<<<<<<<;8<+ MF:i:18 Aq:i:13 NM:i:1 UQ:i:27 H0:i:0 H1:i:3
+B7_591:3:179:496:161 147 seq2 756 99 36M = 919 199 AAGTACAAAACTCACAGGTTTTATAAAACAATTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+ MF:i:18 Aq:i:49 NM:i:2 UQ:i:53 H0:i:1 H1:i:0
+EAS56_59:3:166:626:836 83 seq2 757 99 35M = 567 -225 AGTACAAAACTCACAGGTTTTATAAAACAATTAAT <;;7<<<<<<;<7;<<<<<<<<<<<<7<<<<<<<+ MF:i:18 Aq:i:28 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS114_28:5:23:944:377 147 seq2 757 75 36M = 579 -214 AGTACAAAACTCACAGGTTTTATAAAACAATTAATT <;7;8<<<<:<;<:<<<<<<<<<<<<<;<<<<<<<; MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_45:1:100:979:1863 147 seq2 757 85 35M = 583 -209 ATTACAAAACTCACAGGTTTTATAAAACAATTAAT 6&,*3;6;66;9(572692;;;79;4)9;96;59+ MF:i:18 Aq:i:23 NM:i:3 UQ:i:51 H0:i:0 H1:i:0
+EAS219_1:3:90:219:528 83 seq2 758 75 35M = 576 -217 GTACAAAACTCACAGGTTTTATAAAACAATTAATT ;:<5<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:5:89:942:84 83 seq2 759 74 35M = 562 -232 TACAAAACTCACAGGTTTTATAAAACAATTAATTG ===================>=>>>==>>===>==> MF:i:-126 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:6:159:493:275 83 seq2 760 72 35M = 939 214 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA =====3============================= MF:i:-126 Aq:i:72 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_11:1:81:1019:558 147 seq2 760 77 35M = 926 201 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA <<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7< MF:i:-126 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_62:7:162:195:761 147 seq2 767 30 18M4I13M = 922 190 TCACAGGTTTTATAAAACAATTAATTGAGACTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;; MF:i:-126 Aq:i:30 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_597:3:115:646:430 147 seq2 768 45 17M4I14M = 582 -217 CACAGGTTTTATAAAACAATTAATTGAGACTACAG 5;5<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:45 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:6:243:209:110 147 seq2 768 48 17M4I14M = 920 187 CACAGGTTTTATAAAACAATTAATTGAGACTACAG <<<<<;<;<<<;<<<<<<<<<<<;<:;<<:;;+85 MF:i:-126 Aq:i:48 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:2:266:994:429 147 seq2 769 76 16M4I15M = 612 -188 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA </<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:5:32:461:154 83 seq2 769 71 16M4I15M = 945 211 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<+<;; MF:i:-126 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:6:7:492:1088 83 seq2 769 57 16M4I15M = 926 192 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<<<<<<<<<<7<:<<<<<<6; MF:i:-126 Aq:i:57 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_95:6:174:650:125 147 seq2 770 76 15M4I16M = 600 -201 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG ===;=============================== MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_59:6:89:457:591 147 seq2 770 69 15M4I16M = 585 -216 CAGGTTTTATAAAACAATTAATTGAGACTACATAG 797<<9<<<<<<<3<7<<<<<<<<<<)<<<<<07< MF:i:-126 Aq:i:69 NM:i:1 UQ:i:15 H0:i:0 H1:i:0
+EAS114_39:2:38:670:564 83 seq2 770 73 15M4I16M = 930 195 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG <<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;<5<; MF:i:-126 Aq:i:73 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS188_7:4:92:693:228 147 seq2 770 75 14M4I17M = 601 -200 AAGGTTTTATAAAAAAATTAATTGAGACTACAGAG 6=77=<<=======&==================== MF:i:-126 Aq:i:75 NM:i:1 UQ:i:28 H0:i:0 H1:i:0
+EAS218_1:4:61:1369:440 147 seq2 770 47 15M4I16M = 964 229 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<8 MF:i:-126 Aq:i:47 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_26:4:123:1001:580 83 seq2 771 43 14M4I17M = 617 -185 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC <.00..3<6<<<<<<<3;<<08<<<<<6<<<<<<< MF:i:-126 Aq:i:43 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:4:10:1312:1558 147 seq2 771 76 14M4I17M = 928 192 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC 5<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<;8;< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS220_1:8:45:178:1321 83 seq2 771 77 14M4I17M = 606 -196 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC <<<<<<<<<<<<<<<<<:<<:<<<<<<<<<<<<<< MF:i:-126 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_59:5:125:137:58 147 seq2 772 76 13M4I18M = 932 195 GGTTTTATAAAACAATTAATTGAGACTACAGAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS192_3:3:285:349:797 83 seq2 773 76 12M4I19M = 604 -200 GTTTTAAAAAACCAATAATTGAGACTACAGAGCAA ;;<<<7.:<<<..<.<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:1 UQ:i:13 H0:i:0 H1:i:0
+EAS114_45:5:56:1757:1319 147 seq2 775 67 10M4I21M = 957 217 TTTATAAAACAATTAATTGAGACTACAGAGCAACT ;;;;9;;;;;;;;;;;;;4;9;98;;;;;9388&7 MF:i:-126 Aq:i:67 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_591:3:291:404:199 83 seq2 777 76 8M4I24M = 612 -197 TATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS54_65:7:159:253:353 83 seq2 778 67 7M4I24M = 613 -196 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <8<<<<:<<;;<<<<<<<<<<<;<<<<<<<<<<<< MF:i:-126 Aq:i:67 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_57:1:122:38:103 147 seq2 778 79 7M4I24M = 972 229 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<<<<<<<<<<;<<<<<<<<3<<<<9<8;< MF:i:-126 Aq:i:79 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS188_4:5:103:870:105 147 seq2 778 44 7M4I24M = 595 -214 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<<<<<<<=<:<;<<<<<<<<<<*<<<<<< MF:i:-126 Aq:i:44 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_105:8:24:718:322 147 seq2 779 23 35M = 953 209 ACAATTAATTGAGACTACAGACCAATTATGTAAAA 5/7<3+<;<1<<1<95<.&&.&&.<&)5)1)17<% MF:i:-126 Aq:i:23 NM:i:3 UQ:i:18 H0:i:0 H1:i:0
+EAS51_64:6:118:41:489 83 seq2 779 76 35M = 588 -226 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <+<<;<<<38<<<<5<<3<<<<3<<8<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_61:3:165:665:220 83 seq2 779 76 35M = 618 -196 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:6:238:803:383 83 seq2 779 75 35M = 954 210 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <<<<<<<<<<<<;<<<<<;<;<<;<<;<<<9<;<< MF:i:-126 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_105:3:232:364:583 83 seq2 780 71 35M = 956 211 CAATTAATTGAGACTACAGAGCAACTAGGTAAAAA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:-126 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:2:2:1217:398 83 seq2 780 99 40M = 608 -212 CAATTAATTGAGACTACAGAGCAACTAGGTAAAAAATTAA +;;:9<<66<<<;+<<7<<<<;<<+;<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:3 UQ:i:73 H0:i:1 H1:i:0
+B7_593:2:81:435:410 83 seq2 782 99 36M = 966 220 ATTAATTGAGACTACAGAGCAACTAGGTAAAAAATT <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<;<<;; MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+B7_593:3:115:649:259 147 seq2 782 99 36M = 617 -201 ATTAATTGAGAATACAGAGCAACTAGGTAAAAAATT ;<;<<;<<<<;&<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:3 UQ:i:58 H0:i:0 H1:i:1
+EAS1_93:3:181:93:694 147 seq2 783 99 35M = 954 206 TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT ++<<<<<<;<<<<<<:;8<<;<<<5;<;<<<+<<< MF:i:18 Aq:i:28 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS114_30:1:188:863:790 147 seq2 783 98 35M = 969 221 TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT ++<;<<;;;:<<<<:<:<<:1<<1<<<6:6;4;;4 MF:i:18 Aq:i:27 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS1_93:2:313:711:530 147 seq2 784 99 35M = 968 219 TAATTGAGACTACAGAGCAACTAGGTAAAAAATTA +<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<: MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_589:7:154:26:712 83 seq2 786 99 35M = 959 208 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:185:87:475 147 seq2 786 99 36M = 949 199 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:69:1593:819 147 seq2 786 99 40M = 977 231 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTAC <<<<<<<<<<<<<<;<<<<<;;<:<<<<<:<<<<<:777: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:309:187:267 83 seq2 786 99 35M = 616 -205 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <:0;<;<4<<7<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:82:1540:77 83 seq2 786 99 35M = 619 -202 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <48;<;</;<<<<<<:<<0<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:193:420:78 147 seq2 787 99 35M = 607 -215 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA 81<<;<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:261:267:597 83 seq2 787 86 35M = 617 -205 TTGAGAATAAAGAGCAACTAGGTAAAAAATTAACA *-1<9<+1<+<<<<:<<;9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:2 UQ:i:20 H0:i:0 H1:i:1
+EAS56_59:4:262:928:237 83 seq2 787 99 35M = 971 219 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:262:53:888 147 seq2 787 99 35M = 965 213 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<;<<<<<<<<<<;<<;<;<;6<<;<;;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:138:211:582 83 seq2 788 99 35M = 957 204 TGAGACTACAGAGCAAATAGGTAAAAAATTAACAT <<;<<<<<<<<<<<<<&;<;<7<<;<<<<<<<5<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:7:113:408:211 83 seq2 789 99 35M = 952 198 GAGACTACAGAGCAACTAGGTAAAAAATTAACATT <<<<<<<<<<<<<<<:&<<<&:<<<<<<<<<<;:/ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:79:879:15 147 seq2 790 99 35M = 626 -199 AGACTACAGAGCAACTAGGTAAAAAATTAACATTA <;;5;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:325:795:213 83 seq2 790 99 35M = 618 -207 AGACTACAGAGCAACTAGGTAAAAAATTAACATTA <<<0<<;<<<<;<<;:<<<<<<<<<<<;<<<<<9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:22:206:150 83 seq2 792 99 35M = 619 -208 AAAAAAGAGCAACTAGGTAAAAAATTAACATTACA 8&)<)<<<<+<<+<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:3 UQ:i:21 H0:i:1 H1:i:0
+EAS56_59:5:181:713:140 147 seq2 793 84 35M = 615 -213 CTACAGAGCAACAAGGTAAAAAATTAACATTACAA 78<+<7<-7;;;&<5<7<<<<7<<<<<<<<<<<7< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:7:76:306:561 147 seq2 794 89 35M = 987 228 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC <<)<<<<<<8<<8<<<<<<<;;;<<1<<3;=7<<9 MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:325:352:67 83 seq2 794 99 35M = 622 -207 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC ;<8<<<;;<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:310:287:420 83 seq2 794 99 35M = 965 206 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:74:329:459 83 seq2 795 99 35M = 623 -207 ACAGAGCAACTAGGTAAAAAATTAACATTACAACA </<;<8/<<9<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:57:1342:1166 83 seq2 796 99 35M = 964 203 CAGAGCAACTAGGTAAAAAATTAACATTACAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:542:428 147 seq2 797 99 35M = 965 203 AGAGCAACTAGGTAAAAAATTAACATTACAACAGG 7<4<<<6<<,<9)<<<<6<,<<7<<7<<<<<<<<1 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:97:892:419 83 seq2 800 99 35M = 621 -214 GCAACTAGGTAAAAAATTAACATTACAACAGGAAC ;8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:82:1051:921 83 seq2 800 99 40M = 616 -224 GCAAATAGGTAAAAAATTAACATTACAACAGGAACAAAAC 3-::-7<;+:9<;<<<5<;9,::53-;:3<<<<9<<3<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS1_95:5:263:511:936 147 seq2 801 99 35M = 629 -207 CAAATAGGTAAAAAATTAACATTACAACAGGAACA +<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS114_26:7:157:876:302 147 seq2 801 99 35M = 964 198 CAACTAGGTAAAAAATTAACATTACAACACGAACA 2<<;<<<22<<<<<<77<<<<22<7<<<<%-<<1< MF:i:18 Aq:i:66 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_65:2:127:288:655 147 seq2 803 99 35M = 999 231 ACTAGGTAAAAAATTAACATTACAACAGGAACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:83:731:540 147 seq2 804 99 35M = 623 -216 CTAGGTAAAAAATTAACATTACAACAGGAACAAAA ;7<:+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:82:843:1838 83 seq2 804 99 35M = 999 230 CTAGGTAAAAAATTAACATTACAACAGGAACAAAA ;<<;:;;<<<;;<<<<;;<<;;;;;<;;;;68887 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:71:994:576 147 seq2 805 99 35M = 655 -185 TAGGTAAAAAATTAACATTACAACAGGAACAAAAC <<9;;<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:24:415:944 83 seq2 805 99 35M = 974 204 TAGGTAAAAAATTAACATTACAACAGGAACAAAAC <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:73:1458:1337 83 seq2 806 99 35M = 609 -232 AGGTAAAAAATTAACATTACAACAGGAACAAAACC <</<<<<<<<6:<::<<<1<<:<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:142:353:398 147 seq2 807 99 35M = 977 205 GGTAAAAAATTAACATTACAACAGGAACAAAACCT =================================9= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:46:522:426 147 seq2 807 99 35M = 964 192 GGTAAAAAATTAACATTACAACAGGAACAAAACCT =======================:==;<===78== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:59:871:351 147 seq2 808 99 35M = 963 190 GTAAAAAATTAACATTACAACAGGAACAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:235:505:553 147 seq2 808 99 35M = 987 214 GTAAAAAATTAACATTACAACAGGAACAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:60:1420:660 83 seq2 808 99 35M = 649 -194 GTAAAAAATTAACATTACAACAGGAACAAAACCTC 99<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:180:89:582 147 seq2 809 99 36M = 650 -195 TAAAAAATTAACATTACAACAGGAACAAAACCTCAT ;<<<<<<4<<<:<<<<<<<<<6<<<<<<<<<<;<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:323:196:855 83 seq2 809 99 35M = 642 -202 TAAAAAATTAACATTACAACAGGAACAAAACCTCA &<<<<<<09<<7<7;<;<<0<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:295:547:216 147 seq2 809 99 35M = 970 196 TAAAAAATTAACATTACAACAGGAACAAAACCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:126:361:250 83 seq2 810 99 35M = 1002 227 AAAAAATTAACATTACAACAGGAACAAAACCTCAT <<<<<<;9<<<<<<<<<<<<<<;;;<<<;<664;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:266:133:789 83 seq2 810 99 35M = 988 213 AAAAAATTAACATTACAACAGGAACAAAACCTCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:175:149:296 83 seq2 811 99 35M = 614 -232 AAAAATTAACATTACAACAGGAACAAAACCTCATA =;==26==;==;================7====== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:136:260:254 83 seq2 813 99 35M = 988 210 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:85:1521:58 147 seq2 813 99 40M = 639 -214 AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT :::86<<:<<8<<<<;<<8<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:164:719:947 83 seq2 813 99 35M = 1005 227 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:50:257:341 147 seq2 813 99 35M = 971 193 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<6<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:117:33:262 83 seq2 814 99 35M = 642 -207 AATTAACATTACAACAGGAACAAAACCTCATATAT <<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:90:706:1276 147 seq2 814 99 35M = 980 201 AATTAACATTACAACAGGAACAAAACCTCATATAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:116:966:193 147 seq2 815 99 35M = 967 187 ATTAACATTACAACAGGAACAAAACCTCATATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:59:742:549 147 seq2 816 99 35M = 642 -209 TTAACATTACAACAGGAACAAAACCTCATATATCA -<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:74:213:877 83 seq2 816 99 35M = 996 215 TTAACATTACAACAGGAACAAAACCTCATATATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_610:3:85:219:371 147 seq2 817 99 35M = 967 185 TAACATTACAACAGGAACAAAACCTCATATATCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:176:653:957 147 seq2 819 82 35M = 982 198 ACATTACAACAGGAACAAAACCTCATATATCAATA ????????????<<???@<<<<<@<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:64:526:339 147 seq2 819 96 35M = 1019 235 ACATTACAACAGGAACAAAACCTCATATATCAATA <<<<<<<<;<<<<<<<<<<7<:<<<<<<<<<8:<: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:97:743:602 83 seq2 821 99 34M = 644 -211 ATTACAACAGGAACAAAACCTCATATATCAATAT <(&<:<<&<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+B7_610:2:75:887:149 147 seq2 823 99 35M = 1004 216 TACAACAGGAACAAAACCTCATATATCAATATTAA <<<<<<<<<<<<<<;<<<<<<<;<<<<<<<;<;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS221_1:2:73:955:728 83 seq2 823 44 35M = 660 -198 TACAACAGGAACAAAACCTCATATATCAATATTAA ;<-<<6<;<<<6<<<<;7<6<<<<<<<<<<<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:3 H1:i:18
+EAS1_108:2:102:543:160 147 seq2 825 99 35M = 977 187 CAACAGGAACAAAACCTCATATATCAATATTAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_28:2:55:562:403 83 seq2 825 99 36M = 643 -218 CAACAGGAACAAAACCTCATATATCAATATTAACTT +<<&<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+B7_593:1:19:695:59 83 seq2 826 99 36M = 988 198 AACAGGAACAAAACCTCATATATCAATATTAACTTT <<<<<<<<<<<;<<<<<<<<<;<<;;<;<<7<<<<; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS221_1:2:8:327:522 147 seq2 826 99 35M = 1001 210 AACAGGAACAAAACCTCATATATCAATATTAACTT <<<<<<<<<<:<<<<<<<<<<:<<<<<<<<<:<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS114_45:6:90:561:850 147 seq2 827 85 35M = 1004 212 ACAGGAACAAAACCTCATATATCAATATTAACTTT ;;;;;;;;;;;;;;;;;;;;;;;;9;9;6;77777 MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:2 H1:i:25
+EAS56_61:5:209:824:866 83 seq2 828 73 35M = 665 -198 CAGCAACAAAACCTCATATATCAATATTAACTTTG ;<:&<<:<<<<;<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:1 UQ:i:5 H0:i:1 H1:i:7
+EAS139_11:2:31:628:1820 83 seq2 828 98 35M = 675 -188 CAGGAACAAAACCTCATATATCAATATTAACTTTG <<<<<<:<<<<:6<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS220_1:4:6:1178:1105 147 seq2 830 93 35M = 657 -208 GGAACAAAACCTCATATATCAATATTAACTTTGAA <:<<9<<<<::7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:11
+EAS114_28:4:305:707:258 83 seq2 831 58 36M = 992 197 GAACAAAACCTCATATATCAATATTAACTTTGAATA 9<<<<<<<<<<<<;<<-<<;;<;<<9<<;<<+99;7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:2 H1:i:9
+EAS54_67:3:114:736:433 147 seq2 832 63 35M = 998 201 AACAAAACCTCATATATCAATATTAACTTTGAATA ;<<9<8;<<<<8<8<;<<;;;0<<8;<;<<47;;; MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_591:7:157:447:758 83 seq2 833 99 36M = 994 197 ACAAAACCTCATATATCAATATTAACTTTGAATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_591:4:159:508:571 83 seq2 834 84 36M = 989 191 CAAAACCTCATATATCAATATTAACTTTGAATAAAA <<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_65:7:68:825:405 147 seq2 835 30 35M = 1015 215 AAAACCTCATATATCAATATTAACTTTGAATAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+B7_593:3:102:856:670 83 seq2 836 99 36M = 1025 225 AAACCTCATATATCAATATTAACTTTGAATAAAAAG <<<<<<<;<<<;<<;:<<<<<<<<<<:;;<<;<<<7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:260:827:289 147 seq2 836 99 35M = 999 198 AAACCTCATATATCAATATTAACTTTGAATAAAAA <<<<2<<<<;<<<<;<<<<<<:<<<&-<8<<88<3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_28:1:220:801:282 147 seq2 837 99 36M = 660 -213 AACCTCATATATCAATATTAACTTTGAATAAAAAGG ;7;87;===;==;====:===<==7=========== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:57:1675:720 147 seq2 841 99 35M = 684 -192 TCATATATCAATATTAACTTTGAATAAAAAGGGAT <,<<<<<<:<<<<<<<<:9<<<<<<<<;<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:297:949:26 83 seq2 842 99 35M = 676 -201 CATATATCAATATTAACTTTGAATAAAAAGGGATT 5<;<;<;:<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:76:34:691 89 seq2 843 58 35M * 0 0 ATATATCAATATTAACTTTGAATAAAAAGGGATTA <<<<<<16<<<<<916<<<499<966161919<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:98:995:929 83 seq2 844 99 35M = 680 -199 TATAACAATATTAACTTTGAATAAAAAGGGATTAA &<+<'7<<+<&<<<7+4<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:63 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS139_19:3:58:923:1915 147 seq2 846 99 40M = 1007 201 TATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCC <<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<::::: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:181:476:394 83 seq2 847 99 35M = 666 -216 AACAATATTAACTTTGAATAAAAAGGGATTAAATT <+;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS112_32:7:322:391:742 147 seq2 847 99 35M = 667 -215 ATCAATATTAACTTTGAATAAAAAGGGATTAAATT <63<<<<9<<<:<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:17:437:1378 83 seq2 847 99 35M = 676 -206 ATCAATATTAACTTTGAATAAAAAGGGATTAAATT <<7<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:155:375:623 147 seq2 849 99 35M = 1029 215 CAATATTAACTTTGAATAAAAAGGGATTAAATTCC 0<<<<<;<<<<<<<<<<<<<4<<8<<<<<<<<;<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:29:729:70 147 seq2 850 51 35M = 1009 194 ANTATTANCTTTGANNAAAAAGGGATTAAATTCCC :!<:<<8!::::5:!!:.77::33888633:8777 MF:i:-126 Aq:i:51 NM:i:3 UQ:i:0 H0:i:0 H1:i:0
+EAS54_65:7:117:452:744 83 seq2 850 99 35M = 676 -209 AATATTAACTTTGAATAAAAAGGGATTAAATTCCC <;;<;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:288:384:444 83 seq2 855 99 35M = 696 -194 TAACTTTGAATAAAAAGGGATTAAATTCCCCCACT ;=9;;<====<=;=/=9;<========<======= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:133:514:754 147 seq2 855 63 36M = 1036 217 TAAATTTGAATAAAAAGGGATTAAATTCCCCCACTT ***&,,,+(*,*********+*)*(***(**((*)( MF:i:18 Aq:i:19 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_19:5:68:306:409 147 seq2 856 99 40M = 682 -214 AACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG ::2:7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:155:758:710 147 seq2 859 98 35M = 1048 224 TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG =======8================6=:7===:=:= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:39:208:644 147 seq2 859 99 35M = 704 -190 TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG 78899;;;;4;;;;;;;;;;;;;;;;;;8;;8;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:16:438:245 89 seq2 860 65 35M * 0 0 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA 8*8<5'<77;;;;;7<7<<7-<;<<<;;<<<;;79 MF:i:32 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:145:635:390 83 seq2 860 99 35M = 673 -222 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA +9;<<;<<<<<;;;<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:187:996:432 147 seq2 860 99 36M = 693 -203 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG ;<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:123:924:645 147 seq2 861 84 36M = 1045 220 TGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA <<<<<<<<<<<<;<<<<<<;<<<<<<<6:<7<1<+< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:146:961:63 147 seq2 861 86 35M = 1041 215 TGAATAAAAAGGGCTTAAATTCCCCCACTTAAGGG <<+<<<<::+1<;&<<88<<<<;;.<0;;85(;(8 MF:i:18 Aq:i:37 NM:i:2 UQ:i:12 H0:i:0 H1:i:1
+EAS114_30:6:4:665:771 69 seq2 862 0 * = 862 0 GTGCTTTATCTGATATCAATGCCGATAAACTGCCT <<<<<<<<<<<<%<8<3:7:77<(7,:3(:&2:(0 MF:i:-64
+EAS114_30:6:4:665:771 137 seq2 862 71 35M = 862 0 GAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA <;<<;<18<;<8<<<<;<;;<<<<1<<<<6;;;;; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:45:601:439 83 seq2 864 99 35M = 691 -208 ATAAAAAGGGATTAAATTCCCCCACTTAAGAGATA <8<<<<<<1<<<<<<<<)<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:126:966:514 147 seq2 865 99 35M = 1027 197 TAAAAAGGGATTAAATTCCCCCACTTAAGAGATAT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:76:1765:700 83 seq2 866 99 35M = 680 -221 AAAAAGGGATTAAATTCCCCCACTTAAGAGATATA 77777;;;;7;7;<;;;;+;;<9<<<79;<1<<77 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:155:807:19 83 seq2 867 99 35M = 1074 242 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<<<<<<<<<<<<<<9+<<<<<<9<<9;4<<<<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:226:885:729 83 seq2 867 98 35M = 1037 205 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<;<<<<<<;<;<<<<<<<:;<<;4;%;<<;<<. MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:1:156:196 83 seq2 867 77 40M = 1042 215 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGG <<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<:;9:9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:52:1144:509 147 seq2 867 99 35M = 706 -196 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<<:<<<<<<<<<<;::;:<;<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:73:735:329 83 seq2 868 99 35M = 1035 202 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA ================;==;====;=;=======; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:11:801:386 147 seq2 868 97 35M = 1061 228 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA <<<<<<<<<<8<<<<<:4<::<854:5<:::;4+4 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:150:94:843 83 seq2 868 75 35M = 1050 217 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA <<<<<<<<7<<<6<<<<<<<<<<<6<<62<<<<<2 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:255:796:239 147 seq2 869 99 35M = 692 -212 AAGGGATTAAATTCCCCCACTTAAGAGATAGAGAT <<3;;<7:<<<;(7<<7;<<;<<<<<<<<<7<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:22 H0:i:0 H1:i:1
+B7_589:5:147:405:738 147 seq2 870 99 35M = 1048 213 AGGGATTAAATTCCCCCACTTAAGAGATATAGATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:33:357:858 83 seq2 870 99 35M = 716 -189 AGGGATTAAATTCCCCCACTTAAGAGATATAGATT <;<:<<<<<<<<<;<9<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:122:398:994 83 seq2 871 99 35M = 708 -198 GGGATTAAATTCCCCCACTTAAGAGATATAGATTG 95:<9<<<<:9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_105:2:146:374:692 147 seq2 874 99 35M = 690 -219 ATTAAATTCCCCCACTTAAGAGATATAGATTGGCA <4:<<<1:<:<::<<<;<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:119:428:415 147 seq2 876 99 36M = 1037 197 TAAATTCCCCCACTTAAGAGATATAGATTGGCAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;<;;; MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:168:247:414 147 seq2 876 99 35M = 698 -213 TAAATTCCCCCACTTAAGAGATATAGATTGGCAGA ,;;;,146<6;6<<8<<<<1<8<<<<<<<<<<;1< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:130:609:467 147 seq2 877 99 35M = 728 -184 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAA ===:2===;<====>==>=>=>=>>>==>>>=>>> MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:57:366:844 83 seq2 877 99 40M = 708 -209 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT ;;;7:8&555<,;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:236:475:254 147 seq2 880 99 35M = 1051 206 TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG <<<<<<<<<<<<<<<<<<<<<<<<<:::<:;</;/ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:251:819:772 147 seq2 881 99 36M = 726 -191 TCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT 6+7++1<<%<<<<<<<+<+<9<<99<9<<<<<<9<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:36:481:1079 83 seq2 881 99 40M = 707 -214 TCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAA :11+)*<4;<<<<<<<<<;;<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:29:411:1208 147 seq2 882 99 40M = 698 -224 CCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAA 766+6<996<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:62:1076:540 83 seq2 882 99 35M = 1066 219 CCCCCACTTAAGAGATATAGATTGGCAGAACAGAT <<<<<<<<<<;<<<<<<<<<<<<<<<<;;<<;<7; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:189:530:40 83 seq2 883 99 36M = 698 -221 CCCCACTTAAGAGATATAGATTGGCAGAACAGATTT 883;<<<<<<<<<:<<<<<<<<3<;<<<<<<<<;<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:113:856:319 147 seq2 884 99 35M = 1067 216 CCCACTTAAGAGATATAGATTGGCAGAACAGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:55:296:1457 83 seq2 884 99 35M = 1061 212 CCCACTTAAGAGATATAGATTGGCAGAACAGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:15:881:1932 83 seq2 886 92 35M = 1061 210 CACTTAAGAGATATAGATTGGCAGAACAGATTTAA <<<<<<<<<<<<<<<;<<<<:<<<2<26<8<<;;. MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:116:157:612 147 seq2 889 99 35M = 707 -217 TTAAGAGATATAGATTGGCAGTACAGATTTAAAAA ;;<<<<<<<<<<<<<<<<;<</<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS114_28:7:215:863:521 83 seq2 890 99 36M = 732 -194 TAAGAGATATAGATTGGCAGAACAGATTTAAAAACA ;<<<<<<<<<<<<<;<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:254:572:431 147 seq2 891 97 35M = 1048 192 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<<<<<<<<<<<;<<<<<<<<<<<99;;;;; MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:273:424:207 147 seq2 891 99 35M = 1066 210 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <,<,<9<<9<<<<<<<<<<79<,599,<191<99+ MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:4:571:820 147 seq2 891 99 35M = 1071 215 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<<<<<<9<<;9<;;;<;6;:<<<3:;;;:6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1231:1381 147 seq2 891 99 35M = 708 -218 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<;<<<<<<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:66:718:481 83 seq2 891 99 40M = 1072 221 AAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAAC <<<<<<<<<<<<<<;<<<<<<<<;<<<<<<<;<<<:1:;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:22:632:176 147 seq2 894 99 36M = 1091 233 AGATATAGATTGGCAGAACAGATTTAAAAACATGAA <<<<<;<<<<<<;<<;<:<<<:<<:<<<;<<<;;;: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:271:180:509 147 seq2 896 99 35M = 729 -202 ATATAGATTGGCAGAACAGATTTAAAAACATGAAC <<<<<<<<<9<:<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:198:564:731 147 seq2 898 99 35M = 1089 226 ATAGATTGGCAGAACAGATTTAAAAACATGAACTA <<<<<;<<<<<<;<<:<<;9<<<<<<<<1;<<58< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1467:1447 83 seq2 898 99 35M = 722 -211 ATAGATTGGCAGAACAGATTTAAAAACATGAACTA <<<<<::<<:<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:172:827:592 83 seq2 899 99 35M = 703 -231 TAGATTGGCAGAACAGATTTAAAAACATGAACTAA 8<<<<;7;7<<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:240:719:799 147 seq2 900 99 35M = 720 -215 AGATTGGCAGAACAGATTTAAAAACATGAACTAAC <:<<<<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:24:1345:1627 73 seq2 900 78 35M = 900 0 AGATTGGCAGAACAGATTTAAAAACATGAACTAAC <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<8<3 MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:24:1345:1627 133 seq2 900 0 * = 900 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS139_19:1:58:726:1746 147 seq2 900 99 40M = 1061 201 AGATTGGCAGAACAGATTTAAAAACATGAACTAACTATAT <<<<<<<<<<<<<<<<<<<6<<<<8<<<<<<<<:8:8:88 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:88:451:1773 147 seq2 902 99 35M = 742 -195 ATTGGCAGAACAGATTTAAAAACATGAACTAACTA 973776;;;;;;;;;::;;;;;;;;;;;;;;3;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:178:187:610 147 seq2 903 99 35M = 744 -194 TTGGCAGAACAGATTTAAAAACATGAACTAACTAT 66:,:<7<<<<<<<1<<<<<<<<<<<<<<<2<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:38:332:54 83 seq2 904 99 36M = 737 -203 TGGCAGAACAGATTTAAAAACATGAACTAACTATAT 8;;&<;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:210:674:911 147 seq2 904 99 35M = 740 -199 TGGCAGAACAGATTTAAAAACATGAACTAACTATA 27;2<;<<5<<<<;;<<<<<;<<<<<<;<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:82:963:128 83 seq2 905 99 35M = 719 -221 GGCAGAACAGATTTAAAAACATGAACTAACTATAT 585<;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:12:1335:1372 83 seq2 906 99 40M = 721 -225 GAAGAACAGATTTAAAAACATGAACTAACTATATGCTGTT :&;;;<*<<<9<<<<<<<<<<<<<<4<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_39:1:98:641:1040 147 seq2 907 99 35M = 1085 213 CAGAACAGATTTAAAAACATGAACTAACTATATGC <<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:41:530:663 83 seq2 908 99 35M = 730 -213 AGAACAGATTTAAAAACATGAACTAACTATATGCT =8=;*=5==;;=====:=====;===;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:87:430:995 147 seq2 909 67 35M = 731 -213 GAAAAGAGTTAAAAACATGAACTAACTATATGCTG 1<4%81<..1<<<<<0<<<<<0.<<9<<(<6<<6< MF:i:18 Aq:i:30 NM:i:2 UQ:i:17 H0:i:0 H1:i:1
+B7_595:3:85:964:950 147 seq2 910 99 35M = 1095 220 AACAGATTTAAAAACATGAACTAACTATATGCTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:68:570:705 83 seq2 910 99 35M = 1100 225 AACAGATTTAAAAACATGAACTAACTATATGCTGT <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:198:503:669 83 seq2 912 99 35M = 1107 230 CAGATTTAAAAACATGAACTAACTATATGCTGTTT <<<<<<<<<<;8<<<<<;<<<<<<;<;<8<<8<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:273:545:1001 147 seq2 913 99 35M = 1088 210 AGATTTAAAAACATGAACTAACTATATGCTGTTTA <<<<<<<<<<<<<<<;;<<<<<<;<8;28<8;<<8 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:152:778:228 83 seq2 915 99 35M = 739 -211 ATTTAAAAACATGAACTAACTATATGCTGTTTACA <;;7=<<<<<<;<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:53:463:1132 147 seq2 915 99 40M = 1109 234 ATTTAAAAACATGAACTAACTATATGCTGTTTACANGAAA <<<<<<<<<<<<<<<<<<<<<;<<<8<<<<<<<8<!1488 MF:i:18 Aq:i:71 NM:i:1 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:12:630:707 147 seq2 915 99 35M = 751 -199 ATTTAAAAACATGAACTAACTATATGCTGTTTACA <:<<<<<<<;<<<<<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:179:119:876 147 seq2 917 60 35M = 1112 230 TTAAAAACATGAACTAACTATATGCTGTTTACCAG <<<<<<<7<<<<<<<8<<<6<<<<<<7<<<:0&<0 MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:1
+EAS1_97:6:308:667:658 83 seq2 918 10 35M = 1116 233 TAAAAACATGAACTAACTATATCCTTCTTACAATA 9<96<<<;<96<<9<51<<<<<1:9++<9*%4;*5 MF:i:18 Aq:i:10 NM:i:4 UQ:i:45 H0:i:0 H1:i:0
+EAS114_28:5:163:832:715 147 seq2 918 99 36M = 1085 203 TAAAAACATGAACTAACTATATGCTGTTTACAAGAA <<0;<9<<<<<<<<<<<<9<<<<<<<<<<<<;;;<6 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:179:496:161 83 seq2 919 99 36M = 756 -199 AAAAACATGAACTAACTATATGCTGTTTACAAGAAA <<<<<9<<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:13:325:483 147 seq2 919 99 35M = 1101 217 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_103:7:139:578:951 147 seq2 919 98 35M = 1095 211 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<0;; MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_108:8:19:929:765 83 seq2 919 98 35M = 1069 185 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;77< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:5:214:644:390 147 seq2 919 72 35M = 1082 198 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:6:243:209:110 83 seq2 920 48 35M = 768 -187 AAAACATGAACTAACTATATGCTGTTTACAAGAAA ;<;;;:<:<:;<<;;<;<;<;7<<;<<;;<;<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:247:900:123 83 seq2 920 99 35M = 1123 238 AAAACATGAACTAACTATATGCTGTTTACAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_62:7:162:195:761 83 seq2 922 30 35M = 767 -190 AACATGAACTAACTATATGCTGTTTACAAGAAACT <<8<<:<<:<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_103:2:184:980:396 147 seq2 923 99 35M = 1092 204 ACATGAACTAACTATATGCTGTTTACAAGAAACTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:162:272:415 83 seq2 923 83 35M = 1112 224 ACATGAACTAACTATATGCTGTTTACAAGAAACTC <<<<<<<<<<<<<<<<<<<<<<;<<<<<9;<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:184:237:476 147 seq2 925 99 35M = 1101 211 ATGAACTAACTATATGCTGTTTACAAGAAACTCAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:202:341:984 83 seq2 926 99 35M = 1094 203 TGAACTAACTATATGCTGTTTACAAGAAACTCATT =========================4;======== MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:107:738:484 83 seq2 926 75 35M = 1097 206 TGAACTAACTATATGCTGTTTACAAGAAACTCATT <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:7:492:1088 147 seq2 926 57 35M = 769 -192 TGAACTAACTATATGCTGTTTACAAGAAACTCATT 4;<<75<<::<:<<<-<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_11:1:81:1019:558 83 seq2 926 77 35M = 760 -201 TGAACTAACTATATGCTGTTTACAAGAAACTCATT <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:10:1312:1558 83 seq2 928 76 35M = 771 -192 AACTAACTATATGCTGTTTACAAGAAACTCATTAA <<:<<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:206:741:810 83 seq2 929 99 34M = 753 -210 ACTAACTATATGCTGTTTACAAGAAACTCATTAA <3<<;5<<<<<;:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:200:65:291 147 seq2 930 99 35M = 728 -237 CTAACTATATGCTGTTTACAAGAAACTCATTAATA ;9<;3<<9<7<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:38:670:564 147 seq2 930 73 35M = 770 -195 CTAACTATATGCTGTTTACAAGAAACTCATTAATA 3<<<3:<<<<<:;<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:57:1114:2032 83 seq2 931 99 35M = 1102 206 TAACTATATGCTGTTTACAAGAAACTCATTAATAA <7<<<<<<<<<<<<<<<<<777<<<7<<<<<3<<7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:125:137:58 83 seq2 932 76 35M = 772 -195 AACTATATGCTGTTTACAAGAAACTCATTAATAAA <<9;<<<<<;<;<<<<;<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:1:38:250:647 147 seq2 933 71 35M = 1100 202 ACTATATGCTGTTTACAAGAAACTCATTAATAAAT <<<<<<<9<<9<<<<<<<6<<<<<<<<<<8<779% MF:i:18 Aq:i:0 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS192_3:6:116:464:261 83 seq2 934 99 35M = 1107 208 CTATATGCTGTTTACAAGAAACTCATTAATAAAGA <<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<;;8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:168:69:249 147 seq2 936 99 35M = 1125 224 ATATGCTGTTTACAAGAAACTCATTAATAAAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:246:647:765 147 seq2 937 99 35M = 1119 217 TATGCTGTTTACAAGAAACTCATTAATAAAGACAT ;<<<<<<<<<;<&<<3+3<<<3<<9&</:/87</8 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:307:113:346 147 seq2 938 99 35M = 1123 220 ATGCTGTTTACAAGAAACTCATTAATAAAGACATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<8 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:159:493:275 147 seq2 939 72 35M = 760 -214 TGCTGTTTACAAGAAACTCATTAATAAAGACATGA 4949;<<<<<<<<<<<6<;<<<<;<<<<<*<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:257:288:731 83 seq2 939 99 34M = 1131 227 TGCTGTTTACAAGAAACTCATTAATAAAGACATG <<<<<<<<8<8<<;<;<<<;<<<5<;;88.8<6< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:231:815:626 147 seq2 940 99 35M = 1119 214 GCTGTTTACAAGAAACTCATTAATAAAGACATGAG <;<<<<9<<<<<<<<<<<<<<<<<;<<;5<<<;:; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:93:77:1338 147 seq2 940 10 35M = 1098 193 GCTGCTTACAAGAAGCGCATTAATAAAGACATGAG <<<<*<2<<<:<4<&<6<8<4<::<8<<<<82;;7 MF:i:18 Aq:i:0 NM:i:3 UQ:i:35 H0:i:0 H1:i:0
+EAS114_45:2:54:1886:719 83 seq2 941 99 35M = 1125 219 CTGTTTACAAGAAACTCATTAATAAAGACATGAGT ;;;9;;<;;;9;;;;;:;<9;:;;;;9;;;99799 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:94:273:165 83 seq2 945 99 35M = 1128 218 TTACAAGAAACTCATTAATAAAGACATGAGTTCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;:7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:32:461:154 147 seq2 945 71 35M = 769 -211 TTACAAGAAACTCATTAATAAAGACATGAGTTCAG ;;</<<<<<;:<.<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:303:131:673 147 seq2 947 99 36M = 1112 201 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:10:106:737 147 seq2 947 99 35M = 1106 194 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <<<;<1<;<<<<<<9<<<<;;<<<<<99<<94008 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:214:950:32 147 seq2 947 99 35M = 1132 220 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT >>=>>>>==>=>>>==>=>=:=====;=:=6:::6 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:10:686:1024 147 seq2 947 99 35M = 1103 191 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:53:61:31 147 seq2 949 99 35M = 1122 208 AAGAAACTCATTAATAAAGACATGAGTTCAGATAA <<<7;<7<<<;7<;;<7<7<7<;5<73<<</%;/; MF:i:18 Aq:i:66 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS114_28:6:185:87:475 83 seq2 949 99 36M = 786 -199 AAGAAACTCATTAATAAAGACATGAGTTCAGGTAAA <<4<<<+<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:235:899:847 83 seq2 950 99 35M = 1112 197 AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA <<3<;<<<<<<<<<;;<<<<<<<+<<<+6<8<3/< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:193:661:771 147 seq2 952 99 35M = 1129 212 AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG <<<<<<<<<;<<<;;;<<<<<;<<<=;<:;5:9:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:113:408:211 147 seq2 952 99 35M = 789 -198 AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG <:;:;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:24:718:322 83 seq2 953 23 35M = 779 -209 AACTCATTAATAATGTCATGAGTTCAGGTAAAGGG 5:+:0;**&+<00&<&<<<5<28<<;;<83<<<<< MF:i:18 Aq:i:23 NM:i:2 UQ:i:10 H0:i:0 H1:i:0
+EAS56_61:5:263:314:696 147 seq2 953 99 35M = 1117 199 AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG <<<<<<<<<<<<<<;<<<<<<<<<<<<:<<;<775 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:93:312:331 147 seq2 953 99 35M = 1145 227 AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:181:93:694 83 seq2 954 99 35M = 783 -206 ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG <4;8<<+<<:<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:238:803:383 147 seq2 954 75 35M = 779 -210 ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG ;;<;;<<<<<<<<<<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:44:77:1255 147 seq2 955 99 35M = 1113 193 CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT ;;;;;;;8;;;7;8;;;;;;;;;;886;;;76777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:232:364:583 147 seq2 956 71 35M = 780 -211 TCATTAATAAAGACATGAGTTCAGGTAAAGGGGTG ;%;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:256:354:173 147 seq2 957 99 36M = 1121 200 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:138:211:582 147 seq2 957 99 35M = 788 -204 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG :<8;<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:61:631:567 83 seq2 957 99 35M = 1131 209 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:56:1757:1319 83 seq2 957 67 35M = 775 -217 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG &7778<<<<<8<;<<:::;<:<4<<:<:;8<8<;< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:154:26:712 147 seq2 959 99 35M = 786 -208 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:10:975:766 147 seq2 959 99 35M = 1166 242 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGAAA <<<<<<<<;<<<<;<:<<;<6;;<<<:6-:+1+;; MF:i:18 Aq:i:64 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_73:5:220:733:736 83 seq2 959 99 35M = 1143 219 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<5<<;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:46:1566:668 147 seq2 959 99 35M = 1148 224 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:59:871:351 83 seq2 963 99 35M = 808 -190 TAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAG ;<<<<<:<;<<<4;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:46:522:426 83 seq2 964 99 35M = 807 -192 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA <<<<<:<<<<<<1/<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:157:876:302 83 seq2 964 99 35M = 801 -198 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA ===:=8=;==:892=,28==88==28====8=;;8 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:61:1369:440 83 seq2 964 47 35M = 770 -229 AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA <<<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS221_1:6:57:1342:1166 147 seq2 964 99 35M = 796 -203 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA <<<<<;<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:310:287:420 147 seq2 965 99 35M = 794 -206 AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT <<<<;<;<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:262:53:888 83 seq2 965 99 35M = 787 -213 AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:542:428 83 seq2 965 99 35M = 797 -203 AAGACATGAGTTCAGGTACAGGGGTGGAAAAAGAT <<876</3<8874:<8:<)<5<<<;<<<<7<<<:< MF:i:18 Aq:i:41 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+B7_593:2:81:435:410 147 seq2 966 99 36M = 782 -220 AGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT ;<;;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:85:219:371 83 seq2 967 99 35M = 817 -185 GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT <<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:116:966:193 83 seq2 967 99 35M = 815 -187 GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT =================================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:432:228 147 seq2 967 99 35M = 1145 213 GACATGAGTTCAGGGAAAGGGGTGGAAAAAGATGT <<<<<<<<<<<<<<8<<<<<<<<<<<<:<<<<<;; MF:i:18 Aq:i:47 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+B7_610:1:12:88:200 147 seq2 968 99 35M = 1133 200 ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT <<<<<<<<<<<;<<<<<<<;<<<:<<<<<<9<<5< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:313:711:530 83 seq2 968 99 35M = 784 -219 ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT <7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:74:866:49 147 seq2 969 99 35M = 1143 209 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ====================9==91==<=6==;:= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:248:17:435 83 seq2 969 99 35M = 1139 205 CATGAGTTCAGGAAAAGGGGTGGAAAAAGATGTTC <<<<8<<<888<+<<<<<;<:<<<<8<<<<<;3<3 MF:i:18 Aq:i:43 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS114_30:1:188:863:790 83 seq2 969 98 35M = 783 -221 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ;<7<<<55<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:75:1503:1399 147 seq2 969 99 40M = 1130 201 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC <<<<<<<<<<<<<<<<<<9<<<;<<<<<<;<<<<:::711 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:56:155:49 83 seq2 970 99 35M = 1145 210 ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT <<<<<<<<<<<<<<<<<<<<<<;<<;<<<;<9<9; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:295:547:216 83 seq2 970 99 35M = 809 -196 ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:262:928:237 147 seq2 971 99 35M = 787 -219 TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA ;<<<<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS219_1:1:50:257:341 83 seq2 971 99 35M = 813 -193 TGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:122:38:103 83 seq2 972 79 35M = 778 -229 GAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTAC ===;3<===:=======<================= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:82:670:302 83 seq2 973 99 35M = 1146 208 AGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:24:415:944 147 seq2 974 99 35M = 805 -204 GTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC <;;<<<<:<<<<<<<;<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:108:440:208 83 seq2 975 99 35M = 1142 202 TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA <<<;<<<<<<<<<</<<<<;<<<;<<;<;<64/:+ MF:i:18 Aq:i:43 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+B7_595:3:229:543:583 83 seq2 976 99 35M = 1139 198 TCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAA <<<<<<<<<<8<8<9<<<<8<<588<<<<*<2:2* MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:142:353:398 83 seq2 977 99 35M = 807 -205 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA =================================== MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:102:543:160 83 seq2 977 99 35M = 825 -187 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA 9==9=====;=====================<=== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:191:40:536 147 seq2 977 66 35M = 1167 225 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA <<<<<<<<8<<;<<8<<;<;;<<8<<<<<</<74/ MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:272:328:400 147 seq2 977 99 35M = 1151 209 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<7<;:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:69:1593:819 83 seq2 977 99 40M = 786 -231 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA );::7<<<<:;<<<<<<<<<<<<<<<9<<9<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:3:133:707:886 83 seq2 978 99 35M = 1146 203 AGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAAC <<<<7;<<<<<<<<<;<<<<<<<<<<<<<5<;66< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:4:92:411:955 83 seq2 979 99 36M = 1149 206 GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_61:8:60:358:494 83 seq2 979 44 35M = 1179 235 GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA <<<<<<<<<<<<<<<<<<<<<<<<<<:<:<<;;4; MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:7:41:34:211 147 seq2 980 99 35M = 1164 219 GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3:;5; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:40:1291:1045 83 seq2 980 99 35M = 1167 222 GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG <<<<<<<<<5<<5<<<<7<<<<<<<<<5<9<&%73 MF:i:18 Aq:i:39 NM:i:2 UQ:i:9 H0:i:1 H1:i:0
+EAS218_1:8:90:706:1276 83 seq2 980 99 35M = 814 -201 GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <;<<<<<<<;<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_32:4:5:396:292 147 seq2 981 99 35M = 1155 209 TAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGA <<<<<<<<<<<<<<;;<<<<:<<<<;;<;;3/&+8 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:176:653:957 83 seq2 982 82 35M = 819 -198 AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA ===::=============<==<====<======== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_71:6:264:705:89 83 seq2 983 99 34M = 1155 207 AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA <<<<<<<<<<;8<<<<<<<<<<<<<<<&<<,;;( MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:66:757:918 147 seq2 985 99 35M = 1143 193 GGGGTGGAAAAAGATGTTCTACGCAAACAGAAACC =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:114:506:971 147 seq2 986 99 35M = 1150 199 GGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA =================================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:220:809:850 83 seq2 986 60 35M = 1187 236 GGGGGGAAAAAGATGTGCTACACAAAAAGATTCCA <<;7;<<0::8<-6:<0624-*<&-93-,8+(&08 MF:i:-126 Aq:i:60 NM:i:4 UQ:i:64 H0:i:0 H1:i:0
+B7_589:7:76:306:561 83 seq2 987 89 35M = 794 -228 GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA 9<7<<9<<<<<<7<<71<71*7<<<<<<<<<<1<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS192_3:6:235:505:553 83 seq2 987 99 35M = 808 -214 GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA ;8518<<<<<;<;<<<;<<;<.<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:19:695:59 147 seq2 988 99 36M = 826 -198 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAAT ;+;8<<<<<<<<<<<5<<+<:<<;<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:136:260:254 147 seq2 988 99 35M = 813 -210 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA ;:;;<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:5:266:133:789 147 seq2 988 99 35M = 810 -213 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA 9;;<<<<<<<<<<<<5<<;<5<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:4:159:508:571 147 seq2 989 84 36M = 834 -191 TGGAAAAAGATGTTCTACGCAAACAGAAACCAAATG 9<6<<<<<<<<<<<;<<;<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:166:84:766 147 seq2 990 99 35M = 1167 212 GGAAAAAGATGTTCTACGCAAACAGAAACCAAATG <<<<<<<<;<<<<<<<<;<<<<<<;<<<7<;::93 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_61:6:283:963:234 83 seq2 992 99 35M = 1157 200 AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG <<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:4:184:659:377 83 seq2 992 99 35M = 1173 216 AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:305:707:258 147 seq2 992 58 36M = 831 -197 AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA 3<<7<,;<<<<0<66<6+<%<<<.<<<<<<<<<9<< MF:i:18 Aq:i:17 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS219_1:7:20:1444:328 83 seq2 993 99 35M = 1149 191 AAAAGATGTTCTACGCAAACAGAAACCAAATGAGA <<<<;<<<<<<<<;<<<<<<<<;<<<<<;<;;8:7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:157:447:758 147 seq2 994 99 36M = 833 -197 AAAGATGTTCTACGCAAACAGAAACCAAATGAGAGA <<<;<<5<</<<6<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:37:763:1437 147 seq2 994 99 35M = 1191 232 AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG ;;;;;6;;;;;;;;;:;6;5;5;;;;;76;767/7 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:94:1273:1462 147 seq2 995 99 35M = 1166 206 AAGATGTTCTACGCAAACAGAAACCAAATGAGAGA <<<<<<<<<<<<:<<<<<<<<:<<<<:6:7;744; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:74:213:877 147 seq2 996 99 35M = 816 -215 AGATGTTCTACGCAAACAGAAACCAAATGAGAGAA <<<<<<<&<<-<-<<<7<<<<<77<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:168:61:867 147 seq2 997 99 35M = 1188 226 GATGTTCTACGCAAACAGAAACCAAATGAGAGAAG ====7====================7======6== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:307:252:632 147 seq2 998 99 35M = 1142 179 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<;; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:37:604:389 83 seq2 998 99 35M = 1188 225 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<3<<<<<4<<<<<9<2;949<;35:95 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:147:687:428 83 seq2 998 99 35M = 1159 196 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:114:736:433 83 seq2 998 63 35M = 832 -201 ATGTTCTACGCAAACAGAAACCAAGTGAGAGAAGG <9<9+9;<6<9<<;9<<<<<;<<<99<<<<<<<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:24 H0:i:0 H1:i:1
+B7_597:8:35:118:589 147 seq2 999 99 35M = 1188 224 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<<9 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:127:288:655 83 seq2 999 99 35M = 803 -231 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA <<:<3<<:<.<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:260:827:289 83 seq2 999 99 35M = 836 -198 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA 6;99+<<<<<<<<<<<<<<6<<<<<7<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:82:843:1838 147 seq2 999 99 35M = 804 -230 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA 888829;;;;;;;;;;;;;;:;;;;;;;;;;;;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:64:350:174 147 seq2 1000 99 35M = 1166 201 GTTCTACGCAAACAGAAACCAAATGAGAGAAGGAG <<<<<<<<<<<<<<<<<<<<<:<<<<<6<<<<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:8:327:522 83 seq2 1001 99 35M = 826 -210 TTCTACGCAAACAGAAACCAAATGAGAGAAGGAGT ;;4;<-<-<<<7<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:126:361:250 147 seq2 1002 99 35M = 810 -227 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA 72:;7</<<<:<-7<<:<<<<<<<:<6<+:<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:571:366 147 seq2 1002 99 35M = 1194 227 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA <<<<<<<<<<<<<<<<<<<<<<<<<7<:<<99;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:202:275:776 147 seq2 1002 99 36M = 1196 230 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAG <<<<<<<<<<<<<<<<<<<<<;<<9<;;<<<;<;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:194:998:663 147 seq2 1002 99 35M = 1165 198 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:30:599:589 83 seq2 1003 99 36M = 1188 221 CTACGCAAACAGAAACCAAATGAGAGAAGGAGCAGC <<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;<&<<; MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS112_34:4:92:412:435 83 seq2 1003 89 35M = 1184 216 CTACGCAAACAGAAACCAANTGAGAGAAGGAGTAG <<<<<<<4<<<<<<<<<66!<<<<<<6<<77<<97 MF:i:18 Aq:i:43 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+B7_610:2:75:887:149 83 seq2 1004 99 35M = 823 -216 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC :<:<0<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:2:1422:1820 147 seq2 1004 99 35M = 1164 195 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC ;7;;;;;;;;:;;;;;;;;;;;;;;;;;;;77777 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:90:561:850 83 seq2 1004 85 35M = 827 -212 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC 78376<;;9<;<<;:9<<<6;<;<;;8;;<;/;;; MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:164:719:947 147 seq2 1005 99 35M = 813 -227 ACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCT ===,=========6====)================ MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:154:952:558 83 seq2 1007 99 35M = 1173 201 GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:58:923:1915 83 seq2 1007 99 40M = 846 -201 GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA :+;;;8<<<<<<,<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:253:175:31 83 seq2 1008 72 35M = 1187 214 CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<:<;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:29:729:70 83 seq2 1009 51 35M = 850 -194 AAACAGAAACCAAATGAGAGAAGGAGTAGCTATAC <<<:<<<<<<7<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:174:157:573 147 seq2 1012 99 35M = 1191 214 CAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:197:399:319 147 seq2 1012 99 35M = 1189 212 TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA +<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;;<<; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_65:7:68:825:405 83 seq2 1015 30 35M = 835 -215 AAACCAAATGAGAGAAGGAGTAGCTATACTTATAT <<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:13:701:55 83 seq2 1015 99 36M = 1187 208 AAACCAAATGAGAGAAGGAGTAGCTATACTTATATC <<<<<<<<<9<<<9<<<<<<6<<<<<<<6<<6<<6+ MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:128:555:941 153 seq2 1016 10 36M * 0 0 AACCAAAAGAGAGAAGGAGTAGTTATACACATATCA 55--555560355$55555555.57757$7555577 MF:i:32 Aq:i:10 NM:i:4 UQ:i:58 H0:i:0 H1:i:0
+EAS219_FC30151:1:53:140:421 147 seq2 1016 99 35M = 1185 204 AACCAAATGAGAGAAGGAGTAGCTATACTTATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:64:526:339 83 seq2 1019 96 35M = 819 -235 CAAATGAGAGAAGGAGTATCTATACTTATATCAGA 3<<<7<<;<<<<<<<<<<<;<<<<;<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS192_3:3:194:378:230 147 seq2 1022 99 35M = 1198 211 ATGAGAGAAGGAGTAGCTATACTTATATCAGATAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:45:239:851 147 seq2 1023 61 35M = 1211 223 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA <<88;<208<9<;6<<<6269;94<&401-662&2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:39:956:676 147 seq2 1023 99 35M = 1191 203 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA ;;;;;;;;;;;;9;;;;;;;;;;;;;;;9957777 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:15:1763:1143 83 seq2 1023 99 35M = 1193 205 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:309:109:987 147 seq2 1024 99 35M = 1194 205 GAGAGAAGGAGTAGCTATACTTATATCAGATAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<9<<<;<;;; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_593:3:102:856:670 147 seq2 1025 99 36M = 836 -225 AGAGAAGGAGTAGCTATACTTATATCAGATAAAGCA ;;<<<<:<<<:<<4<<<<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_610:6:107:252:533 147 seq2 1025 60 35M = 1173 183 AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:3
+EAS56_65:4:126:966:514 83 seq2 1027 99 35M = 865 -197 AGAAGAAGTAGCTATACTTATATCAGATAAAGCAC <4<<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:1 H1:i:1
+EAS114_26:1:171:527:247 147 seq2 1027 67 35M = 1194 202 AGAAGGAGTAGCTAGACTTATATCAGATAAAGCAC =4==4===8==99=&=8+9=19+.2.6'=99+999 MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:3
+EAS1_105:1:234:185:359 147 seq2 1029 46 35M = 1183 189 AAGGAGTAGCTATACTTATATCAGATAAAGCACAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;9--: MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:11
+EAS51_66:3:155:375:623 83 seq2 1029 99 35M = 849 -215 AAGGAGTAGCTATACTTATATCAGATAAAGCACAC ;;;;<<:<<<<;<<;<<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:5:4:939:2021 147 seq2 1031 99 40M = 1197 206 GGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAAT <<<<<<<<<<<<<<<<<<<<<97<<<;<<;<7;<<:48:: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS220_1:2:50:513:882 147 seq2 1031 99 35M = 1192 196 GGAGTAGCTATACTTATATCAGATAAAGCACACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS1_103:5:188:20:592 147 seq2 1032 95 35M = 1202 205 GAGTAGCTATACTTATATCAGATAAAGCACACTTT <<<<<<<<<<<<<<<<<<<<;;<<<<:<<<;<;;< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:3 H1:i:16
+EAS114_45:3:35:896:1588 147 seq2 1032 91 35M = 1205 208 GAGTAGCTATACTTATATCAGATAAAGCACACTTT ;;;;;;;;;;;;;;;;;;;;8;;;;;8;;;88989 MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:3 H1:i:18
+EAS1_108:6:73:735:329 147 seq2 1035 99 35M = 868 -202 TAGCTATACTTATATCAGATAAAGCACACTTTAAA ;;;9;<<7<<<<<<<<<<<<<<<<<<<2<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:133:514:754 83 seq2 1036 63 36M = 855 -217 AGCTATACTTATATCAGATAAAGCACACTTTAAATC ;;4;<;<;<<<<<<<<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS218_1:4:62:561:531 147 seq2 1036 99 35M = 1203 202 AGCTATACTTATATCAGATAAAGCACACTTTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_593:6:119:428:415 83 seq2 1037 99 36M = 876 -197 GCTATACTTATATCAGATAAAGCACACTTTAAATCA 84<<<<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:2:226:885:729 147 seq2 1037 98 35M = 867 -205 GCTGAACTTACATCAGATAAAGCACACTTTAAATC /*220%.(;<%<3.<<<4<<<<86;<8<<8<<<<< MF:i:18 Aq:i:30 NM:i:3 UQ:i:36 H0:i:0 H1:i:1
+EAS1_108:1:189:863:213 147 seq2 1039 99 35M = 1202 198 TATACTTATATCAGATAAAGCACACTTTAAATCAA <<<<<<<<<<<<<<<<<<<<;<<<;<<<<;7<9;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_597:4:146:961:63 83 seq2 1041 86 35M = 861 -215 TACTTATATCAGATAAAGCACACTTTAAATCAACA 7;;<<<<<;<<<7<<<<<<<<;;<<;<;<<;<<<7 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:68:996:104 83 seq2 1041 70 35M = 1214 208 TACTTATATCAGATAAAGCACACTTTAAATCAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:47:1791:444 147 seq2 1041 74 35M = 1213 207 TACTTATATCAGATAAAGCACACTTTAAATCAACA ;3;;;;;;;;;;;;;;;;;;;;;;;;;;;877977 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:1:156:196 147 seq2 1042 77 40M = 867 -215 ACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTA :::::<<<<<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:70:1349:1788 147 seq2 1043 99 35M = 1203 195 ATTATATCAGATAAAGCACACTTTAAATCAACAAC &<8<<<85:580;<:0-><;>588>9<>7:<0<9; MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:2:30:644:942 83 seq2 1045 83 35M = 1229 219 TATATCAGATAAAGCACACTTTAAATCAACAACAG <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<9;<9< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_591:2:123:924:645 83 seq2 1045 84 36M = 861 -220 TATATCAGATAAAGCACACTTTAAATCAACAACAGT ;<<<<*<<<<<<</7<2<8<<<<<<<4<<<<<<<<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_589:5:147:405:738 83 seq2 1048 99 35M = 870 -213 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA <9/<:<<<<<<<<7</<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_61:3:155:758:710 83 seq2 1048 98 35M = 859 -224 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA =46=4=5===:========:=7=7======11=== MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_73:7:254:572:431 83 seq2 1048 97 35M = 891 -192 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA <63<;<;<<<:7<:<7;<:<<<<:<<<<7<<<<:< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_57:7:33:954:724 147 seq2 1049 97 35M = 1210 196 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA ;<<<<<<<<<<<<<8<<<<:<;;<<;;<;<<;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_63:6:102:816:260 83 seq2 1049 99 35M = 1225 211 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:5:197:914:256 83 seq2 1049 97 35M = 1204 190 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8;::: MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_65:4:150:94:843 147 seq2 1050 0 35M = 868 -217 CAGATACATCCCACTTTAAATCAACCACAGTAAAA 4<9<41*747*7<:9<:7:::<72;+<;::<7<<< MF:i:18 Aq:i:0 NM:i:4 UQ:i:47 H0:i:0 H1:i:0
+EAS1_108:5:321:712:224 147 seq2 1051 58 35M = 1220 204 AGATAAAGCACACTTTAAATCAACAACAGAAAAAT <<<<<<<<2<<<<<<<<<<<<<<<:<<<<(<<:<, MF:i:18 Aq:i:28 NM:i:1 UQ:i:7 H0:i:1 H1:i:2
+EAS114_32:3:236:475:254 83 seq2 1051 99 35M = 880 -206 AGATAAAGCACACTTTAAATCAACAACAGTAAAAT <:<<<<<;9<7<;<<<<<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:72:1288:1211 83 seq2 1052 84 35M = 1235 218 GATAAAGCACACTTTAAATCAACAACAGTAAAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_65:2:264:157:150 83 seq2 1054 30 35M = 1238 219 TAAAGCACACTTTAAATCAACAACAGTAAAATAAA <<<<<<9<9<<<<.9;<<9&<97<;9933309605 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_95:7:310:800:761 147 seq2 1055 99 35M = 1249 229 AAAGCACACTTTAAATCAACAACAGTAAAATAAAA ===========================+======= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:88:465:1877 83 seq2 1055 99 35M = 1212 192 AAAGCACACTTTAAATCAACAACAGTAAAATAAAA <<<<<<<<<<;<<<<<<<<<<<<<<<<7<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:66:891:294 147 seq2 1057 99 35M = 1233 211 AGCACACTTTAAATCAACAACAGTAAAATAAAACA <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:100:735:530 147 seq2 1058 99 35M = 1257 234 GCACACTTTAAATCAACAACAGTAAAATAAAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:68:440:424 83 seq2 1060 99 35M = 1237 212 ACACTTTAAATCAACAACAGTAAAATAAAACAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS220_1:8:66:1046:167 83 seq2 1060 99 35M = 1241 216 ACACTTTAAATCAACAACAGTAAAATAAAACAAAG <<<<<:<<<<<<<<<<<<<9<;77<9<7<<;<9;- MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_81:6:11:801:386 83 seq2 1061 97 35M = 868 -228 CACTATAAATCAACAACAGTAAAATAAAACAAAGG 5<2:$6<<<38<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:3 H0:i:1 H1:i:1
+EAS114_28:2:141:7:963 147 seq2 1061 85 36M = 1240 215 CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA <<<<<<<<<<<<;<:<<<<<<1<<&<;<;<<;,<;5 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:55:296:1457 147 seq2 1061 99 35M = 884 -212 CACTTTAAATCAACAACAGTAAAATAAAACAAAGG -<%63<<<<<1<<<<<5<<<<<<<<<<<<<<<7<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:1:58:726:1746 83 seq2 1061 99 40M = 900 -201 CAATTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTC &:&::;<<<76<<:<<6<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS221_1:8:15:881:1932 147 seq2 1061 92 35M = 886 -210 CACTTTAAATCAACAACAGTAAAATAAAACAAAGG )<4<<<<<<<4<<4<<4<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_95:5:284:212:932 83 seq2 1063 10 35M = 1257 229 CTTTAAATCAACAACAATAAAAAAAAACAAAGGAG <<9<<<<<<<<<<<<<&&<<<<5<<<<8<<<1:<: MF:i:18 Aq:i:0 NM:i:2 UQ:i:25 H0:i:0 H1:i:0
+EAS139_19:4:18:1335:1514 83 seq2 1063 99 40M = 1235 212 CTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCAT <<<;<<<<<<<<<<<<<<<;<:<<;<<<<<<;<;<;;;9; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:273:424:207 83 seq2 1066 99 35M = 891 -210 TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:62:1076:540 147 seq2 1066 99 35M = 882 -219 TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC 6<<;:+=====5=:6===================2 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:113:856:319 83 seq2 1067 99 33M = 884 -216 AAATCAACAACAGTAAAATAAAACAAAGGAGGT <<<77<<:<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:19:929:765 147 seq2 1069 98 35M = 919 -185 ATCAACAACAGTAAAATAAAACAAAGGAGGTCATC <3+<<;<<;<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:88:54:900 147 seq2 1069 68 35M = 1257 223 ATCAACAACAGAAAAATAAAACAAAGGAGGTCATC .....&.....,....................... MF:i:18 Aq:i:19 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS56_63:7:109:22:383 147 seq2 1071 99 35M = 1244 208 CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<;<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:4:571:820 83 seq2 1071 99 35M = 891 -215 CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT &<<7<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:255:441:47 83 seq2 1072 99 35M = 1237 200 AACAACAGTAAAATAAAACAAAGGAGGTCATCATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<6<;:<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:66:718:481 147 seq2 1072 99 40M = 891 -221 AACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATG ::5::1<;;<<<<<<1<<<<<<<<<<<<7<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:155:807:19 147 seq2 1074 99 35M = 867 -242 CAACAGTAAAATAAAACAAAGGAGGTCATCATACA :==4=5:====:============:========== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:43:1229:1855 147 seq2 1074 99 35M = 1244 205 CAACAGTAAAATAAAACAAAGGAGGTCATCATACA <<<<<<<<<<<<<<<<<<<<<<<<<4<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:125:875:553 83 seq2 1075 99 36M = 1233 194 AACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:118:775:467 147 seq2 1075 99 35M = 1245 205 AACAGTAAAATAAAACAAAGGAGGTCATCATACAA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:301:161:195 83 seq2 1076 75 35M = 1239 198 ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:54:695:952 83 seq2 1076 99 35M = 1264 223 ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:77:589:741 147 seq2 1078 99 35M = 1263 220 AGTAAAATAAAACAAAGGAGGTCATCATACAATGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:200:263:280 147 seq2 1078 99 35M = 1236 193 AGTAAAATAAAACAAAGGAGGTCATCATACAATGA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;8<;1 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:64:199:1288 83 seq2 1079 77 35M = 1240 196 GTAAAATAAAACAAAGGAGGTCATCATACAATGAT <<<<<<<<<<<<<<;<<<<<<<<<<<<<<;<<<;< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:27:228:31 83 seq2 1082 99 35M = 1264 217 AAATAAAACAAAGGAGGTCATCATACAATGATAAA <<<<<<<<<<<<<<<<<;9<:;<<<<<<75<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:214:644:390 83 seq2 1082 72 35M = 919 -198 AAATAAAACAAAGGAGGTCATGATACAATGATAAA <<<;<<<<<<<<<<<<<<<<<&<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_45:2:79:554:354 83 seq2 1082 63 35M = 1242 195 AAATAAAACAAAGGAGGTCATCATACAATGATAAA 17;<;;+<<;;;;93;;:;3;;;;1;;;;<77744 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:303:542:924 147 seq2 1083 76 35M = 1242 194 AATAAAACAAAGGAGGTCATCATACAATGATAAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:8:26:242:35 83 seq2 1084 99 35M = 1251 202 ATAAAACAAAGGAGGTCATCATACAATGATAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:163:832:715 83 seq2 1085 99 36M = 918 -203 TAAAACAAAGGAGGTCATCATACAATGATAAAAAGA ;<<<<9<<<<<<<<;;<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:98:641:1040 83 seq2 1085 99 35M = 907 -213 TAAAACAAAGGAGGTCATCATACAATGATAAAAAG 4<<<<7<<<<<<<<<:<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:32:562:1695 83 seq2 1085 76 35M = 1258 208 TAAAACAAAGGAGGTCATCATACAATGATAAAAAG <<<<<<<<<<<<<<8<<<<<:<<<<<<<:<8<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:6:758:988 147 seq2 1087 99 35M = 1253 201 AAACAAAGGAGGTCATCATACAATGATAAAAAGAT 3+;0;0;;;0;;;;;;5;;;9;;;;90;;;57560 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:273:545:1001 83 seq2 1088 99 35M = 913 -210 AACAAAGGAGGTCATCATACAATGATAAAAAGATC <7(<<72;<2;27<;:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:74:656:272 147 seq2 1088 99 35M = 1245 192 AACAAAGGAGGTCATCATACAATGATAAAAAGATC <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:198:564:731 83 seq2 1089 99 35M = 898 -226 ACAAAGGAGGTCATCATACAATGATAAAAAGATCA <6<;<<<<<<:7<<;<<<8<<+<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:23:885:274 83 seq2 1089 99 35M = 1289 235 ACAAAGGAGGTCATCATACAATGATAAAAAGATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:22:632:176 83 seq2 1091 99 36M = 894 -233 AAAGGAGGTCATCATACAATGATAAAAAGATCAATT <9<<<<<<<-;<;<<7;6;<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:184:980:396 83 seq2 1092 99 35M = 923 -204 AAGGAGGTCATCATACAATGATAAAAAGATCAATT <<;;<77;;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:110:984:98 83 seq2 1092 99 36M = 1270 214 AAGGAGGTCATCATACAATGATAAAAAGATCAATTC 98<<<<<<2<<<<<<;;<;;<<<5;5;<<;;<<<<+ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:202:341:984 147 seq2 1094 99 35M = 926 -203 GGAGGTCATCATACAATGATAAAAAGATCAATTCA <<<(<8&<92<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:219:40:833 147 seq2 1094 99 35M = 1278 219 GGAGGTCATCATACAATGATAAAAAGATCAATTCA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:23:1126:1886 83 seq2 1094 99 35M = 1268 209 GGAGGTCATCATACAATGATAAAAAGATCAATTCA 7<<<7<<<<<<<<7<<<<<<<<<<<<<;8<;<<5< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:85:964:950 83 seq2 1095 99 35M = 910 -220 GAGGTCATCATACAATGATAAAAAGATCAATTCAG <<8::<<;;<<<;<<6<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:139:578:951 83 seq2 1095 98 35M = 919 -211 GAGGTCATCATACAATGATAAAAAGATCAATTCAG ;<0;:&<:9<<<7<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:107:738:484 147 seq2 1097 75 35M = 926 -206 GGTCATCATACAATGATAAAAAGATCAATTCAGCA .8/<<<7<8<<<<<<<<<<<<<<<<9<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:4:93:77:1338 83 seq2 1098 10 35M = 940 -193 GTCATCATACAATGAAAAAAAGATCAATTCAGCAA <<7<7<<<<<1<7<<&97;;<1<;1<<7<;7<<;< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_610:8:68:570:705 147 seq2 1100 99 35M = 910 -225 CATCATACAATGATAAAAAGATCAATTCAGCAAGA 4<;4<;;:<<<<<<<<;<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS51_62:1:38:250:647 83 seq2 1100 71 35M = 933 -202 AATAATAAAATGATAAAAAGATCAATTCAGCAAGA +<&+<1<,<<7<<7<<<<<<<1,<<<<7<<2<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:34 H0:i:0 H1:i:3
+EAS1_93:8:13:325:483 83 seq2 1101 99 35M = 919 -217 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA ;:;<;=:========;==========;======== MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:128:584:952 147 seq2 1101 99 35M = 1277 211 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA <<<<<<<<<<<<<<+<;<<<<<<;<<<;<<<+<66 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:184:237:476 83 seq2 1101 99 35M = 925 -211 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA <;2<;<4<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+EAS51_64:6:300:622:86 147 seq2 1102 99 35M = 1264 197 TCATACAATGATAAAAAGATCAATTCAGCAAGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:57:1114:2032 147 seq2 1102 99 35M = 931 -206 TATTACAATGATAAAAAGATCAATTCAGCAAGAAG ;+!5<4<<<<<<<<<<<<<;<&<;7<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:10 H0:i:1 H1:i:6
+B7_593:3:310:193:629 147 seq2 1103 99 36M = 1267 200 CATACAATGATAAAAAGATCAATTCAGCAAGAAGAT <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:6:529:366 83 seq2 1103 99 35M = 1291 223 CATACAATGATAAAAAGATCAATTCAGCAAGAAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:10:686:1024 83 seq2 1103 99 35M = 947 -191 CATACAATGATAAAAAGATCAATTCAGCAAGAAGA &<<<3<<<<<<<<<<<<<<7<<<<<<<<<<7<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS114_45:7:14:978:1296 147 seq2 1104 90 35M = 1249 180 ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT ;6;;;;;;;;;;;:;;;;;;;6;;;;;;;;77777 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS56_57:2:237:855:581 83 seq2 1105 87 35M = 1271 201 TACAATGATAAAAAGATCAATTCAGCAAGAAGATA <;4<7<<<;47<<74<:*<<2:<<7.799:2<<9: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+EAS139_19:7:85:262:751 147 seq2 1105 99 40M = 1305 240 TACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::92 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:10:106:737 83 seq2 1106 99 35M = 947 -194 ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT <-<<;<<<<<<<<<<<;<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+B7_610:6:143:620:158 147 seq2 1107 99 35M = 1283 211 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA <<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_67:6:198:503:669 147 seq2 1107 99 35M = 912 -230 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA 5<<:<<;<<<<<<<;;<<9<<<<<<<<;<<<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:6:116:464:261 147 seq2 1107 99 35M = 934 -208 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA ;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_73:5:263:557:988 83 seq2 1108 84 35M = 1289 216 AATGATAAAAAGATCAATTCAGCAAGAAGATATAA <<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<;<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:8
+EAS139_19:1:53:463:1132 83 seq2 1109 99 40M = 915 -234 ATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCC ;::;:<<<<<<<<:<<;<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:1528:799 83 seq2 1109 96 35M = 1306 232 ATGATAAAAAGATCAATTCAGCAAGAAGATATAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:7
+EAS54_81:7:324:472:791 83 seq2 1110 89 35M = 1274 199 TGATAAAAAGATCAATTCAGCAAGAAGATATAACC <<<<<<<<:<<<<<<<<<<<<<<:<<<<<<<<<:3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_61:8:4:173:814 147 seq2 1111 99 35M = 1289 213 GATAAAAAGATCAATTCAGCAAGAAGATATAACCA =====================<==========;== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_593:3:303:131:673 83 seq2 1112 99 36M = 947 -201 ATAAAAAGATCAATTCAGCAAGAAGATATAACCATC <;<<<<<<<<:<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:235:899:847 147 seq2 1112 99 35M = 950 -197 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT <7<<<<<<<<:<<<<:<</<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_105:8:179:119:876 83 seq2 1112 60 35M = 917 -230 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT <<<<<<<7<<<<<<;;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_59:2:162:272:415 147 seq2 1112 83 35M = 923 -224 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT =7=======;5==<<6==1==<============= MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_45:6:44:77:1255 83 seq2 1113 99 35M = 955 -193 TAAAAAGATCAATTCAGCAAGAAGATATAACCATC 79998;;;9:;<696<;.<;;<<;<;<;<;;;<8; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:162:257:203 147 seq2 1114 99 35M = 1301 222 AAAAAGATCAATTCAGCAAGAAGATATAACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:55:464:146 83 seq2 1114 99 35M = 1295 216 AAAAAGATCAATTCAGCAAGAAGATATAACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:308:667:658 147 seq2 1116 34 35M = 918 -233 AAAGATCACTTCAGCAATAAGATATAACCATCCTA <9;;;45;&<;&.<5683;84+<;<;+8<;<<8;< MF:i:18 Aq:i:10 NM:i:2 UQ:i:23 H0:i:0 H1:i:0
+EAS56_57:4:98:862:154 147 seq2 1116 99 35M = 1290 209 AAAGATCAATTCAGCAAGAAGATATAACCATCCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<9<:99<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_61:5:263:314:696 83 seq2 1117 99 35M = 953 -199 AAGATCAATTCAGCAAGAAGATATAACCATCCTAC <<;<;:<<<<7<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:83:1456:1854 147 seq2 1117 99 35M = 1275 193 AAGATCAATTCAGCAAGAAGATATAACCATCCTAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:231:815:626 83 seq2 1119 99 35M = 940 -214 GATCAATACAGCAAGAAGATATAACCATCCTACTA '<4%<<<22<<,<<;<<4;<<<<<<<<<<<<<<7< MF:i:18 Aq:i:41 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS114_32:4:246:647:765 83 seq2 1119 99 35M = 937 -217 GATCAATTCAGCAAGAAGATATAACCATCCTACTA 9<+,<<&,39<,<;<<<<<<<&<<<<;0<<3;<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:256:354:173 83 seq2 1121 99 36M = 957 -200 TCAATTCAGCAAGAAGATATAACCATCCTACTAAAT -9<<:9<<;6<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:53:61:31 83 seq2 1122 99 35M = 949 -208 CAATTCAGCAAGAAGATATAACCATCCTACTAAAT 5;;<95<<5<<<<<<<<<<:5;<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:308:509:948 83 seq2 1123 99 36M = 1298 211 AATTCAGCAAGAAGATATAACCATCCTACTAAATAC <9<<<<<<<;<7<<;<<<<<<<;<<<<7<<;2;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:247:900:123 147 seq2 1123 99 35M = 920 -238 AATTCAGCAAGAAGATATAACCATCCTACTAAATA ;;;;.<<4<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:307:113:346 83 seq2 1123 99 35M = 938 -220 AATTCAGCAAGAAGATATAACCATCCTACTAAATA <<<<9<<1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:168:69:249 83 seq2 1125 99 35M = 936 -224 TTCAGCAAGAAGATATAACCATCCTACTAAATACA ;0;<;;<<<<<<<<<<<<<;<<<8<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:54:1886:719 147 seq2 1125 99 35M = 941 -219 TTCAGCAAGAAGATATAACCATCCTACTAAATACA 883777;;:;;;;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:94:273:165 147 seq2 1128 99 35M = 945 -218 AGAAAGAAGATATAACCATCCTACTAAATACATAT ;3&;;:<<:<-<-<<8:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_95:7:155:530:532 147 seq2 1128 99 35M = 1319 226 AGCAAGAAGATATAACCATCCTACTAAATACATAT =================================== MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:61:1885:163 147 seq2 1128 99 40M = 1281 193 AGCAAGAAGATATAACCATCCTACTAAATACATATGCACC <<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<9::::4 MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:193:661:771 83 seq2 1129 99 35M = 952 -212 GCAAGAAGATATAACCATCCTACTAAATACATATG :&<<<<<<<<<<<<<;<<<;<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:75:1503:1399 83 seq2 1130 99 40M = 969 -201 CAAGAAGATATAACCATCCTACTAAATACATATGCACCTA &;;8;<<<;<<<<,6<<70<<7<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:42:28:552 147 seq2 1131 99 35M = 1294 198 AAGAAGATATAACCATCCTACTAAATACATATGCA <<<<<<<<<<<<<<<<<<<<<<<<;<;<3<:;9;8 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:61:631:567 147 seq2 1131 99 35M = 957 -209 AAGAAGATATAACCATCCTACTAAATACATATGCA <<7<<<<<<<<</<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:257:288:731 147 seq2 1131 99 35M = 939 -227 AAGAAGATATAACCATCCTACTAAATACATATGCA <<:<<7<<<<<;<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:214:950:32 83 seq2 1132 99 35M = 947 -220 AGAAGATATAACCATCCTACTAAATACATATGCAC =&==4======:;==6<==:=============== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:1:12:88:200 83 seq2 1133 99 35M = 968 -200 GAAGATATAACCATCCTACTAAATACATATGCACC 9<<;<<<;<;6;<;:<<<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:256:444:399 147 seq2 1133 99 35M = 1289 191 GAAGATATAACCATCCTACTAAATACATATGCACC <<<<<<<<<<<<<<<<<<<<<<<<<;;<<<-;<<8 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:174:753:617 83 seq2 1136 75 35M = 1299 198 GATATAACCATCCTACTAAATACATATGCACCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:115:226:443 83 seq2 1137 99 35M = 1314 212 ATATAACCATCCTACTAAATACATATGCACCTAAC <<<<<<<<<<<<<<<<;<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:26:1867:162 147 seq2 1137 70 35M = 1299 197 ATATAACCATCCTACTAAATACATATGCACCTAAC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78698 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:308:66:538 83 seq2 1138 99 35M = 1321 218 TATAACCATCCTACTAAATACATATGCACCTAACA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:229:543:583 147 seq2 1139 99 35M = 976 -198 ATAACCATCCTACTAAATACATATGCACCTAACAC </<;+5<855;<6<<<<;<<<<<<9<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:17:595:863 147 seq2 1139 89 35M = 1289 185 ATAACCATCCTACTAAATACACATGCACCTAACTC :<4:<<1:<<<9<+<+1<%<7&&9-71<17)7</4 MF:i:18 Aq:i:33 NM:i:2 UQ:i:19 H0:i:0 H1:i:1
+EAS51_62:7:248:17:435 147 seq2 1139 99 35M = 969 -205 ATAACCATCCTACTAAATACATATGCACCTAACAC <1<<88++<:<<:;<;<<<:<<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:35:186:412 83 seq2 1139 99 35M = 1306 202 ATAACCATCCTACTAAATACATATGCACCTAACAC <<<<<<<<4<<<<<:<<<<<<:<<<<<<<<<;;<: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:307:252:632 83 seq2 1142 99 35M = 998 -179 ACCATCCTGCTAAATACATATGCACCTAACACAAG <77<;,5<,9<<<<<<;<<<<<7<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS1_108:7:108:440:208 147 seq2 1142 99 35M = 975 -202 CCCATCCTACTAAATACATATGCACCTAACACAAG +35:486<<4<<<<<<<<<<<-<<<<<7<<)<<<- MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS1_95:7:74:866:49 83 seq2 1143 99 35M = 969 -209 CCAACCTACTAAATACATATGCACCTAACACAAGA :8<&<<<<7<<<<:<<<<<<8<5<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_61:2:66:757:918 83 seq2 1143 99 35M = 985 -193 CCATCCTACTAAATACATATGCACCTAACACAAGA <9<45;<<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:220:733:736 147 seq2 1143 99 35M = 959 -219 CCATCCTACTAAATACATATGCACCTAACACAAGA :;<77;<<9<<<<<9;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:175:289:351 83 seq2 1144 99 35M = 1319 210 CATCCTACTAAATACATATGCACCTAACACAAGAC <<<<<<<<<<;<<<<<<<<;<<<<<<<<<<<9<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:56:155:49 147 seq2 1145 99 35M = 970 -210 ATCCTACTAAATACATATGCACCTAACACAAGACT ;:5;;<5<<<<<<<<<<<<<<<<<<<<<<<<<<<= MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:299:336:613 83 seq2 1145 99 35M = 1293 183 ATCCTACTAAATACATATGCACCTAACACAAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:432:228 83 seq2 1145 99 35M = 967 -213 ATCCTACTAAATACATATGCACCTAACACAAGACT <76<<<:<<<<<<<;<:<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:93:312:331 83 seq2 1145 99 35M = 953 -227 ATCCTACTAAATACATATGCACCTAACACAAGACT <;;:;<6<<<<;<:<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:133:707:886 147 seq2 1146 99 35M = 978 -203 ACCTAATAAATACATATGCACCTAACACAAGACTA %5-2;&6<<<<<;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:9 H0:i:1 H1:i:0
+EAS51_62:3:50:312:219 147 seq2 1146 99 35M = 1288 177 TCCTACTAAATACATATGCACCTAACACAAGACTA <<<<<<<<<<<;<<<<<;<;<<<;<<<<<<;;;;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:82:670:302 147 seq2 1146 99 35M = 973 -208 TCCTACTAAATACATATGCACCTAACACAAGACTA %448<7<<<<<<7<<<<<&<<7<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:47:591:698 83 seq2 1146 99 35M = 1313 202 TCCTACTAAATACATATGCACCTAACACAAGACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:122:430:882 83 seq2 1147 99 35M = 1338 226 CCTACTAAATACATATGCACCTAACACAAGACTAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:46:1566:668 83 seq2 1148 99 35M = 959 -224 CTACTAAATACATATGCACCTAACACAAGACTACC 5<<:<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:92:411:955 147 seq2 1149 99 36M = 979 -206 TACTAAATACATATGCACCTAACACAAGACTACCCA 2<+<<<<9<<<<<<<;+<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:96:419:327 83 seq2 1149 99 35M = 1331 217 TACTAAATACATATGCACCTAACACAAGACTACCC <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;;9<9 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:20:1444:328 147 seq2 1149 99 35M = 993 -191 TACTAAATACATATGCACCTAACACAAGACTACCC 9<3<<==;=<===;=<=====<<===========< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:198:59:675 147 seq2 1150 99 35M = 1315 200 ACTAAATACATATGCACCTAACACAAGACTATCCT <.<<<<<<;<<<<<<<<<<<**<;<;2<;6;&*2& MF:i:18 Aq:i:45 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS54_61:7:114:506:971 83 seq2 1150 99 35M = 986 -199 ACTAAATACATATGCACCTAACACAAGACTACCCA ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:94:356:809 147 seq2 1151 99 35M = 1334 218 CTAAATACATATGCACCTAACACAAGACTACCCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:155:541:234 147 seq2 1151 99 35M = 1319 203 CTAAATACATATGCACCTAACACAAGACTACCCAG <<7<<<<<<<<<<<<<<<4<<<<<<<<<<<;;;08 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:272:328:400 83 seq2 1151 99 35M = 977 -209 CTAAATACATATGCACCTAACACAAGACTACCCAG 4;<<<<<7<;<<<-<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:283:186:707 147 seq2 1154 99 36M = 1321 203 AATACATATGCACCTAACACAAGACTACCCAGATTC <<<<<<<<<<<<<<<<<<<<<<;<<<<<;<;<<<<8 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:86:660:932 83 seq2 1154 99 35M = 1338 219 AATACATATGCACCTAACACAAGACTACCCAGATT ================================9:= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:264:705:89 147 seq2 1155 99 35M = 983 -207 AAACATATGCACCTAACACAAGACTACCCAGATTC <(<2<&<)<<<7<8<<<<<<<<<<.<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS114_32:4:5:396:292 83 seq2 1155 99 35M = 981 -209 ATACATATGCACCTAACACAAGACTACCCAGATTC <:<6<7<:<:;;;<<<;<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:178:342:866 147 seq2 1155 72 35M = 1311 191 ATACATATGCACCTAACACAAGACTACCCAGATTC ;<<<<<;<<<8<<;<;<3<8/<<<<6<<</<8;<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:155:809:543 147 seq2 1156 99 35M = 1352 231 TACATATGCACCTAACACAAGACTACCCAGATTCA <<<<<<<<<<<<<<<<7<;<<<<<<<<<<<1<;<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:119:880:781 83 seq2 1157 99 35M = 1312 190 ACATATGCACCTAACACAAGACTACCCAGATTCAT <<<<<<<<<<<<<<<<<<<<<<<<+<<<<7<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:283:963:234 147 seq2 1157 99 35M = 992 -200 ACATATGCACCTAACACAAGACTACCCAGATTCAT <5<;<;97;;:;<<7<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:28:745:352 83 seq2 1159 99 35M = 1329 205 ATATGCACCTAACACAAGACTACCCAGATTCATAA <<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:147:687:428 147 seq2 1159 99 35M = 998 -196 ATATGCACCTAACACAAGACTACCCAGATTCATAA ;1<''48;4)<<:<<<<;<<6;<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:101:809:776 83 seq2 1160 99 35M = 1326 201 TATGCACCTAACACAAGACTACCCAGATTCATAAA <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:35:538:1882 147 seq2 1160 98 35M = 1337 212 TATGCACCTAACACAAGACTACCCAGATTCATAAA ;);43.50;3;93;;4;3;;;9-7.;*;;966*75 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:41:34:211 83 seq2 1164 99 35M = 980 -219 CACCTAACACAAGACTACCCAGATTCATAAAACAA 7</::<<7<<<<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:2:1422:1820 83 seq2 1164 99 35M = 1004 -195 CACCTAACACAAGACTACCCAGATTCATAAAACAA *4617;;4;1;;79;/7&,4;9;;;7<;;<<<;<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:194:998:663 83 seq2 1165 99 35M = 1002 -198 ACCTAACACAAGACTACCCAGATTCATAAAACAAA ;</<<<7<<<<;<<8<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:10:975:766 83 seq2 1166 99 35M = 959 -242 AATAACACAAGACTACCCAGATTCATAAAACAAAT ++4<<+<+<<<<8<<22;<<<<<2<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:2 UQ:i:24 H0:i:1 H1:i:0
+EAS114_39:6:94:1273:1462 83 seq2 1166 99 35M = 995 -206 CCTAACACAAGACTACCCAGATTCATAAAACAAAT 8.<<<;<:<<<<;<<;;;<<<;<;<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:64:350:174 83 seq2 1166 99 35M = 1000 -201 CCTAACACAAGACTACCCAGATTCATAAAACAAAT 709<<;<;<<<<<<<;7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:166:84:766 83 seq2 1167 99 35M = 990 -212 ATAACACAAGACTACCCAGATTCATAAAACAAATA %8<=+<-<<<</<<<<8<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_108:2:85:580:481 147 seq2 1167 99 35M = 1359 227 CTAACACAAGACTACCCAGATTCATAAAACAAATA <<<<<<<<<<<<<:<<<<<<<<<<<<;<<<<6:<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:191:40:536 83 seq2 1167 66 35M = 977 -225 ATAAAAAAAGACTACCCAGATTCATAAAACAAATA +1<<,<&<<:<.;<7/7<<<<;.<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:27 H0:i:1 H1:i:0
+EAS218_1:2:40:1291:1045 147 seq2 1167 99 35M = 980 -222 CTAACACAAGACTACCCAGATTCATAAAACAAATA *<<<9<<<<<<:0<9<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:221:881:916 83 seq2 1168 96 35M = 1327 194 TAACACAAGACTACCCAGATTCATAAAACAAATAC <<;<<8<<;<<<<<<<;<<<<28<:<8<:;<;;;< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:35:392:2042 147 seq2 1168 99 35M = 1332 199 TAACACAAGACTACCCAGATTCATAAAACNAATAC ======;==========<<=======7=;!<7;;; MF:i:18 Aq:i:72 NM:i:1 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:192:714:341 147 seq2 1170 99 35M = 1346 211 ACACAAGACTACCCAGATTCATAAAACAAATACTA <<9<<<<<<<<<<<8<<<<<;<<;8<<<88;;;;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:189:876:833 147 seq2 1173 99 36M = 1349 212 CAAGACTACCCAGATTCATAAAACAAATACTACTAG <<<<<<<<<<<8<8<<<<<;<;;<<;<<<<<;<<<6 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:299:743:762 147 seq2 1173 99 36M = 1345 208 CAAGACTACCCAGATTCATAAAACAAATACTACTAG <<<;<<<<<<<<<:;<<<.<:<<<<<<<<<<;;;;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:107:252:533 83 seq2 1173 60 35M = 1025 -183 CAAGACTACCCAGATTCATAAAACAAATACTACTA 3<<<<+<<96<<<<<<;<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS1_97:5:154:952:558 147 seq2 1173 99 35M = 1007 -201 AAAGACTACCCAGATTCATAAAACAAATACTACTA %<<9;;<<;;;<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_63:4:184:659:377 147 seq2 1173 99 35M = 992 -216 CAAAACTACCCAGATTCATAAAACAAATACTACTA 1;<+<;<6;66<<;<<<<;;<<<8<<<<8<<;<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+B7_595:6:137:811:130 147 seq2 1175 99 35M = 1351 211 AGACTACCCAGATTCATAAAACAAATACTACTAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:124:367:72 147 seq2 1175 99 35M = 1377 237 AGACTACCCAGATTCATAAAACAAATACTACTAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:8:60:358:494 147 seq2 1179 44 35M = 979 -235 TACCCAGATTCATAAAACAAATACTACTAGACCTA 7<77;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:6 H1:i:36
+EAS114_30:7:319:11:255 147 seq2 1179 92 35M = 1337 193 TACCCAGATTCATAAAACAAATACTACTAGACCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<: MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:10
+B7_610:7:26:749:174 83 seq2 1183 78 35M = 1357 209 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <<<<<<<<<<<<<<<<<<<<<<;<9<8<<<9<;94 MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:6 H1:i:31
+EAS1_103:7:112:578:782 83 seq2 1183 89 35M = 1366 218 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:5 H1:i:25
+EAS1_105:1:234:185:359 83 seq2 1183 46 35M = 1029 -189 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:9
+EAS112_34:4:92:412:435 147 seq2 1184 89 35M = 1003 -216 AGATTCATAAAACAAATACTACTAGACCTAAGAGG <;<52:=,====:=========<============ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:24:105:1046 83 seq2 1184 99 35M = 1377 228 AGATTCATAAAACAAATACTACTAGACCTAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:4 H1:i:2
+EAS1_97:2:128:629:484 147 seq2 1185 96 35M = 1359 209 GATTCATAAAACAAATACTACTAGACCTAAGAGGG <<49<<<<<9<<<<99<<<<<<<<<<<<+<-)7)) MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:4 H1:i:45
+EAS219_FC30151:1:53:140:421 83 seq2 1185 99 35M = 1016 -204 GATTCATAAAACAAATACTACTAGACCTAAGAGGG <<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:99:557:427 147 seq2 1186 99 35M = 1342 191 ATTCATAAAACAAATACTACTAGACCTAAGAGGGA <<<<<<<<<<<<<<<<<<<<<<:<<<<+;<7:8:; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:253:175:31 147 seq2 1187 72 35M = 1008 -214 TTCATAAAACAAATACTACTAGACCTAAGAGGGAT ;+;<;<<<<<<<<9<<9<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:13:701:55 147 seq2 1187 99 36M = 1015 -208 TTCATAAAACAAATACTACTAGACCTAAGAGGGATG 0:+<7<;9<;<<<<<<<3<<<<<;;<<<:<<3<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:220:809:850 147 seq2 1187 60 35M = 986 -236 TTCATAAAACAAATACTACTAGACCTAAGAGGGAT 9+5<;*<<<2:0<<8:<*00<<<:<*<<<<<<<<& MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:30:599:589 147 seq2 1188 99 36M = 1003 -221 TCATAAAACAAATACTACTAGACCTAAGAGGGATGA 90<;<<<<<<<<+<<<;;<;<;<<<<<<<<6<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:35:118:589 83 seq2 1188 99 35M = 999 -224 TCATAAAACAAATACTACTAGACCTAAGAGGGATG 67<<<<<;<<<<<<<:7<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:37:604:389 147 seq2 1188 99 35M = 998 -225 TCATAAAACAAATACTACTAGACCTAAGAGGGATG 00;:;========9========<9========<== MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:168:61:867 83 seq2 1188 99 35M = 997 -226 TCATAAAACAAATACTACTAGACCTAAGAGGGATG ;7<<<<<<<<<<<<<7<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:197:399:319 83 seq2 1189 99 35M = 1012 -212 CAAAAAACAAATACTACTAGACCTAAGAGGGATGA &<+==<<5<<<8<89;;<<<<<<8<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS114_32:5:267:170:250 147 seq2 1189 99 35M = 1377 223 CATAAAACAAATACTACTAGACCTAAGAGGGATGA <<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:174:157:573 83 seq2 1191 99 35M = 1012 -214 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 8<<<<4<<<<<<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:39:956:676 83 seq2 1191 99 35M = 1023 -203 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 899985;;<;:9;;:9<;:9:5;<;;;<;<;<<<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:37:763:1437 83 seq2 1191 99 35M = 994 -232 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 79979;<;<;;;<;;;;;;6:;<:;<:8;<<<<;< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:50:513:882 83 seq2 1192 99 35M = 1031 -196 AAAACAAATACTACTAGACCTAAGAGGGATGAGAA <<<<:<<<<<:<<:<<<<::<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:15:1763:1143 147 seq2 1193 99 35M = 1023 -205 AAACAAATACTACTAGACCTAAGAGGGATGAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:571:366 83 seq2 1194 99 35M = 1002 -227 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<;<<<<<:<<<;<<<;;;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:166:532:438 83 seq2 1194 99 35M = 1386 227 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<<<<<<<<<<<<<<;<<;<<;<<<<;<;:;;<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:309:109:987 83 seq2 1194 99 35M = 1024 -205 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<<<<<:<<;<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:171:527:247 83 seq2 1194 67 35M = 1027 -202 AACAAATGCTACTAGACCTAAGAGGGATGAGAAAT <547*9)&&7+;+<<7<<<;<<<;3<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:8:139:727:808 147 seq2 1195 99 35M = 1363 203 ACAAATACTACTAGACCTAAGAGGGATGAGAAATT <<<<<<<<<<<<<:<;<<<<<<<<9;<;9<6;<<9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:202:275:776 83 seq2 1196 99 36M = 1002 -230 CAAATACTACTAGACCTAAGAGGGATGAGAAATTAC ;<<<<;;<<<<<<<;<<<<<<<;<<<<<<<<<<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:12:484:836 147 seq2 1197 99 35M = 1372 210 AAATACTACTAGACCTAAGAGGGATGAGAAATTAC <<<<<<<<<<<<<<<<<7<:<<<<<<9<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:21:553:57 83 seq2 1197 99 35M = 1358 196 AAATACTACTAGACCTAAGAGGGATGAGAAATTAC <<<<<<<<<<<;;<<<;<<;<<;<<<;;9<;<;<9 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:4:939:2021 83 seq2 1197 99 40M = 1031 -206 AAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAAT ;;;;:8;<5:<<<7/<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:194:378:230 83 seq2 1198 99 35M = 1022 -211 AATACTACTAGACCTAAGAGGGATGAGAAATTACC <<;<8<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:68:242:834 147 seq2 1200 99 36M = 1386 222 TACTACTAGACCTAAGAGGGATGAGAAATTACCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:2:22:471:500 147 seq2 1200 99 35M = 1365 200 TACTACTAGACCTAAGAGGGATGAGAAATTACCTA =======<=<====:<2===9==;=;9;;=;;;;5 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:139:989:144 147 seq2 1201 99 35M = 1387 221 ACTACTAGACCTAAGAGGGATGAGAAATTACCTAA <<<<<<<<<<<<6<<<<<<<<<;<<<<<<<;;<;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:188:20:592 83 seq2 1202 95 35M = 1032 -205 CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT 2<<7;<<<<,;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:189:863:213 83 seq2 1202 99 35M = 1039 -198 CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT 7:<7<<<<44;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:62:561:531 83 seq2 1203 99 35M = 1036 -202 TACTAGACCTAAGAGGGATGAGAAATTACCTAATT <<7<<<<:<8<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:70:1349:1788 83 seq2 1203 99 35M = 1043 -195 TACTAGACCTAAGAGGGATGAGAAATTACCTAATT <7;<<8<74;;<1<<71<;7<;;<;<7<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:197:914:256 147 seq2 1204 97 35M = 1049 -190 ACTAGACCTAAGAGGGATGAGAAATTACCTAATTG <5;<8<5/;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:35:896:1588 83 seq2 1205 91 35M = 1032 -208 CTAGACCTAAGAGGGATGAGAAATTACCTAATTGG 77999:.:<<;<;;;<<;<;<<<<<;<;;<<<<;; MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:43:47:279 147 seq2 1206 99 35M = 1405 234 TAGACCTAAGAGGGATGAGAAGTTACCTAATTGGT <<<<<<<<<<<<<;:<-<<<<<<<<<<<<:;;+7; MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:2:211:954:174 83 seq2 1207 99 35M = 1393 221 AGACCTAAGAGGGATGAGAAATTACCTAATTGGTA ===============================777= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:5:1219:137 83 seq2 1209 99 35M = 1384 210 ACCTAAGAGGGATGAGAAATTACATAATTGGTACA <<<<<<<<<<<<<<<<<<<<<<<(<<<<<<:9<;= MF:i:18 Aq:i:45 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS56_57:7:33:954:724 83 seq2 1210 97 35M = 1049 -196 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA ;<;<;<<-7;<<;<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:176:402:458 147 seq2 1210 99 36M = 1376 202 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;;<; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:81:687:1379 147 seq2 1210 99 35M = 1366 191 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:45:239:851 83 seq2 1211 61 35M = 1023 -223 CTAAGAGGGATGAGAAATTACCTAATTGGTACAAT *2*0<<<<<<<<<<<<<<<<9<<3<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_65:5:312:985:871 147 seq2 1212 99 35M = 1369 192 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<9<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:38:557:1441 147 seq2 1212 99 35M = 1381 204 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:88:465:1877 147 seq2 1212 99 35M = 1055 -192 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<:<<<<<<<<:<<<<<<<<<<<<7;<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:149:123:265 147 seq2 1213 99 35M = 1395 217 AAGAGGGATGAGAAATTACCTAATTGGTACAATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:47:1791:444 83 seq2 1213 74 35M = 1041 -207 AAGAGGGATGAGAAATTACCTAATTGGTACAATGT 978879;:;;<:;;<<;:<9<<<<;6;;;;<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+EAS51_62:3:68:996:104 147 seq2 1214 70 35M = 1041 -208 AGAGGGATGAGAAATTACCTAATTGGTACAATGTA <1<8<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_593:2:68:140:542 83 seq2 1217 95 36M = 1398 217 GGGATGAGAAATTACCTAATTGGTACAATGTACAAT <<<8;<<;<<<<<;<<;<<<<<8;<-<8<82;;;-8 MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+EAS188_7:7:67:719:786 147 seq2 1218 43 35M = 1383 200 GGATGAGAAATTACCTAATTGGTACACTGTACAAT ;;<<<<<<&<<:13&<1<<<:<<<)/&/))<'6-< MF:i:18 Aq:i:13 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_108:5:321:712:224 83 seq2 1220 58 35M = 1051 -204 ATGAGAAATTACCTAATTGGTACAATGTACAATAT =;===7;===7=========;=:;=========;= MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_26:4:100:238:596 147 seq2 1220 56 35M = 1403 218 ATGAGAAATTACCTAATTGGTACAATGTACAATAT ======9=====;=======5===;====/=;=== MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:13
+EAS51_62:7:312:236:655 147 seq2 1222 99 35M = 1412 225 GAGAAATTACCTAATTGGTACAATGTACAATATTC <<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS56_63:6:102:816:260 147 seq2 1225 99 35M = 1049 -211 AAATTACCTAATTGGTACAATGTACAATATTCTGA <<<<<<::<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:34:144:868 147 seq2 1226 76 35M = 1412 221 AATTACCTAATTGGTACAATGTACAATATTCTGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:215:516:299 83 seq2 1226 99 35M = 1406 215 AATTACCTAATTGGTACAATGTACAATATTCTGAT <<<<<<;<<<<;;;;<;;<<<<;<<9<;<<1;7/; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:81:12:1231 147 seq2 1228 99 35M = 1391 198 TTACCTAATTGGTACAATGTACAATATTCTGATGA <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<4<<6 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:30:644:942 147 seq2 1229 83 35M = 1045 -219 TACCTAATTGGTACAATGTACAATATTCTGATGAT 85%+;<<9;<9<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:41:519:609 147 seq2 1229 99 35M = 1401 207 TACCTAATTGGTACAATGGACAATATTCTGATGAT 1<<<<<<<<<<<<<<<4<-:<+6<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+B7_591:7:116:814:89 83 seq2 1231 99 36M = 1408 213 CCTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<<<<<<<<<<<<<<<<<<:<<<<;<<;<<66< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:169:714:644 147 seq2 1231 99 35M = 1437 241 CCTAATTGGTACAATGTACAATATTCTGATGATGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:73:420:812 83 seq2 1232 66 35M = 1414 217 CTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<1<<<<::1<7<:<96<9<:<<:4<70:11< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:17:1179:393 83 seq2 1232 99 35M = 1412 215 CTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:4< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:118:829:36 83 seq2 1233 99 35M = 1417 219 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<<<<<<<:<2<<<<<<:<<<<<<<<<<<<71;< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:125:875:553 147 seq2 1233 99 36M = 1075 -194 TAATTGGTACAATGTACAATATTCTGATGATGGTTA -;<;:;<<;6<<<<<<6<;<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_32:4:7:282:424 83 seq2 1233 83 35M = 1397 199 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<3<<<9<<<<3<<<<<9<<<9,<;;9;&*;3,. MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:447:488 147 seq2 1233 99 35M = 1412 214 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:66:891:294 83 seq2 1233 99 35M = 1057 -211 TAATTGGTACAATGTACAATATTCTGATGATGGTT :<<5;;<<<4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:8:72:44:435 83 seq2 1235 76 35M = 1392 192 ATTGGTACAATGTACAATATTCTGATGATGGTTAA <<<<<<<<<<<2;<;<<;<<<;<<8<82<;22<8& MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS139_19:4:18:1335:1514 147 seq2 1235 99 40M = 1063 -212 ATTGGTACAATGTACAATATTCTGATGATGGTTACACTAA ::/::<<;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:72:1288:1211 147 seq2 1235 84 35M = 1052 -218 ATTGGTACAATGTACAATATTCTGATGATGGTTAC <);<:<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:200:263:280 83 seq2 1236 99 35M = 1078 -193 TTGGTACAATGTACAATATTCTGATGATGGTTACA )<<<8<:<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:68:440:424 147 seq2 1237 99 35M = 1060 -212 TGGTACAATGTACAATATTCTGATGATGGTTACAC <<2<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:255:441:47 147 seq2 1237 99 35M = 1072 -200 TGGTACAATGTACAATATTCTGATGATGGTTACAC ;;7<;:<<<<<<<<<<;<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:174:557:872 147 seq2 1237 99 35M = 1423 221 TGGTACAATGTACAATATTCTGATGATGGTTACAC <<<<<<<<<<<<<:<<<<<<<7<<;<<6:<<2117 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_64:3:255:45:399 147 seq2 1238 99 35M = 1404 201 GGTACAATGTACAATATTCTGATGATGGTTACACT <<3<8<<8<0<<;<<<0<<<</+8<611<<;71;7 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:264:157:150 147 seq2 1238 30 35M = 1054 -219 GGAAAAATGGACAAGATTCTGATGAGGGTTACACT .3%:+<<*;*<2<<1<1*,*<<7<<+<<<&<<<<< MF:i:-126 Aq:i:30 NM:i:3 UQ:i:35 H0:i:0 H1:i:0
+EAS139_19:5:95:944:247 83 seq2 1238 99 40M = 1424 226 GGTACAATGTACAATATTCTGATGATGGTTACACTAAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:;::: MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:301:161:195 147 seq2 1239 75 35M = 1076 -198 GTACAATGTACAATATTCTGATGATGGTTACACTA ''6%6<6<<<4<<<<<<<<)<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:141:7:963 83 seq2 1240 85 36M = 1061 -215 TACAATGTACAATATTCTGATGATGGTTACACTAAA 95+<<9<<5<;;<<;<<;'<<<<<;<<<7<9<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:6:76:282:1668 83 seq2 1240 99 35M = 1401 196 TACAATGTACAATATTCTGATGATGGTTACACTAA <<<<<<<<<<<<<<<<<<;<<;<<<<<<;<;<<<8 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:64:199:1288 147 seq2 1240 77 35M = 1079 -196 TACAATGTACAATATTCTGATGATGGTTACACTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:49:911:980 147 seq2 1241 99 35M = 1434 228 ACAATGTACAATATTCTGATGATGGTTACACTAAA <<<<<<<<<<;<<<<<<<8<<<<;<;<<88-<;33 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:66:1046:167 147 seq2 1241 99 35M = 1060 -216 ACAATGTACAATATTCTGATGATGGTTACACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:303:542:924 83 seq2 1242 76 35M = 1083 -194 CAATGTACAATATTCTGATGATGGTTACACTAAAA +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:2:79:554:354 147 seq2 1242 63 35M = 1082 -195 CAATGTACAATATTCTGATGATGGTTACACTAAAA 98988;7;;;;:;;;;;;;;;;:;;;:;;;;;9;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:248:122:558 147 seq2 1243 99 35M = 1436 228 AATGTACAATATTCTGATGATGGTTACACTAAAAG <<<<:<<<<<<<<<<<<<;<<<<:<6:4<<::6:6 MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:109:22:383 83 seq2 1244 99 35M = 1071 -208 ATGTACAATATTCTGATGATGGTTACACTAAAAGC <;9;<8<<<<<<;<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:43:1229:1855 83 seq2 1244 99 35M = 1074 -205 ATGTACAATATTCTGATGATGGTTACACTAAAAGC 8<<<<;8<<<;;5<<28<<<<<<<<<<<<7;;<<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:74:656:272 83 seq2 1245 99 35M = 1088 -192 TGTACAATATTCTGATGATGGTTACACTAAAAGCC ;;;</<<<<<5;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_65:7:118:775:467 83 seq2 1245 99 35M = 1075 -205 TGTACAATATTCTGATGATGGTTACACTAAAAGCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_593:7:15:244:876 83 seq2 1246 43 36M = 1440 230 GTACAATATTCTGATGATGGTTACACTAAAAGCCCA <<<<<<;<<<<<<<<;<<;;;<<<<<:<<<9;<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:63:28:1549 147 seq2 1247 77 35M = 1439 227 TACAATATTCTGATGATGGTTACACTAAAAGCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7;<<<<7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:310:800:761 83 seq2 1249 99 35M = 1055 -229 CAATATTCTGATGATGGTTACACTAAAAGCCCATA 1<<:<:<:<<<<:<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:978:1296 83 seq2 1249 90 35M = 1104 -180 CAATATTCTGATGATGGTTACACTAAAAGCCCATA 77177;9;2:;;:;;(;;9;<;;;;:;;;:7;<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:8:26:242:35 147 seq2 1251 99 35M = 1084 -202 ATATTTTGATGATGGTTACACTAAAAGCCCATACT <<<77!!7<;<<<;;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:0 H0:i:1 H1:i:8
+EAS114_45:7:6:758:988 83 seq2 1253 99 35M = 1087 -201 ATTCTGATGATGGTTACACTAAAAGCCCATACTTT 3-7*73;;399:9;9;7<-(<;;<;;:;9::;;7; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:315:412:921 83 seq2 1254 99 35M = 1424 205 TTCTGATGATGGTTACACTACAAGCCCATACTGTA <;<;<<<<<<<;<<<<<<<<8<<<;<<:<<;;+<8 MF:i:18 Aq:i:45 NM:i:2 UQ:i:33 H0:i:0 H1:i:1
+EAS114_30:3:215:840:760 147 seq2 1256 99 35M = 1416 195 CTGATGATGGTTACACTAAAAGCCCATACTTTCCT <<<<<<<<<<<<<<<;<<<88<+<<:<;3585,+: MF:i:18 Aq:i:66 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS1_95:5:284:212:932 147 seq2 1257 10 35M = 1063 -229 TGATGATGGTTACGCTAAAAGTCCATGCTTTACTG 82%<8:<-:<<:**:<-<<8<)/2/<:/<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:42 H0:i:0 H1:i:0
+EAS1_97:4:290:121:79 147 seq2 1257 99 35M = 1420 198 TGATGATGGTTACACTAAAAGCCCATACTTTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<7;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:88:54:900 83 seq2 1257 68 35M = 1069 -223 TGATGATGGTTACACTAAAAGCCCATACTTCACTG ============;=================;9=== MF:i:18 Aq:i:19 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS188_7:3:100:735:530 83 seq2 1257 99 35M = 1058 -234 TGATGATGGTTACACTAAAAGCCCATACTTTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:32:562:1695 147 seq2 1258 76 35M = 1085 -208 GATGATGGTTACACTAAAAGCCCATACTTTACTGC :5:::<88/<:<<<<<<<<<7<9<<&<959<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:173:627:465 147 seq2 1260 99 36M = 1444 220 TGATGGTTACACTAAAAGCCCATACTTTACTGCTAC <<<<<<<<<<<<<<<<<<<<<<<;<<<<<2;;4;;7 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_95:1:77:589:741 83 seq2 1263 99 35M = 1078 -220 TGGTTACACTAAAAGCCCATACTTTACTGCTACTC 8=;;==606;========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:27:228:31 147 seq2 1264 99 35M = 1082 -217 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA 99;;;<<<<<<:<<;<;<<;<<<<;<<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:54:695:952 147 seq2 1264 99 35M = 1076 -223 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA 277%<9<4)<<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:300:622:86 83 seq2 1264 99 35M = 1102 -197 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA <:<<<:<6;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:71:62:254 147 seq2 1264 99 35M = 1438 209 GGTTACACTAAAAGCCCATACTTTCCTGCTACTCA <<<<<<7<<<<7<<<<<3<<<<<<&<<.<<::<:% MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_28:1:168:609:646 83 seq2 1264 99 36M = 1436 208 GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA <<<<<<<<<<<;<<<<<:<8<<<<;<<<<<4<<<9< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:84:92:1246 147 seq2 1265 99 35M = 1437 207 GTTACACTAAAAGCCCATACTTTACTGCTACTCAA <<<<<<<<<<<<<<<<5<:<<5<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:310:193:629 83 seq2 1267 99 36M = 1103 -200 TACACTAAAAGCCCATACTTTACTGCTACTCAATAT 9<9<6;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:111:379:700 73 seq2 1268 0 35M = 1268 0 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT 7<<:<<<<02<<6&<</<<</+9/98*<966/3/< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:111:379:700 133 seq2 1268 0 * = 1268 0 CGCACTGGCAATATTTGTGTGTTTACTTTTTTGCA :1+&;;6;:;918;);;):,19.9:).):::.&3( MF:i:-64
+EAS114_30:6:137:741:866 147 seq2 1268 99 35M = 1429 196 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT <<<<8<<;;;<<<<;<<<;;;<;4<<8;<<;%<8; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:23:1126:1886 147 seq2 1268 99 35M = 1094 -209 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT 5*.:.5<<::<<<<<<<<:5<<<<<<<<<<:2<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:21:423:169 83 seq2 1270 99 35M = 1468 233 ACTAAAAGCCCATACTTTACTGCTACTCAATATAT <<<<<;<<<<<<;<<<<<;;<<<<<<<<9+:5<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:110:984:98 147 seq2 1270 99 36M = 1092 -214 ACTAAAACCCCATACTTTACTGCTACTCAATATATC :81<<<<+;;8<+<8<<<<<;<<<8;<<<<<<<<8; MF:i:18 Aq:i:70 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS219_FC30151:5:54:1351:910 83 seq2 1270 99 35M = 1448 213 ACTAAAAGCCCATACTTTACTGCTACTCAATATAT <<<<<<8<<<<<<<<<<<<<<<<<<<<<<18<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:237:855:581 147 seq2 1271 87 35M = 1105 -201 CTAAACGCCCATACTTTACTGCTACTCAATATATC /+<<<&)2;66;/;;+<;;3133<3<3;9;<999< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_59:8:80:542:549 147 seq2 1271 99 35M = 1443 207 CTAAAAGCCCATACTTTACTGCTACTCAATATATC <<<<<<<<;<<<<<<<<:<<<<-<;;<;7<;3;9; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:7:1347:375 147 seq2 1271 99 35M = 1436 200 CTAAAAGCCCATACTTTACTGCTACTCAATATATC ;;;;;;;;;;;;;;;;;;;;9;;;8;;;;;97777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:191:540:493 83 seq2 1273 99 35M = 1432 194 AAAAGCCCATACTTTACTGCTACTCAATATATCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:324:472:791 147 seq2 1274 89 35M = 1110 -199 AAAGCCAATACTTTACTGCTACTCAATATATCCAT <<.)5*&;;11<<<,5<33:-<<6<<<<:<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS220_1:8:83:1456:1854 83 seq2 1275 99 35M = 1117 -193 AAGCCCATACTTTACTGCTACTCAATATATCCATG <<67<:<8<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:290:247:509 147 seq2 1276 99 35M = 1450 209 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<<<<<<<<<4<<<<<<92<;;;<;96;19 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:90:629:652 83 seq2 1276 99 35M = 1456 215 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<<<<<<<<<<<<<<<<<:<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:39:1671:1928 147 seq2 1276 99 35M = 1453 212 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<;<<<<;<<<<<4<<<;3<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:128:584:952 83 seq2 1277 99 35M = 1101 -211 GCCCATACTTTACTGCTACTCAATATATCCATGTA 7<;9;0:<<<:<<:<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:28:979:519 147 seq2 1278 99 35M = 1439 196 CCCATACTTTACTGCTACTCAATATATCCATGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:219:40:833 83 seq2 1278 99 35M = 1094 -219 CCCATACTTTACTGCTACTCAATATATCCATGTAA <<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:289:207:323 147 seq2 1279 99 35M = 1462 218 CCATACTTTACTGCTACTCAATATATCCATGTAAC <<<:<<<<<:<<<<<<<<<<;<<899<<13)939; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:45:758:616 147 seq2 1280 99 35M = 1473 228 CATACTTTACTGCTACTCAATATATCCATGTAACA <<<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<;;< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:42:804:114 147 seq2 1281 99 35M = 1452 206 ATACTTTACTGCTACTCAATATATCCATGTAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;;<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:61:1885:163 83 seq2 1281 99 40M = 1128 -193 ATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG ;:;;;;<<8<<:<<:<;<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:282:962:46 83 seq2 1282 99 35M = 1437 190 TACTTTACTGCTACTCAATATATCCATGTAACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:143:620:158 83 seq2 1283 99 35M = 1107 -211 ACTTTACTGCTACTCAATATATCCATGTAACAAAT <4;<;<;<;6<<7<;<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:50:312:219 83 seq2 1288 99 35M = 1146 -177 ACTGCTACTCAATATATCCATGTAACAAATCTGCG <,;83:<::6<<<<<<<;:<;<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:256:444:399 83 seq2 1289 99 35M = 1133 -191 CTGCTACTCAATATATCCATGTAACAAATCTGCGC ;+549<:<.<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:17:595:863 83 seq2 1289 89 35M = 1139 -185 AAGCTACTCAATATATCCATGTAACAAATCTGCGC ))55))+2&<<,:5<,0657<<<<:<:<:<<<<<< MF:i:18 Aq:i:33 NM:i:2 UQ:i:16 H0:i:1 H1:i:0
+EAS1_105:6:23:885:274 147 seq2 1289 99 35M = 1089 -235 CTACTACTCAATATATCCATGTAACAAATCTGCGC 2+*27==;;==<<.;:<=<=<============== MF:i:18 Aq:i:51 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_61:8:4:173:814 83 seq2 1289 99 35M = 1111 -213 CTGCTACTCAATATATCCATGTAACAAATCTGCGC <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:263:557:988 147 seq2 1289 84 35M = 1108 -216 CTGCTACTCAATATATCCATGTAACAAATCTGCGC 1-41:<15+<<<<<<599<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:2:326:153:231 147 seq2 1290 43 35M = 1477 222 TGCTACTCAATATATCCATGTAACAAATCTGCGCT <<<<<<<<<9<<<<<<<<<,<<<<<<8<<8.;.;4 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:98:862:154 83 seq2 1290 99 35M = 1116 -209 TGCTACTCAATATATCCATGTAACAAATCTGCGCT 856:;7<:<<9<<<9<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:6:529:366 147 seq2 1291 99 35M = 1103 -223 GCTACTCAATATATCCATGTAACAAATCTGCGCTT 9;8;8<:<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:299:336:613 147 seq2 1293 99 35M = 1145 -183 TACTCAATATATCCATGTAACAAATCTGCGCTTGT 1;4(+<<5<4<1<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_597:2:42:28:552 83 seq2 1294 99 35M = 1131 -198 ACTCAATATATCCATGTAACAAATCTGCGCTTGTA </8:<<:<<<;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_39:3:55:464:146 147 seq2 1295 99 35M = 1114 -216 CTCAATATATCCATGTAACAAATCTGCGCTTGTAC ;(;;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_67:6:109:953:668 83 seq2 1297 99 35M = 1485 223 CAATATATCCATGTAACAAATCTGCGCTTGTACTT ;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<8<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:1:82:946:392 147 seq2 1297 99 40M = 1493 236 CAATATATCCATGTAACAAATCTGCGCTTGTACTTCAAAA <<<<<<<<<<<<<<<<<<<<<<<<<8<<<8<<8<<:4488 MF:i:18 Aq:i:74 NM:i:1 UQ:i:19 H0:i:1 H1:i:0
+EAS114_28:3:308:509:948 147 seq2 1298 99 36M = 1123 -211 AATATATCCATGTAACAAATCTGCGCTTGTACTTCT ;;+;;;.8<<;;;<<<<<<<<<<<<<8<<<<<;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:174:753:617 147 seq2 1299 75 35M = 1136 -198 ATATATCCATGTAACAAATCTGCGCTTGTACTTCT <;<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:26:1867:162 83 seq2 1299 70 35M = 1137 -197 ATATATCCATGTAACAAATCTGCGCTTGTACTTCT 97999:;<<9;;<:<<;;;<;;<<<<<<<;;<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:162:257:203 83 seq2 1301 99 35M = 1114 -222 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA <;<;:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:62:841:1994 89 seq2 1301 70 35M = 1301 -35 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA 87878;;6:;;:<<<<:<:;;;<;<<<;<;;<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:62:841:1994 149 seq2 1301 0 * = 1301 35 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:-64
+EAS139_19:7:44:1807:833 83 seq2 1301 99 40M = 1449 188 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<<<<<<<<<<<<<<<<<<;<;<<<;<<9<<<<<89;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:280:607:113 147 seq2 1303 99 35M = 1468 200 ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT ===================;===;=====<=7=9: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:260:147:818 147 seq2 1303 82 35M = 1497 229 ATCCATGTAACAAATCTGCGCTTTTACTTCTAAAT <<<<<<3<<<<<;<<<<)<1<<<&<7<<<;<4/9< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_71:7:194:867:616 83 seq2 1303 99 34M = 1481 213 ATCCATGTAACAAATCTGCGCTTGTACTTCTATT <8<<<<<<<<<<<8<<4<<<<<<8<<3<<5<&(+ MF:i:18 Aq:i:67 NM:i:2 UQ:i:23 H0:i:1 H1:i:0
+EAS139_19:7:85:262:751 83 seq2 1305 99 40M = 1105 -240 CCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAC 22;99;<<8<<<<<<<;<;<<<<<;<<;<<<<<<<<<<<+ MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_81:6:35:186:412 147 seq2 1306 99 35M = 1139 -202 CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<4:6<;<&<:4<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:1528:799 147 seq2 1306 96 35M = 1109 -232 CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:124:978:501 147 seq2 1307 99 36M = 1499 228 ATGTAACAAATCTGCGCTTGTACTTCTAAATCTATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:88:866:774 147 seq2 1307 99 35M = 1478 206 ATGTAACAAATCTGCTCTTGTACTTCTAAATCTAT <<<;<<<<<;<<<<<<<<<<<<<<<<<68<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:6:4:1131:104 147 seq2 1307 99 35M = 1487 215 ATGTAACAAATCTGCGCTTGTACTTCTAAATCTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:178:342:866 83 seq2 1311 72 35M = 1155 -191 AACAAATCTGCGCTTGTACTTCTAAATCTATAAAA <<9<<<&;;<<<<77<;<<<5;:<<<:<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:119:880:781 147 seq2 1312 99 35M = 1157 -190 ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA ;8<<;<<<<:<84<<<<:<<<<<<<<<<<<<5<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_591:2:46:220:58 83 seq2 1313 99 36M = 1483 206 CAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<:<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:47:591:698 147 seq2 1313 99 35M = 1146 -202 CAAATCTGCGCTTGTACTTCTAAATCTATAACAAA 7;;;;:<<:<:<<<<<7<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:1:115:226:443 147 seq2 1314 99 35M = 1137 -212 AAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA <<;;<;<<<<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:198:59:675 83 seq2 1315 99 35M = 1150 -200 AATCTGCGCTTGTACTTCTAAATCTATAACAAAAT <<<<<4<4<:<<<;7<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_3:2:76:1729:813 147 seq2 1317 99 35M = 1506 224 TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:147:360:141 83 seq2 1319 47 35M = 1501 218 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:7:155:530:532 83 seq2 1319 99 35M = 1128 -226 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA :<<<><<8<<<<<><<<<<><<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_62:4:308:614:911 83 seq2 1319 90 35M = 1493 209 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<8< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_65:3:155:541:234 83 seq2 1319 99 35M = 1151 -203 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 78;<7<<<<<<<<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:175:289:351 147 seq2 1319 99 35M = 1144 -210 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 9;;:+<<<<<;<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:283:186:707 83 seq2 1321 99 36M = 1154 -203 CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT 889;<7;<7<<7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:3:308:66:538 147 seq2 1321 99 35M = 1138 -218 CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT 996999;<9;<:<<<<<:<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:5:11:555:330 147 seq2 1321 99 35M = 1492 206 CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<4<;< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:84:411:336 73 seq2 1322 75 35M * 0 0 GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT <<<;<<<;<<<<<<<<<<<<:<<;<<<<<<;8<;< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:52:1278:1478 147 seq2 1322 47 35M = 1513 226 GCTTGTACTTCTAAATCTATAACAAAATTAAAATT <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<9<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_53:3:101:809:776 147 seq2 1326 99 35M = 1160 -201 GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC <<<-<;7;<<<<:;<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:221:881:916 147 seq2 1327 96 35M = 1168 -194 TAATTCTAAATCTAGAACAAAATTAAAATTTAACA 44%-4(5<;9/,:<68:1<:8<:<<84;<<<<<;< MF:i:18 Aq:i:24 NM:i:3 UQ:i:41 H0:i:0 H1:i:0
+EAS1_105:1:28:745:352 147 seq2 1329 99 35M = 1159 -205 CTTCTAAATCTATAACAAAATTAAAATTTAACAAA 4;;*;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_45:2:23:1754:796 83 seq2 1329 99 35M = 1488 194 CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA ;<<;<;<;<;<;<<;;;;;<<<<;;<<<<<97999 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:96:419:327 147 seq2 1331 99 35M = 1149 -217 TCTAAATCTATAACAAAATTAAAATTTAACAAAAG ;1<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_97:4:274:287:423 147 seq2 1332 75 35M = 1515 218 CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:35:392:2042 83 seq2 1332 99 35M = 1168 -199 ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT +<<<<</<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:2:94:356:809 83 seq2 1334 99 35M = 1151 -218 AAATCTATAACAAAATTAAAATTTAACAAAAGTAA <<<<3<<<<;;<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS114_30:7:319:11:255 83 seq2 1337 92 35M = 1179 -193 TCTATAAAAAAATTAAAATTTAACAAAAGTAAATA ;8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:35:538:1882 83 seq2 1337 98 35M = 1160 -212 TCTATAACAAAATTAAAATTTAACAAAAGTAAATA 73797;;3<;;<6;;<<<;8:;:;<;:<:;<<;;; MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS51_66:1:64:182:741 153 seq2 1338 10 35M * 0 0 AAAAAAACAAATTAAACTCTAACAAAAGTAAATAA (+;1&(9*%0<*(*&<*5,/+<,&<&<<6<<<<<< MF:i:32 Aq:i:10 NM:i:6 UQ:i:63 H0:i:0 H1:i:0
+EAS54_61:4:86:660:932 147 seq2 1338 99 35M = 1154 -219 ATATAAAAAAATTAAAATTTAACAAAAGTAAATAA &<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_53:8:122:430:882 147 seq2 1338 99 35M = 1147 -226 CTATAAAAAAATTAAAATTTAACAAAAGTAAATAA 0<<:<<<<<<<:3<<<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:99:557:427 83 seq2 1342 99 35M = 1186 -191 AACAAAATTAAAATTTAACAAAAGTAAATAAAACA <<-<<<<9<<<<<:<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+B7_593:5:299:743:762 83 seq2 1345 99 36M = 1173 -208 AAAATTAAAATTTAACAAAAGTAAATAAAACACATA ;<<<1<<<<<+<;<;7<<;<<<<<<<<<;<<;;<<7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:303:428:326 83 seq2 1345 74 35M = 1515 205 AAAATTAAAATTTAACAAAAGTAAATAAAACACAT <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:192:714:341 83 seq2 1346 99 35M = 1170 -211 AAATTAAAATTTAACAAAAGTAAATAAAACACATA <<<3;<<<<9:<<</<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:189:876:833 83 seq2 1349 99 36M = 1173 -212 TTAAAATTTAACAAAAGTAAATAAAACACATAGCTA 7;<<<<:;;<</<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:37:79:581 147 seq2 1349 68 35M = 1533 219 TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT <>4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1> MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_19:2:82:154:1333 83 seq2 1349 77 40M = 1511 202 TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;:;: MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS188_7:1:290:286:763 83 seq2 1349 75 35M = 1515 201 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<7<<<<<<<<<<<<<<<8<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:3:248:1491 73 seq2 1349 99 35M * 0 0 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8:< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:6:1064:1805 83 seq2 1350 99 35M = 1502 187 TAAAATTTAACAAAAGTAAATAAAACACATAGCTA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:137:811:130 83 seq2 1351 99 35M = 1175 -211 AAAATTTAACAAAAGTAAATAAAACACATAGCTAA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:155:809:543 83 seq2 1352 99 35M = 1156 -231 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<+0<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:41:468:459 83 seq2 1352 75 35M = 1513 196 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:31:622:216 73 seq2 1354 99 35M * 0 0 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<96<7 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:105:854:975 147 seq2 1354 71 35M = 1523 202 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<7:<;;;;5 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:26:749:174 147 seq2 1357 78 35M = 1183 -209 TAACAAAAGTAAATAAAACACATAGCTAAAACTAA (<<)<<<<6<<<<<<<<<<&:<3<<<6<<<)<:<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:21:553:57 147 seq2 1358 99 35M = 1197 -196 AACAAAAGTAAATAAAACACATAGCTAAAACTAAA <<+<<<<<<<<<;<<<<8<<<<<<8<<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:128:629:484 83 seq2 1359 96 35M = 1185 -209 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA :(::<</*;<<99<<<-<;<<<<4<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS1_108:2:85:580:481 83 seq2 1359 99 35M = 1167 -227 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA =)====77========8=3====3=========== MF:i:18 Aq:i:71 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+B7_589:8:139:727:808 83 seq2 1363 99 35M = 1195 -203 AAGTAAATAAAACACATAGCTAAAACTAAAAAAGC <<;<<<<<<<<<;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:2:22:471:500 83 seq2 1365 99 35M = 1200 -200 GTAAATAAAACACATAGCTAAAACTAAAAAAGCAA =9===0====;=77<==8;====;=========== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:112:578:782 147 seq2 1366 89 35M = 1183 -218 AAAATAAAACACATAGCTAAAACTAAAAAAGCAAA +<<<%<<<<6<;<<<<6:<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS221_3:4:81:687:1379 83 seq2 1366 99 35M = 1210 -191 TAAATAAAACACATAGCTAAAACTAAAAAAGCAAA <<<<<<<<<<<:<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:320:20:250 83 seq2 1367 77 35M = 1532 200 AAATAAAACACATAGCTAAAACTAAAAAAGCAAAA <<<<<<<<<<<<<<<<<;<<<<<<<<<;+:<;<<3 MF:i:18 Aq:i:6 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:312:985:871 83 seq2 1369 99 35M = 1212 -192 ATAAAACACATAGCTAAAACTAAAAAAGCAAAAAC <8<<<<.<.<<<<:<<<<<.<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:12:484:836 83 seq2 1372 99 35M = 1197 -210 AAACACATAGCTAAAACTAAAAAAGCAAAAACAAA <<<<</<4<<&7<<<<;<<<<<<<<<<<<<1<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:176:402:458 83 seq2 1376 99 36M = 1210 -202 AAATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA </<+<4&;<<<<7<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS139_11:7:50:1229:1313 147 seq2 1376 77 35M = 1528 187 ACATAGCTAAAACTAAAAAAGCAAAAACAAAAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:124:367:72 83 seq2 1377 99 35M = 1175 -237 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA ,<<<8,<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:267:170:250 83 seq2 1377 99 35M = 1189 -223 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA -<;<5-:<<<<;<<<<<<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:24:105:1046 147 seq2 1377 99 35M = 1184 -228 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +<<<</<<<<<.<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:38:557:1441 83 seq2 1381 99 35M = 1212 -204 GATAAAAATAAAAAAGCAAAAACAAAAACTATGCT <&<<<<<,<<<<<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:2 UQ:i:16 H0:i:0 H1:i:1
+EAS188_7:7:67:719:786 83 seq2 1383 43 35M = 1218 -200 TAAAAAAAAAAAAGCAAAAACAAAAACTATGCTAA $<<;<-1<<<8<<*&<;<;,<<3<<<<33<<<33< MF:i:18 Aq:i:13 NM:i:2 UQ:i:28 H0:i:1 H1:i:0
+EAS114_39:2:5:1219:137 147 seq2 1384 99 35M = 1209 -210 AAAACTAAAAAAGCAAAAACAAAAACTATGCTAAG <<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:68:242:834 83 seq2 1386 99 36M = 1200 -222 AAATAAAAAAGCAAAAACAAAAACTATGCTAAGTAT <<68<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS51_66:3:166:532:438 147 seq2 1386 99 35M = 1194 -227 AACTAAAAAAGCAAAAACAAAAACTATGCTAAGTA <<&7<<<<<<<+<<<<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:139:989:144 83 seq2 1387 99 35M = 1201 -221 ACTAAAAAAGCAAAAACAAAAACTATGCTAAGTAT <&<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:81:12:1231 83 seq2 1391 99 35M = 1228 -198 AAAAAGCAAAAACAAAAACTATGCTAAGTATTGGT <<<<<<<7<<<<<<<5<'<6/<<<5<<<<<<2<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:8:72:44:435 147 seq2 1392 76 35M = 1235 -192 AAAAGCAAAAACAAAAACTATGCTAAGTATTGGTA <<<<;7;<<<<;<<<<<<<<<<;<<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:211:954:174 147 seq2 1393 99 35M = 1207 -221 AAAGAAAAAACAAAAACTATGCTAAGTATTGGTAA ====*=====6======================== MF:i:18 Aq:i:75 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+B7_595:7:149:123:265 83 seq2 1395 99 35M = 1213 -217 AGCAAAAACAAAAACTATGCTAAGTATTGGTAAAG <;&<<<<<:<<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:7:282:424 147 seq2 1397 83 35M = 1233 -199 CAAAAACAAAAACTATGCTAAGTATTGTTAAAGAT 1<<<<<9<<<<<31<77;;;;7<3<<2+;<3<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+B7_593:2:68:140:542 147 seq2 1398 95 36M = 1217 -217 AAAAACAAAAACTATGCTAAGTATTGGTAAAGATGT ;;<<;7<<<<<<:<<<:<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:76:282:1668 147 seq2 1401 99 35M = 1240 -196 AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG <<<<<:<<<8<8<<<<<::<<<<7<<<<<<2<<<8 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:41:519:609 83 seq2 1401 99 35M = 1229 -207 AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG <4;<;<<<<<<<<;4:<<;<<<<<<<<<<<;<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:100:238:596 83 seq2 1403 56 35M = 1220 -218 CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG 4<<<<;<3<3&<3<1<5<31<<3<<<<<<2<<;<, MF:i:18 Aq:i:17 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS51_64:3:255:45:399 83 seq2 1404 99 35M = 1238 -201 AAAAACTATGCTAAGTATTGGTAAAGATGTGGGGA <5<5<4$;;7/<<<177&7;<<<<<<;<<4<<<<< MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:43:47:279 83 seq2 1405 99 35M = 1206 -234 AAAACTATGCTAAGTATTGGTAAAGATGTGGGGAA <:<<79<<<19<<<1<<9<<+<<<<<3<3<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:215:516:299 147 seq2 1406 99 35M = 1226 -215 AAGCTATGCTAAGTATTGGTAAAGATGTGGGGAAA ;;))7<8:855<<4<;:<<87<<<7<<;<<<*3<< MF:i:18 Aq:i:64 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+B7_591:7:116:814:89 147 seq2 1408 99 36M = 1231 -213 ACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAA :38<;<;<<<<;<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:34:144:868 83 seq2 1412 76 35M = 1226 -221 AGCTAAGGAATGGGAAAGGTGTGGGGAAAAAAGTA &9+&7<&&0&<6<.0<<7<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:76 NM:i:4 UQ:i:50 H0:i:0 H1:i:0
+EAS51_62:7:312:236:655 83 seq2 1412 99 35M = 1222 -225 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<8;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:17:1179:393 147 seq2 1412 99 35M = 1232 -215 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:447:488 83 seq2 1412 99 35M = 1233 -214 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<3<<<<<<6<<<<<<<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:73:420:812 147 seq2 1414 66 35M = 1232 -217 CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA 5'<<<,<&,<<,<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:215:840:760 83 seq2 1416 99 35M = 1256 -195 AAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACT <<<8<::<;;<<<:<7<7<;;;<<<<<<<<<<;<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:118:829:36 147 seq2 1417 99 35M = 1233 -219 AGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTC <8<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:290:121:79 83 seq2 1420 99 35M = 1257 -198 ATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCA <1<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:174:557:872 83 seq2 1423 99 35M = 1237 -221 GGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAAT .77<:<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:315:412:921 147 seq2 1424 99 35M = 1254 -205 GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATA 4-<79;<<<4:;:<<<<<<<<4<<<38<<;<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:95:944:247 147 seq2 1424 99 40M = 1238 -226 GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCT :7::;<<<<<;;<<<<<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:137:741:866 83 seq2 1429 99 35M = 1268 -196 GATGAGGGGAAAAAAGTAAACTCTCAAATATTGCT <;0:%<:9<<<:<<<<;<<:<<;0;<<<<<::<<6 MF:i:18 Aq:i:70 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS188_7:6:191:540:493 147 seq2 1432 99 35M = 1273 -194 GTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGT <<9<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:49:911:980 83 seq2 1434 99 35M = 1241 -228 GGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGG 44:7<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:248:122:558 83 seq2 1436 99 35M = 1243 -228 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA <;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:609:646 147 seq2 1436 99 36M = 1264 -208 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ;;<<<<=======;;:;======;==<========= MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:7:1347:375 83 seq2 1436 99 35M = 1271 -200 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA 47999<<<;;;;;;:5;:;<;;<;;;;;<;;;;;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:282:962:46 147 seq2 1437 99 35M = 1282 -190 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG 69<<<<<:<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:169:714:644 83 seq2 1437 99 35M = 1231 -241 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ;<<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:84:92:1246 83 seq2 1437 99 35M = 1265 -207 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG <<<<<<<<<<<<<<<8<<<<<<5<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:71:62:254 83 seq2 1438 99 35M = 1264 -209 AAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGT <<<<<<;8<<<<;<:<<<<<<<;<<;<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:28:979:519 83 seq2 1439 99 35M = 1278 -196 AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA <<<<<6<<<<<<<<<<<<<<<8<<<<<<<<6<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:63:28:1549 83 seq2 1439 77 35M = 1247 -227 AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:15:244:876 147 seq2 1440 43 36M = 1246 -230 AAAAGTAAACTCTCAAATATTGCTAGTGTGAGTATA ;<<<7<<<<<.2<-<<<<<<<<<:<<<<<<<<<2<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_59:8:80:542:549 83 seq2 1443 99 35M = 1271 -207 AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA =9====7=;=======;;==;========<===== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:173:627:465 83 seq2 1444 99 36M = 1260 -220 GTAAACTCTCAAATATTGCTAGTGGGAGTATAAATT :<<<<;<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:54:1351:910 147 seq2 1448 99 35M = 1270 -213 ACTCTCAAATATTGCTAGTGGGAGTATAAATTGTT <7<7;;<<<<<;<<;;<<;<<<<<<<<<<<<<<;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:44:1807:833 147 seq2 1449 99 40M = 1301 -188 CTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCAC :6:9:<<<6<88<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:290:247:509 83 seq2 1450 99 35M = 1276 -209 TCTCAAATATTGCTAGTGGGAGTATAAATTGTTTT 49';<<<<<8;<;;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:42:804:114 83 seq2 1452 99 35M = 1281 -206 TCAAATATTGCTAGTGGGAGTATAAATTGTTTTCC ;9<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:39:1671:1928 83 seq2 1453 99 35M = 1276 -212 CAAATATTGCTAGTGGGAGTATAAATTGTTTTCCA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:90:629:652 147 seq2 1456 99 35M = 1276 -215 ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT <:<7::<:<<<<<8<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:289:207:323 83 seq2 1462 99 35M = 1279 -218 CTAGTGGGAGTATAAATTGATTTCCACTTTGGAAA &</<7<<:<7::<<<<+3<-7<<:<7<<<<<<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS1_95:7:280:607:113 83 seq2 1468 99 35M = 1303 -200 GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT 18<-<<<<<<<<<<<<<8<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:21:423:169 147 seq2 1468 99 35M = 1270 -233 GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT ;376;0<<<<99<<<<<<-;<4<<<<<<<<<;<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:45:758:616 83 seq2 1473 99 35M = 1280 -228 ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA <<;<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:2:326:153:231 83 seq2 1477 43 35M = 1290 -222 ATTGTTTTCAACTTTGGAAAACAATTTGGTAATTT ::6=68=<*$;*=========6============= MF:i:18 Aq:i:0 NM:i:1 UQ:i:3 H0:i:0 H1:i:1
+EAS192_3:3:88:866:774 83 seq2 1478 99 35M = 1307 -206 TTGTTTTCCACTTTGGAAAACAATTTGGTAATTTC <<<;<<<<:<<<<<:<8<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:194:867:616 147 seq2 1481 99 35M = 1303 -213 TTTTCCACTTTGGAAAACAATTTGGTAATTTCGTT 38:;;:<:<<<<;<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:46:220:58 147 seq2 1483 99 36M = 1313 -206 TTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTT 98<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:109:953:668 147 seq2 1485 99 35M = 1297 -223 CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT <:)9<<<<<<<<8:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:4:1131:104 83 seq2 1487 99 35M = 1307 -215 ACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTT 61;;;<<<<<<<<<;:<<<:<<;<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:23:1754:796 147 seq2 1488 99 35M = 1329 -194 CTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTT 88897;;;;:;:;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:11:555:330 83 seq2 1492 99 35M = 1321 -206 GGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTT 6;6;9766+<<<<9:2=<===6============= MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:308:614:911 147 seq2 1493 90 35M = 1319 -209 AAAAACAATTTGGTAATTTAGTTTTTTTTTTTTTC %<<<;:<::<6,<<<<<<:<:<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:2 UQ:i:31 H0:i:0 H1:i:1
+EAS139_19:1:82:946:392 83 seq2 1493 99 40M = 1297 -236 GAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTC :;:;:,::<:;<<<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:260:147:818 83 seq2 1497 82 35M = 1303 -229 AAAATTTGGTAATTTAGTTTTTTTTTTTTTCTTTT 6.=..++==6=76==&===========99====== MF:i:18 Aq:i:41 NM:i:2 UQ:i:18 H0:i:0 H1:i:1
+B7_591:5:124:978:501 83 seq2 1499 99 36M = 1307 -228 AATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTC <9<;<<::<;<<;<4<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:147:360:141 147 seq2 1501 47 13M1D22M = 1319 -218 TTTGGTAATTTAGTTTTTTTTTTTTCTTTTCTCTT <86<<<<73<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:-126 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:0
+EAS114_39:3:6:1064:1805 147 seq2 1502 99 35M = 1350 -187 TTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTT ;88<;<;;<<;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:76:1729:813 83 seq2 1506 99 35M = 1317 -224 TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT <+6<<<&1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS54_65:6:326:71:741 153 seq2 1509 0 35M * 0 0 TCTCGTTTTTTTTTCTTTCTTTTCTCTTTTTTTTT !!<66<<<<<<<<<&<<7&<<<<:<*<<<<<<<<1 MF:i:32 Aq:i:0 NM:i:2 UQ:i:22 H0:i:1 H1:i:12
+EAS112_34:6:145:144:263 73 seq2 1509 0 35M * 0 0 TTTCGTTTTTTTTTTTTTTTTTTCCCCTTTCTTTT <<<<<<<<<<<<<<<<+4+4&+&(&&*2&8&&&)& MF:i:32 Aq:i:0 NM:i:4 UQ:i:29 H0:i:0 H1:i:0
+EAS1_105:1:329:407:872 73 seq2 1510 0 35M * 0 0 TTCGTTTTTTTTTTTTTTTTTTCCCTTTTTTTTTT <<<<<<<<<<<<<<<<<<6;<<&4::<++<(&;<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:46 H0:i:0 H1:i:0
+EAS139_19:2:82:154:1333 147 seq2 1511 77 40M = 1349 -202 TTTTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTTTTT :5'::<<<;<<<<<<</3<<<&4&7<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS56_63:3:41:468:459 147 seq2 1513 0 35M = 1352 -196 TTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTT +;<<<<<<<<<<<;&<<;;88&<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS114_28:6:11:151:750 153 seq2 1513 5 36M * 0 0 GTTTTTATTTTTTTCCTCTCTCTTTTTTTTTTTTTT :'1:%4;4<<<+;6;&9+6;/<<<<<<<<<<<<<<< MF:i:32 Aq:i:5 NM:i:3 UQ:i:41 H0:i:0 H1:i:3
+EAS139_11:5:52:1278:1478 83 seq2 1513 47 35M = 1322 -226 GTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTT .8::<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:9 H1:i:85
+B7_591:2:309:798:997 153 seq2 1514 0 36M * 0 0 TTTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 466;<<744077+&7097&%&4<9<<<9<<<::<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:5 H0:i:12 H1:i:85
+EAS1_93:6:218:144:794 89 seq2 1514 0 35M = 1514 -35 TTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT ;92/;5:<6)+<5)67</9<&<&<<<:<<<57<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:22 H1:i:85
+EAS1_93:6:218:144:794 149 seq2 1514 0 * = 1514 35 GGGTGCATTGCTATGTTGCGGTCGCTTTGCCTCCT ++(3:&)5<9035<3):-<53<+&&-+)<<&)&<6 MF:i:-64
+EAS1_97:6:222:305:337 153 seq2 1514 0 35M * 0 0 TTTTTTTTTTTTTTTTTTCCCTTTTTTTTTTTTTT ;;;;;<<';<<<<*;<<<78;7<7<;<<<<<<<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:32 H0:i:0 H1:i:37
+EAS1_105:3:7:35:528 89 seq2 1514 0 35M * 0 0 TTTTTTTTTTGTTCTTTACTCTTTTTTTTTTTTTT <<<<<<<<<<5<<<(<<%<<-8<<<<<<<<<8<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:24 H0:i:0 H1:i:0
+EAS54_65:2:182:924:833 137 seq2 1514 0 35M * 0 0 TTTTTTTTTTTTTATTTGCGCTTTTTTTTTTTTTT <<<<<<<<<<<<<)7<<)3/:07<<9<9<<==<7< MF:i:32 Aq:i:0 NM:i:3 UQ:i:30 H0:i:0 H1:i:0
+EAS54_81:8:78:735:536 153 seq2 1514 0 35M * 0 0 TTTTTTTTTTTTTCATTTCTCTTTTTTTTTTTTTT ;9<<<<<<<.7<9'%1<<)2::<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:4 H0:i:0 H1:i:15
+EAS56_59:5:232:336:46 137 seq2 1514 0 35M * 0 0 ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT +<<<<<<<<<<<<6<<<<;<6<<&&<,3<<<<3,, MF:i:32 Aq:i:0 NM:i:3 UQ:i:50 H0:i:0 H1:i:0
+EAS188_4:5:308:552:77 89 seq2 1514 0 35M * 0 0 TTTTCTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT 1;-<%<;8<<<<<&<5-<58:5:<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:4 H0:i:30 H1:i:85
+B7_597:5:125:957:753 137 seq2 1515 0 35M * 0 0 TTTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTT <8<<<;<8;8//++(,(+++&++(/+008880;;/ MF:i:32 Aq:i:0 NM:i:2 UQ:i:14 H0:i:0 H1:i:1
+EAS1_97:4:274:287:423 83 seq2 1515 0 35M = 1332 -218 TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 7<<<<9<<9<<<.<<<<90-<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:12 H1:i:85
+EAS54_71:8:234:21:950 89 seq2 1515 0 33M * 0 0 TTTTTTTTTTTTCTCCTCTCTTTTTTTTTTTTT <<<<<<<<<&<;2;&-<,<+;<<<7<<<;<;<; MF:i:32 Aq:i:0 NM:i:2 UQ:i:17 H0:i:0 H1:i:7
+EAS56_61:6:256:67:461 85 seq2 1515 0 * = 1515 35 TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT !!7181!63:6-:!-163(-1%-18<<4<<<<<<< MF:i:-64
+EAS56_61:6:256:67:461 153 seq2 1515 0 35M = 1515 -35 TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT *.%53.:)1+9;3397;1795507+335;.&51)5 MF:i:64 Aq:i:0 NM:i:2 UQ:i:14 H0:i:2 H1:i:85
+EAS56_65:8:317:83:500 153 seq2 1515 0 35M * 0 0 TTTTTTTTTTTTCTTTTCTCCTTTTTTTTTTGTTT ;;;;;<<<<<<<3<<<)-;31<<)97<;9<<:<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:41 H0:i:0 H1:i:0
+EAS114_30:2:303:428:326 147 seq2 1515 0 35M = 1345 -205 TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 4<;<<;<;<4<<8;;;;.8+;<<;<8<;<;<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:11 H1:i:85
+EAS188_7:1:290:286:763 147 seq2 1515 75 35M = 1349 -201 TTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTT <<<<;<<<<<<<&<<<<&77<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:29 H1:i:85
+B7_591:7:89:67:709 89 seq2 1516 0 36M * 0 0 TTTTTTTTTTTGTCTTCTCTTTTTTTTTTTTTTTTT :7:::9:7:<<7<'<<477<<<<<<<<<:<<<<<:< MF:i:32 Aq:i:0 NM:i:2 UQ:i:28 H0:i:0 H1:i:17
+EAS56_65:3:47:64:359 89 seq2 1516 0 35M * 0 0 TTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTTT <<<6<<<<<<<4<4</9<4@<<;<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:33 H0:i:0 H1:i:6
+EAS56_65:4:296:78:421 89 seq2 1518 0 35M = 1518 -35 TCTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTT !!<<<:<<<<..<::<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:1 UQ:i:4 H0:i:85 H1:i:85
+EAS56_65:4:296:78:421 149 seq2 1518 0 * = 1518 35 TGTTGGTGTTCGTTTTTTCTCCTGTTTCTTTTTCT <<*<4<<<;:<0<<<<<<<<+;<9<<1<<;<<<+: MF:i:-64
+EAS1_95:4:238:124:196 89 seq2 1519 0 35M * 0 0 TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT <0<9.<5.5<<<<9<1<<5<<85<5<<<9<:<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS54_65:7:56:57:985 85 seq2 1519 0 * = 1519 35 TTCTGTCTTCTCTCCTGTCTTCTTTTCTCTTCTTT <9'<.<7<<2<<;77<7<<<<7<7<<<<7<<<2<< MF:i:-64
+EAS54_65:7:56:57:985 153 seq2 1519 0 35M = 1519 -35 TTTTTTCTCTTTTCTCTTTTTTTTTTTTTTTTTTT 666666*6&1666+64666666666&266666666 MF:i:64 Aq:i:0 NM:i:1 UQ:i:9 H0:i:85 H1:i:85
+EAS56_61:3:5:45:441 89 seq2 1519 0 35M * 0 0 TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT ;;58:<:<(:<<11<&<1<<;<<<<><<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:82 H1:i:85
+B7_589:6:33:356:636 73 seq2 1520 0 35M * 0 0 TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT <<<<<<<8;<<<<<<<<<<<<<7<<<<<<<;;3&3 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:14 H1:i:85
+EAS114_45:6:86:859:1779 137 seq2 1520 0 35M * 0 0 TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT ;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699 MF:i:32 Aq:i:0 NM:i:1 UQ:i:26 H0:i:0 H1:i:15
+EAS54_71:8:105:854:975 83 seq2 1523 71 33M = 1354 -202 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG <<<<;<:<<;<&<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS51_62:4:187:907:145 153 seq2 1524 28 35M * 0 0 TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT <<<+;;,6<<<<6<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:28 NM:i:3 UQ:i:59 H0:i:0 H1:i:0
+EAS54_71:4:284:269:882 73 seq2 1524 0 34M * 0 0 TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA <;<<<<<8<7<8;<<<;<7<<<<<;272;73&&) MF:i:32 Aq:i:0 NM:i:1 UQ:i:17 H0:i:0 H1:i:85
+EAS56_63:4:141:9:811 137 seq2 1524 10 35M * 0 0 TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT <<<;<<<<<<<;<;<:<<<;<<<<<<<<..));;. MF:i:32 Aq:i:0 NM:i:3 UQ:i:47 H0:i:2 H1:i:27
+EAS114_30:6:277:397:932 73 seq2 1524 0 35M * 0 0 TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:8(,0%( MF:i:32 Aq:i:0 NM:i:3 UQ:i:42 H0:i:2 H1:i:85
+EAS139_11:7:50:1229:1313 83 seq2 1528 77 35M = 1376 -187 TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA <<<<,<&<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:11 H0:i:3 H1:i:7
+EAS54_65:3:320:20:250 147 seq2 1532 77 35M = 1367 -200 TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA +'''/<<<<7:;+<;::<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:6 NM:i:2 UQ:i:24 H0:i:1 H1:i:2
+EAS114_26:7:37:79:581 83 seq2 1533 68 35M = 1349 -219 TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA 3,,,===6===<===<;=====-============ MF:i:18 Aq:i:27 NM:i:2 UQ:i:23 H0:i:0 H1:i:1
diff --git a/tests/data/test_group_query/group.fofn.in b/tests/data/test_group_query/group.fofn.in
new file mode 100644
index 0000000..4af9e82
--- /dev/null
+++ b/tests/data/test_group_query/group.fofn.in
@@ -0,0 +1,3 @@
+ at PacBioBAM_TestsDir@/data/test_group_query/test1.bam
+ at PacBioBAM_TestsDir@/data/test_group_query/test2.bam
+ at PacBioBAM_TestsDir@/data/test_group_query/test3.bam
diff --git a/tests/data/test_group_query/test1.bam b/tests/data/test_group_query/test1.bam
new file mode 100644
index 0000000..f92d6bf
Binary files /dev/null and b/tests/data/test_group_query/test1.bam differ
diff --git a/tests/data/test_group_query/test2.bam b/tests/data/test_group_query/test2.bam
new file mode 100644
index 0000000..53c1d8f
Binary files /dev/null and b/tests/data/test_group_query/test2.bam differ
diff --git a/tests/data/test_group_query/test2.bam.pbi b/tests/data/test_group_query/test2.bam.pbi
new file mode 100644
index 0000000..1b0c1b9
Binary files /dev/null and b/tests/data/test_group_query/test2.bam.pbi differ
diff --git a/tests/data/test_group_query/test3.bam b/tests/data/test_group_query/test3.bam
new file mode 100644
index 0000000..5b8548b
Binary files /dev/null and b/tests/data/test_group_query/test3.bam differ
diff --git a/tests/data/unmap1.bam b/tests/data/unmap1.bam
new file mode 100644
index 0000000..98fd22c
Binary files /dev/null and b/tests/data/unmap1.bam differ
diff --git a/tests/data/unmap1.bam.bai b/tests/data/unmap1.bam.bai
new file mode 100644
index 0000000..dd19971
Binary files /dev/null and b/tests/data/unmap1.bam.bai differ
diff --git a/tests/data/unmap2.bam b/tests/data/unmap2.bam
new file mode 100644
index 0000000..8feed79
Binary files /dev/null and b/tests/data/unmap2.bam differ
diff --git a/tests/data/unmap2.bam.bai b/tests/data/unmap2.bam.bai
new file mode 100644
index 0000000..f495714
Binary files /dev/null and b/tests/data/unmap2.bam.bai differ
diff --git a/tests/files.cmake b/tests/files.cmake
new file mode 100644
index 0000000..ea69cac
--- /dev/null
+++ b/tests/files.cmake
@@ -0,0 +1,43 @@
+# test case headers
+set( PacBioBAMTest_H
+
+)
+
+# test case sources
+set( PacBioBAMTest_CPP
+
+ ${PacBioBAM_TestsDir}/src/test_Accuracy.cpp
+ ${PacBioBAM_TestsDir}/src/test_AlignmentPrinter.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamFile.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamHeader.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecord.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecordBuilder.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecordClipping.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecordImplCore.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecordImplTags.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecordImplVariableData.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamRecordMapping.cpp
+ ${PacBioBAM_TestsDir}/src/test_BamWriter.cpp
+ ${PacBioBAM_TestsDir}/src/test_Cigar.cpp
+ ${PacBioBAM_TestsDir}/src/test_DataSetCore.cpp
+ ${PacBioBAM_TestsDir}/src/test_DataSetIO.cpp
+ ${PacBioBAM_TestsDir}/src/test_DataSetQuery.cpp
+ ${PacBioBAM_TestsDir}/src/test_DataSetXsd.cpp
+ ${PacBioBAM_TestsDir}/src/test_EndToEnd.cpp
+ ${PacBioBAM_TestsDir}/src/test_EntireFileQuery.cpp
+ ${PacBioBAM_TestsDir}/src/test_Frames.cpp
+ ${PacBioBAM_TestsDir}/src/test_GenomicIntervalQuery.cpp
+ ${PacBioBAM_TestsDir}/src/test_GroupQuery.cpp
+ ${PacBioBAM_TestsDir}/src/test_IndexedFastaReader.cpp
+ ${PacBioBAM_TestsDir}/src/test_Intervals.cpp
+ ${PacBioBAM_TestsDir}/src/test_PacBioIndex.cpp
+ ${PacBioBAM_TestsDir}/src/test_PolymeraseStitching.cpp
+ ${PacBioBAM_TestsDir}/src/test_QualityValues.cpp
+ ${PacBioBAM_TestsDir}/src/test_ReadGroupInfo.cpp
+ ${PacBioBAM_TestsDir}/src/test_SequenceUtils.cpp
+ ${PacBioBAM_TestsDir}/src/test_Tags.cpp
+ ${PacBioBAM_TestsDir}/src/test_TimeUtils.cpp
+ # ${PacBioBAM_TestsDir}/src/test_UnmappedReadsQuery.cpp
+ ${PacBioBAM_TestsDir}/src/test_ZmwQuery.cpp
+
+)
diff --git a/tests/src/CSharp/CheckSWIG.cs b/tests/src/CSharp/CheckSWIG.cs
new file mode 100644
index 0000000..d748774
--- /dev/null
+++ b/tests/src/CSharp/CheckSWIG.cs
@@ -0,0 +1,15 @@
+
+
+using PacBio.BAM;
+
+public class CheckSWIG
+{
+ public static void Main()
+ {
+ var header = new BamHeader();
+ header.ToSam();
+ System.Console.WriteLine("");
+ System.Console.WriteLine("pbbam SWIG binding to C# worked!");
+ System.Console.WriteLine("");
+ }
+}
diff --git a/tests/src/CSharp/TestPbbam.cs.in b/tests/src/CSharp/TestPbbam.cs.in
new file mode 100644
index 0000000..efb2a11
--- /dev/null
+++ b/tests/src/CSharp/TestPbbam.cs.in
@@ -0,0 +1,119 @@
+#pragma warning disable 168, 219
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+
+using PacBio.BAM;
+
+namespace TestStuff
+{
+ //
+ // This approach is the best we can do for now, without requiring nunit.
+ //
+ public class TestPbbam
+ {
+ public static readonly string DATA_DIR = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/TestData";
+ public static readonly string BAM_FILENAME_1 = Path.Combine(DATA_DIR, "test_group_query", "test1.bam");
+ public static readonly string BAM_FILENAME_2 = Path.Combine(DATA_DIR, "test_group_query", "test2.bam");
+ public static readonly string FASTA_FILENAME = Path.Combine(DATA_DIR, "lambdaNEB.fa");
+
+ public TestPbbam ()
+ {
+ }
+
+ public static void TestExceptions()
+ {
+ try
+ {
+ var badFile = new BamFile("nonexistent.bam");
+ }
+ catch (Exception e)
+ {
+ //Console.Write(e.ToString());
+ Console.WriteLine("Exceptions - OK!");
+ return;
+ }
+ throw new Exception("doh!");
+ }
+
+
+ public static void TestCigar()
+ {
+ string s = "3=3I3D";
+ var c = new CigarType(s);
+ string cs = c.ToStdString();
+ if (s != cs)
+ {
+ throw new Exception("Cigar not working!");
+ }
+
+ // This used to crash
+ var c2 = CigarType.FromStdString("3=3I3D");
+
+ Console.WriteLine("TestCigar - OK!");
+ }
+
+ public static void TestBamFileEnumeration()
+ {
+ var bf = new BamFile(BAM_FILENAME_2);
+ var q = new EntireFileQuery(new DataSet(bf));
+
+ if (q.Count() != 4)
+ {
+ throw new Exception("Enumeration not working!");
+ }
+
+ Console.WriteLine("TesBamFileEnumeration - OK!");
+ }
+
+ public static void TestIndexedFasta()
+ {
+ var f = new IndexedFastaReader(FASTA_FILENAME);
+ bool check = (f.NumSequences() == 1 &&
+ f.HasSequence("lambda_NEB3011") &&
+ f.Subsequence("lambda_NEB3011:0-10") == "GGGCGGCGAC");
+ if (!check)
+ {
+ throw new Exception("Indexed FASTA files not working");
+ }
+
+ var b = new BamRecord();
+ var x = b.Impl();
+
+ Console.WriteLine("TestIndexedFasta - OK!");
+ }
+
+ public static void TestZmwQuery()
+ {
+ var d = new DataSet(BAM_FILENAME_2);
+ var q = new ZmwQuery(new IntList {1, 2, 3}, d);
+ var q2 = new ZmwQuery(new IntList { 14743 }, d);
+
+ if (0 != q.Count() || 4 != q2.Count())
+ {
+ throw new Exception("ZmwQuery not working");
+ }
+ Console.WriteLine("TestZmwQuery - OK!");
+ }
+
+ public void RunAllTests()
+ {
+ TestExceptions();
+ TestCigar();
+ TestBamFileEnumeration();
+ TestIndexedFasta();
+ TestZmwQuery();
+ }
+
+ public static void Main()
+ {
+ var t = new TestPbbam();
+ t.RunAllTests();
+ }
+
+ }
+}
diff --git a/tests/src/CSharp/buildAssembly.sh.in b/tests/src/CSharp/buildAssembly.sh.in
new file mode 100644
index 0000000..30313e2
--- /dev/null
+++ b/tests/src/CSharp/buildAssembly.sh.in
@@ -0,0 +1,91 @@
+#!/bin/bash
+set -euo pipefail
+set -x
+
+
+# This is a temporary hack to build windows C# bindings, while I work on getting it
+# to work nicely through CMake --DHA
+
+# UNIX setup (before doing this!)
+# - install swig, cmake, and mono
+#
+# Windows setup (before doing this!):
+# - install msys2 (64-bit) from https://msys2.github.io/
+# - install: (pacman -S [package-name]); in all cases use the mingw-w64 64bit version when
+# available:
+# + gcc, g++, make
+# + zlib-dev
+# + swig
+# + cmake
+# - for cmake, generate MSYS makefiles
+
+if [ ${WIN32} ]; then
+ PLATFORM="Windows"
+else
+ PLATFORM="Unix"
+fi
+
+MSBUILD=${CSHARP_PROJECT_BUILDER}
+CSC=${CSHARP_COMPILER}
+
+CSPROJ_ROOT=${PacBioBAM_CSharpLibDir}
+CSPROJ=${PacBioBAM_CSharpLibDir}/PacBio.BAM.csproj
+ASSEMBLY_ROOT=${PacBioBAM_CSharpLibDir}/bin/Debug
+
+#
+# Make the managed DLL
+#
+( cd $CSPROJ_ROOT; $MSBUILD $CSPROJ ) || { echo "Failed to build managed DLL" && exit -1; }
+
+#
+# Copy the dependency libs
+#
+cp ${PacBioBAM_LibDir}/libpbbam${CMAKE_SHARED_LIBRARY_SUFFIX} $ASSEMBLY_ROOT
+cp ${HTSLIB_LIBRARIES} $ASSEMBLY_ROOT # Need "libhts*.dylib"
+
+if [ "$PLATFORM" == "Windows" ]
+then
+ # stuff we need to bundle on windows
+ cp /mingw64/bin/zlib1.dll $ASSEMBLY_ROOT
+ cp /mingw64/bin/libwinpthread-1.dll $ASSEMBLY_ROOT
+ cp ${PacBioBAM_CSharpLibDir}/libPacBioBam.dll $ASSEMBLY_ROOT/PacBioBam.dll
+else
+ # For UNIX this is .so, even Mac. Not sure why.
+ cp ${PacBioBAM_CSharpLibDir}/libPacBioBam.so $ASSEMBLY_ROOT
+ cp ${HTSLIB_LIBRARIES_VERSIONED_LINK} $ASSEMBLY_ROOT # Need "libhts*.dylib"
+fi
+
+# Bundle test data
+mkdir -p $ASSEMBLY_ROOT/TestData
+cp -rf ${PacBioBAM_TestsDir}/data/* $ASSEMBLY_ROOT/TestData
+
+#
+# Make the "check" program, which we need to put next to the assembly to
+# allow it to be resolved.
+#
+
+CHECK_SRC=${CSharpTestRootDir}/CheckSWIG.cs
+CHECK_BIN=$ASSEMBLY_ROOT/CheckSWIG.exe
+
+
+if [ "$PLATFORM" == "Windows" ]
+then
+ ( $CSC /lib:$ASSEMBLY_ROOT //r:PacBio.BAM.dll /out:$CHECK_BIN $(cygpath -w $CHECK_SRC) && $CHECK_BIN)
+else
+ ( $CSC /lib:$ASSEMBLY_ROOT /r:PacBio.BAM.dll /out:$CHECK_BIN $CHECK_SRC && cd $ASSEMBLY_ROOT && mono CheckSWIG.exe )
+fi
+
+
+#
+# Build the fuller test suite, and bundle
+#
+TEST_SRC=${CSharpTestRootDir}/TestPbbam.cs
+TEST_BIN=$ASSEMBLY_ROOT/TestPbbam.exe
+
+
+if [ "$PLATFORM" == "Windows" ]
+then
+ ( $CSC /lib:$ASSEMBLY_ROOT //r:PacBio.BAM.dll /out:$TEST_BIN $(cygpath -w $TEST_SRC) && $TEST_BIN )
+else
+ ( $CSC /lib:$ASSEMBLY_ROOT /r:PacBio.BAM.dll /out:$TEST_BIN $TEST_SRC && cd $ASSEMBLY_ROOT && mono TestPbbam.exe )
+fi
diff --git a/tests/src/CSharp/check_swig.sh.in b/tests/src/CSharp/check_swig.sh.in
new file mode 100755
index 0000000..ba07b75
--- /dev/null
+++ b/tests/src/CSharp/check_swig.sh.in
@@ -0,0 +1,18 @@
+#!/bin/sh
+(cd ${PacBioBAM_CSharpLibDir}; xbuild PacBio.BAM.csproj)
+
+${CSHARP_COMPILER} -lib:${PacBioBAM_CSharpLibDir}/bin/Debug -r:PacBio.BAM.dll CheckSWIG.cs
+
+#
+# For deployment these all need to be installed somewhere more sensible.
+# This is just a hack for testing if the build works.
+#
+LIBRARY_PATHS=\
+${PacBioBAM_CSharpLibDir}:\
+${PacBioBAM_LibDir}:\
+${Htslib_LibDir}
+
+DYLD_LIBRARY_PATH=$LIBRARY_PATHS \
+LD_LIBRARY_PATH=$LIBRARY_PATHS \
+MONO_PATH=${PacBioBAM_CSharpLibDir}/bin/Debug \
+mono CheckSWIG.exe
diff --git a/tests/src/R/check_swig.R.in b/tests/src/R/check_swig.R.in
new file mode 100644
index 0000000..13b07c4
--- /dev/null
+++ b/tests/src/R/check_swig.R.in
@@ -0,0 +1,58 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+# load PacBioBAM lib & wrapper script
+
+# htslib_libname <- "@Htslib_Libraries@"
+# dyn.load(htslib_libname)
+# # htslib_libname <- paste(htslib_libpath, "libhts", sep="/")
+# # dyn.load(paste(htslib_libname, ".dylib", sep=""))
+
+pbbam_libpath <- "@PacBioBAM_RLibDir@"
+pbbam_libname <- paste(pbbam_libpath, "PacBioBam", sep="/")
+dyn.load(paste(pbbam_libname, .Platform$dynlib.ext, sep=""))
+
+pbbam_wrapper <- paste(pbbam_libpath, "PacBioBam.R", sep="/")
+source(pbbam_wrapper)
+
+cacheMetaData(1)
+
+h <- BamHeader()
+
+message = "\nR Wrapper OK.\n"
+cat(message)
+cat("\n")
diff --git a/tests/src/R/test_pbbam.R b/tests/src/R/test_pbbam.R
new file mode 100644
index 0000000..55c71a8
--- /dev/null
+++ b/tests/src/R/test_pbbam.R
@@ -0,0 +1,23 @@
+
+# usage: R [args] < test_pbbam.R --args <tests_scripts_dir> <PacBioBam_lib_dir> <test_data_dir>
+args <- commandArgs(TRUE)
+tests_path <- args[1]
+lib_path <- args[2]
+test_data_path <- args[3]
+
+# load PacBioBAM lib & wrapper script
+pbbam_libname <- paste(lib_path, "PacBioBam", sep="/")
+pbbam_wrapper <- paste(lib_path, "PacBioBam.R", sep="/")
+dyn.load(paste(pbbam_libname, .Platform$dynlib.ext, sep=""))
+source(pbbam_wrapper)
+cacheMetaData(1)
+
+# init test utils & run test cases
+source(paste(tests_path, "utils.R", sep="/"))
+run_test_suite(tests_path)
+
+# print results & exit
+results <- test_suite_results()
+results$print_summary()
+if (results$any_failed())
+ quit(status=1)
diff --git a/tests/src/R/test_pbbam.sh.in b/tests/src/R/test_pbbam.sh.in
new file mode 100644
index 0000000..af6eb89
--- /dev/null
+++ b/tests/src/R/test_pbbam.sh.in
@@ -0,0 +1,45 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+#! /usr/bin/sh
+
+R --slave --no-save < @RTestRootDir@/test_pbbam.R --args \
+ @RTestRootDir@/tests \
+ @PacBioBAM_RLibDir@ \
+ @PacBioBAM_TestsDir@/data
+
+rm @PacBioBAM_TestsDir@/data/generated.bam
diff --git a/tests/src/R/tests/test_Accuracy.R b/tests/src/R/tests/test_Accuracy.R
new file mode 100644
index 0000000..bc29eb0
--- /dev/null
+++ b/tests/src/R/tests/test_Accuracy.R
@@ -0,0 +1,53 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+test_case("Accuracy_Clamp", {
+
+ a_zero <- Accuracy(0)
+ a_neg <- Accuracy(-1)
+ a_min <- Accuracy(0)
+ a_normal <- Accuracy(300)
+ a_max <- Accuracy(1000)
+ a_tooLarge <- Accuracy(2000)
+
+ assertEqual(0L, a_zero$ToInt())
+ assertEqual(0L, a_neg$ToInt())
+ assertEqual(0L, a_min$ToInt())
+ assertEqual(300L, a_normal$ToInt())
+ assertEqual(1000L, a_max$ToInt())
+ assertEqual(1000L, a_tooLarge$ToInt())
+})
diff --git a/tests/src/R/tests/test_BamFile.R b/tests/src/R/tests/test_BamFile.R
new file mode 100644
index 0000000..41e419c
--- /dev/null
+++ b/tests/src/R/tests/test_BamFile.R
@@ -0,0 +1,77 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+test_case("BamFile_NonExistentFile", {
+ result <- tryCatch(
+ {
+ f <- BamFile("does_not_exist.bam")
+ assertTrue(FALSE) # should have thrown
+ invisible()
+ },
+ warning = function(w) {
+ assertTrue(TRUE)
+ invisible()
+ },
+ error = function(e) {
+ assertTrue(TRUE)
+ invisible()
+ }
+ )
+ return(result)
+})
+
+test_case("BamFile_Ctor", {
+
+ fn <- paste(test_data_path, "ex2.bam", sep="/")
+
+ result <- tryCatch(
+ {
+ f <- BamFile(fn)
+ assertFalse(f$IsPacBioBAM())
+ invisible()
+ },
+ warning = function(w) {
+ assertTrue(TRUE)
+ invisible()
+ },
+ error = function(e) {
+ assertTrue(FALSE) # should not throw
+ invisible()
+ }
+ )
+ return(result)
+})
diff --git a/tests/src/R/tests/test_BamHeader.R b/tests/src/R/tests/test_BamHeader.R
new file mode 100644
index 0000000..eab44e5
--- /dev/null
+++ b/tests/src/R/tests/test_BamHeader.R
@@ -0,0 +1,193 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+empty_program <- function(header) {
+ result <- tryCatch(
+ {
+ pg <- header$Program("foo")
+ assertTrue(FALSE) # should have thrown
+ invisible()
+ },
+ warning = function(w) {
+ assertTrue(TRUE)
+ invisible()
+ }
+ )
+ return(result)
+}
+
+empty_readgroup <- function(header) {
+ result <- tryCatch(
+ {
+ pg <- header$ReadGroup("foo")
+ assertTrue(FALSE) # should have thrown
+ invisible()
+ },
+ warning = function(w) {
+ assertTrue(TRUE)
+ invisible()
+ }
+ )
+ return(result)
+}
+
+empty_sequenceid <- function(header) {
+ result <- tryCatch(
+ {
+ pg <- header$SequenceId("foo")
+ assertTrue(FALSE) # should have thrown
+ invisible()
+ },
+ warning = function(w) {
+ assertTrue(TRUE)
+ invisible()
+ }
+ )
+ return(result)
+}
+
+test_case("BamHeader_Defaults", {
+
+ header <- BamHeader()
+
+ assertEqual(0L, nchar(header$Version()))
+ assertEqual(0L, nchar(header$SortOrder()))
+ assertTrue(header$ReadGroups()$empty())
+ assertTrue(header$Sequences()$empty())
+ assertTrue(header$Programs()$empty())
+
+ pg <- empty_program(header)
+ rg <- empty_readgroup(header)
+ id <- empty_sequenceid(header)
+
+ # TODO: get comment fetching working
+ #assertEqual(1, length(header$Comments()))
+})
+
+test_case("BamHeader_Decode", {
+
+ text <- paste("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3",
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo",
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo",
+ "@RG\tID:rg1\tSM:control",
+ "@RG\tID:rg2\tSM:condition1",
+ "@RG\tID:rg3\tSM:condition1",
+ "@PG\tID:_foo_\tPN:ide",
+ "@CO\tipsum and so on",
+ "@CO\tcitation needed",
+ sep="\n"
+ )
+
+ header <- BamHeader(text)
+
+ assertEqual("1.1", header$Version())
+ assertEqual("queryname", header$SortOrder())
+ assertEqual("3.0b3", header$PacBioBamVersion())
+
+ assertEqual(3L, header$ReadGroups()$size())
+ assertTrue(header$HasReadGroup("rg1"))
+ assertTrue(header$HasReadGroup("rg2"))
+ assertTrue(header$HasReadGroup("rg3"))
+ assertEqual("control", header$ReadGroup("rg1")$Sample())
+ assertEqual("condition1", header$ReadGroup("rg2")$Sample())
+ assertEqual("condition1", header$ReadGroup("rg3")$Sample())
+
+ assertEqual(2L, header$Sequences()$size())
+ assertTrue(header$HasSequence("chr1"))
+ assertTrue(header$HasSequence("chr2"))
+ assertEqual("chocobo", header$Sequence("chr1")$Species())
+ assertEqual("chocobo", header$Sequence("chr2")$Species())
+ assertEqual("2038", header$Sequence("chr1")$Length())
+ assertEqual("3042", header$Sequence("chr2")$Length())
+
+ assertEqual(1L, header$Programs()$size())
+ assertTrue(header$HasProgram("_foo_"))
+ assertEqual("ide", header$Program("_foo_")$Name())
+
+ # TODO: get comment fetching working
+ # assertEqual(2, header$Comments()$size())
+ # assertEqual("ipsum and so on", header$Comments()[1])
+ # assertEqual("citation needed", header$Comments()[2])
+})
+
+test_case("BamHeader_Encode", {
+
+ expectedText <- paste("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3",
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo",
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo",
+ "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control",
+ "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1",
+ "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1",
+ "@PG\tID:_foo_\tPN:ide",
+ "@CO\tipsum and so on",
+ "@CO\tcitation needed",
+ "",
+ sep="\n"
+ )
+
+ rg1 <- ReadGroupInfo("rg1")
+ rg1$Sample("control")
+ rg2 <- ReadGroupInfo("rg2")
+ rg2$Sample("condition1")
+ rg3 <- ReadGroupInfo("rg3")
+ rg3$Sample("condition1")
+
+ seq1 <- SequenceInfo("chr1")
+ seq1$Length("2038")
+ seq1$Species("chocobo")
+ seq2 <- SequenceInfo("chr2")
+ seq2$Length("3042")
+ seq2$Species("chocobo")
+
+ prog1 <- ProgramInfo("_foo_")
+ prog1$Name("ide")
+
+ header <- BamHeader()
+ header$Version("1.1")
+ header$SortOrder("queryname")
+ header$PacBioBamVersion("3.0b3")
+ header$AddReadGroup(rg1)
+ header$AddReadGroup(rg2)
+ header$AddReadGroup(rg3)
+ header$AddSequence(seq1)
+ header$AddSequence(seq2)
+ header$AddProgram(prog1)
+ header$AddComment("ipsum and so on")
+ header$AddComment("citation needed")
+
+ assertEqual(expectedText, header$ToSam())
+})
diff --git a/tests/src/R/tests/test_Cigar.R b/tests/src/R/tests/test_Cigar.R
new file mode 100644
index 0000000..dd3e544
--- /dev/null
+++ b/tests/src/R/tests/test_Cigar.R
@@ -0,0 +1,219 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+test_case("Cigar_TypeToChar", {
+ assertEqual('M', CigarOperation_TypeToChar('ALIGNMENT_MATCH'))
+ assertEqual('I', CigarOperation_TypeToChar('INSERTION'))
+ assertEqual('D', CigarOperation_TypeToChar('DELETION'))
+ assertEqual('N', CigarOperation_TypeToChar('REFERENCE_SKIP'))
+ assertEqual('S', CigarOperation_TypeToChar('SOFT_CLIP'))
+ assertEqual('H', CigarOperation_TypeToChar('HARD_CLIP'))
+ assertEqual('P', CigarOperation_TypeToChar('PADDING'))
+ assertEqual('=', CigarOperation_TypeToChar('SEQUENCE_MATCH'))
+ assertEqual('X', CigarOperation_TypeToChar('SEQUENCE_MISMATCH'))
+})
+
+test_case("Cigar_CharToType", {
+
+ assertEqual('ALIGNMENT_MATCH', CigarOperation_CharToType('M'))
+ assertEqual('INSERTION', CigarOperation_CharToType('I'))
+ assertEqual('DELETION', CigarOperation_CharToType('D'))
+ assertEqual('REFERENCE_SKIP', CigarOperation_CharToType('N'))
+ assertEqual('SOFT_CLIP', CigarOperation_CharToType('S'))
+ assertEqual('HARD_CLIP', CigarOperation_CharToType('H'))
+ assertEqual('PADDING', CigarOperation_CharToType('P'))
+ assertEqual('SEQUENCE_MATCH', CigarOperation_CharToType('='))
+ assertEqual('SEQUENCE_MISMATCH', CigarOperation_CharToType('X'))
+})
+
+test_case("Cigar_SetType", {
+
+ m = CigarOperation()
+ i = CigarOperation()
+ d = CigarOperation()
+ n = CigarOperation()
+ s = CigarOperation()
+ h = CigarOperation()
+ p = CigarOperation()
+ e = CigarOperation()
+ x = CigarOperation()
+
+ m$Type('ALIGNMENT_MATCH')
+ i$Type('INSERTION')
+ d$Type('DELETION')
+ n$Type('REFERENCE_SKIP')
+ s$Type('SOFT_CLIP')
+ h$Type('HARD_CLIP')
+ p$Type('PADDING')
+ e$Type('SEQUENCE_MATCH')
+ x$Type('SEQUENCE_MISMATCH')
+
+ assertEqual('M', m$Char())
+ assertEqual('I', i$Char())
+ assertEqual('D', d$Char())
+ assertEqual('N', n$Char())
+ assertEqual('S', s$Char())
+ assertEqual('H', h$Char())
+ assertEqual('P', p$Char())
+ assertEqual('=', e$Char())
+ assertEqual('X', x$Char())
+})
+
+test_case("Cigar_SetChar", {
+
+ m = CigarOperation()
+ i = CigarOperation()
+ d = CigarOperation()
+ n = CigarOperation()
+ s = CigarOperation()
+ h = CigarOperation()
+ p = CigarOperation()
+ e = CigarOperation()
+ x = CigarOperation()
+
+ m$Char('M')
+ i$Char('I')
+ d$Char('D')
+ n$Char('N')
+ s$Char('S')
+ h$Char('H')
+ p$Char('P')
+ e$Char('=')
+ x$Char('X')
+
+ assertEqual('ALIGNMENT_MATCH', m$Type())
+ assertEqual('INSERTION', i$Type())
+ assertEqual('DELETION', d$Type())
+ assertEqual('REFERENCE_SKIP', n$Type())
+ assertEqual('SOFT_CLIP', s$Type())
+ assertEqual('HARD_CLIP', h$Type())
+ assertEqual('PADDING', p$Type())
+ assertEqual('SEQUENCE_MATCH', e$Type())
+ assertEqual('SEQUENCE_MISMATCH', x$Type())
+})
+
+test_case("Cigar_CigarOpCtors", {
+
+ c1 <- CigarOperation("S", 10)
+ c2 <- CigarOperation(CigarOperation_TypeToChar('SOFT_CLIP'), 10)
+
+ assertEqual('S', c1$Char())
+ assertEqual('S', c2$Char())
+ assertEqual('SOFT_CLIP', c1$Type())
+ assertEqual('SOFT_CLIP', c2$Type())
+ assertEqual(10L, c1$Length())
+ assertEqual(10L, c2$Length())
+})
+
+test_case("Cigar_FromEmptyString", {
+
+ s <- ""
+ cigar <- Cigar(s)
+ assertEqual(0L, cigar$size())
+})
+
+test_case("Cigar_FromString", {
+
+ singleCigarString <- "100="
+ multiCigarString <- "100=2D34I6=6X6="
+
+ singleCigar <- Cigar(singleCigarString)
+ multiCigar <- Cigar(multiCigarString)
+
+ assertEqual(1L, singleCigar$size())
+
+ c <- singleCigar$front()
+ assertEqual('=', c$Char())
+ assertEqual('SEQUENCE_MATCH', c$Type())
+ assertEqual(100L, c$Length())
+
+ assertEqual(6L, multiCigar$size())
+
+ # haven't quite figured out [ ] accessors via SWIG,
+ # but this method does work w/ !ZERO!-based indices
+ op0 <- multiCigar$'__getitem__'(0)
+ op1 <- multiCigar$'__getitem__'(1)
+ op2 <- multiCigar$'__getitem__'(2)
+ op3 <- multiCigar$'__getitem__'(3)
+ op4 <- multiCigar$'__getitem__'(4)
+ op5 <- multiCigar$'__getitem__'(5)
+
+ assertEqual('=', op0$Char())
+ assertEqual('D', op1$Char())
+ assertEqual('I', op2$Char())
+ assertEqual('=', op3$Char())
+ assertEqual('X', op4$Char())
+ assertEqual('=', op5$Char())
+ assertEqual('SEQUENCE_MATCH', op0$Type())
+ assertEqual('DELETION', op1$Type())
+ assertEqual('INSERTION', op2$Type())
+ assertEqual('SEQUENCE_MATCH', op3$Type())
+ assertEqual('SEQUENCE_MISMATCH', op4$Type())
+ assertEqual('SEQUENCE_MATCH', op5$Type())
+ assertEqual(100L, op0$Length())
+ assertEqual(2L, op1$Length())
+ assertEqual(34L, op2$Length())
+ assertEqual(6L, op3$Length())
+ assertEqual(6L, op4$Length())
+ assertEqual(6L, op5$Length())
+})
+
+test_case("Cigar_ToEmptyString", {
+
+ cigar <- Cigar()
+ assertEqual(0L, nchar(cigar$ToStdString())) # empty string is 1
+})
+
+test_case("Cigar_ToString", {
+
+ singleCigarString <- "100="
+ multiCigarString <- "100=2D34I6=6X6="
+
+ singleCigar <- Cigar()
+ singleCigar$push_back( CigarOperation(CigarOperation_TypeToChar('SEQUENCE_MATCH'), 100) )
+
+ multiCigar <- Cigar()
+ multiCigar$push_back(CigarOperation('=', 100))
+ multiCigar$push_back(CigarOperation('D', 2))
+ multiCigar$push_back(CigarOperation('I', 34))
+ multiCigar$push_back(CigarOperation('=', 6))
+ multiCigar$push_back(CigarOperation('X', 6))
+ multiCigar$push_back(CigarOperation('=', 6))
+
+ assertEqual(singleCigarString, singleCigar$ToStdString())
+ assertEqual(multiCigarString, multiCigar$ToStdString())
+})
diff --git a/tests/src/R/tests/test_EndToEnd.R b/tests/src/R/tests/test_EndToEnd.R
new file mode 100644
index 0000000..04a06ac
--- /dev/null
+++ b/tests/src/R/tests/test_EndToEnd.R
@@ -0,0 +1,102 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+originalNames <-function(inputFn, generatedFn) {
+
+ result <- tryCatch(
+ {
+ file <- BamFile(inputFn)
+ writer <- BamWriter(generatedFn, file$Header())
+ entireFile <- EntireFileQuery(file)
+
+ names_in <- list()
+ iter <- entireFile$begin()
+ end <- entireFile$end()
+ while ( iter$'__ne__'(end) ) {
+ record <- iter$value()
+ names_in <- c(names_in, record$FullName())
+ writer$Write(record)
+ iter$incr()
+ }
+ return(names_in)
+ },
+ error = function(e) {
+ assertTrue(FALSE) # should not throw
+ return(list())
+ }
+ )
+ return(result)
+}
+
+generatedNames <- function(generatedFn) {
+
+ result <- tryCatch(
+ {
+ file <- BamFile(generatedFn)
+ entireFile <- EntireFileQuery(file)
+
+ names_out <- list()
+ iter <- entireFile$begin()
+ end <- entireFile$end()
+ while ( iter$'__ne__'(end) ) {
+ names_out <- c(names_out, iter$FullName())
+ iter$incr()
+ }
+ return(names_out)
+ },
+ error = function(e) {
+ assertTrue(FALSE) # should not throw
+ return(list())
+ }
+ )
+ return(result)
+}
+
+test_case("EndToEnd_Placeholder", {
+
+ inputFn <- paste(test_data_path, "ex2.bam", sep="/")
+ generatedFn <- paste(test_data_path, "generated.bam", sep="/")
+
+ # loop over original file, store names, write to generated file
+ names_in <- originalNames(inputFn, generatedFn)
+
+ # read names from new file
+ names_out <- generatedNames(generatedFn)
+
+ # ensure equal
+ assertEqual(names_in, names_out)
+})
diff --git a/tests/src/R/tests/test_Frames.R b/tests/src/R/tests/test_Frames.R
new file mode 100644
index 0000000..f9d6eb5
--- /dev/null
+++ b/tests/src/R/tests/test_Frames.R
@@ -0,0 +1,95 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTA,
+# SPECIA, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+testFrames_rawData <- list(
+ 0, 8, 140, 0, 0, 7, 4, 0, 85, 2,
+ 1, 3, 2, 10, 1, 20, 47, 10, 9, 60,
+ 20, 3, 12, 5, 13, 165, 6, 14, 22, 12,
+ 2, 4, 9, 218, 27, 3, 15, 2, 17, 2,
+ 45, 24, 89, 10, 7, 1, 11, 15, 0, 7,
+ 0, 28, 17, 12, 6, 10, 37, 0, 12, 52,
+ 0, 7, 1, 14, 3, 26, 12, 0, 20, 17,
+ 2, 13, 2, 9, 13, 7, 15, 29, 3, 6,
+ 2, 1, 28, 10, 3, 14, 7, 1, 22, 1,
+ 6, 6, 0, 19, 31, 6, 2, 14, 0, 0,
+ 1000, 947, 948
+)
+
+encodedFrames_rawData <- list(
+ 0, 8, 102, 0, 0, 7, 4, 0, 75, 2, 1, 3, 2,
+ 10, 1, 20, 47, 10, 9, 60, 20, 3, 12, 5, 13, 115,
+ 6, 14, 22, 12, 2, 4, 9, 135, 27, 3, 15, 2, 17,
+ 2, 45, 24, 77, 10, 7, 1, 11, 15, 0, 7, 0, 28,
+ 17, 12, 6, 10, 37, 0, 12, 52, 0, 7, 1, 14, 3,
+ 26, 12, 0, 20, 17, 2, 13, 2, 9, 13, 7, 15, 29,
+ 3, 6, 2, 1, 28, 10, 3, 14, 7, 1, 22, 1, 6,
+ 6, 0, 19, 31, 6, 2, 14, 0, 0,
+ 255, 254, 255
+)
+
+testFrames <- UInt16List()
+for (x in testFrames_rawData)
+ testFrames$push_back(x)
+
+encodedFrames <- UInt16List()
+for (x in encodedFrames_rawData)
+ encodedFrames$push_back(x)
+
+test_case("Frames_Basic", {
+
+ f <- Frames()
+ assertEqual(0L, f$Data()$size())
+
+ f2 <- Frames(testFrames)
+ d <- f2$Data()
+ assertEqual(length(testFrames), length(d))
+
+ numFrames <- length(testFrames)
+ for (i in 1:numFrames)
+ assertEqual(testFrames[i], d[i])
+})
+
+test_case("Frames_Downsample", {
+
+ f <- Frames(testFrames)
+ d <- f$Data()
+ assertEqual(length(encodedFrames), length(d))
+
+ numFrames <- length(encodedFrames)
+ for (i in 1:numFrames)
+ assertEqual(encodedFrames[i], d[i])
+})
diff --git a/tests/src/R/tests/test_Intervals.R b/tests/src/R/tests/test_Intervals.R
new file mode 100644
index 0000000..5160449
--- /dev/null
+++ b/tests/src/R/tests/test_Intervals.R
@@ -0,0 +1,340 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+test_case("Intervals_UnmappedPosition", {
+ assertEqual(-1L, UnmappedPosition())
+})
+
+test_case("Intervals_Ctors", {
+
+ empty <- PositionInterval()
+ single <- PositionInterval(4)
+ normal <- PositionInterval(5, 8)
+
+ assertEqual(0L, empty$Start())
+ assertEqual(0L, empty$Stop())
+ assertEqual(4L, single$Start())
+ assertEqual(5L, single$Stop())
+ assertEqual(5L, normal$Start())
+ assertEqual(8L, normal$Stop())
+})
+
+test_case("Intervals_Equality", {
+
+ empty <- PositionInterval()
+ empty2 <- PositionInterval()
+ singleton <- PositionInterval(4)
+ sameAsSingleton <- PositionInterval(4, 5)
+ normal <- PositionInterval(5, 8)
+ sameAsNormal <- PositionInterval(5, 8)
+ different <- PositionInterval(20, 40)
+
+ # self-equality
+ assertEqual(empty, empty)
+ assertEqual(singleton, singleton)
+ assertEqual(normal, normal)
+ assertEqual(different, different)
+
+ # same values
+ # TODO: fix this to work with == or *anything* cleaner
+ assertTrue(empty$'__eq__'(empty2))
+ assertTrue(singleton$'__eq__'(sameAsSingleton))
+ assertTrue(normal$'__eq__'(sameAsNormal))
+
+ # different values
+ assertNotEqual(empty, singleton)
+ assertNotEqual(empty, normal)
+ assertNotEqual(empty, different)
+ assertNotEqual(singleton, normal)
+ assertNotEqual(normal, different)
+})
+
+test_case("Intervals_Copy", {
+
+ interval1 <- PositionInterval(5,8)
+ interval2 <- PositionInterval(interval1)
+ interval3 <- interval1
+
+ # TODO: fix this to work with == or *anything* cleaner
+ assertTrue(interval1$'__eq__'(interval1))
+ assertTrue(interval1$'__eq__'(interval2))
+ assertTrue(interval1$'__eq__'(interval3))
+})
+
+test_case("Intervals_Modifiers", {
+
+ interval1 <- PositionInterval(5,8)
+ interval2 <- PositionInterval(interval1)
+ interval2$Start(2)
+ interval2$Stop(10)
+
+ assertNotEqual(interval1, interval2)
+ assertEqual(2L, interval2$Start())
+ assertEqual(10L, interval2$Stop())
+})
+
+test_case("Intervals_Cover", {
+
+ a <- PositionInterval(2,4)
+ b <- PositionInterval(3,5)
+ c <- PositionInterval(6,8)
+ d <- PositionInterval(1,7)
+ e <- PositionInterval(5,8)
+
+ # 0123456789
+ # a --
+ # b --
+ # c --
+ # d ------
+ # e ---
+
+ # self-cover
+ assertTrue(a$Covers(a))
+ assertTrue(a$CoveredBy(a))
+
+ # basic covers/covered
+ assertTrue(b$CoveredBy(d))
+ assertTrue(d$Covers(b))
+ assertNotEqual(b, d)
+ assertFalse(b$Covers(d))
+
+ # completely disjoint
+ assertFalse(b$Covers(c))
+ assertFalse(c$Covers(b))
+ assertFalse(b$CoveredBy(c))
+ assertFalse(c$CoveredBy(b))
+
+ # b.stop == e.start
+ assertFalse(b$Covers(e))
+ assertFalse(b$CoveredBy(e))
+
+ # shared endpoint, start contained
+ assertTrue(e$Covers(c))
+ assertTrue(c$CoveredBy(e))
+})
+
+test_case("Intervals_Intersect", {
+
+ a <- PositionInterval(2,4)
+ b <- PositionInterval(3,5)
+ c <- PositionInterval(6,8)
+ d <- PositionInterval(1,7)
+ e <- PositionInterval(5,8)
+
+ # 0123456789
+ # a --
+ # b --
+ # c --
+ # d ------
+ # e ---
+
+ # self-intersection
+ assertTrue(a$Intersects(a))
+
+ # intersection is commutative
+ assertTrue(a$Intersects(b))
+ assertTrue(b$Intersects(a))
+
+ # covered implies intersection
+ assertTrue(d$Covers(a))
+ assertTrue(a$Intersects(d))
+ assertTrue(d$Intersects(a))
+
+ # c.start > b.stop (obvious disjoint)
+ assertFalse(b$Intersects(c))
+
+ # b.stop == e.start (intervals are right-open, so disjoint)
+ assertFalse(b$Intersects(e))
+})
+
+test_case("Intervals_Validity", {
+
+ a <- PositionInterval() # default ctor
+ b <- PositionInterval(0,0) # start == stop (zero)
+ c <- PositionInterval(4,4) # start == stop (nonzero)
+ d <- PositionInterval(0,1) # start < stop (start is zero)
+ e <- PositionInterval(4,5) # start < stop (start is nonzero)
+ f <- PositionInterval(5,4) # start > stop
+
+ assertFalse(a$IsValid())
+ assertFalse(b$IsValid())
+ assertFalse(c$IsValid())
+ assertTrue(d$IsValid())
+ assertTrue(e$IsValid())
+ assertFalse(f$IsValid())
+})
+
+test_case("Intervals_Length",{
+
+ a <- PositionInterval(2,4)
+ b <- PositionInterval(3,5)
+ c <- PositionInterval(6,8)
+ d <- PositionInterval(1,7)
+ e <- PositionInterval(5,8)
+
+ assertEqual(2L, a$Length())
+ assertEqual(2L, b$Length())
+ assertEqual(2L, c$Length())
+ assertEqual(6L, d$Length())
+ assertEqual(3L, e$Length())
+})
+
+test_case("GenomicIntervals_Ctors", {
+
+ empty <- GenomicInterval()
+ normal <- GenomicInterval(0, 100, 200)
+
+ assertEqual(-1L, empty$Id())
+ assertEqual(0L, empty$Start())
+ assertEqual(0L, empty$Stop())
+
+ assertEqual(0L, normal$Id())
+ assertEqual(100L, normal$Start())
+ assertEqual(200L, normal$Stop())
+})
+
+test_case("GenomicIntervals_Copy", {
+
+ a <- GenomicInterval(1, 10, 20)
+ b <- GenomicInterval(a)
+ c <- a
+
+ # TODO: fix this to work with == or *anything* cleaner
+ assertTrue(a$'__eq__'(a))
+ assertTrue(a$'__eq__'(b))
+ assertTrue(a$'__eq__'(c))
+})
+
+test_case("GenomicIntervals_Modifiers", {
+
+ a <- GenomicInterval(1, 10, 20)
+
+ b <- GenomicInterval(a)
+ b$Id(5)
+ b$Start(2)
+ b$Stop(10)
+
+ c <- GenomicInterval(a)
+ c$Interval(b$Interval())
+
+ assertNotEqual(a, b)
+
+ assertEqual(5L, b$Id())
+ assertEqual(2L, b$Start())
+ assertEqual(10L, b$Stop())
+
+ assertEqual(a$Id(), c$Id())
+
+ # TODO: fix this to work with == or *anything* cleaner
+ assertTrue(b$Interval()$'__eq__'(c$Interval()))
+})
+
+test_case("GenomicIntervals_Cover", {
+
+ a <- GenomicInterval(0,2,4)
+ b <- GenomicInterval(0,3,5)
+ c <- GenomicInterval(0,6,8)
+ d <- GenomicInterval(0,1,7)
+ e <- GenomicInterval(0,5,8)
+ f <- GenomicInterval(1,3,5) # same as b, different ref
+
+ # 0123456789
+ # a --
+ # b --
+ # c --
+ # d ------
+ # e ---
+
+ # self-cover
+ assertTrue(a$Covers(a))
+ assertTrue(a$CoveredBy(a))
+
+ # basic covers/covered
+ assertTrue(b$CoveredBy(d))
+ assertTrue(d$Covers(b))
+ assertNotEqual(b, d)
+ assertFalse(b$Covers(d))
+
+ # same coords as b, but different ref
+ assertFalse(f$CoveredBy(d))
+ assertFalse(d$Covers(f))
+ assertNotEqual(f, d)
+ assertFalse(f$Covers(d))
+
+ # obvious disjoint
+ assertFalse(b$Covers(c))
+ assertFalse(c$Covers(b))
+ assertFalse(b$CoveredBy(c))
+ assertFalse(c$CoveredBy(b))
+
+ # b.stop == e.start (intervals are right-open, so disjoint)
+ assertFalse(b$Covers(e))
+ assertFalse(b$CoveredBy(e))
+
+ # shared endpoint, start contained
+ assertTrue(e$Covers(c))
+ assertTrue(c$CoveredBy(e))
+
+ # assertTrue(FALSE)
+})
+
+test_case("GenomicIntervals_Validity", {
+
+ a <- GenomicInterval() # default
+ b <- GenomicInterval(0,0,0) # valid id, start == stop (zero)
+ c <- GenomicInterval(0,4,4) # valid id, start == stop (non-zero)
+ d <- GenomicInterval(0,0,1) # valid id, start < stop (start == zero) OK
+ e <- GenomicInterval(0,4,5) # valid id, start < stop (start > zero) OK
+ f <- GenomicInterval(0,5,4) # valid id, start > stop
+ g <- GenomicInterval(-1,0,0) # invalid id, start == stop (zero)
+ h <- GenomicInterval(-1,4,4) # invalid id, start == stop (non-zero)
+ i <- GenomicInterval(-1,0,1) # invalid id, start < stop (start == zero)
+ j <- GenomicInterval(-1,4,5) # invalid id, start < stop (start > zero)
+ k <- GenomicInterval(-1,5,4) # invalid id, start > stop
+
+ assertTrue(d$IsValid())
+ assertTrue(e$IsValid())
+ assertFalse(a$IsValid())
+ assertFalse(b$IsValid())
+ assertFalse(c$IsValid())
+ assertFalse(f$IsValid())
+ assertFalse(g$IsValid())
+ assertFalse(h$IsValid())
+ assertFalse(i$IsValid())
+ assertFalse(j$IsValid())
+ assertFalse(k$IsValid())
+})
diff --git a/tests/src/R/tests/test_QualityValues.R b/tests/src/R/tests/test_QualityValues.R
new file mode 100644
index 0000000..b0671d0
--- /dev/null
+++ b/tests/src/R/tests/test_QualityValues.R
@@ -0,0 +1,113 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+test_case("QualityValue_Defaults", {
+
+ value <- QualityValue()
+ assertEqual(0L, value$ToInt())
+ assertEqual('!', value$Fastq())
+})
+
+test_case("QualityValue_FromNumber", {
+
+ zero <- QualityValue(0)
+ thirtythree <- QualityValue(33)
+ normal <- QualityValue(42)
+ maxQV <- QualityValue(93)
+ tooHigh <- QualityValue(94)
+ max8bit <- QualityValue(126)
+
+ assertEqual(0L, zero$ToInt())
+ assertEqual(33L, thirtythree$ToInt())
+ assertEqual(42L, normal$ToInt())
+ assertEqual(93L, maxQV$ToInt())
+ assertEqual(93L, tooHigh$ToInt())
+ assertEqual(93L, max8bit$ToInt())
+
+ assertEqual('!', zero$Fastq())
+ assertEqual('B', thirtythree$Fastq())
+ assertEqual('K', normal$Fastq())
+ assertEqual('~', maxQV$Fastq())
+ assertEqual('~', tooHigh$Fastq())
+ assertEqual('~', max8bit$Fastq())
+})
+
+test_case("QualityValue_FromFastq", {
+
+ zero <- QualityValue_FromFastq('!')
+ thirtythree <- QualityValue_FromFastq('B')
+ normal <- QualityValue_FromFastq('K')
+ maxQV <- QualityValue_FromFastq('~')
+
+ assertEqual(0L, zero$ToInt())
+ assertEqual(33L, thirtythree$ToInt())
+ assertEqual(42L, normal$ToInt())
+ assertEqual(93L, maxQV$ToInt())
+})
+
+test_case("QualityValues_Defaults", {
+ values <- QualityValues()
+ assertEqual(0L, nchar(values$Fastq()))
+})
+
+test_case("QualityValues_FromNumbers", {
+
+ fastqString <- "~~~KKBB!!"
+ values <- c(93, 93, 93, 42, 42, 33, 33, 0, 0)
+
+ qvs <- QualityValues()
+ for (v in values)
+ qvs$push_back(QualityValue(v))
+
+ assertEqual(fastqString, qvs$Fastq())
+})
+
+test_case("QualityValues_FromFastq", {
+
+ fastqString <- "~~~KKBB!!"
+ values <- c(93L, 93L, 93L, 42L, 42L, 33L, 33L, 0L, 0L)
+
+ qvs <- QualityValues(fastqString)
+ assertEqual(nchar(fastqString), qvs$size())
+ assertEqual(length(values), qvs$size())
+
+ numValues <- length(values)
+ for ( i in 1:numValues ) {
+ qv <- qvs$'__getitem__'(i-1)
+ assertEqual(values[i], qv$ToInt())
+ }
+})
diff --git a/tests/src/R/tests/utils.R b/tests/src/R/tests/utils.R
new file mode 100644
index 0000000..ff793a6
--- /dev/null
+++ b/tests/src/R/tests/utils.R
@@ -0,0 +1,307 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+# main test suite runner
+run_test_suite <- function(path) {
+ test_files <- dir(path, "^test.*\\.[rR]$", full.names = TRUE)
+ lapply(test_files, run_test_file)
+ invisible()
+}
+
+run_test_file <- function(filename) {
+ source(filename)
+ invisible()
+}
+
+# main test case definition
+#
+# Example:
+# test_case("name", {
+# ...tested code here...
+# })
+#
+test_case <- function(name, code) {
+ test_case_runner(name, substitute(code))
+ invisible()
+}
+
+# main assert definitions
+#
+# assertEqual(expected, actual)
+# assertNotEqual(expected, actual)
+# assertTrue(expr)
+# assertFalse(expr)
+#
+
+assertEqual <- function(expected, actual) {
+ assertHelper(identical(expected, actual),
+ TRUE,
+ expression_string("expected"),
+ deparse(expected),
+ expression_string("actual"),
+ deparse(actual),
+ "==")
+}
+
+assertAllEqual <- function(expected, actual) {
+ assertHelper(all.equal(expected, actual),
+ TRUE,
+ expression_string("expected"),
+ deparse(expected),
+ expression_string("actual"),
+ deparse(actual),
+ "==")
+}
+
+assertNotEqual <- function(expected, actual) {
+ assertHelper(identical(expected, actual),
+ FALSE,
+ expression_string("expected"),
+ deparse(expected),
+ expression_string("actual"),
+ deparse(actual),
+ "!=")
+}
+
+assertTrue <- function(expr) {
+ assertHelper(as.vector(expr),
+ TRUE,
+ "TRUE",
+ "TRUE",
+ expression_string("expr"),
+ deparse(expr),
+ "==")
+}
+
+assertFalse <- function(expr) {
+ assertHelper(as.vector(expr),
+ FALSE,
+ "FALSE",
+ "FALSE",
+ expression_string("expr"),
+ deparse(expr),
+ "==")
+}
+
+# TODO: (if needed) assertLessThan, assertGreaterThan, assertNull, etc
+
+# ------------------------------- #
+# internals
+# ------------------------------- #
+
+expression_string <- function(name, env = parent.frame()) {
+ subs <- do.call("substitute", list(as.name(name), env))
+ paste0(deparse(subs, width.cutoff = 500), collapse = "\n")
+}
+
+assertHelper <- function(compare,
+ to,
+ expected_expr,
+ expected_value,
+ actual_expr,
+ actual_value,
+ compare_type)
+{
+ success <- identical(compare, to)
+
+ result <- make_assert_result(success,
+ expected_expr,
+ expected_value,
+ actual_expr,
+ actual_value,
+ compare_type)
+
+
+ # record result with testCaseCollector
+ testCaseResults <- test_case_results()
+ testCaseResults$add_result(result)
+ invisible()
+}
+
+make_assert_result <- function(success,
+ expected_expr,
+ expected_value,
+ actual_expr,
+ actual_value,
+ compare_type)
+{
+ structure(list(
+ success = success,
+ expectedExpression = expected_expr,
+ expectedValue = expected_value,
+ actualExpression = actual_expr,
+ actualValue = actual_value,
+ compareType = compare_type
+ ))
+}
+
+TestCaseResults <- setRefClass("TestCaseResults",
+
+ fields = list(
+ test = "character",
+ anyFailed = "logical",
+ results = "list"
+ ),
+ methods = list(
+ initialize = function(...) {
+ test <<- ""
+ anyFailed <<- FALSE
+
+ initFields(...)
+ },
+
+ start_test = function(name) {
+ test <<- name
+ results <<- list()
+ },
+
+ add_result = function(result) {
+ if (!result$success)
+ anyFailed <<- TRUE
+ results <<- c(results, list(result))
+ },
+
+ end_test = function() {
+
+ # summarize test case results
+ testOutput <- format_results()
+
+ # report to test collector
+ suiteResults <- test_suite_results()
+ suiteResults$add_test_case_result(anyFailed, testOutput)
+
+ # reset
+ test <<- ""
+ anyFailed <<- FALSE
+ results <<- list()
+ },
+
+ format_results = function() {
+
+ lines <- list()
+
+ status <- "OK"
+ if (anyFailed)
+ status <- "FAILED"
+
+ headerLine <- paste("TestCase:", test, "...", status, sep=" ")
+ lines <- c(lines, list(headerLine))
+
+ for (result in results) {
+ if (!result$success) {
+ valueOfLabel <- paste(result$actualExpression, result$compareType, result$expectedExpression, sep=" ")
+ valueOf <- paste(" Value of:", valueOfLabel, sep=" ")
+ actual <- paste(" Actual:", result$actualValue, sep=" ")
+ expected <- paste(" Expected:", result$expectedValue, sep=" ")
+ lines <- c(lines, valueOf, actual, expected, "")
+ }
+ }
+ invisible(lines)
+ }
+ )
+)
+
+TestSuiteResults <- setRefClass("TestSuiteResults",
+
+ fields = list(
+ numTests = "integer",
+ numFailed = "integer",
+ results = "list"
+ ),
+ methods = list(
+ initialize = function(...) {
+ numTests <<- 0L
+ numFailed <<- 0L
+ results <<- list()
+
+ initFields(...)
+ },
+
+ add_test_case_result = function(testHasFailures, testOutput) { #(results)
+ numTests <<- numTests + 1L
+ if (testHasFailures)
+ numFailed <<- numFailed + 1L
+ results <<- c(results, testOutput)
+ },
+
+ any_failed = function() {
+ return (numFailed != 0L)
+ },
+
+ print_summary = function(...) {
+
+ cat("\n")
+ cat("-------------------------\n")
+ cat("Tests Complete\n")
+ cat("-------------------------\n")
+ cat("\n")
+
+ for (result in results) {
+ cat(result)
+ cat("\n")
+ }
+ cat("-------------------------\n")
+
+ if (numFailed == 1L) {
+ footer <- paste(numFailed, "test failed out of", numTests, sep=" ")
+ } else {
+ footer <- paste(numFailed, "tests failed out of", numTests, sep=" ")
+ }
+ cat(footer)
+ cat("\n\n")
+ }
+ )
+)
+
+test_env = new.env()
+test_env$testSuiteResults <- TestSuiteResults$new()
+test_env$testCaseResults <- TestCaseResults$new()
+
+test_suite_results <- function() {
+ test_env$testSuiteResults
+}
+
+test_case_results <- function() {
+ test_env$testCaseResults
+}
+
+test_case_runner <- function(name, code) {
+ testCaseResults <- test_case_results()
+ testCaseResults$start_test(name)
+ eval(code, test_env)
+ testCaseResults$end_test()
+}
diff --git a/tests/src/TestData.h.in b/tests/src/TestData.h.in
new file mode 100644
index 0000000..e4d786c
--- /dev/null
+++ b/tests/src/TestData.h.in
@@ -0,0 +1,56 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef TESTDATA_H
+#define TESTDATA_H
+
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+namespace tests {
+
+const std::string Source_Dir = std::string("@PacBioBAM_TestsDir@");
+const std::string Bin_Dir = std::string("@CMAKE_CURRENT_BINARY_DIR@");
+const std::string Data_Dir = std::string("@PacBioBAM_TestsDir@/data");
+const std::string Samtools_Bin = std::string("@Samtools_Bin@");
+
+} // namespace tests
+} // namespace BAM
+} // namespace PacBio
+
+#endif // TESTDATA_H
diff --git a/tests/src/python/check_swig.py b/tests/src/python/check_swig.py
new file mode 100755
index 0000000..9a17f7e
--- /dev/null
+++ b/tests/src/python/check_swig.py
@@ -0,0 +1,44 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+try:
+ import PacBioBam as bam
+ header = bam.BamHeader()
+ print "\nPython wrapper OK.\n"
+except ImportError:
+ print "\nPython wrapper failed!\n"
+
diff --git a/tests/src/python/test/__init__.py b/tests/src/python/test/__init__.py
new file mode 100755
index 0000000..fb74df1
--- /dev/null
+++ b/tests/src/python/test/__init__.py
@@ -0,0 +1,39 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+# EMPTY ON PURPOSE.
+# This file just needs to exist for unit test discovery.
diff --git a/tests/src/python/test/config.py.in b/tests/src/python/test/config.py.in
new file mode 100644
index 0000000..c2b900e
--- /dev/null
+++ b/tests/src/python/test/config.py.in
@@ -0,0 +1,43 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+class TestData(object):
+ def __init__(self):
+
+ # Main test data directory
+ self.directory = "@PacBioBAM_TestsDir@/data"
+
\ No newline at end of file
diff --git a/tests/src/python/test/test_Accuracy.py b/tests/src/python/test/test_Accuracy.py
new file mode 100755
index 0000000..7bef5db
--- /dev/null
+++ b/tests/src/python/test/test_Accuracy.py
@@ -0,0 +1,65 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class AccuracyTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_clamp()
+
+ # ------------ TESTS --------------
+
+ def test_clamp(self):
+ a_zero = PacBioBam.Accuracy(0)
+ a_neg = PacBioBam.Accuracy(-1)
+ a_min = PacBioBam.Accuracy(0)
+ a_normal = PacBioBam.Accuracy(300)
+ a_max = PacBioBam.Accuracy(1000)
+ a_tooLarge = PacBioBam.Accuracy(2000)
+
+ self.assertEqual(0, int(a_zero))
+ self.assertEqual(0, int(a_neg))
+ self.assertEqual(0, int(a_min))
+ self.assertEqual(300, int(a_normal))
+ self.assertEqual(1000, int(a_max))
+ self.assertEqual(1000, int(a_tooLarge))
+
\ No newline at end of file
diff --git a/tests/src/python/test/test_BamFile.py b/tests/src/python/test/test_BamFile.py
new file mode 100755
index 0000000..214b2a8
--- /dev/null
+++ b/tests/src/python/test/test_BamFile.py
@@ -0,0 +1,63 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class BamFileTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def setUp(self):
+ self.data = config.TestData()
+ self.ex2BamFn = self.data.directory + "/ex2.bam"
+
+ def runTest(self):
+ self.test_ctor()
+ self.test_nonExistentFile()
+
+ # ------------ TESTS --------------
+
+ def test_ctor(self):
+ f = PacBioBam.BamFile(self.ex2BamFn)
+ self.assertFalse(f.IsPacBioBAM())
+
+ def test_nonExistentFile(self):
+ with self.assertRaises(RuntimeError):
+ f = PacBioBam.BamFile("non_existent_file.bam")
+
\ No newline at end of file
diff --git a/tests/src/python/test/test_BamHeader.py b/tests/src/python/test/test_BamHeader.py
new file mode 100755
index 0000000..076683b
--- /dev/null
+++ b/tests/src/python/test/test_BamHeader.py
@@ -0,0 +1,157 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class BamHeaderTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_defaultCtor()
+ self.test_decode()
+ self.test_encode()
+
+ # ------------ TESTS --------------
+
+ def test_defaultCtor(self):
+
+ header = PacBioBam.BamHeader()
+
+ self.assertFalse(header.Version())
+ self.assertFalse(header.SortOrder())
+ self.assertEqual(0, len(header.ReadGroups()))
+ self.assertEqual(0, len(header.Sequences()))
+ self.assertEqual(0, len(header.Programs()))
+ self.assertEqual(0, len(header.Comments()))
+
+ with self.assertRaises(RuntimeError):
+ pg = header.Program("foo")
+ rg = header.ReadGroup("foo")
+ sq = header.SequenceId("foo")
+ sl = header.SequenceLength(42)
+ sn = header.SequenceName(42)
+
+
+ def test_decode(self):
+
+ text = ("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+ "@RG\tID:rg1\tSM:control\n"
+ "@RG\tID:rg2\tSM:condition1\n"
+ "@RG\tID:rg3\tSM:condition1\n"
+ "@PG\tID:_foo_\tPN:ide\n"
+ "@CO\tipsum and so on\n"
+ "@CO\tcitation needed\n")
+
+ header = PacBioBam.BamHeader(text)
+
+ self.assertEqual("1.1", header.Version())
+ self.assertEqual("queryname", header.SortOrder())
+ self.assertEqual("3.0b3", header.PacBioBamVersion())
+
+ self.assertEqual(3, len(header.ReadGroups()))
+ self.assertTrue(header.HasReadGroup("rg1"))
+ self.assertTrue(header.HasReadGroup("rg2"))
+ self.assertTrue(header.HasReadGroup("rg3"))
+ self.assertEqual("control", header.ReadGroup("rg1").Sample())
+ self.assertEqual("condition1", header.ReadGroup("rg2").Sample())
+ self.assertEqual("condition1", header.ReadGroup("rg3").Sample())
+
+ self.assertEqual(2, len(header.Sequences()))
+ self.assertTrue(header.HasSequence("chr1"))
+ self.assertTrue(header.HasSequence("chr2"))
+ self.assertEqual("chocobo", header.Sequence("chr1").Species())
+ self.assertEqual("chocobo", header.Sequence("chr2").Species())
+ self.assertEqual("2038", header.Sequence("chr1").Length())
+ self.assertEqual("3042", header.Sequence("chr2").Length())
+
+ self.assertEqual(1, len(header.Programs()))
+ self.assertTrue(header.HasProgram("_foo_"))
+ self.assertEqual("ide", header.Program("_foo_").Name())
+
+ self.assertEqual(2, len(header.Comments()))
+ self.assertEqual("ipsum and so on", header.Comments()[0])
+ self.assertEqual("citation needed", header.Comments()[1])
+
+ def test_encode(self):
+
+ expectedText = ("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+ "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+ "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@PG\tID:_foo_\tPN:ide\n"
+ "@CO\tipsum and so on\n"
+ "@CO\tcitation needed\n")
+
+ rg1 = PacBioBam.ReadGroupInfo("rg1")
+ rg1.Sample("control")
+ rg2 = PacBioBam.ReadGroupInfo("rg2")
+ rg2.Sample("condition1")
+ rg3 = PacBioBam.ReadGroupInfo("rg3")
+ rg3.Sample("condition1")
+
+ seq1 = PacBioBam.SequenceInfo("chr1")
+ seq1.Length("2038")
+ seq1.Species("chocobo")
+ seq2 = PacBioBam.SequenceInfo("chr2")
+ seq2.Length("3042")
+ seq2.Species("chocobo")
+
+ prog1 = PacBioBam.ProgramInfo("_foo_")
+ prog1.Name("ide")
+
+ header = PacBioBam.BamHeader()
+ header.Version("1.1")
+ header.SortOrder("queryname")
+ header.PacBioBamVersion("3.0b3")
+ header.AddReadGroup(rg1)
+ header.AddReadGroup(rg2)
+ header.AddReadGroup(rg3)
+ header.AddSequence(seq1)
+ header.AddSequence(seq2)
+ header.AddProgram(prog1)
+ header.AddComment("ipsum and so on")
+ header.AddComment("citation needed")
+
+ self.assertEqual(expectedText, header.ToSam())
+
\ No newline at end of file
diff --git a/tests/src/python/test/test_Cigar.py b/tests/src/python/test/test_Cigar.py
new file mode 100755
index 0000000..7b3f1df
--- /dev/null
+++ b/tests/src/python/test/test_Cigar.py
@@ -0,0 +1,214 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class CigarTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_typeToChar()
+ self.test_charToType()
+ self.test_setType()
+ self.test_setChar()
+ self.test_cigarOpCtors()
+ self.test_fromEmptyString()
+ self.test_fromString()
+ self.test_toEmptyString()
+ self.test_toString()
+
+ # ------------ TESTS --------------
+
+ def test_typeToChar(self):
+ self.assertEqual('M', PacBioBam.CigarOperation.TypeToChar(PacBioBam.ALIGNMENT_MATCH))
+ self.assertEqual('I', PacBioBam.CigarOperation.TypeToChar(PacBioBam.INSERTION))
+ self.assertEqual('D', PacBioBam.CigarOperation.TypeToChar(PacBioBam.DELETION))
+ self.assertEqual('N', PacBioBam.CigarOperation.TypeToChar(PacBioBam.REFERENCE_SKIP))
+ self.assertEqual('S', PacBioBam.CigarOperation.TypeToChar(PacBioBam.SOFT_CLIP))
+ self.assertEqual('H', PacBioBam.CigarOperation.TypeToChar(PacBioBam.HARD_CLIP))
+ self.assertEqual('P', PacBioBam.CigarOperation.TypeToChar(PacBioBam.PADDING))
+ self.assertEqual('=', PacBioBam.CigarOperation.TypeToChar(PacBioBam.SEQUENCE_MATCH))
+ self.assertEqual('X', PacBioBam.CigarOperation.TypeToChar(PacBioBam.SEQUENCE_MISMATCH))
+
+ def test_charToType(self):
+ self.assertEqual(PacBioBam.ALIGNMENT_MATCH, PacBioBam.CigarOperation.CharToType('M'))
+ self.assertEqual(PacBioBam.INSERTION, PacBioBam.CigarOperation.CharToType('I'))
+ self.assertEqual(PacBioBam.DELETION, PacBioBam.CigarOperation.CharToType('D'))
+ self.assertEqual(PacBioBam.REFERENCE_SKIP, PacBioBam.CigarOperation.CharToType('N'))
+ self.assertEqual(PacBioBam.SOFT_CLIP, PacBioBam.CigarOperation.CharToType('S'))
+ self.assertEqual(PacBioBam.HARD_CLIP, PacBioBam.CigarOperation.CharToType('H'))
+ self.assertEqual(PacBioBam.PADDING, PacBioBam.CigarOperation.CharToType('P'))
+ self.assertEqual(PacBioBam.SEQUENCE_MATCH, PacBioBam.CigarOperation.CharToType('='))
+ self.assertEqual(PacBioBam.SEQUENCE_MISMATCH, PacBioBam.CigarOperation.CharToType('X'))
+
+ def test_setType(self):
+ m = PacBioBam.CigarOperation()
+ i = PacBioBam.CigarOperation()
+ d = PacBioBam.CigarOperation()
+ n = PacBioBam.CigarOperation()
+ s = PacBioBam.CigarOperation()
+ h = PacBioBam.CigarOperation()
+ p = PacBioBam.CigarOperation()
+ e = PacBioBam.CigarOperation()
+ x = PacBioBam.CigarOperation()
+
+ m.Type(PacBioBam.ALIGNMENT_MATCH)
+ i.Type(PacBioBam.INSERTION)
+ d.Type(PacBioBam.DELETION)
+ n.Type(PacBioBam.REFERENCE_SKIP)
+ s.Type(PacBioBam.SOFT_CLIP)
+ h.Type(PacBioBam.HARD_CLIP)
+ p.Type(PacBioBam.PADDING)
+ e.Type(PacBioBam.SEQUENCE_MATCH)
+ x.Type(PacBioBam.SEQUENCE_MISMATCH)
+
+ self.assertEqual('M', m.Char())
+ self.assertEqual('I', i.Char())
+ self.assertEqual('D', d.Char())
+ self.assertEqual('N', n.Char())
+ self.assertEqual('S', s.Char())
+ self.assertEqual('H', h.Char())
+ self.assertEqual('P', p.Char())
+ self.assertEqual('=', e.Char())
+ self.assertEqual('X', x.Char())
+
+ def test_setChar(self):
+ m = PacBioBam.CigarOperation()
+ i = PacBioBam.CigarOperation()
+ d = PacBioBam.CigarOperation()
+ n = PacBioBam.CigarOperation()
+ s = PacBioBam.CigarOperation()
+ h = PacBioBam.CigarOperation()
+ p = PacBioBam.CigarOperation()
+ e = PacBioBam.CigarOperation()
+ x = PacBioBam.CigarOperation()
+
+ m.Char('M')
+ i.Char('I')
+ d.Char('D')
+ n.Char('N')
+ s.Char('S')
+ h.Char('H')
+ p.Char('P')
+ e.Char('=')
+ x.Char('X')
+
+ self.assertEqual(PacBioBam.ALIGNMENT_MATCH, m.Type())
+ self.assertEqual(PacBioBam.INSERTION, i.Type())
+ self.assertEqual(PacBioBam.DELETION, d.Type())
+ self.assertEqual(PacBioBam.REFERENCE_SKIP, n.Type())
+ self.assertEqual(PacBioBam.SOFT_CLIP, s.Type())
+ self.assertEqual(PacBioBam.HARD_CLIP, h.Type())
+ self.assertEqual(PacBioBam.PADDING, p.Type())
+ self.assertEqual(PacBioBam.SEQUENCE_MATCH, e.Type())
+ self.assertEqual(PacBioBam.SEQUENCE_MISMATCH, x.Type())
+
+ def test_cigarOpCtors(self):
+ c1 = PacBioBam.CigarOperation('S', 10)
+ c2 = PacBioBam.CigarOperation(PacBioBam.SOFT_CLIP, 10)
+
+ self.assertEqual('S', c1.Char())
+ self.assertEqual('S', c2.Char())
+ self.assertEqual(PacBioBam.SOFT_CLIP, c1.Type())
+ self.assertEqual(PacBioBam.SOFT_CLIP, c2.Type())
+ self.assertEqual(10, c1.Length())
+ self.assertEqual(10, c2.Length())
+
+ def test_fromEmptyString(self):
+ s = ""
+ cigar = PacBioBam.Cigar(s)
+ self.assertEqual(0, len(cigar))
+
+ def test_fromString(self):
+ singleCigarString = "100="
+ multiCigarString = "100=2D34I6=6X6="
+
+ singleCigar = PacBioBam.Cigar(singleCigarString)
+ multiCigar = PacBioBam.Cigar(multiCigarString)
+
+ self.assertEqual(1, len(singleCigar))
+ c = singleCigar[0]
+ self.assertEqual('=', c.Char())
+ self.assertEqual(100, c.Length())
+
+ self.assertEqual(6, len(multiCigar))
+ op0 = multiCigar[0]
+ op1 = multiCigar[1]
+ op2 = multiCigar[2]
+ op3 = multiCigar[3]
+ op4 = multiCigar[4]
+ op5 = multiCigar[5]
+
+ self.assertEqual('=', op0.Char())
+ self.assertEqual('D', op1.Char())
+ self.assertEqual('I', op2.Char())
+ self.assertEqual('=', op3.Char())
+ self.assertEqual('X', op4.Char())
+ self.assertEqual('=', op5.Char())
+ self.assertEqual(100, op0.Length())
+ self.assertEqual(2, op1.Length())
+ self.assertEqual(34, op2.Length())
+ self.assertEqual(6, op3.Length())
+ self.assertEqual(6, op4.Length())
+ self.assertEqual(6, op5.Length())
+
+ def test_toEmptyString(self):
+ cigar = PacBioBam.Cigar()
+ self.assertFalse(cigar.ToStdString())
+
+ def test_toString(self):
+
+ singleCigarString = "100="
+ multiCigarString = "100=2D34I6=6X6="
+
+ singleCigar = PacBioBam.Cigar()
+ singleCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH, 100))
+
+ multiCigar = PacBioBam.Cigar()
+ multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH, 100))
+ multiCigar.append(PacBioBam.CigarOperation(PacBioBam.DELETION, 2))
+ multiCigar.append(PacBioBam.CigarOperation(PacBioBam.INSERTION, 34))
+ multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH, 6))
+ multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MISMATCH,6))
+ multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH, 6))
+
+ self.assertEqual(singleCigarString, singleCigar.ToStdString())
+ self.assertEqual(multiCigarString, multiCigar.ToStdString())
+
diff --git a/tests/src/python/test/test_EndToEnd.py b/tests/src/python/test/test_EndToEnd.py
new file mode 100755
index 0000000..8c8bab9
--- /dev/null
+++ b/tests/src/python/test/test_EndToEnd.py
@@ -0,0 +1,89 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+
+import os
+import unittest
+
+class EndToEndTest(unittest.TestCase):
+
+ def originalNames(self):
+ # loop over original file, store names, write to generated file
+ try:
+ file = PacBioBam.BamFile(self.ex2BamFn)
+ writer = PacBioBam.BamWriter(self.generatedBamFn, file.Header())
+
+ dataset = PacBioBam.DataSet(self.ex2BamFn)
+ entireFile = PacBioBam.EntireFileQuery(dataset)
+
+ names_in = []
+ for record in PacBioBam.Iterate(entireFile):
+ names_in.append(record.FullName())
+ writer.Write(record)
+ return names_in
+
+ except RuntimeError:
+ self.assertTrue(False) # should not throw
+
+ def generatedNames(self):
+ try:
+ # open dataset on generated BAM file, read in names
+ dataset = PacBioBam.DataSet(self.generatedBamFn)
+ entireFile = PacBioBam.EntireFileQuery(dataset)
+ names_out = []
+ for record in PacBioBam.Iterate(entireFile):
+ names_out.append(record.FullName())
+ return names_out
+
+ except RuntimeError:
+ self.assertTrue(False) # should not throw
+
+ def runTest(self):
+
+ self.testData = config.TestData()
+ self.ex2BamFn = self.testData.directory + "/ex2.bam"
+ self.generatedBamFn = self.testData.directory + "/generated.bam"
+
+ # compare input records to generated copy's records
+ names_in = self.originalNames()
+ names_out = self.generatedNames()
+ self.assertEqual(names_in, names_out)
+
+ # clean up
+ os.remove(self.generatedBamFn)
diff --git a/tests/src/python/test/test_Frames.py b/tests/src/python/test/test_Frames.py
new file mode 100755
index 0000000..7855bbb
--- /dev/null
+++ b/tests/src/python/test/test_Frames.py
@@ -0,0 +1,95 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class FramesTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def setUp(self):
+ self.testframes = [
+ 0, 8, 140, 0, 0, 7, 4, 0, 85, 2,
+ 1, 3, 2, 10, 1, 20, 47, 10, 9, 60,
+ 20, 3, 12, 5, 13, 165, 6, 14, 22, 12,
+ 2, 4, 9, 218, 27, 3, 15, 2, 17, 2,
+ 45, 24, 89, 10, 7, 1, 11, 15, 0, 7,
+ 0, 28, 17, 12, 6, 10, 37, 0, 12, 52,
+ 0, 7, 1, 14, 3, 26, 12, 0, 20, 17,
+ 2, 13, 2, 9, 13, 7, 15, 29, 3, 6,
+ 2, 1, 28, 10, 3, 14, 7, 1, 22, 1,
+ 6, 6, 0, 19, 31, 6, 2, 14, 0, 0,
+ 1000, 947, 948
+ ]
+
+ self.encoded = [
+ 0, 8, 102, 0, 0, 7, 4, 0, 75, 2, 1, 3, 2,
+ 10, 1, 20, 47, 10, 9, 60, 20, 3, 12, 5, 13, 115,
+ 6, 14, 22, 12, 2, 4, 9, 135, 27, 3, 15, 2, 17,
+ 2, 45, 24, 77, 10, 7, 1, 11, 15, 0, 7, 0, 28,
+ 17, 12, 6, 10, 37, 0, 12, 52, 0, 7, 1, 14, 3,
+ 26, 12, 0, 20, 17, 2, 13, 2, 9, 13, 7, 15, 29,
+ 3, 6, 2, 1, 28, 10, 3, 14, 7, 1, 22, 1, 6,
+ 6, 0, 19, 31, 6, 2, 14, 0, 0,
+ 255, 254, 255
+ ]
+
+ def runTest(self):
+ self.test_ctors()
+ self.test_encode()
+
+ # ------------ TESTS --------------
+
+ def test_ctors(self):
+ f = PacBioBam.Frames()
+ self.assertEqual(0, len(f.Data()))
+
+ f2 = PacBioBam.Frames(self.testframes)
+ d = f2.Data()
+ self.assertEqual(len(self.testframes), len(d))
+ for i, v in enumerate(d):
+ self.assertEqual(int(self.testframes[i]), int(v))
+
+ def test_encode(self):
+ f = PacBioBam.Frames(self.testframes)
+ e = f.Encode()
+ self.assertEqual(len(self.encoded), len(e))
+ for i, v in enumerate(e):
+ self.assertEqual(int(self.encoded[i]), int(v))
+
\ No newline at end of file
diff --git a/tests/src/python/test/test_Intervals.py b/tests/src/python/test/test_Intervals.py
new file mode 100755
index 0000000..9e484eb
--- /dev/null
+++ b/tests/src/python/test/test_Intervals.py
@@ -0,0 +1,348 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class IntervalsTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_unmappedPosition()
+ self.test_ctors()
+ self.test_equality()
+ self.test_copy()
+ self.test_modifiers()
+ self.test_cover()
+ self.test_intersect()
+ self.test_validity()
+ self.test_length()
+
+ # ------------ TESTS --------------
+
+ def test_unmappedPosition(self):
+ self.assertEqual(-1, PacBioBam.UnmappedPosition)
+
+ def test_ctors(self):
+ empty = PacBioBam.PositionInterval()
+ single = PacBioBam.PositionInterval(4)
+ normal = PacBioBam.PositionInterval(5, 8)
+
+ self.assertEqual(0, empty.Start())
+ self.assertEqual(0, empty.Stop())
+ self.assertEqual(4, single.Start())
+ self.assertEqual(5, single.Stop())
+ self.assertEqual(5, normal.Start())
+ self.assertEqual(8, normal.Stop())
+
+ def test_equality(self):
+
+ empty = PacBioBam.PositionInterval()
+ empty2 = PacBioBam.PositionInterval()
+ singleton = PacBioBam.PositionInterval(4)
+ sameAsSingleton = PacBioBam.PositionInterval(4, 5)
+ normal = PacBioBam.PositionInterval(5, 8)
+ sameAsNormal = PacBioBam.PositionInterval(5, 8)
+ different = PacBioBam.PositionInterval(20, 40)
+
+ # self-equality
+ self.assertEqual(empty, empty)
+ self.assertEqual(singleton, singleton)
+ self.assertEqual(normal, normal)
+ self.assertEqual(different, different)
+
+ # same values
+ self.assertEqual(empty, empty2)
+ self.assertEqual(singleton, sameAsSingleton)
+ self.assertEqual(normal, sameAsNormal)
+
+ # different values
+ self.assertNotEqual(empty, singleton)
+ self.assertNotEqual(empty, normal)
+ self.assertNotEqual(empty, different)
+ self.assertNotEqual(singleton, normal)
+ self.assertNotEqual(normal, different)
+
+ def test_copy(self):
+ interval1 = PacBioBam.PositionInterval(5,8)
+ interval2 = PacBioBam.PositionInterval(interval1)
+ interval3 = interval1
+
+ self.assertEqual(interval1, interval1)
+ self.assertEqual(interval1, interval2)
+ self.assertEqual(interval1, interval3)
+
+ def test_modifiers(self):
+
+ interval1 = PacBioBam.PositionInterval(5,8)
+ interval2 = PacBioBam.PositionInterval(interval1)
+ interval2.Start(2)
+ interval2.Stop(10)
+
+ self.assertNotEqual(interval1, interval2)
+ self.assertEqual(2, interval2.Start())
+ self.assertEqual(10, interval2.Stop())
+
+ def test_cover(self):
+
+ a = PacBioBam.PositionInterval(2,4)
+ b = PacBioBam.PositionInterval(3,5)
+ c = PacBioBam.PositionInterval(6,8)
+ d = PacBioBam.PositionInterval(1,7)
+ e = PacBioBam.PositionInterval(5,8)
+
+ # 0123456789
+ # a --
+ # b --
+ # c --
+ # d ------
+ # e ---
+
+ # self-cover
+ self.assertTrue(a.Covers(a))
+ self.assertTrue(a.CoveredBy(a))
+
+ # basic covers/covered
+ self.assertTrue(b.CoveredBy(d))
+ self.assertTrue(d.Covers(b))
+ self.assertNotEqual(b, d)
+ self.assertFalse(b.Covers(d))
+
+ # completely disjoint
+ self.assertFalse(b.Covers(c))
+ self.assertFalse(c.Covers(b))
+ self.assertFalse(b.CoveredBy(c))
+ self.assertFalse(c.CoveredBy(b))
+
+ # b.stop == e.start
+ self.assertFalse(b.Covers(e))
+ self.assertFalse(b.CoveredBy(e))
+
+ # shared endpoint, start contained
+ self.assertTrue(e.Covers(c))
+ self.assertTrue(c.CoveredBy(e))
+
+ def test_intersect(self):
+
+ a = PacBioBam.PositionInterval(2,4)
+ b = PacBioBam.PositionInterval(3,5)
+ c = PacBioBam.PositionInterval(6,8)
+ d = PacBioBam.PositionInterval(1,7)
+ e = PacBioBam.PositionInterval(5,8)
+
+ # 0123456789
+ # a --
+ # b --
+ # c --
+ # d ------
+ # e ---
+
+ # self-intersection
+ self.assertTrue(a.Intersects(a))
+
+ # intersection is commutative
+ self.assertTrue(a.Intersects(b))
+ self.assertTrue(b.Intersects(a))
+
+ # covered implies intersection
+ self.assertTrue(d.Covers(a))
+ self.assertTrue(a.Intersects(d))
+ self.assertTrue(d.Intersects(a))
+
+ # c.start > b.stop (obvious disjoint)
+ self.assertFalse(b.Intersects(c))
+
+ # b.stop == e.start (intervals are right-open, so disjoint)
+ self.assertFalse(b.Intersects(e))
+
+ def test_validity(self):
+
+ a = PacBioBam.PositionInterval() # default ctor
+ b = PacBioBam.PositionInterval(0,0) # start == stop (zero)
+ c = PacBioBam.PositionInterval(4,4) # start == stop (nonzero)
+ d = PacBioBam.PositionInterval(0,1) # start < stop (start is zero)
+ e = PacBioBam.PositionInterval(4,5) # start < stop (start is nonzero)
+ f = PacBioBam.PositionInterval(5,4) # start > stop
+
+ self.assertFalse(a.IsValid())
+ self.assertFalse(b.IsValid())
+ self.assertFalse(c.IsValid())
+ self.assertTrue(d.IsValid())
+ self.assertTrue(e.IsValid())
+ self.assertFalse(f.IsValid())
+
+ def test_length(self):
+
+ a = PacBioBam.PositionInterval(2,4)
+ b = PacBioBam.PositionInterval(3,5)
+ c = PacBioBam.PositionInterval(6,8)
+ d = PacBioBam.PositionInterval(1,7)
+ e = PacBioBam.PositionInterval(5,8)
+
+ self.assertEqual(2, a.Length())
+ self.assertEqual(2, b.Length())
+ self.assertEqual(2, c.Length())
+ self.assertEqual(6, d.Length())
+ self.assertEqual(3, e.Length())
+
+class GenomicIntervalsTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_ctors()
+ self.test_copy()
+ self.test_modifiers()
+ self.test_cover()
+ self.test_validity()
+
+ # ------------ TESTS --------------
+
+ def test_ctors(self):
+
+ empty = PacBioBam.GenomicInterval()
+ normal = PacBioBam.GenomicInterval("foo", 100, 200)
+
+ self.assertEqual("", empty.Name())
+ self.assertEqual(0, empty.Start())
+ self.assertEqual(0, empty.Stop())
+
+ self.assertEqual("foo", normal.Name())
+ self.assertEqual(100, normal.Start())
+ self.assertEqual(200, normal.Stop())
+
+
+ def test_copy(self):
+
+ a = PacBioBam.GenomicInterval("foo", 10, 20)
+ b = PacBioBam.GenomicInterval(a)
+ c = a
+
+ self.assertEqual(a, a)
+ self.assertEqual(a, b)
+ self.assertEqual(a, c)
+
+ def test_modifiers(self):
+
+ a = PacBioBam.GenomicInterval("foo", 10, 20)
+
+ b = PacBioBam.GenomicInterval(a)
+ b.Name("bar").Start(2).Stop(10)
+
+ c = PacBioBam.GenomicInterval(a)
+ c.Interval(b.Interval())
+
+ self.assertNotEqual(a, b)
+ self.assertEqual("bar", b.Name())
+ self.assertEqual(2, b.Start())
+ self.assertEqual(10, b.Stop())
+ self.assertEqual(a.Name(), c.Name())
+ self.assertEqual(b.Interval(), c.Interval())
+
+ def test_cover(self):
+
+ a = PacBioBam.GenomicInterval("foo",2,4)
+ b = PacBioBam.GenomicInterval("foo",3,5)
+ c = PacBioBam.GenomicInterval("foo",6,8)
+ d = PacBioBam.GenomicInterval("foo",1,7)
+ e = PacBioBam.GenomicInterval("foo",5,8)
+ f = PacBioBam.GenomicInterval("bar",3,5) # same as b, different ref
+
+ # 0123456789
+ # a --
+ # b --
+ # c --
+ # d ------
+ # e ---
+
+ # self-cover
+ self.assertTrue(a.Covers(a))
+ self.assertTrue(a.CoveredBy(a))
+
+ # basic covers/covered
+ self.assertTrue(b.CoveredBy(d))
+ self.assertTrue(d.Covers(b))
+ self.assertNotEqual(b, d)
+ self.assertFalse(b.Covers(d))
+
+ # same coords as b, but different ref
+ self.assertFalse(f.CoveredBy(d))
+ self.assertFalse(d.Covers(f))
+ self.assertNotEqual(f, d)
+ self.assertFalse(f.Covers(d))
+
+ # obvious disjoint
+ self.assertFalse(b.Covers(c))
+ self.assertFalse(c.Covers(b))
+ self.assertFalse(b.CoveredBy(c))
+ self.assertFalse(c.CoveredBy(b))
+
+ # b.stop == e.start (intervals are right-open, so disjoint)
+ self.assertFalse(b.Covers(e))
+ self.assertFalse(b.CoveredBy(e))
+
+ # shared endpoint, start contained
+ self.assertTrue(e.Covers(c))
+ self.assertTrue(c.CoveredBy(e))
+
+ def test_validity(self):
+
+ a = PacBioBam.GenomicInterval() # default
+ b = PacBioBam.GenomicInterval("foo",0,0) # valid id, start == stop (zero)
+ c = PacBioBam.GenomicInterval("foo",4,4) # valid id, start == stop (non-zero)
+ d = PacBioBam.GenomicInterval("foo",0,1) # valid id, start < stop (start == zero) OK
+ e = PacBioBam.GenomicInterval("foo",4,5) # valid id, start < stop (start > zero) OK
+ f = PacBioBam.GenomicInterval("foo",5,4) # valid id, start > stop
+ g = PacBioBam.GenomicInterval("",0,0) # invalid id, start == stop (zero)
+ h = PacBioBam.GenomicInterval("",4,4) # invalid id, start == stop (non-zero)
+ i = PacBioBam.GenomicInterval("",0,1) # invalid id, start < stop (start == zero)
+ j = PacBioBam.GenomicInterval("",4,5) # invalid id, start < stop (start > zero)
+ k = PacBioBam.GenomicInterval("",5,4) # invalid id, start > stop
+
+ self.assertTrue(d.IsValid())
+ self.assertTrue(e.IsValid())
+ self.assertFalse(a.IsValid())
+ self.assertFalse(b.IsValid())
+ self.assertFalse(c.IsValid())
+ self.assertFalse(f.IsValid())
+ self.assertFalse(g.IsValid())
+ self.assertFalse(h.IsValid())
+ self.assertFalse(i.IsValid())
+ self.assertFalse(j.IsValid())
+ self.assertFalse(k.IsValid())
diff --git a/tests/src/python/test/test_QualityValues.py b/tests/src/python/test/test_QualityValues.py
new file mode 100755
index 0000000..41bf8c3
--- /dev/null
+++ b/tests/src/python/test/test_QualityValues.py
@@ -0,0 +1,131 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config
+import unittest
+
+class QualityValueTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_defaults()
+ self.test_fromNumber()
+ self.test_fromFastq()
+
+ # ------------ TESTS --------------
+
+ def test_defaults(self):
+ value = PacBioBam.QualityValue()
+ self.assertEqual(0, int(value))
+ self.assertEqual('!', value.Fastq())
+
+ def test_fromNumber(self):
+
+ zero = PacBioBam.QualityValue(0)
+ thirtythree = PacBioBam.QualityValue(33)
+ normal = PacBioBam.QualityValue(42)
+ maxQV = PacBioBam.QualityValue(93)
+ tooHigh = PacBioBam.QualityValue(94)
+ max8bit = PacBioBam.QualityValue(126)
+
+ self.assertEqual(0, int(zero))
+ self.assertEqual(33, int(thirtythree))
+ self.assertEqual(42, int(normal))
+ self.assertEqual(93, int(maxQV))
+ self.assertEqual(93, int(tooHigh))
+ self.assertEqual(93, int(max8bit))
+
+ self.assertEqual('!', zero.Fastq())
+ self.assertEqual('B', thirtythree.Fastq())
+ self.assertEqual('K', normal.Fastq())
+ self.assertEqual('~', maxQV.Fastq())
+ self.assertEqual('~', tooHigh.Fastq())
+ self.assertEqual('~', max8bit.Fastq())
+
+ def test_fromFastq(self):
+
+ zero = PacBioBam.QualityValue.FromFastq('!')
+ thirtythree = PacBioBam.QualityValue.FromFastq('B')
+ normal = PacBioBam.QualityValue.FromFastq('K')
+ maxQV = PacBioBam.QualityValue.FromFastq('~')
+
+ self.assertEqual(0, int(zero))
+ self.assertEqual(33, int(thirtythree))
+ self.assertEqual(42, int(normal))
+ self.assertEqual(93, int(maxQV))
+
+class QualityValuesTest(unittest.TestCase):
+
+ # ------------ SETUP --------------
+
+ def runTest(self):
+ self.test_defaults()
+ self.test_fromNumbers()
+ self.test_fromFastq()
+
+ # ------------ TESTS --------------
+
+ def test_defaults(self):
+ values = PacBioBam.QualityValues()
+ self.assertFalse(values.Fastq())
+
+ def test_fromNumbers(self):
+
+ fastqString = "~~~KKBB!!"
+ values = [ 93, 93, 93, 42, 42, 33, 33, 0, 0 ]
+
+ qvs = PacBioBam.QualityValues()
+ for value in values:
+ qvs.append(PacBioBam.QualityValue(value))
+
+ self.assertEqual(fastqString, qvs.Fastq())
+
+ def test_fromFastq(self):
+
+ fastqString = "~~~KKBB!!"
+ values = [ 93, 93, 93, 42, 42, 33, 33, 0, 0 ]
+
+ qvs = PacBioBam.QualityValues.FromFastq(fastqString)
+
+ self.assertEqual(len(fastqString), len(qvs))
+ self.assertEqual(len(values), len(qvs))
+
+ for i, v in enumerate(values):
+ self.assertEqual(v, int(qvs[i]))
+
\ No newline at end of file
diff --git a/tests/src/python/test_pbbam.py b/tests/src/python/test_pbbam.py
new file mode 100755
index 0000000..8ca3c90
--- /dev/null
+++ b/tests/src/python/test_pbbam.py
@@ -0,0 +1,48 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# * Neither the name of Pacific Biosciences nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Derek Barnett
+
+import sys
+import unittest
+
+if __name__ == "__main__":
+ suite = unittest.TestLoader().discover('.', pattern = "test_*.py")
+ result = unittest.TextTestRunner(verbosity=2).run(suite)
+ if result.wasSuccessful():
+ sys.exit(0)
+ else:
+ sys.exit(1)
+
\ No newline at end of file
diff --git a/tests/src/test_Accuracy.cpp b/tests/src/test_Accuracy.cpp
new file mode 100644
index 0000000..17d1f59
--- /dev/null
+++ b/tests/src/test_Accuracy.cpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/Accuracy.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(AccuracyTest, ClampValues)
+{
+ Accuracy a_zero(0);
+ Accuracy a_neg(-1);
+ Accuracy a_min(0);
+ Accuracy a_normal(300);
+ Accuracy a_max(1000);
+ Accuracy a_tooLarge(2000);
+
+ EXPECT_EQ(0, a_zero);
+ EXPECT_EQ(0, a_neg);
+ EXPECT_EQ(0, a_min);
+ EXPECT_EQ(300, a_normal);
+ EXPECT_EQ(1000, a_max);
+ EXPECT_EQ(1000, a_tooLarge);
+}
diff --git a/tests/src/test_AlignmentPrinter.cpp b/tests/src/test_AlignmentPrinter.cpp
new file mode 100644
index 0000000..0034f2d
--- /dev/null
+++ b/tests/src/test_AlignmentPrinter.cpp
@@ -0,0 +1,102 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+
+#include "pbbam/AlignmentPrinter.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/IndexedFastaReader.h"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string lambdaFasta = tests::Data_Dir + "/lambdaNEB.fa";
+const string singleInsertionBam = tests::Data_Dir + "/aligned.bam";
+
+TEST(AlignmentPrinterTest, Print)
+{
+ IndexedFastaReader r(lambdaFasta);
+
+ BamFile bamFile(singleInsertionBam);
+ EntireFileQuery bamQuery(bamFile);
+
+ auto it = bamQuery.begin();
+
+
+ // std::cerr << record.AlignedStart() << std::endl;
+ // std::cerr << record.Sequence(Orientation::GENOMIC, true) << std::endl;
+ // std::cerr << record.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+
+ AlignmentPrinter pretty(r);
+
+ // std::string expected =
+ // "Read : singleInsertion2\n"
+ // "Reference : lambda_NEB3011\n"
+ // "\n"
+ // "Read-length : 49\n"
+ // "Concordance : 0.96\n"
+ // "\n"
+ // " GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT\n"
+ // " |||||||| ||||||||||||||||||| |||||||||||||||||||||\n"
+ // " GGCTGCAG-GTACAGCGGTCAGGAGGCCAATTGATGCCGGACTGGCTGAT\n";
+ // EXPECT_EQ(expected, pretty.Print(record, Orientation::NATIVE));
+
+ auto record = *it++;
+ std::cerr << pretty.Print(record, Orientation::GENOMIC);
+ std::cerr << std::endl << std::endl;
+ record = *it++;
+ std::cerr << pretty.Print(record, Orientation::GENOMIC);
+ std::cerr << std::endl << std::endl;
+ record = *it++;
+ std::cerr << pretty.Print(record, Orientation::GENOMIC);
+ std::cerr << std::endl << std::endl;
+ record = *it++;
+ std::cerr << pretty.Print(record, Orientation::GENOMIC);
+ std::cerr << std::endl << std::endl;
+}
diff --git a/tests/src/test_BamFile.cpp b/tests/src/test_BamFile.cpp
new file mode 100644
index 0000000..4ca910d
--- /dev/null
+++ b/tests/src/test_BamFile.cpp
@@ -0,0 +1,69 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/BamFile.h>
+#include <stdexcept>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(BamFileTest, NonExistentFileThrows)
+{
+ EXPECT_THROW(
+ {
+ BamFile file("does_not_exist.bam");
+ (void)file;
+ },
+ std::exception);
+}
+
+TEST(BamFileTest, NonBamFileThrows)
+{
+ EXPECT_THROW(
+ {
+ const std::string& fn = tests::Data_Dir + "/lambdaNEB.fa.fai";
+ BamFile file(fn);
+ (void)file;
+ },
+ std::exception);
+}
diff --git a/tests/src/test_BamHeader.cpp b/tests/src/test_BamHeader.cpp
new file mode 100644
index 0000000..c4f872a
--- /dev/null
+++ b/tests/src/test_BamHeader.cpp
@@ -0,0 +1,281 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <htslib/sam.h>
+#include <pbbam/BamHeader.h>
+#include <iostream>
+#include <string>
+#include <utility>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+struct BamHdrDeleter
+{
+ void operator()(bam_hdr_t* hdr) {
+ if (hdr)
+ bam_hdr_destroy(hdr);
+ hdr = nullptr;
+ }
+};
+
+} // namespace tests
+
+TEST(BamHeaderTest, DefaultConstruction)
+{
+ BamHeader header;
+ EXPECT_TRUE(header.Version().empty());
+ EXPECT_TRUE(header.SortOrder().empty()); // default to unknown ?
+ EXPECT_TRUE(header.ReadGroups().empty());
+ EXPECT_TRUE(header.Sequences().empty());
+ EXPECT_TRUE(header.Programs().empty());
+ EXPECT_TRUE(header.Comments().empty());
+
+ EXPECT_THROW(header.Program("foo"), std::exception);
+ EXPECT_THROW(header.ReadGroup("foo"), std::exception);
+ EXPECT_THROW(header.SequenceId("foo"), std::exception);
+ EXPECT_THROW(header.SequenceLength(42), std::exception);
+ EXPECT_THROW(header.SequenceName(42), std::exception);
+}
+
+TEST(BamHeaderTest, DecodeTest)
+{
+ const string& text = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+ "@RG\tID:rg1\tSM:control\n"
+ "@RG\tID:rg2\tSM:condition1\n"
+ "@RG\tID:rg3\tSM:condition1\n"
+ "@PG\tID:_foo_\tPN:ide\n"
+ "@CO\tipsum and so on\n"
+ "@CO\tcitation needed\n";
+
+ BamHeader header = BamHeader(text);
+
+ EXPECT_EQ(string("1.1"), header.Version());
+ EXPECT_EQ(string("queryname"), header.SortOrder());
+ EXPECT_EQ(string("3.0b3"), header.PacBioBamVersion());
+
+ EXPECT_EQ(3, header.ReadGroups().size());
+ EXPECT_TRUE(header.HasReadGroup("rg1"));
+ EXPECT_TRUE(header.HasReadGroup("rg2"));
+ EXPECT_TRUE(header.HasReadGroup("rg3"));
+
+ EXPECT_EQ(string("control"), header.ReadGroup("rg1").Sample());
+ EXPECT_EQ(string("condition1"), header.ReadGroup("rg2").Sample());
+ EXPECT_EQ(string("condition1"), header.ReadGroup("rg3").Sample());
+
+ EXPECT_EQ(2, header.Sequences().size());
+ EXPECT_TRUE(header.HasSequence("chr1"));
+ EXPECT_TRUE(header.HasSequence("chr2"));
+ EXPECT_EQ(string("chocobo"), header.Sequence("chr1").Species());
+ EXPECT_EQ(string("chocobo"), header.Sequence("chr2").Species());
+ EXPECT_EQ(string("2038"), header.Sequence("chr1").Length());
+ EXPECT_EQ(string("3042"), header.Sequence("chr2").Length());
+
+ EXPECT_EQ(1, header.Programs().size());
+ EXPECT_TRUE(header.HasProgram("_foo_"));
+ EXPECT_EQ(string("ide"), header.Program("_foo_").Name());
+
+ EXPECT_EQ(2, header.Comments().size());
+ EXPECT_EQ(string("ipsum and so on"), header.Comments().at(0));
+ EXPECT_EQ(string("citation needed"), header.Comments().at(1));
+}
+
+TEST(BamHeaderCodecTest, EncodeTest)
+{
+ ReadGroupInfo rg1("rg1");
+ rg1.Sample("control");
+ ReadGroupInfo rg2("rg2");
+ rg2.Sample("condition1");
+ ReadGroupInfo rg3("rg3");
+ rg3.Sample("condition1");
+
+ SequenceInfo seq1("chr1");
+ seq1.Length("2038").Species("chocobo");
+ SequenceInfo seq2("chr2");
+ seq2.Length("3042").Species("chocobo");
+
+ ProgramInfo prog1("_foo_");
+ prog1.Name("ide");
+
+ BamHeader header;
+ header.Version("1.1")
+ .SortOrder("queryname")
+ .PacBioBamVersion("3.0b3")
+ .AddReadGroup(rg1)
+ .AddReadGroup(rg2)
+ .AddReadGroup(rg3)
+ .AddSequence(seq1)
+ .AddSequence(seq2)
+ .AddProgram(prog1)
+ .AddComment("ipsum and so on")
+ .AddComment("citation needed");
+
+ const string& expectedText = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+ "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+ "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@PG\tID:_foo_\tPN:ide\n"
+ "@CO\tipsum and so on\n"
+ "@CO\tcitation needed\n";
+
+ const string& text = header.ToSam();
+ EXPECT_EQ(expectedText, text);
+}
+
+TEST(BamHeaderTest, ConvertToRawDataOk)
+{
+ ReadGroupInfo rg1("rg1");
+ rg1.Sample("control");
+ ReadGroupInfo rg2("rg2");
+ rg2.Sample("condition1");
+ ReadGroupInfo rg3("rg3");
+ rg3.Sample("condition1");
+
+ SequenceInfo seq1("chr1");
+ seq1.Length("2038").Species("chocobo");
+ SequenceInfo seq2("chr2");
+ seq2.Length("3042").Species("chocobo");
+
+ ProgramInfo prog1("_foo_");
+ prog1.Name("ide");
+
+ BamHeader header;
+ header.Version("1.1")
+ .SortOrder("queryname")
+ .PacBioBamVersion("3.0b3")
+ .AddReadGroup(rg1)
+ .AddReadGroup(rg2)
+ .AddReadGroup(rg3)
+ .AddSequence(seq1)
+ .AddSequence(seq2)
+ .AddProgram(prog1)
+ .AddComment("ipsum and so on")
+ .AddComment("citation needed");
+
+ const string& expectedText = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+ "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+ "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@PG\tID:_foo_\tPN:ide\n"
+ "@CO\tipsum and so on\n"
+ "@CO\tcitation needed\n";
+
+
+ const string& text = header.ToSam();
+ PBBAM_SHARED_PTR<bam_hdr_t> rawData(sam_hdr_parse(text.size(), text.c_str()), tests::BamHdrDeleter());
+ rawData->ignore_sam_err = 0;
+ rawData->cigar_tab = NULL;
+ rawData->l_text = text.size();
+ rawData->text = (char*)calloc(rawData->l_text + 1, 1);
+ memcpy(rawData->text, text.c_str(), rawData->l_text);
+
+ const string& rawText = string(rawData->text, rawData->l_text);
+ EXPECT_EQ(expectedText, rawText);
+}
+
+TEST(BamHeaderTest, ExtractFromRawDataOk)
+{
+ ReadGroupInfo rg1("rg1");
+ rg1.Sample("control");
+ ReadGroupInfo rg2("rg2");
+ rg2.Sample("condition1");
+ ReadGroupInfo rg3("rg3");
+ rg3.Sample("condition1");
+
+ SequenceInfo seq1("chr1");
+ seq1.Length("2038").Species("chocobo");
+ SequenceInfo seq2("chr2");
+ seq2.Length("3042").Species("chocobo");
+
+ ProgramInfo prog1("_foo_");
+ prog1.Name("ide");
+
+ BamHeader header;
+ header.Version("1.1")
+ .SortOrder("queryname")
+ .PacBioBamVersion("3.0b3")
+ .AddReadGroup(rg1)
+ .AddReadGroup(rg2)
+ .AddReadGroup(rg3)
+ .AddSequence(seq1)
+ .AddSequence(seq2)
+ .AddProgram(prog1)
+ .AddComment("ipsum and so on")
+ .AddComment("citation needed");
+
+ const string& expectedText = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+ "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+ "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+ "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+ "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+ "@PG\tID:_foo_\tPN:ide\n"
+ "@CO\tipsum and so on\n"
+ "@CO\tcitation needed\n";
+
+
+ string text = header.ToSam();
+ PBBAM_SHARED_PTR<bam_hdr_t> rawData(sam_hdr_parse(text.size(), text.c_str()), tests::BamHdrDeleter());
+ rawData->ignore_sam_err = 0;
+ rawData->cigar_tab = NULL;
+ rawData->l_text = text.size();
+ rawData->text = (char*)calloc(rawData->l_text + 1, 1);
+ memcpy(rawData->text, text.c_str(), rawData->l_text);
+
+ const BamHeader newHeader = BamHeader(string(rawData->text, rawData->l_text));
+
+ EXPECT_EQ(header.Version(), newHeader.Version());
+ EXPECT_EQ(header.SortOrder(), newHeader.SortOrder());
+ EXPECT_EQ(header.PacBioBamVersion(), newHeader.PacBioBamVersion());
+
+ text = newHeader.ToSam();
+ EXPECT_EQ(expectedText, text);
+}
diff --git a/tests/src/test_BamRecord.cpp b/tests/src/test_BamRecord.cpp
new file mode 100644
index 0000000..e32ad2e
--- /dev/null
+++ b/tests/src/test_BamRecord.cpp
@@ -0,0 +1,1993 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamTagCodec.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+static
+BamRecordImpl CreateBamImpl(void)
+{
+ BamRecordImpl bam;
+ bam.Bin(42);
+ bam.Flag(42);
+ bam.InsertSize(42);
+ bam.MapQuality(42);
+ bam.MatePosition(42);
+ bam.MateReferenceId(42);
+ bam.Position(42);
+ bam.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam.Tags(tags);
+
+ return bam;
+}
+
+static
+BamRecord CreateBam(void)
+{
+ BamRecord bam;
+ bam.impl_ = CreateBamImpl();
+ return bam;
+}
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+ // ensure raw data (lengths at least) matches API-facing data
+
+ const uint32_t expectedNameLength = bam.Name().size() + 1;
+ const uint32_t expectedNumCigarOps = bam.CigarData().size();
+ const int32_t expectedSeqLength = bam.Sequence().length();
+ const size_t expectedTagsLength = BamTagCodec::Encode(bam.Tags()).size();
+
+ // Name CIGAR Sequence Quals Tags
+ // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + << TAGS >>
+
+ const int expectedTotalDataLength = expectedNameLength +
+ (expectedNumCigarOps * 4) +
+ (expectedSeqLength+1)/2 +
+ expectedSeqLength +
+ expectedTagsLength;
+
+ EXPECT_TRUE((bool)bam.d_);
+ EXPECT_EQ(expectedNameLength, bam.d_->core.l_qname);
+ EXPECT_EQ(expectedNumCigarOps, bam.d_->core.n_cigar);
+ EXPECT_EQ(expectedSeqLength, bam.d_->core.l_qseq);
+ EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+static
+void CheckRawData(const BamRecord& bam)
+{ CheckRawData(bam.impl_); }
+
+static
+BamRecordImpl MakeCigaredImpl(const string& seq,
+ const string& cigar,
+ const bool isReverseStrand)
+{
+ BamRecordImpl impl;
+ impl.SetMapped(true).ReferenceId(0).Position(0).MapQuality(0);
+ impl.CigarData(Cigar::FromStdString(cigar));
+ impl.MateReferenceId(-1).MatePosition(-1).InsertSize(0);
+ impl.SetSequenceAndQualities(seq, string(seq.size(), '*'));
+ impl.SetReverseStrand(isReverseStrand);
+ return impl;
+}
+
+static
+BamRecord MakeCigaredRecord(const string& seq,
+ const string& cigar,
+ const bool isReverseStrand)
+{
+ const BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+ return BamRecord(std::move(impl));
+}
+
+static
+BamRecord MakeCigaredBaseRecord(const string& bases,
+ const string& cigar,
+ const bool isReverseStrand)
+{
+ const string seq = string(bases.size(), 'N');
+ BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+
+ TagCollection tags;
+ tags["dt"] = bases;
+ tags["st"] = bases;
+ impl.Tags(tags);
+
+ return BamRecord(std::move(impl));
+}
+
+static
+BamRecord MakeCigaredFrameRecord(const vector<uint16_t>& frames,
+ const string& cigar,
+ const bool isReverseStrand)
+{
+ const string seq = string(frames.size(), 'N');
+ BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+
+ TagCollection tags;
+ tags["ip"] = frames;
+ tags["pw"] = frames;
+ impl.Tags(tags);
+
+ return BamRecord(std::move(impl));
+}
+
+static
+BamRecord MakeCigaredQualRecord(const string& quals,
+ const string& cigar,
+ const bool isReverseStrand)
+{
+ const string seq = string(quals.size(), 'N');
+ BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+
+ TagCollection tags;
+ tags["dq"] = quals;
+ tags["iq"] = quals;
+ tags["mq"] = quals;
+ tags["sq"] = quals;
+ impl.Tags(tags);
+
+ return BamRecord(std::move(impl));
+}
+
+} // namespace tests
+
+TEST(BamRecordTest, DefaultValues)
+{
+ BamRecord bam;
+ const string emptyString;
+
+ // BamRecordImpl data
+ EXPECT_EQ(0, bam.impl_.Bin());
+ EXPECT_EQ(BamRecordImpl::UNMAPPED, bam.impl_.Flag()); // forced init unmapped
+ EXPECT_EQ(0, bam.impl_.InsertSize());
+ EXPECT_EQ(255, bam.impl_.MapQuality());
+ EXPECT_EQ(-1, bam.impl_.MateReferenceId());
+ EXPECT_EQ(-1, bam.impl_.MatePosition());
+ EXPECT_EQ(-1, bam.impl_.Position());
+ EXPECT_EQ(-1, bam.impl_.ReferenceId());
+ EXPECT_EQ(0, bam.impl_.Tags().size());
+
+ EXPECT_FALSE(bam.impl_.IsDuplicate());
+ EXPECT_FALSE(bam.impl_.IsFailedQC());
+ EXPECT_FALSE(bam.impl_.IsFirstMate());
+ EXPECT_FALSE(bam.impl_.IsMapped()); // forced init unmapped
+ EXPECT_TRUE(bam.impl_.IsMateMapped());
+ EXPECT_FALSE(bam.impl_.IsMateReverseStrand());
+ EXPECT_FALSE(bam.impl_.IsPaired());
+ EXPECT_TRUE(bam.impl_.IsPrimaryAlignment());
+ EXPECT_FALSE(bam.impl_.IsProperPair());
+ EXPECT_FALSE(bam.impl_.IsReverseStrand());
+ EXPECT_FALSE(bam.impl_.IsSecondMate());
+ EXPECT_FALSE(bam.impl_.IsSupplementaryAlignment());
+
+ EXPECT_EQ(emptyString, bam.impl_.Name());
+ EXPECT_EQ(emptyString, bam.impl_.CigarData().ToStdString());
+ EXPECT_EQ(emptyString, bam.impl_.Sequence());
+ EXPECT_EQ(emptyString, bam.impl_.Qualities().Fastq());
+
+ // PacBio data
+ EXPECT_EQ(-1, bam.AlignedStart());
+ EXPECT_EQ(-1, bam.AlignedEnd());
+ EXPECT_THROW(bam.HoleNumber(), std::exception);
+ // 8888888888888888888888888888888888888
+// EXPECT_EQ(-1, bam.NumPasses());
+// EXPECT_EQ(-1, bam.QueryStart());
+// EXPECT_EQ(-1, bam.QueryEnd());
+// EXPECT_EQ(0, bam.ReadAccuracy());
+// EXPECT_EQ(-1, bam.ReferenceStart());
+// EXPECT_EQ(-1, bam.ReferenceEnd());
+ // 8888888888888888888888888888888888888
+
+ EXPECT_THROW(bam.DeletionQV(), std::exception);
+ EXPECT_THROW(bam.DeletionTag(), std::exception);
+ EXPECT_THROW(bam.InsertionQV(), std::exception);
+ EXPECT_THROW(bam.MergeQV(), std::exception);
+ EXPECT_THROW(bam.SubstitutionQV(), std::exception);
+ EXPECT_THROW(bam.SubstitutionTag(), std::exception);
+
+ // 8888888888888888888888888888888888888
+// EXPECT_FALSE(bam.HasDeletionQV());
+// EXPECT_FALSE(bam.HasDeletionTag());
+// EXPECT_FALSE(bam.HasInsertionQV());
+// EXPECT_FALSE(bam.HasMergeQV());
+// EXPECT_FALSE(bam.HasSubstitutionQV());
+// EXPECT_FALSE(bam.HasSubstitutionTag());
+
+// EXPECT_EQ(emptyString, bam.MovieName());
+// EXPECT_EQ(emptyString, bam.ReadGroupId());
+ // 8888888888888888888888888888888888888
+
+ // raw data
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordTest, FromBamRecordImpl)
+{
+ // check generic data
+ BamRecordImpl genericBam = tests::CreateBamImpl();
+
+ EXPECT_EQ(42, genericBam.Bin());
+ EXPECT_EQ(42, genericBam.Flag());
+ EXPECT_EQ(42, genericBam.InsertSize());
+ EXPECT_EQ(42, genericBam.MapQuality());
+ EXPECT_EQ(42, genericBam.MateReferenceId());
+ EXPECT_EQ(42, genericBam.MatePosition());
+ EXPECT_EQ(42, genericBam.Position());
+ EXPECT_EQ(42, genericBam.ReferenceId());
+
+ const TagCollection& genericTags = genericBam.Tags();
+ EXPECT_TRUE(genericTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), genericTags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), genericTags.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), genericTags.at("CA").ToUInt8Array());
+
+ // copy ctor
+ BamRecord bam1(genericBam);
+
+ EXPECT_EQ(42, bam1.impl_.Bin());
+ EXPECT_EQ(42, bam1.impl_.Flag());
+ EXPECT_EQ(42, bam1.impl_.InsertSize());
+ EXPECT_EQ(42, bam1.impl_.MapQuality());
+ EXPECT_EQ(42, bam1.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam1.impl_.MatePosition());
+ EXPECT_EQ(42, bam1.impl_.Position());
+ EXPECT_EQ(42, bam1.impl_.ReferenceId());
+
+ const TagCollection& bam1Tags = bam1.impl_.Tags();
+ EXPECT_TRUE(bam1Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), bam1Tags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), bam1Tags.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam1Tags.at("CA").ToUInt8Array());
+
+ // copy assignment
+ BamRecord bam2;
+ bam2 = genericBam;
+
+ EXPECT_EQ(42, bam2.impl_.Bin());
+ EXPECT_EQ(42, bam2.impl_.Flag());
+ EXPECT_EQ(42, bam2.impl_.InsertSize());
+ EXPECT_EQ(42, bam2.impl_.MapQuality());
+ EXPECT_EQ(42, bam2.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam2.impl_.MatePosition());
+ EXPECT_EQ(42, bam2.impl_.Position());
+ EXPECT_EQ(42, bam2.impl_.ReferenceId());
+
+ const TagCollection& bam2Tags = bam2.impl_.Tags();
+ EXPECT_TRUE(bam2Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), bam2Tags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), bam2Tags.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam2Tags.at("CA").ToUInt8Array());
+
+ // change genericBam, make sure we deep copied bam1 & bam2
+ genericBam.Position(2000);
+
+ EXPECT_EQ(2000, genericBam.Position());
+ EXPECT_EQ(42, bam1.impl_.Position());
+ EXPECT_EQ(42, bam2.impl_.Position());
+
+ // move ctor
+ BamRecord bam3(move(tests::CreateBamImpl()));
+
+ EXPECT_EQ(42, bam3.impl_.Bin());
+ EXPECT_EQ(42, bam3.impl_.Flag());
+ EXPECT_EQ(42, bam3.impl_.InsertSize());
+ EXPECT_EQ(42, bam3.impl_.MapQuality());
+ EXPECT_EQ(42, bam3.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam3.impl_.MatePosition());
+ EXPECT_EQ(42, bam3.impl_.Position());
+ EXPECT_EQ(42, bam3.impl_.ReferenceId());
+
+ const TagCollection& bam3Tags = bam3.impl_.Tags();
+ EXPECT_TRUE(bam3Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), bam3Tags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), bam3Tags.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam3Tags.at("CA").ToUInt8Array());
+
+ // move assignment
+ BamRecord bam4;
+ bam4 = move(tests::CreateBamImpl());
+
+ EXPECT_EQ(42, bam4.impl_.Bin());
+ EXPECT_EQ(42, bam4.impl_.Flag());
+ EXPECT_EQ(42, bam4.impl_.InsertSize());
+ EXPECT_EQ(42, bam4.impl_.MapQuality());
+ EXPECT_EQ(42, bam4.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam4.impl_.MatePosition());
+ EXPECT_EQ(42, bam4.impl_.Position());
+ EXPECT_EQ(42, bam4.impl_.ReferenceId());
+
+ const TagCollection& bam4Tags = bam4.impl_.Tags();
+ EXPECT_TRUE(bam4Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), bam4Tags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), bam4Tags.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam4Tags.at("CA").ToUInt8Array());
+}
+
+TEST(BamRecordTest, SelfAssignmentTolerated)
+{
+ BamRecord bam1;
+ bam1.impl_.Bin(42);
+ bam1.impl_.Flag(42);
+ bam1.impl_.InsertSize(42);
+ bam1.impl_.MapQuality(42);
+ bam1.impl_.MatePosition(42);
+ bam1.impl_.MateReferenceId(42);
+ bam1.impl_.Position(42);
+ bam1.impl_.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam1.impl_.Tags(tags);
+
+ bam1 = bam1;
+
+ EXPECT_EQ(42, bam1.impl_.Bin());
+ EXPECT_EQ(42, bam1.impl_.Flag());
+ EXPECT_EQ(42, bam1.impl_.InsertSize());
+ EXPECT_EQ(42, bam1.impl_.MapQuality());
+ EXPECT_EQ(42, bam1.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam1.impl_.MatePosition());
+ EXPECT_EQ(42, bam1.impl_.Position());
+ EXPECT_EQ(42, bam1.impl_.ReferenceId());
+
+ const TagCollection& fetchedTags1 = bam1.impl_.Tags();
+ EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), fetchedTags1.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam1);
+}
+
+TEST(BamRecordTest, CoreSetters)
+{
+ // create basic BAM with (generic) data
+ BamRecord bam = tests::CreateBam();
+
+ QualityValues testQVs;
+ testQVs.push_back(0);
+ testQVs.push_back(1);
+
+ const string testTags = "GATTACA";
+
+ // now set PacBio data
+// bam.AlignedStart(42);
+// bam.AlignedEnd(42);
+// bam.DeletionQVs(testQVs);
+// bam.DeletionTags(testTags);
+// bam.HoleNumber(42);
+// bam.InsertionQVs(testQVs);
+// bam.MergeQVs(testQVs);
+// bam.NumPasses(42);
+// bam.QueryEnd(42);
+// bam.QueryStart(42);
+// bam.ReadAccuracy(42);
+// bam.ReferenceEnd(42);
+// bam.ReferenceStart(42);
+// bam.SubstitutionQVs(testQVs);
+// bam.SubstitutionTags(testTags);
+
+ // check generic data
+ EXPECT_EQ(42, bam.impl_.Bin());
+ EXPECT_EQ(42, bam.impl_.Flag());
+ EXPECT_EQ(42, bam.impl_.InsertSize());
+ EXPECT_EQ(42, bam.impl_.MapQuality());
+ EXPECT_EQ(42, bam.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam.impl_.MatePosition());
+ EXPECT_EQ(42, bam.impl_.Position());
+ EXPECT_EQ(42, bam.impl_.ReferenceId());
+
+ // check PacBio data
+// EXPECT_EQ(42, bam.AlignedStart());
+// EXPECT_EQ(42, bam.AlignedEnd());
+// EXPECT_EQ(testQVs, bam.DeletionQVs());
+// EXPECT_EQ(testTags, bam.DeletionTags());
+// EXPECT_EQ(42, bam.HoleNumber());
+// EXPECT_EQ(testQVs, bam.InsertionQVs());
+// EXPECT_EQ(testQVs, bam.MergeQVs());
+// EXPECT_EQ(42, bam.NumPasses());
+// EXPECT_EQ(42, bam.QueryEnd());
+// EXPECT_EQ(42, bam.QueryStart());
+// EXPECT_EQ(42, bam.ReadAccuracy());
+// EXPECT_EQ(42, bam.ReferenceEnd());
+// EXPECT_EQ(42, bam.ReferenceStart());
+// EXPECT_EQ(testQVs, bam.SubstitutionQVs());
+// EXPECT_EQ(testTags, bam.SubstitutionTags());
+
+ // check tags
+ const TagCollection& fetchedTags = bam.impl_.Tags();
+ EXPECT_TRUE(fetchedTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), fetchedTags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags.at("XY").ToInt32());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), fetchedTags.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordTest, SequenceOrientation)
+{
+ const string sequence = "ATATATCCCGGCG";
+ const string revSeq = "CGCCGGGATATAT";
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ BamRecordImpl forwardImpl;
+ forwardImpl.SetSequenceAndQualities(sequence);
+ forwardImpl.SetReverseStrand(false);
+
+ BamRecord forwardRead(forwardImpl);
+
+ // - "native" == "genomic"
+ EXPECT_EQ(forwardRead.Sequence(Orientation::NATIVE),
+ forwardRead.Sequence(Orientation::GENOMIC));
+ // - genomic output == genomic input
+ EXPECT_EQ(sequence, forwardRead.Sequence(Orientation::GENOMIC));
+ // - native output == genomic input
+ EXPECT_EQ(sequence, forwardRead.Sequence(Orientation::NATIVE));
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ BamRecordImpl reverseImpl;
+ reverseImpl.SetSequenceAndQualities(sequence);
+ reverseImpl.SetReverseStrand(true);
+
+ BamRecord reverseRead(reverseImpl);
+
+ // - "native" != "genomic"
+ EXPECT_NE(reverseRead.Sequence(Orientation::NATIVE),
+ reverseRead.Sequence(Orientation::GENOMIC));
+ // - genomic output == genomic input
+ EXPECT_EQ(sequence, reverseRead.Sequence(Orientation::GENOMIC));
+ // - genomic (raw) input != native output
+ EXPECT_NE(sequence, reverseRead.Sequence(Orientation::NATIVE));
+ // - native output should be reverse complement
+ EXPECT_EQ(revSeq, reverseRead.Sequence(Orientation::NATIVE));
+}
+
+TEST(BamRecordTest, QualitiesOrientation)
+{
+ const string sequence = "ATATATCCCGGCG";
+ const string qualities = "?]?]?]?]?]?]*";
+ const string revQuals = "*]?]?]?]?]?]?";
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ BamRecordImpl forwardImpl;
+ forwardImpl.SetSequenceAndQualities(sequence, qualities);
+ forwardImpl.SetReverseStrand(false);
+
+ BamRecord forwardRead(forwardImpl);
+
+ // - "native" == "genomic"
+ EXPECT_EQ(forwardRead.Qualities(Orientation::NATIVE),
+ forwardRead.Qualities(Orientation::GENOMIC));
+ // - genomic (raw) input == genomic input
+ EXPECT_EQ(qualities, forwardRead.Qualities(Orientation::GENOMIC).Fastq());
+ // - native output == genomic input
+ EXPECT_EQ(qualities, forwardRead.Qualities(Orientation::NATIVE).Fastq());
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ BamRecordImpl reverseImpl;
+ reverseImpl.SetSequenceAndQualities(sequence, qualities);
+ reverseImpl.SetReverseStrand(true);
+
+ BamRecord reverseRead(reverseImpl);
+
+ // - "native" != "genomic"
+ EXPECT_NE(reverseRead.Qualities(Orientation::NATIVE),
+ reverseRead.Qualities(Orientation::GENOMIC));
+ // - genomic output == genomic input
+ EXPECT_EQ(qualities, reverseRead.Qualities(Orientation::GENOMIC).Fastq());
+ // - genomic (raw) input != native output
+ EXPECT_NE(qualities, reverseRead.Qualities(Orientation::NATIVE).Fastq());
+ // - native output should be reverse
+ EXPECT_EQ(revQuals, reverseRead.Qualities(Orientation::NATIVE).Fastq());
+}
+
+TEST(BamRecordTest, SequenceTagsOrientation)
+{
+ const string tag = "ATATATCCCGGCG";
+ const string revTag = "CGCCGGGATATAT";
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ BamRecordImpl forwardImpl;
+ forwardImpl.SetReverseStrand(false);
+ forwardImpl.AddTag("dt", tag);
+ forwardImpl.AddTag("st", tag);
+
+ BamRecord forwardRead(forwardImpl);
+
+ // sanity check
+ EXPECT_TRUE(forwardImpl.HasTag("dt"));
+ EXPECT_TRUE(forwardImpl.HasTag("st"));
+ EXPECT_TRUE(forwardRead.HasDeletionTag());
+ EXPECT_TRUE(forwardRead.HasSubstitutionTag());
+
+ // - "native" == "genomic"
+ EXPECT_EQ(forwardRead.DeletionTag(Orientation::NATIVE),
+ forwardRead.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(forwardRead.SubstitutionTag(Orientation::NATIVE),
+ forwardRead.SubstitutionTag(Orientation::GENOMIC));
+
+ // - genomic output == genomic input
+ EXPECT_EQ(tag, forwardRead.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tag, forwardRead.SubstitutionTag(Orientation::GENOMIC));
+
+ // - native output == genomic input
+ EXPECT_EQ(tag, forwardRead.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tag, forwardRead.SubstitutionTag(Orientation::NATIVE));
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ BamRecordImpl reverseImpl;
+ reverseImpl.SetReverseStrand(true);
+ reverseImpl.AddTag("dt", revTag);
+ reverseImpl.AddTag("st", revTag);
+
+ BamRecord reverseRead(reverseImpl);
+
+ // sanity check
+ EXPECT_TRUE(reverseImpl.HasTag("dt"));
+ EXPECT_TRUE(reverseImpl.HasTag("st"));
+ EXPECT_TRUE(reverseRead.HasDeletionTag());
+ EXPECT_TRUE(reverseRead.HasSubstitutionTag());
+
+ // - "native" != "genomic"
+ EXPECT_NE(reverseRead.DeletionTag(Orientation::NATIVE),
+ reverseRead.DeletionTag(Orientation::GENOMIC));
+ EXPECT_NE(reverseRead.SubstitutionTag(Orientation::NATIVE),
+ reverseRead.SubstitutionTag(Orientation::GENOMIC));
+
+ // - genomic output == genomic input
+ EXPECT_EQ(tag, reverseRead.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tag, reverseRead.SubstitutionTag(Orientation::GENOMIC));
+
+ // - genomic (raw) input != native output
+ EXPECT_NE(tag, reverseRead.DeletionTag(Orientation::NATIVE));
+ EXPECT_NE(tag, reverseRead.SubstitutionTag(Orientation::NATIVE));
+
+ // - native output should be reverse
+ EXPECT_EQ(revTag, reverseRead.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(revTag, reverseRead.SubstitutionTag(Orientation::NATIVE));
+}
+
+TEST(BamRecordTest, FrameTagsOrientation)
+{
+ vector<uint16_t> frameData;
+ vector<uint16_t> revFrameData;
+ for (int i = 0, j = 4; i < 5; ++i, --j) {
+ frameData.push_back(i*10);
+ revFrameData.push_back(j*10);
+ }
+ const Frames frames(frameData);
+ const Frames revFrames(revFrameData);
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ BamRecordImpl forwardImpl;
+ forwardImpl.SetReverseStrand(false);
+ forwardImpl.AddTag("ip", frames.Data());
+ forwardImpl.AddTag("pw", frames.Data());
+
+ BamRecord forwardRead(forwardImpl);
+
+ // sanity check
+ EXPECT_TRUE(forwardImpl.HasTag("ip"));
+ EXPECT_TRUE(forwardImpl.HasTag("pw"));
+ EXPECT_TRUE(forwardRead.HasIPD());
+ EXPECT_TRUE(forwardRead.HasPulseWidth());
+
+ // - "native" == "genomic"
+ EXPECT_EQ(forwardRead.IPD(Orientation::NATIVE),
+ forwardRead.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(forwardRead.PulseWidth(Orientation::NATIVE),
+ forwardRead.PulseWidth(Orientation::GENOMIC));
+
+ // - genomic output == genomic input
+ EXPECT_EQ(frames, forwardRead.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(frames, forwardRead.PulseWidth(Orientation::GENOMIC));
+
+ // - native output == genomic input
+ EXPECT_EQ(frames, forwardRead.IPD(Orientation::NATIVE));
+ EXPECT_EQ(frames, forwardRead.PulseWidth(Orientation::NATIVE));
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ BamRecordImpl reverseImpl;
+ reverseImpl.SetReverseStrand(true);
+ reverseImpl.AddTag("ip", revFrames.Data());
+ reverseImpl.AddTag("pw", revFrames.Data());
+
+ BamRecord reverseRead(reverseImpl);
+
+ // sanity check
+ EXPECT_TRUE(reverseImpl.HasTag("ip"));
+ EXPECT_TRUE(reverseImpl.HasTag("pw"));
+ EXPECT_TRUE(reverseRead.HasIPD());
+ EXPECT_TRUE(reverseRead.HasPulseWidth());
+
+ // - "native" != "genomic"
+ EXPECT_NE(reverseRead.IPD(Orientation::NATIVE),
+ reverseRead.IPD(Orientation::GENOMIC));
+ EXPECT_NE(reverseRead.PulseWidth(Orientation::NATIVE),
+ reverseRead.PulseWidth(Orientation::GENOMIC));
+
+ // - genomic output == genomic input
+ EXPECT_EQ(frames, reverseRead.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(frames, reverseRead.PulseWidth(Orientation::GENOMIC));
+
+ // - genomic (raw) input != native output
+ EXPECT_NE(frames, reverseRead.IPD(Orientation::NATIVE));
+ EXPECT_NE(frames, reverseRead.PulseWidth(Orientation::NATIVE));
+
+ // - native output should be reverse
+ EXPECT_EQ(revFrames, reverseRead.IPD(Orientation::NATIVE));
+ EXPECT_EQ(revFrames, reverseRead.PulseWidth(Orientation::NATIVE));
+}
+
+TEST(BamRecordTest, QualityTagsOrientation)
+{
+ const string qualities = "?]?]?]?]?]?]*";
+ const string revQuals = "*]?]?]?]?]?]?";
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ BamRecordImpl forwardImpl;
+ forwardImpl.SetReverseStrand(false);
+ forwardImpl.AddTag("dq", qualities);
+ forwardImpl.AddTag("iq", qualities);
+ forwardImpl.AddTag("mq", qualities);
+ forwardImpl.AddTag("sq", qualities);
+
+ BamRecord forwardRead(forwardImpl);
+
+ // sanity check
+ EXPECT_TRUE(forwardImpl.HasTag("dq"));
+ EXPECT_TRUE(forwardImpl.HasTag("iq"));
+ EXPECT_TRUE(forwardImpl.HasTag("mq"));
+ EXPECT_TRUE(forwardImpl.HasTag("sq"));
+ EXPECT_TRUE(forwardRead.HasDeletionQV());
+ EXPECT_TRUE(forwardRead.HasInsertionQV());
+ EXPECT_TRUE(forwardRead.HasMergeQV());
+ EXPECT_TRUE(forwardRead.HasSubstitutionQV());
+
+ // - "native" == "genomic"
+ EXPECT_EQ(forwardRead.DeletionQV(Orientation::NATIVE),
+ forwardRead.DeletionQV(Orientation::GENOMIC));
+ EXPECT_EQ(forwardRead.InsertionQV(Orientation::NATIVE),
+ forwardRead.InsertionQV(Orientation::GENOMIC));
+ EXPECT_EQ(forwardRead.MergeQV(Orientation::NATIVE),
+ forwardRead.MergeQV(Orientation::GENOMIC));
+ EXPECT_EQ(forwardRead.SubstitutionQV(Orientation::NATIVE),
+ forwardRead.SubstitutionQV(Orientation::GENOMIC));
+
+ // - genomic output == genomic input
+ EXPECT_EQ(qualities, forwardRead.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(qualities, forwardRead.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(qualities, forwardRead.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(qualities, forwardRead.SubstitutionQV(Orientation::GENOMIC).Fastq());
+
+ // - native output == genomic input
+ EXPECT_EQ(qualities, forwardRead.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(qualities, forwardRead.InsertionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(qualities, forwardRead.MergeQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(qualities, forwardRead.SubstitutionQV(Orientation::NATIVE).Fastq());
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ BamRecordImpl reverseImpl;
+ reverseImpl.SetReverseStrand(true);
+ reverseImpl.AddTag("dq", revQuals);
+ reverseImpl.AddTag("iq", revQuals);
+ reverseImpl.AddTag("mq", revQuals);
+ reverseImpl.AddTag("sq", revQuals);
+
+ BamRecord reverseRead(reverseImpl);
+
+ // sanity check
+ EXPECT_TRUE(reverseImpl.HasTag("dq"));
+ EXPECT_TRUE(reverseImpl.HasTag("iq"));
+ EXPECT_TRUE(reverseImpl.HasTag("mq"));
+ EXPECT_TRUE(reverseImpl.HasTag("sq"));
+ EXPECT_TRUE(reverseRead.HasDeletionQV());
+ EXPECT_TRUE(reverseRead.HasInsertionQV());
+ EXPECT_TRUE(reverseRead.HasMergeQV());
+ EXPECT_TRUE(reverseRead.HasSubstitutionQV());
+
+ // - "native" != "genomic"
+ EXPECT_NE(reverseRead.DeletionQV(Orientation::NATIVE),
+ reverseRead.DeletionQV(Orientation::GENOMIC));
+ EXPECT_NE(reverseRead.InsertionQV(Orientation::NATIVE),
+ reverseRead.InsertionQV(Orientation::GENOMIC));
+ EXPECT_NE(reverseRead.MergeQV(Orientation::NATIVE),
+ reverseRead.MergeQV(Orientation::GENOMIC));
+ EXPECT_NE(reverseRead.SubstitutionQV(Orientation::NATIVE),
+ reverseRead.SubstitutionQV(Orientation::GENOMIC));
+
+ // - genomic output == genomic input
+ EXPECT_EQ(qualities, reverseRead.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(qualities, reverseRead.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(qualities, reverseRead.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(qualities, reverseRead.SubstitutionQV(Orientation::GENOMIC).Fastq());
+
+ // - genomic (raw) input != native output
+ EXPECT_NE(qualities, reverseRead.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_NE(qualities, reverseRead.InsertionQV(Orientation::NATIVE).Fastq());
+ EXPECT_NE(qualities, reverseRead.MergeQV(Orientation::NATIVE).Fastq());
+ EXPECT_NE(qualities, reverseRead.SubstitutionQV(Orientation::NATIVE).Fastq());
+
+ // - native output should be reverse
+ EXPECT_EQ(revQuals, reverseRead.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(revQuals, reverseRead.InsertionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(revQuals, reverseRead.MergeQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(revQuals, reverseRead.SubstitutionQV(Orientation::NATIVE).Fastq());
+}
+
+TEST(BamRecordTest, ClippingAndOrientation)
+{
+ // forward string names, cigar, seq
+ // reverse strand records have same cigar and **input** seq as forward strand
+ // (native output will be rev-comp'd)
+
+ const string s1_cigar = "10=";
+ const string s2_cigar = "3=4N3=";
+ const string s3_cigar = "1S8=1S";
+ const string s4_cigar = "1H8=1H";
+ const string s5_cigar = "2S6=2S";
+ const string s6_cigar = "2S3=2I3=2S";
+ const string s7_cigar = "2H6=2H";
+
+ const string s1_seq = "ATCCGCGGTT";
+ const string s2_seq = "ACGTT";
+ const string s3_seq = "ACCCGCGGTT";
+ const string s4_seq = "ATCGCGGT";
+ const string s5_seq = "AGCCGCGGTT";
+ const string s6_seq = "ATCCGNNCGGTT";
+ const string s7_seq = "CAGCGG";
+
+ const string s1_seq_clipped = "ATCCGCGGTT";
+ const string s2_seq_clipped = "ACGTT";
+ const string s3_seq_clipped = "CCCGCGGT";
+ const string s4_seq_clipped = "ATCGCGGT";
+ const string s5_seq_clipped = "CCGCGG";
+ const string s6_seq_clipped = "CCGNNCGG";
+ const string s7_seq_clipped = "CAGCGG";
+
+ const string s1_revseq = "AACCGCGGAT";
+ const string s2_revseq = "AACGT";
+ const string s3_revseq = "AACCGCGGGT";
+ const string s4_revseq = "ACCGCGAT";
+ const string s5_revseq = "AACCGCGGCT";
+ const string s6_revseq = "AACCGNNCGGAT";
+ const string s7_revseq = "CCGCTG";
+
+ const string s1_revseq_clipped = "AACCGCGGAT";
+ const string s2_revseq_clipped = "AACGT";
+ const string s3_revseq_clipped = "ACCGCGGG";
+ const string s4_revseq_clipped = "ACCGCGAT";
+ const string s5_revseq_clipped = "CCGCGG";
+ const string s6_revseq_clipped = "CCGNNCGG";
+ const string s7_revseq_clipped = "CCGCTG";
+
+ const BamRecord s1 = tests::MakeCigaredRecord(s1_seq, s1_cigar, false);
+ const BamRecord s2 = tests::MakeCigaredRecord(s2_seq, s2_cigar, false);
+ const BamRecord s3 = tests::MakeCigaredRecord(s3_seq, s3_cigar, false);
+ const BamRecord s4 = tests::MakeCigaredRecord(s4_seq, s4_cigar, false);
+ const BamRecord s5 = tests::MakeCigaredRecord(s5_seq, s5_cigar, false);
+ const BamRecord s6 = tests::MakeCigaredRecord(s6_seq, s6_cigar, false);
+ const BamRecord s7 = tests::MakeCigaredRecord(s7_seq, s7_cigar, false);
+ const BamRecord s1_reverse = tests::MakeCigaredRecord(s1_seq, s1_cigar, true);
+ const BamRecord s2_reverse = tests::MakeCigaredRecord(s2_seq, s2_cigar, true);
+ const BamRecord s3_reverse = tests::MakeCigaredRecord(s3_seq, s3_cigar, true);
+ const BamRecord s4_reverse = tests::MakeCigaredRecord(s4_seq, s4_cigar, true);
+ const BamRecord s5_reverse = tests::MakeCigaredRecord(s5_seq, s5_cigar, true);
+ const BamRecord s6_reverse = tests::MakeCigaredRecord(s6_seq, s6_cigar, true);
+ const BamRecord s7_reverse = tests::MakeCigaredRecord(s7_seq, s7_cigar, true);
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ // - "native" == "genomic"
+ EXPECT_EQ(s1.Sequence(Orientation::NATIVE), s1.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2.Sequence(Orientation::NATIVE), s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3.Sequence(Orientation::NATIVE), s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s4.Sequence(Orientation::NATIVE), s4.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s5.Sequence(Orientation::NATIVE), s5.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s6.Sequence(Orientation::NATIVE), s6.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s7.Sequence(Orientation::NATIVE), s7.Sequence(Orientation::GENOMIC));
+
+ // - unclipped, unaligned genomic output == genomic input
+ EXPECT_EQ(s1_seq, s1.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_seq, s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_seq, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s4_seq, s4.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s5_seq, s5.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s6_seq, s6.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s7_seq, s7.Sequence(Orientation::GENOMIC));
+
+ // - unclipped, unaligned native output == genomic input
+ EXPECT_EQ(s1_seq, s1.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s2_seq, s2.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s3_seq, s3.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s4_seq, s4.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s5_seq, s5.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s6_seq, s6.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s7_seq, s7.Sequence(Orientation::NATIVE));
+
+ // - clipped, unaligned native output == clipped genomic input
+ EXPECT_EQ(s1_seq_clipped, s1.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s2_seq_clipped, s2.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s4_seq_clipped, s4.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s5_seq_clipped, s5.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s6_seq_clipped, s6.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s7_seq_clipped, s7.Sequence(Orientation::NATIVE, false, true));
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ // - "native" != "genomic"
+ EXPECT_NE(s1_reverse.Sequence(Orientation::NATIVE), s1_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.Sequence(Orientation::NATIVE), s2_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.Sequence(Orientation::NATIVE), s3_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.Sequence(Orientation::NATIVE), s4_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.Sequence(Orientation::NATIVE), s5_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.Sequence(Orientation::NATIVE), s6_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s7_reverse.Sequence(Orientation::NATIVE), s7_reverse.Sequence(Orientation::GENOMIC));
+
+ // - unclipped, unaligned genomic output == genomic input
+ EXPECT_EQ(s1_seq, s1_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_seq, s2_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_seq, s3_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s4_seq, s4_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s5_seq, s5_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s6_seq, s6_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s7_seq, s7_reverse.Sequence(Orientation::GENOMIC));
+
+ // - unclipped, unaligned native output != genomic (raw) input
+ EXPECT_NE(s1_seq, s1_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_NE(s2_seq, s2_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_NE(s3_seq, s3_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_NE(s4_seq, s4_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_NE(s5_seq, s5_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_NE(s6_seq, s6_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_NE(s7_seq, s7_reverse.Sequence(Orientation::NATIVE));
+
+ // - unclipped, unaligned native output should be reverse
+ EXPECT_EQ(s1_revseq, s1_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s2_revseq, s2_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s3_revseq, s3_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s4_revseq, s4_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s5_revseq, s5_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s6_revseq, s6_reverse.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(s7_revseq, s7_reverse.Sequence(Orientation::NATIVE));
+
+ // - clipped, unaligned native output == clipped genomic input
+ EXPECT_EQ(s1_revseq_clipped, s1_reverse.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s2_revseq_clipped, s2_reverse.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s3_revseq_clipped, s3_reverse.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s4_revseq_clipped, s4_reverse.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s5_revseq_clipped, s5_reverse.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s6_revseq_clipped, s6_reverse.Sequence(Orientation::NATIVE, false, true));
+ EXPECT_EQ(s7_revseq_clipped, s7_reverse.Sequence(Orientation::NATIVE, false, true));
+}
+
+TEST(BamRecordTest, ClippingOrientationAndAlignment)
+{
+ // forward string names, cigar, seq
+ // reverse strand records have same cigar and **input** seq as forward strand
+ // (native output will be rev-comp'd)
+
+ const string s1_cigar = "4=3D4=";
+ const string s2_cigar = "4=1D2I2D4=";
+ const string s3_cigar = "4=1D2P2I2P2D4=";
+ const string s4_cigar = "2S4=3D4=3S";
+ const string s5_cigar = "2H4=3D4=3H";
+ const string s6_cigar = "2H2S4=3D4=3S3H";
+
+ const string s1_seq = "AACCGTTA";
+ const string s2_seq = "ATCCTAGGTT";
+ const string s3_seq = "ATCCTAGGTT";
+ const string s4_seq = "TTAACCGTTACCG";
+ const string s5_seq = "AACCGTTA";
+ const string s6_seq = "TTAACCGTTACCG";
+
+ const string s1_seq_aligned = "AACC---GTTA";
+ const string s2_seq_aligned = "ATCC-TA--GGTT";
+ const string s3_seq_aligned = "ATCC-**TA**--GGTT";
+ const string s4_seq_aligned = "TTAACC---GTTACCG";
+ const string s5_seq_aligned = "AACC---GTTA";
+ const string s6_seq_aligned = "TTAACC---GTTACCG";
+
+ const string s1_seq_aligned_clipped = "AACC---GTTA";
+ const string s2_seq_aligned_clipped = "ATCC-TA--GGTT";
+ const string s3_seq_aligned_clipped = "ATCC-**TA**--GGTT";
+ const string s4_seq_aligned_clipped = "AACC---GTTA";
+ const string s5_seq_aligned_clipped = "AACC---GTTA";
+ const string s6_seq_aligned_clipped = "AACC---GTTA";
+
+ const string s1_revseq = "TAACGGTT";
+ const string s2_revseq = "AACCTAGGAT";
+ const string s3_revseq = "AACCTAGGAT";
+ const string s4_revseq = "CGGTAACGGTTAA";
+ const string s5_revseq = "TAACGGTT";
+ const string s6_revseq = "CGGTAACGGTTAA";
+
+ const string s1_revseq_aligned = "TAAC---GGTT";
+ const string s2_revseq_aligned = "AACC--TA-GGAT";
+ const string s3_revseq_aligned = "AACC--**TA**-GGAT";
+ const string s4_revseq_aligned = "CGGTAAC---GGTTAA";
+ const string s5_revseq_aligned = "TAAC---GGTT";
+ const string s6_revseq_aligned = "CGGTAAC---GGTTAA";
+
+ const string s1_revseq_aligned_clipped = "TAAC---GGTT";
+ const string s2_revseq_aligned_clipped = "AACC--TA-GGAT";
+ const string s3_revseq_aligned_clipped = "AACC--**TA**-GGAT";
+ const string s4_revseq_aligned_clipped = "TAAC---GGTT";
+ const string s5_revseq_aligned_clipped = "TAAC---GGTT";
+ const string s6_revseq_aligned_clipped = "TAAC---GGTT";
+
+ const BamRecord s1 = tests::MakeCigaredRecord(s1_seq, s1_cigar, false);
+ const BamRecord s2 = tests::MakeCigaredRecord(s2_seq, s2_cigar, false);
+ const BamRecord s3 = tests::MakeCigaredRecord(s3_seq, s3_cigar, false);
+ const BamRecord s4 = tests::MakeCigaredRecord(s4_seq, s4_cigar, false);
+ const BamRecord s5 = tests::MakeCigaredRecord(s5_seq, s5_cigar, false);
+ const BamRecord s6 = tests::MakeCigaredRecord(s6_seq, s6_cigar, false);
+ const BamRecord s1_reverse = tests::MakeCigaredRecord(s1_seq, s1_cigar, true);
+ const BamRecord s2_reverse = tests::MakeCigaredRecord(s2_seq, s2_cigar, true);
+ const BamRecord s3_reverse = tests::MakeCigaredRecord(s3_seq, s3_cigar, true);
+ const BamRecord s4_reverse = tests::MakeCigaredRecord(s4_seq, s4_cigar, true);
+ const BamRecord s5_reverse = tests::MakeCigaredRecord(s5_seq, s5_cigar, true);
+ const BamRecord s6_reverse = tests::MakeCigaredRecord(s6_seq, s6_cigar, true);
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ // - "native" == "genomic"
+ EXPECT_EQ(s1.Sequence(Orientation::NATIVE), s1.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2.Sequence(Orientation::NATIVE), s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3.Sequence(Orientation::NATIVE), s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s4.Sequence(Orientation::NATIVE), s4.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s5.Sequence(Orientation::NATIVE), s5.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s6.Sequence(Orientation::NATIVE), s6.Sequence(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output == genomic input
+ EXPECT_EQ(s1_seq, s1.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s2_seq, s2.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s3_seq, s3.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s4_seq, s4.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s5_seq, s5.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s6_seq, s6.Sequence(Orientation::GENOMIC, false, false));
+
+ // - aligned, unclipped genomic output == aligned, unclipped genomic input
+ EXPECT_EQ(s1_seq_aligned, s1.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s2_seq_aligned, s2.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s3_seq_aligned, s3.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s4_seq_aligned, s4.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s5_seq_aligned, s5.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s6_seq_aligned, s6.Sequence(Orientation::GENOMIC, true, false));
+
+ // - aligned, clipped genomic output == aligned, clipped genomic output
+ EXPECT_EQ(s1_seq_aligned_clipped, s1.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s2_seq_aligned_clipped, s2.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s3_seq_aligned_clipped, s3.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s4_seq_aligned_clipped, s4.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s5_seq_aligned_clipped, s5.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s6_seq_aligned_clipped, s6.Sequence(Orientation::GENOMIC, true, true));
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ // - "native" != "genomic"
+ EXPECT_NE(s1_reverse.Sequence(Orientation::NATIVE), s1_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.Sequence(Orientation::NATIVE), s2_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.Sequence(Orientation::NATIVE), s3_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.Sequence(Orientation::NATIVE), s4_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.Sequence(Orientation::NATIVE), s5_reverse.Sequence(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.Sequence(Orientation::NATIVE), s6_reverse.Sequence(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output
+ EXPECT_EQ(s1_seq, s1_reverse.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s2_seq, s2_reverse.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s3_seq, s3_reverse.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s4_seq, s4_reverse.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s5_seq, s5_reverse.Sequence(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s6_seq, s6_reverse.Sequence(Orientation::GENOMIC, false, false));
+
+ // - unaligned, unclipped native output
+ EXPECT_EQ(s1_revseq, s1_reverse.Sequence(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s2_revseq, s2_reverse.Sequence(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s3_revseq, s3_reverse.Sequence(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s4_revseq, s4_reverse.Sequence(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s5_revseq, s5_reverse.Sequence(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s6_revseq, s6_reverse.Sequence(Orientation::NATIVE, false, false));
+
+ // - aligned, unclipped genomic output
+ EXPECT_EQ(s1_seq_aligned, s1_reverse.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s2_seq_aligned, s2_reverse.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s3_seq_aligned, s3_reverse.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s4_seq_aligned, s4_reverse.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s5_seq_aligned, s5_reverse.Sequence(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s6_seq_aligned, s6_reverse.Sequence(Orientation::GENOMIC, true, false));
+
+ // - aligned, unclipped native output
+ EXPECT_EQ(s1_revseq_aligned, s1_reverse.Sequence(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s2_revseq_aligned, s2_reverse.Sequence(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s3_revseq_aligned, s3_reverse.Sequence(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s4_revseq_aligned, s4_reverse.Sequence(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s5_revseq_aligned, s5_reverse.Sequence(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s6_revseq_aligned, s6_reverse.Sequence(Orientation::NATIVE, true, false));
+
+ // - aligned, clipped genomic output
+ EXPECT_EQ(s1_seq_aligned_clipped, s1_reverse.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s2_seq_aligned_clipped, s2_reverse.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s3_seq_aligned_clipped, s3_reverse.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s4_seq_aligned_clipped, s4_reverse.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s5_seq_aligned_clipped, s5_reverse.Sequence(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s6_seq_aligned_clipped, s6_reverse.Sequence(Orientation::GENOMIC, true, true));
+
+ // - aligned, clipped native output
+ EXPECT_EQ(s1_revseq_aligned_clipped, s1_reverse.Sequence(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s2_revseq_aligned_clipped, s2_reverse.Sequence(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s3_revseq_aligned_clipped, s3_reverse.Sequence(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s4_revseq_aligned_clipped, s4_reverse.Sequence(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s5_revseq_aligned_clipped, s5_reverse.Sequence(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s6_revseq_aligned_clipped, s6_reverse.Sequence(Orientation::NATIVE, true, true));
+}
+
+
+TEST(BamRecordTest, QualityTagsClippedAndAligned)
+{
+ // NOTE - FASTQ for QV=0 is '!'. Thus deletions/padding will be rendered as '!'s.
+
+ const string s1_cigar = "4=3D4=";
+ const string s2_cigar = "4=1D2I2D4=";
+ const string s3_cigar = "4=1D2P2I2P2D4=";
+ const string s4_cigar = "3S4=3D4=3S";
+ const string s5_cigar = "2H4=3D4=3H";
+ const string s6_cigar = "2H3S4=3D4=3S3H";
+
+ const string s1_quals = "?]?]?]?@";
+ const string s2_quals = "?]?]87?]?@";
+ const string s3_quals = "?]?]87?]?@";
+ const string s4_quals = "vvv?]?]?]?@xxx";
+ const string s5_quals = "?]?]?]?@";
+ const string s6_quals = "vvv?]?]?]?@xxx";
+
+ const string s1_quals_aligned = "?]?]!!!?]?@";
+ const string s2_quals_aligned = "?]?]!87!!?]?@";
+ const string s3_quals_aligned = "?]?]!!!87!!!!?]?@";
+ const string s4_quals_aligned = "vvv?]?]!!!?]?@xxx";
+ const string s5_quals_aligned = "?]?]!!!?]?@";
+ const string s6_quals_aligned = "vvv?]?]!!!?]?@xxx";
+
+ const string s1_quals_aligned_clipped = "?]?]!!!?]?@";
+ const string s2_quals_aligned_clipped = "?]?]!87!!?]?@";
+ const string s3_quals_aligned_clipped = "?]?]!!!87!!!!?]?@";
+ const string s4_quals_aligned_clipped = "?]?]!!!?]?@";
+ const string s5_quals_aligned_clipped = "?]?]!!!?]?@";
+ const string s6_quals_aligned_clipped = "?]?]!!!?]?@";
+
+ const string s1_revquals = "@?]?]?]?";
+ const string s2_revquals = "@?]?78]?]?";
+ const string s3_revquals = "@?]?78]?]?";
+ const string s4_revquals = "xxx@?]?]?]?vvv";
+ const string s5_revquals = "@?]?]?]?";
+ const string s6_revquals = "xxx@?]?]?]?vvv";
+
+ const string s1_revquals_aligned = "@?]?!!!]?]?";
+ const string s2_revquals_aligned = "@?]?!78!!]?]?";
+ const string s3_revquals_aligned = "@?]?!!!78!!!!]?]?";
+ const string s4_revquals_aligned = "xxx@?]?!!!]?]?vvv";
+ const string s5_revquals_aligned = "@?]?!!!]?]?";
+ const string s6_revquals_aligned = "xxx@?]?!!!]?]?vvv";
+
+ const string s1_revquals_aligned_clipped = "@?]?!!!]?]?";
+ const string s2_revquals_aligned_clipped = "@?]?!78!!]?]?";
+ const string s3_revquals_aligned_clipped = "@?]?!!!78!!!!]?]?";
+ const string s4_revquals_aligned_clipped = "@?]?!!!]?]?";
+ const string s5_revquals_aligned_clipped = "@?]?!!!]?]?";
+ const string s6_revquals_aligned_clipped = "@?]?!!!]?]?";
+
+ const BamRecord s1 = tests::MakeCigaredQualRecord(s1_quals, s1_cigar, false);
+ const BamRecord s2 = tests::MakeCigaredQualRecord(s2_quals, s2_cigar, false);
+ const BamRecord s3 = tests::MakeCigaredQualRecord(s3_quals, s3_cigar, false);
+ const BamRecord s4 = tests::MakeCigaredQualRecord(s4_quals, s4_cigar, false);
+ const BamRecord s5 = tests::MakeCigaredQualRecord(s5_quals, s5_cigar, false);
+ const BamRecord s6 = tests::MakeCigaredQualRecord(s6_quals, s6_cigar, false);
+ const BamRecord s1_reverse = tests::MakeCigaredQualRecord(s1_quals, s1_cigar, true);
+ const BamRecord s2_reverse = tests::MakeCigaredQualRecord(s2_quals, s2_cigar, true);
+ const BamRecord s3_reverse = tests::MakeCigaredQualRecord(s3_quals, s3_cigar, true);
+ const BamRecord s4_reverse = tests::MakeCigaredQualRecord(s4_quals, s4_cigar, true);
+ const BamRecord s5_reverse = tests::MakeCigaredQualRecord(s5_quals, s5_cigar, true);
+ const BamRecord s6_reverse = tests::MakeCigaredQualRecord(s6_quals, s6_cigar, true);
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ // - "native" == "genomic"
+ EXPECT_EQ(s1.DeletionQV(Orientation::NATIVE), s1.DeletionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s2.DeletionQV(Orientation::NATIVE), s2.DeletionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s3.DeletionQV(Orientation::NATIVE), s3.DeletionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s4.DeletionQV(Orientation::NATIVE), s4.DeletionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s5.DeletionQV(Orientation::NATIVE), s5.DeletionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s6.DeletionQV(Orientation::NATIVE), s6.DeletionQV(Orientation::GENOMIC));
+
+ EXPECT_EQ(s1.InsertionQV(Orientation::NATIVE), s1.InsertionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s2.InsertionQV(Orientation::NATIVE), s2.InsertionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s3.InsertionQV(Orientation::NATIVE), s3.InsertionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s4.InsertionQV(Orientation::NATIVE), s4.InsertionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s5.InsertionQV(Orientation::NATIVE), s5.InsertionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s6.InsertionQV(Orientation::NATIVE), s6.InsertionQV(Orientation::GENOMIC));
+
+ EXPECT_EQ(s1.MergeQV(Orientation::NATIVE), s1.MergeQV(Orientation::GENOMIC));
+ EXPECT_EQ(s2.MergeQV(Orientation::NATIVE), s2.MergeQV(Orientation::GENOMIC));
+ EXPECT_EQ(s3.MergeQV(Orientation::NATIVE), s3.MergeQV(Orientation::GENOMIC));
+ EXPECT_EQ(s4.MergeQV(Orientation::NATIVE), s4.MergeQV(Orientation::GENOMIC));
+ EXPECT_EQ(s5.MergeQV(Orientation::NATIVE), s5.MergeQV(Orientation::GENOMIC));
+ EXPECT_EQ(s6.MergeQV(Orientation::NATIVE), s6.MergeQV(Orientation::GENOMIC));
+
+ EXPECT_EQ(s1.SubstitutionQV(Orientation::NATIVE), s1.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s2.SubstitutionQV(Orientation::NATIVE), s2.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s3.SubstitutionQV(Orientation::NATIVE), s3.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s4.SubstitutionQV(Orientation::NATIVE), s4.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s5.SubstitutionQV(Orientation::NATIVE), s5.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_EQ(s6.SubstitutionQV(Orientation::NATIVE), s6.SubstitutionQV(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output == genomic input
+ EXPECT_EQ(s1_quals, s1.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_quals, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_quals, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s4_quals, s4.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s5_quals, s5.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s6_quals, s6.DeletionQV(Orientation::GENOMIC).Fastq());
+
+ EXPECT_EQ(s1_quals, s1.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_quals, s2.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_quals, s3.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s4_quals, s4.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s5_quals, s5.InsertionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s6_quals, s6.InsertionQV(Orientation::GENOMIC).Fastq());
+
+ EXPECT_EQ(s1_quals, s1.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_quals, s2.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_quals, s3.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s4_quals, s4.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s5_quals, s5.MergeQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s6_quals, s6.MergeQV(Orientation::GENOMIC).Fastq());
+
+ EXPECT_EQ(s1_quals, s1.SubstitutionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_quals, s2.SubstitutionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_quals, s3.SubstitutionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s4_quals, s4.SubstitutionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s5_quals, s5.SubstitutionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s6_quals, s6.SubstitutionQV(Orientation::GENOMIC).Fastq());
+
+ // - aligned, unclipped genomic output == aligned, unclipped genomic input
+ EXPECT_EQ(s1_quals_aligned, s1.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned, s1.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned, s1.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned, s1.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+
+ // - aligned, clipped genomic output == aligned, clipped genomic output
+ EXPECT_EQ(s1_quals_aligned_clipped, s1.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned_clipped, s1.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned_clipped, s1.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned_clipped, s1.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ // - "native" != "genomic"
+ EXPECT_NE(s1_reverse.DeletionQV(Orientation::NATIVE), s1_reverse.DeletionQV(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.DeletionQV(Orientation::NATIVE), s2_reverse.DeletionQV(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.DeletionQV(Orientation::NATIVE), s3_reverse.DeletionQV(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.DeletionQV(Orientation::NATIVE), s4_reverse.DeletionQV(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.DeletionQV(Orientation::NATIVE), s5_reverse.DeletionQV(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.DeletionQV(Orientation::NATIVE), s6_reverse.DeletionQV(Orientation::GENOMIC));
+
+ EXPECT_NE(s1_reverse.InsertionQV(Orientation::NATIVE), s1_reverse.InsertionQV(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.InsertionQV(Orientation::NATIVE), s2_reverse.InsertionQV(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.InsertionQV(Orientation::NATIVE), s3_reverse.InsertionQV(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.InsertionQV(Orientation::NATIVE), s4_reverse.InsertionQV(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.InsertionQV(Orientation::NATIVE), s5_reverse.InsertionQV(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.InsertionQV(Orientation::NATIVE), s6_reverse.InsertionQV(Orientation::GENOMIC));
+
+ EXPECT_NE(s1_reverse.MergeQV(Orientation::NATIVE), s1_reverse.MergeQV(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.MergeQV(Orientation::NATIVE), s2_reverse.MergeQV(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.MergeQV(Orientation::NATIVE), s3_reverse.MergeQV(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.MergeQV(Orientation::NATIVE), s4_reverse.MergeQV(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.MergeQV(Orientation::NATIVE), s5_reverse.MergeQV(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.MergeQV(Orientation::NATIVE), s6_reverse.MergeQV(Orientation::GENOMIC));
+
+ EXPECT_NE(s1_reverse.SubstitutionQV(Orientation::NATIVE), s1_reverse.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.SubstitutionQV(Orientation::NATIVE), s2_reverse.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.SubstitutionQV(Orientation::NATIVE), s3_reverse.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.SubstitutionQV(Orientation::NATIVE), s4_reverse.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.SubstitutionQV(Orientation::NATIVE), s5_reverse.SubstitutionQV(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.SubstitutionQV(Orientation::NATIVE), s6_reverse.SubstitutionQV(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revquals, s1_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s2_revquals, s2_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s3_revquals, s3_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s4_revquals, s4_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s5_revquals, s5_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s6_revquals, s6_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+
+ EXPECT_EQ(s1_revquals, s1_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s2_revquals, s2_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s3_revquals, s3_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s4_revquals, s4_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s5_revquals, s5_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s6_revquals, s6_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+
+ EXPECT_EQ(s1_revquals, s1_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s2_revquals, s2_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s3_revquals, s3_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s4_revquals, s4_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s5_revquals, s5_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s6_revquals, s6_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+
+ EXPECT_EQ(s1_revquals, s1_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s2_revquals, s2_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s3_revquals, s3_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s4_revquals, s4_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s5_revquals, s5_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+ EXPECT_EQ(s6_revquals, s6_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+
+ // - unaligned, unclipped native output (native input)
+ EXPECT_EQ(s1_quals, s1_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s2_quals, s2_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s3_quals, s3_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s4_quals, s4_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s5_quals, s5_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s6_quals, s6_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+
+ EXPECT_EQ(s1_quals, s1_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s2_quals, s2_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s3_quals, s3_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s4_quals, s4_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s5_quals, s5_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s6_quals, s6_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+
+ EXPECT_EQ(s1_quals, s1_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s2_quals, s2_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s3_quals, s3_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s4_quals, s4_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s5_quals, s5_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s6_quals, s6_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+
+ EXPECT_EQ(s1_quals, s1_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s2_quals, s2_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s3_quals, s3_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s4_quals, s4_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s5_quals, s5_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+ EXPECT_EQ(s6_quals, s6_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+
+ // - aligned, unclipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revquals_aligned, s1_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_revquals_aligned, s2_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_revquals_aligned, s3_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_revquals_aligned, s4_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_revquals_aligned, s5_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_revquals_aligned, s6_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+
+ EXPECT_EQ(s1_revquals_aligned, s1_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_revquals_aligned, s2_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_revquals_aligned, s3_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_revquals_aligned, s4_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_revquals_aligned, s5_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_revquals_aligned, s6_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+
+ EXPECT_EQ(s1_revquals_aligned, s1_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_revquals_aligned, s2_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_revquals_aligned, s3_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_revquals_aligned, s4_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_revquals_aligned, s5_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_revquals_aligned, s6_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+
+ EXPECT_EQ(s1_revquals_aligned, s1_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s2_revquals_aligned, s2_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s3_revquals_aligned, s3_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s4_revquals_aligned, s4_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s5_revquals_aligned, s5_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+ EXPECT_EQ(s6_revquals_aligned, s6_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+
+ // - aligned, unclipped native output (native input)
+ EXPECT_EQ(s1_quals_aligned, s1_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned, s1_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned, s1_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned, s1_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s2_quals_aligned, s2_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s3_quals_aligned, s3_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s4_quals_aligned, s4_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s5_quals_aligned, s5_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+ EXPECT_EQ(s6_quals_aligned, s6_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+
+ // - aligned, clipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+
+ EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+
+ EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+
+ EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+ EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+
+ // - aligned, clipped native output (native input)
+ EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+
+ EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+ EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+}
+
+TEST(BamRecordTest, BaseTagsClippedAndAligned)
+{
+ const string s1_cigar = "4=3D4=";
+ const string s2_cigar = "4=1D2I2D4=";
+ const string s3_cigar = "4=1D2P2I2P2D4=";
+ const string s4_cigar = "3S4=3D4=3S";
+ const string s5_cigar = "2H4=3D4=3H";
+ const string s6_cigar = "2H3S4=3D4=3S3H";
+
+ const string s1_seq = "AACCGTTA";
+ const string s2_seq = "ATCCTAGGTT";
+ const string s3_seq = "ATCCTAGGTT";
+ const string s4_seq = "TTTAACCGTTACCG";
+ const string s5_seq = "AACCGTTA";
+ const string s6_seq = "TTTAACCGTTACCG";
+
+ const string s1_seq_aligned = "AACC---GTTA";
+ const string s2_seq_aligned = "ATCC-TA--GGTT";
+ const string s3_seq_aligned = "ATCC-**TA**--GGTT";
+ const string s4_seq_aligned = "TTTAACC---GTTACCG";
+ const string s5_seq_aligned = "AACC---GTTA";
+ const string s6_seq_aligned = "TTTAACC---GTTACCG";
+
+ const string s1_seq_aligned_clipped = "AACC---GTTA";
+ const string s2_seq_aligned_clipped = "ATCC-TA--GGTT";
+ const string s3_seq_aligned_clipped = "ATCC-**TA**--GGTT";
+ const string s4_seq_aligned_clipped = "AACC---GTTA";
+ const string s5_seq_aligned_clipped = "AACC---GTTA";
+ const string s6_seq_aligned_clipped = "AACC---GTTA";
+
+ const string s1_revseq = "TAACGGTT";
+ const string s2_revseq = "AACCTAGGAT";
+ const string s3_revseq = "AACCTAGGAT";
+ const string s4_revseq = "CGGTAACGGTTAAA";
+ const string s5_revseq = "TAACGGTT";
+ const string s6_revseq = "CGGTAACGGTTAAA";
+
+ const string s1_revseq_aligned = "TAAC---GGTT";
+ const string s2_revseq_aligned = "AACC-TA--GGAT";
+ const string s3_revseq_aligned = "AACC-**TA**--GGAT";
+ const string s4_revseq_aligned = "CGGTAAC---GGTTAAA";
+ const string s5_revseq_aligned = "TAAC---GGTT";
+ const string s6_revseq_aligned = "CGGTAAC---GGTTAAA";
+
+ const string s1_revseq_aligned_clipped = "TAAC---GGTT";
+ const string s2_revseq_aligned_clipped = "AACC-TA--GGAT";
+ const string s3_revseq_aligned_clipped = "AACC-**TA**--GGAT";
+ const string s4_revseq_aligned_clipped = "TAAC---GGTT";
+ const string s5_revseq_aligned_clipped = "TAAC---GGTT";
+ const string s6_revseq_aligned_clipped = "TAAC---GGTT";
+
+ const BamRecord s1 = tests::MakeCigaredBaseRecord(s1_seq, s1_cigar, false);
+ const BamRecord s2 = tests::MakeCigaredBaseRecord(s2_seq, s2_cigar, false);
+ const BamRecord s3 = tests::MakeCigaredBaseRecord(s3_seq, s3_cigar, false);
+ const BamRecord s4 = tests::MakeCigaredBaseRecord(s4_seq, s4_cigar, false);
+ const BamRecord s5 = tests::MakeCigaredBaseRecord(s5_seq, s5_cigar, false);
+ const BamRecord s6 = tests::MakeCigaredBaseRecord(s6_seq, s6_cigar, false);
+ const BamRecord s1_reverse = tests::MakeCigaredBaseRecord(s1_seq, s1_cigar, true);
+ const BamRecord s2_reverse = tests::MakeCigaredBaseRecord(s2_seq, s2_cigar, true);
+ const BamRecord s3_reverse = tests::MakeCigaredBaseRecord(s3_seq, s3_cigar, true);
+ const BamRecord s4_reverse = tests::MakeCigaredBaseRecord(s4_seq, s4_cigar, true);
+ const BamRecord s5_reverse = tests::MakeCigaredBaseRecord(s5_seq, s5_cigar, true);
+ const BamRecord s6_reverse = tests::MakeCigaredBaseRecord(s6_seq, s6_cigar, true);
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ // - "native" == "genomic"
+ EXPECT_EQ(s1.DeletionTag(Orientation::NATIVE), s1.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2.DeletionTag(Orientation::NATIVE), s2.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3.DeletionTag(Orientation::NATIVE), s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s4.DeletionTag(Orientation::NATIVE), s4.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s5.DeletionTag(Orientation::NATIVE), s5.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s6.DeletionTag(Orientation::NATIVE), s6.DeletionTag(Orientation::GENOMIC));
+
+ EXPECT_EQ(s1.SubstitutionTag(Orientation::NATIVE), s1.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2.SubstitutionTag(Orientation::NATIVE), s2.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3.SubstitutionTag(Orientation::NATIVE), s3.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s4.SubstitutionTag(Orientation::NATIVE), s4.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s5.SubstitutionTag(Orientation::NATIVE), s5.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s6.SubstitutionTag(Orientation::NATIVE), s6.SubstitutionTag(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output == genomic input
+ EXPECT_EQ(s1_seq, s1.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_seq, s2.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_seq, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s4_seq, s4.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s5_seq, s5.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s6_seq, s6.DeletionTag(Orientation::GENOMIC));
+
+ EXPECT_EQ(s1_seq, s1.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_seq, s2.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_seq, s3.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s4_seq, s4.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s5_seq, s5.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s6_seq, s6.SubstitutionTag(Orientation::GENOMIC));
+
+ // - aligned, unclipped genomic output == aligned, unclipped genomic input
+ EXPECT_EQ(s1_seq_aligned, s1.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s2_seq_aligned, s2.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s3_seq_aligned, s3.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s4_seq_aligned, s4.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s5_seq_aligned, s5.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s6_seq_aligned, s6.DeletionTag(Orientation::GENOMIC, true, false));
+
+ EXPECT_EQ(s1_seq_aligned, s1.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s2_seq_aligned, s2.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s3_seq_aligned, s3.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s4_seq_aligned, s4.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s5_seq_aligned, s5.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s6_seq_aligned, s6.SubstitutionTag(Orientation::GENOMIC, true, false));
+
+ // - aligned, clipped genomic output == aligned, clipped genomic output
+ EXPECT_EQ(s1_seq_aligned_clipped, s1.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s2_seq_aligned_clipped, s2.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s3_seq_aligned_clipped, s3.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s4_seq_aligned_clipped, s4.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s5_seq_aligned_clipped, s5.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s6_seq_aligned_clipped, s6.DeletionTag(Orientation::GENOMIC, true, true));
+
+ EXPECT_EQ(s1_seq_aligned_clipped, s1.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s2_seq_aligned_clipped, s2.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s3_seq_aligned_clipped, s3.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s4_seq_aligned_clipped, s4.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s5_seq_aligned_clipped, s5.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s6_seq_aligned_clipped, s6.SubstitutionTag(Orientation::GENOMIC, true, true));
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ // - "native" != "genomic"
+ EXPECT_NE(s1_reverse.DeletionTag(Orientation::NATIVE), s1_reverse.DeletionTag(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.DeletionTag(Orientation::NATIVE), s2_reverse.DeletionTag(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.DeletionTag(Orientation::NATIVE), s3_reverse.DeletionTag(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.DeletionTag(Orientation::NATIVE), s4_reverse.DeletionTag(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.DeletionTag(Orientation::NATIVE), s5_reverse.DeletionTag(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.DeletionTag(Orientation::NATIVE), s6_reverse.DeletionTag(Orientation::GENOMIC));
+
+ EXPECT_NE(s1_reverse.SubstitutionTag(Orientation::NATIVE), s1_reverse.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.SubstitutionTag(Orientation::NATIVE), s2_reverse.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.SubstitutionTag(Orientation::NATIVE), s3_reverse.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.SubstitutionTag(Orientation::NATIVE), s4_reverse.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.SubstitutionTag(Orientation::NATIVE), s5_reverse.SubstitutionTag(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.SubstitutionTag(Orientation::NATIVE), s6_reverse.SubstitutionTag(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revseq, s1_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s2_revseq, s2_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s3_revseq, s3_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s4_revseq, s4_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s5_revseq, s5_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s6_revseq, s6_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+
+ EXPECT_EQ(s1_revseq, s1_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s2_revseq, s2_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s3_revseq, s3_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s4_revseq, s4_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s5_revseq, s5_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+ EXPECT_EQ(s6_revseq, s6_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+
+ // - unaligned, unclipped native output (native input)
+ EXPECT_EQ(s1_seq, s1_reverse.DeletionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s2_seq, s2_reverse.DeletionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s3_seq, s3_reverse.DeletionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s4_seq, s4_reverse.DeletionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s5_seq, s5_reverse.DeletionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s6_seq, s6_reverse.DeletionTag(Orientation::NATIVE, false, false));
+
+ EXPECT_EQ(s1_seq, s1_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s2_seq, s2_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s3_seq, s3_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s4_seq, s4_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s5_seq, s5_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+ EXPECT_EQ(s6_seq, s6_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+
+ // - aligned, unclipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revseq_aligned, s1_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s2_revseq_aligned, s2_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s3_revseq_aligned, s3_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s4_revseq_aligned, s4_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s5_revseq_aligned, s5_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s6_revseq_aligned, s6_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+
+ EXPECT_EQ(s1_revseq_aligned, s1_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s2_revseq_aligned, s2_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s3_revseq_aligned, s3_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s4_revseq_aligned, s4_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s5_revseq_aligned, s5_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+ EXPECT_EQ(s6_revseq_aligned, s6_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+
+ // - aligned, unclipped native output (native input)
+ EXPECT_EQ(s1_seq_aligned, s1_reverse.DeletionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s2_seq_aligned, s2_reverse.DeletionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s3_seq_aligned, s3_reverse.DeletionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s4_seq_aligned, s4_reverse.DeletionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s5_seq_aligned, s5_reverse.DeletionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s6_seq_aligned, s6_reverse.DeletionTag(Orientation::NATIVE, true, false));
+
+ EXPECT_EQ(s1_seq_aligned, s1_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s2_seq_aligned, s2_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s3_seq_aligned, s3_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s4_seq_aligned, s4_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s5_seq_aligned, s5_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+ EXPECT_EQ(s6_seq_aligned, s6_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+
+ // - aligned, clipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revseq_aligned_clipped, s1_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s2_revseq_aligned_clipped, s2_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s3_revseq_aligned_clipped, s3_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s4_revseq_aligned_clipped, s4_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s5_revseq_aligned_clipped, s5_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s6_revseq_aligned_clipped, s6_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+
+ EXPECT_EQ(s1_revseq_aligned_clipped, s1_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s2_revseq_aligned_clipped, s2_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s3_revseq_aligned_clipped, s3_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s4_revseq_aligned_clipped, s4_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s5_revseq_aligned_clipped, s5_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+ EXPECT_EQ(s6_revseq_aligned_clipped, s6_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+
+ // - aligned, clipped native output (native input)
+ EXPECT_EQ(s1_seq_aligned_clipped, s1_reverse.DeletionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s2_seq_aligned_clipped, s2_reverse.DeletionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s3_seq_aligned_clipped, s3_reverse.DeletionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s4_seq_aligned_clipped, s4_reverse.DeletionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s5_seq_aligned_clipped, s5_reverse.DeletionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s6_seq_aligned_clipped, s6_reverse.DeletionTag(Orientation::NATIVE, true, true));
+
+ EXPECT_EQ(s1_seq_aligned_clipped, s1_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s2_seq_aligned_clipped, s2_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s3_seq_aligned_clipped, s3_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s4_seq_aligned_clipped, s4_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s5_seq_aligned_clipped, s5_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+ EXPECT_EQ(s6_seq_aligned_clipped, s6_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+
+}
+
+TEST(BamRecordTest, FrameTagsClippedAndAligned)
+{
+ const string s1_cigar = "4=3D4=";
+ const string s2_cigar = "4=1D2I2D4=";
+ const string s3_cigar = "4=1D2P2I2P2D4=";
+ const string s4_cigar = "3S4=3D4=3S";
+ const string s5_cigar = "2H4=3D4=3H";
+ const string s6_cigar = "2H3S4=3D4=3S3H";
+
+ typedef vector<uint16_t> f_data;
+
+ const f_data s1_frames = { 10, 20, 10, 20, 10, 20, 10, 30 };
+ const f_data s2_frames = { 10, 20, 10, 20, 80, 70, 10, 20, 10, 30 };
+ const f_data s3_frames = { 10, 20, 10, 20, 80, 70, 10, 20, 10, 30 };
+ const f_data s4_frames = { 40, 40, 40, 10, 20, 10, 20, 10, 20, 10, 30, 50, 50, 50 };
+ const f_data s5_frames = { 10, 20, 10, 20, 10, 20, 10, 30 };
+ const f_data s6_frames = { 40, 40, 40, 10, 20, 10, 20, 10, 20, 10, 30, 50, 50, 50 };
+
+ const f_data s1_frames_aligned = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s2_frames_aligned = { 10, 20, 10, 20, 0, 80, 70, 0, 0, 10, 20, 10, 30 };
+ const f_data s3_frames_aligned = { 10, 20, 10, 20, 0, 0, 0, 80, 70, 0, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s4_frames_aligned = { 40, 40, 40, 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30, 50, 50, 50 };
+ const f_data s5_frames_aligned = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s6_frames_aligned = { 40, 40, 40, 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30, 50, 50, 50 };
+
+ const f_data s1_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s2_frames_aligned_clipped = { 10, 20, 10, 20, 0, 80, 70, 0, 0, 10, 20, 10, 30 };
+ const f_data s3_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 80, 70, 0, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s4_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s5_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+ const f_data s6_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+
+ const f_data s1_revframes = { 30, 10, 20, 10, 20, 10, 20, 10 };
+ const f_data s2_revframes = { 30, 10, 20, 10, 70, 80, 20, 10, 20, 10 };
+ const f_data s3_revframes = { 30, 10, 20, 10, 70, 80, 20, 10, 20, 10 };
+ const f_data s4_revframes = { 50, 50, 50, 30, 10, 20, 10, 20, 10, 20, 10, 40, 40, 40 };
+ const f_data s5_revframes = { 30, 10, 20, 10, 20, 10, 20, 10 };
+ const f_data s6_revframes = { 50, 50, 50, 30, 10, 20, 10, 20, 10, 20, 10, 40, 40, 40 };
+
+ const f_data s1_revframes_aligned = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s2_revframes_aligned = { 30, 10, 20, 10, 0, 70, 80, 0, 0, 20, 10, 20, 10 };
+ const f_data s3_revframes_aligned = { 30, 10, 20, 10, 0, 0, 0, 70, 80, 0, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s4_revframes_aligned = { 50, 50, 50, 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10, 40, 40, 40 };
+ const f_data s5_revframes_aligned = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s6_revframes_aligned = { 50, 50, 50, 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10, 40, 40, 40 };
+
+ const f_data s1_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s2_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 70, 80, 0, 0, 20, 10, 20, 10 };
+ const f_data s3_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 70, 80, 0, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s4_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s5_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+ const f_data s6_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+
+ const BamRecord s1 = tests::MakeCigaredFrameRecord(s1_frames, s1_cigar, false);
+ const BamRecord s2 = tests::MakeCigaredFrameRecord(s2_frames, s2_cigar, false);
+ const BamRecord s3 = tests::MakeCigaredFrameRecord(s3_frames, s3_cigar, false);
+ const BamRecord s4 = tests::MakeCigaredFrameRecord(s4_frames, s4_cigar, false);
+ const BamRecord s5 = tests::MakeCigaredFrameRecord(s5_frames, s5_cigar, false);
+ const BamRecord s6 = tests::MakeCigaredFrameRecord(s6_frames, s6_cigar, false);
+ const BamRecord s1_reverse = tests::MakeCigaredFrameRecord(s1_frames, s1_cigar, true);
+ const BamRecord s2_reverse = tests::MakeCigaredFrameRecord(s2_frames, s2_cigar, true);
+ const BamRecord s3_reverse = tests::MakeCigaredFrameRecord(s3_frames, s3_cigar, true);
+ const BamRecord s4_reverse = tests::MakeCigaredFrameRecord(s4_frames, s4_cigar, true);
+ const BamRecord s5_reverse = tests::MakeCigaredFrameRecord(s5_frames, s5_cigar, true);
+ const BamRecord s6_reverse = tests::MakeCigaredFrameRecord(s6_frames, s6_cigar, true);
+
+ // ----------------
+ // forward strand
+ // ----------------
+
+ // - "native" == "genomic"
+ EXPECT_EQ(s1.IPD(Orientation::NATIVE), s1.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(s2.IPD(Orientation::NATIVE), s2.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(s3.IPD(Orientation::NATIVE), s3.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(s4.IPD(Orientation::NATIVE), s4.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(s5.IPD(Orientation::NATIVE), s5.IPD(Orientation::GENOMIC));
+ EXPECT_EQ(s6.IPD(Orientation::NATIVE), s6.IPD(Orientation::GENOMIC));
+
+ EXPECT_EQ(s1.PulseWidth(Orientation::NATIVE), s1.PulseWidth(Orientation::GENOMIC));
+ EXPECT_EQ(s2.PulseWidth(Orientation::NATIVE), s2.PulseWidth(Orientation::GENOMIC));
+ EXPECT_EQ(s3.PulseWidth(Orientation::NATIVE), s3.PulseWidth(Orientation::GENOMIC));
+ EXPECT_EQ(s4.PulseWidth(Orientation::NATIVE), s4.PulseWidth(Orientation::GENOMIC));
+ EXPECT_EQ(s5.PulseWidth(Orientation::NATIVE), s5.PulseWidth(Orientation::GENOMIC));
+ EXPECT_EQ(s6.PulseWidth(Orientation::NATIVE), s6.PulseWidth(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output == genomic input
+ EXPECT_EQ(s1_frames, s1.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s2_frames, s2.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s3_frames, s3.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s4_frames, s4.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s5_frames, s5.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s6_frames, s6.IPD(Orientation::GENOMIC).Data());
+
+ EXPECT_EQ(s1_frames, s1.PulseWidth(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s2_frames, s2.PulseWidth(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s3_frames, s3.PulseWidth(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s4_frames, s4.PulseWidth(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s5_frames, s5.PulseWidth(Orientation::GENOMIC).Data());
+ EXPECT_EQ(s6_frames, s6.PulseWidth(Orientation::GENOMIC).Data());
+
+ // - aligned, unclipped genomic output == aligned, unclipped genomic input
+ EXPECT_EQ(s1_frames_aligned, s1.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s2_frames_aligned, s2.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s3_frames_aligned, s3.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s4_frames_aligned, s4.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s5_frames_aligned, s5.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s6_frames_aligned, s6.IPD(Orientation::GENOMIC, true, false).Data());
+
+ EXPECT_EQ(s1_frames_aligned, s1.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s2_frames_aligned, s2.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s3_frames_aligned, s3.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s4_frames_aligned, s4.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s5_frames_aligned, s5.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s6_frames_aligned, s6.PulseWidth(Orientation::GENOMIC, true, false).Data());
+
+ // - aligned, clipped genomic output == aligned, clipped genomic output
+ EXPECT_EQ(s1_frames_aligned_clipped, s1.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s2_frames_aligned_clipped, s2.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s3_frames_aligned_clipped, s3.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s4_frames_aligned_clipped, s4.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s5_frames_aligned_clipped, s5.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s6_frames_aligned_clipped, s6.IPD(Orientation::GENOMIC, true, true).Data());
+
+ EXPECT_EQ(s1_frames_aligned_clipped, s1.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s2_frames_aligned_clipped, s2.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s3_frames_aligned_clipped, s3.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s4_frames_aligned_clipped, s4.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s5_frames_aligned_clipped, s5.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s6_frames_aligned_clipped, s6.PulseWidth(Orientation::GENOMIC, true, true).Data());
+
+ // ----------------
+ // reverse strand
+ // ----------------
+
+ // - "native" != "genomic"
+ EXPECT_NE(s1_reverse.IPD(Orientation::NATIVE), s1_reverse.IPD(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.IPD(Orientation::NATIVE), s2_reverse.IPD(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.IPD(Orientation::NATIVE), s3_reverse.IPD(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.IPD(Orientation::NATIVE), s4_reverse.IPD(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.IPD(Orientation::NATIVE), s5_reverse.IPD(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.IPD(Orientation::NATIVE), s6_reverse.IPD(Orientation::GENOMIC));
+
+ EXPECT_NE(s1_reverse.PulseWidth(Orientation::NATIVE), s1_reverse.PulseWidth(Orientation::GENOMIC));
+ EXPECT_NE(s2_reverse.PulseWidth(Orientation::NATIVE), s2_reverse.PulseWidth(Orientation::GENOMIC));
+ EXPECT_NE(s3_reverse.PulseWidth(Orientation::NATIVE), s3_reverse.PulseWidth(Orientation::GENOMIC));
+ EXPECT_NE(s4_reverse.PulseWidth(Orientation::NATIVE), s4_reverse.PulseWidth(Orientation::GENOMIC));
+ EXPECT_NE(s5_reverse.PulseWidth(Orientation::NATIVE), s5_reverse.PulseWidth(Orientation::GENOMIC));
+ EXPECT_NE(s6_reverse.PulseWidth(Orientation::NATIVE), s6_reverse.PulseWidth(Orientation::GENOMIC));
+
+ // - unaligned, unclipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revframes, s1_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s2_revframes, s2_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s3_revframes, s3_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s4_revframes, s4_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s5_revframes, s5_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s6_revframes, s6_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+
+ EXPECT_EQ(s1_revframes, s1_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s2_revframes, s2_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s3_revframes, s3_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s4_revframes, s4_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s5_revframes, s5_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+ EXPECT_EQ(s6_revframes, s6_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+
+ // - unaligned, unclipped native output (native input)
+ EXPECT_EQ(s1_frames, s1_reverse.IPD(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s2_frames, s2_reverse.IPD(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s3_frames, s3_reverse.IPD(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s4_frames, s4_reverse.IPD(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s5_frames, s5_reverse.IPD(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s6_frames, s6_reverse.IPD(Orientation::NATIVE, false, false).Data());
+
+ EXPECT_EQ(s1_frames, s1_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s2_frames, s2_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s3_frames, s3_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s4_frames, s4_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s5_frames, s5_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+ EXPECT_EQ(s6_frames, s6_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+
+ // - aligned, unclipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revframes_aligned, s1_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s2_revframes_aligned, s2_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s3_revframes_aligned, s3_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s4_revframes_aligned, s4_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s5_revframes_aligned, s5_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s6_revframes_aligned, s6_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+
+ EXPECT_EQ(s1_revframes_aligned, s1_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s2_revframes_aligned, s2_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s3_revframes_aligned, s3_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s4_revframes_aligned, s4_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s5_revframes_aligned, s5_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+ EXPECT_EQ(s6_revframes_aligned, s6_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+
+ // - aligned, unclipped native output (native input)
+ EXPECT_EQ(s1_frames_aligned, s1_reverse.IPD(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s2_frames_aligned, s2_reverse.IPD(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s3_frames_aligned, s3_reverse.IPD(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s4_frames_aligned, s4_reverse.IPD(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s5_frames_aligned, s5_reverse.IPD(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s6_frames_aligned, s6_reverse.IPD(Orientation::NATIVE, true, false).Data());
+
+ EXPECT_EQ(s1_frames_aligned, s1_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s2_frames_aligned, s2_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s3_frames_aligned, s3_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s4_frames_aligned, s4_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s5_frames_aligned, s5_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+ EXPECT_EQ(s6_frames_aligned, s6_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+
+ // - aligned, clipped genomic output (rev-comp of native input)
+ EXPECT_EQ(s1_revframes_aligned_clipped, s1_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s2_revframes_aligned_clipped, s2_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s3_revframes_aligned_clipped, s3_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s4_revframes_aligned_clipped, s4_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s5_revframes_aligned_clipped, s5_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s6_revframes_aligned_clipped, s6_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+
+ EXPECT_EQ(s1_revframes_aligned_clipped, s1_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s2_revframes_aligned_clipped, s2_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s3_revframes_aligned_clipped, s3_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s4_revframes_aligned_clipped, s4_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s5_revframes_aligned_clipped, s5_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+ EXPECT_EQ(s6_revframes_aligned_clipped, s6_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+
+ // - aligned, clipped native output (native input)
+ EXPECT_EQ(s1_frames_aligned_clipped, s1_reverse.IPD(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s2_frames_aligned_clipped, s2_reverse.IPD(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s3_frames_aligned_clipped, s3_reverse.IPD(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s4_frames_aligned_clipped, s4_reverse.IPD(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s5_frames_aligned_clipped, s5_reverse.IPD(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s6_frames_aligned_clipped, s6_reverse.IPD(Orientation::NATIVE, true, true).Data());
+
+ EXPECT_EQ(s1_frames_aligned_clipped, s1_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s2_frames_aligned_clipped, s2_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s3_frames_aligned_clipped, s3_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s4_frames_aligned_clipped, s4_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s5_frames_aligned_clipped, s5_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+ EXPECT_EQ(s6_frames_aligned_clipped, s6_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+}
diff --git a/tests/src/test_BamRecordBuilder.cpp b/tests/src/test_BamRecordBuilder.cpp
new file mode 100644
index 0000000..d1287d5
--- /dev/null
+++ b/tests/src/test_BamRecordBuilder.cpp
@@ -0,0 +1,274 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordBuilder.h>
+#include <pbbam/BamTagCodec.h>
+#include <chrono>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+namespace tests {
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+ // ensure raw data (lengths at least) matches API-facing data
+
+ const uint32_t expectedNameLength = bam.Name().size() + 1;
+ const uint32_t expectedNumCigarOps = bam.CigarData().size();
+ const int32_t expectedSeqLength = bam.Sequence().length();
+ const size_t expectedTagsLength = BamTagCodec::Encode(bam.Tags()).size();
+
+ // Name CIGAR Sequence Quals Tags
+ // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + << TAGS >>
+
+ const int expectedTotalDataLength = expectedNameLength +
+ (expectedNumCigarOps * 4) +
+ (expectedSeqLength+1)/2 +
+ expectedSeqLength +
+ expectedTagsLength;
+
+ EXPECT_TRUE((bool)bam.d_);
+ EXPECT_EQ(expectedNameLength, bam.d_->core.l_qname);
+ EXPECT_EQ(expectedNumCigarOps, bam.d_->core.n_cigar);
+ EXPECT_EQ(expectedSeqLength, bam.d_->core.l_qseq);
+ EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+static
+void CheckRawData(const BamRecord& bam)
+{ CheckRawData(bam.impl_); }
+
+} // namespace tests
+
+TEST(BamRecordBuilderTest, DefaultValues)
+{
+ BamRecordBuilder builder;
+ BamRecord bam = builder.Build();
+
+ const PBBAM_SHARED_PTR<bam1_t> rawData = bam.impl_.d_;
+ ASSERT_TRUE((bool)rawData);
+
+ // fixed-length (core) data
+ EXPECT_EQ(0, rawData->core.tid);
+ EXPECT_EQ(0, rawData->core.pos);
+ EXPECT_EQ(0, rawData->core.bin);
+ EXPECT_EQ(0, rawData->core.qual);
+ EXPECT_EQ(1, rawData->core.l_qname); // initialized w/ NULL-term
+ EXPECT_EQ(0, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(0, rawData->core.mtid);
+ EXPECT_EQ(0, rawData->core.mpos);
+ EXPECT_EQ(0, rawData->core.isize);
+
+ // variable length data
+ EXPECT_TRUE(rawData->data != nullptr);
+ EXPECT_EQ(1, rawData->l_data);
+ EXPECT_EQ((int)0x800, rawData->m_data); // check this if we change or tune later
+
+ // -------------------------------
+ // check data via API calls
+ // -------------------------------
+
+ EXPECT_EQ(0, bam.impl_.Bin());
+ EXPECT_EQ(0, bam.impl_.Flag());
+ EXPECT_EQ(0, bam.impl_.InsertSize());
+ EXPECT_EQ(0, bam.impl_.MapQuality());
+ EXPECT_EQ(0, bam.impl_.MateReferenceId());
+ EXPECT_EQ(0, bam.impl_.MatePosition());
+ EXPECT_EQ(0, bam.impl_.Position());
+ EXPECT_EQ(0, bam.impl_.ReferenceId());
+ EXPECT_EQ(0, bam.impl_.Tags().size());
+
+ EXPECT_FALSE(bam.impl_.IsDuplicate());
+ EXPECT_FALSE(bam.impl_.IsFailedQC());
+ EXPECT_FALSE(bam.impl_.IsFirstMate());
+ EXPECT_TRUE(bam.impl_.IsMapped());
+ EXPECT_TRUE(bam.impl_.IsMateMapped());
+ EXPECT_FALSE(bam.impl_.IsMateReverseStrand());
+ EXPECT_FALSE(bam.impl_.IsPaired());
+ EXPECT_TRUE(bam.impl_.IsPrimaryAlignment());
+ EXPECT_FALSE(bam.impl_.IsProperPair());
+ EXPECT_FALSE(bam.impl_.IsReverseStrand());
+ EXPECT_FALSE(bam.impl_.IsSecondMate());
+ EXPECT_FALSE(bam.impl_.IsSupplementaryAlignment());
+
+ const std::string emptyString = "";
+ EXPECT_EQ(emptyString, bam.impl_.Name());
+ EXPECT_EQ(emptyString, bam.impl_.CigarData().ToStdString());
+ EXPECT_EQ(emptyString, bam.impl_.Sequence());
+ EXPECT_EQ(emptyString, bam.impl_.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordBuilderTest, CheckSetters)
+{
+ // should be 28 bytes, encoded
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+
+ BamRecordBuilder builder;
+ builder.Bin(42)
+ .Flag(42)
+ .InsertSize(42)
+ .MapQuality(42)
+ .MatePosition(42)
+ .MateReferenceId(42)
+ .Position(42)
+ .ReferenceId(42)
+ .Tags(tags);
+
+ BamRecord bam = builder.Build();
+
+ // -------------------------------
+ // check raw data
+ // -------------------------------
+
+ const PBBAM_SHARED_PTR<bam1_t> rawData = bam.impl_.d_;
+ ASSERT_TRUE((bool)rawData);
+
+ // fixed-length (core) data
+ EXPECT_EQ(42, rawData->core.tid);
+ EXPECT_EQ(42, rawData->core.pos);
+ EXPECT_EQ(42, rawData->core.bin);
+ EXPECT_EQ(42, rawData->core.qual);
+ EXPECT_EQ(1, rawData->core.l_qname); // initialized w/ NULL-term
+ EXPECT_EQ(42, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(42, rawData->core.mtid);
+ EXPECT_EQ(42, rawData->core.mpos);
+ EXPECT_EQ(42, rawData->core.isize);
+
+ // variable length data
+ EXPECT_TRUE(rawData->data != nullptr);
+ EXPECT_EQ(29, rawData->l_data); // NULL-term qname + tags
+ EXPECT_EQ((int)0x800, rawData->m_data); // check this if we change or tune later
+
+ // -------------------------------
+ // check data via API calls
+ // -------------------------------
+
+ EXPECT_EQ(42, bam.impl_.Bin());
+ EXPECT_EQ(42, bam.impl_.Flag());
+ EXPECT_EQ(42, bam.impl_.InsertSize());
+ EXPECT_EQ(42, bam.impl_.MapQuality());
+ EXPECT_EQ(42, bam.impl_.MateReferenceId());
+ EXPECT_EQ(42, bam.impl_.MatePosition());
+ EXPECT_EQ(42, bam.impl_.Position());
+ EXPECT_EQ(42, bam.impl_.ReferenceId());
+
+ const TagCollection& fetchedTags = bam.impl_.Tags();
+
+ EXPECT_TRUE(fetchedTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags.at("CA").ToUInt8Array());
+}
+
+//#define SEQ_LENGTH 7000
+//#define NUM_RECORDS 1000
+
+//const std::string& TEST_SEQUENCE = std::string(SEQ_LENGTH, 'G');
+//const std::string& TEST_QUALITIES = std::string(SEQ_LENGTH, '=');
+//const std::string& TEST_NAME = std::string(SEQ_LENGTH, '/');
+//const std::string& TEST_TAGDATA = std::string(SEQ_LENGTH, '2');
+
+//TEST(BamRecordBuilderTest, JustDoingSomeTimings_BamRecordBuilder)
+//{
+
+// BamRecordBuilder builder;
+
+// TagCollection tags;
+// tags["aa"] = TEST_TAGDATA;
+// tags["bb"] = TEST_TAGDATA;
+// tags["cc"] = TEST_TAGDATA;
+// tags["dd"] = TEST_TAGDATA;
+// tags["ee"] = TEST_TAGDATA;
+// tags["ff"] = TEST_TAGDATA;
+
+// auto start = std::chrono::steady_clock::now();
+
+// BamRecord record;
+// for (size_t i = 0; i < NUM_RECORDS; ++i) {
+// builder.Sequence(TEST_SEQUENCE)
+// .Qualities(TEST_QUALITIES)
+// .Name(TEST_NAME)
+// .Tags(tags)
+// .BuildInPlace(record);
+// }
+// auto end = std::chrono::steady_clock::now();
+// (void)record;
+// auto diff = end - start;
+// std::cout << std::chrono::duration <double, std::milli>(diff).count() << " ms" << std::endl;
+//}
+
+
+//TEST(BamRecordBuilderTest, JustDoingSomeTimings_BamRecordOnly)
+//{
+// TagCollection tags;
+// tags["aa"] = TEST_TAGDATA;
+// tags["bb"] = TEST_TAGDATA;
+// tags["cc"] = TEST_TAGDATA;
+// tags["dd"] = TEST_TAGDATA;
+// tags["ee"] = TEST_TAGDATA;
+// tags["ff"] = TEST_TAGDATA;
+
+// auto start = std::chrono::steady_clock::now();
+
+// BamRecord record;
+// for (size_t i = 0; i < NUM_RECORDS; ++i) {
+// record.SetSequenceAndQualities(TEST_SEQUENCE, TEST_QUALITIES);
+// record.Name(TEST_NAME);
+// record.Tags(tags);
+// }
+// auto end = std::chrono::steady_clock::now();
+// (void)record;
+// auto diff = end - start;
+// std::cout << std::chrono::duration <double, std::milli>(diff).count() << " ms" << std::endl;
+//}
+
diff --git a/tests/src/test_BamRecordClipping.cpp b/tests/src/test_BamRecordClipping.cpp
new file mode 100644
index 0000000..425b1e5
--- /dev/null
+++ b/tests/src/test_BamRecordClipping.cpp
@@ -0,0 +1,1187 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamTagCodec.h>
+#include <chrono>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+typedef vector<uint16_t> f_data;
+
+namespace tests {
+
+static
+BamRecord MakeRecord(const Position qStart,
+ const Position qEnd,
+ const string& seq,
+ const string& quals,
+ const string& tagBases,
+ const string& tagQuals,
+ const f_data& frames,
+ const string& pulseCall = "")
+{
+ BamRecordImpl impl;
+ impl.SetSequenceAndQualities(seq, quals);
+
+ TagCollection tags;
+ tags["qs"] = qStart;
+ tags["qe"] = qEnd;
+ tags["pa"] = frames;
+ tags["pm"] = frames;
+ tags["ip"] = frames;
+ tags["pw"] = frames;
+ tags["dt"] = tagBases;
+ tags["st"] = tagBases;
+ tags["pt"] = tagBases;
+ tags["dq"] = tagQuals;
+ tags["iq"] = tagQuals;
+ tags["mq"] = tagQuals;
+ tags["sq"] = tagQuals;
+ tags["pq"] = tagQuals;
+ tags["pv"] = tagQuals;
+ tags["pg"] = tagQuals;
+ tags["pc"] = pulseCall;
+ impl.Tags(tags);
+
+ return BamRecord(std::move(impl));
+}
+
+} // namespace tests
+
+TEST(BamRecordClippingTest, ClipToQuery_Basic)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string pulseCall = "ttAaAtaCCGggatTTAcatGCt";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+
+ const Position clipStart = 502;
+ const Position clipEnd = 509;
+
+ const string seq_clipped = "CCGTTAG";
+ const string quals_clipped = "?]?]?]?";
+ const string tagBases_clipped = "CCGTTAG";
+ const string tagQuals_clipped = "?]?]?]?";
+ const f_data frames_clipped = { 20, 20, 30, 40, 40, 10, 30 };
+
+ const string seq_rev = "GCTAACGGTT";
+ const string pulseCall_rev = "aGCatgTAAatccCGGtaTtTaa";
+ const string quals_rev = "*?]?]?]?]?";
+ const string tagQuals_rev = quals_rev;
+ const f_data frames_rev = { 20, 30, 10, 40, 40, 30, 20, 20, 10, 10 };
+
+ const string seq_rev_clipped = "TAACGGT";
+ const string quals_rev_clipped = "]?]?]?]";
+ const string tagBases_rev_clipped = seq_rev_clipped;
+ const string tagQuals_rev_clipped = quals_rev_clipped;
+ const f_data frames_rev_clipped = { 10, 40, 40, 30, 20, 20, 10 };
+
+ const string s1_cigar = "10=";
+ const string s2_cigar = "5=3D5=";
+ const string s3_cigar = "4=1D2I2D4=";
+
+ const string s1_cigar_clipped = "7=";
+ const string s2_cigar_clipped = "3=3D4=";
+ const string s3_cigar_clipped = "2=1D2I2D3=";
+
+ const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames, pulseCall);
+ BamRecord s0 = prototype; // unmapped record
+ BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+ BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+ BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+ BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+ BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+ BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+ s0.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s1.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s2.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s3.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s1_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s2_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s3_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+ // s0
+ EXPECT_FALSE(s0.IsMapped());
+ EXPECT_EQ(clipStart, s0.QueryStart());
+ EXPECT_EQ(clipEnd, s0.QueryEnd());
+ EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.AlignedStart());
+ EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.AlignedEnd());
+ EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.ReferenceStart());
+ EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.ReferenceEnd());
+ EXPECT_EQ(seq_clipped, s0.Sequence());
+ EXPECT_EQ(quals_clipped, s0.Qualities().Fastq());
+ EXPECT_EQ(tagBases_clipped, s0.DeletionTag());
+ EXPECT_EQ(tagQuals_clipped, s0.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s0.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s0.AltLabelQV().Fastq());
+ EXPECT_EQ(frames_clipped, s0.IPD().Data());
+ EXPECT_EQ(pulseCall, s0.PulseCall());
+
+ // s1 - FORWARD
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+ EXPECT_EQ(clipStart, s1.QueryStart());
+ EXPECT_EQ(clipEnd, s1.QueryEnd());
+ EXPECT_EQ(clipStart, s1.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s1.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s1.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(109, s1.ReferenceEnd()); // RefStart + 7=
+
+ EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_clipped, s1.Sequence());
+ EXPECT_EQ(quals_clipped, s1.Qualities().Fastq());
+ EXPECT_EQ(tagBases_clipped, s1.DeletionTag());
+ EXPECT_EQ(tagQuals_clipped, s1.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s1.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s1.AltLabelQV().Fastq());
+ EXPECT_EQ(frames_clipped, s1.IPD().Data());
+ EXPECT_EQ(pulseCall, s1.PulseCall());
+
+ // s1 - REVERSE
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+ EXPECT_EQ(clipStart, s1_rev.QueryStart());
+ EXPECT_EQ(clipEnd, s1_rev.QueryEnd());
+ EXPECT_EQ(clipStart, s1_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s1_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s1_rev.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(109, s1_rev.ReferenceEnd()); // RefStart + 7=
+
+ EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_rev_clipped, s1_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev_clipped, s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev_clipped, s1_rev.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(pulseCall_rev, s1_rev.PulseCall(Orientation::GENOMIC));
+
+ // s2 - FORWARD
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+ EXPECT_EQ(clipStart, s2.QueryStart());
+ EXPECT_EQ(clipEnd, s2.QueryEnd());
+ EXPECT_EQ(clipStart, s2.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s2.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s2.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(112, s2.ReferenceEnd()); // RefStart + 7= + 3D
+
+ EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_clipped, s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_clipped, s2.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals, s2.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_clipped, s2.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - REVERSE
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+ EXPECT_EQ(clipStart, s2_rev.QueryStart());
+ EXPECT_EQ(clipEnd, s2_rev.QueryEnd());
+ EXPECT_EQ(clipStart, s2_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s2_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s2_rev.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(112, s2_rev.ReferenceEnd()); // RefStart + 7= + 3D
+
+ EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_rev_clipped, s2_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev_clipped, s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev_clipped, s2_rev.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(pulseCall_rev, s2_rev.PulseCall(Orientation::GENOMIC));
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(clipStart, s3.QueryStart());
+ EXPECT_EQ(clipEnd, s3.QueryEnd());
+ EXPECT_EQ(clipStart, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s3.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(110, s3.ReferenceEnd()); // RefStart + 5= + 3D
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals, s3.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - REVERSE
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+ EXPECT_EQ(clipStart, s3_rev.QueryStart());
+ EXPECT_EQ(clipEnd, s3_rev.QueryEnd());
+ EXPECT_EQ(clipStart, s3_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s3_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s3_rev.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(110, s3_rev.ReferenceEnd()); // RefStart + 5= + 3D
+
+ EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_rev_clipped, s3_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev_clipped, s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev_clipped, s3_rev.IPD(Orientation::GENOMIC).Data());
+ EXPECT_EQ(pulseCall_rev, s3_rev.PulseCall(Orientation::GENOMIC));
+}
+
+TEST(BamRecordClippingTest, ClipToQuery_WithSoftClips)
+{
+ const Position qStart = 500;
+ const Position qEnd = 515;
+ const string seq = "TTAACCGTTAGCAAA";
+ const string quals = "--?]?]?]?]?*+++";
+ const string tagBases = "TTAACCGTTAGCAAA";
+ const string tagQuals = "--?]?]?]?]?*+++";
+ const string tagQuals_rev = "+++*?]?]?]?]?--";
+ const f_data frames = { 40, 40, 10, 10, 20, 20, 30, 40, 40, 10, 30, 20, 10, 10, 10 };
+
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+
+ const Position clipStart = 502;
+ const Position clipEnd = 509;
+
+ const string s1_cigar = "2S10=3S";
+ const string s1_cigar_clipped = "7=";
+ const string s1_seq_clipped = "AACCGTT";
+ const string s1_quals_clipped = "?]?]?]?";
+ const string s1_tagBases_clipped = s1_seq_clipped;
+ const string s1_tagQuals_clipped = s1_quals_clipped;
+ const f_data s1_frames_clipped = { 10, 10, 20, 20, 30, 40, 40 };
+ const string s1_seq_rev_clipped = "TGCTAAC";
+ const string s1_quals_rev_clipped = "+*?]?]?";
+ const string s1_tagBases_rev_clipped = s1_seq_rev_clipped;
+ const string s1_tagQuals_rev_clipped = s1_quals_rev_clipped;
+ const f_data s1_frames_rev_clipped = { 10, 20, 30, 10, 40, 40, 30 };
+
+ const string s2_cigar = "2S5=3D5=3S";
+ const string s2_cigar_clipped = "5=3D2=";
+ const string s2_seq_clipped = "AACCGTT";
+ const string s2_quals_clipped = "?]?]?]?";
+ const string s2_tagBases_clipped = s2_seq_clipped;
+ const string s2_tagQuals_clipped = s2_quals_clipped;
+ const f_data s2_frames_clipped = { 10, 10, 20, 20, 30, 40, 40 };
+ const string s2_seq_rev_clipped = "TGCTAAC";
+ const string s2_quals_rev_clipped = "+*?]?]?";
+ const string s2_tagBases_rev_clipped = s2_seq_rev_clipped;
+ const string s2_tagQuals_rev_clipped = s2_quals_rev_clipped;
+ const f_data s2_frames_rev_clipped = { 10, 20, 30, 10, 40, 40, 30 };
+
+ const string s3_cigar = "2S4=1D2I2D4=3S";
+ const string s3_cigar_clipped = "4=1D2I2D1=";
+ const string s3_seq_clipped = "AACCGTT";
+ const string s3_quals_clipped = "?]?]?]?";
+ const string s3_tagBases_clipped = s3_seq_clipped;
+ const string s3_tagQuals_clipped = s3_quals_clipped;
+ const f_data s3_frames_clipped = { 10, 10, 20, 20, 30, 40, 40 };
+ const string s3_seq_rev_clipped = "TGCTAAC";
+ const string s3_quals_rev_clipped = "+*?]?]?";
+ const string s3_tagBases_rev_clipped = s3_seq_rev_clipped;
+ const string s3_tagQuals_rev_clipped = s3_quals_rev_clipped;
+ const f_data s3_frames_rev_clipped = { 10, 20, 30, 10, 40, 40, 30 };
+
+ const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+ BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+ BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+ BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+ BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+ BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+ // sanity checks before clipping
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(tPos, s1.ReferenceStart());
+ EXPECT_EQ(tPos + 10, s1.ReferenceEnd()); // 10=
+
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(tPos, s1_rev.ReferenceStart());
+ EXPECT_EQ(tPos + 10, s1_rev.ReferenceEnd()); // 10=
+
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(tPos, s2.ReferenceStart());
+ EXPECT_EQ(tPos + 13, s2.ReferenceEnd()); // 5= + 3D + 5=
+
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(tPos, s2_rev.ReferenceStart());
+ EXPECT_EQ(tPos + 13, s2_rev.ReferenceEnd()); // 5= + 3D + 5=
+
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(tPos, s3.ReferenceStart());
+ EXPECT_EQ(tPos + 11, s3.ReferenceEnd()); // 4= + 1D + 2D + 4=
+
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(tPos, s3_rev.ReferenceStart());
+ EXPECT_EQ(tPos + 11, s3_rev.ReferenceEnd()); // 4= + 1D + 2D + 4=
+
+ s1.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s2.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s3.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s1_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s2_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+ s3_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+ // s1 - FORWARD
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+ EXPECT_EQ(clipStart, s1.QueryStart());
+ EXPECT_EQ(clipEnd, s1.QueryEnd());
+ EXPECT_EQ(clipStart, s1.AlignedStart()); // queryStart (no soft clips left)
+ EXPECT_EQ(clipEnd, s1.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(tPos, s1.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 7, s1.ReferenceEnd()); // RefStart + 7=
+
+ EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+ EXPECT_EQ(s1_seq_clipped, s1.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s1_quals_clipped, s1.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_tagBases_clipped, s1.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s1_tagQuals_clipped, s1.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_clipped, s1.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_clipped, s1.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_frames_clipped, s1.IPD(Orientation::GENOMIC).Data());
+
+ // s1 - REVERSE
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+ EXPECT_EQ(clipStart, s1_rev.QueryStart());
+ EXPECT_EQ(clipEnd, s1_rev.QueryEnd());
+ EXPECT_EQ(clipStart, s1_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s1_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(tPos, s1_rev.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(tPos + 7, s1_rev.ReferenceEnd()); // RefStart + 7=
+
+ EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s1_seq_rev_clipped, s1_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s1_quals_rev_clipped, s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_frames_rev_clipped, s1_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - FORWARD
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+ EXPECT_EQ(clipStart, s2.QueryStart());
+ EXPECT_EQ(clipEnd, s2.QueryEnd());
+ EXPECT_EQ(clipStart, s2.AlignedStart()); // queryStart (no soft clips left)
+ EXPECT_EQ(clipEnd, s2.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(tPos, s2.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(tPos + 10, s2.ReferenceEnd()); // RefStart + 5=3D2=
+
+ EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+ EXPECT_EQ(s2_seq_clipped, s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_quals_clipped, s2.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_clipped, s2.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_clipped, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_frames_clipped, s2.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - REVERSE
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+ EXPECT_EQ(clipStart, s2_rev.QueryStart());
+ EXPECT_EQ(clipEnd, s2_rev.QueryEnd());
+ EXPECT_EQ(clipStart, s2_rev.AlignedStart()); // queryStart (no soft clips left)
+ EXPECT_EQ(clipEnd, s2_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(tPos, s2_rev.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(tPos + 10, s2_rev.ReferenceEnd()); // RefStart + 5=3D2=
+
+ EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s2_seq_rev_clipped, s2_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_quals_rev_clipped, s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_frames_rev_clipped, s2_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(clipStart, s3.QueryStart());
+ EXPECT_EQ(clipEnd, s3.QueryEnd());
+ EXPECT_EQ(clipStart, s3.AlignedStart()); // queryStart (no soft clips left)
+ EXPECT_EQ(clipEnd, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(tPos, s3.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(tPos + 8, s3.ReferenceEnd()); // RefStart + 4=1D2D1=
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - REVERSE
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+ EXPECT_EQ(clipStart, s3_rev.QueryStart());
+ EXPECT_EQ(clipEnd, s3_rev.QueryEnd());
+ EXPECT_EQ(clipStart, s3_rev.AlignedStart()); // queryStart (no soft clips left)
+ EXPECT_EQ(clipEnd, s3_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(tPos, s3_rev.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(tPos + 8, s3_rev.ReferenceEnd()); // RefStart + 4=1D2D1=
+
+ EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_rev_clipped, s3_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_rev_clipped, s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_rev_clipped, s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClipToReference_Basic)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const string tagQuals_rev = "*?]?]?]?]?";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+
+ const Position clipStart = 102;
+ const Position clipEnd = 107;
+
+ const string s1_cigar = "10=";
+ const string s1_cigar_clipped = "5=";
+ const string s1_seq_clipped = "CCGTT";
+ const string s1_quals_clipped = "?]?]?";
+ const string s1_tagBases_clipped = s1_seq_clipped;
+ const string s1_tagQuals_clipped = s1_quals_clipped;
+ const f_data s1_frames_clipped = { 20, 20, 30, 40, 40 };
+ const string s1_seq_rev_clipped = "TAACG";
+ const string s1_quals_rev_clipped = "]?]?]";
+ const string s1_tagBases_rev_clipped = s1_seq_rev_clipped;
+ const string s1_tagQuals_rev_clipped = s1_quals_rev_clipped;
+ const f_data s1_frames_rev_clipped = { 10, 40, 40, 30, 20 };
+
+ const string s2_cigar = "5=3D5=";
+ const string s2_cigar_clipped = "3=2D";
+ const string s2_seq_clipped = "CCG";
+ const string s2_quals_clipped = "?]?";
+ const string s2_tagBases_clipped = s2_seq_clipped;
+ const string s2_tagQuals_clipped = s2_quals_clipped;
+ const f_data s2_frames_clipped = { 20, 20, 30 };
+ const string s2_seq_rev_clipped = "TAA";
+ const string s2_quals_rev_clipped = "]?]";
+ const string s2_tagBases_rev_clipped = s2_seq_rev_clipped;
+ const string s2_tagQuals_rev_clipped = s2_quals_rev_clipped;
+ const f_data s2_frames_rev_clipped = { 10, 40, 40 };
+
+ const string s3_cigar = "4=1D2I2D4=";
+ const string s3_cigar_clipped = "2=1D2I2D";
+ const string s3_seq_clipped = "CCGT";
+ const string s3_quals_clipped = "?]?]";
+ const string s3_tagBases_clipped = s3_seq_clipped;
+ const string s3_tagQuals_clipped = s3_quals_clipped;
+ const f_data s3_frames_clipped = { 20, 20, 30, 40 };
+ const string s3_seq_rev_clipped = "TAAC";
+ const string s3_quals_rev_clipped = "]?]?";
+ const string s3_tagBases_rev_clipped = s3_seq_rev_clipped;
+ const string s3_tagQuals_rev_clipped = s3_quals_rev_clipped;
+ const f_data s3_frames_rev_clipped = { 10, 40, 40, 30};
+
+ const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s0 = prototype;
+ BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+ BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+ BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+ BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+ BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+ BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+ s0.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s1.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s2.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s3.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s1_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s2_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s3_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+ // s0 - no clipping should have been done to unmapped record
+ EXPECT_FALSE(s0.IsMapped());
+ EXPECT_EQ(prototype.QueryStart(), s0.QueryStart());
+ EXPECT_EQ(prototype.QueryEnd(), s0.QueryEnd());
+ EXPECT_EQ(prototype.AlignedStart(), s0.AlignedStart());
+ EXPECT_EQ(prototype.AlignedEnd(), s0.AlignedEnd());
+ EXPECT_EQ(prototype.ReferenceStart(), s0.ReferenceStart());
+ EXPECT_EQ(prototype.ReferenceEnd(), s0.ReferenceEnd());
+ EXPECT_EQ(prototype.Sequence(), s0.Sequence());
+ EXPECT_EQ(prototype.Qualities(), s0.Qualities());
+ EXPECT_EQ(prototype.DeletionTag(), s0.DeletionTag());
+ EXPECT_EQ(prototype.DeletionQV(), s0.DeletionQV());
+// EXPECT_EQ(prototype.LabelQV(), s0.LabelQV());
+// EXPECT_EQ(prototype.AltLabelQV(), s0.AltLabelQV());
+ EXPECT_EQ(prototype.IPD(), s0.IPD());
+
+ // s1 - FORWARD
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+ EXPECT_EQ(502, s1.QueryStart());
+ EXPECT_EQ(507, s1.QueryEnd());
+ EXPECT_EQ(502, s1.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(507, s1.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s1.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s1.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+ EXPECT_EQ(s1_seq_clipped, s1.Sequence());
+ EXPECT_EQ(s1_quals_clipped, s1.Qualities().Fastq());
+ EXPECT_EQ(s1_tagBases_clipped, s1.DeletionTag());
+ EXPECT_EQ(s1_tagQuals_clipped, s1.DeletionQV().Fastq());
+// EXPECT_EQ(s1_tagQuals_clipped, s1.LabelQV().Fastq());
+// EXPECT_EQ(s1_tagQuals_clipped, s1.AltLabelQV().Fastq());
+ EXPECT_EQ(s1_frames_clipped, s1.IPD().Data());
+
+ // s1 - REVERSE
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+ EXPECT_EQ(503, s1_rev.QueryStart());
+ EXPECT_EQ(508, s1_rev.QueryEnd());
+ EXPECT_EQ(503, s1_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(508, s1_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s1_rev.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s1_rev.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s1_seq_rev_clipped, s1_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s1_quals_rev_clipped, s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_frames_rev_clipped, s1_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - FORWARD
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+ EXPECT_EQ(502, s2.QueryStart());
+ EXPECT_EQ(505, s2.QueryEnd());
+ EXPECT_EQ(502, s2.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(505, s2.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s2.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s2.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+ EXPECT_EQ(s2_seq_clipped, s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_quals_clipped, s2.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_clipped, s2.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_clipped, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_frames_clipped, s2.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - REVERSE
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+ EXPECT_EQ(505, s2_rev.QueryStart());
+ EXPECT_EQ(508, s2_rev.QueryEnd());
+ EXPECT_EQ(505, s2_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(508, s2_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s2_rev.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s2_rev.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s2_seq_rev_clipped, s2_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_quals_rev_clipped, s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_frames_rev_clipped, s2_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(502, s3.QueryStart());
+ EXPECT_EQ(506, s3.QueryEnd());
+ EXPECT_EQ(502, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(506, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s3.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s3.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - REVERSE
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+ EXPECT_EQ(504, s3_rev.QueryStart());
+ EXPECT_EQ(508, s3_rev.QueryEnd());
+ EXPECT_EQ(504, s3_rev.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(508, s3_rev.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s3_rev.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s3_rev.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_rev_clipped, s3_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_rev_clipped, s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_rev_clipped, s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClipToReference_WithSoftClips)
+{
+ const Position qStart = 500;
+ const Position qEnd = 515;
+ const string seq = "TTAACCGTTAGCAAA";
+ const string quals = "--?]?]?]?]?*+++";
+ const string tagBases = "TTAACCGTTAGCAAA";
+ const string tagQuals = "--?]?]?]?]?*+++";
+ const string tagQuals_rev = "+++*?]?]?]?]?--";
+ const f_data frames = { 40, 40, 10, 10, 20, 20, 30, 40, 40, 10, 30, 20, 10, 10, 10 };
+
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+
+ const Position clipStart = 102;
+ const Position clipEnd = 107;
+
+ const string seq_rev = "TTTGCTAACGGTTAA";
+ const string quals_rev = "+++*?]?]?]?]?--";
+ const f_data frames_rev = { 10, 10, 10, 20, 30, 10, 40, 40, 30, 20, 20, 10, 10, 40, 40 };
+
+ const string s1_cigar = "2S10=3S";
+ const string s1_cigar_clipped = "5=";
+ const string s1_seq_clipped = "CCGTT";
+ const string s1_quals_clipped = "?]?]?";
+ const string s1_tagBases_clipped = s1_seq_clipped;
+ const string s1_tagQuals_clipped = s1_quals_clipped;
+ const f_data s1_frames_clipped = { 20, 20, 30, 40, 40 };
+ const string s1_seq_rev_clipped = "CTAAC";
+ const string s1_quals_rev_clipped = "?]?]?";
+ const string s1_tagBases_rev_clipped = s1_seq_rev_clipped;
+ const string s1_tagQuals_rev_clipped = s1_quals_rev_clipped;
+ const f_data s1_frames_rev_clipped = { 30, 10, 40, 40, 30 };
+
+ const string s2_cigar = "2S5=3D5=3S";
+ const string s2_cigar_clipped = "3=2D";
+ const string s2_seq_clipped = "CCG";
+ const string s2_quals_clipped = "?]?";
+ const string s2_tagBases_clipped = s2_seq_clipped;
+ const string s2_tagQuals_clipped = s2_quals_clipped;
+ const f_data s2_frames_clipped = { 20, 20, 30 };
+ const string s2_seq_rev_clipped = "CTA";
+ const string s2_quals_rev_clipped = "?]?";
+ const string s2_tagBases_rev_clipped = s2_seq_rev_clipped;
+ const string s2_tagQuals_rev_clipped = s2_quals_rev_clipped;
+ const f_data s2_frames_rev_clipped = { 30, 10, 40 };
+
+ const string s3_cigar = "2S4=1D2I2D4=3S";
+ const string s3_cigar_clipped = "2=1D2I2D";
+ const string s3_seq_clipped = "CCGT";
+ const string s3_quals_clipped = "?]?]";
+ const string s3_tagBases_clipped = s3_seq_clipped;
+ const string s3_tagQuals_clipped = s3_quals_clipped;
+ const f_data s3_frames_clipped = { 20, 20, 30, 40 };
+ const string s3_seq_rev_clipped = "CTAA";
+ const string s3_quals_rev_clipped = "?]?]";
+ const string s3_tagBases_rev_clipped = s3_seq_rev_clipped;
+ const string s3_tagQuals_rev_clipped = s3_quals_rev_clipped;
+ const f_data s3_frames_rev_clipped = { 30, 10, 40, 40 };
+
+ const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s0 = prototype;
+ BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+ BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+ BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+ BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+ BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+ BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+ // sanity checks before clipping
+ EXPECT_FALSE(s0.IsMapped());
+
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(500, s1.QueryStart()); // queryStart
+ EXPECT_EQ(515, s1.QueryEnd()); // queryStart + seqLength
+ EXPECT_EQ(502, s1.AlignedStart()); // queryStart + 2S
+ EXPECT_EQ(512, s1.AlignedEnd()); // alignedStart + 10=
+ EXPECT_EQ(tPos, s1.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 10, s1.ReferenceEnd()); // tPos + 10=
+
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(500, s1_rev.QueryStart()); // queryStart
+ EXPECT_EQ(515, s1_rev.QueryEnd()); // queryStart + seqLength
+ EXPECT_EQ(503, s1_rev.AlignedStart()); // queryStart + 3S
+ EXPECT_EQ(513, s1_rev.AlignedEnd()); // alignedStart + 10=
+ EXPECT_EQ(tPos, s1_rev.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 10, s1_rev.ReferenceEnd()); // tPos + 10=
+
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(500, s2.QueryStart()); // queryStart
+ EXPECT_EQ(515, s2.QueryEnd()); // queryStart + seqLength
+ EXPECT_EQ(502, s2.AlignedStart()); // queryStart + 2S
+ EXPECT_EQ(512, s2.AlignedEnd()); // alignedStart + 5=5=
+ EXPECT_EQ(tPos, s2.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 13, s2.ReferenceEnd()); // tPos + 5=3D5=
+
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(500, s2_rev.QueryStart()); // queryStart
+ EXPECT_EQ(515, s2_rev.QueryEnd()); // queryStart + seqLength
+ EXPECT_EQ(503, s2_rev.AlignedStart()); // queryStart + S
+ EXPECT_EQ(513, s2_rev.AlignedEnd()); // alignedStart + 5=5=
+ EXPECT_EQ(tPos, s2_rev.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 13, s2_rev.ReferenceEnd()); // tPos + 5=3D5=
+
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(500, s3.QueryStart()); // queryStart
+ EXPECT_EQ(515, s3.QueryEnd()); // queryStart + seqLength
+ EXPECT_EQ(502, s3.AlignedStart()); // queryStart + 2S
+ EXPECT_EQ(512, s3.AlignedEnd()); // alignedStart + 4=2I4=
+ EXPECT_EQ(tPos, s3.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 11, s3.ReferenceEnd()); // tPos + 4=1D2D4=
+
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(500, s3_rev.QueryStart()); // queryStart
+ EXPECT_EQ(515, s3_rev.QueryEnd()); // queryStart + seqLength
+ EXPECT_EQ(503, s3_rev.AlignedStart()); // queryStart + 2S
+ EXPECT_EQ(513, s3_rev.AlignedEnd()); // alignedStart + 4=2I4=
+ EXPECT_EQ(tPos, s3_rev.ReferenceStart()); // tPos
+ EXPECT_EQ(tPos + 11, s3_rev.ReferenceEnd()); // tPos + 4=1D2D4=
+
+ s0.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s1.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s2.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s3.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s1_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s2_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+ s3_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+ // s0 - no clipping should have been done to unmapped record
+ EXPECT_FALSE(s0.IsMapped());
+ EXPECT_EQ(prototype.QueryStart(), s0.QueryStart());
+ EXPECT_EQ(prototype.QueryEnd(), s0.QueryEnd());
+ EXPECT_EQ(prototype.AlignedStart(), s0.AlignedStart());
+ EXPECT_EQ(prototype.AlignedEnd(), s0.AlignedEnd());
+ EXPECT_EQ(prototype.ReferenceStart(), s0.ReferenceStart());
+ EXPECT_EQ(prototype.ReferenceEnd(), s0.ReferenceEnd());
+ EXPECT_EQ(prototype.Sequence(), s0.Sequence());
+ EXPECT_EQ(prototype.Qualities(), s0.Qualities());
+ EXPECT_EQ(prototype.DeletionTag(), s0.DeletionTag());
+ EXPECT_EQ(prototype.DeletionQV(), s0.DeletionQV());
+// EXPECT_EQ(prototype.LabelQV(), s0.LabelQV());
+// EXPECT_EQ(prototype.AltLabelQV(), s0.AltLabelQV());
+ EXPECT_EQ(prototype.IPD(), s0.IPD());
+
+ // s1 - FORWARD
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+ EXPECT_EQ(504, s1.QueryStart()); // new queryStart
+ EXPECT_EQ(509, s1.QueryEnd()); // queryStart + new seqLength
+ EXPECT_EQ(504, s1.AlignedStart()); // queryStart (no soft clips remaining)
+ EXPECT_EQ(509, s1.AlignedEnd()); // alignStart + new seqLength
+ EXPECT_EQ(clipStart, s1.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s1.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+ EXPECT_EQ(s1_seq_clipped, s1.Sequence());
+ EXPECT_EQ(s1_quals_clipped, s1.Qualities().Fastq());
+ EXPECT_EQ(s1_tagBases_clipped, s1.DeletionTag());
+ EXPECT_EQ(s1_tagQuals_clipped, s1.DeletionQV().Fastq());
+// EXPECT_EQ(s1_tagQuals_clipped, s1.LabelQV().Fastq());
+// EXPECT_EQ(s1_tagQuals_clipped, s1.AltLabelQV().Fastq());
+ EXPECT_EQ(s1_frames_clipped, s1.IPD().Data());
+
+ // s1 - REVERSE
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+ EXPECT_EQ(506, s1_rev.QueryStart()); // new queryStart
+ EXPECT_EQ(511, s1_rev.QueryEnd()); // queryStart + new seqLength
+ EXPECT_EQ(506, s1_rev.AlignedStart()); // queryStart (no soft clips remaining)
+ EXPECT_EQ(511, s1_rev.AlignedEnd()); // alignStart + new seqLength
+ EXPECT_EQ(clipStart, s1_rev.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s1_rev.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s1_seq_rev_clipped, s1_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s1_quals_rev_clipped, s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s1_frames_rev_clipped, s1_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - FORWARD
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+ EXPECT_EQ(504, s2.QueryStart());
+ EXPECT_EQ(507, s2.QueryEnd());
+ EXPECT_EQ(504, s2.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(507, s2.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s2.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s2.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+ EXPECT_EQ(s2_seq_clipped, s2.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_quals_clipped, s2.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_clipped, s2.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_clipped, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_frames_clipped, s2.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - REVERSE
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+ EXPECT_EQ(508, s2_rev.QueryStart()); // new queryStart
+ EXPECT_EQ(511, s2_rev.QueryEnd()); // queryStart + new seqLength
+ EXPECT_EQ(508, s2_rev.AlignedStart()); // queryStart (no soft clips remaining)
+ EXPECT_EQ(511, s2_rev.AlignedEnd()); // alignStart + new seqLength
+ EXPECT_EQ(clipStart, s2_rev.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s2_rev.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s2_seq_rev_clipped, s2_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s2_quals_rev_clipped, s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s2_frames_rev_clipped, s2_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(504, s3.QueryStart());
+ EXPECT_EQ(508, s3.QueryEnd());
+ EXPECT_EQ(504, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(508, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s3.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s3.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - REVERSE
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+ EXPECT_EQ(507, s3_rev.QueryStart()); // new queryStart
+ EXPECT_EQ(511, s3_rev.QueryEnd()); // queryStart + new seqLength
+ EXPECT_EQ(507, s3_rev.AlignedStart()); // queryStart (no soft clips remaining)
+ EXPECT_EQ(511, s3_rev.AlignedEnd()); // alignStart + new seqLength
+ EXPECT_EQ(clipStart, s3_rev.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s3_rev.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_rev_clipped, s3_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_rev_clipped, s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_rev_clipped, s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClippedToQueryCopy)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+ const Position clipStart = 502;
+ const Position clipEnd = 509;
+
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+ const string seq_clipped = "CCGTTAG";
+ const string quals_clipped = "?]?]?]?";
+ const string tagBases_clipped = "CCGTTAG";
+ const string tagQuals_clipped = "?]?]?]?";
+ const f_data frames_clipped = { 20, 20, 30, 40, 40, 10, 30 };
+
+ const string s3_cigar = "4=1D2I2D4=";
+ const string s3_cigar_clipped = "2=1D2I2D3=";
+
+ BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+ BamRecord s3 = prototype.Clipped(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(clipStart, s3.QueryStart());
+ EXPECT_EQ(clipEnd, s3.QueryEnd());
+ EXPECT_EQ(clipStart, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s3.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(110, s3.ReferenceEnd()); // RefStart + 5= + 3D
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClippedToReferenceCopy)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+ const Position clipStart = 102;
+ const Position clipEnd = 107;
+
+ const string s3_cigar = "4=1D2I2D4=";
+ const string s3_cigar_clipped = "2=1D2I2D";
+ const string s3_seq_clipped = "CCGT";
+ const string s3_quals_clipped = "?]?]";
+ const string s3_tagBases_clipped = s3_seq_clipped;
+ const string s3_tagQuals_clipped = s3_quals_clipped;
+ const f_data s3_frames_clipped = { 20, 20, 30, 40 };
+
+ BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+ const BamRecord s3 = prototype.Clipped(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(502, s3.QueryStart());
+ EXPECT_EQ(506, s3.QueryEnd());
+ EXPECT_EQ(502, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(506, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s3.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s3.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, StaticClippedToQuery)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+ const Position clipStart = 502;
+ const Position clipEnd = 509;
+
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+ const string seq_clipped = "CCGTTAG";
+ const string quals_clipped = "?]?]?]?";
+ const string tagBases_clipped = "CCGTTAG";
+ const string tagQuals_clipped = "?]?]?]?";
+ const f_data frames_clipped = { 20, 20, 30, 40, 40, 10, 30 };
+
+ const string s3_cigar = "4=1D2I2D4=";
+ const string s3_cigar_clipped = "2=1D2I2D3=";
+
+ BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+ const BamRecord s3 = BamRecord::Clipped(prototype, ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(clipStart, s3.QueryStart());
+ EXPECT_EQ(clipEnd, s3.QueryEnd());
+ EXPECT_EQ(clipStart, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(clipEnd, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(102, s3.ReferenceStart()); // 100 + startOffset
+ EXPECT_EQ(110, s3.ReferenceEnd()); // RefStart + 5= + 3D
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, StaticClippedToReference)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+ const int32_t tId = 0;
+ const Position tPos = 100;
+ const uint8_t mapQual = 80;
+ const Position clipStart = 102;
+ const Position clipEnd = 107;
+
+ const string s3_cigar = "4=1D2I2D4=";
+ const string s3_cigar_clipped = "2=1D2I2D";
+ const string s3_seq_clipped = "CCGT";
+ const string s3_quals_clipped = "?]?]";
+ const string s3_tagBases_clipped = s3_seq_clipped;
+ const string s3_tagQuals_clipped = s3_quals_clipped;
+ const f_data s3_frames_clipped = { 20, 20, 30, 40 };
+
+ BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+ const BamRecord s3 = BamRecord::Clipped(prototype, ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(502, s3.QueryStart());
+ EXPECT_EQ(506, s3.QueryEnd());
+ EXPECT_EQ(502, s3.AlignedStart()); // queryStart (no soft clips)
+ EXPECT_EQ(506, s3.AlignedEnd()); // alignStart + seqLength
+ EXPECT_EQ(clipStart, s3.ReferenceStart()); // clipStart
+ EXPECT_EQ(clipEnd, s3.ReferenceEnd()); // clipEnd
+
+ EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+ EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(s3_quals_clipped, s3.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+// EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(s3_frames_clipped, s3.IPD(Orientation::GENOMIC).Data());
+}
diff --git a/tests/src/test_BamRecordImplCore.cpp b/tests/src/test_BamRecordImplCore.cpp
new file mode 100644
index 0000000..6fad659
--- /dev/null
+++ b/tests/src/test_BamRecordImplCore.cpp
@@ -0,0 +1,613 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordImpl.h>
+#include <pbbam/BamTagCodec.h>
+#include <pbbam/Tag.h>
+#include <pbbam/TagCollection.h>
+#include <algorithm>
+#include <iostream>
+#include <iterator>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+namespace tests {
+
+struct Bam1Deleter
+{
+ void operator()(bam1_t* b) {
+ if (b)
+ bam_destroy1(b);
+ b = nullptr;
+ }
+};
+
+static
+BamRecordImpl CreateBamImpl(void)
+{
+ BamRecordImpl bam;
+ bam.Bin(42);
+ bam.Flag(42);
+ bam.InsertSize(42);
+ bam.MapQuality(42);
+ bam.MatePosition(42);
+ bam.MateReferenceId(42);
+ bam.Position(42);
+ bam.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam.Tags(tags);
+
+ return bam;
+}
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+ // ensure raw data (lengths at least) matches API-facing data
+
+ const uint32_t expectedNameLength = bam.Name().size() + 1;
+ const uint32_t expectedNumCigarOps = bam.CigarData().size();
+ const int32_t expectedSeqLength = bam.Sequence().length();
+ const size_t expectedTagsLength = BamTagCodec::Encode(bam.Tags()).size();
+
+ // Name CIGAR Sequence Quals Tags
+ // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + << TAGS >>
+
+ const int expectedTotalDataLength = expectedNameLength +
+ (expectedNumCigarOps * 4) +
+ (expectedSeqLength+1)/2 +
+ expectedSeqLength +
+ expectedTagsLength;
+
+ EXPECT_TRUE((bool)bam.d_);
+ EXPECT_EQ(expectedNameLength, bam.d_->core.l_qname);
+ EXPECT_EQ(expectedNumCigarOps, bam.d_->core.n_cigar);
+ EXPECT_EQ(expectedSeqLength, bam.d_->core.l_qseq);
+ EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+} // namespace tests
+
+TEST(BamRecordImplCoreTest, RawDataDefaultValues)
+{
+ PBBAM_SHARED_PTR<bam1_t> rawData(bam_init1(), tests::Bam1Deleter());
+ ASSERT_TRUE((bool)rawData);
+
+ // fixed-length (core) data
+ EXPECT_EQ(0, rawData->core.tid);
+ EXPECT_EQ(0, rawData->core.pos);
+ EXPECT_EQ(0, rawData->core.bin);
+ EXPECT_EQ(0, rawData->core.qual);
+ EXPECT_EQ(0, rawData->core.l_qname);
+ EXPECT_EQ(0, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(0, rawData->core.mtid);
+ EXPECT_EQ(0, rawData->core.mpos);
+ EXPECT_EQ(0, rawData->core.isize);
+
+ // variable length data
+ EXPECT_EQ(0, rawData->data);
+ EXPECT_EQ(0, rawData->l_data);
+ EXPECT_EQ(0, rawData->m_data);
+}
+
+TEST(BamRecordImplCoreTest, DefaultValues)
+{
+ BamRecordImpl bam;
+
+ // -------------------------------
+ // check raw data
+ // -------------------------------
+
+ const PBBAM_SHARED_PTR<bam1_t> rawData = bam.d_;
+ ASSERT_TRUE((bool)rawData);
+
+ // fixed-length (core) data
+ // (forced init unmapped, with NULL-term as QNAME)
+ EXPECT_EQ(-1, rawData->core.tid);
+ EXPECT_EQ(-1, rawData->core.pos);
+ EXPECT_EQ(0, rawData->core.bin);
+ EXPECT_EQ(255, rawData->core.qual);
+ EXPECT_EQ(1, rawData->core.l_qname);
+ EXPECT_EQ(BamRecordImpl::UNMAPPED, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(-1, rawData->core.mtid);
+ EXPECT_EQ(-1, rawData->core.mpos);
+ EXPECT_EQ(0, rawData->core.isize);
+
+ // variable length data
+ EXPECT_TRUE(rawData->data != nullptr);
+ EXPECT_EQ(1, rawData->l_data);
+ EXPECT_EQ((int)0x800, rawData->m_data); // check this if we change or tune later
+
+ // -------------------------------
+ // check data via API calls
+ // -------------------------------
+
+ EXPECT_EQ(0, bam.Bin());
+ EXPECT_EQ(BamRecordImpl::UNMAPPED, bam.Flag());
+ EXPECT_EQ(0, bam.InsertSize());
+ EXPECT_EQ(255, bam.MapQuality());
+ EXPECT_EQ(-1, bam.MateReferenceId());
+ EXPECT_EQ(-1, bam.MatePosition());
+ EXPECT_EQ(-1, bam.Position());
+ EXPECT_EQ(-1, bam.ReferenceId());
+ EXPECT_EQ(0, bam.Tags().size());
+
+ EXPECT_FALSE(bam.IsDuplicate());
+ EXPECT_FALSE(bam.IsFailedQC());
+ EXPECT_FALSE(bam.IsFirstMate());
+ EXPECT_FALSE(bam.IsMapped());
+ EXPECT_TRUE(bam.IsMateMapped());
+ EXPECT_FALSE(bam.IsMateReverseStrand());
+ EXPECT_FALSE(bam.IsPaired());
+ EXPECT_TRUE(bam.IsPrimaryAlignment());
+ EXPECT_FALSE(bam.IsProperPair());
+ EXPECT_FALSE(bam.IsReverseStrand());
+ EXPECT_FALSE(bam.IsSecondMate());
+ EXPECT_FALSE(bam.IsSupplementaryAlignment());
+
+ const std::string emptyString = "";
+ EXPECT_EQ(emptyString, bam.Name());
+ EXPECT_EQ(emptyString, bam.CigarData().ToStdString());
+ EXPECT_EQ(emptyString, bam.Sequence());
+ EXPECT_EQ(emptyString, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, CoreSetters)
+{
+ BamRecordImpl bam;
+ bam.Bin(42);
+ bam.Flag(42);
+ bam.InsertSize(42);
+ bam.MapQuality(42);
+ bam.MatePosition(42);
+ bam.MateReferenceId(42);
+ bam.Position(42);
+ bam.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam.Tags(tags); // (28 bytes encoded)
+
+ // -------------------------------
+ // check raw data
+ // -------------------------------
+
+ const PBBAM_SHARED_PTR<bam1_t> rawData = bam.d_;
+ ASSERT_TRUE((bool)rawData);
+
+ // fixed-length (core) data
+ EXPECT_EQ(42, rawData->core.tid);
+ EXPECT_EQ(42, rawData->core.pos);
+ EXPECT_EQ(42, rawData->core.bin);
+ EXPECT_EQ(42, rawData->core.qual);
+ EXPECT_EQ(1, rawData->core.l_qname); // initialized w/ NULL-term
+ EXPECT_EQ(42, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(42, rawData->core.mtid);
+ EXPECT_EQ(42, rawData->core.mpos);
+ EXPECT_EQ(42, rawData->core.isize);
+
+ // variable length data
+ EXPECT_TRUE(rawData->data != nullptr);
+ EXPECT_EQ(29, rawData->l_data); // NULL-term qname + tags
+ EXPECT_EQ((int)0x800, rawData->m_data); // check this if we change or tune later
+
+ // -------------------------------
+ // check data via API calls
+ // -------------------------------
+
+ EXPECT_EQ(42, bam.Bin());
+ EXPECT_EQ(42, bam.Flag());
+ EXPECT_EQ(42, bam.InsertSize());
+ EXPECT_EQ(42, bam.MapQuality());
+ EXPECT_EQ(42, bam.MateReferenceId());
+ EXPECT_EQ(42, bam.MatePosition());
+ EXPECT_EQ(42, bam.Position());
+ EXPECT_EQ(42, bam.ReferenceId());
+
+ const TagCollection& fetchedTags = bam.Tags();
+
+ EXPECT_TRUE(fetchedTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags.at("CA").ToUInt8Array());
+}
+
+TEST(BamRecordImplCoreTest, DeepCopyFromRawData)
+{
+ // init raw data
+ PBBAM_SHARED_PTR<bam1_t> rawData(bam_init1(), tests::Bam1Deleter());
+ ASSERT_TRUE((bool)rawData);
+
+ rawData->core.tid = 42;
+ rawData->core.pos = 42;
+ rawData->core.bin = 42;
+ rawData->core.qual = 42;
+ rawData->core.flag = 42;
+ rawData->core.mtid = 42;
+ rawData->core.mpos = 42;
+ rawData->core.isize = 42;
+
+ const int32_t x = 42;
+ char valueBytes[sizeof x];
+ std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
+ static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
+ valueBytes);
+ bam_aux_append(rawData.get(), "XY", 'i', sizeof(x), (uint8_t*)&valueBytes[0]);
+
+ EXPECT_EQ(42, rawData->core.tid);
+ EXPECT_EQ(42, rawData->core.pos);
+ EXPECT_EQ(42, rawData->core.bin);
+ EXPECT_EQ(42, rawData->core.qual);
+ EXPECT_EQ(0, rawData->core.l_qname);
+ EXPECT_EQ(42, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(42, rawData->core.mtid);
+ EXPECT_EQ(42, rawData->core.mpos);
+ EXPECT_EQ(42, rawData->core.isize);
+ const int32_t fetchedX = bam_aux2i( bam_aux_get(rawData.get(), "XY") );
+ EXPECT_EQ(42, fetchedX);
+
+ // static "ctor"
+ BamRecordImpl bam = BamRecordImpl::FromRawData(rawData);
+
+ // make sure raw data is still valid
+ EXPECT_EQ(42, rawData->core.tid);
+ EXPECT_EQ(42, rawData->core.pos);
+ EXPECT_EQ(42, rawData->core.bin);
+ EXPECT_EQ(42, rawData->core.qual);
+ EXPECT_EQ(0, rawData->core.l_qname);
+ EXPECT_EQ(42, rawData->core.flag);
+ EXPECT_EQ(0, rawData->core.n_cigar);
+ EXPECT_EQ(0, rawData->core.l_qseq);
+ EXPECT_EQ(42, rawData->core.mtid);
+ EXPECT_EQ(42, rawData->core.mpos);
+ EXPECT_EQ(42, rawData->core.isize);
+ EXPECT_TRUE(rawData->data != nullptr);
+ EXPECT_TRUE(0 != rawData->l_data);
+ EXPECT_TRUE(0 != rawData->m_data);
+
+ // check new record
+ EXPECT_EQ(42, bam.Bin());
+ EXPECT_EQ(42, bam.Flag());
+ EXPECT_EQ(42, bam.InsertSize());
+ EXPECT_EQ(42, bam.MapQuality());
+ EXPECT_EQ(42, bam.MateReferenceId());
+ EXPECT_EQ(42, bam.MatePosition());
+ EXPECT_EQ(42, bam.Position());
+ EXPECT_EQ(42, bam.ReferenceId());
+ EXPECT_EQ(x, bam.Tags()["XY"].ToInt32());
+
+ EXPECT_TRUE(bam.d_->data != nullptr);
+ EXPECT_TRUE(bam.d_->m_data >= (int)0x800); // check this if we change or tune later
+
+ // tweak raw data, make sure we've done a deep copy (so BamRecordImpl isn't changed)
+ rawData->core.pos = 37;
+ EXPECT_EQ(37, rawData->core.pos);
+ EXPECT_EQ(42, bam.Position());
+ EXPECT_EQ(42, bam.d_->core.pos);
+}
+
+TEST(BamRecordImplCoreTest, CopyAssignment)
+{
+ BamRecordImpl bam1;
+ bam1.Bin(42);
+ bam1.Flag(42);
+ bam1.InsertSize(42);
+ bam1.MapQuality(42);
+ bam1.MatePosition(42);
+ bam1.MateReferenceId(42);
+ bam1.Position(42);
+ bam1.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam1.Tags(tags);
+
+ BamRecordImpl bam2;
+ bam2 = bam1;
+
+ EXPECT_EQ(42, bam1.Bin());
+ EXPECT_EQ(42, bam1.Flag());
+ EXPECT_EQ(42, bam1.InsertSize());
+ EXPECT_EQ(42, bam1.MapQuality());
+ EXPECT_EQ(42, bam1.MateReferenceId());
+ EXPECT_EQ(42, bam1.MatePosition());
+ EXPECT_EQ(42, bam1.Position());
+ EXPECT_EQ(42, bam1.ReferenceId());
+
+ const TagCollection& fetchedTags1 = bam1.Tags();
+ EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+ EXPECT_EQ(42, bam2.Bin());
+ EXPECT_EQ(42, bam2.Flag());
+ EXPECT_EQ(42, bam2.InsertSize());
+ EXPECT_EQ(42, bam2.MapQuality());
+ EXPECT_EQ(42, bam2.MateReferenceId());
+ EXPECT_EQ(42, bam2.MatePosition());
+ EXPECT_EQ(42, bam2.Position());
+ EXPECT_EQ(42, bam2.ReferenceId());
+
+ const TagCollection& fetchedTags2 = bam2.Tags();
+ EXPECT_TRUE(fetchedTags2.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags2.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags2.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags2.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam1);
+ tests::CheckRawData(bam2);
+}
+
+TEST(BamRecordImplCoreTest, SelfAssignmentTolerated)
+{
+ BamRecordImpl bam1;
+ bam1.Bin(42);
+ bam1.Flag(42);
+ bam1.InsertSize(42);
+ bam1.MapQuality(42);
+ bam1.MatePosition(42);
+ bam1.MateReferenceId(42);
+ bam1.Position(42);
+ bam1.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam1.Tags(tags);
+
+ bam1 = bam1;
+
+ EXPECT_EQ(42, bam1.Bin());
+ EXPECT_EQ(42, bam1.Flag());
+ EXPECT_EQ(42, bam1.InsertSize());
+ EXPECT_EQ(42, bam1.MapQuality());
+ EXPECT_EQ(42, bam1.MateReferenceId());
+ EXPECT_EQ(42, bam1.MatePosition());
+ EXPECT_EQ(42, bam1.Position());
+ EXPECT_EQ(42, bam1.ReferenceId());
+
+ const TagCollection& fetchedTags1 = bam1.Tags();
+ EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam1);
+}
+
+TEST(BamRecordImplCoreTest, CopyConstructor)
+{
+ BamRecordImpl bam1;
+ bam1.Bin(42);
+ bam1.Flag(42);
+ bam1.InsertSize(42);
+ bam1.MapQuality(42);
+ bam1.MatePosition(42);
+ bam1.MateReferenceId(42);
+ bam1.Position(42);
+ bam1.ReferenceId(42);
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam1.Tags(tags);
+
+ BamRecordImpl bam2(bam1);
+
+ EXPECT_EQ(42, bam1.Bin());
+ EXPECT_EQ(42, bam1.Flag());
+ EXPECT_EQ(42, bam1.InsertSize());
+ EXPECT_EQ(42, bam1.MapQuality());
+ EXPECT_EQ(42, bam1.MateReferenceId());
+ EXPECT_EQ(42, bam1.MatePosition());
+ EXPECT_EQ(42, bam1.Position());
+ EXPECT_EQ(42, bam1.ReferenceId());
+
+ const TagCollection& fetchedTags1 = bam1.Tags();
+ EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+ EXPECT_EQ(42, bam2.Bin());
+ EXPECT_EQ(42, bam2.Flag());
+ EXPECT_EQ(42, bam2.InsertSize());
+ EXPECT_EQ(42, bam2.MapQuality());
+ EXPECT_EQ(42, bam2.MateReferenceId());
+ EXPECT_EQ(42, bam2.MatePosition());
+ EXPECT_EQ(42, bam2.Position());
+ EXPECT_EQ(42, bam2.ReferenceId());
+
+ const TagCollection& fetchedTags2 = bam2.Tags();
+ EXPECT_TRUE(fetchedTags2.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags2.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags2.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags2.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam1);
+ tests::CheckRawData(bam2);
+}
+
+TEST(BamRecordImplCoreTest, CreateRecord_InternalTest)
+{
+ BamRecordImpl bam = tests::CreateBamImpl();
+
+ EXPECT_EQ(42, bam.Bin());
+ EXPECT_EQ(42, bam.Flag());
+ EXPECT_EQ(42, bam.InsertSize());
+ EXPECT_EQ(42, bam.MapQuality());
+ EXPECT_EQ(42, bam.MateReferenceId());
+ EXPECT_EQ(42, bam.MatePosition());
+ EXPECT_EQ(42, bam.Position());
+ EXPECT_EQ(42, bam.ReferenceId());
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = static_cast<int32_t>(-42);
+ bam.Tags(tags);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, MoveAssignment)
+{
+ BamRecordImpl bam;
+ bam = std::move(tests::CreateBamImpl());
+
+ EXPECT_EQ(42, bam.Bin());
+ EXPECT_EQ(42, bam.Flag());
+ EXPECT_EQ(42, bam.InsertSize());
+ EXPECT_EQ(42, bam.MapQuality());
+ EXPECT_EQ(42, bam.MateReferenceId());
+ EXPECT_EQ(42, bam.MatePosition());
+ EXPECT_EQ(42, bam.Position());
+ EXPECT_EQ(42, bam.ReferenceId());
+
+ const TagCollection& fetchedTags1 = bam.Tags();
+ EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, MoveConstructor)
+{
+ BamRecordImpl bam(std::move(tests::CreateBamImpl()));
+
+ EXPECT_EQ(42, bam.Bin());
+ EXPECT_EQ(42, bam.Flag());
+ EXPECT_EQ(42, bam.InsertSize());
+ EXPECT_EQ(42, bam.MapQuality());
+ EXPECT_EQ(42, bam.MateReferenceId());
+ EXPECT_EQ(42, bam.MatePosition());
+ EXPECT_EQ(42, bam.Position());
+ EXPECT_EQ(42, bam.ReferenceId());
+
+ const TagCollection& fetchedTags1 = bam.Tags();
+ EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+ EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, AlignmentFlags)
+{
+ // same set of flags, different ways of getting there
+
+ // raw number
+ BamRecordImpl bam1;
+ bam1.Flag(1107);
+
+ // enum values
+ BamRecordImpl bam2;
+ bam2.Flag(BamRecordImpl::DUPLICATE |
+ BamRecordImpl::MATE_1 |
+ BamRecordImpl::REVERSE_STRAND |
+ BamRecordImpl::PROPER_PAIR |
+ BamRecordImpl::PAIRED
+ );
+
+ // convenience calls
+ BamRecordImpl bam3;
+ bam3.SetDuplicate(true);
+ bam3.SetFirstMate(true);
+ bam3.SetReverseStrand(true);
+ bam3.SetMapped(true);
+ bam3.SetMateMapped(true);
+ bam3.SetPaired(true);
+ bam3.SetProperPair(true);
+ bam3.SetPrimaryAlignment(true);
+
+ // make sure all are same
+ EXPECT_EQ(1107, bam1.Flag());
+ EXPECT_EQ(1107, bam2.Flag());
+ EXPECT_EQ(1107, bam3.Flag());
+
+ // check API calls
+ EXPECT_TRUE(bam1.IsPaired());
+ EXPECT_TRUE(bam1.IsProperPair());
+ EXPECT_TRUE(bam1.IsMapped());
+ EXPECT_TRUE(bam1.IsMateMapped());
+ EXPECT_TRUE(bam1.IsReverseStrand());
+ EXPECT_FALSE(bam1.IsMateReverseStrand());
+ EXPECT_TRUE(bam1.IsFirstMate());
+ EXPECT_FALSE(bam1.IsSecondMate());
+ EXPECT_TRUE(bam1.IsPrimaryAlignment());
+ EXPECT_FALSE(bam1.IsFailedQC());
+ EXPECT_TRUE(bam1.IsDuplicate());
+ EXPECT_FALSE(bam1.IsSupplementaryAlignment());
+}
diff --git a/tests/src/test_BamRecordImplTags.cpp b/tests/src/test_BamRecordImplTags.cpp
new file mode 100644
index 0000000..197e11e
--- /dev/null
+++ b/tests/src/test_BamRecordImplTags.cpp
@@ -0,0 +1,214 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordImpl.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+// NOTE: these tests check "high-level" tag query/manipulation via BamRecordImpl.
+// For raw Tag/TagCollection tests, see test_Tags.cpp
+// For encoding tests, see test_BamRecordImplVariableData.cpp
+
+TEST(BamRecordImplTagsTest, HasTagTest)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+
+ EXPECT_TRUE(bam.HasTag("HX"));
+ EXPECT_TRUE(bam.HasTag("CA"));
+ EXPECT_TRUE(bam.HasTag("XY"));
+
+ EXPECT_FALSE(bam.HasTag("zz"));
+ EXPECT_FALSE(bam.HasTag(""));
+ EXPECT_FALSE(bam.HasTag("some_too_long_name"));
+
+ const TagCollection& fetchedTags = bam.Tags();
+ EXPECT_TRUE(fetchedTags.Contains("HX"));
+ EXPECT_TRUE(fetchedTags.Contains("CA"));
+ EXPECT_TRUE(fetchedTags.Contains("XY"));
+ EXPECT_FALSE(fetchedTags.Contains("zz"));
+ EXPECT_FALSE(fetchedTags.Contains(""));
+ EXPECT_FALSE(fetchedTags.Contains("some_too_long_name"));
+}
+
+TEST(BamRecordImplTagsTest, SimpleAddTag)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+
+ EXPECT_TRUE(bam.HasTag("HX"));
+ EXPECT_TRUE(bam.HasTag("CA"));
+ EXPECT_FALSE(bam.HasTag("XY"));
+
+ bam.AddTag("XY", (int32_t)-42);
+
+ EXPECT_TRUE(bam.HasTag("HX"));
+ EXPECT_TRUE(bam.HasTag("CA"));
+ EXPECT_TRUE(bam.HasTag("XY"));
+
+ const TagCollection& fetchedTags = bam.Tags();
+ EXPECT_TRUE(fetchedTags.Contains("HX"));
+ EXPECT_TRUE(fetchedTags.Contains("CA"));
+ EXPECT_TRUE(fetchedTags.Contains("XY"));
+ EXPECT_FALSE(fetchedTags.Contains("zz"));
+ EXPECT_FALSE(fetchedTags.Contains(""));
+ EXPECT_FALSE(fetchedTags.Contains("some_too_long_name"));
+
+ EXPECT_EQ(-42, fetchedTags.at("XY").ToInt32());
+
+ // fail on invalid adds
+ EXPECT_FALSE(bam.AddTag("", (int32_t)-42));
+ EXPECT_FALSE(bam.AddTag("some_too_long_name", (int32_t)-42));
+ EXPECT_FALSE(bam.AddTag("XY", (int32_t)-42)); // reject duplicate
+}
+
+TEST(BamRecordImplTagsTest, SimpleRemoveTag)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+
+ EXPECT_TRUE(bam.HasTag("HX"));
+ EXPECT_TRUE(bam.HasTag("CA"));
+ EXPECT_TRUE(bam.HasTag("XY"));
+
+ const bool removedOk = bam.RemoveTag("XY");
+ EXPECT_TRUE(removedOk);
+
+ EXPECT_TRUE(bam.HasTag("HX"));
+ EXPECT_TRUE(bam.HasTag("CA"));
+ EXPECT_FALSE(bam.HasTag("XY"));
+
+ const TagCollection& fetchedTags = bam.Tags();
+ EXPECT_TRUE(fetchedTags.Contains("HX"));
+ EXPECT_TRUE(fetchedTags.Contains("CA"));
+ EXPECT_FALSE(fetchedTags.Contains("XY"));
+ EXPECT_FALSE(fetchedTags.Contains("zz"));
+ EXPECT_FALSE(fetchedTags.Contains(""));
+ EXPECT_FALSE(fetchedTags.Contains("some_too_long_name"));
+
+ // fail on invalid removes
+ EXPECT_FALSE(bam.RemoveTag(""));
+ EXPECT_FALSE(bam.RemoveTag("some_too_long_name"));
+ EXPECT_FALSE(bam.RemoveTag("zz")); // reject remove unknown
+}
+
+TEST(BamRecordImplTagsTest, SimpleEditTag)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+
+ EXPECT_TRUE(bam.HasTag("XY"));
+
+ const TagCollection& fetchedTags = bam.Tags();
+ EXPECT_TRUE(fetchedTags.Contains("HX"));
+ EXPECT_TRUE(fetchedTags.Contains("CA"));
+ EXPECT_TRUE(fetchedTags.Contains("XY"));
+ EXPECT_EQ(-42, fetchedTags.at("XY").ToInt32());
+
+ const bool editedOk = bam.EditTag("XY", (int32_t)500);
+ EXPECT_TRUE(editedOk);
+ EXPECT_TRUE(bam.HasTag("XY"));
+
+ const TagCollection& fetchedTags2 = bam.Tags();
+ EXPECT_TRUE(fetchedTags2.Contains("HX"));
+ EXPECT_TRUE(fetchedTags2.Contains("CA"));
+ EXPECT_TRUE(fetchedTags2.Contains("XY"));
+ EXPECT_EQ(500, fetchedTags2.at("XY").ToInt32());
+
+ // fail on invalid edits
+ EXPECT_FALSE(bam.EditTag("", 500));
+ EXPECT_FALSE(bam.EditTag("some_too_long_name", 500));
+ EXPECT_FALSE(bam.EditTag("zz", 500)); // reject edit unknown
+}
+
+TEST(BamRecordImplTagsTest, SimpleQueryTag)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+
+ EXPECT_TRUE(bam.HasTag("XY"));
+ EXPECT_TRUE(bam.HasTag("CA"));
+ EXPECT_TRUE(bam.HasTag("XY"));
+
+ EXPECT_EQ(string("1abc75"), bam.TagValue("HX").ToString());
+ EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam.TagValue("CA").ToUInt8Array());
+ EXPECT_EQ((int32_t)-42, bam.TagValue("XY").ToInt32());
+
+ EXPECT_FALSE(bam.HasTag("zz"));
+ EXPECT_FALSE(bam.HasTag(""));
+ EXPECT_FALSE(bam.HasTag("some_too_long_name"));
+
+ EXPECT_EQ(Tag(), bam.TagValue("zz"));
+ EXPECT_EQ(Tag(), bam.TagValue(""));
+ EXPECT_EQ(Tag(), bam.TagValue("some_too_long_name"));
+}
+
diff --git a/tests/src/test_BamRecordImplVariableData.cpp b/tests/src/test_BamRecordImplVariableData.cpp
new file mode 100644
index 0000000..7a63700
--- /dev/null
+++ b/tests/src/test_BamRecordImplVariableData.cpp
@@ -0,0 +1,4542 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordImpl.h>
+#include <pbbam/BamTagCodec.h>
+#include <pbbam/SamTagCodec.h>
+#include <pbbam/Tag.h>
+#include <pbbam/TagCollection.h>
+#include <algorithm>
+#include <iostream>
+#include <iterator>
+#include <string>
+#include <utility>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+// NOTE: this file has a *TON* of tests. Probably overkill, but I wanted to check
+// every possible combination of variable data, and then manipulate each
+// element within each combo to shrink & expand.
+
+namespace tests {
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+ // ensure raw data (lengths at least) matches API-facing data
+
+ const uint32_t expectedNameLength = bam.Name().size() + 1;
+ const uint32_t expectedNumCigarOps = bam.CigarData().size();
+ const int32_t expectedSeqLength = bam.Sequence().length();
+ const size_t expectedTagsLength = BamTagCodec::Encode(bam.Tags()).size();
+
+ // Name CIGAR Sequence Quals Tags
+ // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + <encoded length>
+
+ const int expectedTotalDataLength = expectedNameLength +
+ (expectedNumCigarOps * 4) +
+ (expectedSeqLength+1)/2 +
+ expectedSeqLength +
+ expectedTagsLength;
+
+ EXPECT_EQ(expectedNameLength, bam.d_->core.l_qname);
+ EXPECT_EQ(expectedNumCigarOps, bam.d_->core.n_cigar);
+ EXPECT_EQ(expectedSeqLength, bam.d_->core.l_qseq);
+ EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+} // namespace tests
+
+TEST(BamRecordImplVariableDataTest, InitEmpty)
+{
+ BamRecordImpl bam;
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_InitEmpty)
+{
+ BamRecordImpl bam;
+ bam.Tags(TagCollection());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_InitNormal)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_ThenOverwriteWithLongerTags)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_ThenOverwriteWithShorterTags)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_ThenOverwriteWithEmptyTags)
+{
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_InitEmpty)
+{
+ BamRecordImpl bam;
+ bam.CigarData(std::string());
+ EXPECT_EQ(0, bam.CigarData().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_InitNormal_CigarObject)
+{
+ Cigar cigar;
+ cigar.push_back(CigarOperation('=', 100));
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(cigar, bam.CigarData());
+ EXPECT_TRUE("100=" == bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_InitNormal_StdString)
+{
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_ThenOverwriteWithLongerCigar)
+{
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_ThenOverwriteWithShorterCigar)
+{
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.CigarData(longerCigar);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_ThenOverwriteWithEmptyCigar)
+{
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_Init_Normal)
+{
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_Init_EmptyCigar)
+{
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_Init_EmptyTag)
+{
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithLongerCigar)
+{
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithShorterCigar)
+{
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(longerCigar);
+ bam.Tags(tags);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithEmptyCigar)
+{
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithLongerTags)
+{
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithShorterTags)
+{
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_Empty)
+{
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(std::string(), std::string());
+ EXPECT_EQ(0, bam.Sequence().size());
+ EXPECT_EQ(0, bam.Qualities().Fastq().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_Preencoded) {
+
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ const size_t encodedLength = static_cast<size_t>((sequence.size()+1)/2);
+ char* encoded = (char*)::calloc(encodedLength, sizeof(char));
+ char* e = encoded;
+
+ uint8_t nucleotideCode;
+ bool useHighWord = true;
+ for (size_t i = 0; i < sequence.size(); ++i) {
+ switch (sequence.at(i)) {
+ case 'A' : nucleotideCode = 1; break;
+ case 'C' : nucleotideCode = 2; break;
+ case 'G' : nucleotideCode = 4; break;
+ case 'T' : nucleotideCode = 8; break;
+ default:
+ EXPECT_FALSE(true);
+ break;
+ }
+
+ // pack the nucleotide code
+ if (useHighWord) {
+ *e = nucleotideCode << 4;
+ useHighWord = false;
+ } else {
+ *e |= nucleotideCode;
+ ++e;
+ useHighWord = true;
+ }
+ }
+
+ BamRecordImpl bam;
+ bam.SetPreencodedSequenceAndQualities(encoded, sequence.size(), qualities.c_str());
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+
+ if (encoded)
+ free(encoded);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_Preencoded_EmptyQual) {
+
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+
+ const size_t encodedLength = static_cast<size_t>((sequence.size()+1)/2);
+ char* encoded = (char*)::calloc(encodedLength, sizeof(char));
+ char* e = encoded;
+
+ uint8_t nucleotideCode;
+ bool useHighWord = true;
+ for (size_t i = 0; i < sequence.size(); ++i) {
+ switch (sequence.at(i)) {
+ case 'A' : nucleotideCode = 1; break;
+ case 'C' : nucleotideCode = 2; break;
+ case 'G' : nucleotideCode = 4; break;
+ case 'T' : nucleotideCode = 8; break;
+ default:
+ EXPECT_FALSE(true);
+ break;
+ }
+
+ // pack the nucleotide code
+ if (useHighWord) {
+ *e = nucleotideCode << 4;
+ useHighWord = false;
+ } else {
+ *e |= nucleotideCode;
+ ++e;
+ useHighWord = true;
+ }
+ }
+
+ BamRecordImpl bam;
+ bam.SetPreencodedSequenceAndQualities(encoded, sequence.size(), qualities.c_str());
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+
+ if (encoded)
+ free(encoded);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithEmptySeq)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_Normal)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_EmptySeqQual)
+{
+ const std::string sequence = "";
+ const std::string qualities = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_EmptyTag)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithEmptySeq)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithLongerTags)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithShorterTags)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_Normal)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_EmptySeqQual)
+{
+ const std::string sequence = "";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_EmptyCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithEmptySeq)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithLongerCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithShorterCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(longerCigar);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithEmptyCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_Normal)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptySeqQual)
+{
+ const std::string sequence = "";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptyCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptyTag)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithEmptySeq)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(longerCigar);
+ bam.Tags(tags);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithEmptyCigar)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerTags)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterTags)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_InitEmpty)
+{
+ BamRecordImpl bam;
+ bam.Name(std::string());
+ EXPECT_EQ(0, bam.Name().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_InitNormal)
+{
+ const std::string readName = "foo";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string emptyName = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Name(emptyName);
+
+ EXPECT_EQ(emptyName, bam.Name());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_Init_Normal)
+{
+ const std::string readName = "foo";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_Init_EmptyName)
+{
+ const std::string readName = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_Init_EmptyTag)
+{
+ const std::string readName = "foo";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(tags);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.Tags(tags);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(tags);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithLongerTags)
+{
+ const std::string readName = "foo";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(readName, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithShorterTags)
+{
+ const std::string readName = "foo";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string readName = "foo";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_Init_Normal)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_Init_EmptyName)
+{
+ const std::string readName = "";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_Init_EmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.CigarData(cigar);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithLongerCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithShorterCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(longerCigar);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithEmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_Normal)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_EmptyName)
+{
+ const std::string readName = "";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_EmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_EmptyTag)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithLongerCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithShorterCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(longerCigar);
+ bam.Tags(tags);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithEmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithLongerTags)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithShorterTags)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string readName = "foo";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_Init_Normal)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_Init_EmptySeqQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "";
+ const std::string qualities = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_Init_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithEmptySeq)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_Normal)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptyName)
+{
+ const std::string readName = "";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptySeqQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "";
+ const std::string qualities = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptyTag)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(0, bam.Tags().size());
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithEmptySeq)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerTags)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterTags)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_Normal)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptyName)
+{
+ const std::string readName = "";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptySeqQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithEmptySeq)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(longerCigar);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithEmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+ tests::CheckRawData(bam);
+}
+
+// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_Normal)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyName)
+{
+ const std::string readName = "";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptySeqQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyTag)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Name(longerName);
+
+ EXPECT_EQ(longerName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerName = "this is a long read name";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(longerName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Name(readName);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptyName)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Name(empty);
+
+ EXPECT_EQ(empty, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(sequence, qualities);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "?]?]";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string shortSeq = "ACGT";
+ const std::string shortQual = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(shortSeq, bam.Sequence());
+ EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptySeq)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.SetSequenceAndQualities(empty, empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(empty, bam.Sequence());
+ EXPECT_EQ(empty, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(longerCigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string longerCigar = "100=10D100=10I100X";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(longerCigar);
+ bam.Tags(tags);
+ bam.CigarData(cigar);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptyCigar)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+ const std::string empty = "";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.CigarData(empty);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerTags)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(longerTags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterTags)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection longerTags;
+ longerTags["HX"] = std::string("1abc75");
+ longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+ longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ longerTags["XY"] = (int32_t)-42;
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(longerTags);
+ bam.Tags(tags);
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+ std::string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+
+ const std::string sam = SamTagCodec::Encode(bam.Tags());
+ EXPECT_EQ(expected, sam);
+
+ tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptyTags)
+{
+ const std::string readName = "foo";
+ const std::string sequence = "ACGTACGTACGT";
+ const std::string qualities = "?]?]?]?]?]?]";
+ const std::string cigar = "100=";
+
+ TagCollection tags;
+ tags["HX"] = std::string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+ tags["XY"] = (int32_t)-42;
+
+ BamRecordImpl bam;
+ bam.Name(readName);
+ bam.SetSequenceAndQualities(sequence, qualities);
+ bam.CigarData(cigar);
+ bam.Tags(tags);
+ bam.Tags(TagCollection());
+
+ EXPECT_EQ(readName, bam.Name());
+ EXPECT_EQ(sequence, bam.Sequence());
+ EXPECT_EQ(qualities, bam.Qualities().Fastq());
+ EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+ EXPECT_EQ(0, bam.Tags().size());
+ tests::CheckRawData(bam);
+}
diff --git a/tests/src/test_BamRecordMapping.cpp b/tests/src/test_BamRecordMapping.cpp
new file mode 100644
index 0000000..fd79367
--- /dev/null
+++ b/tests/src/test_BamRecordMapping.cpp
@@ -0,0 +1,541 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamTagCodec.h>
+#include <chrono>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+typedef vector<uint16_t> f_data;
+
+namespace tests {
+
+static
+BamRecord MakeRecord(const Position qStart,
+ const Position qEnd,
+ const string& seq,
+ const string& quals,
+ const string& tagBases,
+ const string& tagQuals,
+ const f_data& frames)
+{
+ BamRecordImpl impl;
+ impl.SetSequenceAndQualities(seq, quals);
+
+ TagCollection tags;
+ tags["qs"] = qStart;
+ tags["qe"] = qEnd;
+ tags["ip"] = frames;
+ tags["pw"] = frames;
+ tags["dt"] = tagBases;
+ tags["st"] = tagBases;
+ tags["dq"] = tagQuals;
+ tags["iq"] = tagQuals;
+ tags["mq"] = tagQuals;
+ tags["sq"] = tagQuals;
+ tags["pq"] = tagQuals;
+ tags["pv"] = tagQuals;
+ impl.Tags(tags);
+
+ return BamRecord(std::move(impl));
+}
+
+} // namespace tests
+
+TEST(BamRecordMappingTest, BasicMap)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+ const uint8_t mapQual = 80;
+
+ const string seq_rev = "GCTAACGGTT";
+ const string quals_rev = "*?]?]?]?]?";
+ const string tagBases_rev = seq_rev;
+ const string tagQuals_rev = quals_rev;
+ const f_data frames_rev = { 20, 30, 10, 40, 40, 30, 20, 20, 10, 10 };
+
+ const string s1_cigar = "10=";
+ const string s2_cigar = "5=3D5=";
+ const string s3_cigar = "4=1D2I2D4=";
+
+ BamRecord s1 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s2 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s3 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s1_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s2_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s3_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+
+ s1.Map(0, 100, Strand::FORWARD, s1_cigar, mapQual);
+ s2.Map(0, 100, Strand::FORWARD, s2_cigar, mapQual);
+ s3.Map(0, 100, Strand::FORWARD, s3_cigar, mapQual);
+ s1_rev.Map(0, 100, Strand::REVERSE, s1_cigar, mapQual);
+ s2_rev.Map(0, 100, Strand::REVERSE, s2_cigar, mapQual);
+ s3_rev.Map(0, 100, Strand::REVERSE, s3_cigar, mapQual);
+
+ // s1 - FORWARD
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(0, s1.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+ EXPECT_EQ(mapQual, s1.MapQuality());
+
+ EXPECT_EQ(qStart, s1.QueryStart());
+ EXPECT_EQ(qEnd, s1.QueryEnd());
+ EXPECT_EQ(500, s1.AlignedStart());
+ EXPECT_EQ(510, s1.AlignedEnd()); // 500 + 10=
+ EXPECT_EQ(100, s1.ReferenceStart());
+ EXPECT_EQ(110, s1.ReferenceEnd()); // 100 + 10=
+
+ EXPECT_EQ(seq, s1.Sequence());
+ EXPECT_EQ(quals, s1.Qualities().Fastq());
+ EXPECT_EQ(tagBases, s1.DeletionTag());
+ EXPECT_EQ(tagQuals, s1.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s1.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s1.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, s1.IPD().Data());
+
+ // s1 - REVERSE
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(0, s1_rev.ReferenceId());
+ EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+ EXPECT_EQ(mapQual, s1_rev.MapQuality());
+
+ EXPECT_EQ(qStart, s1_rev.QueryStart());
+ EXPECT_EQ(qEnd, s1_rev.QueryEnd());
+ EXPECT_EQ(500, s1_rev.AlignedStart());
+ EXPECT_EQ(510, s1_rev.AlignedEnd()); // 500 + 10=
+ EXPECT_EQ(100, s1_rev.ReferenceStart());
+ EXPECT_EQ(110, s1_rev.ReferenceEnd()); // 100 + 10=
+
+ // - native
+ EXPECT_EQ(seq, s1_rev.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(quals, s1_rev.Qualities(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagBases, s1_rev.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tagQuals, s1_rev.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s1_rev.LabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s1_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(frames, s1_rev.IPD(Orientation::NATIVE).Data());
+
+ // - genomic
+ EXPECT_EQ(seq_rev, s1_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev, s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev, s1_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev, s1_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - FORWARD
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(0, s2.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+ EXPECT_EQ(mapQual, s2.MapQuality());
+
+ EXPECT_EQ(qStart, s2.QueryStart());
+ EXPECT_EQ(qEnd, s2.QueryEnd());
+ EXPECT_EQ(500, s2.AlignedStart());
+ EXPECT_EQ(510, s2.AlignedEnd()); // 500 + 10=
+ EXPECT_EQ(100, s2.ReferenceStart());
+ EXPECT_EQ(113, s2.ReferenceEnd()); // 100 + 10= + 3D
+
+ EXPECT_EQ(seq, s2.Sequence());
+ EXPECT_EQ(quals, s2.Qualities().Fastq());
+ EXPECT_EQ(tagBases, s2.DeletionTag());
+ EXPECT_EQ(tagQuals, s2.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s2.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s2.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, s2.IPD().Data());
+
+ // s2 - REVERSE
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(0, s2_rev.ReferenceId());
+ EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+ EXPECT_EQ(mapQual, s2_rev.MapQuality());
+
+ EXPECT_EQ(qStart, s2_rev.QueryStart());
+ EXPECT_EQ(qEnd, s2_rev.QueryEnd());
+ EXPECT_EQ(500, s2_rev.AlignedStart());
+ EXPECT_EQ(510, s2_rev.AlignedEnd()); // 500 + 10=
+ EXPECT_EQ(100, s2_rev.ReferenceStart());
+ EXPECT_EQ(113, s2_rev.ReferenceEnd()); // 100 + 10= + 3D
+
+ // - native
+ EXPECT_EQ(seq, s2_rev.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(quals, s2_rev.Qualities(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagBases, s2_rev.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tagQuals, s2_rev.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s2_rev.LabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s2_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(frames, s2_rev.IPD(Orientation::NATIVE).Data());
+
+ // - genomic
+ EXPECT_EQ(seq_rev, s2_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev, s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev, s2_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev, s2_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(0, s3.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(mapQual, s3.MapQuality());
+
+ EXPECT_EQ(qStart, s3.QueryStart());
+ EXPECT_EQ(qEnd, s3.QueryEnd());
+ EXPECT_EQ(500, s3.AlignedStart());
+ EXPECT_EQ(510, s3.AlignedEnd()); // 500 + 8= + 2I
+ EXPECT_EQ(100, s3.ReferenceStart());
+ EXPECT_EQ(111, s3.ReferenceEnd()); // 100 + 8= + 3D
+
+ EXPECT_EQ(seq, s3.Sequence());
+ EXPECT_EQ(quals, s3.Qualities().Fastq());
+ EXPECT_EQ(tagBases, s3.DeletionTag());
+ EXPECT_EQ(tagQuals, s3.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s3.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s3.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, s3.IPD().Data());
+
+ // s3 - REVERSE
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(0, s3_rev.ReferenceId());
+ EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+ EXPECT_EQ(mapQual, s3_rev.MapQuality());
+
+ EXPECT_EQ(qStart, s3_rev.QueryStart());
+ EXPECT_EQ(qEnd, s3_rev.QueryEnd());
+ EXPECT_EQ(500, s3_rev.AlignedStart());
+ EXPECT_EQ(510, s3_rev.AlignedEnd()); // 500 + 8= + 2I
+ EXPECT_EQ(100, s3_rev.ReferenceStart());
+ EXPECT_EQ(111, s3_rev.ReferenceEnd()); // 100 + 8= + 3D
+
+ // - native
+ EXPECT_EQ(seq, s3_rev.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(quals, s3_rev.Qualities(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagBases, s3_rev.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tagQuals, s3_rev.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s3_rev.LabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s3_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(frames, s3_rev.IPD(Orientation::NATIVE).Data());
+
+ // - genomic
+ EXPECT_EQ(seq_rev, s3_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev, s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev, s3_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev, s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordMappingTest, SoftClipMapping)
+{
+ const Position qStart = 500;
+ const Position qEnd = 515;
+ const string seq = "TTAACCGTTAGCAAA";
+ const string quals = "--?]?]?]?]?*+++";
+ const string tagBases = "TTAACCGTTAGCAAA";
+ const string tagQuals = "--?]?]?]?]?*+++";
+ const f_data frames = { 40, 40, 10, 10, 20, 20, 30, 40, 40, 10, 30, 20, 10, 10, 10 };
+ const uint8_t mapQual = 80;
+
+ const string seq_rev = "TTTGCTAACGGTTAA";
+ const string quals_rev = "+++*?]?]?]?]?--";
+ const string tagBases_rev = seq_rev;
+ const string tagQuals_rev = quals_rev;
+ const f_data frames_rev = { 10, 10, 10, 20, 30, 10, 40, 40, 30, 20, 20, 10, 10, 40, 40 };
+
+ const string s1_cigar = "2S10=3S";
+ const string s2_cigar = "2S5=3D5=3S";
+ const string s3_cigar = "2S4=1D2I2D4=3S";
+
+ BamRecord s1 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s2 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s3 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s1_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s2_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ BamRecord s3_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+
+ s1.Map(0, 100, Strand::FORWARD, s1_cigar, mapQual);
+ s2.Map(0, 100, Strand::FORWARD, s2_cigar, mapQual);
+ s3.Map(0, 100, Strand::FORWARD, s3_cigar, mapQual);
+ s1_rev.Map(0, 100, Strand::REVERSE, s1_cigar, mapQual);
+ s2_rev.Map(0, 100, Strand::REVERSE, s2_cigar, mapQual);
+ s3_rev.Map(0, 100, Strand::REVERSE, s3_cigar, mapQual);
+
+ // s1 - FORWARD
+ EXPECT_TRUE(s1.IsMapped());
+ EXPECT_EQ(0, s1.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+ EXPECT_EQ(mapQual, s1.MapQuality());
+
+ EXPECT_EQ(qStart, s1.QueryStart()); // 500
+ EXPECT_EQ(qEnd, s1.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(502, s1.AlignedStart()); // QStart + 2S
+ EXPECT_EQ(512, s1.AlignedEnd()); // AStart + 10=
+ EXPECT_EQ(100, s1.ReferenceStart()); // 100
+ EXPECT_EQ(110, s1.ReferenceEnd()); // RefStart + 10=
+
+ EXPECT_EQ(seq, s1.Sequence());
+ EXPECT_EQ(quals, s1.Qualities().Fastq());
+ EXPECT_EQ(tagBases, s1.DeletionTag());
+ EXPECT_EQ(tagQuals, s1.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s1.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s1.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, s1.IPD().Data());
+
+ // s1 - REVERSE
+ EXPECT_TRUE(s1_rev.IsMapped());
+ EXPECT_EQ(0, s1_rev.ReferenceId());
+ EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+ EXPECT_EQ(mapQual, s1_rev.MapQuality());
+
+ EXPECT_EQ(qStart, s1_rev.QueryStart()); // 500
+ EXPECT_EQ(qEnd, s1_rev.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(503, s1_rev.AlignedStart()); // QStart + 3S
+ EXPECT_EQ(513, s1_rev.AlignedEnd()); // AStart + 10=
+ EXPECT_EQ(100, s1_rev.ReferenceStart()); // 100
+ EXPECT_EQ(110, s1_rev.ReferenceEnd()); // RefStart + 10=
+
+ // - native
+ EXPECT_EQ(seq, s1_rev.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(quals, s1_rev.Qualities(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagBases, s1_rev.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tagQuals, s1_rev.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s1_rev.LabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s1_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(frames, s1_rev.IPD(Orientation::NATIVE).Data());
+
+ // - genomic
+ EXPECT_EQ(seq_rev, s1_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev, s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev, s1_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev, s1_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s2 - FORWARD
+ EXPECT_TRUE(s2.IsMapped());
+ EXPECT_EQ(0, s2.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+ EXPECT_EQ(mapQual, s2.MapQuality());
+
+ EXPECT_EQ(qStart, s2.QueryStart()); // 500
+ EXPECT_EQ(qEnd, s2.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(502, s2.AlignedStart()); // QStart + 2S
+ EXPECT_EQ(512, s2.AlignedEnd()); // AStart + 10=
+ EXPECT_EQ(100, s2.ReferenceStart()); // 100
+ EXPECT_EQ(113, s2.ReferenceEnd()); // RefStart + 10= + 3D
+
+ EXPECT_EQ(seq, s2.Sequence());
+ EXPECT_EQ(quals, s2.Qualities().Fastq());
+ EXPECT_EQ(tagBases, s2.DeletionTag());
+ EXPECT_EQ(tagQuals, s2.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s2.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s2.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, s2.IPD().Data());
+
+ // s2 - REVERSE
+ EXPECT_TRUE(s2_rev.IsMapped());
+ EXPECT_EQ(0, s2_rev.ReferenceId());
+ EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+ EXPECT_EQ(mapQual, s2_rev.MapQuality());
+
+ EXPECT_EQ(qStart, s2_rev.QueryStart()); // 500
+ EXPECT_EQ(qEnd, s2_rev.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(503, s2_rev.AlignedStart()); // QStart + 3S
+ EXPECT_EQ(513, s2_rev.AlignedEnd()); // AStart + 10=
+ EXPECT_EQ(100, s2_rev.ReferenceStart()); // 100
+ EXPECT_EQ(113, s2_rev.ReferenceEnd()); // RefStart + 10= + 3D
+
+ // - native
+ EXPECT_EQ(seq, s2_rev.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(quals, s2_rev.Qualities(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagBases, s2_rev.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tagQuals, s2_rev.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s2_rev.LabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s2_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(frames, s2_rev.IPD(Orientation::NATIVE).Data());
+
+ // - genomic
+ EXPECT_EQ(seq_rev, s2_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev, s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev, s2_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev, s2_rev.IPD(Orientation::GENOMIC).Data());
+
+ // s3 - FORWARD
+ EXPECT_TRUE(s3.IsMapped());
+ EXPECT_EQ(0, s3.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+ EXPECT_EQ(mapQual, s3.MapQuality());
+
+ EXPECT_EQ(qStart, s3.QueryStart()); // 500
+ EXPECT_EQ(qEnd, s3.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(502, s3.AlignedStart()); // QStart + 2S
+ EXPECT_EQ(512, s3.AlignedEnd()); // AStart + 8= + 2I
+ EXPECT_EQ(100, s3.ReferenceStart()); // 100
+ EXPECT_EQ(111, s3.ReferenceEnd()); // RefStart + 8= + 3D
+
+ EXPECT_EQ(seq, s3.Sequence());
+ EXPECT_EQ(quals, s3.Qualities().Fastq());
+ EXPECT_EQ(tagBases, s3.DeletionTag());
+ EXPECT_EQ(tagQuals, s3.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, s3.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, s3.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, s3.IPD().Data());
+
+ // s3 - REVERSE
+ EXPECT_TRUE(s3_rev.IsMapped());
+ EXPECT_EQ(0, s3_rev.ReferenceId());
+ EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+ EXPECT_EQ(mapQual, s3_rev.MapQuality());
+
+ EXPECT_EQ(qStart, s3_rev.QueryStart()); // 500
+ EXPECT_EQ(qEnd, s3_rev.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(503, s3_rev.AlignedStart()); // QStart + 3S
+ EXPECT_EQ(513, s3_rev.AlignedEnd()); // AStart + 8= + 2I
+ EXPECT_EQ(100, s3_rev.ReferenceStart()); // 100
+ EXPECT_EQ(111, s3_rev.ReferenceEnd()); // RefStart + 8= + 3D
+
+ // - native
+ EXPECT_EQ(seq, s3_rev.Sequence(Orientation::NATIVE));
+ EXPECT_EQ(quals, s3_rev.Qualities(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagBases, s3_rev.DeletionTag(Orientation::NATIVE));
+ EXPECT_EQ(tagQuals, s3_rev.DeletionQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s3_rev.LabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(tagQuals, s3_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+ EXPECT_EQ(frames, s3_rev.IPD(Orientation::NATIVE).Data());
+
+ // - genomic
+ EXPECT_EQ(seq_rev, s3_rev.Sequence(Orientation::GENOMIC));
+ EXPECT_EQ(quals_rev, s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagBases_rev, s3_rev.DeletionTag(Orientation::GENOMIC));
+ EXPECT_EQ(tagQuals_rev, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(tagQuals_rev, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+ EXPECT_EQ(frames_rev, s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordMappingTest, MappedCopy)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+ const uint8_t mapQual = 80;
+ const string cigar = "4=1D2I2D4=";
+
+ const BamRecord orig = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ const BamRecord mapped = orig.Mapped(0, 100, Strand::FORWARD, cigar, mapQual);
+
+ EXPECT_TRUE(mapped.IsMapped());
+ EXPECT_EQ(0, mapped.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, mapped.AlignedStrand());
+ EXPECT_EQ(mapQual, mapped.MapQuality());
+
+ EXPECT_EQ(500, mapped.QueryStart()); // 500
+ EXPECT_EQ(510, mapped.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(500, mapped.AlignedStart()); // QStart
+ EXPECT_EQ(510, mapped.AlignedEnd()); // QStart + 8= + 2I
+ EXPECT_EQ(100, mapped.ReferenceStart()); // 100
+ EXPECT_EQ(111, mapped.ReferenceEnd()); // RefStart + 8= + 3D
+
+ EXPECT_EQ(seq, mapped.Sequence());
+ EXPECT_EQ(quals, mapped.Qualities().Fastq());
+ EXPECT_EQ(tagBases, mapped.DeletionTag());
+ EXPECT_EQ(tagQuals, mapped.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, mapped.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, mapped.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, mapped.IPD().Data());
+}
+
+TEST(BamRecordMappingTest, StaticMapped)
+{
+ const Position qStart = 500;
+ const Position qEnd = 510;
+ const string seq = "AACCGTTAGC";
+ const string quals = "?]?]?]?]?*";
+ const string tagBases = "AACCGTTAGC";
+ const string tagQuals = "?]?]?]?]?*";
+ const f_data frames = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+ const uint8_t mapQual = 80;
+ const string cigar = "4=1D2I2D4=";
+
+ const BamRecord orig = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+ const BamRecord mapped = BamRecord::Mapped(orig, 0, 100, Strand::FORWARD, cigar, mapQual);
+
+ EXPECT_TRUE(mapped.IsMapped());
+ EXPECT_EQ(0, mapped.ReferenceId());
+ EXPECT_EQ(Strand::FORWARD, mapped.AlignedStrand());
+ EXPECT_EQ(mapQual, mapped.MapQuality());
+
+ EXPECT_EQ(500, mapped.QueryStart()); // 500
+ EXPECT_EQ(510, mapped.QueryEnd()); // QStart + seqLength
+ EXPECT_EQ(500, mapped.AlignedStart()); // QStart
+ EXPECT_EQ(510, mapped.AlignedEnd()); // QStart + 8= + 2I
+ EXPECT_EQ(100, mapped.ReferenceStart()); // 100
+ EXPECT_EQ(111, mapped.ReferenceEnd()); // RefStart + 8= + 3D
+
+ EXPECT_EQ(seq, mapped.Sequence());
+ EXPECT_EQ(quals, mapped.Qualities().Fastq());
+ EXPECT_EQ(tagBases, mapped.DeletionTag());
+ EXPECT_EQ(tagQuals, mapped.DeletionQV().Fastq());
+ EXPECT_EQ(tagQuals, mapped.LabelQV().Fastq());
+ EXPECT_EQ(tagQuals, mapped.AltLabelQV().Fastq());
+ EXPECT_EQ(frames, mapped.IPD().Data());
+}
diff --git a/tests/src/test_BamWriter.cpp b/tests/src/test_BamWriter.cpp
new file mode 100644
index 0000000..320c698
--- /dev/null
+++ b/tests/src/test_BamWriter.cpp
@@ -0,0 +1,198 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <htslib/sam.h>
+#include <pbbam/BamHeader.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamWriter.h>
+#include <pbbam/EntireFileQuery.h>
+#include <chrono>
+#include <iostream>
+#include <string>
+#include <cstdio>
+#include <cstdlib>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+// put any BamWriter-only API tests here (error handling, etc.)
+//
+// plain ol' read & dump is in test_EndToEnd.cpp
+
+const string generatedBamFn = tests::Data_Dir + "/generated.bam";
+
+struct ResultPacket
+{
+ std::string name;
+ char* bases;
+ char* overallQv;
+ size_t length;
+ int zmwNum;
+ int startPos;
+ BamRecord bamRecord;
+
+ ResultPacket() = default;
+
+ ResultPacket(ResultPacket&& src)
+ {
+ name = std::move(src.name);
+
+ bases = src.bases;
+ overallQv = src.overallQv;
+ length = src.length;
+
+ zmwNum = src.zmwNum;
+ startPos = src.startPos;
+
+ src.bases = 0;
+ src.overallQv = 0;
+
+ bamRecord = std::move(src.bamRecord);
+ }
+ // Copy constructor
+ ResultPacket(const ResultPacket&) = delete;
+ // Move assignment constructor
+ ResultPacket& operator=(ResultPacket&&) = delete;
+ // Copy assignment constructor
+ ResultPacket& operator=(const ResultPacket&) = delete;
+ // Destructor
+ ~ResultPacket()
+ {
+ // delete [] basesBam;
+ if (bases != 0) delete [] bases;
+ if (overallQv != 0) delete [] overallQv;
+ }
+};
+
+TEST(BamWriterTest, SingleWrite_UserRecord)
+{
+ //Writing a ResultPacket in Workflow.h:
+ ResultPacket result;
+ result.zmwNum = 42;
+ result.name = "ZMW\\"+std::to_string(42);
+ auto length = 5;
+
+ result.bases = (char*) calloc(length,1);
+ result.overallQv = (char*) calloc(length,1);
+ // FILL WITH CONTENT
+ result.bases[0] = 'A';
+ result.bases[1] = 'C';
+ result.bases[2] = 'G';
+ result.bases[3] = 'T';
+ result.bases[4] = 'C';
+ result.overallQv[0] = ']';
+ result.overallQv[1] = '6';
+ result.overallQv[2] = '4';
+ result.overallQv[3] = '@';
+ result.overallQv[4] = '<';
+
+ // Encode data to BamAlignment
+ result.bamRecord.impl_.Name(result.name);
+ result.bamRecord.impl_.SetSequenceAndQualities(result.bases, length);
+ result.bamRecord.impl_.CigarData("");
+ result.bamRecord.impl_.Bin(0);
+ result.bamRecord.impl_.Flag(0);
+ result.bamRecord.impl_.InsertSize(0);
+ result.bamRecord.impl_.MapQuality(0);
+ result.bamRecord.impl_.MatePosition(-1);
+ result.bamRecord.impl_.MateReferenceId(-1);
+ result.bamRecord.impl_.Position(-1);
+ result.bamRecord.impl_.ReferenceId(-1);
+
+ std::vector<uint8_t> subQv = std::vector<uint8_t>({34, 5, 125});
+
+ TagCollection tags;
+ tags["SQ"] = subQv;
+
+ Tag asciiTag('J');
+ asciiTag.Modifier(TagModifier::ASCII_CHAR);
+
+ // add ASCII tag via TagCollection
+ tags["a1"] = asciiTag;
+ result.bamRecord.impl_.Tags(tags);
+
+ // add ASCII tag via BamRecordImpl
+ Tag asciiTag2('K');
+ asciiTag2.Modifier(TagModifier::ASCII_CHAR);
+ result.bamRecord.impl_.AddTag("a2", asciiTag2);
+
+ BamHeader headerSubreads;
+ headerSubreads.Version("1.1")
+ .SortOrder("coordinate");
+
+ EXPECT_NO_THROW ({
+ BamWriter writer(generatedBamFn, headerSubreads);
+ writer.Write(result.bamRecord);
+ });
+
+ EXPECT_NO_THROW ({
+ BamFile file(generatedBamFn);
+ EXPECT_EQ(std::string("1.1"), file.Header().Version());
+ EXPECT_EQ(std::string("coordinate"), file.Header().SortOrder());
+
+ EntireFileQuery entireFile(file);
+ for (const BamRecord& record : entireFile) {
+ const BamRecordImpl& impl = record.Impl();
+
+ EXPECT_EQ(std::string("ACGTC"), impl.Sequence());
+ EXPECT_EQ(std::string("ZMW\\42"), impl.Name());
+
+ const TagCollection& implTags = impl.Tags();
+ EXPECT_TRUE(implTags.Contains("SQ"));
+ EXPECT_TRUE(implTags.Contains("a1"));
+ EXPECT_TRUE(implTags.Contains("a2"));
+
+ const Tag sqTag = impl.TagValue("SQ");
+ const Tag a1Tag = impl.TagValue("a1");
+ const Tag a2Tag = impl.TagValue("a2");
+ EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), sqTag.ToUInt8Array());
+ EXPECT_EQ('J', a1Tag.ToAscii());
+ EXPECT_EQ('K', a2Tag.ToAscii());
+
+ // just check first record
+ break;
+ }
+ });
+
+ remove(generatedBamFn.c_str());
+}
diff --git a/tests/src/test_Cigar.cpp b/tests/src/test_Cigar.cpp
new file mode 100644
index 0000000..796720a
--- /dev/null
+++ b/tests/src/test_Cigar.cpp
@@ -0,0 +1,198 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/Cigar.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(CigarTest, TypeToCar)
+{
+ EXPECT_EQ('M', CigarOperation::TypeToChar(CigarOperationType::ALIGNMENT_MATCH) );
+ EXPECT_EQ('I', CigarOperation::TypeToChar(CigarOperationType::INSERTION) );
+ EXPECT_EQ('D', CigarOperation::TypeToChar(CigarOperationType::DELETION) );
+ EXPECT_EQ('N', CigarOperation::TypeToChar(CigarOperationType::REFERENCE_SKIP) );
+ EXPECT_EQ('S', CigarOperation::TypeToChar(CigarOperationType::SOFT_CLIP) );
+ EXPECT_EQ('H', CigarOperation::TypeToChar(CigarOperationType::HARD_CLIP) );
+ EXPECT_EQ('P', CigarOperation::TypeToChar(CigarOperationType::PADDING) );
+ EXPECT_EQ('=', CigarOperation::TypeToChar(CigarOperationType::SEQUENCE_MATCH) );
+ EXPECT_EQ('X', CigarOperation::TypeToChar(CigarOperationType::SEQUENCE_MISMATCH) );
+}
+
+TEST(CigarTest, CharToType)
+{
+ EXPECT_EQ(CigarOperationType::ALIGNMENT_MATCH, CigarOperation::CharToType('M'));
+ EXPECT_EQ(CigarOperationType::INSERTION, CigarOperation::CharToType('I'));
+ EXPECT_EQ(CigarOperationType::DELETION, CigarOperation::CharToType('D'));
+ EXPECT_EQ(CigarOperationType::REFERENCE_SKIP, CigarOperation::CharToType('N'));
+ EXPECT_EQ(CigarOperationType::SOFT_CLIP, CigarOperation::CharToType('S'));
+ EXPECT_EQ(CigarOperationType::HARD_CLIP, CigarOperation::CharToType('H'));
+ EXPECT_EQ(CigarOperationType::PADDING, CigarOperation::CharToType('P'));
+ EXPECT_EQ(CigarOperationType::SEQUENCE_MATCH, CigarOperation::CharToType('='));
+ EXPECT_EQ(CigarOperationType::SEQUENCE_MISMATCH, CigarOperation::CharToType('X'));
+}
+
+TEST(CigarTest, SetOperationYieldsCorrectType)
+{
+ CigarOperation c1; c1.Type(CigarOperationType::ALIGNMENT_MATCH);
+ CigarOperation c2; c2.Type(CigarOperationType::INSERTION);
+ CigarOperation c3; c3.Type(CigarOperationType::DELETION);
+ CigarOperation c4; c4.Type(CigarOperationType::REFERENCE_SKIP);
+ CigarOperation c5; c5.Type(CigarOperationType::SOFT_CLIP);
+ CigarOperation c6; c6.Type(CigarOperationType::HARD_CLIP);
+ CigarOperation c7; c7.Type(CigarOperationType::PADDING);
+ CigarOperation c8; c8.Type(CigarOperationType::SEQUENCE_MATCH);
+ CigarOperation c9; c9.Type(CigarOperationType::SEQUENCE_MISMATCH);
+
+ EXPECT_EQ('M', c1.Char());
+ EXPECT_EQ('I', c2.Char());
+ EXPECT_EQ('D', c3.Char());
+ EXPECT_EQ('N', c4.Char());
+ EXPECT_EQ('S', c5.Char());
+ EXPECT_EQ('H', c6.Char());
+ EXPECT_EQ('P', c7.Char());
+ EXPECT_EQ('=', c8.Char());
+ EXPECT_EQ('X', c9.Char());
+}
+
+TEST(CigarTest, SetTypeYieldsCorrectOperation)
+{
+ CigarOperation c1; c1.Char('M');
+ CigarOperation c2; c2.Char('I');
+ CigarOperation c3; c3.Char('D');
+ CigarOperation c4; c4.Char('N');
+ CigarOperation c5; c5.Char('S');
+ CigarOperation c6; c6.Char('H');
+ CigarOperation c7; c7.Char('P');
+ CigarOperation c8; c8.Char('=');
+ CigarOperation c9; c9.Char('X');
+
+ EXPECT_EQ(CigarOperationType::ALIGNMENT_MATCH, c1.Type());
+ EXPECT_EQ(CigarOperationType::INSERTION, c2.Type());
+ EXPECT_EQ(CigarOperationType::DELETION, c3.Type());
+ EXPECT_EQ(CigarOperationType::REFERENCE_SKIP, c4.Type());
+ EXPECT_EQ(CigarOperationType::SOFT_CLIP, c5.Type());
+ EXPECT_EQ(CigarOperationType::HARD_CLIP, c6.Type());
+ EXPECT_EQ(CigarOperationType::PADDING, c7.Type());
+ EXPECT_EQ(CigarOperationType::SEQUENCE_MATCH, c8.Type());
+ EXPECT_EQ(CigarOperationType::SEQUENCE_MISMATCH, c9.Type());
+}
+
+TEST(CigarStringTest, FromStdString_Empty)
+{
+ const string emptyCigar = "";
+ Cigar cigar = Cigar::FromStdString(emptyCigar);
+ EXPECT_TRUE(cigar.empty());
+}
+
+TEST(CigarStringTest, FromStdString_SingleOp)
+{
+ const string singleCigar = "100=";
+
+ Cigar cigar = Cigar::FromStdString(singleCigar);
+ ASSERT_TRUE(cigar.size() == 1);
+
+ const CigarOperation& op = cigar.front();
+ EXPECT_TRUE(op.Char() == '=');
+ EXPECT_TRUE(op.Length() == 100);
+}
+
+TEST(CigarStringTest, FromStdString_MultipleOps)
+{
+ const string multiCigar = "100=2D34I6=6X6=";
+
+ Cigar cigar = Cigar::FromStdString(multiCigar);
+ ASSERT_TRUE(cigar.size() == 6);
+
+ CigarOperation op0 = cigar.at(0);
+ CigarOperation op1 = cigar.at(1);
+ CigarOperation op2 = cigar.at(2);
+ CigarOperation op3 = cigar.at(3);
+ CigarOperation op4 = cigar.at(4);
+ CigarOperation op5 = cigar.at(5);
+
+ EXPECT_TRUE(op0.Char() == '=');
+ EXPECT_TRUE(op0.Length() == 100);
+ EXPECT_TRUE(op1.Char() == 'D');
+ EXPECT_TRUE(op1.Length() == 2);
+ EXPECT_TRUE(op2.Char() == 'I');
+ EXPECT_TRUE(op2.Length() == 34);
+ EXPECT_TRUE(op3.Char() == '=');
+ EXPECT_TRUE(op3.Length() == 6);
+ EXPECT_TRUE(op4.Char() == 'X');
+ EXPECT_TRUE(op4.Length() == 6);
+ EXPECT_TRUE(op5.Char() == '=');
+ EXPECT_TRUE(op5.Length() == 6);
+}
+
+TEST(CigarStringTest, ToStdString_Empty)
+{
+ const string empty;
+ Cigar cigar;
+ EXPECT_EQ(empty, cigar.ToStdString());
+}
+
+TEST(CigarStringTest, ToStdString_SingleOp)
+{
+ const string singleCigar = "100=";
+
+ Cigar cigar;
+ cigar.push_back( CigarOperation(CigarOperationType::SEQUENCE_MATCH, 100) );
+
+ EXPECT_EQ(singleCigar, cigar.ToStdString());
+}
+
+TEST(CigarStringTest, ToStdString_MultipleOps)
+{
+ const string multiCigar = "100=2D34I6=6X6=";
+
+ Cigar cigar;
+ cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MATCH, 100));
+ cigar.push_back(CigarOperation(CigarOperationType::DELETION, 2));
+ cigar.push_back(CigarOperation(CigarOperationType::INSERTION, 34));
+ cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MATCH, 6));
+ cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MISMATCH, 6));
+ cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MATCH, 6));
+
+ EXPECT_EQ(multiCigar, cigar.ToStdString());
+}
diff --git a/tests/src/test_DataSetCore.cpp b/tests/src/test_DataSetCore.cpp
new file mode 100644
index 0000000..2ad0a4e
--- /dev/null
+++ b/tests/src/test_DataSetCore.cpp
@@ -0,0 +1,482 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/DataSet.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+static inline
+DataSet CreateDataSet(void)
+{
+ DataSet d;
+ d.Name("foo");
+ return d;
+}
+
+} // namespace tests
+
+TEST(DataSetCoreTest, XmlNameParts)
+{
+ internal::XmlName name("ns:node_name");
+ EXPECT_EQ(boost::string_ref("ns"), name.Prefix());
+ EXPECT_EQ(boost::string_ref("node_name"), name.LocalName());
+ EXPECT_EQ(boost::string_ref("ns:node_name"), name.QualifiedName());
+
+ internal::XmlName bareName("node_name");
+ EXPECT_EQ(boost::string_ref(""), bareName.Prefix());
+ EXPECT_EQ(boost::string_ref("node_name"), bareName.LocalName());
+ EXPECT_EQ(boost::string_ref("node_name"), bareName.QualifiedName());
+
+ internal::XmlName leadingColon(":node_name");
+ EXPECT_EQ(boost::string_ref(""), leadingColon.Prefix());
+ EXPECT_EQ(boost::string_ref(":node_name"), leadingColon.LocalName());
+ EXPECT_EQ(boost::string_ref(":node_name"), leadingColon.QualifiedName());
+}
+
+TEST(DataSetCoreTest, NamespacesOk)
+{
+
+}
+
+TEST(DataSetCoreTest, DefaultsOk)
+{
+ DataSet dataset;
+ EXPECT_EQ(DataSet::GENERIC, dataset.Type());
+ EXPECT_FALSE(dataset.CreatedAt().empty()); // default init
+ EXPECT_TRUE(dataset.Format().empty());
+ EXPECT_TRUE(dataset.MetaType().empty());
+ EXPECT_TRUE(dataset.ModifiedAt().empty());
+ EXPECT_TRUE(dataset.Name().empty());
+ EXPECT_TRUE(dataset.ResourceId().empty());
+ EXPECT_TRUE(dataset.Tags().empty());
+ EXPECT_TRUE(dataset.TimeStampedName().empty());
+ EXPECT_TRUE(dataset.UniqueId().empty());
+ EXPECT_TRUE(dataset.Version().empty());
+ EXPECT_EQ(0, dataset.ExternalResources().Size());
+ EXPECT_EQ(0, dataset.Filters().Size());
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+}
+
+TEST(DataSetCoreTest, BasicGettersSettersOk)
+{
+ DataSet dataset;
+ dataset.CreatedAt("now");
+ dataset.Format("format");
+ dataset.MetaType("meta");
+ dataset.ModifiedAt("later");
+ dataset.Name("foo");
+ dataset.ResourceId("path/to/file");
+ dataset.Tags("tag tag");
+ dataset.TimeStampedName("now:30");
+ dataset.UniqueId("uuid");
+ dataset.Version("0.0.0");
+
+ EXPECT_EQ(string("now"), dataset.CreatedAt());
+ EXPECT_EQ(string("format"), dataset.Format());
+ EXPECT_EQ(string("meta"), dataset.MetaType());
+ EXPECT_EQ(string("later"), dataset.ModifiedAt());
+ EXPECT_EQ(string("foo"), dataset.Name());
+ EXPECT_EQ(string("path/to/file"), dataset.ResourceId());
+ EXPECT_EQ(string("tag tag"), dataset.Tags());
+ EXPECT_EQ(string("now:30"), dataset.TimeStampedName());
+ EXPECT_EQ(string("uuid"), dataset.UniqueId());
+ EXPECT_EQ(string("0.0.0"), dataset.Version());
+}
+
+TEST(DataSetCoreTest, CopyOk)
+{
+ DataSet d1;
+ d1.Name("foo");
+
+ // copy ctor
+ DataSet d2(d1);
+ EXPECT_EQ(string("foo"), d2.Name());
+
+ // copy assignment
+ DataSet d3;
+ d3 = d1;
+ EXPECT_EQ(string("foo"), d3.Name());
+}
+
+TEST(DataSetCoreTest, MoveOk)
+{
+ DataSet d1;
+ d1.Name("foo");
+
+ // move ctor
+ DataSet d2(std::move(tests::CreateDataSet()));
+ EXPECT_EQ(string("foo"), d2.Name());
+
+ // move assignment
+ DataSet d3;
+ d3 = std::move(tests::CreateDataSet());
+ EXPECT_EQ(string("foo"), d3.Name());
+}
+
+TEST(DataSetCoreTest, AddExternalResources)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.ExternalResources().Size());
+
+ ExternalResource resource1;
+ resource1.Name("file1");
+
+ ExternalResource resource2;
+ resource2.Name("file2");
+ resource2.MetaType("blah");
+
+ dataset.ExternalResources().Add(resource1);
+ dataset.ExternalResources().Add(resource2);
+ EXPECT_EQ(2, dataset.ExternalResources().Size());
+
+ // direct access
+ const ExternalResources& resources = dataset.ExternalResources();
+ EXPECT_EQ(string("file1"), resources[0].Name());
+ EXPECT_EQ(string("file2"), resources[1].Name());
+
+ // iterable
+ size_t i = 0;
+ for (auto r : resources) {
+ if (i == 0)
+ EXPECT_EQ(string("file1"), r.Name());
+ else
+ EXPECT_EQ(string("file2"), r.Name());
+ ++i;
+ }
+}
+
+TEST(DataSetCoreTest, EditExternalResources)
+{
+ DataSet dataset;
+
+ ExternalResource resource;
+ resource.Name("file1");
+ dataset.ExternalResources().Add(resource);
+
+ resource.Name("file2");
+ dataset.ExternalResources().Add(resource);
+ EXPECT_EQ(2, dataset.ExternalResources().Size());
+
+ // edit
+ dataset.ExternalResources()[0].Name("some new name");
+ EXPECT_EQ(string("some new name"), dataset.ExternalResources()[0].Name());
+ EXPECT_EQ(string("file2"), dataset.ExternalResources()[1].Name());
+}
+
+TEST(DataSetCoreTest, AddFilters)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ Filter filter;
+ filter.Properties().Add(Property("rq", "0.85", ">"));
+ filter.Properties().Add(Property("RNAME", "chr1", "=="));
+ EXPECT_EQ(2, filter.Properties().Size());
+
+ Filter filter2;
+ filter2.Properties().Add(Property("rq", "0.50", ">="));
+ filter2.Properties().Add(Property("RNAME", "chr2", "!="));
+ EXPECT_EQ(2, filter2.Properties().Size());
+
+ dataset.Filters().Add(filter);
+ dataset.Filters().Add(filter2);
+
+ const Filters& filters = dataset.Filters();
+ EXPECT_EQ(2, filters.Size());
+ EXPECT_EQ(2, filters[0].Properties().Size());
+ EXPECT_EQ(2, filters[1].Properties().Size());
+
+ // direct access
+ const Property& p0 = filters[0].Properties()[0];
+ EXPECT_EQ(string("rq"), p0.Name());
+ EXPECT_EQ(string("0.85"), p0.Value());
+ EXPECT_EQ(string(">"), p0.Operator());
+
+ const Property& p1 = filters[0].Properties()[1];
+ EXPECT_EQ(string("RNAME"), p1.Name());
+ EXPECT_EQ(string("chr1"), p1.Value());
+ EXPECT_EQ(string("=="), p1.Operator());
+
+ const Property& p2 = filters[1].Properties()[0];
+ EXPECT_EQ(string("rq"), p2.Name());
+ EXPECT_EQ(string("0.50"), p2.Value());
+ EXPECT_EQ(string(">="), p2.Operator());
+
+ const Property& p3 = filters[1].Properties()[1];
+ EXPECT_EQ(string("RNAME"), p3.Name());
+ EXPECT_EQ(string("chr2"), p3.Value());
+ EXPECT_EQ(string("!="), p3.Operator());
+
+ // iteratable
+ size_t i = 0;
+ size_t j = 0;
+ for (const Filter& f : filters) {
+ if (i == 0) {
+ const Properties& properties = f.Properties();
+ for (const Property& p : properties) {
+ if (j == 0) {
+ EXPECT_EQ(string("rq"), p.Name());
+ EXPECT_EQ(string("0.85"), p.Value());
+ EXPECT_EQ(string(">"), p.Operator());
+ } else {
+ EXPECT_EQ(string("RNAME"), p.Name());
+ EXPECT_EQ(string("chr1"), p.Value());
+ EXPECT_EQ(string("=="), p.Operator());
+ }
+ ++j;
+ }
+ } else {
+ const Properties& properties = f.Properties();
+ for (const Property& p : properties) {
+ if (j == 0) {
+ EXPECT_EQ(string("rq"), p.Name());
+ EXPECT_EQ(string("0.50"), p.Value());
+ EXPECT_EQ(string(">="), p.Operator());
+ } else {
+ EXPECT_EQ(string("RNAME"), p.Name());
+ EXPECT_EQ(string("chr2"), p.Value());
+ EXPECT_EQ(string("!="), p.Operator());
+ }
+ ++j;
+ }
+ }
+ ++i;
+ j = 0;
+ }
+
+}
+
+TEST(DataSetCoreTest, EditFilters)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ Filter filter;
+ filter.Properties().Add(Property("rq", "0.85", ">"));
+ filter.Properties().Add(Property("RNAME", "chr1", "=="));
+ EXPECT_EQ(2, filter.Properties().Size());
+
+ Filter filter2;
+ filter2.Properties().Add(Property("rq", "0.50", ">="));
+ filter2.Properties().Add(Property("RNAME", "chr2", "!="));
+ EXPECT_EQ(2, filter2.Properties().Size());
+
+ dataset.Filters().Add(filter);
+ dataset.Filters().Add(filter2);
+ EXPECT_EQ(2, dataset.Filters().Size());
+ EXPECT_EQ(2, dataset.Filters()[0].Properties().Size());
+ EXPECT_EQ(2, dataset.Filters()[1].Properties().Size());
+
+ // edit property in-place
+ Property& p = dataset.Filters()[0].Properties()[0];
+ p.Name("someNewName");
+ p.Value("someNewValue");
+ p.Operator("==");
+
+ const Property& p0 = dataset.Filters()[0].Properties()[0];
+ EXPECT_EQ(string("someNewName"), p0.Name());
+ EXPECT_EQ(string("someNewValue"), p0.Value());
+ EXPECT_EQ(string("=="), p0.Operator());
+
+ const Property& p1 = dataset.Filters()[0].Properties()[1];
+ EXPECT_EQ(string("RNAME"), p1.Name());
+ EXPECT_EQ(string("chr1"), p1.Value());
+ EXPECT_EQ(string("=="), p1.Operator());
+
+ const Property& p2 = dataset.Filters()[1].Properties()[0];
+ EXPECT_EQ(string("rq"), p2.Name());
+ EXPECT_EQ(string("0.50"), p2.Value());
+ EXPECT_EQ(string(">="), p2.Operator());
+
+ const Property& p3 = dataset.Filters()[1].Properties()[1];
+ EXPECT_EQ(string("RNAME"), p3.Name());
+ EXPECT_EQ(string("chr2"), p3.Value());
+ EXPECT_EQ(string("!="), p3.Operator());
+}
+
+TEST(DataSetCoreTest, AddSubDataSets)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ DataSetBase sub1;
+ sub1.Name("subset_1");
+
+ DataSetBase sub2;
+ sub2.Name("subset_2");
+
+ dataset.SubDataSets().Add(sub1);
+ dataset.SubDataSets().Add(sub2);
+ EXPECT_EQ(2, dataset.SubDataSets().Size());
+
+ // direct access
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ EXPECT_EQ(string("subset_1"), subdatasets[0].Name());
+ EXPECT_EQ(string("subset_2"), subdatasets[1].Name());
+
+ // iterable
+ size_t i = 0;
+ for (const DataSetBase& ds : subdatasets) {
+ if (i == 0)
+ EXPECT_EQ(string("subset_1"), ds.Name());
+ else
+ EXPECT_EQ(string("subset_2"), ds.Name());
+ ++i;
+ }
+}
+
+TEST(DataSetCoreTest, EditSubDataSets)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ DataSetBase sub1;
+ sub1.Name("subset_1");
+
+ DataSetBase sub2;
+ sub2.Name("subset_2");
+
+ dataset.SubDataSets().Add(sub1);
+ dataset.SubDataSets().Add(sub2);
+ EXPECT_EQ(2, dataset.SubDataSets().Size());
+
+ // edit
+ dataset.SubDataSets()[0].Name("subset_1_edited");
+
+ // direct access
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ EXPECT_EQ(string("subset_1_edited"), subdatasets[0].Name());
+ EXPECT_EQ(string("subset_2"), subdatasets[1].Name());
+
+ // iterable
+ size_t i = 0;
+ for (const DataSetBase& ds : subdatasets) {
+ if (i == 0)
+ EXPECT_EQ(string("subset_1_edited"), ds.Name());
+ else
+ EXPECT_EQ(string("subset_2"), ds.Name());
+ ++i;
+ }
+}
+
+TEST(DataSetCoreTest, RemoveExternalResources)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.ExternalResources().Size());
+
+ ExternalResource resource1;
+ resource1.Name("file1");
+
+ ExternalResource resource2;
+ resource2.Name("file2");
+
+ dataset.ExternalResources().Add(resource1);
+ dataset.ExternalResources().Add(resource2);
+ EXPECT_EQ(2, dataset.ExternalResources().Size());
+
+ // remove
+ dataset.ExternalResources().Remove(resource1);
+ EXPECT_EQ(1, dataset.ExternalResources().Size());
+
+ // direct access
+ const ExternalResources& resources = dataset.ExternalResources();
+ EXPECT_EQ(string("file2"), resources[0].Name());
+
+ // iterable
+ size_t i = 0;
+ for (auto r : resources) {
+ if (i == 0)
+ EXPECT_EQ(string("file2"), r.Name());
+ ++i;
+ }
+}
+
+TEST(DataSetCoreTest, RemoveFilters)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ Filter filter;
+ filter.Properties().Add(Property("rq", "0.85", ">"));
+ filter.Properties().Add(Property("RNAME", "chr1", "=="));
+ EXPECT_EQ(2, filter.Properties().Size());
+
+ Filter filter2;
+ filter2.Properties().Add(Property("rq", "0.50", ">="));
+ filter2.Properties().Add(Property("RNAME", "chr2", "!="));
+ EXPECT_EQ(2, filter2.Properties().Size());
+
+ dataset.Filters().Add(filter);
+ dataset.Filters().Add(filter2);
+ EXPECT_EQ(2, dataset.Filters().Size());
+
+ // remove
+ dataset.Filters().Remove(filter);
+ EXPECT_EQ(1, dataset.Filters().Size());
+
+ const Filters& filters = dataset.Filters();
+ EXPECT_EQ(2, filters[0].Properties().Size());
+}
+
+TEST(DataSetCoreTest, RemoveSubDataSets)
+{
+ DataSet dataset;
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ DataSetBase sub1;
+ sub1.Name("subset_1");
+
+ DataSetBase sub2;
+ sub2.Name("subset_2");
+
+ dataset.SubDataSets().Add(sub1);
+ dataset.SubDataSets().Add(sub2);
+ EXPECT_EQ(2, dataset.SubDataSets().Size());
+
+ // remove
+ dataset.SubDataSets().Remove(sub2);
+ EXPECT_EQ(1, dataset.SubDataSets().Size());
+}
diff --git a/tests/src/test_DataSetIO.cpp b/tests/src/test_DataSetIO.cpp
new file mode 100644
index 0000000..b075788
--- /dev/null
+++ b/tests/src/test_DataSetIO.cpp
@@ -0,0 +1,1281 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/DataSet.h>
+#include <pbbam/internal/DataSetElement.h>
+#include <stdexcept>
+#include <sstream>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string ex2BamFn = tests::Data_Dir + "/ex2.bam";
+const string bamGroupFofn = tests::Data_Dir + "/test_group_query/group.fofn";
+
+const string ali1XmlFn = tests::Data_Dir + "/dataset/ali1.xml";
+const string ali2XmlFn = tests::Data_Dir + "/dataset/ali2.xml";
+const string ali3XmlFn = tests::Data_Dir + "/dataset/ali3.xml";
+const string ali4XmlFn = tests::Data_Dir + "/dataset/ali4.xml";
+const string mappingStaggeredXmlFn = tests::Data_Dir + "/dataset/bam_mapping_staggered.xml";
+const string barcodeXmlFn = tests::Data_Dir + "/dataset/barcode.dataset.xml";
+const string ccsReadXmlFn = tests::Data_Dir + "/dataset/ccsread.dataset.xml";
+const string datasetFofn = tests::Data_Dir + "/dataset/fofn.fofn";
+const string hdfSubreadXmlFn = tests::Data_Dir + "/dataset/hdfsubread_dataset.xml";
+const string lambdaContigsXmlFn = tests::Data_Dir + "/dataset/lambda_contigs.xml";
+const string pbalchemyXmlFn = tests::Data_Dir + "/dataset/pbalchemy10kbp.xml";
+const string referenceXmlFn = tests::Data_Dir + "/dataset/reference.dataset.xml";
+const string subread1XmlFn = tests::Data_Dir + "/dataset/subread_dataset1.xml";
+const string subread2XmlFn = tests::Data_Dir + "/dataset/subread_dataset2.xml";
+const string subread3XmlFn = tests::Data_Dir + "/dataset/subread_dataset3.xml";
+const string transformedXmlFn = tests::Data_Dir + "/dataset/transformed_rs_subread_dataset.xml";
+
+static void TestFromXmlString(void);
+static void TestAli1Xml(void);
+static void TestAli2Xml(void);
+static void TestAli3Xml(void);
+static void TestAli4Xml(void);
+static void TestMappingStaggeredXml(void);
+static void TestBarcodeXml(void);
+static void TestCcsReadXml(void);
+static void TestHdfSubreadXml(void);
+static void TestLambdaContigsXml(void);
+static void TestPbalchemyXml(void);
+static void TestReferenceXml(void);
+static void TestSubread1Xml(void);
+static void TestSubread2Xml(void);
+static void TestSubread3Xml(void);
+static void TestTransformedXml(void);
+
+TEST(DataSetIOTest, FromBamFilename)
+{
+ DataSet dataset(ex2BamFn);
+
+ EXPECT_EQ(1, dataset.ExternalResources().Size());
+ const ExternalResource& bamRef = dataset.ExternalResources()[0];
+
+ EXPECT_EQ(ex2BamFn, bamRef.ResourceId());
+}
+
+TEST(DataSetIOTest, FromBamFileObject)
+{
+ BamFile bamFile(ex2BamFn);
+ DataSet dataset(bamFile.Filename());
+
+ EXPECT_EQ(1, dataset.ExternalResources().Size());
+ const ExternalResource& bamRef = dataset.ExternalResources()[0];
+
+ EXPECT_EQ(ex2BamFn, bamRef.ResourceId());
+}
+
+TEST(DataSetIOTest, FromFofn)
+{
+ DataSet dataset(bamGroupFofn);
+ EXPECT_EQ(3, dataset.ExternalResources().Size());
+}
+
+TEST(DataSetIOTest, FromXml)
+{
+ EXPECT_NO_THROW(TestFromXmlString());
+}
+
+TEST(DataSetIOTest, FromXmlFile)
+{
+ EXPECT_NO_THROW(TestAli1Xml());
+ EXPECT_NO_THROW(TestAli2Xml());
+ EXPECT_NO_THROW(TestAli3Xml());
+ EXPECT_NO_THROW(TestAli4Xml());
+ EXPECT_NO_THROW(TestMappingStaggeredXml());
+ EXPECT_NO_THROW(TestBarcodeXml());
+ EXPECT_NO_THROW(TestCcsReadXml());
+ EXPECT_NO_THROW(TestHdfSubreadXml());
+ EXPECT_NO_THROW(TestLambdaContigsXml());
+ EXPECT_NO_THROW(TestPbalchemyXml());
+ EXPECT_NO_THROW(TestReferenceXml());
+ EXPECT_NO_THROW(TestSubread1Xml());
+ EXPECT_NO_THROW(TestSubread2Xml());
+ EXPECT_NO_THROW(TestSubread3Xml());
+ EXPECT_NO_THROW(TestTransformedXml());
+}
+
+TEST(DataSetIOTest, ThrowsOnNonexistentFofnFile)
+{
+ EXPECT_THROW(
+ {
+ DataSet dataset("does/not/exist.fofn");
+
+ }, std::exception);
+}
+
+TEST(DataSetIOTest, ThrowsOnNonexistentXmlFile)
+{
+ EXPECT_THROW(
+ {
+ DataSet dataset("does/not/exist.xml");
+
+ }, std::exception);
+}
+
+TEST(DataSetIOTest, ToXml)
+{
+ // top-level data
+ DataSet dataset(DataSet::ALIGNMENT);
+ dataset.CreatedAt("2015-01-27T09:00:01");
+ dataset.MetaType("PacBio.DataSet.AlignmentSet");
+ dataset.Name("DataSet_AlignmentSet");
+ dataset.Tags("barcode moreTags mapping mytags");
+ dataset.UniqueId("b095d0a3-94b8-4918-b3af-a3f81bbe519c");
+ dataset.Version("2.3.0");
+ dataset.Attribute("xmlns","http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd")
+ .Attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
+ .Attribute("xsi:schemaLocation",
+ "http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd PacBioSecondaryDataModel.xsd");
+
+ // external resources
+ ExternalResource resource1;
+ resource1.Name("Third Alignments BAM");
+ resource1.Description("Points to an example Alignments BAM file.");
+ resource1.MetaType("AlignmentFile.AlignmentBamFile");
+ resource1.ResourceId("file:/mnt/path/to/alignments2.bam");
+ resource1.Tags("Example");
+ FileIndex pbi1;
+ pbi1.MetaType("PacBio.Index.PacBioIndex");
+ pbi1.ResourceId("file:/mnt/path/to/alignments2.pbi");
+ resource1.FileIndices().Add(pbi1);
+ dataset.ExternalResources().Add(resource1);
+
+ ExternalResource resource2;
+ resource2.Name("Fourth Alignments BAM");
+ resource2.Description("Points to another example Alignments BAM file, by relative path.");
+ resource2.MetaType("AlignmentFile.AlignmentBamFile");
+ resource2.ResourceId("file:./alignments3.bam");
+ resource2.Tags("Example");
+ FileIndex pbi2;
+ pbi2.MetaType("PacBio.Index.PacBioIndex");
+ pbi2.ResourceId("file:/mnt/path/to/alignments3.pbi");
+ resource2.FileIndices().Add(pbi2);
+ dataset.ExternalResources().Add(resource2);
+
+ // sub-datasets with filters
+ DataSetBase subDataSet1;
+ subDataSet1.Name("HighQuality Read Alignments");
+ subDataSet1.UniqueId("ab95d0a3-94b8-4918-b3af-a3f81bbe519c");
+ subDataSet1.Version("2.3.0");
+ Filter filter1;
+ filter1.Properties().Add(Property("rq", "0.85", ">"));
+ subDataSet1.Filters().Add(filter1);
+ dataset.SubDataSets().Add(subDataSet1);
+
+ DataSetBase subDataSet2;
+ subDataSet2.Name("Alignments to chromosome 1");
+ subDataSet2.UniqueId("ac95d0a3-94b8-4918-b3af-a3f81bbe519c");
+ subDataSet2.Version("2.3.0");
+ Filter filter2;
+ filter2.Properties().Add(Property("RNAME", "chr1", "=="));
+ subDataSet2.Filters().Add(filter2);
+ dataset.SubDataSets().Add(subDataSet2);
+
+ // write dataset
+ const string expectedXml =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<pbds:AlignmentSet CreatedAt=\"2015-01-27T09:00:01\" MetaType=\"PacBio.DataSet.AlignmentSet\" "
+ "Name=\"DataSet_AlignmentSet\" Tags=\"barcode moreTags mapping mytags\" "
+ "UniqueId=\"b095d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\" "
+ "xmlns=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd\" "
+ "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+ "xsi:schemaLocation=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd "
+ "PacBioSecondaryDataModel.xsd\">\n"
+ "\t<pbbase:ExternalResources>\n"
+ "\t\t<pbbase:ExternalResource Description=\"Points to an example Alignments BAM file.\" "
+ "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Third Alignments BAM\" "
+ "ResourceId=\"file:/mnt/path/to/alignments2.bam\" Tags=\"Example\">\n"
+ "\t\t\t<pbbase:FileIndices>\n"
+ "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments2.pbi\" />\n"
+ "\t\t\t</pbbase:FileIndices>\n"
+ "\t\t</pbbase:ExternalResource>\n"
+ "\t\t<pbbase:ExternalResource Description=\"Points to another example Alignments BAM file, by relative path.\" "
+ "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Fourth Alignments BAM\" "
+ "ResourceId=\"file:./alignments3.bam\" Tags=\"Example\">\n"
+ "\t\t\t<pbbase:FileIndices>\n"
+ "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments3.pbi\" />\n"
+ "\t\t\t</pbbase:FileIndices>\n"
+ "\t\t</pbbase:ExternalResource>\n"
+ "\t</pbbase:ExternalResources>\n"
+ "\t<pbds:DataSets>\n"
+ "\t\t<pbds:DataSet Name=\"HighQuality Read Alignments\" UniqueId=\"ab95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+ "\t\t\t<pbds:Filters>\n"
+ "\t\t\t\t<pbds:Filter>\n"
+ "\t\t\t\t\t<pbbase:Properties>\n"
+ "\t\t\t\t\t\t<pbbase:Property Name=\"rq\" Operator=\">\" Value=\"0.85\" />\n"
+ "\t\t\t\t\t</pbbase:Properties>\n"
+ "\t\t\t\t</pbds:Filter>\n"
+ "\t\t\t</pbds:Filters>\n"
+ "\t\t</pbds:DataSet>\n"
+ "\t\t<pbds:DataSet Name=\"Alignments to chromosome 1\" UniqueId=\"ac95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+ "\t\t\t<pbds:Filters>\n"
+ "\t\t\t\t<pbds:Filter>\n"
+ "\t\t\t\t\t<pbbase:Properties>\n"
+ "\t\t\t\t\t\t<pbbase:Property Name=\"RNAME\" Operator=\"==\" Value=\"chr1\" />\n"
+ "\t\t\t\t\t</pbbase:Properties>\n"
+ "\t\t\t\t</pbds:Filter>\n"
+ "\t\t\t</pbds:Filters>\n"
+ "\t\t</pbds:DataSet>\n"
+ "\t</pbds:DataSets>\n"
+ "</pbds:AlignmentSet>\n";
+
+ stringstream s;
+ dataset.SaveToStream(s);
+ EXPECT_EQ(expectedXml, s.str());
+}
+
+static void TestFromXmlString(void)
+{
+ const string inputXml =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<pbds:AlignmentSet CreatedAt=\"2015-01-27T09:00:01\" MetaType=\"PacBio.DataSet.AlignmentSet\" "
+ "Name=\"DataSet_AlignmentSet\" Tags=\"barcode moreTags mapping mytags\" "
+ "UniqueId=\"b095d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\" "
+ "xmlns=\"http://pacificbiosciences.com/PacBioDataModel.xsd\" "
+ "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+ "xsi:schemaLocation=\"http://pacificbiosciences.com/PacBioDataModel.xsd\">\n"
+ "\t<pbbase:ExternalResources>\n"
+ "\t\t<pbbase:ExternalResource Description=\"Points to an example Alignments BAM file.\" "
+ "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Third Alignments BAM\" "
+ "ResourceId=\"file:/mnt/path/to/alignments2.bam\" Tags=\"Example\">\n"
+ "\t\t\t<pbbase:FileIndices>\n"
+ "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments2.pbi\" />\n"
+ "\t\t\t</pbbase:FileIndices>\n"
+ "\t\t</pbbase:ExternalResource>\n"
+ "\t\t<pbbase:ExternalResource Description=\"Points to another example Alignments BAM file, by relative path.\" "
+ "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Fourth Alignments BAM\" "
+ "ResourceId=\"file:./alignments3.bam\" Tags=\"Example\">\n"
+ "\t\t\t<pbbase:FileIndices>\n"
+ "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments3.pbi\" />\n"
+ "\t\t\t</pbbase:FileIndices>\n"
+ "\t\t</pbbase:ExternalResource>\n"
+ "\t</pbbase:ExternalResources>\n"
+ "\t<pbds:DataSets>\n"
+ "\t\t<pbds:DataSet Name=\"HighQuality Read Alignments\" UniqueId=\"ab95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+ "\t\t\t<pbds:Filters>\n"
+ "\t\t\t\t<pbds:Filter>\n"
+ "\t\t\t\t\t<pbbase:Properties>\n"
+ "\t\t\t\t\t\t<pbbase:Property Name=\"rq\" Operator=\">\" Value=\"0.85\" />\n"
+ "\t\t\t\t\t</pbbase:Properties>\n"
+ "\t\t\t\t</pbds:Filter>\n"
+ "\t\t\t</pbds:Filters>\n"
+ "\t\t</pbds:DataSet>\n"
+ "\t\t<pbds:DataSet Name=\"Alignments to chromosome 1\" UniqueId=\"ac95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+ "\t\t\t<pbds:Filters>\n"
+ "\t\t\t\t<pbds:Filter>\n"
+ "\t\t\t\t\t<pbbase:Properties>\n"
+ "\t\t\t\t\t\t<pbbase:Property Name=\"RNAME\" Operator=\"==\" Value=\"chr1\" />\n"
+ "\t\t\t\t\t</pbbase:Properties>\n"
+ "\t\t\t\t</pbds:Filter>\n"
+ "\t\t\t</pbds:Filters>\n"
+ "\t\t</pbds:DataSet>\n"
+ "\t</pbds:DataSets>\n"
+ "</pbds:AlignmentSet>\n";
+
+ const DataSet dataset = DataSet::FromXml(inputXml);
+
+ EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+ EXPECT_EQ("2015-01-27T09:00:01", dataset.CreatedAt());
+ EXPECT_EQ("PacBio.DataSet.AlignmentSet", dataset.MetaType());
+ EXPECT_EQ("DataSet_AlignmentSet", dataset.Name());
+ EXPECT_EQ("barcode moreTags mapping mytags", dataset.Tags());
+ EXPECT_EQ("b095d0a3-94b8-4918-b3af-a3f81bbe519c", dataset.UniqueId());
+ EXPECT_EQ("2.3.0", dataset.Version());
+ EXPECT_EQ("http://pacificbiosciences.com/PacBioDataModel.xsd", dataset.Attribute("xmlns"));
+ EXPECT_EQ("http://www.w3.org/2001/XMLSchema-instance", dataset.Attribute("xmlns:xsi"));
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ EXPECT_EQ(2, resources.Size());
+
+ const ExternalResource& resource1 = resources[0];
+ EXPECT_EQ("Third Alignments BAM", resource1.Name());
+ EXPECT_EQ("Points to an example Alignments BAM file.", resource1.Description());
+ EXPECT_EQ("AlignmentFile.AlignmentBamFile", resource1.MetaType());
+ EXPECT_EQ("file:/mnt/path/to/alignments2.bam", resource1.ResourceId());
+ EXPECT_EQ("Example", resource1.Tags());
+ const FileIndices& fileIndices1 = resource1.FileIndices();
+ EXPECT_EQ(1, fileIndices1.Size());
+ const FileIndex& pbi1 = fileIndices1[0];
+ EXPECT_EQ("PacBio.Index.PacBioIndex", pbi1.MetaType());
+ EXPECT_EQ("file:/mnt/path/to/alignments2.pbi", pbi1.ResourceId());
+
+ const ExternalResource& resource2 = resources[1];
+ EXPECT_EQ("Fourth Alignments BAM", resource2.Name());
+ EXPECT_EQ("Points to another example Alignments BAM file, by relative path.", resource2.Description());
+ EXPECT_EQ("AlignmentFile.AlignmentBamFile", resource2.MetaType());
+ EXPECT_EQ("file:./alignments3.bam", resource2.ResourceId());
+ EXPECT_EQ("Example", resource2.Tags());
+ const FileIndices& fileIndices2 = resource2.FileIndices();
+ EXPECT_EQ(1, fileIndices2.Size());
+ const FileIndex& pbi2 = fileIndices2[0];
+ EXPECT_EQ("PacBio.Index.PacBioIndex", pbi2.MetaType());
+ EXPECT_EQ("file:/mnt/path/to/alignments3.pbi", pbi2.ResourceId());
+
+ const SubDataSets& subDatasets = dataset.SubDataSets();
+ EXPECT_EQ(2, subDatasets.Size());
+
+ const DataSetBase& sub1 = subDatasets[0];
+ EXPECT_EQ("HighQuality Read Alignments", sub1.Name());
+ EXPECT_EQ("ab95d0a3-94b8-4918-b3af-a3f81bbe519c", sub1.UniqueId());
+ EXPECT_EQ("2.3.0", sub1.Version());
+ const Filters& sub1Filters = sub1.Filters();
+ EXPECT_EQ(1, sub1Filters.Size());
+ const Filter& sub1Filter = sub1Filters[0];
+ EXPECT_EQ(1, sub1Filter.Properties().Size());
+ const Property& property1 = sub1Filter.Properties()[0];
+ EXPECT_EQ("rq", property1.Name());
+ EXPECT_EQ(">", property1.Operator());
+ EXPECT_EQ("0.85", property1.Value());
+
+ const DataSetBase& sub2 = subDatasets[1];
+ EXPECT_EQ("Alignments to chromosome 1", sub2.Name());
+ EXPECT_EQ("ac95d0a3-94b8-4918-b3af-a3f81bbe519c", sub2.UniqueId());
+ EXPECT_EQ("2.3.0", sub2.Version());
+ const Filters& sub2Filters = sub2.Filters();
+ EXPECT_EQ(1, sub2Filters.Size());
+ const Filter& sub2Filter = sub2Filters[0];
+ EXPECT_EQ(1, sub2Filter.Properties().Size());
+ const Property& property2 = sub2Filter.Properties()[0];
+ EXPECT_EQ("RNAME", property2.Name());
+ EXPECT_EQ("==", property2.Operator());
+ EXPECT_EQ("chr1", property2.Value());
+}
+
+static void TestAli1Xml(void)
+{
+ const DataSet dataset(ali1XmlFn);
+ EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_AlignmentSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/alignments0.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments0.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:./alignments1.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments1.pbi"), index.ResourceId());
+ }
+ }
+
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ ASSERT_EQ(2, subdatasets.Size());
+ for (size_t i = 0; i < subdatasets.Size(); ++i) {
+ const DataSetBase& subdataset = subdatasets[i];
+ if (i == 0) {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.85"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ }
+ else {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("RNAME"), property.Name());
+ EXPECT_EQ(string("chr1"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+}
+
+static void TestAli2Xml(void)
+{
+ const DataSet dataset(ali2XmlFn);
+ EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_AlignmentSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/alignments2.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments2.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:./alignments3.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments3.pbi"), index.ResourceId());
+ }
+ }
+
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ ASSERT_EQ(2, subdatasets.Size());
+ for (size_t i = 0; i < subdatasets.Size(); ++i) {
+ const DataSetBase& subdataset = subdatasets[i];
+ if (i == 0) {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.85"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ }
+ else {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("RNAME"), property.Name());
+ EXPECT_EQ(string("chr1"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+}
+
+static void TestAli3Xml(void)
+{
+ const DataSet dataset(ali3XmlFn);
+ EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_AlignmentSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/alignments2.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments2.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:./alignments3.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments3.pbi"), index.ResourceId());
+ }
+ }
+
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ ASSERT_EQ(2, subdatasets.Size());
+ for (size_t i = 0; i < subdatasets.Size(); ++i) {
+ const DataSetBase& subdataset = subdatasets[i];
+ if (i == 0) {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.75"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ }
+ else {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("RNAME"), property.Name());
+ EXPECT_EQ(string("chr1"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+}
+
+static void TestAli4Xml(void)
+{
+ const DataSet dataset(ali4XmlFn);
+ EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_AlignmentSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/alignments0.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments0.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+ EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:./alignments1.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/alignments1.pbi"), index.ResourceId());
+ }
+ }
+
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ ASSERT_EQ(2, subdatasets.Size());
+ for (size_t i = 0; i < subdatasets.Size(); ++i) {
+ const DataSetBase& subdataset = subdatasets[i];
+ if (i == 0) {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.85"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ }
+ else {
+ EXPECT_EQ(string(""), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const Filters& filters = subdataset.Filters();
+ ASSERT_EQ(1, filters.Size());
+ const Filter& filter = filters[0];
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("RNAME"), property.Name());
+ EXPECT_EQ(string("chr1"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+}
+
+static void TestMappingStaggeredXml(void)
+{
+ const DataSet dataset(mappingStaggeredXmlFn);
+ EXPECT_EQ(DataSet::GENERIC, dataset.Type());
+ EXPECT_EQ(string("2015-05-13T10:58:26"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.DataSet"), dataset.MetaType());
+ EXPECT_EQ(string(""), dataset.Name());
+ EXPECT_EQ(string(""), dataset.Tags());
+ EXPECT_EQ(string("30f72098-bc5b-e06b-566c-8b28dda909a8"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string(""), resource.Name());
+ EXPECT_EQ(string(""), resource.Description());
+ EXPECT_EQ(string(""), resource.MetaType());
+ EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam"), resource.ResourceId());
+ EXPECT_EQ(string(""), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam.bai"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string(""), resource.Name());
+ EXPECT_EQ(string(""), resource.Description());
+ EXPECT_EQ(string(""), resource.MetaType());
+ EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam"), resource.ResourceId());
+ EXPECT_EQ(string(""), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam.bai"), index.ResourceId());
+ }
+ }
+
+ const SubDataSets& subdatasets = dataset.SubDataSets();
+ ASSERT_EQ(2, subdatasets.Size());
+ for (size_t i = 0; i < subdatasets.Size(); ++i) {
+ const DataSetBase& subdataset = subdatasets[i];
+ if (i == 0) {
+ EXPECT_EQ(string("2015-05-13T10:58:26"), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string(""), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("c5402d06-4643-057c-e300-fe229b4e8909"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const ExternalResources& resources = subdataset.ExternalResources();
+ ASSERT_EQ(1, resources.Size());
+ const ExternalResource& resource = resources[0];
+ EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam"), resource.ResourceId());
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam.bai"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("2015-05-13T10:58:26"), subdataset.CreatedAt());
+ EXPECT_EQ(string(""), subdataset.MetaType());
+ EXPECT_EQ(string(""), subdataset.Name());
+ EXPECT_EQ(string(""), subdataset.Tags());
+ EXPECT_EQ(string("f8b54a55-5fb7-706f-ab35-39afc9c86924"), subdataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+ const ExternalResources& resources = subdataset.ExternalResources();
+ ASSERT_EQ(1, resources.Size());
+ const ExternalResource& resource = resources[0];
+ EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam"), resource.ResourceId());
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam.bai"), index.ResourceId());
+ }
+ }
+}
+
+static void TestBarcodeXml(void)
+{
+ const DataSet dataset(barcodeXmlFn);
+ EXPECT_EQ(DataSet::BARCODE, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.BarcodeSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_BarcodeSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(1, resources.Size());
+ const ExternalResource& resource = resources[0];
+ EXPECT_EQ(string("First Barcodes FASTA"), resource.Name());
+ EXPECT_EQ(string("Points to an example Barcodes FASTA file."), resource.Description());
+ EXPECT_EQ(string("BarcodeFile.BarcodeFastaFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/barcode.fasta"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const DataSetMetadata& metadata = dataset.Metadata();
+ EXPECT_EQ(string("30"), metadata.NumRecords());
+ EXPECT_EQ(string("400"), metadata.TotalLength());
+
+ // access metadata extensions directly for now
+ EXPECT_EQ(string("paired"), metadata.ChildText("BarcodeConstruction"));
+}
+
+static void TestCcsReadXml(void)
+{
+ const DataSet dataset(ccsReadXmlFn);
+ EXPECT_EQ(DataSet::CONSENSUS_READ, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.ConsensusReadSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_ConsensusReadSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First ConsensusRead BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example ConsensusRead BAM file."), resource.Description());
+ EXPECT_EQ(string("PacBio.ConsensusReadFile.ConsensusReadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/ccsreads0.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("PacBio.Index.PacBioIndex"), index.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/ccsreads0.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second ConsensusRead BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example ConsensusRead BAM file."), resource.Description());
+ EXPECT_EQ(string("PacBio.ConsensusReadFile.ConsensusReadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/ccsreads1.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("PacBio.Index.PacBioIndex"), index.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/ccsreads0.pbi"), index.ResourceId());
+ }
+ }
+}
+
+static void TestHdfSubreadXml(void)
+{
+ // Looks like a bunch of TYPOS in XML file !!
+}
+
+static void TestLambdaContigsXml(void)
+{
+ const DataSet dataset(lambdaContigsXmlFn);
+ EXPECT_EQ(DataSet::REFERENCE, dataset.Type());
+ EXPECT_EQ(string("2015-05-28T10:56:36"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.ReferenceSet"), dataset.MetaType());
+ EXPECT_EQ(string(""), dataset.Name());
+ EXPECT_EQ(string(""), dataset.Tags());
+ EXPECT_EQ(string("596e87db-34f9-d2fd-c905-b017543170e1"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(1, resources.Size());
+ const ExternalResource& resource = resources[0];
+ EXPECT_EQ(string("file:tests/data/lambda_contigs.fasta"), resource.ResourceId());
+}
+
+static void TestPbalchemyXml(void)
+{
+ const DataSet dataset(pbalchemyXmlFn);
+ EXPECT_EQ(DataSet::GENERIC, dataset.Type());
+ EXPECT_EQ(string("2015-05-22T16:56:16"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.DataSet"), dataset.MetaType());
+ EXPECT_EQ(string(""), dataset.Name());
+ EXPECT_EQ(string(""), dataset.Tags());
+ EXPECT_EQ(string("58e3f7c5-24c1-b58b-fbd5-37de268cc2f0"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(1, resources.Size());
+ const ExternalResource& resource = resources[0];
+ EXPECT_EQ(string("file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam"), resource.ResourceId());
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai"), index.ResourceId());
+
+ // TYPOs: Should be Filter Properties/Property not Parameter(s)
+
+}
+
+static void TestReferenceXml(void)
+{
+ const DataSet dataset(referenceXmlFn);
+ EXPECT_EQ(DataSet::REFERENCE, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.ReferenceSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_ReferenceSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(1, resources.Size());
+ const ExternalResource& resource = resources[0];
+ EXPECT_EQ(string("First References FASTA"), resource.Name());
+ EXPECT_EQ(string("Points to an example references FASTA file."), resource.Description());
+ EXPECT_EQ(string("PacBio.ReferenceFile.ReferenceFastaFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/reference.fasta"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(2, fileIndices.Size());
+ for (size_t i = 0; i < fileIndices.Size(); ++i) {
+ const FileIndex& index = fileIndices[i];
+ if (i == 0) {
+ EXPECT_EQ(string("PacBio.Index.SaWriterIndex"), index.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/reference.fasta.sa"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("PacBio.Index.SamIndex"), index.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/reference.fasta.fai"), index.ResourceId());
+ }
+ }
+
+ const DataSetMetadata& metadata = dataset.Metadata();
+ EXPECT_EQ(string("500"), metadata.NumRecords());
+ EXPECT_EQ(string("5000000"), metadata.TotalLength());
+
+ // access metadata extensions directly for now
+ EXPECT_EQ(string("Tribble"), metadata.ChildText("Organism"));
+ EXPECT_EQ(string("Diploid"), metadata.ChildText("Ploidy"));
+
+ const internal::DataSetListElement<internal::DataSetElement>& contigs =
+ metadata.Child<internal::DataSetListElement<internal::DataSetElement> >("Contigs");
+ ASSERT_EQ(1, contigs.NumChildren());
+ const internal::DataSetElement& contig = contigs[0];
+ EXPECT_EQ(string("gi|229359445|emb|AM181176.4|"), contig.Attribute("Name"));
+ EXPECT_EQ(string("Pseudomonas fluorescens SBW25 complete genome|quiver"), contig.Attribute("Description"));
+ EXPECT_EQ(string("6722109"), contig.Attribute("Length"));
+ EXPECT_EQ(string("f627c795efad7ce0050ed42b942d408e"), contig.Attribute("Digest"));
+}
+
+static void TestSubread1Xml(void)
+{
+ const DataSet dataset(subread1XmlFn);
+ EXPECT_EQ(DataSet::SUBREAD, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_SubreadSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Subreads BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Subreads BAM file."), resource.Description());
+ EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/subreads0.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/subreads0.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Subreads BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Subreads BAM file."), resource.Description());
+ EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/subreads1.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/subreads0.pbi"), index.ResourceId());
+ }
+ }
+
+ const Filters& filters = dataset.Filters();
+ ASSERT_EQ(2, filters.Size());
+ for (size_t i = 0; i < filters.Size(); ++i) {
+ const Filter& filter = filters[i];
+ if (i == 0) {
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.75"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ } else {
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("QNAME"), property.Name());
+ EXPECT_EQ(string("100/0/0_100"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+
+ const DataSetMetadata& metadata = dataset.Metadata();
+ EXPECT_EQ(string("500"), metadata.NumRecords());
+ EXPECT_EQ(string("500000"), metadata.TotalLength());
+}
+
+static void TestSubread2Xml(void)
+{
+ const DataSet dataset(subread2XmlFn);
+ EXPECT_EQ(DataSet::SUBREAD, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_SubreadSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Subreads BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Subreads BAM file."), resource.Description());
+ EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/subreads2.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/subreads2.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Subreads BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Subreads BAM file."), resource.Description());
+ EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/subreads3.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/subreads3.pbi"), index.ResourceId());
+ }
+ }
+
+ const Filters& filters = dataset.Filters();
+ ASSERT_EQ(2, filters.Size());
+ for (size_t i = 0; i < filters.Size(); ++i) {
+ const Filter& filter = filters[i];
+ if (i == 0) {
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.75"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ } else {
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("QNAME"), property.Name());
+ EXPECT_EQ(string("100/0/0_100"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+
+ const DataSetMetadata& metadata = dataset.Metadata();
+ EXPECT_EQ(string("500"), metadata.NumRecords());
+ EXPECT_EQ(string("500000"), metadata.TotalLength());
+}
+
+static void TestSubread3Xml(void)
+{
+ const DataSet dataset(subread3XmlFn);
+ EXPECT_EQ(DataSet::SUBREAD, dataset.Type());
+ EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+ EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+ EXPECT_EQ(string("DataSet_SubreadSet"), dataset.Name());
+ EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+ EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+ EXPECT_EQ(string("2.3.0"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"), dataset.Attribute("xmlns:xsi"));
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(2, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("First Subreads BAM"), resource.Name());
+ EXPECT_EQ(string("Points to an example Subreads BAM file."), resource.Description());
+ EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/subreads2.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/subreads2.pbi"), index.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("Second Subreads BAM"), resource.Name());
+ EXPECT_EQ(string("Points to another example Subreads BAM file."), resource.Description());
+ EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/path/to/subreads3.bam"), resource.ResourceId());
+ EXPECT_EQ(string("Example"), resource.Tags());
+
+ const FileIndices& fileIndices = resource.FileIndices();
+ ASSERT_EQ(1, fileIndices.Size());
+ const FileIndex& index = fileIndices[0];
+ EXPECT_EQ(string("file:///mnt/path/to/subreads3.pbi"), index.ResourceId());
+ }
+ }
+
+ const Filters& filters = dataset.Filters();
+ ASSERT_EQ(2, filters.Size());
+ for (size_t i = 0; i < filters.Size(); ++i) {
+ const Filter& filter = filters[i];
+ if (i == 0) {
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("rq"), property.Name());
+ EXPECT_EQ(string("0.85"), property.Value());
+ EXPECT_EQ(string(">"), property.Operator());
+ } else {
+ const Properties& properties = filter.Properties();
+ ASSERT_EQ(1, properties.Size());
+ const Property& property = properties[0];
+ EXPECT_EQ(string("QNAME"), property.Name());
+ EXPECT_EQ(string("100/0/0_100"), property.Value());
+ EXPECT_EQ(string("=="), property.Operator());
+ }
+ }
+
+ const DataSetMetadata& metadata = dataset.Metadata();
+ EXPECT_EQ(string("500"), metadata.NumRecords());
+ EXPECT_EQ(string("500000"), metadata.TotalLength());
+}
+
+static void TestTransformedXml(void)
+{
+ const DataSet dataset(transformedXmlFn);
+ EXPECT_EQ(DataSet::HDF_SUBREAD, dataset.Type());
+ EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+ EXPECT_EQ(string("Subreads from run r001173_42129_130607"), dataset.Name());
+ EXPECT_EQ(string("pacbio.secondary.instrument=RS"), dataset.Tags());
+ EXPECT_EQ(string("abbc9183-b01e-4671-8c12-19efee534647"), dataset.UniqueId());
+ EXPECT_EQ(string("0.5"), dataset.Version());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+ EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema"), dataset.Attribute("xmlns:xs"));
+ EXPECT_EQ(string("http://www.w3.org/2005/xpath-functions"), dataset.Attribute("xmlns:fn"));
+ EXPECT_EQ(string("java:java.util.UUID"), dataset.Attribute("xmlns:uuid"));
+ EXPECT_EQ(string("http://whatever"), dataset.Attribute("xmlns:bax"));
+
+ EXPECT_EQ(0, dataset.Filters().Size());
+ EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+ const ExternalResources& resources = dataset.ExternalResources();
+ ASSERT_EQ(3, resources.Size());
+ for (size_t i = 0; i < resources.Size(); ++i) {
+ const ExternalResource& resource = resources[i];
+ if (i == 0) {
+ EXPECT_EQ(string("PacBio.SubreadFile.BaxFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.0.bax.h5"),
+ resource.ResourceId());
+ }
+ else if (i == 1) {
+ EXPECT_EQ(string("PacBio.SubreadFile.BaxFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.1.bax.h5"),
+ resource.ResourceId());
+ }
+ else {
+ EXPECT_EQ(string("PacBio.SubreadFile.BaxFile"), resource.MetaType());
+ EXPECT_EQ(string("file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.2.bax.h5"),
+ resource.ResourceId());
+ }
+ }
+
+ const DataSetMetadata& metadata = dataset.Metadata();
+ EXPECT_EQ(string("150000"), metadata.NumRecords());
+ EXPECT_EQ(string("50000000"), metadata.TotalLength());
+}
diff --git a/tests/src/test_DataSetMetadata.cpp b/tests/src/test_DataSetMetadata.cpp
new file mode 100644
index 0000000..ac5d469
--- /dev/null
+++ b/tests/src/test_DataSetMetadata.cpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/dataset/DataSet.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+//static inline
+//DataSet CreateDataSet(void)
+//{
+// DataSet d;
+// d.Name("foo");
+// return d;
+//}
+
+} // namespace tests
+
+TEST(DataSetMetadataTest, DummyTest) {
+ EXPECT_TRUE(true);
+}
diff --git a/tests/src/test_DataSetQuery.cpp b/tests/src/test_DataSetQuery.cpp
new file mode 100644
index 0000000..da9b41e
--- /dev/null
+++ b/tests/src/test_DataSetQuery.cpp
@@ -0,0 +1,434 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "TestData.h"
+#include <boost/any.hpp>
+#include <gtest/gtest.h>
+#include <pbbam/EntireFileQuery.h>
+#include <pbbam/GenomicIntervalQuery.h>
+#include <pbbam/ZmwQuery.h>
+#include <pbbam/ZmwGroupQuery.h>
+#include <pbbam/DataSet.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string ex2BamFn = tests::Data_Dir + "/ex2.bam";
+const string bamMappingFn = tests::Data_Dir + "/dataset/bam_mapping.bam";
+const string bamMappingFn_1 = tests::Data_Dir + "/dataset/bam_mapping_1.bam";
+const string bamMappingFn_2 = tests::Data_Dir + "/dataset/bam_mapping_2.bam";
+const string group_fofn = tests::Data_Dir + "/test_group_query/group.fofn";
+const string group_file1 = tests::Data_Dir + "/test_group_query/test1.bam";
+const string group_file2 = tests::Data_Dir + "/test_group_query/test2.bam";
+const string group_file3 = tests::Data_Dir + "/test_group_query/test3.bam";
+
+const vector<string> group_file1_names =
+{
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/24962/0_427"
+};
+
+const vector<string> group_file2_names =
+{
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/2114_2531",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/2579_4055",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/4101_5571",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/5615_6237"
+};
+
+const vector<string> group_file3_names =
+{
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/45203/0_893",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/45203/0_893",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/46835/3759_4005",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/46835/4052_4686",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/46835/4732_4869",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/47698/9482_9628",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/47698/9675_10333",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/47698/10378_10609",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49050/48_1132",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49050/48_1132",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49194/0_798",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49194/845_1541",
+ "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49521/0_134"
+};
+
+static inline
+bool InGroup(const string& name, const vector<string>& group)
+{
+ for (const string& s : group) {
+ if (s == name)
+ return true;
+ }
+ return false;
+}
+
+TEST(DataSetQueryTest, EntireFileQueryTest)
+{
+ // single file
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(ex2BamFn);
+
+ DataSet dataset;
+ dataset.ExternalResources().Add(bamFile);
+
+ int count =0;
+ EntireFileQuery query(dataset); // from DataSet object
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(3307, count);
+
+ count = 0;
+ EntireFileQuery query2(ex2BamFn); // from BAM filename
+ for (const BamRecord& record : query2) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(3307, count);
+
+ count = 0;
+ EntireFileQuery query3(bamFile); // from BamFile object
+ for (const BamRecord& record : query3) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(3307, count);
+ });
+
+ // simple multi-file (actually just same file twice)
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(ex2BamFn);
+
+ DataSet dataset;
+ dataset.ExternalResources().Add(bamFile);
+ dataset.ExternalResources().Add(bamFile);
+
+ int count =0;
+ EntireFileQuery query(dataset);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(3307*2, count);
+ });
+
+ // true multi-file dataset
+ EXPECT_NO_THROW(
+ {
+ BamFile file1(group_file1); // 1 read
+ BamFile file2(group_file2); // 4 reads
+ BamFile file3(group_file3); // 13 reads
+
+ DataSet dataset;
+ dataset.ExternalResources().Add(file1);
+ dataset.ExternalResources().Add(file2);
+ dataset.ExternalResources().Add(file3);
+
+ int count = 0;
+ EntireFileQuery query(dataset);
+ for (const BamRecord& record : query) {
+
+ // ensure sequential merge of files
+ if (count == 0) EXPECT_TRUE(InGroup(record.FullName(), group_file1_names));
+ else if (count < 5) EXPECT_TRUE(InGroup(record.FullName(), group_file2_names));
+ else EXPECT_TRUE(InGroup(record.FullName(), group_file3_names));
+
+ ++count;
+ }
+ EXPECT_EQ(18, count);
+ });
+
+ // same as above, from FOFN
+ EXPECT_NO_THROW(
+ {
+ int count = 0;
+
+ DataSet dataset(group_fofn);
+ EntireFileQuery query(dataset);
+ for (const BamRecord& record : query) {
+
+ // ensure sequential merge of files
+ if (count == 0) EXPECT_TRUE(InGroup(record.FullName(), group_file1_names));
+ else if (count < 5) EXPECT_TRUE(InGroup(record.FullName(), group_file2_names));
+ else EXPECT_TRUE(InGroup(record.FullName(), group_file3_names));
+
+ ++count;
+ }
+ EXPECT_EQ(18, count);
+ });
+}
+
+TEST(DataSetQueryTest, GenomicIntervalQueryTest)
+{
+ // single file
+ EXPECT_NO_THROW(
+ {
+ DataSet dataset(ex2BamFn); // from BAM filename
+
+ // count records
+ int count = 0;
+ GenomicInterval interval("seq1", 0, 100);
+ GenomicIntervalQuery query(interval, dataset);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(39, count);
+
+ // adjust interval and pass back in
+ count = 0;
+ interval.Start(500);
+ interval.Stop(600);
+ query.Interval(interval);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(166, count);
+
+ // adjust again
+ count = 0;
+ interval.Name("seq2");
+ interval.Start(0);
+ interval.Stop(100);
+ query.Interval(interval);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(83, count);
+
+ // unknown ref
+ count = 0;
+ interval.Name("does not exist");
+ interval.Start(0);
+ interval.Stop(100);
+ EXPECT_THROW(
+ query.Interval(interval);
+ , std::exception);
+ for (const BamRecord& record : query) { // iteration is still safe, just returns no data
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(0, count);
+
+ // adjust again - make sure we can read a real region after an invalid one
+ interval.Name("seq2");
+ interval.Start(0);
+ interval.Stop(100);
+ query.Interval(interval);
+ count = 0;
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(83, count);
+ });
+
+ // multi-file (same twice)
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(ex2BamFn);
+
+ DataSet dataset;
+ dataset.ExternalResources().Add(bamFile);
+ dataset.ExternalResources().Add(bamFile);
+
+ // count records & also ensure sorted merge
+ int count = 0;
+ int prevId = 0;
+ int prevPos = 0;
+
+ GenomicInterval interval("seq1", 0, 100);
+ GenomicIntervalQuery query(interval, dataset);
+ for (const BamRecord& record : query) {
+
+ EXPECT_TRUE(record.ReferenceId() >= prevId);
+ EXPECT_TRUE(record.ReferenceStart() >= prevPos);
+
+ prevId = record.ReferenceId();
+ prevPos = record.ReferenceStart();
+ ++count;
+ }
+ EXPECT_EQ(39*2, count);
+
+ // adjust interval and pass back in
+ count = 0;
+ interval.Start(500);
+ interval.Stop(600);
+ query.Interval(interval);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(166*2, count);
+
+ // adjust again
+ count = 0;
+ interval.Name("seq2");
+ interval.Start(0);
+ interval.Stop(100);
+ query.Interval(interval);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(83*2, count);
+
+ // unknown ref
+ count = 0;
+ interval.Name("does not exist");
+ interval.Start(0);
+ interval.Stop(100);
+ EXPECT_THROW(
+ query.Interval(interval);
+ , std::exception);
+ for (const BamRecord& record : query) { // iteration is still safe, just returns no data
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(0, count);
+
+ // adjust again - make sure we can read a real region after an invalid one
+ interval.Name("seq2");
+ interval.Start(0);
+ interval.Stop(100);
+ query.Interval(interval);
+ count = 0;
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(83*2, count);
+ });
+
+ // multi file BAM
+
+}
+
+// TODO: implement me
+TEST(DataSetQueryTest, QNameQueryTest)
+{
+ EXPECT_TRUE(true);
+}
+
+TEST(DataSetQueryTest, ZmwQueryTest)
+{
+ const std::vector<int32_t> whitelist = { 13473, 38025 };
+
+ // single file
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(bamMappingFn);
+ bamFile.EnsurePacBioIndexExists();
+ DataSet dataset(bamFile);
+
+ int count = 0;
+ ZmwQuery query(whitelist, dataset);
+ for (const BamRecord& record: query) {
+ const int32_t holeNumber = record.HoleNumber();
+ EXPECT_TRUE(holeNumber == 13473 || holeNumber == 38025);
+ ++count;
+ }
+ EXPECT_EQ(5, count);
+ });
+
+ // multi-file
+}
+
+TEST(DataSetQueryTest, ZmwGroupQueryTest)
+{
+ const std::vector<int32_t> whitelist = { 13473, 38025 };
+
+ // single-file
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(bamMappingFn);
+ bamFile.EnsurePacBioIndexExists();
+ DataSet dataset(bamFile);
+
+ int count = 0;
+ int32_t groupZmw = -1;
+ ZmwGroupQuery query(whitelist, dataset);
+ for (const vector<BamRecord>& group : query) {
+ for (const BamRecord& record: group) {
+ if (groupZmw == -1)
+ groupZmw = record.HoleNumber();
+ EXPECT_EQ(groupZmw, record.HoleNumber());
+ ++count;
+ }
+ groupZmw = -1;
+ }
+ EXPECT_EQ(5, count);
+ });
+
+ // multi-file
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(bamMappingFn);
+ bamFile.EnsurePacBioIndexExists();
+
+ BamFile bamFile_1(bamMappingFn_1);
+ bamFile_1.EnsurePacBioIndexExists();
+
+ BamFile bamFile_2(bamMappingFn_2);
+ bamFile_2.EnsurePacBioIndexExists();
+
+ DataSet dataset;
+ dataset.ExternalResources().Add(ExternalResource(bamFile));
+ dataset.ExternalResources().Add(ExternalResource(bamFile_1));
+ dataset.ExternalResources().Add(ExternalResource(bamFile_2));
+
+ int count = 0;
+ int32_t groupZmw = -1;
+ ZmwGroupQuery query(whitelist, dataset);
+ for (const vector<BamRecord>& group : query) {
+ for (const BamRecord& record: group) {
+ if (groupZmw == -1)
+ groupZmw = record.HoleNumber();
+ EXPECT_EQ(groupZmw, record.HoleNumber());
+ ++count;
+ }
+ groupZmw = -1;
+ }
+ EXPECT_EQ(15, count);
+ });
+}
diff --git a/tests/src/test_DataSetXsd.cpp b/tests/src/test_DataSetXsd.cpp
new file mode 100644
index 0000000..177b758
--- /dev/null
+++ b/tests/src/test_DataSetXsd.cpp
@@ -0,0 +1,124 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/DataSet.h>
+#include <pbbam/DataSetXsd.h>
+#include <string>
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(DataSetXsdTest, DefaultsOk)
+{
+ NamespaceRegistry registry;
+
+ const NamespaceInfo& baseInfo = registry.Namespace(XsdType::BASE_DATA_MODEL);
+ const NamespaceInfo& dsInfo = registry.Namespace(XsdType::DATASETS);
+ const NamespaceInfo& defaultInfo = registry.DefaultNamespace();
+
+ EXPECT_EQ(XsdType::DATASETS, registry.DefaultXsd());
+
+ EXPECT_EQ(string("pbds"), dsInfo.Name());
+ EXPECT_EQ(string("pbbase"), baseInfo.Name());
+ EXPECT_EQ(string("pbds"), defaultInfo.Name());
+
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioBaseDataModel.xsd"), baseInfo.Uri());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDatasets.xsd"), dsInfo.Uri());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDatasets.xsd"), defaultInfo.Uri());
+}
+
+TEST(DataSetXsdTest, EditDefaultOk)
+{
+ NamespaceRegistry registry;
+ registry.SetDefaultXsd(XsdType::DATASETS);
+
+ const NamespaceInfo& defaultInfo = registry.DefaultNamespace();
+
+ EXPECT_EQ(XsdType::DATASETS, registry.DefaultXsd());
+ EXPECT_EQ(string("pbds"), defaultInfo.Name());
+ EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDatasets.xsd"), defaultInfo.Uri());
+}
+
+TEST(DataSetXsdTest, EditRegistryOk)
+{
+ NamespaceRegistry registry;
+ registry.Register(XsdType::DATASETS, NamespaceInfo("custom", "http://custom/uri.xsd"));
+
+ const NamespaceInfo& dsInfo = registry.Namespace(XsdType::DATASETS);
+
+ EXPECT_EQ(string("custom"), dsInfo.Name());
+ EXPECT_EQ(string("http://custom/uri.xsd"), dsInfo.Uri());
+}
+
+TEST(DataSetXsdTest, EditDatasetRegistry)
+{
+ DataSet dataset(DataSet::ALIGNMENT);
+ dataset.CreatedAt("2015-01-27T09:00:01");
+ dataset.MetaType("PacBio.DataSet.AlignmentSet");
+ dataset.Name("DataSet_AlignmentSet");
+ dataset.Tags("barcode moreTags mapping mytags");
+ dataset.UniqueId("b095d0a3-94b8-4918-b3af-a3f81bbe519c");
+ dataset.Version("2.3.0");
+ dataset.Attribute("xmlns","http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd")
+ .Attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
+ .Attribute("xsi:schemaLocation",
+ "http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd PacBioSecondaryDataModel.xsd");
+ dataset.ExternalResources().Add(ExternalResource("Fake.MetaType", "filename"));
+
+ dataset.Namespaces().Register(XsdType::BASE_DATA_MODEL, NamespaceInfo("custom", "http://custom/uri.xsd"));
+
+ const string expectedXml =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<pbds:AlignmentSet CreatedAt=\"2015-01-27T09:00:01\" MetaType=\"PacBio.DataSet.AlignmentSet\" "
+ "Name=\"DataSet_AlignmentSet\" Tags=\"barcode moreTags mapping mytags\" "
+ "UniqueId=\"b095d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\" "
+ "xmlns=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd\" "
+ "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+ "xsi:schemaLocation=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd "
+ "PacBioSecondaryDataModel.xsd\">\n"
+ "\t<custom:ExternalResources>\n"
+ "\t\t<custom:ExternalResource MetaType=\"Fake.MetaType\" ResourceId=\"filename\" />\n"
+ "\t</custom:ExternalResources>\n"
+ "</pbds:AlignmentSet>\n";
+
+ stringstream s;
+ dataset.SaveToStream(s);
+ EXPECT_EQ(expectedXml, s.str());
+}
diff --git a/tests/src/test_EndToEnd.cpp b/tests/src/test_EndToEnd.cpp
new file mode 100644
index 0000000..7fe951e
--- /dev/null
+++ b/tests/src/test_EndToEnd.cpp
@@ -0,0 +1,252 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#define protected public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <htslib/sam.h>
+#include <pbbam/BamFile.h>
+#include <pbbam/BamWriter.h>
+#include <pbbam/EntireFileQuery.h>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <cstdio>
+#include <cstdlib>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+struct Bam1Deleter
+{
+ void operator()(bam1_t* b) {
+ if (b)
+ bam_destroy1(b);
+ b = nullptr;
+ }
+};
+
+struct SamFileDeleter
+{
+ void operator()(samFile* file) {
+ if (file)
+ sam_close(file);
+ file = nullptr;
+ }
+};
+
+struct BamHdrDeleter
+{
+ void operator()(bam_hdr_t* hdr) {
+ if (hdr)
+ bam_hdr_destroy(hdr);
+ hdr = nullptr;
+ }
+};
+
+const string inputBamFn = tests::Data_Dir + "/ex2.bam";
+const string goldStandardSamFn = tests::Data_Dir + "/ex2.sam";
+const string generatedBamFn = tests::Data_Dir + "/generated.bam";
+const string generatedSamFn = tests::Data_Dir + "/generated.sam";
+
+static inline
+int Samtools_Bam2Sam(const string& bamFilename,
+ const string& samFilename)
+{
+ const std::string& convertArgs = string("view -h ") + bamFilename + string(" > ") + samFilename;
+ const std::string& convertCommandLine = tests::Samtools_Bin + string(" ") + convertArgs;
+ return system(convertCommandLine.c_str());
+}
+
+static inline
+int Diff_Sam2Sam(const string& fn1,
+ const string& fn2)
+{
+ const std::string& diffCommandLine = string("diff ") + fn1 + string(" ") + fn2;
+ return system(diffCommandLine.c_str());
+}
+
+static inline
+void RemoveGeneratedFiles(const string& fn1,
+ const string& fn2)
+{
+ remove(fn1.c_str());
+ remove(fn2.c_str());
+}
+
+// sanity check for rest of tests below
+TEST(EndToEndTest, ReadPureHtslib_WritePureHtslib)
+{
+ // open input BAM file
+ PBBAM_SHARED_PTR<samFile> inputBam(sam_open(inputBamFn.c_str(), "r"), SamFileDeleter());
+ EXPECT_TRUE(inputBam != 0);
+ PBBAM_SHARED_PTR<bam_hdr_t> header(sam_hdr_read(inputBam.get()), BamHdrDeleter());
+
+ // open output BAM file
+ PBBAM_SHARED_PTR<samFile> outputBam(sam_open(generatedBamFn.c_str(), "wb"), SamFileDeleter());
+ sam_hdr_write(outputBam.get(), header.get());
+
+ // copy BAM file
+ PBBAM_SHARED_PTR<bam1_t> record(bam_init1(), Bam1Deleter());
+ while (sam_read1(inputBam.get(), header.get(), record.get()) >= 0)
+ sam_write1(outputBam.get(), header.get(), record.get());
+
+ // need to close files before comparing (to flush any buffers)
+ inputBam.reset();
+ outputBam.reset();
+
+ // convert to sam & diff against gold standard
+
+ // TODO: disabled for now - need to replace non-PB BAM files in test cases
+
+// const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+// const int diffRet = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+// EXPECT_EQ(0, convertRet);
+// EXPECT_EQ(0, diffRet);
+
+ // clean up
+ RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_SingleThread)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // open output BAM file
+ BamWriter writer(generatedBamFn, bamFile.Header(), BamWriter::DefaultCompression, 1);
+
+ // copy BAM file
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile)
+ writer.Write(record);
+ });
+
+ // convert to sam & diff against gold standard
+ const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+ const int diffRet = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+ EXPECT_EQ(0, convertRet);
+ EXPECT_EQ(0, diffRet);
+
+ // clean up
+ RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_APIDefaultThreadCount)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // open output BAM file
+ BamWriter writer(generatedBamFn, bamFile.Header());
+
+ // copy BAM file
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile)
+ writer.Write(record);
+ });
+
+ // convert to sam & diff against gold standard
+ const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+ const int diffRet = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+ EXPECT_EQ(0, convertRet);
+ EXPECT_EQ(0, diffRet);
+
+ // clean up
+ RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_SystemDefaultThreadCount)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // open output BAM file
+ BamWriter writer(generatedBamFn, bamFile.Header(), BamWriter::DefaultCompression, 0);
+
+ // copy BAM file
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile)
+ writer.Write(record);
+ });
+
+ // convert to sam & diff against gold standard
+ const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+ const int diffRet = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+ EXPECT_EQ(0, convertRet);
+ EXPECT_EQ(0, diffRet);
+
+ // clean up
+ RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_UserThreadCount)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // open output BAM file
+ BamWriter writer(generatedBamFn, bamFile.Header(), BamWriter::DefaultCompression, 6);
+
+ // copy BAM file
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile)
+ writer.Write(record);
+ });
+
+ // convert to sam & diff against gold standard
+ const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+ const int diffRet = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+ EXPECT_EQ(0, convertRet);
+ EXPECT_EQ(0, diffRet);
+
+ // clean up
+ RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
diff --git a/tests/src/test_EntireFileQuery.cpp b/tests/src/test_EntireFileQuery.cpp
new file mode 100644
index 0000000..b444f2b
--- /dev/null
+++ b/tests/src/test_EntireFileQuery.cpp
@@ -0,0 +1,151 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/EntireFileQuery.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string inputBamFn = tests::Data_Dir + "/ex2.bam";
+
+TEST(EntireFileQueryTest, CountRecords)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // count records
+ int count = 0;
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile) {
+ (void)record;
+ ++count;
+ }
+
+ EXPECT_EQ(3307, count);
+ });
+}
+
+TEST(EntireFileQueryTest, NonConstBamRecord)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // count records
+ int count = 0;
+ EntireFileQuery entireFile(bamFile);
+ for (BamRecord& record : entireFile) {
+ (void)record;
+ ++count;
+ }
+
+ EXPECT_EQ(3307, count);
+ });
+}
+
+TEST(BamRecordTest, HandlesDeletionOK)
+{
+ // this file raised no error in Debug mode, but segfaulted when
+ // trying to access the aligned qualities in Release mode
+
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ const string problemBamFn = tests::Data_Dir + "/segfault.bam";
+ BamFile bamFile(problemBamFn);
+
+ // count records
+ int count = 0;
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile) {
+
+ const auto rawQualities = record.Qualities(Orientation::GENOMIC, false);
+ const auto alignedQualities = record.Qualities(Orientation::GENOMIC, true);
+
+ const string rawExpected =
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
+
+ // 1=1D98=
+ const string alignedExpected =
+ "I!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
+
+ EXPECT_EQ(rawExpected, rawQualities.Fastq());
+ EXPECT_EQ(alignedExpected, alignedQualities.Fastq());
+
+ ++count;
+ }
+
+ EXPECT_EQ(1, count);
+ });
+}
+
+
+TEST(BamRecordTest, ReferenceName)
+{
+ // check reference name of first record
+// {
+ const string exampleBam = tests::Data_Dir + "/ex2.bam";
+ BamFile bamFile(exampleBam);
+ EntireFileQuery records(bamFile);
+
+ auto it = records.begin();
+ auto record = *it;
+
+// EXPECT_EQ("seq1", records.begin()->ReferenceName());
+// }
+
+// // unmapped records have no reference name, should throw
+// {
+// const string exampleBam = tests::Data_Dir + "/unmap1.bam";
+// BamFile bamFile(exampleBam);
+// staging::EntireFileQuery records(bamFile);
+
+// EXPECT_THROW(records.begin()->ReferenceName(), std::exception);
+// }
+}
+
+// add add'l special cases as needed
diff --git a/tests/src/test_Frames.cpp b/tests/src/test_Frames.cpp
new file mode 100644
index 0000000..797eb6a
--- /dev/null
+++ b/tests/src/test_Frames.cpp
@@ -0,0 +1,97 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/Frames.h>
+#include <string>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+static const vector<uint16_t> testFrames =
+{
+ 0, 8, 140, 0, 0, 7, 4, 0, 85, 2,
+ 1, 3, 2, 10, 1, 20, 47, 10, 9, 60,
+ 20, 3, 12, 5, 13, 165, 6, 14, 22, 12,
+ 2, 4, 9, 218, 27, 3, 15, 2, 17, 2,
+ 45, 24, 89, 10, 7, 1, 11, 15, 0, 7,
+ 0, 28, 17, 12, 6, 10, 37, 0, 12, 52,
+ 0, 7, 1, 14, 3, 26, 12, 0, 20, 17,
+ 2, 13, 2, 9, 13, 7, 15, 29, 3, 6,
+ 2, 1, 28, 10, 3, 14, 7, 1, 22, 1,
+ 6, 6, 0, 19, 31, 6, 2, 14, 0, 0,
+ 1000, 947, 948
+};
+
+static const vector<uint8_t> encodedFrames =
+{
+ 0, 8, 102, 0, 0, 7, 4, 0, 75, 2, 1, 3, 2,
+ 10, 1, 20, 47, 10, 9, 60, 20, 3, 12, 5, 13, 115,
+ 6, 14, 22, 12, 2, 4, 9, 135, 27, 3, 15, 2, 17,
+ 2, 45, 24, 77, 10, 7, 1, 11, 15, 0, 7, 0, 28,
+ 17, 12, 6, 10, 37, 0, 12, 52, 0, 7, 1, 14, 3,
+ 26, 12, 0, 20, 17, 2, 13, 2, 9, 13, 7, 15, 29,
+ 3, 6, 2, 1, 28, 10, 3, 14, 7, 1, 22, 1, 6,
+ 6, 0, 19, 31, 6, 2, 14, 0, 0,
+ 255, 254, 255
+};
+
+} // namespace tests
+
+TEST(FramesTest, Constructors)
+{
+ const Frames f;
+ ASSERT_TRUE(f.Data().empty());
+
+ const Frames f2(tests::testFrames);
+ const auto d = f2.Data();
+ ASSERT_EQ(tests::testFrames, d);
+}
+
+TEST(FramesTest, Encoded)
+{
+ const Frames f(tests::testFrames);
+ const auto e = f.Encode();
+ ASSERT_EQ(tests::encodedFrames, e);
+}
diff --git a/tests/src/test_GenomicIntervalQuery.cpp b/tests/src/test_GenomicIntervalQuery.cpp
new file mode 100644
index 0000000..0fb98bc
--- /dev/null
+++ b/tests/src/test_GenomicIntervalQuery.cpp
@@ -0,0 +1,182 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/GenomicIntervalQuery.h>
+#include <iostream>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string inputBamFn = tests::Data_Dir + "/ex2.bam";
+
+TEST(GenomicIntervalQueryTest, ReuseQueryAndCountRecords)
+{
+ const string seq1 = "seq1";
+ const string seq2 = "seq2";
+
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // count records
+ int count = 0;
+ GenomicInterval interval(seq1, 0, 100);
+ GenomicIntervalQuery query(interval, bamFile);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(39, count);
+
+ // adjust interval and pass back in
+ count = 0;
+ interval.Start(500);
+ interval.Stop(600);
+ query.Interval(interval);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(166, count);
+
+ // adjust again
+ count = 0;
+ interval.Name(seq2);
+ interval.Start(0);
+ interval.Stop(100);
+ query.Interval(interval);
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(83, count);
+
+ // unknown ref
+ count = 0;
+ interval.Name("does not exist");
+ interval.Start(0);
+ interval.Stop(100);
+ EXPECT_THROW(
+ query.Interval(interval);
+ , std::exception);
+ for (const BamRecord& record : query) { // iteration is still safe, just returns no data
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(0, count);
+
+ // adjust again - make sure we can read a real region after an invalid one
+ interval.Name(seq2);
+ interval.Start(0);
+ interval.Stop(100);
+ query.Interval(interval);
+ count = 0;
+ for (const BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(83, count);
+}
+
+TEST(GenomicIntervalQueryTest, NonConstBamRecord)
+{
+ EXPECT_NO_THROW(
+ {
+ // open input BAM file
+ BamFile bamFile(inputBamFn);
+
+ // count records
+ int count = 0;
+ GenomicInterval interval("seq1", 0, 100);
+ GenomicIntervalQuery query(interval, bamFile);
+ for (BamRecord& record : query) {
+ (void)record;
+ ++count;
+ }
+ EXPECT_EQ(39, count);
+ });
+}
+
+//TEST(GenomicIntervalQueryTest, WorksWithBamRecordImpl)
+//{
+// // open input BAM file
+// BamFile bamFile(inputBamFn);
+// EXPECT_TRUE(bamFile);
+
+// const int id = bamFile.ReferenceId("seq1");
+// EXPECT_TRUE(id != -1);
+
+// // count records
+// int count = 0;
+// GenomicInterval interval(id, 0, 100);
+// GenomicIntervalQuery query(interval, bamFile);
+// EXPECT_TRUE(query);
+// for (const BamRecordImpl& record : query) {
+// (void)record;
+// ++count;
+// }
+// EXPECT_EQ(39, count);
+//}
+
+//TEST(GenomicIntervalQueryTest, WorksWithNonConstBamRecordImpl)
+//{
+// // open input BAM file
+// BamFile bamFile(inputBamFn);
+// EXPECT_TRUE(bamFile);
+
+// const int id = bamFile.ReferenceId("seq1");
+// EXPECT_TRUE(id != -1);
+
+// // count records
+// int count = 0;
+// GenomicInterval interval(id, 0, 100);
+// GenomicIntervalQuery query(interval, bamFile);
+// EXPECT_TRUE(query);
+// for (BamRecordImpl& record : query) {
+// (void)record;
+// ++count;
+// }
+// EXPECT_EQ(39, count);
+//}
+
+// add special cases as needed
diff --git a/tests/src/test_GroupQuery.cpp b/tests/src/test_GroupQuery.cpp
new file mode 100644
index 0000000..2f6769f
--- /dev/null
+++ b/tests/src/test_GroupQuery.cpp
@@ -0,0 +1,149 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Yuan Li
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/ZmwGroupQuery.h>
+#include <pbbam/GroupQuery.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+
+const string dataDir = tests::Data_Dir + "/test_group_query/";
+const string test1fn = string(dataDir) + "test1.bam";
+const string test2fn = string(dataDir) + "test2.bam";
+const string test3fn = string(dataDir) + "test3.bam";
+
+//void TestZmwQuery(const string & fn, const vector<int> & expected)
+//{
+// EXPECT_NO_THROW(
+// {
+// BamFile bamFile(fn);
+// vector<int> counts;
+// ZmwGroupQuery zmwQuery(bamFile);
+// for (const vector<BamRecord>& records : zmwQuery)
+// counts.push_back(records.size());
+// EXPECT_EQ(expected, counts);
+// });
+//}
+
+//void TestNoneConstZmwQuery(const string & fn, const vector<int> & expected)
+//{
+// EXPECT_NO_THROW(
+// {
+// BamFile bamFile(fn);
+// vector<int> counts;
+// ZmwGroupQuery zmwQuery(bamFile);
+// for (vector<BamRecord>& records : zmwQuery)
+// counts.push_back(records.size());
+// EXPECT_EQ(expected, counts);
+// });
+//}
+
+void TestQNameQuery(const string & fn, const vector<int> & expected)
+{
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(fn);
+ vector<int> counts;
+ QNameQuery qQuery(bamFile);
+ for (const vector<BamRecord>& records : qQuery)
+ counts.push_back(records.size());
+ EXPECT_EQ(expected, counts);
+ });
+}
+
+void TestNoneConstQNameQuery(const string & fn, const vector<int> & expected)
+{
+ EXPECT_NO_THROW(
+ {
+ BamFile bamFile(fn);
+ vector<int> counts;
+ QNameQuery qQuery(bamFile);
+ for (vector<BamRecord>& records : qQuery)
+ counts.push_back(records.size());
+ EXPECT_EQ(expected, counts);
+ });
+}
+
+TEST(ZmwQueryTest, CountZmwSizes)
+{
+// // test case 1 has exactly one bamRecord.
+// string fn = test1fn;
+// vector<int> expected({1});
+// TestZmwQuery(fn, expected);
+// TestNoneConstZmwQuery(fn, expected);
+
+// // test case 2 has four bamRecords from the same zmw.
+// fn = test2fn;
+// expected = vector<int>({4});
+// TestZmwQuery(fn, expected);
+// TestNoneConstZmwQuery(fn, expected);
+
+// // more bamRecords in test case 3.
+// fn = test3fn;
+// expected = {2,3,3,2,2,1};
+// TestZmwQuery(fn, expected);
+// TestNoneConstZmwQuery(fn, expected);
+}
+
+TEST(QNameQueryTest, CountQSizes)
+{
+ // test case 1 has exactly one bamRecord.
+ string fn = test1fn;
+ vector<int> expected({1});
+ TestQNameQuery(fn, expected);
+ TestNoneConstQNameQuery(fn, expected);
+
+ // test case 2 has bamRecords of four subreads.
+ fn = test2fn;
+ expected = {1, 1, 1, 1};
+ TestQNameQuery(fn, expected);
+ TestNoneConstQNameQuery(fn, expected);
+
+ fn = test3fn;
+ expected = {2,1,1,1,1,1,1,2,1,1,1};
+ TestQNameQuery(fn, expected);
+ TestNoneConstQNameQuery(fn, expected);
+}
+
diff --git a/tests/src/test_IndexedFastaReader.cpp b/tests/src/test_IndexedFastaReader.cpp
new file mode 100644
index 0000000..68a0331
--- /dev/null
+++ b/tests/src/test_IndexedFastaReader.cpp
@@ -0,0 +1,212 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include "pbbam/IndexedFastaReader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/EntireFileQuery.h"
+#include <gtest/gtest.h>
+#include <iostream>
+#include <sstream>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string lambdaFasta = tests::Data_Dir + "/lambdaNEB.fa";
+const string singleInsertionBam = tests::Data_Dir + "/aligned.bam";
+
+TEST(IndexedFastaReaderTests, PrintSingleInsertion)
+{
+ IndexedFastaReader r(lambdaFasta);
+
+ // Open BAM file
+ BamFile bamFile(singleInsertionBam);
+ EntireFileQuery bamQuery(bamFile);
+
+ auto it = bamQuery.begin();
+ auto record = *it++;
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+ record = *it++;
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+ EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+ record = *it++;
+ EXPECT_EQ("----------------------------------------------------AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+ EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+ EXPECT_EQ("----------------------------------------------------AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+ EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+ record = *it++;
+ EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA----------------------------------------------------",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+ EXPECT_EQ("----------------------------------------------------TTGCCGCTGTT-ACCGTGCTGCGATCTTCTGCCATCGACGGACGTCCCACATTGGTGACTT",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+ EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+ r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+ EXPECT_EQ("TTGCCGCTGTT-ACCGTGCTGCGATCTTCTGCCATCGACGGACGTCCCACATTGGTGACTT",
+ r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+
+ // {
+ // std::stringstream output;
+ // auto itSS = bamQuery.begin();
+ // {
+ // const auto recordSS = *itSS;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+ // output << std::endl;
+ // }
+ // ++itSS;
+ // {
+ // const auto recordSS = *itSS;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+ // output << std::endl;
+ // }
+ // ++itSS;
+ // {
+ // const auto recordSS = *itSS;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+ // output << std::endl;
+ // }
+ // ++itSS;
+ // {
+ // const auto recordSS = *itSS;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+ // output << std::endl;
+ // output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+ // output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+ // }
+ // std::cerr << output.str();
+ // }
+}
+
+TEST(IndexedFastaReaderTests, ReadLambda)
+{
+ IndexedFastaReader r(lambdaFasta);
+
+ EXPECT_TRUE(r.HasSequence("lambda_NEB3011"));
+ EXPECT_FALSE(r.HasSequence("dog"));
+ EXPECT_EQ(1, r.NumSequences());
+ EXPECT_EQ(48502, r.SequenceLength("lambda_NEB3011"));
+
+ string seq = r.Subsequence("lambda_NEB3011:0-10");
+ EXPECT_EQ("GGGCGGCGAC", seq);
+
+ string seq2 = r.Subsequence("lambda_NEB3011", 0, 10);
+ EXPECT_EQ("GGGCGGCGAC", seq2);
+
+ // subsequence extending beyond bounds returns clipped
+ string seq3 = r.Subsequence("lambda_NEB3011", 48400, 48600);
+ EXPECT_EQ(102, seq3.length());
+
+ // bad subsequence
+}
+
+TEST(IndexedFastaReaderTests, Errors)
+{
+ IndexedFastaReader r(lambdaFasta);
+
+ //
+ // attempt access without "opening"
+ //
+ // EXPECT_THROW(r.NumSequences(), std::exception);
+ // EXPECT_THROW(r.HasSequence("lambda_NEB3011"), std::exception);
+ // EXPECT_THROW(r.SequenceLength("lambda_NEB3011"), std::exception);
+ // EXPECT_THROW(r.Subsequence("lambda_NEB3011:0-10"), std::exception);
+
+ //
+ // invalid accesses after opening
+ //
+ EXPECT_THROW(r.SequenceLength("dog"), std::exception);
+ EXPECT_THROW(r.Subsequence("dog:0-10"), std::exception);
+}
diff --git a/tests/src/test_Intervals.cpp b/tests/src/test_Intervals.cpp
new file mode 100644
index 0000000..14231b1
--- /dev/null
+++ b/tests/src/test_Intervals.cpp
@@ -0,0 +1,330 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/GenomicInterval.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(IntervalTest, Constructors)
+{
+ Interval<Position> empty;
+ Interval<Position> singleton(4);
+ Interval<Position> normal(5, 8);
+
+ EXPECT_EQ(0, empty.Start());
+ EXPECT_EQ(0, empty.Stop());
+
+ EXPECT_EQ(4, singleton.Start());
+ EXPECT_EQ(5, singleton.Stop());
+
+ EXPECT_EQ(5, normal.Start());
+ EXPECT_EQ(8, normal.Stop());
+
+ // TODO: check out-of-order intervals, etc
+}
+
+TEST(IntervalTest, EqualityTest)
+{
+ Interval<Position> empty;
+ Interval<Position> empty2;
+
+ Interval<Position> singleton(4);
+ Interval<Position> sameAsSingleton(4,5);
+
+ Interval<Position> normal(5, 8);
+ Interval<Position> sameAsNormal(5, 8);
+
+ Interval<Position> different(20, 40);
+
+ // self-equality
+ EXPECT_TRUE(empty == empty);
+ EXPECT_TRUE(singleton == singleton);
+ EXPECT_TRUE(normal == normal);
+ EXPECT_TRUE(different == different);
+
+ // same values equality
+ EXPECT_TRUE(empty == empty2);
+ EXPECT_TRUE(singleton == sameAsSingleton);
+ EXPECT_TRUE(normal == sameAsNormal);
+
+ // different values
+ EXPECT_FALSE(empty == singleton);
+ EXPECT_FALSE(empty == normal);
+ EXPECT_FALSE(empty == different);
+ EXPECT_FALSE(singleton == normal);
+ EXPECT_FALSE(normal == different);
+}
+
+TEST(IntervalTest, Copy)
+{
+ Interval<Position> interval1(5, 8);
+ Interval<Position> interval2(interval1);
+ Interval<Position> interval3 = interval1;
+
+ EXPECT_TRUE(interval1 == interval1);
+ EXPECT_TRUE(interval1 == interval2);
+ EXPECT_TRUE(interval1 == interval3);
+}
+
+TEST(IntervalTest, Modifier)
+{
+ Interval<Position> interval1(5, 8);
+ Interval<Position> interval2(interval1);
+ interval2.Start(2);
+ interval2.Stop(10);
+
+ EXPECT_FALSE(interval1 == interval2);
+ EXPECT_EQ(2, interval2.Start());
+ EXPECT_EQ(10, interval2.Stop());
+}
+
+TEST(IntervalTest, CoverTest)
+{
+ Interval<Position> interval1(2, 4);
+ Interval<Position> interval2(3, 5);
+ Interval<Position> interval3(6, 8);
+ Interval<Position> interval4(1, 7);
+ Interval<Position> interval5(5, 8);
+
+ EXPECT_TRUE(interval1.Covers(interval1)); // self-cover: a.covers(a)
+ EXPECT_TRUE(interval1.CoveredBy(interval1)); // self-cover: a.coveredBy(a)
+
+ EXPECT_TRUE(interval2.CoveredBy(interval4)); // a.coveredBy(b)
+ EXPECT_TRUE(interval4.Covers(interval2)); // thus b.covers(a)
+ EXPECT_FALSE(interval2 == interval4); // if a != b
+ EXPECT_FALSE(interval2.Covers(interval4)); // then !a.covers(b)
+
+ EXPECT_FALSE(interval2.Covers(interval3)); // completely disjoint
+ EXPECT_FALSE(interval3.Covers(interval2));
+ EXPECT_FALSE(interval2.CoveredBy(interval3));
+ EXPECT_FALSE(interval3.CoveredBy(interval2));
+
+ EXPECT_FALSE(interval2.Covers(interval5)); // a.stop == b.start
+ EXPECT_FALSE(interval2.CoveredBy(interval5));
+
+ EXPECT_TRUE(interval5.Covers(interval3)); // shared endpoint, start contained, thus a.covers(b)
+ EXPECT_TRUE(interval3.CoveredBy(interval5)); // and b.coveredBy(a)
+}
+
+TEST(IntervalTest, IntersectTest)
+{
+ Interval<Position> interval1(2, 4);
+ Interval<Position> interval2(3, 5);
+ Interval<Position> interval3(6, 8);
+ Interval<Position> interval4(1, 7);
+ Interval<Position> interval5(5, 8);
+
+ EXPECT_TRUE(interval1.Intersects(interval1)); // self-intersection: a.intersects(a)
+
+ EXPECT_TRUE(interval1.Intersects(interval2)); // if a.intersects(b)
+ EXPECT_TRUE(interval2.Intersects(interval1)); // then b.intersects(a)
+
+ EXPECT_TRUE(interval4.Covers(interval1)); // if b.covers(a),
+ EXPECT_TRUE(interval1.Intersects(interval4)); // then a.intersects(b)
+ EXPECT_TRUE(interval4.Intersects(interval1)); // and b.intersects(a)
+
+ EXPECT_FALSE(interval2.Intersects(interval3)); // b.start > a.stop (obvious disjoint)
+ EXPECT_FALSE(interval2.Intersects(interval5)); // b.start == a.stop (intervals are right open, so disjoint)
+}
+
+TEST(IntervalTest, ValidityTest)
+{
+ Interval<Position> interval1; // default ctor
+ Interval<Position> interval2(0,0); // start == stop (zero)
+ Interval<Position> interval3(4,4); // start == stop (nonzero)
+ Interval<Position> interval4(0,1); // start < stop (start is zero)
+ Interval<Position> interval5(4,5); // start < stop (start is nonzero)
+ Interval<Position> interval6(5,4); // start > stop
+
+ EXPECT_FALSE(interval1.IsValid());
+ EXPECT_FALSE(interval2.IsValid());
+ EXPECT_FALSE(interval3.IsValid());
+ EXPECT_TRUE(interval4.IsValid());
+ EXPECT_TRUE(interval5.IsValid());
+ EXPECT_FALSE(interval6.IsValid());
+}
+
+TEST(IntervalTest, LengthTest)
+{
+ Interval<Position> interval1(2, 4);
+ Interval<Position> interval2(3, 5);
+ Interval<Position> interval3(6, 8);
+ Interval<Position> interval4(1, 7);
+ Interval<Position> interval5(5, 8);
+
+ EXPECT_EQ(2, interval1.Length());
+ EXPECT_EQ(2, interval2.Length());
+ EXPECT_EQ(2, interval3.Length());
+ EXPECT_EQ(6, interval4.Length());
+ EXPECT_EQ(3, interval5.Length());
+
+ // TODO: check out-of-order intervals, etc
+}
+
+TEST(GenomicIntervalTest, DefaultConstructor)
+{
+ GenomicInterval gi;
+ EXPECT_EQ("", gi.Name());
+ EXPECT_EQ(0, gi.Start());
+ EXPECT_EQ(0, gi.Stop());
+}
+
+TEST(GenomicIntervalTest, ExplicitConstructor)
+{
+ GenomicInterval gi("foo", 100, 200);
+ EXPECT_EQ("foo", gi.Name());
+ EXPECT_EQ(100, gi.Start());
+ EXPECT_EQ(200, gi.Stop());
+}
+
+TEST(GenomicIntervalTest, RegionStringConstructor)
+{
+ GenomicInterval gi("foo:100-200");
+ EXPECT_EQ("foo", gi.Name());
+ EXPECT_EQ(100, gi.Start());
+ EXPECT_EQ(200, gi.Stop());
+
+ GenomicInterval refOnly("foo");
+ EXPECT_EQ("foo", refOnly.Name());
+ EXPECT_EQ(0, refOnly.Start());
+ EXPECT_EQ(1<<29, refOnly.Stop()); // htslib's default, "read-to-end" interval stop
+}
+
+TEST(GenomicIntervalTest, Copy)
+{
+ GenomicInterval interval1("foo", 10, 20);
+ GenomicInterval interval2(interval1);
+ GenomicInterval interval3 = interval1;
+
+ EXPECT_TRUE(interval1 == interval1);
+ EXPECT_TRUE(interval1 == interval2);
+ EXPECT_TRUE(interval1 == interval3);
+}
+
+TEST(GenomicIntervalTest, Modifiers)
+{
+ GenomicInterval interval1("foo", 10, 20);
+
+ // modify individual properties
+ GenomicInterval interval2(interval1);
+ interval2.Name("bar");
+ interval2.Start(2);
+ interval2.Stop(10);
+
+ // modify interval as a whole
+ GenomicInterval interval3(interval1);
+ interval3.Interval(interval2.Interval());
+
+ EXPECT_FALSE(interval1 == interval2);
+ EXPECT_EQ("bar", interval2.Name());
+ EXPECT_EQ(2, interval2.Start());
+ EXPECT_EQ(10, interval2.Stop());
+
+ EXPECT_EQ(interval1.Name(), interval3.Name());
+ EXPECT_EQ(interval2.Interval(), interval3.Interval());
+}
+
+TEST(GenomicIntervalTest, CoverTest)
+{
+ GenomicInterval interval1("foo", 2, 4);
+ GenomicInterval interval2("foo", 3, 5);
+ GenomicInterval interval3("foo", 6, 8);
+ GenomicInterval interval4("foo", 1, 7);
+ GenomicInterval interval5("foo", 5, 8);
+
+ // same as interval2, but different ref
+ GenomicInterval interval6(interval2);
+ interval6.Name("bar");
+
+ EXPECT_TRUE(interval1.Covers(interval1)); // self-cover: a.covers(a)
+ EXPECT_TRUE(interval1.CoveredBy(interval1)); // self-cover: a.coveredBy(a)
+
+ EXPECT_TRUE(interval2.CoveredBy(interval4)); // a.coveredBy(b)
+ EXPECT_TRUE(interval4.Covers(interval2)); // thus b.covers(a)
+ EXPECT_FALSE(interval2 == interval4); // if a != b
+ EXPECT_FALSE(interval2.Covers(interval4)); // then !a.covers(b)
+
+ EXPECT_FALSE(interval6.CoveredBy(interval4)); // interval 6 has same start/stop as 2, w/ different ref
+ EXPECT_FALSE(interval4.Covers(interval6)); //
+ EXPECT_FALSE(interval6 == interval4); //
+ EXPECT_FALSE(interval6.Covers(interval4)); //
+
+ EXPECT_FALSE(interval2.Covers(interval3)); // completely disjoint
+ EXPECT_FALSE(interval3.Covers(interval2));
+ EXPECT_FALSE(interval2.CoveredBy(interval3));
+ EXPECT_FALSE(interval3.CoveredBy(interval2));
+
+ EXPECT_FALSE(interval2.Covers(interval5)); // a.stop == b.start
+ EXPECT_FALSE(interval2.CoveredBy(interval5));
+
+ EXPECT_TRUE(interval5.Covers(interval3)); // shared endpoint, start contained, thus a.covers(b)
+ EXPECT_TRUE(interval3.CoveredBy(interval5)); // and b.coveredBy(a)
+}
+
+TEST(GenomicIntervalTest, ValidityTest)
+{
+ GenomicInterval interval1; // default ctor
+ GenomicInterval interval2("foo",0,0); // valid id, start == stop (zero)
+ GenomicInterval interval3("foo",4,4); // valid id, start == stop (nonzero)
+ GenomicInterval interval4("foo",0,1); // valid id, start < stop (start is zero)
+ GenomicInterval interval5("foo",4,5); // valid id, start < stop (start is nonzero)
+ GenomicInterval interval6("foo",5,4); // valid id, start > stop
+ GenomicInterval interval7("",0,0); // invalid id, start == stop (zero)
+ GenomicInterval interval8("",4,4); // invalid id, start == stop (nonzero)
+ GenomicInterval interval9("",0,1); // invalid id, start < stop (start is zero)
+ GenomicInterval interval10("",4,5); // invalid id, start < stop (start is nonzero)
+ GenomicInterval interval11("",5,4); // invalid id, start > stop
+
+ EXPECT_FALSE(interval1.IsValid());
+ EXPECT_FALSE(interval2.IsValid());
+ EXPECT_FALSE(interval3.IsValid());
+ EXPECT_TRUE(interval4.IsValid());
+ EXPECT_TRUE(interval5.IsValid());
+ EXPECT_FALSE(interval6.IsValid());
+ EXPECT_FALSE(interval7.IsValid());
+ EXPECT_FALSE(interval8.IsValid());
+ EXPECT_FALSE(interval9.IsValid());
+ EXPECT_FALSE(interval10.IsValid());
+ EXPECT_FALSE(interval11.IsValid());
+}
diff --git a/tests/src/test_PacBioIndex.cpp b/tests/src/test_PacBioIndex.cpp
new file mode 100644
index 0000000..c841c68
--- /dev/null
+++ b/tests/src/test_PacBioIndex.cpp
@@ -0,0 +1,768 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/BamFile.h>
+#include <pbbam/BamWriter.h>
+#include <pbbam/EntireFileQuery.h>
+#include <pbbam/PbiBuilder.h>
+#include <pbbam/PbiIndex.h>
+#include <pbbam/PbiRawData.h>
+#include <pbbam/internal/PbiIndex_p.h>
+#include <string>
+#include <cstdio>
+#include <cstdlib>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string test2BamFn = tests::Data_Dir + "/test_group_query/test2.bam";
+
+namespace PacBio {
+namespace BAM {
+namespace tests {
+
+static
+PbiRawData Test2Bam_RawIndex(void)
+{
+ PbiRawData index;
+ index.Version(PbiFile::Version_3_0_0);
+ index.FileSections(PbiFile::SUBREAD | PbiFile::MAPPED);
+ index.NumReads(4);
+
+ PbiRawSubreadData& subreadData = index.SubreadData();
+ subreadData.rgId_ = { -1197849594, -1197849594, -1197849594, -1197849594 };
+ subreadData.qStart_ = { 2114, 2579, 4101, 5615 };
+ subreadData.qEnd_ = { 2531, 4055, 5571, 6237 };
+ subreadData.holeNumber_ = { 14743, 14743, 14743, 14743 };
+ subreadData.readQual_ = { 901, 901, 901, 901 };
+ subreadData.fileOffset_ = { 35651584, 35655123, 35667124, 35679164 };
+
+ PbiRawMappedData& mappedData = index.mappedData_;
+ mappedData.tId_ = { 0, 0, 0, 0 };
+ mappedData.tStart_ = { 9507, 8453, 8455, 9291 };
+ mappedData.tEnd_ = { 9903, 9902, 9893, 9900 };
+ mappedData.aStart_ = { 2130, 2581, 4102, 5619 };
+ mappedData.aEnd_ = { 2531, 4055, 5560, 6237 };
+ mappedData.revStrand_ = { 0, 1, 0, 1 };
+ mappedData.mapQV_ = { 254, 254, 254, 254 };
+ mappedData.nM_ = { 384, 1411, 1393, 598 };
+ mappedData.nMM_ = { 0, 0, 0, 0 }; // old 'M' ops were just replaced w/ '=', no 'X'
+
+ // reference & barcode data are empty for this file
+ return index;
+}
+
+static
+void ExpectRawIndicesEqual(const PbiRawData& expected, const PbiRawData& actual)
+{
+ // header data
+ EXPECT_EQ(expected.Version(), actual.Version());
+ EXPECT_EQ(expected.FileSections(), actual.FileSections());
+ EXPECT_EQ(expected.NumReads(), actual.NumReads());
+
+ // subread data
+ const PbiRawSubreadData& e = expected.SubreadData();
+ const PbiRawSubreadData& a = actual.SubreadData();
+ EXPECT_EQ(e.rgId_, a.rgId_);
+ EXPECT_EQ(e.qStart_, a.qStart_);
+ EXPECT_EQ(e.qEnd_, a.qEnd_);
+ EXPECT_EQ(e.holeNumber_, a.holeNumber_);
+ EXPECT_EQ(e.readQual_, a.readQual_);
+ EXPECT_EQ(e.fileOffset_, a.fileOffset_);
+
+ // mapped data
+ EXPECT_EQ(expected.HasMappedData(), actual.HasMappedData());
+ if (expected.HasMappedData() && actual.HasMappedData()) {
+ const PbiRawMappedData& e = expected.MappedData();
+ const PbiRawMappedData& a = actual.MappedData();
+ EXPECT_EQ(e.tId_, a.tId_);
+ EXPECT_EQ(e.tStart_, a.tStart_);
+ EXPECT_EQ(e.tEnd_, a.tEnd_);
+ EXPECT_EQ(e.aStart_, a.aStart_);
+ EXPECT_EQ(e.aEnd_, a.aEnd_);
+ EXPECT_EQ(e.revStrand_, a.revStrand_);
+ EXPECT_EQ(e.nM_, a.nM_);
+ EXPECT_EQ(e.nMM_, a.nMM_);
+ EXPECT_EQ(e.mapQV_, a.mapQV_);
+ }
+
+ // reference data
+ EXPECT_EQ(expected.HasReferenceData(), actual.HasReferenceData());
+ if (expected.HasReferenceData() && actual.HasReferenceData()) {
+ const PbiRawReferenceData& e = expected.ReferenceData();
+ const PbiRawReferenceData& a = actual.ReferenceData();
+ EXPECT_EQ(e.entries_, a.entries_);
+ }
+
+ // barcode data
+ EXPECT_EQ(expected.HasBarcodeData(), actual.HasBarcodeData());
+ if (expected.HasBarcodeData() && actual.HasBarcodeData()) {
+ const PbiRawBarcodeData& e = expected.BarcodeData();
+ const PbiRawBarcodeData& a = actual.BarcodeData();
+ EXPECT_EQ(e.bcLeft_, a.bcLeft_);
+ EXPECT_EQ(e.bcRight_, a.bcRight_);
+ EXPECT_EQ(e.bcQual_, a.bcQual_);
+ EXPECT_EQ(e.ctxtFlag_, a.ctxtFlag_);
+ }
+}
+
+static
+bool SubreadLookupsEqual(const internal::SubreadLookupData& lhs,
+ const internal::SubreadLookupData& rhs)
+{
+ return (lhs.rgId_ == rhs.rgId_ &&
+ lhs.qStart_ == rhs.qStart_ &&
+ lhs.qEnd_ == rhs.qEnd_ &&
+ lhs.holeNumber_ == rhs.holeNumber_ &&
+ lhs.readQual_ == rhs.readQual_ &&
+ lhs.fileOffset_ == rhs.fileOffset_);
+}
+
+static
+bool MappedLookupsEqual(const internal::MappedLookupData& lhs,
+ const internal::MappedLookupData& rhs)
+{
+ return (lhs.tId_ == rhs.tId_ &&
+ lhs.tStart_ == rhs.tStart_ &&
+ lhs.tEnd_ == rhs.tEnd_ &&
+ lhs.aStart_ == rhs.aStart_ &&
+ lhs.aEnd_ == rhs.aEnd_ &&
+ lhs.nM_ == rhs.nM_ &&
+ lhs.nMM_ == rhs.nMM_ &&
+ lhs.mapQV_ == rhs.mapQV_ &&
+ lhs.forwardStrand_ == rhs.forwardStrand_ &&
+ lhs.reverseStrand_ == rhs.reverseStrand_);
+}
+
+static
+bool ReferenceLookupsEqual(const internal::ReferenceLookupData& lhs,
+ const internal::ReferenceLookupData& rhs)
+{
+ return lhs.references_ == rhs.references_;
+}
+
+static
+bool BarcodeLookupsEqual(const internal::BarcodeLookupData& lhs,
+ const internal::BarcodeLookupData& rhs)
+{
+ return (lhs.bcLeft_ == rhs.bcLeft_ &&
+ lhs.bcRight_ == rhs.bcRight_ &&
+ lhs.bcQual_ == rhs.bcQual_ &&
+ lhs.ctxtFlag_ == rhs.ctxtFlag_);
+}
+
+static
+bool PbiIndicesEqual(const PbiIndex& lhs, const PbiIndex& rhs)
+{
+ using namespace ::PacBio::BAM;
+ const unique_ptr<internal::PbiIndexPrivate>& lhsImpl = lhs.d_;
+ const unique_ptr<internal::PbiIndexPrivate>& rhsImpl = rhs.d_;
+ if (lhsImpl == rhsImpl)
+ return true;
+ if (lhsImpl == nullptr || rhsImpl == nullptr)
+ return false;
+
+ // metadata compare
+ if (lhsImpl->version_ != rhsImpl->version_ ||
+ lhsImpl->sections_ != rhsImpl->sections_ ||
+ lhsImpl->numReads_ != rhsImpl->numReads_)
+ { return false; }
+
+ // component compare
+ if ( !SubreadLookupsEqual(lhsImpl->subreadData_, rhsImpl->subreadData_) ||
+ !MappedLookupsEqual(lhsImpl->mappedData_, rhsImpl->mappedData_) ||
+ !ReferenceLookupsEqual(lhsImpl->referenceData_, rhsImpl->referenceData_) ||
+ !BarcodeLookupsEqual(lhsImpl->barcodeData_, rhsImpl->barcodeData_))
+ { return false; }
+
+ // if we get here, OK
+ return true;
+}
+
+} // namespace tests
+} // namespace BAM
+} // namespace PacBio
+
+TEST(PacBioIndexTest, CreateFromExistingBam)
+{
+ // do this in temp directory, so we can ensure write access
+ const string tempDir = "/tmp/";
+ const string tempBamFn = tempDir + "test2.bam";
+ const string tempPbiFn = tempBamFn + ".pbi";
+ string cmd("cp ");
+ cmd += test2BamFn;
+ cmd += " ";
+ cmd += tempDir;
+ int cmdResult = system(cmd.c_str());
+ (void)cmdResult;
+
+ BamFile bamFile(tempBamFn);
+ PbiFile::CreateFrom(bamFile);
+ EXPECT_EQ(tempPbiFn, bamFile.PacBioIndexFilename());
+
+ PbiRawData index(bamFile.PacBioIndexFilename());
+ EXPECT_EQ(PbiFile::Version_3_0_0, index.Version());
+ EXPECT_EQ(4, index.NumReads());
+ EXPECT_TRUE(index.HasMappedData());
+
+ const PbiRawData& expectedIndex = tests::Test2Bam_RawIndex();
+ tests::ExpectRawIndicesEqual(expectedIndex, index);
+
+ // clean up temp file(s)
+ remove(tempBamFn.c_str());
+ remove(tempPbiFn.c_str());
+}
+
+TEST(PacBioIndexTest, CreateOnTheFly)
+{
+ // do this in temp directory, so we can ensure write access
+ const string tempDir = "/tmp/";
+ const string tempBamFn = tempDir + "temp.bam";
+ const string tempPbiFn = tempBamFn + ".pbi";
+
+ // create PBI on the fly from input BAM while we write to new file
+ {
+ BamFile bamFile(test2BamFn);
+ BamHeader header = bamFile.Header();
+
+ BamWriter writer(tempBamFn, header);
+ PbiBuilder builder(tempPbiFn, header.Sequences().size());
+
+ int64_t vOffset = 0;
+ EntireFileQuery entireFile(bamFile);
+ for (const BamRecord& record : entireFile) {
+ writer.Write(record, &vOffset);
+ builder.AddRecord(record, vOffset);
+ }
+ }
+
+ // compare data in new PBI file, to expected data
+ const PbiRawData& expectedIndex = tests::Test2Bam_RawIndex();
+ const PbiRawData& fromBuilt = PbiRawData(tempPbiFn);
+ tests::ExpectRawIndicesEqual(expectedIndex, fromBuilt);
+
+ // straight diff of newly-generated PBI file to existing PBI
+ const string pbiDiffCmd = string("diff -q ") + test2BamFn + ".pbi " + tempPbiFn;
+ EXPECT_EQ(0, system(pbiDiffCmd.c_str()));
+
+ // clean up temp file(s)
+ remove(tempBamFn.c_str());
+ remove(tempPbiFn.c_str());
+}
+
+TEST(PacBioIndexTest, RawLoadFromPbiFile)
+{
+ const BamFile bamFile(test2BamFn);
+ const string& pbiFilename = bamFile.PacBioIndexFilename();
+ const PbiRawData loadedIndex(pbiFilename);
+
+ const PbiRawData& expectedIndex = tests::Test2Bam_RawIndex();
+ tests::ExpectRawIndicesEqual(expectedIndex, loadedIndex);
+}
+
+TEST(PacBioIndexTest, ReferenceDataNotLoadedOnUnsortedBam)
+{
+ BamFile bamFile(test2BamFn);
+ PbiRawData raw(bamFile.PacBioIndexFilename());
+ EXPECT_FALSE(raw.HasReferenceData());
+}
+
+TEST(PacBioIndexTest, LookupLoadFromFileOk)
+{
+ BamFile bamFile(test2BamFn);
+ EXPECT_NO_THROW(
+ {
+ PbiIndex index(bamFile.PacBioIndexFilename());
+ EXPECT_EQ(4, index.NumReads());
+ EXPECT_EQ(vector<int64_t>({ 35651584, 35655123, 35667124, 35679164 }), index.VirtualFileOffsets());
+ });
+}
+
+TEST(PacBioIndexTest, ThrowOnNonExistentPbiFile)
+{
+ EXPECT_THROW(PbiRawData raw("does_not_exist.pbi"), std::exception);
+ EXPECT_THROW(PbiIndex idx("does_not_exist.pbi"), std::exception);
+}
+
+TEST(PacBioIndexTest, ThrowOnNonPbiFile)
+{
+ // completely wrong format
+ const std::string fastaFn = tests::Data_Dir + "/lambdaNEB.fa";
+ EXPECT_THROW(PbiRawData raw(fastaFn), std::exception);
+ EXPECT_THROW(PbiIndex idx(fastaFn), std::exception);
+
+ // BGZF file, but not PBI
+ const std::string& bamFn = tests::Data_Dir + "/ex2.bam";
+ EXPECT_THROW(PbiRawData raw(bamFn), std::exception);
+ EXPECT_THROW(PbiIndex idx(bamFn), std::exception);
+}
+
+TEST(PacBioIndexTest, Copy_and_Move)
+{
+ const PbiIndex lookup(test2BamFn + ".pbi");
+
+ const PbiIndex copyConstructed(lookup);
+ const PbiIndex moveConstructed(std::move(PbiIndex(test2BamFn + ".pbi")));
+
+ PbiIndex copyAssigned;
+ copyAssigned = lookup;
+
+ PbiIndex moveAssigned;
+ moveAssigned = std::move(PbiIndex(test2BamFn + ".pbi"));
+
+ EXPECT_TRUE(tests::PbiIndicesEqual(lookup, copyConstructed));
+ EXPECT_TRUE(tests::PbiIndicesEqual(lookup, moveConstructed));
+ EXPECT_TRUE(tests::PbiIndicesEqual(lookup, copyAssigned));
+ EXPECT_TRUE(tests::PbiIndicesEqual(lookup, moveAssigned));
+}
+
+TEST(PacBioIndexTest, OrderedLookup)
+{
+ using PacBio::BAM::CompareType;
+ using PacBio::BAM::IndexList;
+ using PacBio::BAM::internal::OrderedLookup;
+
+ OrderedLookup<int>::ContainerType oRawData;
+ oRawData[11] = { 0, 3, 4 };
+ oRawData[20] = { 1 };
+ oRawData[42] = { 2, 7, 8 };
+ oRawData[10] = { 5 };
+ oRawData[12] = { 6 };
+ oRawData[99] = { 9 };
+
+ OrderedLookup<int> oLookup(oRawData);
+
+ // EQUAL
+ EXPECT_EQ(IndexList({5}), oLookup.LookupIndices(10, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({0, 3, 4}), oLookup.LookupIndices(11, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({6}), oLookup.LookupIndices(12, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({1}), oLookup.LookupIndices(20, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({2, 7, 8}), oLookup.LookupIndices(42, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({9}), oLookup.LookupIndices(99, CompareType::EQUAL));
+ EXPECT_EQ(IndexList(), oLookup.LookupIndices(66, CompareType::EQUAL)); // does not exist
+
+ // NOT_EQUAL
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 6, 7, 8, 9}), oLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({1, 2, 5, 6, 7, 8, 9}), oLookup.LookupIndices(11, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 7, 8, 9}), oLookup.LookupIndices(12, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 2, 3, 4, 5, 6, 7, 8, 9}), oLookup.LookupIndices(20, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 3, 4, 5, 6, 9}), oLookup.LookupIndices(42, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8}), oLookup.LookupIndices(99, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}), oLookup.LookupIndices(66, CompareType::NOT_EQUAL)); // does not exist
+
+ // LESS_THAN
+ EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), oLookup.LookupIndices(13, CompareType::LESS_THAN));
+ EXPECT_EQ(IndexList({0, 3, 4, 5}), oLookup.LookupIndices(12, CompareType::LESS_THAN));
+ // do more checks
+
+ // LESS_THAN_EQUAL
+ EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), oLookup.LookupIndices(13, CompareType::LESS_THAN_EQUAL));
+ EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), oLookup.LookupIndices(12, CompareType::LESS_THAN_EQUAL));
+ // more checks?
+
+ // GREATER_THAN
+ EXPECT_EQ(IndexList({2,7,8,9}), oLookup.LookupIndices(41, CompareType::GREATER_THAN));
+ EXPECT_EQ(IndexList({9}), oLookup.LookupIndices(42, CompareType::GREATER_THAN));
+ // more checks?
+
+ // GREATER_THAN_EQUAL
+ EXPECT_EQ(IndexList({2,7,8,9}), oLookup.LookupIndices(41, CompareType::GREATER_THAN_EQUAL));
+ EXPECT_EQ(IndexList({2,7,8,9}), oLookup.LookupIndices(42, CompareType::GREATER_THAN_EQUAL));
+ // more checks?
+}
+
+TEST(PacBioIndexTest, UnorderedLookup)
+{
+ using PacBio::BAM::CompareType;
+ using PacBio::BAM::IndexList;
+ using PacBio::BAM::internal::UnorderedLookup;
+
+ UnorderedLookup<int>::ContainerType uRawData;
+ uRawData[11] = { 0, 3, 4 };
+ uRawData[20] = { 1 };
+ uRawData[42] = { 2, 7, 8 };
+ uRawData[10] = { 5 };
+ uRawData[12] = { 6 };
+ uRawData[99] = { 9 };
+
+ UnorderedLookup<int> uLookup(uRawData);
+
+ // EQUAL
+ EXPECT_EQ(IndexList({5}), uLookup.LookupIndices(10, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({0, 3, 4}), uLookup.LookupIndices(11, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({6}), uLookup.LookupIndices(12, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({1}), uLookup.LookupIndices(20, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({2, 7, 8}), uLookup.LookupIndices(42, CompareType::EQUAL));
+ EXPECT_EQ(IndexList({9}), uLookup.LookupIndices(99, CompareType::EQUAL));
+ EXPECT_EQ(IndexList(), uLookup.LookupIndices(66, CompareType::EQUAL)); // does not exist
+
+ // NOT_EQUAL
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 6, 7, 8, 9}), uLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({1, 2, 5, 6, 7, 8, 9}), uLookup.LookupIndices(11, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 7, 8, 9}), uLookup.LookupIndices(12, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 2, 3, 4, 5, 6, 7, 8, 9}), uLookup.LookupIndices(20, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 3, 4, 5, 6, 9}), uLookup.LookupIndices(42, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8}), uLookup.LookupIndices(99, CompareType::NOT_EQUAL));
+ EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}), uLookup.LookupIndices(66, CompareType::NOT_EQUAL)); // does not exist
+
+ // LESS_THAN
+ EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), uLookup.LookupIndices(13, CompareType::LESS_THAN));
+ EXPECT_EQ(IndexList({0, 3, 4, 5}), uLookup.LookupIndices(12, CompareType::LESS_THAN));
+ // more checks?
+
+ // LESS_THAN_EQUAL
+ EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), uLookup.LookupIndices(13, CompareType::LESS_THAN_EQUAL));
+ EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), uLookup.LookupIndices(12, CompareType::LESS_THAN_EQUAL));
+ // more checks?
+
+ // GREATER_THAN
+ EXPECT_EQ(IndexList({2,7,8,9}), uLookup.LookupIndices(41, CompareType::GREATER_THAN));
+ EXPECT_EQ(IndexList({9}), uLookup.LookupIndices(42, CompareType::GREATER_THAN));
+ // more checks?
+
+ // GREATER_THAN_EQUAL
+ EXPECT_EQ(uLookup.LookupIndices(41, CompareType::GREATER_THAN_EQUAL), IndexList({2,7,8,9}));
+ EXPECT_EQ(uLookup.LookupIndices(42, CompareType::GREATER_THAN_EQUAL), IndexList({2,7,8,9}));
+ // more checks?
+}
+
+TEST(PacBioIndexTest, MergeBlocks)
+{
+ using PacBio::BAM::CompareType;
+ using PacBio::BAM::IndexList;
+ using PacBio::BAM::IndexResultBlock;
+ using PacBio::BAM::IndexResultBlocks;
+ using PacBio::BAM::internal::mergedIndexBlocks;
+ using PacBio::BAM::internal::OrderedLookup;
+
+ OrderedLookup<int>::ContainerType oRawData;
+ oRawData[11] = { 0, 3, 4 };
+ oRawData[20] = { 1 };
+ oRawData[42] = { 2, 7, 8 };
+ oRawData[10] = { 5 };
+ oRawData[12] = { 6 };
+ oRawData[99] = { 9 };
+
+ OrderedLookup<int> oLookup(oRawData);
+
+ // EQUAL
+ auto mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(10, CompareType::EQUAL));
+ EXPECT_EQ(1, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(5, 1), mergedBlocks.at(0));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(11, CompareType::EQUAL));
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 1), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(3, 2), mergedBlocks.at(1));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(12, CompareType::EQUAL));
+ EXPECT_EQ(1, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(6, 1), mergedBlocks.at(0));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(20, CompareType::EQUAL));
+ EXPECT_EQ(1, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(1, 1), mergedBlocks.at(0));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(42, CompareType::EQUAL));
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(2, 1), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(7, 2), mergedBlocks.at(1));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(99, CompareType::EQUAL));
+ EXPECT_EQ(1, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(9, 1), mergedBlocks.at(0));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(66, CompareType::EQUAL));
+ EXPECT_TRUE(mergedBlocks.empty());
+
+ // NOT_EQUAL
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 5), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(6, 4), mergedBlocks.at(1));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(11, CompareType::NOT_EQUAL));
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(1, 2), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(5, 5), mergedBlocks.at(1));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(12, CompareType::NOT_EQUAL));
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 6), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(7, 3), mergedBlocks.at(1));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(20, CompareType::NOT_EQUAL));
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 1), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(2, 8), mergedBlocks.at(1));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(42, CompareType::NOT_EQUAL));
+ EXPECT_EQ(3, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 2), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(3, 4), mergedBlocks.at(1));
+ EXPECT_EQ(IndexResultBlock(9, 1), mergedBlocks.at(2));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(99, CompareType::NOT_EQUAL));
+ EXPECT_EQ(1, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 9), mergedBlocks.at(0));
+
+ mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(66, CompareType::NOT_EQUAL));
+ EXPECT_EQ(1, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 10), mergedBlocks.at(0));
+}
+
+TEST(PacBioIndexTest, ApplyOffsetsToBlocks)
+{
+ using PacBio::BAM::CompareType;
+ using PacBio::BAM::IndexList;
+ using PacBio::BAM::IndexResultBlock;
+ using PacBio::BAM::IndexResultBlocks;
+ using PacBio::BAM::internal::mergedIndexBlocks;
+ using PacBio::BAM::internal::OrderedLookup;
+ using PacBio::BAM::internal::SubreadLookupData;
+
+ OrderedLookup<int>::ContainerType oRawData;
+ oRawData[11] = { 0, 3, 4 };
+ oRawData[20] = { 1 };
+ oRawData[42] = { 2, 7, 8 };
+ oRawData[10] = { 5 };
+ oRawData[12] = { 6 };
+ oRawData[99] = { 9 };
+
+ OrderedLookup<int> oLookup(oRawData);
+ auto mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(IndexResultBlock(0, 5), mergedBlocks.at(0));
+ EXPECT_EQ(IndexResultBlock(6, 4), mergedBlocks.at(1));
+
+ SubreadLookupData subreadIndex;
+ subreadIndex.fileOffset_ = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
+ subreadIndex.ApplyOffsets(mergedBlocks);
+
+ EXPECT_EQ(2, mergedBlocks.size());
+ EXPECT_EQ(0, mergedBlocks.at(0).virtualOffset_);
+ EXPECT_EQ(5, mergedBlocks.at(0).numReads_);
+ EXPECT_EQ(60, mergedBlocks.at(1).virtualOffset_);
+ EXPECT_EQ(4, mergedBlocks.at(1).numReads_);
+}
+
+TEST(PacBioIndexTest, LookupMulti)
+{
+ using PacBio::BAM::CompareType;
+ using PacBio::BAM::IndexList;
+ using PacBio::BAM::IndexResultBlock;
+ using PacBio::BAM::IndexResultBlocks;
+ using PacBio::BAM::SubreadField;
+ using PacBio::BAM::internal::mergedIndexBlocks;
+ using PacBio::BAM::internal::SubreadLookupData;
+ using PacBio::BAM::internal::UnorderedLookup;
+
+ UnorderedLookup<int32_t>::ContainerType uRawData;
+ uRawData[11] = { 0, 3, 4 };
+ uRawData[20] = { 1 };
+ uRawData[42] = { 2, 7, 8 };
+ uRawData[10] = { 5 };
+ uRawData[12] = { 6 };
+ uRawData[99] = { 9 };
+
+ SubreadLookupData subreadIndex;
+ subreadIndex.rgId_ = UnorderedLookup<int32_t>(uRawData);
+ subreadIndex.fileOffset_ = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
+
+ const std::vector<int32_t> whitelist = { 11, 42, 20 };
+ const auto indices = subreadIndex.IndicesMulti(SubreadField::RG_ID, whitelist);
+
+ IndexResultBlocks mergedBlocks = mergedIndexBlocks(indices);
+ subreadIndex.ApplyOffsets(mergedBlocks);
+
+ EXPECT_EQ(IndexList({0, 3, 4, 2, 7, 8, 1}), indices);
+ EXPECT_EQ(2, mergedBlocks.size());
+
+ const IndexResultBlock& block0 = mergedBlocks.at(0);
+ EXPECT_EQ(0, block0.firstIndex_);
+ EXPECT_EQ(5, block0.numReads_);
+ EXPECT_EQ(0, block0.virtualOffset_);
+
+ const IndexResultBlock& block1 = mergedBlocks.at(1);
+ EXPECT_EQ(7, block1.firstIndex_);
+ EXPECT_EQ(2, block1.numReads_);
+ EXPECT_EQ(70, block1.virtualOffset_);
+}
+
+TEST(PacBioIndexTest, LookupAPI)
+{
+ const PbiIndex index(test2BamFn + ".pbi");
+
+ // rgId == x
+ const IndexResultBlocks rgResult = index.Lookup(ReadGroupIndexRequest(-1197849594));
+ EXPECT_EQ(1, rgResult.size());
+ EXPECT_EQ(0, rgResult.at(0).firstIndex_);
+ EXPECT_EQ(4, rgResult.at(0).numReads_);
+ EXPECT_EQ(35651584, rgResult.at(0).virtualOffset_);
+
+ // rg != x
+ const IndexResultBlocks notRgResult = index.Lookup(ReadGroupIndexRequest(-1197849594, CompareType::NOT_EQUAL));
+ EXPECT_TRUE(notRgResult.empty());
+
+ // tEnd <= x
+ const IndexResultBlocks tEndLteResult = index.Lookup(ReferenceEndIndexRequest(9900, CompareType::LESS_THAN_EQUAL));
+ EXPECT_EQ(1, tEndLteResult.size());
+ EXPECT_EQ(2, tEndLteResult.at(0).firstIndex_);
+ EXPECT_EQ(2, tEndLteResult.at(0).numReads_);
+ EXPECT_EQ(35667124, tEndLteResult.at(0).virtualOffset_);
+
+ // tEnd >= x
+ const IndexResultBlocks tEndGteResult = index.Lookup(ReferenceEndIndexRequest(9900, CompareType::GREATER_THAN_EQUAL));
+ EXPECT_EQ(2, tEndGteResult.size());
+ EXPECT_EQ(0, tEndGteResult.at(0).firstIndex_);
+ EXPECT_EQ(2, tEndGteResult.at(0).numReads_);
+ EXPECT_EQ(35651584, tEndGteResult.at(0).virtualOffset_);
+ EXPECT_EQ(3, tEndGteResult.at(1).firstIndex_);
+ EXPECT_EQ(1, tEndGteResult.at(1).numReads_);
+ EXPECT_EQ(35679164, tEndGteResult.at(1).virtualOffset_);
+
+ // strand query
+ const IndexResultBlocks forward = index.Lookup(StrandIndexRequest(Strand::FORWARD));
+ EXPECT_EQ(2, forward.size());
+ EXPECT_EQ(0, forward.at(0).firstIndex_);
+ EXPECT_EQ(1, forward.at(0).numReads_);
+ EXPECT_EQ(35651584, forward.at(0).virtualOffset_);
+ EXPECT_EQ(2, forward.at(1).firstIndex_);
+ EXPECT_EQ(1, forward.at(1).numReads_);
+ EXPECT_EQ(35667124, forward.at(1).virtualOffset_);
+
+ const IndexResultBlocks reverse = index.Lookup(StrandIndexRequest(Strand::REVERSE));
+ EXPECT_EQ(2, reverse.size());
+ EXPECT_EQ(1, reverse.at(0).firstIndex_);
+ EXPECT_EQ(1, reverse.at(0).numReads_);
+ EXPECT_EQ(35655123, reverse.at(0).virtualOffset_);
+ EXPECT_EQ(3, reverse.at(1).firstIndex_);
+ EXPECT_EQ(1, reverse.at(1).numReads_);
+ EXPECT_EQ(35679164, reverse.at(1).virtualOffset_);
+
+ // query data field that is not in the PBI
+ const IndexResultBlocks missing = index.Lookup(BarcodeQualityIndexRequest(77, CompareType::GREATER_THAN));
+ EXPECT_TRUE(missing.empty());
+}
+
+TEST(PacBioIndexTest, LookupByZmw)
+{
+ BamFile f(tests::Data_Dir + "/dataset/bam_mapping.bam");
+ f.EnsurePacBioIndexExists();
+
+ PbiIndex index(f.PacBioIndexFilename());
+
+ const IndexResultBlocks blocks = index.Lookup(ZmwIndexRequest(20000, CompareType::LESS_THAN));
+ EXPECT_EQ(14, blocks.size());
+
+ //
+ // we'll take a look at first 5 contiguous blocks of reads with ZMW < 20000
+ //
+ // skipped: { 49050, 32328, 32328 }
+ // block0: { 6469, 6469 }
+ // skipped: { 30983 }
+ // block1: { 13473, 13473, 19915 }
+ // skipped: { 30983 }
+ // block2: { 19915, 7247, 7247 }
+ // skipped: { 38025 }
+ // block3: { 13473 }
+ // skipped: { 36363, 36363, 31174, 31174, 38025, 50257, 50257 }
+ // block4: { 14743, 14743 }
+ //
+
+ const IndexResultBlock& block0 = blocks.at(0);
+ EXPECT_EQ(3, block0.firstIndex_);
+ EXPECT_EQ(2, block0.numReads_);
+ EXPECT_EQ(32654529, block0.virtualOffset_);
+
+ const IndexResultBlock& block1 = blocks.at(1);
+ EXPECT_EQ(6, block1.firstIndex_);
+ EXPECT_EQ(3, block1.numReads_);
+ EXPECT_EQ(32669996, block1.virtualOffset_);
+
+ const IndexResultBlock& block2 = blocks.at(2);
+ EXPECT_EQ(10, block2.firstIndex_);
+ EXPECT_EQ(3, block2.numReads_);
+ EXPECT_EQ(1388841957, block2.virtualOffset_);
+
+ const IndexResultBlock& block3 = blocks.at(3);
+ EXPECT_EQ(14, block3.firstIndex_);
+ EXPECT_EQ(1, block3.numReads_);
+ EXPECT_EQ(1388864866, block3.virtualOffset_);
+
+ const IndexResultBlock& block4 = blocks.at(4);
+ EXPECT_EQ(22, block4.firstIndex_);
+ EXPECT_EQ(2, block4.numReads_);
+ EXPECT_EQ(1388892121, block4.virtualOffset_);
+}
+
+TEST(PacBioIndexTest, LookupMultiZmw)
+{
+ BamFile f(tests::Data_Dir + "/dataset/bam_mapping.bam");
+ f.EnsurePacBioIndexExists();
+
+ PbiIndex index(f.PacBioIndexFilename());
+
+ const std::vector<int32_t> whitelist = { 13473, 38025 };
+ const ZmwIndexMultiRequest request(whitelist);
+ const IndexResultBlocks& blocks = index.Lookup(request);
+
+ EXPECT_EQ(3, blocks.size());
+
+ const IndexResultBlock& block0 = blocks.at(0);
+ EXPECT_EQ(6, block0.firstIndex_);
+ EXPECT_EQ(2, block0.numReads_);
+ EXPECT_EQ(32669996, block0.virtualOffset_);
+
+ const IndexResultBlock& block1 = blocks.at(1);
+ EXPECT_EQ(13, block1.firstIndex_);
+ EXPECT_EQ(2, block1.numReads_);
+ EXPECT_EQ(1388851626, block1.virtualOffset_);
+
+ const IndexResultBlock& block2 = blocks.at(2);
+ EXPECT_EQ(19, block2.firstIndex_);
+ EXPECT_EQ(1, block2.numReads_);
+ EXPECT_EQ(1388881468, block2.virtualOffset_);
+}
diff --git a/tests/src/test_PolymeraseStitching.cpp b/tests/src/test_PolymeraseStitching.cpp
new file mode 100644
index 0000000..500f8c6
--- /dev/null
+++ b/tests/src/test_PolymeraseStitching.cpp
@@ -0,0 +1,352 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Armin Töpfer
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <iostream>
+#include <map>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "pbbam/virtual/VirtualPolymeraseReader.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/Frames.h"
+#include "TestData.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+void Compare(const BamRecord& b1, const BamRecord& b2)
+{
+ EXPECT_TRUE(b1.HasDeletionQV());
+ EXPECT_TRUE(b1.HasDeletionTag());
+ EXPECT_TRUE(b1.HasInsertionQV());
+ EXPECT_TRUE(b1.HasMergeQV());
+ EXPECT_TRUE(b1.HasSubstitutionQV());
+ EXPECT_TRUE(b1.HasSubstitutionTag());
+ EXPECT_TRUE(b1.HasLabelQV());
+ EXPECT_TRUE(b1.HasAltLabelQV());
+ EXPECT_TRUE(b1.HasAltLabelTag());
+ EXPECT_TRUE(b1.HasPkmean());
+ EXPECT_TRUE(b1.HasPkmid());
+ EXPECT_TRUE(b1.HasPulseCall());
+ EXPECT_TRUE(b1.HasIPD());
+ EXPECT_TRUE(b1.HasPulseWidth());
+ EXPECT_TRUE(b1.HasPrePulseFrames());
+ EXPECT_TRUE(b1.HasPulseCallWidth());
+ EXPECT_TRUE(b1.HasPulseMergeQV());
+
+ EXPECT_TRUE(b2.HasDeletionQV());
+ EXPECT_TRUE(b2.HasDeletionTag());
+ EXPECT_TRUE(b2.HasInsertionQV());
+ EXPECT_TRUE(b2.HasMergeQV());
+ EXPECT_TRUE(b2.HasSubstitutionQV());
+ EXPECT_TRUE(b2.HasSubstitutionTag());
+ EXPECT_TRUE(b2.HasLabelQV());
+ EXPECT_TRUE(b2.HasAltLabelQV());
+ EXPECT_TRUE(b2.HasAltLabelTag());
+ EXPECT_TRUE(b2.HasPkmean());
+ EXPECT_TRUE(b2.HasPkmid());
+ EXPECT_TRUE(b2.HasPulseCall());
+ EXPECT_TRUE(b2.HasIPD());
+ EXPECT_TRUE(b2.HasPulseWidth());
+ EXPECT_TRUE(b2.HasPrePulseFrames());
+ EXPECT_TRUE(b2.HasPulseCallWidth());
+ EXPECT_TRUE(b2.HasPulseMergeQV());
+
+ EXPECT_EQ(b1.FullName(), b2.FullName());
+ EXPECT_EQ(b1.HoleNumber(), b2.HoleNumber());
+ EXPECT_EQ(b1.NumPasses(), b2.NumPasses());
+ EXPECT_EQ(b1.Sequence(), b2.Sequence());
+ EXPECT_EQ(b1.Qualities(), b2.Qualities());
+ EXPECT_EQ(b1.DeletionQV(), b2.DeletionQV());
+ EXPECT_EQ(b1.DeletionTag(), b2.DeletionTag());
+ EXPECT_EQ(b1.InsertionQV(), b2.InsertionQV());
+ EXPECT_EQ(b1.MergeQV(), b2.MergeQV());
+ EXPECT_EQ(b1.SubstitutionQV(), b2.SubstitutionQV());
+ EXPECT_EQ(b1.SubstitutionTag(), b2.SubstitutionTag());
+ EXPECT_EQ(b1.LabelQV(), b2.LabelQV());
+ EXPECT_EQ(b1.AltLabelQV(), b2.AltLabelQV());
+ EXPECT_EQ(b1.AltLabelTag(), b2.AltLabelTag());
+ EXPECT_EQ(b1.Pkmean(), b2.Pkmean());
+ EXPECT_EQ(b1.Pkmid(), b2.Pkmid());
+ EXPECT_EQ(b1.PulseCall(), b2.PulseCall());
+ EXPECT_EQ(b1.IPD(), b2.IPD());
+ EXPECT_EQ(b1.PulseWidth(), b2.PulseWidth());
+ EXPECT_EQ(b1.PrePulseFrames(), b2.PrePulseFrames());
+ EXPECT_EQ(b1.PulseCallWidth(), b2.PulseCallWidth());
+ EXPECT_EQ(b1.ReadGroup(), b2.ReadGroup());
+ EXPECT_EQ(b1.PulseMergeQV(), b2.PulseMergeQV());
+}
+
+TEST(VirtualPolymeraseReader, InternalSubreadsToOriginal)
+{
+ // Create virtual polymerase read
+ VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/internal.subreads.bam",
+ tests::Data_Dir + "/polymerase/internal.scraps.bam");
+ EXPECT_TRUE(vpr.HasNext());
+ auto virtualRecord = vpr.Next();
+ EXPECT_FALSE(vpr.HasNext());
+
+ // Read original polymerase read
+ BamFile polyBam(tests::Data_Dir + "/polymerase/internal.polymerase.bam");
+ EntireFileQuery polyQuery(polyBam);
+
+ auto begin = polyQuery.begin();
+ auto end = polyQuery.begin();
+
+ EXPECT_TRUE(begin != end);
+ auto polyRecord = *begin++;
+ EXPECT_TRUE(begin == end);
+
+ Compare(polyRecord, virtualRecord);
+}
+
+TEST(VirtualPolymeraseReader, InternalHQToOriginal)
+{
+ // Create virtual polymerase read
+ VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/internal.hqregions.bam",
+ tests::Data_Dir + "/polymerase/internal.lqregions.bam");
+ EXPECT_TRUE(vpr.HasNext());
+ auto virtualRecord = vpr.Next();
+ EXPECT_FALSE(vpr.HasNext());
+
+ // Read original polymerase read
+ BamFile polyBam(tests::Data_Dir + "/polymerase/internal.polymerase.bam");
+ EntireFileQuery polyQuery(polyBam);
+
+ auto begin = polyQuery.begin();
+ auto end = polyQuery.begin();
+
+ EXPECT_TRUE(begin != end);
+ auto polyRecord = *begin++;
+ EXPECT_TRUE(begin == end);
+
+ Compare(polyRecord, virtualRecord);
+}
+
+TEST(VirtualPolymeraseReader, VirtualRegions)
+{
+ // Create virtual polymerase read
+ VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/internal.subreads.bam",
+ tests::Data_Dir + "/polymerase/internal.scraps.bam");
+ auto virtualRecord = vpr.Next();
+
+ auto regionMap = virtualRecord.VirtualRegionsMap();
+ auto adapter = virtualRecord.VirtualRegionsTable(VirtualRegionType::ADAPTER);
+
+ // Compare different accessors to same source
+ EXPECT_EQ(regionMap[VirtualRegionType::ADAPTER], adapter);
+
+ // Compare to truth
+ EXPECT_EQ(3047,adapter[0].beginPos);
+ EXPECT_EQ(3095,adapter[0].endPos);
+ EXPECT_EQ(3650,adapter[1].beginPos);
+ EXPECT_EQ(3700,adapter[1].endPos);
+ EXPECT_EQ(4289,adapter[2].beginPos);
+ EXPECT_EQ(4335,adapter[2].endPos);
+ EXPECT_EQ(4888,adapter[3].beginPos);
+ EXPECT_EQ(4939,adapter[3].endPos);
+ EXPECT_EQ(5498,adapter[4].beginPos);
+ EXPECT_EQ(5546,adapter[4].endPos);
+ EXPECT_EQ(6116,adapter[5].beginPos);
+ EXPECT_EQ(6173,adapter[5].endPos);
+ EXPECT_EQ(6740,adapter[6].beginPos);
+ EXPECT_EQ(6790,adapter[6].endPos);
+
+
+ auto barcode = virtualRecord.VirtualRegionsTable(VirtualRegionType::BARCODE);
+ EXPECT_EQ(regionMap[VirtualRegionType::BARCODE], barcode);
+
+ EXPECT_EQ(3025,barcode[0].beginPos);
+ EXPECT_EQ(3047,barcode[0].endPos);
+ EXPECT_EQ(3095,barcode[1].beginPos);
+ EXPECT_EQ(3116,barcode[1].endPos);
+ EXPECT_EQ(3628,barcode[2].beginPos);
+ EXPECT_EQ(3650,barcode[2].endPos);
+ EXPECT_EQ(3700,barcode[3].beginPos);
+ EXPECT_EQ(3722,barcode[3].endPos);
+ EXPECT_EQ(4267,barcode[4].beginPos);
+ EXPECT_EQ(4289,barcode[4].endPos);
+ EXPECT_EQ(4335,barcode[5].beginPos);
+ EXPECT_EQ(4356,barcode[5].endPos);
+ EXPECT_EQ(4864,barcode[6].beginPos);
+ EXPECT_EQ(4888,barcode[6].endPos);
+ EXPECT_EQ(4939,barcode[7].beginPos);
+ EXPECT_EQ(4960,barcode[7].endPos);
+ EXPECT_EQ(5477,barcode[8].beginPos);
+ EXPECT_EQ(5498,barcode[8].endPos);
+ EXPECT_EQ(5546,barcode[9].beginPos);
+ EXPECT_EQ(5571,barcode[9].endPos);
+ EXPECT_EQ(6087,barcode[10].beginPos);
+ EXPECT_EQ(6116,barcode[10].endPos);
+ EXPECT_EQ(6173,barcode[11].beginPos);
+ EXPECT_EQ(6199,barcode[11].endPos);
+ EXPECT_EQ(6719,barcode[12].beginPos);
+ EXPECT_EQ(6740,barcode[12].endPos);
+ EXPECT_EQ(6790,barcode[13].beginPos);
+ EXPECT_EQ(6812,barcode[13].endPos);
+
+
+ auto lqregion = virtualRecord.VirtualRegionsTable(VirtualRegionType::LQREGION);
+ EXPECT_EQ(regionMap[VirtualRegionType::LQREGION], lqregion);
+
+ EXPECT_EQ(0,lqregion[0].beginPos);
+ EXPECT_EQ(2659,lqregion[0].endPos);
+ EXPECT_EQ(7034,lqregion[1].beginPos);
+ EXPECT_EQ(7035,lqregion[1].endPos);
+
+
+ auto hqregion = virtualRecord.VirtualRegionsTable(VirtualRegionType::HQREGION);
+ EXPECT_EQ(regionMap[VirtualRegionType::HQREGION], hqregion);
+
+ EXPECT_EQ(2659,hqregion[0].beginPos);
+ EXPECT_EQ(7034,hqregion[0].endPos);
+}
+
+TEST(VirtualPolymeraseReader, ProductionSubreadsToOriginal)
+{
+ // Create virtual polymerase read
+ VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/production.subreads.bam",
+ tests::Data_Dir + "/polymerase/production.scraps.bam");
+ EXPECT_TRUE(vpr.HasNext());
+ auto virtualRecord = vpr.Next();
+ EXPECT_FALSE(vpr.HasNext());
+
+ // Read original polymerase read
+ BamFile polyBam(tests::Data_Dir + "/polymerase/production.polymerase.bam");
+ EntireFileQuery polyQuery(polyBam);
+
+ auto begin = polyQuery.begin();
+ auto end = polyQuery.begin();
+
+ EXPECT_TRUE(begin != end);
+ auto polyRecord = *begin++;
+ EXPECT_TRUE(begin == end);
+
+ EXPECT_EQ(polyRecord.FullName(), virtualRecord.FullName());
+ EXPECT_EQ(polyRecord.HoleNumber(), virtualRecord.HoleNumber());
+ EXPECT_EQ(polyRecord.ReadAccuracy(), virtualRecord.ReadAccuracy());
+ EXPECT_EQ(polyRecord.NumPasses(), virtualRecord.NumPasses());
+ EXPECT_EQ(polyRecord.Sequence(), virtualRecord.Sequence());
+ EXPECT_EQ(polyRecord.Qualities(), virtualRecord.Qualities());
+ EXPECT_EQ(polyRecord.DeletionQV(), virtualRecord.DeletionQV());
+ EXPECT_EQ(polyRecord.DeletionTag(), virtualRecord.DeletionTag());
+ EXPECT_EQ(polyRecord.InsertionQV(), virtualRecord.InsertionQV());
+ EXPECT_EQ(polyRecord.MergeQV(), virtualRecord.MergeQV());
+ EXPECT_EQ(polyRecord.SubstitutionQV(), virtualRecord.SubstitutionQV());
+ EXPECT_EQ(polyRecord.SubstitutionTag(), virtualRecord.SubstitutionTag());
+ EXPECT_EQ(polyRecord.IPD(), virtualRecord.IPDV1Frames());
+ EXPECT_EQ(polyRecord.ReadGroup(), virtualRecord.ReadGroup());
+}
+
+TEST(VirtualPolymeraseReader, ProductionHQToOriginal)
+{
+ // Create virtual polymerase read
+ VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/production_hq.hqregion.bam",
+ tests::Data_Dir + "/polymerase/production_hq.scraps.bam");
+ EXPECT_TRUE(vpr.HasNext());
+ auto virtualRecord = vpr.Next();
+ EXPECT_FALSE(vpr.HasNext());
+
+ // Read original polymerase read
+ BamFile polyBam(tests::Data_Dir + "/polymerase/production.polymerase.bam");
+ EntireFileQuery polyQuery(polyBam);
+
+ auto begin = polyQuery.begin();
+ auto end = polyQuery.begin();
+
+ EXPECT_TRUE(begin != end);
+ auto polyRecord = *begin++;
+ EXPECT_TRUE(begin == end);
+
+ EXPECT_FALSE(polyRecord.HasPulseCall());
+ EXPECT_FALSE(virtualRecord.HasPulseCall());
+ EXPECT_EQ(polyRecord.FullName(), virtualRecord.FullName());
+ EXPECT_EQ(polyRecord.HoleNumber(), virtualRecord.HoleNumber());
+ EXPECT_EQ(polyRecord.ReadAccuracy(), virtualRecord.ReadAccuracy());
+ EXPECT_EQ(polyRecord.NumPasses(), virtualRecord.NumPasses());
+ EXPECT_EQ(polyRecord.Sequence(), virtualRecord.Sequence());
+ EXPECT_EQ(polyRecord.Qualities(), virtualRecord.Qualities());
+ EXPECT_EQ(polyRecord.DeletionQV(), virtualRecord.DeletionQV());
+ EXPECT_EQ(polyRecord.DeletionTag(), virtualRecord.DeletionTag());
+ EXPECT_EQ(polyRecord.InsertionQV(), virtualRecord.InsertionQV());
+ EXPECT_EQ(polyRecord.MergeQV(), virtualRecord.MergeQV());
+ EXPECT_EQ(polyRecord.SubstitutionQV(), virtualRecord.SubstitutionQV());
+ EXPECT_EQ(polyRecord.SubstitutionTag(), virtualRecord.SubstitutionTag());
+ EXPECT_EQ(polyRecord.IPD(), virtualRecord.IPDV1Frames());
+ EXPECT_EQ(polyRecord.ReadGroup(), virtualRecord.ReadGroup());
+
+ EXPECT_TRUE(polyRecord.HasDeletionQV());
+ EXPECT_TRUE(polyRecord.HasDeletionTag());
+ EXPECT_TRUE(polyRecord.HasInsertionQV());
+ EXPECT_TRUE(polyRecord.HasMergeQV());
+ EXPECT_TRUE(polyRecord.HasSubstitutionQV());
+ EXPECT_TRUE(polyRecord.HasSubstitutionTag());
+ EXPECT_TRUE(polyRecord.HasIPD());
+ EXPECT_FALSE(polyRecord.HasLabelQV());
+ EXPECT_FALSE(polyRecord.HasAltLabelQV());
+ EXPECT_FALSE(polyRecord.HasAltLabelTag());
+ EXPECT_FALSE(polyRecord.HasPkmean());
+ EXPECT_FALSE(polyRecord.HasPkmid());
+ EXPECT_FALSE(polyRecord.HasPulseCall());
+ EXPECT_FALSE(polyRecord.HasPulseWidth());
+ EXPECT_FALSE(polyRecord.HasPrePulseFrames());
+ EXPECT_FALSE(polyRecord.HasPulseCallWidth());
+
+ EXPECT_TRUE(virtualRecord.HasDeletionQV());
+ EXPECT_TRUE(virtualRecord.HasDeletionTag());
+ EXPECT_TRUE(virtualRecord.HasInsertionQV());
+ EXPECT_TRUE(virtualRecord.HasMergeQV());
+ EXPECT_TRUE(virtualRecord.HasSubstitutionQV());
+ EXPECT_TRUE(virtualRecord.HasSubstitutionTag());
+ EXPECT_TRUE(virtualRecord.HasIPD());
+ EXPECT_FALSE(virtualRecord.HasLabelQV());
+ EXPECT_FALSE(virtualRecord.HasAltLabelQV());
+ EXPECT_FALSE(virtualRecord.HasAltLabelTag());
+ EXPECT_FALSE(virtualRecord.HasPkmean());
+ EXPECT_FALSE(virtualRecord.HasPkmid());
+ EXPECT_FALSE(virtualRecord.HasPulseCall());
+ EXPECT_FALSE(virtualRecord.HasPulseWidth());
+ EXPECT_FALSE(virtualRecord.HasPrePulseFrames());
+ EXPECT_FALSE(virtualRecord.HasPulseCallWidth());
+}
diff --git a/tests/src/test_QualityValues.cpp b/tests/src/test_QualityValues.cpp
new file mode 100644
index 0000000..98795a3
--- /dev/null
+++ b/tests/src/test_QualityValues.cpp
@@ -0,0 +1,120 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/QualityValues.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(QualityValueTest, DefaultsOk)
+{
+ const QualityValue value;
+ EXPECT_EQ(0, value);
+ EXPECT_EQ('!', value.Fastq());
+}
+
+TEST(QualityValueTest, FromNumber)
+{
+ const QualityValue zero(0);
+ const QualityValue thirtyThree(33);
+ const QualityValue valid(42);
+ const QualityValue max(93);
+ const QualityValue tooHigh(94);
+ const QualityValue wayTooHigh(INT8_MAX);
+
+ EXPECT_EQ(0, zero);
+ EXPECT_EQ(33, thirtyThree);
+ EXPECT_EQ(42, valid);
+ EXPECT_EQ(93, max);
+ EXPECT_EQ(93, tooHigh);
+ EXPECT_EQ(93, wayTooHigh);
+
+ EXPECT_EQ('!', zero.Fastq());
+ EXPECT_EQ('B', thirtyThree.Fastq());
+ EXPECT_EQ('K', valid.Fastq());
+ EXPECT_EQ('~', max.Fastq());
+ EXPECT_EQ('~', tooHigh.Fastq());
+ EXPECT_EQ('~', wayTooHigh.Fastq());
+}
+
+TEST(QualityValueTest, FromFastq)
+{
+ const QualityValue zero = QualityValue::FromFastq('!');
+ const QualityValue thirtyThree = QualityValue::FromFastq('B');
+ const QualityValue valid = QualityValue::FromFastq('K');
+ const QualityValue max = QualityValue::FromFastq('~');
+
+ EXPECT_EQ(0, zero);
+ EXPECT_EQ(33, thirtyThree);
+ EXPECT_EQ(42, valid);
+ EXPECT_EQ(93, max);
+}
+
+TEST(QualityValuesTest, Default)
+{
+ const QualityValues qvs;
+ EXPECT_TRUE(qvs.empty());
+ EXPECT_EQ(string(), qvs.Fastq());
+}
+
+TEST(QualityValuesTest, FromNumbers)
+{
+ const string fastqString = "~~~KKBB!!";
+ const vector<uint8_t> values = { 93, 93, 93, 42, 42, 33, 33, 0, 0 };
+
+ QualityValues qvs;
+ for (auto qv : values)
+ qvs.push_back(qv);
+ EXPECT_EQ(fastqString, qvs.Fastq());
+}
+
+TEST(QualityValuesTest, FromFastq)
+{
+ const string fastqString = "~~~KKBB!!";
+ const vector<uint8_t> values = { 93, 93, 93, 42, 42, 33, 33, 0, 0 };
+
+ const QualityValues& qvs = QualityValues::FromFastq(fastqString);
+ EXPECT_EQ(fastqString.size(), qvs.size());
+ EXPECT_EQ(values.size(), qvs.size());
+ for (size_t i = 0; i < fastqString.size(); ++i)
+ EXPECT_EQ(values.at(i), qvs.at(i));
+}
diff --git a/tests/src/test_ReadGroupInfo.cpp b/tests/src/test_ReadGroupInfo.cpp
new file mode 100644
index 0000000..db30fa2
--- /dev/null
+++ b/tests/src/test_ReadGroupInfo.cpp
@@ -0,0 +1,61 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett, Lance Hepler
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/ReadGroupInfo.h>
+using namespace PacBio::BAM;
+
+
+TEST(ReadGroupInfoTest, IdFromMovieNameAndReadType)
+{
+ ReadGroupInfo rg("m140905_042212_sidney_c100564852550000001823085912221377_s1_X0", "HQREGION");
+ EXPECT_EQ("00082ba1", rg.Id());
+}
+
+TEST(ReadGroupInfoTest, FrameCodecSetOk)
+{
+ ReadGroupInfo rg("test");
+ rg.IpdCodec(FrameCodec::V1);
+ EXPECT_TRUE(rg.HasBaseFeature(BaseFeature::IPD));
+ EXPECT_EQ("ip", rg.BaseFeatureTag(BaseFeature::IPD));
+ EXPECT_EQ(FrameCodec::V1, rg.IpdCodec());
+}
+
diff --git a/tests/src/test_SequenceUtils.cpp b/tests/src/test_SequenceUtils.cpp
new file mode 100644
index 0000000..a089579
--- /dev/null
+++ b/tests/src/test_SequenceUtils.cpp
@@ -0,0 +1,141 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/../../src/SequenceUtils.h>
+#include <pbbam/../../src/StringUtils.h>
+#include <string>
+#include <vector>
+
+#include <climits>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+TEST(StringUtilsTest, BasicSplit)
+{
+ const string test = "foo\tbar\tbaz";
+ const vector<string> tokens = internal::Split(test, '\t');
+ EXPECT_EQ(3, tokens.size());
+ EXPECT_TRUE(tokens.at(0) == "foo");
+ EXPECT_TRUE(tokens.at(1) == "bar");
+ EXPECT_TRUE(tokens.at(2) == "baz");
+}
+
+TEST(StringUtilsTest, SplitKeepsEmptyTokens)
+{
+ const string test = "foo\tbar\t\tbaz";
+ const vector<string> tokens = internal::Split(test, '\t');
+ EXPECT_EQ(4, tokens.size());
+ EXPECT_TRUE(tokens.at(0) == "foo");
+ EXPECT_TRUE(tokens.at(1) == "bar");
+ EXPECT_TRUE(tokens.at(2) == "");
+ EXPECT_TRUE(tokens.at(3) == "baz");
+}
+
+TEST(SequenceUtilsTest, ComplementChar)
+{
+ // complement
+ const char A = 'A'; // T
+ const char B = 'B'; // V
+ const char C = 'C'; // G
+ const char D = 'D'; // H
+ const char E = 'E'; // null
+ const char F = 'F'; // null
+ const char G = 'G'; // C
+ const char H = 'H'; // D
+ const char I = 'I'; // null
+ const char J = 'J'; // null
+ const char K = 'K'; // M
+ const char L = 'L'; // null
+ const char M = 'M'; // K
+ const char N = 'N'; // N
+ const char O = 'O'; // null
+ const char P = 'P'; // null
+ const char Q = 'Q'; // null
+ const char R = 'R'; // Y
+ const char S = 'S'; // S
+ const char T = 'T'; // A
+ const char U = 'U'; // A
+ const char V = 'V'; // B
+ const char W = 'W'; // W
+ const char X = 'X'; // null
+ const char Y = 'Y'; // R
+ const char Z = 'Z'; // null
+
+ EXPECT_EQ(T, Complement(A));
+ EXPECT_EQ(V, Complement(B));
+ EXPECT_EQ(G, Complement(C));
+ EXPECT_EQ(H, Complement(D));
+ EXPECT_EQ(0, Complement(E));
+ EXPECT_EQ(0, Complement(F));
+ EXPECT_EQ(C, Complement(G));
+ EXPECT_EQ(D, Complement(H));
+ EXPECT_EQ(0, Complement(I));
+ EXPECT_EQ(0, Complement(J));
+ EXPECT_EQ(M, Complement(K));
+ EXPECT_EQ(0, Complement(L));
+ EXPECT_EQ(K, Complement(M));
+ EXPECT_EQ(N, Complement(N));
+ EXPECT_EQ(0, Complement(O));
+ EXPECT_EQ(0, Complement(P));
+ EXPECT_EQ(0, Complement(Q));
+ EXPECT_EQ(Y, Complement(R));
+ EXPECT_EQ(S, Complement(S));
+ EXPECT_EQ(A, Complement(T));
+ EXPECT_EQ(A, Complement(U));
+ EXPECT_EQ(B, Complement(V));
+ EXPECT_EQ(W, Complement(W));
+ EXPECT_EQ(0, Complement(X));
+ EXPECT_EQ(R, Complement(Y));
+ EXPECT_EQ(0, Complement(Z));
+}
+
+TEST(SequenceUtilsTest, ReverseComplement)
+{
+ string input1 = "ATATATCCCGGCG";
+ const string rc1 = "CGCCGGGATATAT";
+
+ ReverseComplement(input1);
+ EXPECT_EQ(rc1, input1);
+}
diff --git a/tests/src/test_Tags.cpp b/tests/src/test_Tags.cpp
new file mode 100644
index 0000000..2ed7aa0
--- /dev/null
+++ b/tests/src/test_Tags.cpp
@@ -0,0 +1,992 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <gtest/gtest.h>
+#include <pbbam/BamTagCodec.h>
+#include <pbbam/TagCollection.h>
+#include <pbbam/SamTagCodec.h>
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(TagTest, TagConstruction)
+{
+ int8_t i8 = 0;
+ uint8_t u8 = 0;
+ int16_t i16 = 0;
+ uint16_t u16 = 0;
+ int32_t i32 = 0;
+ uint32_t u32 = 0;
+ float f = 0.0;
+ string str = "";
+ vector<int8_t> i8_array;
+ vector<uint8_t> u8_array;
+ vector<int16_t> i16_array;
+ vector<uint16_t> u16_array;
+ vector<int32_t> i32_array;
+ vector<uint32_t> u32_Array;
+ vector<float> float_array;
+
+ Tag i8Tag(i8);
+ Tag u8Tag(u8);
+ Tag i16Tag(i16);
+ Tag u16Tag(u16);
+ Tag i32Tag(i32);
+ Tag u32Tag(u32);
+ Tag floatTag(f);
+ Tag stringTag(str);
+ Tag i8_array_Tag(i8_array);
+ Tag u8_array_Tag(u8_array);
+ Tag i16_array_Tag(i16_array);
+ Tag u16_array_Tag(u16_array);
+ Tag i32_array_Tag(i32_array);
+ Tag u32_array_Tag(u32_Array);
+ Tag float_array_Tag(float_array);
+
+ EXPECT_TRUE(i8Tag.Type() == TagDataType::INT8);
+ EXPECT_TRUE(u8Tag.Type() == TagDataType::UINT8);
+ EXPECT_TRUE(i16Tag.Type() == TagDataType::INT16);
+ EXPECT_TRUE(u16Tag.Type() == TagDataType::UINT16);
+ EXPECT_TRUE(i32Tag.Type() == TagDataType::INT32);
+ EXPECT_TRUE(u32Tag.Type() == TagDataType::UINT32);
+ EXPECT_TRUE(floatTag.Type() == TagDataType::FLOAT);
+ EXPECT_TRUE(stringTag.Type() == TagDataType::STRING);
+ EXPECT_TRUE(i8_array_Tag.Type() == TagDataType::INT8_ARRAY);
+ EXPECT_TRUE(u8_array_Tag.Type() == TagDataType::UINT8_ARRAY);
+ EXPECT_TRUE(i16_array_Tag.Type() == TagDataType::INT16_ARRAY);
+ EXPECT_TRUE(u16_array_Tag.Type() == TagDataType::UINT16_ARRAY);
+ EXPECT_TRUE(i32_array_Tag.Type() == TagDataType::INT32_ARRAY);
+ EXPECT_TRUE(u32_array_Tag.Type() == TagDataType::UINT32_ARRAY);
+ EXPECT_TRUE(float_array_Tag.Type() == TagDataType::FLOAT_ARRAY);
+}
+
+TEST(TagTest, CopyAndCompare)
+{
+ int8_t i8 = 0;
+ uint8_t u8 = 0;
+ int16_t i16 = 0;
+ uint16_t u16 = 0;
+ int32_t i32 = 0;
+ uint32_t u32 = 0;
+ float f = 0.0;
+ string str = "";
+ vector<int8_t> i8_array;
+ vector<uint8_t> u8_array;
+ vector<int16_t> i16_array;
+ vector<uint16_t> u16_array;
+ vector<int32_t> i32_array;
+ vector<uint32_t> u32_Array;
+ vector<float> float_array;
+
+ Tag i8Tag(i8);
+ Tag u8Tag(u8);
+ Tag i16Tag(i16);
+ Tag u16Tag(u16);
+ Tag i32Tag(i32);
+ Tag u32Tag(u32);
+ Tag floatTag(f);
+ Tag stringTag(str);
+ Tag i8_array_Tag(i8_array);
+ Tag u8_array_Tag(u8_array);
+ Tag i16_array_Tag(i16_array);
+ Tag u16_array_Tag(u16_array);
+ Tag i32_array_Tag(i32_array);
+ Tag u32_array_Tag(u32_Array);
+ Tag float_array_Tag(float_array);
+
+ Tag i8Tag2 = i8Tag;
+ Tag u8Tag2 = u8Tag;
+ Tag i16Tag2 = i16Tag;
+ Tag u16Tag2 = u16Tag;
+ Tag i32Tag2 = i32Tag;
+ Tag u32Tag2 = u32Tag;
+ Tag floatTag2 = floatTag;
+ Tag stringTag2 = stringTag;
+ Tag i8_array_Tag2 = i8_array_Tag;
+ Tag u8_array_Tag2 = u8_array_Tag;
+ Tag i16_array_Tag2 = i16_array_Tag;
+ Tag u16_array_Tag2 = u16_array_Tag;
+ Tag i32_array_Tag2 = i32_array_Tag;
+ Tag u32_array_Tag2 = u32_array_Tag;
+ Tag float_array_Tag2 = float_array_Tag;
+
+ EXPECT_EQ(i8Tag, i8Tag2);
+ EXPECT_EQ(u8Tag, u8Tag2);
+ EXPECT_EQ(i16Tag, i16Tag2);
+ EXPECT_EQ(u16Tag, u16Tag2);
+ EXPECT_EQ(i32Tag, i32Tag2);
+ EXPECT_EQ(u32Tag, u32Tag2);
+ EXPECT_EQ(floatTag, floatTag2);
+ EXPECT_EQ(stringTag, stringTag2);
+ EXPECT_EQ(i8_array_Tag, i8_array_Tag2);
+ EXPECT_EQ(u8_array_Tag, u8_array_Tag2);
+ EXPECT_EQ(i16_array_Tag, i16_array_Tag2);
+ EXPECT_EQ(u16_array_Tag, u16_array_Tag2);
+ EXPECT_EQ(i32_array_Tag, i32_array_Tag2);
+ EXPECT_EQ(u32_array_Tag, u32_array_Tag2);
+ EXPECT_EQ(float_array_Tag, float_array_Tag2);
+}
+
+TEST(TagTest, Type_None)
+{
+ Tag tag;
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INVALID);
+ EXPECT_TRUE(tag.IsNull());
+ EXPECT_TRUE(tag.Typename() == "none");
+
+ EXPECT_FALSE(tag.IsNumeric());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+}
+
+TEST(TagTest, Type_Int8)
+{
+ const int8_t v = -42;
+ const Tag tag(v);
+
+ int8_t v2;
+ EXPECT_NO_THROW(v2 = tag.ToInt8());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INT8);
+ EXPECT_TRUE(tag.Typename() == "int8_t");
+ EXPECT_TRUE(tag.IsInt8());
+
+ EXPECT_TRUE(tag.IsSignedInt());
+ EXPECT_TRUE(tag.IsIntegral());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsUnsignedInt());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt8)
+{
+ const uint8_t v = 42;
+ const Tag tag(v);
+
+ uint8_t v2;
+ EXPECT_NO_THROW(v2 = tag.ToUInt8());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::UINT8);
+ EXPECT_TRUE(tag.Typename() == "uint8_t");
+ EXPECT_TRUE(tag.IsUInt8());
+
+ EXPECT_TRUE(tag.IsUnsignedInt());
+ EXPECT_TRUE(tag.IsIntegral());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsSignedInt());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Ascii)
+{
+ Tag pureAscii = Tag('$');
+ pureAscii.Modifier(TagModifier::ASCII_CHAR);
+
+ const uint8_t u8 = 65;
+ const int8_t i8 = 66;
+
+ Tag fromUint8 = Tag(u8);
+ fromUint8.Modifier(TagModifier::ASCII_CHAR);
+ Tag fromInt8 = Tag(i8);
+ fromInt8.Modifier(TagModifier::ASCII_CHAR);
+
+ EXPECT_TRUE(pureAscii.HasModifier(TagModifier::ASCII_CHAR));
+ EXPECT_TRUE(pureAscii.IsIntegral());
+ EXPECT_TRUE(pureAscii.IsNumeric());
+ EXPECT_EQ('$', pureAscii.ToAscii());
+
+ EXPECT_TRUE(fromUint8.HasModifier(TagModifier::ASCII_CHAR));
+ EXPECT_TRUE(fromUint8.IsIntegral());
+ EXPECT_TRUE(fromUint8.IsNumeric());
+ EXPECT_EQ('A', fromUint8.ToAscii());
+
+ EXPECT_TRUE(fromInt8.HasModifier(TagModifier::ASCII_CHAR));
+ EXPECT_TRUE(fromInt8.IsIntegral());
+ EXPECT_TRUE(fromInt8.IsNumeric());
+ EXPECT_EQ('B', fromInt8.ToAscii());
+}
+
+TEST(TagTest, Type_Int16)
+{
+ const int16_t v = -42;
+ const Tag tag(v);
+
+ int16_t v2;
+ EXPECT_NO_THROW(v2 = tag.ToInt16());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INT16);
+ EXPECT_TRUE(tag.Typename() == "int16_t");
+ EXPECT_TRUE(tag.IsInt16());
+ EXPECT_TRUE(tag.IsSignedInt());
+ EXPECT_TRUE(tag.IsIntegral());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsUnsignedInt());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt16)
+{
+ const uint16_t v = 42;
+ const Tag tag(v);
+
+ uint16_t v2;
+ EXPECT_NO_THROW(v2 = tag.ToUInt16());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::UINT16);
+ EXPECT_TRUE(tag.Typename() == "uint16_t");
+ EXPECT_TRUE(tag.IsUInt16());
+ EXPECT_TRUE(tag.IsUnsignedInt());
+ EXPECT_TRUE(tag.IsIntegral());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsSignedInt());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Int32)
+{
+ const int32_t v = -42;
+ const Tag tag(v);
+
+ int32_t v2;
+ EXPECT_NO_THROW(v2 = tag.ToInt32());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INT32);
+ EXPECT_TRUE(tag.Typename() == "int32_t");
+ EXPECT_TRUE(tag.IsInt32());
+ EXPECT_TRUE(tag.IsSignedInt());
+ EXPECT_TRUE(tag.IsIntegral());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsUnsignedInt());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt32)
+{
+ const uint32_t v = 42;
+ const Tag tag(v);
+
+ uint32_t v2;
+ EXPECT_NO_THROW(v2 = tag.ToUInt32());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::UINT32);
+ EXPECT_TRUE(tag.Typename() == "uint32_t");
+ EXPECT_TRUE(tag.IsUInt32());
+ EXPECT_TRUE(tag.IsUnsignedInt());
+ EXPECT_TRUE(tag.IsIntegral());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsSignedInt());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Float)
+{
+ const float v = 3.141;
+ const Tag tag(v);
+
+ float v2;
+ EXPECT_NO_THROW(v2 = tag.ToFloat());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::FLOAT);
+ EXPECT_TRUE(tag.Typename() == "float");
+ EXPECT_TRUE(tag.IsFloat());
+ EXPECT_TRUE(tag.IsNumeric());
+
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsIntegral());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_String)
+{
+ const string v = "foo_who";
+ const Tag tag(v);
+
+ string v2;
+ EXPECT_NO_THROW(v2 = tag.ToString());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::STRING);
+ EXPECT_TRUE(tag.Typename() == "string");
+ EXPECT_TRUE(tag.IsString());
+
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+ EXPECT_FALSE(tag.IsArray());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Int8Array)
+{
+ const vector<int8_t> v = { -42, 100, 0 };
+ const Tag tag(v);
+
+ vector<int8_t> v2;
+ EXPECT_NO_THROW(v2 = tag.ToInt8Array());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INT8_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<int8_t>");
+ EXPECT_TRUE(tag.IsInt8Array());
+ EXPECT_TRUE(tag.IsSignedArray());
+ EXPECT_TRUE(tag.IsIntegralArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt8Array)
+{
+ const vector<uint8_t> v = { 42, 200, 0 };
+ const Tag tag(v);
+
+ vector<uint8_t> v2;
+ EXPECT_NO_THROW(v2 = tag.ToUInt8Array());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::UINT8_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<uint8_t>");
+ EXPECT_TRUE(tag.IsUInt8Array());
+ EXPECT_TRUE(tag.IsUnsignedArray());
+ EXPECT_TRUE(tag.IsIntegralArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Int16Array)
+{
+ const vector<int16_t> v = { 42, -300, 0 };
+ const Tag tag(v);
+
+ vector<int16_t> v2;
+ EXPECT_NO_THROW(v2 = tag.ToInt16Array());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INT16_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<int16_t>");
+ EXPECT_TRUE(tag.IsInt16Array());
+ EXPECT_TRUE(tag.IsSignedArray());
+ EXPECT_TRUE(tag.IsIntegralArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt16Array)
+{
+ const vector<uint16_t> v = { 42, 300, 0 };
+ const Tag tag(v);
+
+ vector<uint16_t> v2;
+ EXPECT_NO_THROW(v2 = tag.ToUInt16Array());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::UINT16_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<uint16_t>");
+ EXPECT_TRUE(tag.IsUInt16Array());
+ EXPECT_TRUE(tag.IsUnsignedArray());
+ EXPECT_TRUE(tag.IsIntegralArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);;
+}
+
+TEST(TagTest, Type_Int32Array)
+{
+ const vector<int32_t> v = { 42, -300, 0 };
+ const Tag tag(v);
+
+ vector<int32_t> v2;
+ EXPECT_NO_THROW(v2 = tag.ToInt32Array());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::INT32_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<int32_t>");
+ EXPECT_TRUE(tag.IsInt32Array());
+ EXPECT_TRUE(tag.IsSignedArray());
+ EXPECT_TRUE(tag.IsIntegralArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt32Array)
+{
+ const vector<uint32_t> v = { 42, 300, 0 };
+ const Tag tag(v);
+
+ vector<uint32_t> v2;
+ EXPECT_NO_THROW(v2 = tag.ToUInt32Array());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::UINT32_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<uint32_t>");
+ EXPECT_TRUE(tag.IsUInt32Array());
+ EXPECT_TRUE(tag.IsUnsignedArray());
+ EXPECT_TRUE(tag.IsIntegralArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_FloatArray)
+{
+ const vector<float> v = { 1.1f, 1.2f, 1.3f };
+ const Tag tag(v);
+
+ vector<float> v2;
+ EXPECT_NO_THROW(v2 = tag.ToFloatArray());
+
+ EXPECT_TRUE(tag.Type() == TagDataType::FLOAT_ARRAY);
+ EXPECT_TRUE(tag.Typename() == "vector<float>");
+ EXPECT_TRUE(tag.IsFloatArray());
+ EXPECT_TRUE(tag.IsArray());
+
+ EXPECT_FALSE(tag.IsIntegralArray());
+ EXPECT_FALSE(tag.IsFloat());
+ EXPECT_FALSE(tag.IsString());
+ EXPECT_FALSE(tag.IsNull());
+ EXPECT_FALSE(tag.IsNumeric());
+
+ EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, CastBackToOriginalOk)
+{
+ int8_t i8 = 0;
+ uint8_t u8 = 0;
+ int16_t i16 = 0;
+ uint16_t u16 = 0;
+ int32_t i32 = 0;
+ uint32_t u32 = 0;
+ float f = 0.0;
+ string str = "";
+ vector<int8_t> i8_array;
+ vector<uint8_t> u8_array;
+ vector<int16_t> i16_array;
+ vector<uint16_t> u16_array;
+ vector<int32_t> i32_array;
+ vector<uint32_t> u32_array;
+ vector<float> float_array;
+
+ Tag i8Tag(i8);
+ Tag u8Tag(u8);
+ Tag i16Tag(i16);
+ Tag u16Tag(u16);
+ Tag i32Tag(i32);
+ Tag u32Tag(u32);
+ Tag floatTag(f);
+ Tag stringTag(str);
+ Tag i8_array_Tag(i8_array);
+ Tag u8_array_Tag(u8_array);
+ Tag i16_array_Tag(i16_array);
+ Tag u16_array_Tag(u16_array);
+ Tag i32_array_Tag(i32_array);
+ Tag u32_array_Tag(u32_array);
+ Tag float_array_Tag(float_array);
+
+ EXPECT_NO_THROW({
+ i8 = i8Tag.ToInt8();
+ u8 = u8Tag.ToUInt8();
+ i16 = i16Tag.ToInt16();
+ u16 = u16Tag.ToUInt16();
+ i32 = i32Tag.ToInt32();
+ u32 = u32Tag.ToUInt32();
+ f = floatTag.ToFloat();
+ str = stringTag.ToString();
+ i8_array = i8_array_Tag.ToInt8Array();
+ u8_array = u8_array_Tag.ToUInt8Array();
+ i16_array = i16_array_Tag.ToInt16Array();
+ u16_array = u16_array_Tag.ToUInt16Array();
+ i32_array = i32_array_Tag.ToInt32Array();
+ u32_array = u32_array_Tag.ToUInt32Array();
+ float_array = float_array_Tag.ToFloatArray();
+ });
+}
+
+TEST(TagTest, ConvertToInt8)
+{
+ Tag zero(int32_t(0));
+ Tag min(int32_t(INT8_MIN));
+ Tag normal(int32_t(42));
+ Tag max(int32_t(INT8_MAX));
+ Tag underflow(int32_t(INT8_MIN-1));
+ Tag overflow(int32_t(INT8_MAX+1));
+ Tag floatTag(float(3.14));
+ Tag stringTag(string("foo"));
+ Tag arrayTag(vector<int8_t>({1, 2, 3}));
+
+ // allowed
+ EXPECT_NO_THROW(
+ {
+ zero.ToInt8();
+ min.ToInt8();
+ normal.ToInt8();
+ max.ToInt8();
+ });
+
+ // not allowed
+ EXPECT_THROW(underflow.ToInt8(), std::exception);
+ EXPECT_THROW(overflow.ToInt8(), std::exception);
+ EXPECT_THROW(floatTag.ToInt8(), std::exception);
+ EXPECT_THROW(stringTag.ToInt8(), std::exception);
+ EXPECT_THROW(arrayTag.ToInt8(), std::exception);
+}
+
+TEST(TagTest, ConvertToUInt8)
+{
+ Tag zero(int32_t(0));
+ Tag neg(int32_t(-1));
+ Tag normal(int32_t(42));
+ Tag max(int32_t(UINT8_MAX));
+ Tag overflow(int32_t(UINT8_MAX+1));
+ Tag floatTag(float(3.14));
+ Tag stringTag(string("foo"));
+ Tag arrayTag(vector<uint8_t>({1, 2, 3}));
+
+ // allowed
+ EXPECT_NO_THROW(
+ {
+ zero.ToUInt8();
+ normal.ToUInt8();
+ max.ToUInt8();
+ });
+
+ // not allowed
+ EXPECT_THROW(neg.ToUInt8(), std::exception);
+ EXPECT_THROW(overflow.ToUInt8(), std::exception);
+ EXPECT_THROW(floatTag.ToUInt8(), std::exception);
+ EXPECT_THROW(stringTag.ToUInt8(), std::exception);
+ EXPECT_THROW(arrayTag.ToUInt8(), std::exception);
+}
+
+TEST(TagTest, ConvertToInt16)
+{
+ Tag zero(int32_t(0));
+ Tag min(int32_t(INT16_MIN));
+ Tag normal(int32_t(42));
+ Tag max(int32_t(INT16_MAX));
+ Tag underflow(int32_t(INT16_MIN-1));
+ Tag overflow(int32_t(INT16_MAX+1));
+ Tag floatTag(float(3.14));
+ Tag stringTag(string("foo"));
+ Tag arrayTag(vector<int16_t>({1, 2, 3}));
+
+ // allowed
+ EXPECT_NO_THROW(
+ {
+ zero.ToInt16();
+ min.ToInt16();
+ normal.ToInt16();
+ max.ToInt16();
+ });
+
+ // not allowed
+ EXPECT_THROW(underflow.ToInt16(), std::exception);
+ EXPECT_THROW(overflow.ToInt16(), std::exception);
+ EXPECT_THROW(floatTag.ToInt16(), std::exception);
+ EXPECT_THROW(stringTag.ToInt16(), std::exception);
+ EXPECT_THROW(arrayTag.ToInt16(), std::exception);
+}
+
+TEST(TagTest, ConvertToUInt16)
+{
+ Tag zero(int32_t(0));
+ Tag neg(int32_t(-1));
+ Tag normal(int32_t(42));
+ Tag max(int32_t(UINT16_MAX));
+ Tag overflow(int32_t(UINT16_MAX+1));
+ Tag floatTag(float(3.14));
+ Tag stringTag(string("foo"));
+ Tag arrayTag(vector<uint16_t>({1, 2, 3}));
+
+ // allowed
+ EXPECT_NO_THROW(
+ {
+ zero.ToUInt16();
+ normal.ToUInt16();
+ max.ToUInt16();
+ });
+
+ // not allowed
+ EXPECT_THROW(neg.ToUInt16(), std::exception);
+ EXPECT_THROW(overflow.ToUInt16(), std::exception);
+ EXPECT_THROW(floatTag.ToUInt16(), std::exception);
+ EXPECT_THROW(stringTag.ToUInt16(), std::exception);
+ EXPECT_THROW(arrayTag.ToUInt16(), std::exception);
+}
+
+TEST(TagTest, ConvertToInt32)
+{
+ Tag zero(int32_t(0));
+ Tag min(int32_t(INT32_MIN));
+ Tag normal(int32_t(42));
+ Tag max(int32_t(INT32_MAX));
+ Tag floatTag(float(3.14));
+ Tag stringTag(string("foo"));
+ Tag arrayTag(vector<int32_t>({1, 2, 3}));
+
+ // no 64-bit ctors - will not compile
+ //
+ // Tag underflow(int64_t(INT32_MIN-1));
+ // Tag overflow(int64_t(INT32_MAX+1));
+
+ // allowed
+ EXPECT_NO_THROW(
+ {
+ zero.ToInt32();
+ min.ToInt32();
+ normal.ToInt32();
+ max.ToInt32();
+ });
+
+ // not allowed
+ EXPECT_THROW(floatTag.ToInt32(), std::exception);
+ EXPECT_THROW(stringTag.ToInt32(), std::exception);
+ EXPECT_THROW(arrayTag.ToInt32(), std::exception);
+}
+
+TEST(TagTest, ConvertToUInt32)
+{
+ Tag zero(int32_t(0));
+ Tag neg(int32_t(-1));
+ Tag normal(int32_t(42));
+ Tag max(uint32_t(UINT32_MAX));
+ Tag floatTag(float(3.14));
+ Tag stringTag(string("foo"));
+ Tag arrayTag(vector<uint32_t>({1, 2, 3}));
+
+ // no 64-bit ctors - will not compile
+ //
+ // Tag overflow(int64_t(UINT32_MAX+1));
+
+ // allowed
+ EXPECT_NO_THROW(
+ {
+ zero.ToUInt32();
+ normal.ToUInt32();
+ max.ToUInt32();
+ });
+
+ // not allowed
+ EXPECT_THROW(neg.ToUInt32(), std::exception);
+ EXPECT_THROW(floatTag.ToUInt32(), std::exception);
+ EXPECT_THROW(stringTag.ToUInt32(), std::exception);
+ EXPECT_THROW(arrayTag.ToUInt32(), std::exception);
+}
+
+TEST(TagCollectionTest, DefaultConstruction)
+{
+ TagCollection tags;
+ EXPECT_TRUE(tags.empty());
+ EXPECT_FALSE(tags.Contains("XY"));
+}
+
+TEST(TagCollectionTest, AddSimpleTags)
+{
+ const int32_t intValue = -42;
+ const string strValue = "foo";
+ const string hexStrValue = "1abc75";
+
+ TagCollection tags;
+ tags["ST"] = strValue;
+ tags["XY"] = intValue;
+ tags["HX"] = hexStrValue;
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+
+ EXPECT_EQ(3, tags.size());
+ EXPECT_TRUE(tags.Contains("XY"));
+ EXPECT_TRUE(tags.Contains("ST"));
+ EXPECT_TRUE(tags.Contains("HX"));
+ EXPECT_FALSE(tags.Contains("ZZ"));
+
+ EXPECT_TRUE( tags["XY"].ToInt32() == intValue );
+ EXPECT_TRUE( tags["ST"].ToString() == strValue );
+ EXPECT_TRUE( tags["HX"].ToString() == hexStrValue );
+ EXPECT_TRUE( tags["HX"].HasModifier(TagModifier::HEX_STRING) );
+}
+
+TEST(SamTagCodecTest, DecodeTest)
+{
+ string tagString;
+ tagString.append("HX:H:1abc75");
+ tagString.append("\t");
+ tagString.append("ST:Z:foo");
+ tagString.append("\t");
+ tagString.append("VC:B:i,42,-100,37,2048");
+ tagString.append("\t");
+ tagString.append("XY:i:-42");
+
+ TagCollection expected;
+ expected["ST"] = string("foo");
+ expected["XY"] = int32_t(-42);
+ expected["HX"] = string("1abc75");
+ expected["HX"].Modifier(TagModifier::HEX_STRING);
+ expected["VC"] = vector<int32_t>( { 42, -100, 37, 2048 } );
+
+ TagCollection tags = SamTagCodec::Decode(tagString);
+
+ EXPECT_TRUE(tags.Contains("ST"));
+ EXPECT_TRUE(tags.Contains("HX"));
+ EXPECT_TRUE(tags.Contains("XY"));
+ EXPECT_TRUE(tags.Contains("VC"));
+
+ EXPECT_EQ(string("foo"), tags["ST"].ToString());
+ EXPECT_TRUE(tags["HX"].HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), tags["HX"].ToString());
+ EXPECT_EQ((int8_t)-42, tags["XY"].ToInt8());
+ EXPECT_EQ(vector<int32_t>( { 42, -100, 37, 2048 } ), tags["VC"].ToInt32Array());
+}
+
+TEST(SamTagCodecTest, EncodeTest)
+{
+ TagCollection tags;
+ tags["ST"] = string("foo");
+ tags["XY"] = int32_t(-42);
+ tags["HX"] = string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["VC"] = vector<int32_t>( { 42, -100, 37, 2048 } );
+
+ // "HX:H:1abc75\tST:Z:foo\0\tVC:B:i,42,-100,37,2048\tXY:i:-42"
+ string expected;
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("ST:Z:foo");
+ expected.append("\t");
+ expected.append("VC:B:i,42,-100,37,2048");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const string sam = SamTagCodec::Encode(tags);
+ EXPECT_EQ(expected, sam);
+}
+
+TEST(BamTagCodecTest, DecodeTest)
+{
+ vector<uint8_t> data;
+ data.push_back(uint8_t('H'));
+ data.push_back(uint8_t('X'));
+ data.push_back(uint8_t('H'));
+ data.push_back(uint8_t('1'));
+ data.push_back(uint8_t('a'));
+ data.push_back(uint8_t('b'));
+ data.push_back(uint8_t('c'));
+ data.push_back(uint8_t('7'));
+ data.push_back(uint8_t('5'));
+ data.push_back(uint8_t(0));
+
+ data.push_back(uint8_t('X'));
+ data.push_back(uint8_t('Y'));
+ data.push_back(uint8_t('i'));
+ const int32_t x = -42;
+ char valueBytes[sizeof x];
+ std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
+ static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
+ valueBytes);
+ data.push_back(valueBytes[0]);
+ data.push_back(valueBytes[1]);
+ data.push_back(valueBytes[2]);
+ data.push_back(valueBytes[3]);
+
+ data.push_back('C');
+ data.push_back('A');
+ data.push_back('B');
+ data.push_back('C');
+ const uint32_t numChars = 3;
+ char numCharsValueBytes[sizeof numChars];
+ std::copy(static_cast<const char*>(static_cast<const void*>(&numChars)),
+ static_cast<const char*>(static_cast<const void*>(&numChars)) + sizeof numChars,
+ numCharsValueBytes);
+ data.push_back(numCharsValueBytes[0]);
+ data.push_back(numCharsValueBytes[1]);
+ data.push_back(numCharsValueBytes[2]);
+ data.push_back(numCharsValueBytes[3]);
+
+ const vector<uint8_t> charArray = vector<uint8_t>({34, 5, 125});
+ data.push_back(charArray.at(0));
+ data.push_back(charArray.at(1));
+ data.push_back(charArray.at(2));
+
+ TagCollection tags = BamTagCodec::Decode(data);
+
+ EXPECT_TRUE(tags["HX"].HasModifier(TagModifier::HEX_STRING));
+ EXPECT_EQ(string("1abc75"), tags["HX"].ToString());
+ EXPECT_EQ(x, tags["XY"].ToInt32());
+ EXPECT_EQ(charArray, tags["CA"].ToUInt8Array());
+
+ // sanity check - convert tags back to SAM
+ string expected;
+ expected.append("CA:B:C,34,5,125");
+ expected.append("\t");
+ expected.append("HX:H:1abc75");
+ expected.append("\t");
+ expected.append("XY:i:-42");
+
+ const string sam = SamTagCodec::Encode(tags);
+ EXPECT_EQ(expected, sam);
+}
+
+TEST(BamTagCodecTest, EncodeTest)
+{
+ vector<uint8_t> expected;
+
+ expected.push_back('C');
+ expected.push_back('A');
+ expected.push_back('B');
+ expected.push_back('C');
+ const uint32_t numChars = 3;
+ char numCharsValueBytes[sizeof numChars];
+ std::copy(static_cast<const char*>(static_cast<const void*>(&numChars)),
+ static_cast<const char*>(static_cast<const void*>(&numChars)) + sizeof numChars,
+ numCharsValueBytes);
+ expected.push_back(numCharsValueBytes[0]);
+ expected.push_back(numCharsValueBytes[1]);
+ expected.push_back(numCharsValueBytes[2]);
+ expected.push_back(numCharsValueBytes[3]);
+
+ const vector<uint8_t> charArray = vector<uint8_t>({34, 5, 125});
+ expected.push_back(charArray.at(0));
+ expected.push_back(charArray.at(1));
+ expected.push_back(charArray.at(2));
+
+ expected.push_back(uint8_t('H'));
+ expected.push_back(uint8_t('X'));
+ expected.push_back(uint8_t('H'));
+ expected.push_back(uint8_t('1'));
+ expected.push_back(uint8_t('a'));
+ expected.push_back(uint8_t('b'));
+ expected.push_back(uint8_t('c'));
+ expected.push_back(uint8_t('7'));
+ expected.push_back(uint8_t('5'));
+ expected.push_back(uint8_t(0));
+
+ expected.push_back(uint8_t('X'));
+ expected.push_back(uint8_t('Y'));
+ expected.push_back(uint8_t('i'));
+ const int32_t x = -42;
+ char valueBytes[sizeof x];
+ std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
+ static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
+ valueBytes);
+ expected.push_back(valueBytes[0]);
+ expected.push_back(valueBytes[1]);
+ expected.push_back(valueBytes[2]);
+ expected.push_back(valueBytes[3]);
+
+ TagCollection tags;
+ tags["HX"] = string("1abc75");
+ tags["HX"].Modifier(TagModifier::HEX_STRING);
+ tags["CA"] = charArray;
+ tags["XY"] = x;
+
+ const vector<uint8_t>& data = BamTagCodec::Encode(tags);
+ EXPECT_EQ(expected, data);
+}
+
diff --git a/tests/src/test_TimeUtils.cpp b/tests/src/test_TimeUtils.cpp
new file mode 100644
index 0000000..7ab9fa5
--- /dev/null
+++ b/tests/src/test_TimeUtils.cpp
@@ -0,0 +1,59 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/../../src/TimeUtils.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+TEST(TimeUtilsTest, ToIso8601)
+{
+ const time_t rawTime = 436428750L;
+ const auto timestamp = std::chrono::system_clock::from_time_t(rawTime);
+
+ // can't hardcode expected (since we rely on localtime())
+ const std::string& expected = "1983-10-31T06:12:30Z";
+ const std::string& actual = internal::ToIso8601(timestamp);
+ EXPECT_EQ(expected, actual);
+}
diff --git a/tests/src/test_UnmappedReadsQuery.cpp b/tests/src/test_UnmappedReadsQuery.cpp
new file mode 100644
index 0000000..cf5f46a
--- /dev/null
+++ b/tests/src/test_UnmappedReadsQuery.cpp
@@ -0,0 +1,117 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+//#ifdef PBBAM_TESTING
+//#define private public
+//#endif
+
+//#include "TestData.h"
+//#include <gtest/gtest.h>
+//#include <pbbam/EntireFileQuery.h>
+
+//#include <pbbam/UnmappedReadsQuery.h>
+//#include <string>
+//using namespace PacBio;
+//using namespace PacBio::BAM;
+//using namespace std;
+
+//const string inputBamFn1 = tests::Data_Dir + "/unmap1.bam";
+//const string inputBamFn2 = tests::Data_Dir + "/unmap2.bam";
+
+//TEST(UnmappedReadsQueryTest, UnmappedOnlyFile)
+//{
+// // open input BAM file
+// BamFile bamFile(inputBamFn1);
+// EXPECT_TRUE(bamFile);
+
+// // check all records, and save unmapped count
+// int count = 0;
+// int unmappedExpected = 0;
+// EntireFileQuery entireFile(bamFile);
+// EXPECT_TRUE(entireFile);
+// for ( const BamRecord& record : entireFile ) {
+// ++count;
+// if (!record.IsMapped())
+// ++unmappedExpected;
+// }
+// EXPECT_EQ(10, count);
+// EXPECT_EQ(10, unmappedExpected);
+
+// // query unmapped records only
+// int unmappedObserved = 0;
+// UnmappedReadsQuery unmappedReads(bamFile);
+// EXPECT_TRUE(unmappedReads);
+// for ( const BamRecord& record : unmappedReads ) {
+// EXPECT_FALSE(record.IsMapped());
+// ++unmappedObserved;
+// }
+// EXPECT_EQ(unmappedExpected, unmappedObserved);
+//}
+
+//TEST(UnmappedReadsQueryTest, MixedFile)
+//{
+// // open input BAM file
+// BamFile bamFile(inputBamFn2);
+// EXPECT_TRUE(bamFile);
+
+// // check all records, and save unmapped count
+// int count = 0;
+// int unmappedExpected = 0;
+// EntireFileQuery entireFile(bamFile);
+// EXPECT_TRUE(entireFile);
+// for ( const BamRecord& record : entireFile ) {
+// ++count;
+// if (!record.IsMapped())
+// ++unmappedExpected;
+// }
+// EXPECT_EQ(19, count);
+// EXPECT_EQ(9, unmappedExpected);
+
+// // query unmapped records only
+// int unmappedObserved = 0;
+// UnmappedReadsQuery unmappedReads(bamFile);
+// EXPECT_TRUE(unmappedReads);
+// for ( const BamRecord& record : unmappedReads ) {
+// EXPECT_FALSE(record.IsMapped());
+// ++unmappedObserved;
+// }
+// EXPECT_EQ(unmappedExpected, unmappedObserved);
+//}
+
+// TODO: handle no index case
+
+// TODO: additional special cases as needed
diff --git a/tests/src/test_ZmwQuery.cpp b/tests/src/test_ZmwQuery.cpp
new file mode 100644
index 0000000..287a4eb
--- /dev/null
+++ b/tests/src/test_ZmwQuery.cpp
@@ -0,0 +1,67 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/ZmwQuery.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+//TEST(EntireFileQueryTest, CountRecords)
+//{
+// EXPECT_NO_THROW(
+// {
+// // open input BAM file
+// BamFile bamFile(inputBamFn);
+
+// // count records
+// int count = 0;
+// EntireFileQuery entireFile(bamFile);
+// for (const BamRecord& record : entireFile) {
+// (void)record;
+// ++count;
+// }
+
+// EXPECT_EQ(3307, count);
+// });
+//}
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
new file mode 100644
index 0000000..db63408
--- /dev/null
+++ b/tools/CMakeLists.txt
@@ -0,0 +1,3 @@
+if(PacBioBAM_build_pbindex)
+ add_subdirectory(pbindex)
+endif()
diff --git a/tools/pbindex/CMakeLists.txt b/tools/pbindex/CMakeLists.txt
new file mode 100644
index 0000000..89572d0
--- /dev/null
+++ b/tools/pbindex/CMakeLists.txt
@@ -0,0 +1,27 @@
+
+# create version header
+set(PbIndex_VERSION ${PacBioBAM_VERSION})
+configure_file(
+ ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndexVersion.h.in
+ ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndexVersion.h
+)
+
+#pbindex sources
+set(PBINDEX_SOURCES
+ ${PacBioBAM_RootDir}/tools/pbindex/src/main.cpp
+ ${PacBioBAM_RootDir}/tools/pbindex/src/OptionParser.h
+ ${PacBioBAM_RootDir}/tools/pbindex/src/OptionParser.cpp
+ ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndex.h
+ ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndex.cpp
+ ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndexVersion.h
+)
+
+# build pbindex executable
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PacBioBAM_CXX_FLAGS}")
+include_directories(${PacBioBAM_RootDir}/tools/pbindex/src ${PacBioBAM_INCLUDE_DIRS})
+add_executable(pbindex ${PBINDEX_SOURCES})
+set_target_properties(pbindex PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_BinDir}
+)
+target_link_libraries(pbindex pbbam)
+
diff --git a/tools/pbindex/src/OptionParser.cpp b/tools/pbindex/src/OptionParser.cpp
new file mode 100644
index 0000000..fc73176
--- /dev/null
+++ b/tools/pbindex/src/OptionParser.cpp
@@ -0,0 +1,562 @@
+/**
+ * Copyright (C) 2010 Johannes Weißl <jargon at molb.org>
+ * License: your favourite BSD-style license
+ *
+ * See OptionParser.h for help.
+ */
+
+#include "OptionParser.h"
+
+#include <cstdlib>
+#include <algorithm>
+#include <complex>
+#include <ciso646>
+
+#if defined(ENABLE_NLS) && ENABLE_NLS
+# include <libintl.h>
+# define _(s) gettext(s)
+#else
+# define _(s) ((const char *) (s))
+#endif
+
+using namespace std;
+
+namespace optparse {
+
+////////// auxiliary (string) functions { //////////
+class str_wrap {
+public:
+ str_wrap(const string& l, const string& r) : lwrap(l), rwrap(r) {}
+ str_wrap(const string& w) : lwrap(w), rwrap(w) {}
+ string operator() (const string& s) { return lwrap + s + rwrap; }
+ const string lwrap, rwrap;
+};
+template<typename InputIterator, typename UnaryOperator>
+static string str_join_trans(const string& sep, InputIterator begin, InputIterator end, UnaryOperator op) {
+ string buf;
+ for (InputIterator it = begin; it != end; ++it) {
+ if (it != begin)
+ buf += sep;
+ buf += op(*it);
+ }
+ return buf;
+}
+template<class InputIterator>
+static string str_join(const string& sep, InputIterator begin, InputIterator end) {
+ return str_join_trans(sep, begin, end, str_wrap(""));
+}
+static string& str_replace(string& s, const string& patt, const string& repl) {
+ size_t pos = 0, n = patt.length();
+ while (true) {
+ pos = s.find(patt, pos);
+ if (pos == string::npos)
+ break;
+ s.replace(pos, n, repl);
+ pos += repl.size();
+ }
+ return s;
+}
+static string str_replace(const string& s, const string& patt, const string& repl) {
+ string tmp = s;
+ str_replace(tmp, patt, repl);
+ return tmp;
+}
+static string str_format(const string& s, size_t pre, size_t len, bool indent_first = true) {
+ stringstream ss;
+ string p;
+ if (indent_first)
+ p = string(pre, ' ');
+
+ size_t pos = 0, linestart = 0;
+ size_t line = 0;
+ while (true) {
+ bool wrap = false;
+
+ size_t new_pos = s.find_first_of(" \n\t", pos);
+ if (new_pos == string::npos)
+ break;
+ if (s[new_pos] == '\n') {
+ pos = new_pos + 1;
+ wrap = true;
+ }
+ if (line == 1)
+ p = string(pre, ' ');
+ if (wrap || new_pos + pre > linestart + len) {
+ ss << p << s.substr(linestart, pos - linestart - 1) << endl;
+ linestart = pos;
+ line++;
+ }
+ pos = new_pos + 1;
+ }
+ ss << p << s.substr(linestart) << endl;
+ return ss.str();
+}
+static string str_inc(const string& s) {
+ stringstream ss;
+ string v = (s != "") ? s : "0";
+ long i;
+ istringstream(v) >> i;
+ ss << i+1;
+ return ss.str();
+}
+static unsigned int cols() {
+ unsigned int n = 80;
+#ifndef _WIN32
+ const char *s = getenv("COLUMNS");
+ if (s)
+ istringstream(s) >> n;
+#endif
+ return n;
+}
+static string basename(const string& s) {
+ string b = s;
+ size_t i = b.find_last_not_of('/');
+ if (i == string::npos) {
+ if (b[0] == '/')
+ b.erase(1);
+ return b;
+ }
+ b.erase(i+1, b.length()-i-1);
+ i = b.find_last_of("/");
+ if (i != string::npos)
+ b.erase(0, i+1);
+ return b;
+}
+////////// } auxiliary (string) functions //////////
+
+
+////////// class OptionParser { //////////
+OptionParser::OptionParser() :
+ _usage(_("%prog [options]")),
+ _add_help_option(true),
+ _add_version_option(true),
+ _interspersed_args(true) {}
+
+Option& OptionParser::add_option(const string& opt) {
+ const string tmp[1] = { opt };
+ return add_option(vector<string>(&tmp[0], &tmp[1]));
+}
+Option& OptionParser::add_option(const string& opt1, const string& opt2) {
+ const string tmp[2] = { opt1, opt2 };
+ return add_option(vector<string>(&tmp[0], &tmp[2]));
+}
+Option& OptionParser::add_option(const string& opt1, const string& opt2, const string& opt3) {
+ const string tmp[3] = { opt1, opt2, opt3 };
+ return add_option(vector<string>(&tmp[0], &tmp[3]));
+}
+Option& OptionParser::add_option(const vector<string>& v) {
+ _opts.resize(_opts.size()+1);
+ Option& option = _opts.back();
+ string dest_fallback;
+ for (vector<string>::const_iterator it = v.begin(); it != v.end(); ++it) {
+ if (it->substr(0,2) == "--") {
+ const string s = it->substr(2);
+ if (option.dest() == "")
+ option.dest(str_replace(s, "-", "_"));
+ option._long_opts.insert(s);
+ _optmap_l[s] = &option;
+ } else if ( it->empty() ) {
+ continue;
+ } else {
+ const string s = it->substr(1,1);
+ if (dest_fallback == "")
+ dest_fallback = s;
+ option._short_opts.insert(s);
+ _optmap_s[s] = &option;
+ }
+ }
+ if (option.dest() == "")
+ option.dest(dest_fallback);
+ return option;
+}
+
+OptionParser& OptionParser::add_option_group(const OptionGroup& group) {
+ for (list<Option>::const_iterator oit = group._opts.begin(); oit != group._opts.end(); ++oit) {
+ const Option& option = *oit;
+ for (set<string>::const_iterator it = option._short_opts.begin(); it != option._short_opts.end(); ++it)
+ _optmap_s[*it] = &option;
+ for (set<string>::const_iterator it = option._long_opts.begin(); it != option._long_opts.end(); ++it)
+ _optmap_l[*it] = &option;
+ }
+ _groups.push_back(&group);
+ return *this;
+}
+
+const Option& OptionParser::lookup_short_opt(const string& opt) const {
+ optMap::const_iterator it = _optmap_s.find(opt);
+ if (it == _optmap_s.end())
+ error(_("no such option") + string(": -") + opt);
+ return *it->second;
+}
+
+void OptionParser::handle_short_opt(const string& opt, const string& arg) {
+
+ _remaining.pop_front();
+ string value;
+
+ const Option& option = lookup_short_opt(opt);
+ if (option._nargs == 1) {
+ value = arg.substr(2);
+ if (value == "") {
+ if (_remaining.empty())
+ error("-" + opt + " " + _("option requires an argument"));
+ value = _remaining.front();
+ _remaining.pop_front();
+ }
+ } else {
+ if (arg.length() > 2)
+ _remaining.push_front(string("-") + arg.substr(2));
+ }
+
+ process_opt(option, string("-") + opt, value);
+}
+
+const Option& OptionParser::lookup_long_opt(const string& opt) const {
+
+ list<string> matching;
+ for (optMap::const_iterator it = _optmap_l.begin(); it != _optmap_l.end(); ++it) {
+ if (it->first.compare(0, opt.length(), opt) == 0)
+ matching.push_back(it->first);
+ }
+ if (matching.size() > 1) {
+ string x = str_join(", ", matching.begin(), matching.end());
+ error(_("ambiguous option") + string(": --") + opt + " (" + x + "?)");
+ }
+ if (matching.size() == 0)
+ error(_("no such option") + string(": --") + opt);
+
+ return *_optmap_l.find(matching.front())->second;
+}
+
+void OptionParser::handle_long_opt(const string& optstr) {
+
+ _remaining.pop_front();
+ string opt, value;
+
+ size_t delim = optstr.find("=");
+ if (delim != string::npos) {
+ opt = optstr.substr(0, delim);
+ value = optstr.substr(delim+1);
+ } else
+ opt = optstr;
+
+ const Option& option = lookup_long_opt(opt);
+ if (option._nargs == 1 and delim == string::npos) {
+ if (not _remaining.empty()) {
+ value = _remaining.front();
+ _remaining.pop_front();
+ }
+ }
+
+ if (option._nargs == 1 and value == "")
+ error("--" + opt + " " + _("option requires an argument"));
+
+ process_opt(option, string("--") + opt, value);
+}
+
+Values& OptionParser::parse_args(const int argc, char const* const* const argv) {
+ if (prog() == "")
+ prog(basename(argv[0]));
+ return parse_args(&argv[1], &argv[argc]);
+}
+Values& OptionParser::parse_args(const vector<string>& v) {
+
+ _remaining.assign(v.begin(), v.end());
+
+ if (add_version_option() and version() != "") {
+ add_option("--version") .action("version") .help(_("show program's version number and exit"));
+ _opts.splice(_opts.begin(), _opts, --(_opts.end()));
+ }
+ if (add_help_option()) {
+ add_option("-h", "--help") .action("help") .help(_("show this help message and exit"));
+ _opts.splice(_opts.begin(), _opts, --(_opts.end()));
+ }
+
+ while (not _remaining.empty()) {
+ const string arg = _remaining.front();
+
+ if (arg == "--") {
+ _remaining.pop_front();
+ break;
+ }
+
+ if (arg.substr(0,2) == "--") {
+ handle_long_opt(arg.substr(2));
+ } else if (arg.substr(0,1) == "-" and arg.length() > 1) {
+ handle_short_opt(arg.substr(1,1), arg);
+ } else {
+ _remaining.pop_front();
+ _leftover.push_back(arg);
+ if (not interspersed_args())
+ break;
+ }
+ }
+ while (not _remaining.empty()) {
+ const string arg = _remaining.front();
+ _remaining.pop_front();
+ _leftover.push_back(arg);
+ }
+
+ for (strMap::const_iterator it = _defaults.begin(); it != _defaults.end(); ++it) {
+ if (not _values.is_set(it->first))
+ _values[it->first] = it->second;
+ }
+
+ for (list<Option>::const_iterator it = _opts.begin(); it != _opts.end(); ++it) {
+ if (it->get_default() != "" and not _values.is_set(it->dest()))
+ _values[it->dest()] = it->get_default();
+ }
+
+ return _values;
+}
+
+void OptionParser::process_opt(const Option& o, const string& opt, const string& value) {
+ if (o.action() == "store") {
+ string err = o.check_type(opt, value);
+ if (err != "")
+ error(err);
+ _values[o.dest()] = value;
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "store_const") {
+ _values[o.dest()] = o.get_const();
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "store_true") {
+ _values[o.dest()] = "1";
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "store_false") {
+ _values[o.dest()] = "0";
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "append") {
+ string err = o.check_type(opt, value);
+ if (err != "")
+ error(err);
+ _values[o.dest()] = value;
+ _values.all(o.dest()).push_back(value);
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "append_const") {
+ _values[o.dest()] = o.get_const();
+ _values.all(o.dest()).push_back(o.get_const());
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "count") {
+ _values[o.dest()] = str_inc(_values[o.dest()]);
+ _values.is_set_by_user(o.dest(), true);
+ }
+ else if (o.action() == "help") {
+ print_help();
+ std::exit(0);
+ }
+ else if (o.action() == "version") {
+ print_version();
+ std::exit(0);
+ }
+ else if (o.action() == "callback" && o.callback()) {
+ (*o.callback())(o, opt, value, *this);
+ }
+}
+
+string OptionParser::format_option_help(unsigned int indent /* = 2 */) const {
+ stringstream ss;
+
+ if (_opts.empty())
+ return ss.str();
+
+ for (list<Option>::const_iterator it = _opts.begin(); it != _opts.end(); ++it) {
+ if (it->help() != SUPPRESS_HELP)
+ ss << it->format_help(indent);
+ }
+
+ return ss.str();
+}
+
+string OptionParser::format_help() const {
+ stringstream ss;
+
+ if (usage() != SUPPRESS_USAGE)
+ ss << get_usage() << endl;
+
+ if (description() != "")
+ ss << str_format(description(), 0, cols()) << endl;
+
+ ss << _("Options") << ":" << endl;
+ ss << format_option_help();
+
+ for (list<OptionGroup const*>::const_iterator it = _groups.begin(); it != _groups.end(); ++it) {
+ const OptionGroup& group = **it;
+ ss << endl << " " << group.title() << ":" << endl;
+ if (group.group_description() != "")
+ ss << str_format(group.group_description(), 4, cols()) << endl;
+ ss << group.format_option_help(4);
+ }
+
+ if (epilog() != "")
+ ss << endl << str_format(epilog(), 0, cols());
+
+ return ss.str();
+}
+void OptionParser::print_help() const {
+ cout << format_help();
+}
+
+void OptionParser::set_usage(const string& u) {
+ string lower = u;
+ transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
+ if (lower.compare(0, 7, "usage: ") == 0)
+ _usage = u.substr(7);
+ else
+ _usage = u;
+}
+string OptionParser::format_usage(const string& u) const {
+ stringstream ss;
+ ss << _("Usage") << ": " << u << endl;
+ return ss.str();
+}
+string OptionParser::get_usage() const {
+ if (usage() == SUPPRESS_USAGE)
+ return string("");
+ return format_usage(str_replace(usage(), "%prog", prog()));
+}
+void OptionParser::print_usage(ostream& out) const {
+ string u = get_usage();
+ if (u != "")
+ out << u << endl;
+}
+void OptionParser::print_usage() const {
+ print_usage(cout);
+}
+
+string OptionParser::get_version() const {
+ return str_replace(_version, "%prog", prog());
+}
+void OptionParser::print_version(ostream& out) const {
+ out << get_version() << endl;
+}
+void OptionParser::print_version() const {
+ print_version(cout);
+}
+
+void OptionParser::exit() const {
+ std::exit(2);
+}
+void OptionParser::error(const string& msg) const {
+ print_usage(cerr);
+ cerr << prog() << ": " << _("error") << ": " << msg << endl;
+ exit();
+}
+////////// } class OptionParser //////////
+
+////////// class Values { //////////
+const string& Values::operator[] (const string& d) const {
+ strMap::const_iterator it = _map.find(d);
+ static const string empty = "";
+ return (it != _map.end()) ? it->second : empty;
+}
+void Values::is_set_by_user(const string& d, bool yes) {
+ if (yes)
+ _userSet.insert(d);
+ else
+ _userSet.erase(d);
+}
+////////// } class Values //////////
+
+////////// class Option { //////////
+string Option::check_type(const string& opt, const string& val) const {
+ istringstream ss(val);
+ stringstream err;
+
+ if (type() == "int" || type() == "long") {
+ long t;
+ if (not (ss >> t))
+ err << _("option") << " " << opt << ": " << _("invalid integer value") << ": '" << val << "'";
+ }
+ else if (type() == "float" || type() == "double") {
+ double t;
+ if (not (ss >> t))
+ err << _("option") << " " << opt << ": " << _("invalid floating-point value") << ": '" << val << "'";
+ }
+ else if (type() == "choice") {
+ if (find(choices().begin(), choices().end(), val) == choices().end()) {
+ list<string> tmp = choices();
+ transform(tmp.begin(), tmp.end(), tmp.begin(), str_wrap("'"));
+ err << _("option") << " " << opt << ": " << _("invalid choice") << ": '" << val << "'"
+ << " (" << _("choose from") << " " << str_join(", ", tmp.begin(), tmp.end()) << ")";
+ }
+ }
+ else if (type() == "complex") {
+ complex<double> t;
+ if (not (ss >> t))
+ err << _("option") << " " << opt << ": " << _("invalid complex value") << ": '" << val << "'";
+ }
+
+ return err.str();
+}
+
+string Option::format_option_help(unsigned int indent /* = 2 */) const {
+
+ string mvar_short, mvar_long;
+ if (nargs() == 1) {
+ string mvar = metavar();
+ if (mvar == "") {
+ mvar = type();
+ transform(mvar.begin(), mvar.end(), mvar.begin(), ::toupper);
+ }
+ mvar_short = " " + mvar;
+ mvar_long = "=" + mvar;
+ }
+
+ stringstream ss;
+ ss << string(indent, ' ');
+
+ if (not _short_opts.empty()) {
+ ss << str_join_trans(", ", _short_opts.begin(), _short_opts.end(), str_wrap("-", mvar_short));
+ if (not _long_opts.empty())
+ ss << ", ";
+ }
+ if (not _long_opts.empty())
+ ss << str_join_trans(", ", _long_opts.begin(), _long_opts.end(), str_wrap("--", mvar_long));
+
+ if ( _short_opts.empty() && _long_opts.empty() )
+ ss << metavar();
+
+
+ return ss.str();
+}
+
+string Option::format_help(unsigned int indent /* = 2 */) const {
+ stringstream ss;
+ string h = format_option_help(indent);
+ unsigned int width = cols();
+ unsigned int opt_width = min(width*3/10, 36u);
+ bool indent_first = false;
+ ss << h;
+ // if the option list is too long, start a new paragraph
+ if (h.length() >= (opt_width-1)) {
+ ss << endl;
+ indent_first = true;
+ } else {
+ ss << string(opt_width - h.length(), ' ');
+ if (help() == "")
+ ss << endl;
+ }
+ if (help() != "") {
+ string help_str = (get_default() != "") ? str_replace(help(), "%default", get_default()) : help();
+ ss << str_format(help_str, opt_width, width, indent_first);
+ }
+ return ss.str();
+}
+
+Option& Option::action(const string& a) {
+ _action = a;
+ if (a == "store_const" || a == "store_true" || a == "store_false" ||
+ a == "append_const" || a == "count" || a == "help" || a == "version")
+ nargs(0);
+ return *this;
+}
+////////// } class Option //////////
+
+}
diff --git a/tools/pbindex/src/OptionParser.h b/tools/pbindex/src/OptionParser.h
new file mode 100644
index 0000000..3266f0f
--- /dev/null
+++ b/tools/pbindex/src/OptionParser.h
@@ -0,0 +1,305 @@
+/**
+ * Copyright (C) 2010 Johannes Weißl <jargon at molb.org>
+ * License: your favourite BSD-style license
+ *
+ * git clone http://github.com/weisslj/cpp-optparse.git
+ *
+ * This is yet another option parser for C++. It is modelled after the
+ * excellent Python optparse API. Although incomplete, anyone familiar to
+ * optparse should feel at home:
+ * http://docs.python.org/library/optparse.html
+ *
+ * Design decisions:
+ * - elegant and easy usage more important than speed / flexibility
+ * - shortness more important than feature completeness
+ * * no unicode
+ * * no checking for user programming errors
+ *
+ * Why not use getopt/getopt_long?
+ * - not C++ / not completely POSIX
+ * - too cumbersome to use, would need lot of additional code
+ *
+ * Why not use Boost.Program_options?
+ * - boost not installed on all target platforms (esp. cluster, HPC, ...)
+ * - too big to include just for option handling:
+ * 322 *.h (44750 lines) + 7 *.cpp (2078 lines)
+ *
+ * Why not use tclap/Opag/Options/CmdLine/Anyoption/Argument_helper/...?
+ * - no reason, writing one is faster than code inspection :-)
+ * - similarity to Python desired for faster learning curve
+ *
+ * Future work:
+ * - nargs > 1?
+ * - comments?
+ *
+ * Python only features:
+ * - conflict handlers
+ * - adding new actions
+ *
+ *
+ * Example:
+ *
+ * using optparse::OptionParser;
+ *
+ * OptionParser parser = OptionParser() .description("just an example");
+ *
+ * parser.add_option("-f", "--file") .dest("filename")
+ * .help("write report to FILE") .metavar("FILE");
+ * parser.add_option("-q", "--quiet")
+ * .action("store_false") .dest("verbose") .set_default("1")
+ * .help("don't print status messages to stdout");
+ *
+ * optparse::Values options = parser.parse_args(argc, argv);
+ * vector<string> args = parser.args();
+ *
+ * if (options.get("verbose"))
+ * cout << options["filename"] << endl;
+ *
+ */
+
+#ifndef OPTIONPARSER_H_
+#define OPTIONPARSER_H_
+
+#include <iostream>
+#include <list>
+#include <map>
+#include <set>
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace optparse {
+
+class OptionParser;
+class OptionGroup;
+class Option;
+class Values;
+class Value;
+class Callback;
+
+typedef std::map<std::string,std::string> strMap;
+typedef std::map<std::string,std::list<std::string> > lstMap;
+typedef std::map<std::string,Option const*> optMap;
+
+const char* const SUPPRESS_HELP = "SUPPRESS" "HELP";
+const char* const SUPPRESS_USAGE = "SUPPRESS" "USAGE";
+
+//! Class for automatic conversion from string -> anytype
+class Value {
+ public:
+ Value() : str(), valid(false) {}
+ Value(const std::string& v) : str(v), valid(true) {}
+ operator const char*() { return str.c_str(); }
+ operator bool() { bool t; return (valid && (std::istringstream(str) >> t)) ? t : false; }
+ operator short() { short t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator unsigned short() { unsigned short t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator int() { int t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator unsigned int() { unsigned int t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator long() { long t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator unsigned long() { unsigned long t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator float() { float t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator double() { double t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ operator long double() { long double t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ private:
+ const std::string str;
+ bool valid;
+};
+
+class Values {
+ public:
+ Values() : _map() {}
+ const std::string& operator[] (const std::string& d) const;
+ std::string& operator[] (const std::string& d) { return _map[d]; }
+ bool is_set(const std::string& d) const { return _map.find(d) != _map.end(); }
+ bool is_set_by_user(const std::string& d) const { return _userSet.find(d) != _userSet.end(); }
+ void is_set_by_user(const std::string& d, bool yes);
+ Value get(const std::string& d) const { return (is_set(d)) ? Value((*this)[d]) : Value(); }
+
+ typedef std::list<std::string>::iterator iterator;
+ typedef std::list<std::string>::const_iterator const_iterator;
+ std::list<std::string>& all(const std::string& d) { return _appendMap[d]; }
+ const std::list<std::string>& all(const std::string& d) const { return _appendMap.find(d)->second; }
+
+ private:
+ strMap _map;
+ lstMap _appendMap;
+ std::set<std::string> _userSet;
+};
+
+class OptionParser {
+ public:
+ OptionParser();
+ virtual ~OptionParser() {}
+
+ OptionParser& usage(const std::string& u) { set_usage(u); return *this; }
+ OptionParser& version(const std::string& v) { _version = v; return *this; }
+ OptionParser& description(const std::string& d) { _description = d; return *this; }
+ OptionParser& add_help_option(bool h) { _add_help_option = h; return *this; }
+ OptionParser& add_version_option(bool v) { _add_version_option = v; return *this; }
+ OptionParser& prog(const std::string& p) { _prog = p; return *this; }
+ OptionParser& epilog(const std::string& e) { _epilog = e; return *this; }
+ OptionParser& set_defaults(const std::string& dest, const std::string& val) {
+ _defaults[dest] = val; return *this;
+ }
+ OptionParser& enable_interspersed_args() { _interspersed_args = true; return *this; }
+ OptionParser& disable_interspersed_args() { _interspersed_args = false; return *this; }
+ OptionParser& add_option_group(const OptionGroup& group);
+
+ const std::string& usage() const { return _usage; }
+ const std::string& version() const { return _version; }
+ const std::string& description() const { return _description; }
+ bool add_help_option() const { return _add_help_option; }
+ bool add_version_option() const { return _add_version_option; }
+ const std::string& prog() const { return _prog; }
+ const std::string& epilog() const { return _epilog; }
+ bool interspersed_args() const { return _interspersed_args; }
+
+ Option& add_option(const std::string& opt);
+ Option& add_option(const std::string& opt1, const std::string& opt2);
+ Option& add_option(const std::string& opt1, const std::string& opt2, const std::string& opt3);
+ Option& add_option(const std::vector<std::string>& opt);
+
+ Values& parse_args(int argc, char const* const* argv);
+ Values& parse_args(const std::vector<std::string>& args);
+ template<typename InputIterator>
+ Values& parse_args(InputIterator begin, InputIterator end) {
+ return parse_args(std::vector<std::string>(begin, end));
+ }
+
+ const std::list<std::string>& args() const { return _leftover; }
+ std::vector<std::string> args() {
+ return std::vector<std::string>(_leftover.begin(), _leftover.end());
+ }
+
+ std::string format_help() const;
+ std::string format_option_help(unsigned int indent = 2) const;
+ void print_help() const;
+
+ void set_usage(const std::string& u);
+ std::string get_usage() const;
+ void print_usage(std::ostream& out) const;
+ void print_usage() const;
+
+ std::string get_version() const;
+ void print_version(std::ostream& out) const;
+ void print_version() const;
+
+ void error(const std::string& msg) const;
+ void exit() const;
+
+ private:
+ const Option& lookup_short_opt(const std::string& opt) const;
+ const Option& lookup_long_opt(const std::string& opt) const;
+
+ void handle_short_opt(const std::string& opt, const std::string& arg);
+ void handle_long_opt(const std::string& optstr);
+
+ void process_opt(const Option& option, const std::string& opt, const std::string& value);
+
+ std::string format_usage(const std::string& u) const;
+
+ std::string _usage;
+ std::string _version;
+ std::string _description;
+ bool _add_help_option;
+ bool _add_version_option;
+ std::string _prog;
+ std::string _epilog;
+ bool _interspersed_args;
+
+ Values _values;
+
+ std::list<Option> _opts;
+ optMap _optmap_s;
+ optMap _optmap_l;
+ strMap _defaults;
+ std::list<OptionGroup const*> _groups;
+
+ std::list<std::string> _remaining;
+ std::list<std::string> _leftover;
+};
+
+class OptionGroup : public OptionParser {
+ public:
+ OptionGroup(const OptionParser& p, const std::string& t, const std::string& d = "") :
+ _parser(p), _title(t), _group_description(d) {}
+ virtual ~OptionGroup() {}
+
+ OptionGroup& title(const std::string& t) { _title = t; return *this; }
+ OptionGroup& group_description(const std::string& d) { _group_description = d; return *this; }
+ const std::string& title() const { return _title; }
+ const std::string& group_description() const { return _group_description; }
+
+ private:
+ const OptionParser& _parser;
+ std::string _title;
+ std::string _group_description;
+};
+
+class Option {
+ public:
+ Option() : _action("store"), _type("string"), _nargs(1), _callback(0) {}
+ virtual ~Option() {}
+
+ Option& action(const std::string& a);
+ Option& type(const std::string& t) { _type = t; return *this; }
+ Option& dest(const std::string& d) { _dest = d; return *this; }
+ Option& set_default(const std::string& d) { _default = d; return *this; }
+ template<typename T>
+ Option& set_default(T t) { std::ostringstream ss; ss << t; _default = ss.str(); return *this; }
+ Option& nargs(size_t n) { _nargs = n; return *this; }
+ Option& set_const(const std::string& c) { _const = c; return *this; }
+ template<typename InputIterator>
+ Option& choices(InputIterator begin, InputIterator end) {
+ _choices.assign(begin, end); type("choice"); return *this;
+ }
+ template<typename InputEnumerable>
+ Option& choices(InputEnumerable enumerable) {
+ _choices.assign(enumerable.begin(), enumerable.end()); type("choice"); return *this;
+ }
+ Option& help(const std::string& h) { _help = h; return *this; }
+ Option& metavar(const std::string& m) { _metavar = m; return *this; }
+ Option& callback(Callback& c) { _callback = &c; return *this; }
+
+ const std::string& action() const { return _action; }
+ const std::string& type() const { return _type; }
+ const std::string& dest() const { return _dest; }
+ const std::string& get_default() const { return _default; }
+ size_t nargs() const { return _nargs; }
+ const std::string& get_const() const { return _const; }
+ const std::list<std::string>& choices() const { return _choices; }
+ const std::string& help() const { return _help; }
+ const std::string& metavar() const { return _metavar; }
+ Callback* callback() const { return _callback; }
+
+ private:
+ std::string check_type(const std::string& opt, const std::string& val) const;
+ std::string format_option_help(unsigned int indent = 2) const;
+ std::string format_help(unsigned int indent = 2) const;
+
+ std::set<std::string> _short_opts;
+ std::set<std::string> _long_opts;
+
+ std::string _action;
+ std::string _type;
+ std::string _dest;
+ std::string _default;
+ size_t _nargs;
+ std::string _const;
+ std::list<std::string> _choices;
+ std::string _help;
+ std::string _metavar;
+ Callback* _callback;
+
+ friend class OptionParser;
+};
+
+class Callback {
+public:
+ virtual void operator() (const Option& option, const std::string& opt, const std::string& val, const OptionParser& parser) = 0;
+ virtual ~Callback() {}
+};
+
+}
+
+#endif
diff --git a/tools/pbindex/src/PbIndex.cpp b/tools/pbindex/src/PbIndex.cpp
new file mode 100644
index 0000000..ca8a234
--- /dev/null
+++ b/tools/pbindex/src/PbIndex.cpp
@@ -0,0 +1,78 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "PbIndex.h"
+#include <pbbam/BamFile.h>
+#include <pbbam/PbiRawData.h>
+#include <iostream>
+#include <cassert>
+#include <cstdlib>
+using namespace pbindex;
+using namespace std;
+
+Settings::Settings(void)
+ : printPbiContents_(false)
+{ }
+
+int PbIndex::Create(const Settings& settings)
+{
+ try
+ {
+ PacBio::BAM::BamFile bamFile(settings.inputBamFilename_);
+ bamFile.EnsurePacBioIndexExists();
+ return EXIT_SUCCESS;
+ }
+ catch (std::runtime_error& e)
+ {
+ cerr << "pbindex ERROR: " << e.what() << endl;
+ return EXIT_FAILURE;
+ }
+}
+
+//int PbIndex::Print(const Settings& settings)
+//{
+
+//}
+
+int PbIndex::Run(const Settings& settings)
+{
+// if (settings.printPbiContents_)
+// return Print(settings);
+// else
+ return Create(settings);
+}
+
diff --git a/tools/pbindex/src/PbIndex.h b/tools/pbindex/src/PbIndex.h
new file mode 100644
index 0000000..05bdf6d
--- /dev/null
+++ b/tools/pbindex/src/PbIndex.h
@@ -0,0 +1,70 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef PBINDEX_H
+#define PBINDEX_H
+
+#include <string>
+#include <vector>
+
+namespace pbindex {
+
+class Settings
+{
+public:
+ Settings(void);
+
+public:
+
+public:
+ std::string inputBamFilename_;
+ bool printPbiContents_;
+ std::vector<std::string> errors_;
+};
+
+class PbIndex
+{
+public:
+ static int Run(const Settings& settings);
+private:
+ static int Create(const Settings& settings);
+// static int Print(const Settings& settings);
+};
+
+} // namespace pbindex
+
+#endif // PBINDEX_H
diff --git a/tools/pbindex/src/PbIndexVersion.h.in b/tools/pbindex/src/PbIndexVersion.h.in
new file mode 100644
index 0000000..9faf96d
--- /dev/null
+++ b/tools/pbindex/src/PbIndexVersion.h.in
@@ -0,0 +1,49 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#ifndef PBINDEXVERSION_H
+#define PBINDEXVERSION_H
+
+#include <string>
+
+namespace pbindex {
+
+const std::string Version = std::string("@PbIndex_VERSION@");
+
+} // namespace pbindex
+
+#endif // PBINDEXVERSION_H
diff --git a/tools/pbindex/src/main.cpp b/tools/pbindex/src/main.cpp
new file mode 100644
index 0000000..59065fa
--- /dev/null
+++ b/tools/pbindex/src/main.cpp
@@ -0,0 +1,102 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of Pacific Biosciences nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+// Author: Derek Barnett
+
+#include "OptionParser.h"
+#include "PbIndex.h"
+#include "PbIndexVersion.h"
+#include <cassert>
+#include <iostream>
+using namespace std;
+
+static
+pbindex::Settings fromCommandLine(optparse::OptionParser& parser,
+ int argc, char* argv[])
+{
+ const optparse::Values options = parser.parse_args(argc, argv);
+ (void)options;
+
+ pbindex::Settings settings;
+
+ // get input filename
+ const vector<string> positionalArgs = parser.args();
+ const size_t numPositionalArgs = positionalArgs.size();
+ if (numPositionalArgs == 0)
+ settings.errors_.push_back("pbindex requires an input BAM filename");
+ else if (numPositionalArgs == 1)
+ settings.inputBamFilename_ = parser.args().front();
+ else {
+ assert(numPositionalArgs > 1);
+ settings.errors_.push_back("pbindex does not support more than one input file per run");
+ }
+
+ return settings;
+}
+
+int main(int argc, char* argv[])
+{
+ // setup help & options
+ optparse::OptionParser parser;
+ parser.description("pbindex creates a index file that enables random-access to PacBio-specific data in BAM files. "
+ "Generated index filename will be the same as input BAM plus .pbi suffix."
+ );
+ parser.prog("pbindex");
+ parser.usage("pbindex <input>");
+ parser.version(pbindex::Version);
+ parser.add_version_option(true);
+ parser.add_help_option(true);
+
+ auto ioGroup = optparse::OptionGroup(parser, "Input/Output");
+ ioGroup.add_option("")
+ .dest("input")
+ .metavar("input")
+ .help("Input BAM file");
+ parser.add_option_group(ioGroup);
+
+ // parse command line for settings
+ const pbindex::Settings settings = fromCommandLine(parser, argc, argv);
+ if (!settings.errors_.empty()) {
+ cerr << endl;
+ for (const auto e : settings.errors_)
+ cerr << "ERROR: " << e << endl;
+ cerr << endl;
+ parser.print_help();
+ return EXIT_FAILURE;
+ }
+
+ // run tool
+ return pbindex::PbIndex::Run(settings);
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/pbbam.git
More information about the debian-med-commit
mailing list