From 2af56dd7e54b720ee78260dedc0b2bd6e442dfae Mon Sep 17 00:00:00 2001 From: Andreas Tille Date: Sun, 4 Aug 2019 20:16:32 +0100 Subject: [PATCH] Import pbbam_0.23.0+dfsg.orig.tar.xz [dgit import orig pbbam_0.23.0+dfsg.orig.tar.xz] --- .clang-format | 13 + .gitignore | 87 + .travis.yml | 61 + CHANGELOG.md | 549 + INSTALL.md | 3 + LICENSE.txt | 34 + README.md | 62 + bamboo_build.sh | 54 + docs/Doxyfile.in | 1602 +++ docs/Makefile | 168 + docs/examples/code/BarcodeQuery.txt | 17 + docs/examples/code/Compare.txt | 3 + docs/examples/code/Compare_AlignedEnd.txt | 2 + docs/examples/code/Compare_AlignedStart.txt | 2 + docs/examples/code/Compare_AlignedStrand.txt | 2 + docs/examples/code/Compare_BarcodeForward.txt | 2 + docs/examples/code/Compare_BarcodeQuality.txt | 2 + docs/examples/code/Compare_BarcodeReverse.txt | 2 + docs/examples/code/Compare_FullName.txt | 2 + .../code/Compare_LocalContextFlag.txt | 2 + docs/examples/code/Compare_MapQuality.txt | 2 + docs/examples/code/Compare_MovieName.txt | 2 + .../examples/code/Compare_NumDeletedBases.txt | 2 + .../code/Compare_NumInsertedBases.txt | 2 + docs/examples/code/Compare_NumMatches.txt | 2 + docs/examples/code/Compare_NumMismatches.txt | 2 + docs/examples/code/Compare_QueryEnd.txt | 2 + docs/examples/code/Compare_QueryStart.txt | 2 + docs/examples/code/Compare_ReadAccuracy.txt | 2 + docs/examples/code/Compare_ReadGroupId.txt | 2 + .../code/Compare_ReadGroupNumericId.txt | 2 + docs/examples/code/Compare_ReferenceEnd.txt | 2 + docs/examples/code/Compare_ReferenceId.txt | 2 + docs/examples/code/Compare_ReferenceName.txt | 2 + docs/examples/code/Compare_ReferenceStart.txt | 2 + .../code/Compare_TypeFromOperator.txt | 2 + docs/examples/code/Compare_TypeToName.txt | 2 + docs/examples/code/Compare_Zmw.txt | 2 + docs/examples/code/EntireFileQuery.txt | 15 + .../code/EntireFileQuery_BamFilename.txt | 4 + .../code/EntireFileQuery_NonConst.txt | 4 + docs/examples/code/GenomicIntervalQuery.txt | 16 + .../code/GenomicIntervalQuery_Reuse.txt | 8 + docs/examples/code/PbiAlignedEndFilter.txt | 4 + docs/examples/code/PbiAlignedLengthFilter.txt | 4 + docs/examples/code/PbiAlignedStartFilter.txt | 4 + docs/examples/code/PbiAlignedStrandFilter.txt | 5 + docs/examples/code/PbiBarcodeFilter.txt | 17 + .../examples/code/PbiBarcodeForwardFilter.txt | 15 + .../examples/code/PbiBarcodeQualityFilter.txt | 5 + .../examples/code/PbiBarcodeReverseFilter.txt | 15 + docs/examples/code/PbiBarcodesFilter.txt | 6 + docs/examples/code/PbiBuilder_WithReader.txt | 30 + docs/examples/code/PbiBuilder_WithWriter.txt | 12 + docs/examples/code/PbiFilterQuery.txt | 22 + docs/examples/code/PbiFilter_Composition.txt | 8 + docs/examples/code/PbiFilter_CustomFilter.txt | 21 + docs/examples/code/PbiFilter_Interface.txt | 1 + docs/examples/code/PbiIdentityFilter.txt | 6 + docs/examples/code/PbiLocalContextFilter.txt | 22 + docs/examples/code/PbiMapQualityFilter.txt | 5 + docs/examples/code/PbiMovieNameFilter.txt | 14 + .../code/PbiNumDeletedBasesFilter.txt | 6 + .../code/PbiNumInsertedBasesFilter.txt | 6 + docs/examples/code/PbiNumMatchesFilter.txt | 6 + docs/examples/code/PbiNumMismatchesFilter.txt | 6 + docs/examples/code/PbiQueryEndFilter.txt | 5 + docs/examples/code/PbiQueryLengthFilter.txt | 5 + docs/examples/code/PbiQueryNameFilter.txt | 15 + docs/examples/code/PbiQueryStartFilter.txt | 5 + docs/examples/code/PbiReadAccuracyFilter.txt | 5 + docs/examples/code/PbiReadGroupFilter.txt | 64 + docs/examples/code/PbiReferenceEndFilter.txt | 5 + docs/examples/code/PbiReferenceIdFilter.txt | 16 + docs/examples/code/PbiReferenceNameFilter.txt | 15 + .../examples/code/PbiReferenceStartFilter.txt | 5 + docs/examples/code/PbiZmwFilter.txt | 16 + docs/examples/code/ReadAccuracyQuery.txt | 15 + docs/examples/code/SubreadLengthQuery.txt | 15 + docs/examples/code/Tag_AsciiCtor.txt | 10 + .../code/WhitelistedZmwReadStitcher.txt | 6 + docs/examples/code/ZmwGroupQuery.txt | 23 + docs/examples/code/ZmwQuery.txt | 6 + .../plaintext/AlignmentPrinterOutput.txt | 13 + .../plaintext/PbiFilter_DataSetXmlFilters.txt | 14 + docs/meson.build | 24 + docs/source/api/Accuracy.rst | 11 + docs/source/api/AlignmentPrinter.rst | 11 + docs/source/api/AlignmentSet.rst | 11 + docs/source/api/BaiIndexedBamReader.rst | 11 + docs/source/api/BamFile.rst | 11 + docs/source/api/BamHeader.rst | 11 + docs/source/api/BamReader.rst | 11 + docs/source/api/BamRecord.rst | 17 + docs/source/api/BamRecordBuilder.rst | 11 + docs/source/api/BamRecordImpl.rst | 11 + docs/source/api/BamRecordView.rst | 11 + docs/source/api/BamTagCodec.rst | 11 + docs/source/api/BamWriter.rst | 11 + docs/source/api/BarcodeQuery.rst | 11 + docs/source/api/BarcodeSet.rst | 11 + docs/source/api/Cigar.rst | 11 + docs/source/api/CigarOperation.rst | 13 + docs/source/api/Compare.rst | 8 + docs/source/api/Config.rst | 8 + docs/source/api/ConsensusAlignmentSet.rst | 11 + docs/source/api/ConsensusReadSet.rst | 11 + docs/source/api/ContigSet.rst | 11 + docs/source/api/DataSet.rst | 11 + docs/source/api/DataSetBase.rst | 11 + docs/source/api/DataSetMetadata.rst | 11 + docs/source/api/EntireFileQuery.rst | 11 + docs/source/api/ExtensionElement.rst | 11 + docs/source/api/Extensions.rst | 11 + docs/source/api/ExternalResource.rst | 11 + docs/source/api/ExternalResources.rst | 11 + docs/source/api/FileIndex.rst | 11 + docs/source/api/FileIndices.rst | 11 + docs/source/api/Filter.rst | 11 + docs/source/api/Filters.rst | 11 + docs/source/api/Frames.rst | 11 + docs/source/api/GenomicInterval.rst | 11 + .../api/GenomicIntervalCompositeBamReader.rst | 11 + docs/source/api/GenomicIntervalQuery.rst | 11 + docs/source/api/HdfSubreadSet.rst | 11 + docs/source/api/IndexResultBlock.rst | 17 + docs/source/api/IndexedFastaReader.rst | 11 + docs/source/api/Interval.rst | 11 + .../InvalidSequencingChemistryException.rst | 11 + docs/source/api/LocalContextFlags.rst | 8 + docs/source/api/NamespaceInfo.rst | 11 + docs/source/api/NamespaceRegistry.rst | 11 + docs/source/api/Orientation.rst | 8 + docs/source/api/ParentTool.rst | 11 + docs/source/api/PbiBuilder.rst | 11 + docs/source/api/PbiFile.rst | 14 + docs/source/api/PbiFilter.rst | 11 + .../api/PbiFilterCompositeBamReader.rst | 11 + docs/source/api/PbiFilterQuery.rst | 11 + docs/source/api/PbiFilterTypes.rst | 8 + docs/source/api/PbiIndexedBamReader.rst | 11 + docs/source/api/PbiRawBarcodeData.rst | 11 + docs/source/api/PbiRawBasicData.rst | 11 + docs/source/api/PbiRawData.rst | 11 + docs/source/api/PbiRawMappedData.rst | 11 + docs/source/api/PbiRawReferenceData.rst | 11 + docs/source/api/PbiReferenceEntry.rst | 11 + docs/source/api/Position.rst | 10 + docs/source/api/ProgramInfo.rst | 11 + docs/source/api/QNameQuery.rst | 11 + docs/source/api/QualityValue.rst | 11 + docs/source/api/QualityValues.rst | 11 + docs/source/api/ReadAccuracyQuery.rst | 11 + docs/source/api/ReadGroupInfo.rst | 21 + docs/source/api/ReferenceSet.rst | 11 + docs/source/api/SamTagCodec.rst | 11 + docs/source/api/SequenceInfo.rst | 11 + .../api/SequentialCompositeBamReader.rst | 11 + docs/source/api/Strand.rst | 8 + docs/source/api/SubDataSets.rst | 11 + docs/source/api/SubreadLengthQuery.rst | 11 + docs/source/api/SubreadSet.rst | 11 + docs/source/api/Tag.rst | 15 + docs/source/api/TagCollection.rst | 11 + .../source/api/VirtualPolymeraseBamRecord.rst | 11 + .../api/VirtualPolymeraseCompositeReader.rst | 11 + docs/source/api/VirtualPolymeraseReader.rst | 11 + docs/source/api/VirtualRegion.rst | 11 + docs/source/api/VirtualRegionType.rst | 8 + docs/source/api/VirtualRegionTypeMap.rst | 11 + docs/source/api/ZmwGroupQuery.rst | 11 + docs/source/api/ZmwQuery.rst | 11 + docs/source/api/ZmwWhitelistVirtualReader.rst | 11 + docs/source/api_reference.rst | 12 + docs/source/commandline_utilities.rst | 15 + docs/source/conf.py | 332 + docs/source/getting_started.rst | 105 + docs/source/index.rst | 33 + .../pacbio-theme/static/headerGradient.jpg | Bin 0 -> 7099 bytes docs/source/pacbio-theme/static/pacbio.css | 238 + .../source/pacbio-theme/static/pacbioLogo.png | Bin 0 -> 3128 bytes docs/source/pacbio-theme/static/pygments.css | 55 + docs/source/pacbio-theme/theme.conf | 4 + docs/source/requirements.txt | 1 + docs/source/tools/bam2sam.rst | 21 + docs/source/tools/pbindex.rst | 18 + docs/source/tools/pbindexdump.rst | 233 + docs/source/tools/pbmerge.rst | 30 + docs/specs/pbbam.rst | 630 + docs/specs/pbbam_structure.png | Bin 0 -> 23521 bytes docs/specs/pbbam_updated_release3_2.rst | 618 + include/meson.build | 139 + include/pbbam/Accuracy.h | 56 + include/pbbam/AlignmentPrinter.h | 76 + include/pbbam/BaiIndexedBamReader.h | 99 + include/pbbam/BamFile.h | 182 + include/pbbam/BamFileMerger.h | 58 + include/pbbam/BamHeader.h | 388 + include/pbbam/BamReader.h | 150 + include/pbbam/BamRecord.h | 1273 ++ include/pbbam/BamRecordBuilder.h | 243 + include/pbbam/BamRecordImpl.h | 590 + include/pbbam/BamRecordTag.h | 60 + include/pbbam/BamRecordView.h | 130 + include/pbbam/BamTagCodec.h | 90 + include/pbbam/BamWriter.h | 219 + include/pbbam/BarcodeQuery.h | 62 + include/pbbam/Cigar.h | 75 + include/pbbam/CigarOperation.h | 145 + include/pbbam/ClipType.h | 30 + include/pbbam/Compare.h | 466 + include/pbbam/CompositeBamReader.h | 277 + include/pbbam/CompositeFastaReader.h | 62 + include/pbbam/Config.h | 56 + include/pbbam/DataSet.h | 820 ++ include/pbbam/DataSetTypes.h | 1060 ++ include/pbbam/DataSetXsd.h | 120 + include/pbbam/EntireFileQuery.h | 62 + include/pbbam/FastaCache.h | 59 + include/pbbam/FastaReader.h | 76 + include/pbbam/FastaSequence.h | 66 + include/pbbam/FastaSequenceQuery.h | 50 + include/pbbam/FastaWriter.h | 44 + include/pbbam/FastqReader.h | 76 + include/pbbam/FastqSequence.h | 72 + include/pbbam/FastqWriter.h | 46 + include/pbbam/FrameEncodingType.h | 31 + include/pbbam/Frames.h | 145 + include/pbbam/GenomicInterval.h | 150 + include/pbbam/GenomicIntervalQuery.h | 88 + include/pbbam/IRecordWriter.h | 55 + include/pbbam/IndexedBamWriter.h | 156 + include/pbbam/IndexedFastaReader.h | 144 + include/pbbam/Interval.h | 121 + include/pbbam/LocalContextFlags.h | 45 + include/pbbam/MD5.h | 22 + include/pbbam/MakeUnique.h | 27 + include/pbbam/MoveAppend.h | 50 + include/pbbam/Orientation.h | 34 + include/pbbam/PbiBasicTypes.h | 81 + include/pbbam/PbiBuilder.h | 178 + include/pbbam/PbiFile.h | 108 + include/pbbam/PbiFilter.h | 247 + include/pbbam/PbiFilterQuery.h | 78 + include/pbbam/PbiFilterTypes.h | 902 ++ include/pbbam/PbiIndexedBamReader.h | 116 + include/pbbam/PbiRawData.h | 494 + include/pbbam/Position.h | 32 + include/pbbam/ProgramInfo.h | 182 + include/pbbam/PulseBehavior.h | 25 + include/pbbam/PulseExclusionReason.h | 28 + include/pbbam/QNameQuery.h | 57 + include/pbbam/QualityValue.h | 82 + include/pbbam/QualityValues.h | 132 + include/pbbam/ReadAccuracyQuery.h | 67 + include/pbbam/ReadGroupInfo.h | 715 + include/pbbam/RecordType.h | 54 + include/pbbam/SamTagCodec.h | 57 + include/pbbam/SamWriter.h | 96 + include/pbbam/SequenceInfo.h | 192 + include/pbbam/Strand.h | 27 + include/pbbam/StringUtilities.h | 42 + include/pbbam/SubreadLengthQuery.h | 65 + include/pbbam/Tag.h | 416 + include/pbbam/TagCollection.h | 33 + include/pbbam/Unused.h | 15 + include/pbbam/Validator.h | 153 + include/pbbam/ZmwGroupQuery.h | 59 + include/pbbam/ZmwQuery.h | 60 + include/pbbam/ZmwType.h | 28 + include/pbbam/ZmwTypeMap.h | 30 + .../BundleChemistryMappingException.h | 43 + .../InvalidSequencingChemistryException.h | 61 + include/pbbam/exception/ValidationException.h | 58 + include/pbbam/internal/Compare.inl | 43 + include/pbbam/internal/CompositeBamReader.inl | 348 + include/pbbam/internal/DataSetBaseTypes.h | 147 + include/pbbam/internal/DataSetElement.h | 211 + include/pbbam/internal/DataSetElement.inl | 409 + include/pbbam/internal/Interval.inl | 78 + include/pbbam/internal/PbiBasicTypes.inl | 28 + include/pbbam/internal/PbiFilter.inl | 241 + include/pbbam/internal/PbiFilterTypes.inl | 469 + include/pbbam/internal/QueryBase.h | 104 + include/pbbam/internal/QueryBase.inl | 122 + include/pbbam/vcf/VcfFile.h | 37 + include/pbbam/vcf/VcfFormat.h | 105 + include/pbbam/vcf/VcfHeader.h | 119 + include/pbbam/vcf/VcfHeaderTypes.h | 159 + include/pbbam/vcf/VcfQuery.h | 45 + include/pbbam/vcf/VcfReader.h | 50 + include/pbbam/vcf/VcfSort.h | 31 + include/pbbam/vcf/VcfVariant.h | 149 + include/pbbam/vcf/VcfWriter.h | 35 + .../virtual/VirtualPolymeraseBamRecord.h | 21 + .../VirtualPolymeraseCompositeReader.h | 21 + .../pbbam/virtual/VirtualPolymeraseReader.h | 21 + include/pbbam/virtual/VirtualRegion.h | 54 + include/pbbam/virtual/VirtualRegionType.h | 30 + include/pbbam/virtual/VirtualRegionTypeMap.h | 30 + include/pbbam/virtual/VirtualZmwBamRecord.h | 84 + .../virtual/WhitelistedZmwReadStitcher.h | 106 + include/pbbam/virtual/ZmwReadStitcher.h | 92 + .../pbbam/virtual/ZmwWhitelistVirtualReader.h | 21 + meson.build | 129 + meson_options.txt | 24 + scripts/ci/artifact.sh | 45 + scripts/ci/build.sh | 55 + scripts/ci/install.sh | 21 + scripts/ci/setup.sh | 45 + scripts/ci/test.sh | 25 + src/Accuracy.cpp | 39 + src/AlignmentPrinter.cpp | 132 + src/Autovalidate.h | 22 + src/BaiIndexedBamReader.cpp | 112 + src/BamFile.cpp | 201 + src/BamFileMerger.cpp | 260 + src/BamHeader.cpp | 452 + src/BamReader.cpp | 138 + src/BamRecord.cpp | 2345 ++++ src/BamRecordBuilder.cpp | 393 + src/BamRecordImpl.cpp | 841 ++ src/BamRecordTags.cpp | 66 + src/BamRecordTags.h | 55 + src/BamRecordView.cpp | 138 + src/BamTagCodec.cpp | 546 + src/BamWriter.cpp | 160 + src/BarcodeQuery.cpp | 41 + src/ChemistryTable.cpp | 176 + src/ChemistryTable.h | 22 + src/Cigar.cpp | 59 + src/CigarOperation.cpp | 112 + src/Compare.cpp | 110 + src/CompositeFastaReader.cpp | 42 + src/Config.cpp | 50 + src/DataSet.cpp | 608 + src/DataSetBaseTypes.cpp | 322 + src/DataSetElement.cpp | 20 + src/DataSetIO.cpp | 157 + src/DataSetIO.h | 33 + src/DataSetTypes.cpp | 975 ++ src/DataSetUtils.h | 70 + src/DataSetXsd.cpp | 215 + src/EntireFileQuery.cpp | 34 + src/EnumClassHash.h | 51 + src/FastaCache.cpp | 53 + src/FastaReader.cpp | 83 + src/FastaSequence.cpp | 39 + src/FastaSequenceQuery.cpp | 35 + src/FastaWriter.cpp | 38 + src/FastqReader.cpp | 84 + src/FastqSequence.cpp | 39 + src/FastqWriter.cpp | 62 + src/FileProducer.cpp | 38 + src/FileProducer.h | 54 + src/FileUtils.cpp | 203 + src/FileUtils.h | 106 + src/FofnReader.cpp | 22 + src/FofnReader.h | 23 + src/Frames.cpp | 165 + src/GenomicInterval.cpp | 146 + src/GenomicIntervalQuery.cpp | 53 + src/IRecordWriter.cpp | 19 + src/IndexedBamWriter.cpp | 1022 ++ src/IndexedFastaReader.cpp | 244 + src/MD5.cpp | 54 + src/MemoryUtils.cpp | 40 + src/MemoryUtils.h | 139 + src/PbbamInternalConfig.h | 18 + src/PbiBuilder.cpp | 661 + src/PbiFile.cpp | 37 + src/PbiFilter.cpp | 497 + src/PbiFilterQuery.cpp | 59 + src/PbiFilterTypes.cpp | 496 + src/PbiIndexIO.cpp | 387 + src/PbiIndexIO.h | 113 + src/PbiIndexedBamReader.cpp | 192 + src/PbiRawData.cpp | 359 + src/ProgramInfo.cpp | 156 + src/Pulse2BaseCache.h | 108 + src/QNameQuery.cpp | 75 + src/QualityValue.cpp | 41 + src/QualityValues.cpp | 119 + src/ReadAccuracyQuery.cpp | 44 + src/ReadGroupInfo.cpp | 916 ++ src/RecordType.cpp | 45 + src/SamTagCodec.cpp | 336 + src/SamWriter.cpp | 110 + src/SequenceInfo.cpp | 178 + src/SequenceUtils.h | 124 + src/StringUtilities.cpp | 48 + src/SubreadLengthQuery.cpp | 46 + src/Tag.cpp | 403 + src/TagCollection.cpp | 17 + src/TimeUtils.h | 71 + src/ValidationErrors.cpp | 74 + src/ValidationErrors.h | 63 + src/ValidationException.cpp | 74 + src/Validator.cpp | 407 + src/Version.cpp | 51 + src/Version.h | 147 + src/VirtualRegion.cpp | 51 + src/VirtualRegionTypeMap.cpp | 22 + src/VirtualStitching.h | 68 + src/VirtualZmwBamRecord.cpp | 294 + src/VirtualZmwCompositeReader.cpp | 75 + src/VirtualZmwCompositeReader.h | 76 + src/VirtualZmwReader.cpp | 108 + src/VirtualZmwReader.h | 89 + src/WhitelistedZmwReadStitcher.cpp | 140 + src/XmlReader.cpp | 229 + src/XmlReader.h | 23 + src/XmlWriter.cpp | 159 + src/XmlWriter.h | 24 + src/ZmwGroupQuery.cpp | 79 + src/ZmwQuery.cpp | 41 + src/ZmwReadStitcher.cpp | 140 + src/ZmwTypeMap.cpp | 25 + src/meson.build | 129 + src/pugixml/pugiconfig.hpp | 71 + src/pugixml/pugixml.cpp | 11539 ++++++++++++++++ src/pugixml/pugixml.hpp | 1366 ++ src/vcf/VcfFile.cpp | 30 + src/vcf/VcfFormat.cpp | 549 + src/vcf/VcfHeader.cpp | 229 + src/vcf/VcfHeaderTypes.cpp | 224 + src/vcf/VcfQuery.cpp | 18 + src/vcf/VcfReader.cpp | 40 + src/vcf/VcfSort.cpp | 56 + src/vcf/VcfVariant.cpp | 253 + src/vcf/VcfWriter.cpp | 48 + subprojects/gtest.wrap | 10 + tests/data/aligned.bam | Bin 0 -> 786 bytes tests/data/aligned.bam.bai | Bin 0 -> 96 bytes tests/data/aligned.bam.pbi | Bin 0 -> 168 bytes tests/data/aligned.sam | 8 + tests/data/aligned2.bam | Bin 0 -> 22511 bytes tests/data/aligned2.bam.bai | Bin 0 -> 96 bytes tests/data/aligned2.bam.pbi | Bin 0 -> 366 bytes tests/data/barcoded_read_groups.bam | Bin 0 -> 498 bytes tests/data/barcoded_read_groups.bam.pbi | Bin 0 -> 126 bytes tests/data/chemistry.xml | 9 + tests/data/chimera_minimal.fasta | 220 + tests/data/chunking/chunking.subreadset.xml | 65 + ...000001823174110291514_s1_p0.1.subreads.bam | Bin 0 -> 1090276 bytes ...01823174110291514_s1_p0.1.subreads.bam.pbi | Bin 0 -> 4163 bytes ...000001823174110291514_s1_p0.2.subreads.bam | Bin 0 -> 980379 bytes ...01823174110291514_s1_p0.2.subreads.bam.pbi | Bin 0 -> 3933 bytes ...000001823174110291514_s1_p0.3.subreads.bam | Bin 0 -> 973029 bytes ...01823174110291514_s1_p0.3.subreads.bam.pbi | Bin 0 -> 3698 bytes tests/data/clip_to_query.bam | Bin 0 -> 511 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.pbi | Bin 0 -> 2469 bytes tests/data/dataset/bam_mapping_1.bam | Bin 0 -> 167530 bytes tests/data/dataset/bam_mapping_1.bam.pbi | Bin 0 -> 2448 bytes tests/data/dataset/bam_mapping_2.bam | Bin 0 -> 165778 bytes tests/data/dataset/bam_mapping_2.bam.pbi | Bin 0 -> 2435 bytes tests/data/dataset/bam_mapping_new.bam | Bin 0 -> 22428 bytes tests/data/dataset/bam_mapping_new.bam.pbi | Bin 0 -> 362 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/lambda_contigs.xml | 6 + tests/data/dataset/malformed.xml | 85 + 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 + .../transformed_rs_subread_dataset.xml | 75 + tests/data/empty.bam | Bin 0 -> 350 bytes tests/data/empty.bam.pbi | Bin 0 -> 67 bytes tests/data/group/group.fofn.in | 3 + tests/data/group/test1.bam | Bin 0 -> 2186 bytes tests/data/group/test2.bam | Bin 0 -> 13025 bytes tests/data/group/test2.bam.pbi | Bin 0 -> 199 bytes tests/data/group/test3.bam | Bin 0 -> 19332 bytes tests/data/lambdaNEB.fa | 608 + tests/data/lambdaNEB.fa.fai | 1 + tests/data/long-cigar-1.7.bam | Bin 0 -> 191942 bytes tests/data/long_reads.bam | Bin 0 -> 2592334 bytes tests/data/merge.fofn | 2 + tests/data/pbbamify/input-aligned-1.bam | Bin 0 -> 571 bytes tests/data/pbbamify/input-aligned-2.bam | Bin 0 -> 510 bytes tests/data/pbbamify/input-aligned-3.bam | Bin 0 -> 267 bytes tests/data/pbbamify/input-aligned-all.bam | Bin 0 -> 725 bytes tests/data/pbbamify/synthetic-ref-1.fa | 2 + tests/data/pbbamify/synthetic-ref-1.fa.fai | 1 + .../pbbamify/synthetic_movie_1.subreads.bam | Bin 0 -> 815 bytes .../synthetic_movie_1.subreads.bam.bai | Bin 0 -> 16 bytes .../synthetic_movie_1.subreads.bam.pbi | Bin 0 -> 112 bytes .../pbbamify/synthetic_movie_2.subreads.bam | Bin 0 -> 832 bytes .../synthetic_movie_2.subreads.bam.bai | Bin 0 -> 16 bytes .../synthetic_movie_2.subreads.bam.pbi | Bin 0 -> 106 bytes .../pbbamify/synthetic_movie_3.subreads.bam | Bin 0 -> 533 bytes .../synthetic_movie_3.subreads.bam.bai | Bin 0 -> 16 bytes .../synthetic_movie_3.subreads.bam.pbi | Bin 0 -> 90 bytes .../synthetic_movie_all.subreadset.xml.in | 27 + tests/data/phi29.bam | Bin 0 -> 71653 bytes tests/data/phi29.bam.pbi | Bin 0 -> 1394 bytes .../consolidate.subread.dataset.xml | 38 + .../filtered_resources.subread.dataset.xml | 67 + tests/data/polymerase/internal.hqregions.bam | Bin 0 -> 84188 bytes .../polymerase/internal.hqregions.bam.pbi | Bin 0 -> 95 bytes tests/data/polymerase/internal.lqregions.bam | Bin 0 -> 53115 bytes .../polymerase/internal.lqregions.bam.pbi | Bin 0 -> 110 bytes tests/data/polymerase/internal.polymerase.bam | Bin 0 -> 400570 bytes .../polymerase/internal.polymerase.bam.pbi | Bin 0 -> 116 bytes tests/data/polymerase/internal.scraps.bam | Bin 0 -> 203276 bytes tests/data/polymerase/internal.scraps.bam.pbi | Bin 0 -> 447 bytes tests/data/polymerase/internal.subreads.bam | Bin 0 -> 218924 bytes .../data/polymerase/internal.subreads.bam.pbi | Bin 0 -> 281 bytes .../multiple_resources.subread.dataset.xml | 46 + .../data/polymerase/production.polymerase.bam | Bin 0 -> 25082 bytes tests/data/polymerase/production.scraps.bam | Bin 0 -> 13535 bytes .../data/polymerase/production.scraps.bam.pbi | Bin 0 -> 284 bytes tests/data/polymerase/production.subreads.bam | Bin 0 -> 14659 bytes .../polymerase/production.subreads.bam.pbi | Bin 0 -> 188 bytes .../polymerase/production_hq.hqregion.bam | Bin 0 -> 15803 bytes .../polymerase/production_hq.hqregion.bam.pbi | Bin 0 -> 91 bytes .../data/polymerase/production_hq.scraps.bam | Bin 0 -> 10070 bytes .../polymerase/production_hq.scraps.bam.pbi | Bin 0 -> 104 bytes .../qnameFiltered.subreads.dataset.xml | 37 + tests/data/polymerase/qname_whitelist.txt | 3 + tests/data/polymerase/scrapless.scraps.bam | Bin 0 -> 436 bytes .../data/polymerase/scrapless.scraps.bam.pbi | Bin 0 -> 65 bytes tests/data/polymerase/scrapless.subreads.bam | Bin 0 -> 33466 bytes .../polymerase/scrapless.subreads.bam.pbi | Bin 0 -> 114 bytes tests/data/referenceset.xml | 21 + tests/data/refskip.bam | Bin 0 -> 186891 bytes tests/data/relative/a/test.bam | Bin 0 -> 462 bytes tests/data/relative/b/test1.bam | Bin 0 -> 462 bytes tests/data/relative/b/test2.bam | Bin 0 -> 462 bytes tests/data/relative/relative.fofn | 3 + tests/data/relative/relative.xml | 8 + tests/data/relative/relative2.fofn | 4 + tests/data/segfault.bam | Bin 0 -> 425 bytes tests/data/softclip_deletions.bam | Bin 0 -> 2240 bytes tests/data/stitching/test_qstart.scraps.bam | Bin 0 -> 962 bytes .../data/stitching/test_qstart.scraps.bam.pbi | Bin 0 -> 118 bytes tests/data/stitching/test_qstart.subreads.bam | Bin 0 -> 3600 bytes .../stitching/test_qstart.subreads.bam.pbi | Bin 0 -> 131 bytes .../adjacent_intervals.alignmentset.xml | 31 + .../contig_name_only.alignmentset.xml | 22 + .../disjoint_intervals.alignmentset.xml | 31 + .../empty.alignmentset.xml | 24 + .../invalid_missing_rname.alignmentset.xml | 23 + .../invalid_rname_operator.alignmentset.xml | 24 + .../invalid_tstart_operator.alignmentset.xml | 24 + .../no_filter.alignmentset.xml | 15 + .../out_of_range.alignmentset.xml | 24 + .../single_interval.alignmentset.xml | 24 + .../single_interval_end_gte.alignmentset.xml | 24 + ...single_interval_start_lte.alignmentset.xml | 24 + .../test_GenomicIntervals/test_contigs.bam | Bin 0 -> 282 bytes .../test_contigs.bam.pbi | Bin 0 -> 79 bytes .../test_GenomicIntervals/test_contigs.fasta | 4 + .../two_contigs.alignmentset.xml | 31 + .../whole_contig.alignmentset.xml | 24 + tests/data/test_group_query/group.fofn.in | 3 + tests/data/test_group_query/test1.bam | Bin 0 -> 2168 bytes tests/data/test_group_query/test2.bam | Bin 0 -> 13008 bytes tests/data/test_group_query/test2.bam.pbi | Bin 0 -> 197 bytes tests/data/test_group_query/test3.bam | Bin 0 -> 19294 bytes .../windows.fasta | 14 + .../windows.fastq | 4 + tests/data/transcript.subreads.bam | Bin 0 -> 330 bytes tests/data/transcript.subreads.bam.pbi | Bin 0 -> 107 bytes tests/data/transcriptset.xml | 21 + tests/data/unmap1.bam | Bin 0 -> 484 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/data/vcf/structural_variants.vcf | 32 + tests/data/vcf/unsorted.vcf | 12 + tests/meson.build | 70 + tests/scripts/generate_data.py | 188 + tests/src/PbbamTestData.h.in | 23 + tests/src/cram/bam2sam.t.in | 63 + tests/src/cram/pbbamify.t.in | 159 + tests/src/cram/pbindexdump_cpp.t.in | 39 + tests/src/cram/pbindexdump_json.t.in | 83 + tests/src/cram/pbmerge_aligned_ordering.t.in | 197 + tests/src/cram/pbmerge_dataset.t.in | 144 + tests/src/cram/pbmerge_fofn.t.in | 120 + tests/src/cram/pbmerge_mixed_ordering.t.in | 57 + tests/src/cram/pbmerge_pacbio_ordering.t.in | 457 + tests/src/meson.build | 70 + tests/src/test_Accuracy.cpp | 25 + tests/src/test_AlignmentPrinter.cpp | 120 + tests/src/test_BamFile.cpp | 105 + tests/src/test_BamHeader.cpp | 392 + tests/src/test_BamRecord.cpp | 2742 ++++ tests/src/test_BamRecordBuilder.cpp | 174 + tests/src/test_BamRecordClipping.cpp | 2401 ++++ tests/src/test_BamRecordImplCore.cpp | 597 + tests/src/test_BamRecordImplTags.cpp | 179 + tests/src/test_BamRecordImplVariableData.cpp | 4526 ++++++ tests/src/test_BamRecordMapping.cpp | 714 + tests/src/test_BamWriter.cpp | 113 + tests/src/test_BarcodeQuery.cpp | 17 + tests/src/test_Cigar.cpp | 165 + tests/src/test_Compare.cpp | 715 + tests/src/test_DataSetCore.cpp | 512 + tests/src/test_DataSetIO.cpp | 1741 +++ tests/src/test_DataSetQuery.cpp | 463 + tests/src/test_DataSetXsd.cpp | 155 + tests/src/test_EndToEnd.cpp | 206 + tests/src/test_EntireFileQuery.cpp | 106 + tests/src/test_Fasta.cpp | 223 + tests/src/test_Fastq.cpp | 236 + tests/src/test_FileUtils.cpp | 285 + tests/src/test_Frames.cpp | 46 + tests/src/test_GenomicIntervalQuery.cpp | 150 + tests/src/test_GenomicIntervals.cpp | 165 + tests/src/test_IndexedBamWriter.cpp | 125 + tests/src/test_IndexedFastaReader.cpp | 205 + tests/src/test_Intervals.cpp | 295 + tests/src/test_LongCigar.cpp | 125 + tests/src/test_PacBioIndex.cpp | 444 + tests/src/test_PbiFilter.cpp | 1323 ++ tests/src/test_PbiFilterQuery.cpp | 847 ++ tests/src/test_Pulse2BaseCache.cpp | 47 + tests/src/test_QNameQuery.cpp | 64 + tests/src/test_QualityValues.cpp | 88 + tests/src/test_ReadAccuracyQuery.cpp | 42 + tests/src/test_ReadGroupInfo.cpp | 335 + tests/src/test_SamWriter.cpp | 170 + tests/src/test_SequenceUtils.cpp | 80 + tests/src/test_StringUtils.cpp | 81 + tests/src/test_SubreadLengthQuery.cpp | 54 + tests/src/test_Tags.cpp | 1080 ++ tests/src/test_TimeUtils.cpp | 32 + tests/src/test_Validator.cpp | 573 + tests/src/test_VcfFile.cpp | 44 + tests/src/test_VcfFormat.cpp | 421 + tests/src/test_VcfHeader.cpp | 189 + tests/src/test_VcfQuery.cpp | 49 + tests/src/test_VcfReader.cpp | 51 + tests/src/test_VcfSort.cpp | 51 + tests/src/test_VcfVariant.cpp | 234 + tests/src/test_VcfWriter.cpp | 55 + tests/src/test_Version.cpp | 294 + tests/src/test_WhitelistedZmwReadStitcher.cpp | 220 + tests/src/test_ZmwQuery.cpp | 31 + tests/src/test_ZmwReadStitcher.cpp | 486 + tools/bam2sam/src/Bam2Sam.cpp | 80 + tools/bam2sam/src/Bam2Sam.h | 18 + tools/bam2sam/src/Bam2SamVersion.h.in | 14 + tools/bam2sam/src/Settings.h | 25 + tools/bam2sam/src/main.cpp | 87 + tools/check-formatting | 34 + tools/common/OptionParser.cpp | 555 + tools/common/OptionParser.h | 454 + tools/format-all | 9 + tools/git-clang-format | 485 + tools/meson.build | 238 + tools/pbbamify/src/PbBamify.cpp | 399 + tools/pbbamify/src/PbBamify.h | 94 + tools/pbbamify/src/PbBamifyVersion.h.in | 18 + tools/pbbamify/src/QueryLookup.cpp | 118 + tools/pbbamify/src/QueryLookup.h | 81 + tools/pbbamify/src/main.cpp | 176 + tools/pbindex/src/PbIndex.cpp | 40 + tools/pbindex/src/PbIndex.h | 35 + tools/pbindex/src/PbIndexVersion.h.in | 14 + tools/pbindex/src/main.cpp | 66 + tools/pbindexdump/src/CppFormatter.cpp | 159 + tools/pbindexdump/src/CppFormatter.h | 19 + tools/pbindexdump/src/IFormatter.h | 27 + tools/pbindexdump/src/JsonFormatter.cpp | 168 + tools/pbindexdump/src/JsonFormatter.h | 34 + tools/pbindexdump/src/PbIndexDump.cpp | 30 + tools/pbindexdump/src/PbIndexDump.h | 18 + tools/pbindexdump/src/PbIndexDumpVersion.h.in | 14 + tools/pbindexdump/src/Settings.h | 26 + tools/pbindexdump/src/json.hpp | 7296 ++++++++++ tools/pbindexdump/src/main.cpp | 108 + tools/pbmerge/src/PbMergeVersion.h.in | 14 + tools/pbmerge/src/main.cpp | 127 + 684 files changed, 98730 insertions(+) create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 INSTALL.md create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100755 bamboo_build.sh create mode 100644 docs/Doxyfile.in create mode 100644 docs/Makefile create mode 100644 docs/examples/code/BarcodeQuery.txt create mode 100644 docs/examples/code/Compare.txt create mode 100644 docs/examples/code/Compare_AlignedEnd.txt create mode 100644 docs/examples/code/Compare_AlignedStart.txt create mode 100644 docs/examples/code/Compare_AlignedStrand.txt create mode 100644 docs/examples/code/Compare_BarcodeForward.txt create mode 100644 docs/examples/code/Compare_BarcodeQuality.txt create mode 100644 docs/examples/code/Compare_BarcodeReverse.txt create mode 100644 docs/examples/code/Compare_FullName.txt create mode 100644 docs/examples/code/Compare_LocalContextFlag.txt create mode 100644 docs/examples/code/Compare_MapQuality.txt create mode 100644 docs/examples/code/Compare_MovieName.txt create mode 100644 docs/examples/code/Compare_NumDeletedBases.txt create mode 100644 docs/examples/code/Compare_NumInsertedBases.txt create mode 100644 docs/examples/code/Compare_NumMatches.txt create mode 100644 docs/examples/code/Compare_NumMismatches.txt create mode 100644 docs/examples/code/Compare_QueryEnd.txt create mode 100644 docs/examples/code/Compare_QueryStart.txt create mode 100644 docs/examples/code/Compare_ReadAccuracy.txt create mode 100644 docs/examples/code/Compare_ReadGroupId.txt create mode 100644 docs/examples/code/Compare_ReadGroupNumericId.txt create mode 100644 docs/examples/code/Compare_ReferenceEnd.txt create mode 100644 docs/examples/code/Compare_ReferenceId.txt create mode 100644 docs/examples/code/Compare_ReferenceName.txt create mode 100644 docs/examples/code/Compare_ReferenceStart.txt create mode 100644 docs/examples/code/Compare_TypeFromOperator.txt create mode 100644 docs/examples/code/Compare_TypeToName.txt create mode 100644 docs/examples/code/Compare_Zmw.txt create mode 100644 docs/examples/code/EntireFileQuery.txt create mode 100644 docs/examples/code/EntireFileQuery_BamFilename.txt create mode 100644 docs/examples/code/EntireFileQuery_NonConst.txt create mode 100644 docs/examples/code/GenomicIntervalQuery.txt create mode 100644 docs/examples/code/GenomicIntervalQuery_Reuse.txt create mode 100644 docs/examples/code/PbiAlignedEndFilter.txt create mode 100644 docs/examples/code/PbiAlignedLengthFilter.txt create mode 100644 docs/examples/code/PbiAlignedStartFilter.txt create mode 100644 docs/examples/code/PbiAlignedStrandFilter.txt create mode 100644 docs/examples/code/PbiBarcodeFilter.txt create mode 100644 docs/examples/code/PbiBarcodeForwardFilter.txt create mode 100644 docs/examples/code/PbiBarcodeQualityFilter.txt create mode 100644 docs/examples/code/PbiBarcodeReverseFilter.txt create mode 100644 docs/examples/code/PbiBarcodesFilter.txt create mode 100644 docs/examples/code/PbiBuilder_WithReader.txt create mode 100644 docs/examples/code/PbiBuilder_WithWriter.txt create mode 100644 docs/examples/code/PbiFilterQuery.txt create mode 100644 docs/examples/code/PbiFilter_Composition.txt create mode 100644 docs/examples/code/PbiFilter_CustomFilter.txt create mode 100644 docs/examples/code/PbiFilter_Interface.txt create mode 100644 docs/examples/code/PbiIdentityFilter.txt create mode 100644 docs/examples/code/PbiLocalContextFilter.txt create mode 100644 docs/examples/code/PbiMapQualityFilter.txt create mode 100644 docs/examples/code/PbiMovieNameFilter.txt create mode 100644 docs/examples/code/PbiNumDeletedBasesFilter.txt create mode 100644 docs/examples/code/PbiNumInsertedBasesFilter.txt create mode 100644 docs/examples/code/PbiNumMatchesFilter.txt create mode 100644 docs/examples/code/PbiNumMismatchesFilter.txt create mode 100644 docs/examples/code/PbiQueryEndFilter.txt create mode 100644 docs/examples/code/PbiQueryLengthFilter.txt create mode 100644 docs/examples/code/PbiQueryNameFilter.txt create mode 100644 docs/examples/code/PbiQueryStartFilter.txt create mode 100644 docs/examples/code/PbiReadAccuracyFilter.txt create mode 100644 docs/examples/code/PbiReadGroupFilter.txt create mode 100644 docs/examples/code/PbiReferenceEndFilter.txt create mode 100644 docs/examples/code/PbiReferenceIdFilter.txt create mode 100644 docs/examples/code/PbiReferenceNameFilter.txt create mode 100644 docs/examples/code/PbiReferenceStartFilter.txt create mode 100644 docs/examples/code/PbiZmwFilter.txt create mode 100644 docs/examples/code/ReadAccuracyQuery.txt create mode 100644 docs/examples/code/SubreadLengthQuery.txt create mode 100644 docs/examples/code/Tag_AsciiCtor.txt create mode 100644 docs/examples/code/WhitelistedZmwReadStitcher.txt create mode 100644 docs/examples/code/ZmwGroupQuery.txt create mode 100644 docs/examples/code/ZmwQuery.txt create mode 100644 docs/examples/plaintext/AlignmentPrinterOutput.txt create mode 100644 docs/examples/plaintext/PbiFilter_DataSetXmlFilters.txt create mode 100644 docs/meson.build create mode 100644 docs/source/api/Accuracy.rst create mode 100644 docs/source/api/AlignmentPrinter.rst create mode 100644 docs/source/api/AlignmentSet.rst create mode 100644 docs/source/api/BaiIndexedBamReader.rst create mode 100644 docs/source/api/BamFile.rst create mode 100644 docs/source/api/BamHeader.rst create mode 100644 docs/source/api/BamReader.rst create mode 100644 docs/source/api/BamRecord.rst create mode 100644 docs/source/api/BamRecordBuilder.rst create mode 100644 docs/source/api/BamRecordImpl.rst create mode 100644 docs/source/api/BamRecordView.rst create mode 100644 docs/source/api/BamTagCodec.rst create mode 100644 docs/source/api/BamWriter.rst create mode 100644 docs/source/api/BarcodeQuery.rst create mode 100644 docs/source/api/BarcodeSet.rst create mode 100644 docs/source/api/Cigar.rst create mode 100644 docs/source/api/CigarOperation.rst create mode 100644 docs/source/api/Compare.rst create mode 100644 docs/source/api/Config.rst create mode 100644 docs/source/api/ConsensusAlignmentSet.rst create mode 100644 docs/source/api/ConsensusReadSet.rst create mode 100644 docs/source/api/ContigSet.rst create mode 100644 docs/source/api/DataSet.rst create mode 100644 docs/source/api/DataSetBase.rst create mode 100644 docs/source/api/DataSetMetadata.rst create mode 100644 docs/source/api/EntireFileQuery.rst create mode 100644 docs/source/api/ExtensionElement.rst create mode 100644 docs/source/api/Extensions.rst create mode 100644 docs/source/api/ExternalResource.rst create mode 100644 docs/source/api/ExternalResources.rst create mode 100644 docs/source/api/FileIndex.rst create mode 100644 docs/source/api/FileIndices.rst create mode 100644 docs/source/api/Filter.rst create mode 100644 docs/source/api/Filters.rst create mode 100644 docs/source/api/Frames.rst create mode 100644 docs/source/api/GenomicInterval.rst create mode 100644 docs/source/api/GenomicIntervalCompositeBamReader.rst create mode 100644 docs/source/api/GenomicIntervalQuery.rst create mode 100644 docs/source/api/HdfSubreadSet.rst create mode 100644 docs/source/api/IndexResultBlock.rst create mode 100644 docs/source/api/IndexedFastaReader.rst create mode 100644 docs/source/api/Interval.rst create mode 100644 docs/source/api/InvalidSequencingChemistryException.rst create mode 100644 docs/source/api/LocalContextFlags.rst create mode 100644 docs/source/api/NamespaceInfo.rst create mode 100644 docs/source/api/NamespaceRegistry.rst create mode 100644 docs/source/api/Orientation.rst create mode 100644 docs/source/api/ParentTool.rst create mode 100644 docs/source/api/PbiBuilder.rst create mode 100644 docs/source/api/PbiFile.rst create mode 100644 docs/source/api/PbiFilter.rst create mode 100644 docs/source/api/PbiFilterCompositeBamReader.rst create mode 100644 docs/source/api/PbiFilterQuery.rst create mode 100644 docs/source/api/PbiFilterTypes.rst create mode 100644 docs/source/api/PbiIndexedBamReader.rst create mode 100644 docs/source/api/PbiRawBarcodeData.rst create mode 100644 docs/source/api/PbiRawBasicData.rst create mode 100644 docs/source/api/PbiRawData.rst create mode 100644 docs/source/api/PbiRawMappedData.rst create mode 100644 docs/source/api/PbiRawReferenceData.rst create mode 100644 docs/source/api/PbiReferenceEntry.rst create mode 100644 docs/source/api/Position.rst create mode 100644 docs/source/api/ProgramInfo.rst create mode 100644 docs/source/api/QNameQuery.rst create mode 100644 docs/source/api/QualityValue.rst create mode 100644 docs/source/api/QualityValues.rst create mode 100644 docs/source/api/ReadAccuracyQuery.rst create mode 100644 docs/source/api/ReadGroupInfo.rst create mode 100644 docs/source/api/ReferenceSet.rst create mode 100644 docs/source/api/SamTagCodec.rst create mode 100644 docs/source/api/SequenceInfo.rst create mode 100644 docs/source/api/SequentialCompositeBamReader.rst create mode 100644 docs/source/api/Strand.rst create mode 100644 docs/source/api/SubDataSets.rst create mode 100644 docs/source/api/SubreadLengthQuery.rst create mode 100644 docs/source/api/SubreadSet.rst create mode 100644 docs/source/api/Tag.rst create mode 100644 docs/source/api/TagCollection.rst create mode 100644 docs/source/api/VirtualPolymeraseBamRecord.rst create mode 100644 docs/source/api/VirtualPolymeraseCompositeReader.rst create mode 100644 docs/source/api/VirtualPolymeraseReader.rst create mode 100644 docs/source/api/VirtualRegion.rst create mode 100644 docs/source/api/VirtualRegionType.rst create mode 100644 docs/source/api/VirtualRegionTypeMap.rst create mode 100644 docs/source/api/ZmwGroupQuery.rst create mode 100644 docs/source/api/ZmwQuery.rst create mode 100644 docs/source/api/ZmwWhitelistVirtualReader.rst create mode 100644 docs/source/api_reference.rst create mode 100644 docs/source/commandline_utilities.rst create mode 100755 docs/source/conf.py create mode 100644 docs/source/getting_started.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/pacbio-theme/static/headerGradient.jpg create mode 100644 docs/source/pacbio-theme/static/pacbio.css create mode 100644 docs/source/pacbio-theme/static/pacbioLogo.png create mode 100644 docs/source/pacbio-theme/static/pygments.css create mode 100644 docs/source/pacbio-theme/theme.conf create mode 100644 docs/source/requirements.txt create mode 100644 docs/source/tools/bam2sam.rst create mode 100644 docs/source/tools/pbindex.rst create mode 100644 docs/source/tools/pbindexdump.rst create mode 100644 docs/source/tools/pbmerge.rst create mode 100644 docs/specs/pbbam.rst create mode 100755 docs/specs/pbbam_structure.png create mode 100755 docs/specs/pbbam_updated_release3_2.rst create mode 100644 include/meson.build create mode 100644 include/pbbam/Accuracy.h create mode 100644 include/pbbam/AlignmentPrinter.h create mode 100644 include/pbbam/BaiIndexedBamReader.h create mode 100644 include/pbbam/BamFile.h create mode 100644 include/pbbam/BamFileMerger.h create mode 100644 include/pbbam/BamHeader.h create mode 100644 include/pbbam/BamReader.h create mode 100644 include/pbbam/BamRecord.h create mode 100644 include/pbbam/BamRecordBuilder.h create mode 100644 include/pbbam/BamRecordImpl.h create mode 100644 include/pbbam/BamRecordTag.h create mode 100644 include/pbbam/BamRecordView.h create mode 100644 include/pbbam/BamTagCodec.h create mode 100644 include/pbbam/BamWriter.h create mode 100644 include/pbbam/BarcodeQuery.h create mode 100644 include/pbbam/Cigar.h create mode 100644 include/pbbam/CigarOperation.h create mode 100644 include/pbbam/ClipType.h create mode 100644 include/pbbam/Compare.h create mode 100644 include/pbbam/CompositeBamReader.h create mode 100644 include/pbbam/CompositeFastaReader.h create mode 100644 include/pbbam/Config.h create mode 100644 include/pbbam/DataSet.h create mode 100644 include/pbbam/DataSetTypes.h create mode 100644 include/pbbam/DataSetXsd.h create mode 100644 include/pbbam/EntireFileQuery.h create mode 100644 include/pbbam/FastaCache.h create mode 100644 include/pbbam/FastaReader.h create mode 100644 include/pbbam/FastaSequence.h create mode 100644 include/pbbam/FastaSequenceQuery.h create mode 100644 include/pbbam/FastaWriter.h create mode 100644 include/pbbam/FastqReader.h create mode 100644 include/pbbam/FastqSequence.h create mode 100644 include/pbbam/FastqWriter.h create mode 100644 include/pbbam/FrameEncodingType.h create mode 100644 include/pbbam/Frames.h create mode 100644 include/pbbam/GenomicInterval.h create mode 100644 include/pbbam/GenomicIntervalQuery.h create mode 100644 include/pbbam/IRecordWriter.h create mode 100644 include/pbbam/IndexedBamWriter.h create mode 100644 include/pbbam/IndexedFastaReader.h create mode 100644 include/pbbam/Interval.h create mode 100644 include/pbbam/LocalContextFlags.h create mode 100644 include/pbbam/MD5.h create mode 100644 include/pbbam/MakeUnique.h create mode 100644 include/pbbam/MoveAppend.h create mode 100644 include/pbbam/Orientation.h create mode 100644 include/pbbam/PbiBasicTypes.h create mode 100644 include/pbbam/PbiBuilder.h create mode 100644 include/pbbam/PbiFile.h create mode 100644 include/pbbam/PbiFilter.h create mode 100644 include/pbbam/PbiFilterQuery.h create mode 100644 include/pbbam/PbiFilterTypes.h create mode 100644 include/pbbam/PbiIndexedBamReader.h create mode 100644 include/pbbam/PbiRawData.h create mode 100644 include/pbbam/Position.h create mode 100644 include/pbbam/ProgramInfo.h create mode 100644 include/pbbam/PulseBehavior.h create mode 100644 include/pbbam/PulseExclusionReason.h create mode 100644 include/pbbam/QNameQuery.h create mode 100644 include/pbbam/QualityValue.h create mode 100644 include/pbbam/QualityValues.h create mode 100644 include/pbbam/ReadAccuracyQuery.h create mode 100644 include/pbbam/ReadGroupInfo.h create mode 100644 include/pbbam/RecordType.h create mode 100644 include/pbbam/SamTagCodec.h create mode 100644 include/pbbam/SamWriter.h create mode 100644 include/pbbam/SequenceInfo.h create mode 100644 include/pbbam/Strand.h create mode 100644 include/pbbam/StringUtilities.h create mode 100644 include/pbbam/SubreadLengthQuery.h create mode 100644 include/pbbam/Tag.h create mode 100644 include/pbbam/TagCollection.h create mode 100644 include/pbbam/Unused.h create mode 100644 include/pbbam/Validator.h create mode 100644 include/pbbam/ZmwGroupQuery.h create mode 100644 include/pbbam/ZmwQuery.h create mode 100644 include/pbbam/ZmwType.h create mode 100644 include/pbbam/ZmwTypeMap.h create mode 100644 include/pbbam/exception/BundleChemistryMappingException.h create mode 100644 include/pbbam/exception/InvalidSequencingChemistryException.h create mode 100644 include/pbbam/exception/ValidationException.h create mode 100644 include/pbbam/internal/Compare.inl create mode 100644 include/pbbam/internal/CompositeBamReader.inl create mode 100644 include/pbbam/internal/DataSetBaseTypes.h create mode 100644 include/pbbam/internal/DataSetElement.h create mode 100644 include/pbbam/internal/DataSetElement.inl create mode 100644 include/pbbam/internal/Interval.inl create mode 100644 include/pbbam/internal/PbiBasicTypes.inl create mode 100644 include/pbbam/internal/PbiFilter.inl create mode 100644 include/pbbam/internal/PbiFilterTypes.inl create mode 100644 include/pbbam/internal/QueryBase.h create mode 100644 include/pbbam/internal/QueryBase.inl create mode 100644 include/pbbam/vcf/VcfFile.h create mode 100644 include/pbbam/vcf/VcfFormat.h create mode 100644 include/pbbam/vcf/VcfHeader.h create mode 100644 include/pbbam/vcf/VcfHeaderTypes.h create mode 100644 include/pbbam/vcf/VcfQuery.h create mode 100644 include/pbbam/vcf/VcfReader.h create mode 100644 include/pbbam/vcf/VcfSort.h create mode 100644 include/pbbam/vcf/VcfVariant.h create mode 100644 include/pbbam/vcf/VcfWriter.h create mode 100644 include/pbbam/virtual/VirtualPolymeraseBamRecord.h create mode 100644 include/pbbam/virtual/VirtualPolymeraseCompositeReader.h create mode 100644 include/pbbam/virtual/VirtualPolymeraseReader.h create mode 100644 include/pbbam/virtual/VirtualRegion.h create mode 100644 include/pbbam/virtual/VirtualRegionType.h create mode 100644 include/pbbam/virtual/VirtualRegionTypeMap.h create mode 100644 include/pbbam/virtual/VirtualZmwBamRecord.h create mode 100644 include/pbbam/virtual/WhitelistedZmwReadStitcher.h create mode 100644 include/pbbam/virtual/ZmwReadStitcher.h create mode 100644 include/pbbam/virtual/ZmwWhitelistVirtualReader.h create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100755 scripts/ci/artifact.sh create mode 100755 scripts/ci/build.sh create mode 100755 scripts/ci/install.sh create mode 100755 scripts/ci/setup.sh create mode 100755 scripts/ci/test.sh create mode 100644 src/Accuracy.cpp create mode 100644 src/AlignmentPrinter.cpp create mode 100644 src/Autovalidate.h create mode 100644 src/BaiIndexedBamReader.cpp create mode 100644 src/BamFile.cpp create mode 100644 src/BamFileMerger.cpp create mode 100644 src/BamHeader.cpp create mode 100644 src/BamReader.cpp create mode 100644 src/BamRecord.cpp create mode 100644 src/BamRecordBuilder.cpp create mode 100644 src/BamRecordImpl.cpp create mode 100644 src/BamRecordTags.cpp create mode 100644 src/BamRecordTags.h create mode 100644 src/BamRecordView.cpp create mode 100644 src/BamTagCodec.cpp create mode 100644 src/BamWriter.cpp create mode 100644 src/BarcodeQuery.cpp create mode 100644 src/ChemistryTable.cpp create mode 100644 src/ChemistryTable.h create mode 100644 src/Cigar.cpp create mode 100644 src/CigarOperation.cpp create mode 100644 src/Compare.cpp create mode 100644 src/CompositeFastaReader.cpp create mode 100644 src/Config.cpp create mode 100644 src/DataSet.cpp create mode 100644 src/DataSetBaseTypes.cpp create mode 100644 src/DataSetElement.cpp create mode 100644 src/DataSetIO.cpp create mode 100644 src/DataSetIO.h create mode 100644 src/DataSetTypes.cpp create mode 100644 src/DataSetUtils.h create mode 100644 src/DataSetXsd.cpp create mode 100644 src/EntireFileQuery.cpp create mode 100644 src/EnumClassHash.h create mode 100644 src/FastaCache.cpp create mode 100644 src/FastaReader.cpp create mode 100644 src/FastaSequence.cpp create mode 100644 src/FastaSequenceQuery.cpp create mode 100644 src/FastaWriter.cpp create mode 100644 src/FastqReader.cpp create mode 100644 src/FastqSequence.cpp create mode 100644 src/FastqWriter.cpp create mode 100644 src/FileProducer.cpp create mode 100644 src/FileProducer.h create mode 100644 src/FileUtils.cpp create mode 100644 src/FileUtils.h create mode 100644 src/FofnReader.cpp create mode 100644 src/FofnReader.h create mode 100644 src/Frames.cpp create mode 100644 src/GenomicInterval.cpp create mode 100644 src/GenomicIntervalQuery.cpp create mode 100644 src/IRecordWriter.cpp create mode 100644 src/IndexedBamWriter.cpp create mode 100644 src/IndexedFastaReader.cpp create mode 100644 src/MD5.cpp create mode 100644 src/MemoryUtils.cpp create mode 100644 src/MemoryUtils.h create mode 100644 src/PbbamInternalConfig.h create mode 100644 src/PbiBuilder.cpp create mode 100644 src/PbiFile.cpp create mode 100644 src/PbiFilter.cpp create mode 100644 src/PbiFilterQuery.cpp create mode 100644 src/PbiFilterTypes.cpp create mode 100644 src/PbiIndexIO.cpp create mode 100644 src/PbiIndexIO.h create mode 100644 src/PbiIndexedBamReader.cpp create mode 100644 src/PbiRawData.cpp create mode 100644 src/ProgramInfo.cpp create mode 100644 src/Pulse2BaseCache.h create mode 100644 src/QNameQuery.cpp create mode 100644 src/QualityValue.cpp create mode 100644 src/QualityValues.cpp create mode 100644 src/ReadAccuracyQuery.cpp create mode 100644 src/ReadGroupInfo.cpp create mode 100644 src/RecordType.cpp create mode 100644 src/SamTagCodec.cpp create mode 100644 src/SamWriter.cpp create mode 100644 src/SequenceInfo.cpp create mode 100644 src/SequenceUtils.h create mode 100644 src/StringUtilities.cpp create mode 100644 src/SubreadLengthQuery.cpp create mode 100644 src/Tag.cpp create mode 100644 src/TagCollection.cpp create mode 100644 src/TimeUtils.h create mode 100644 src/ValidationErrors.cpp create mode 100644 src/ValidationErrors.h create mode 100644 src/ValidationException.cpp create mode 100644 src/Validator.cpp create mode 100644 src/Version.cpp create mode 100644 src/Version.h create mode 100644 src/VirtualRegion.cpp create mode 100644 src/VirtualRegionTypeMap.cpp create mode 100644 src/VirtualStitching.h create mode 100644 src/VirtualZmwBamRecord.cpp create mode 100644 src/VirtualZmwCompositeReader.cpp create mode 100644 src/VirtualZmwCompositeReader.h create mode 100644 src/VirtualZmwReader.cpp create mode 100644 src/VirtualZmwReader.h create mode 100644 src/WhitelistedZmwReadStitcher.cpp create mode 100644 src/XmlReader.cpp create mode 100644 src/XmlReader.h create mode 100644 src/XmlWriter.cpp create mode 100644 src/XmlWriter.h create mode 100644 src/ZmwGroupQuery.cpp create mode 100644 src/ZmwQuery.cpp create mode 100644 src/ZmwReadStitcher.cpp create mode 100644 src/ZmwTypeMap.cpp create mode 100644 src/meson.build create mode 100644 src/pugixml/pugiconfig.hpp create mode 100644 src/pugixml/pugixml.cpp create mode 100644 src/pugixml/pugixml.hpp create mode 100644 src/vcf/VcfFile.cpp create mode 100644 src/vcf/VcfFormat.cpp create mode 100644 src/vcf/VcfHeader.cpp create mode 100644 src/vcf/VcfHeaderTypes.cpp create mode 100644 src/vcf/VcfQuery.cpp create mode 100644 src/vcf/VcfReader.cpp create mode 100644 src/vcf/VcfSort.cpp create mode 100644 src/vcf/VcfVariant.cpp create mode 100644 src/vcf/VcfWriter.cpp create mode 100644 subprojects/gtest.wrap create mode 100644 tests/data/aligned.bam create mode 100644 tests/data/aligned.bam.bai create mode 100644 tests/data/aligned.bam.pbi create mode 100644 tests/data/aligned.sam create mode 100644 tests/data/aligned2.bam create mode 100644 tests/data/aligned2.bam.bai create mode 100644 tests/data/aligned2.bam.pbi create mode 100644 tests/data/barcoded_read_groups.bam create mode 100644 tests/data/barcoded_read_groups.bam.pbi create mode 100644 tests/data/chemistry.xml create mode 100644 tests/data/chimera_minimal.fasta create mode 100644 tests/data/chunking/chunking.subreadset.xml create mode 100644 tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.1.subreads.bam create mode 100644 tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.1.subreads.bam.pbi create mode 100644 tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.2.subreads.bam create mode 100644 tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.2.subreads.bam.pbi create mode 100644 tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.3.subreads.bam create mode 100644 tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.3.subreads.bam.pbi create mode 100644 tests/data/clip_to_query.bam create mode 100644 tests/data/dataset/ali1.xml create mode 100644 tests/data/dataset/ali2.xml create mode 100644 tests/data/dataset/ali3.xml create mode 100644 tests/data/dataset/ali4.xml create mode 100644 tests/data/dataset/bam_mapping.bam create mode 100644 tests/data/dataset/bam_mapping.bam.pbi create mode 100644 tests/data/dataset/bam_mapping_1.bam create mode 100644 tests/data/dataset/bam_mapping_1.bam.pbi create mode 100644 tests/data/dataset/bam_mapping_2.bam create mode 100644 tests/data/dataset/bam_mapping_2.bam.pbi create mode 100644 tests/data/dataset/bam_mapping_new.bam create mode 100644 tests/data/dataset/bam_mapping_new.bam.pbi create mode 100644 tests/data/dataset/bam_mapping_staggered.xml create mode 100644 tests/data/dataset/barcode.dataset.xml create mode 100644 tests/data/dataset/ccsread.dataset.xml create mode 100644 tests/data/dataset/lambda_contigs.xml create mode 100644 tests/data/dataset/malformed.xml create mode 100644 tests/data/dataset/pbalchemy10kbp.xml create mode 100644 tests/data/dataset/reference.dataset.xml create mode 100644 tests/data/dataset/subread_dataset1.xml create mode 100644 tests/data/dataset/subread_dataset2.xml create mode 100644 tests/data/dataset/subread_dataset3.xml create mode 100644 tests/data/dataset/transformed_rs_subread_dataset.xml create mode 100644 tests/data/empty.bam create mode 100644 tests/data/empty.bam.pbi create mode 100644 tests/data/group/group.fofn.in create mode 100644 tests/data/group/test1.bam create mode 100644 tests/data/group/test2.bam create mode 100644 tests/data/group/test2.bam.pbi create mode 100644 tests/data/group/test3.bam create mode 100644 tests/data/lambdaNEB.fa create mode 100644 tests/data/lambdaNEB.fa.fai create mode 100644 tests/data/long-cigar-1.7.bam create mode 100644 tests/data/long_reads.bam create mode 100644 tests/data/merge.fofn create mode 100644 tests/data/pbbamify/input-aligned-1.bam create mode 100644 tests/data/pbbamify/input-aligned-2.bam create mode 100644 tests/data/pbbamify/input-aligned-3.bam create mode 100644 tests/data/pbbamify/input-aligned-all.bam create mode 100644 tests/data/pbbamify/synthetic-ref-1.fa create mode 100644 tests/data/pbbamify/synthetic-ref-1.fa.fai create mode 100644 tests/data/pbbamify/synthetic_movie_1.subreads.bam create mode 100644 tests/data/pbbamify/synthetic_movie_1.subreads.bam.bai create mode 100644 tests/data/pbbamify/synthetic_movie_1.subreads.bam.pbi create mode 100644 tests/data/pbbamify/synthetic_movie_2.subreads.bam create mode 100644 tests/data/pbbamify/synthetic_movie_2.subreads.bam.bai create mode 100644 tests/data/pbbamify/synthetic_movie_2.subreads.bam.pbi create mode 100644 tests/data/pbbamify/synthetic_movie_3.subreads.bam create mode 100644 tests/data/pbbamify/synthetic_movie_3.subreads.bam.bai create mode 100644 tests/data/pbbamify/synthetic_movie_3.subreads.bam.pbi create mode 100644 tests/data/pbbamify/synthetic_movie_all.subreadset.xml.in create mode 100644 tests/data/phi29.bam create mode 100644 tests/data/phi29.bam.pbi create mode 100644 tests/data/polymerase/consolidate.subread.dataset.xml create mode 100644 tests/data/polymerase/filtered_resources.subread.dataset.xml create mode 100644 tests/data/polymerase/internal.hqregions.bam create mode 100644 tests/data/polymerase/internal.hqregions.bam.pbi create mode 100644 tests/data/polymerase/internal.lqregions.bam create mode 100644 tests/data/polymerase/internal.lqregions.bam.pbi create mode 100644 tests/data/polymerase/internal.polymerase.bam create mode 100644 tests/data/polymerase/internal.polymerase.bam.pbi create mode 100644 tests/data/polymerase/internal.scraps.bam create mode 100644 tests/data/polymerase/internal.scraps.bam.pbi create mode 100644 tests/data/polymerase/internal.subreads.bam create mode 100644 tests/data/polymerase/internal.subreads.bam.pbi create mode 100644 tests/data/polymerase/multiple_resources.subread.dataset.xml create mode 100644 tests/data/polymerase/production.polymerase.bam create mode 100644 tests/data/polymerase/production.scraps.bam create mode 100644 tests/data/polymerase/production.scraps.bam.pbi create mode 100644 tests/data/polymerase/production.subreads.bam create mode 100644 tests/data/polymerase/production.subreads.bam.pbi create mode 100644 tests/data/polymerase/production_hq.hqregion.bam create mode 100644 tests/data/polymerase/production_hq.hqregion.bam.pbi create mode 100644 tests/data/polymerase/production_hq.scraps.bam create mode 100644 tests/data/polymerase/production_hq.scraps.bam.pbi create mode 100644 tests/data/polymerase/qnameFiltered.subreads.dataset.xml create mode 100644 tests/data/polymerase/qname_whitelist.txt create mode 100644 tests/data/polymerase/scrapless.scraps.bam create mode 100644 tests/data/polymerase/scrapless.scraps.bam.pbi create mode 100644 tests/data/polymerase/scrapless.subreads.bam create mode 100644 tests/data/polymerase/scrapless.subreads.bam.pbi create mode 100644 tests/data/referenceset.xml create mode 100644 tests/data/refskip.bam create mode 100644 tests/data/relative/a/test.bam create mode 100644 tests/data/relative/b/test1.bam create mode 100644 tests/data/relative/b/test2.bam create mode 100644 tests/data/relative/relative.fofn create mode 100644 tests/data/relative/relative.xml create mode 100644 tests/data/relative/relative2.fofn create mode 100644 tests/data/segfault.bam create mode 100644 tests/data/softclip_deletions.bam create mode 100644 tests/data/stitching/test_qstart.scraps.bam create mode 100644 tests/data/stitching/test_qstart.scraps.bam.pbi create mode 100644 tests/data/stitching/test_qstart.subreads.bam create mode 100644 tests/data/stitching/test_qstart.subreads.bam.pbi create mode 100644 tests/data/test_GenomicIntervals/adjacent_intervals.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/contig_name_only.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/disjoint_intervals.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/empty.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/invalid_missing_rname.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/invalid_rname_operator.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/invalid_tstart_operator.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/no_filter.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/out_of_range.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/single_interval.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/single_interval_end_gte.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/single_interval_start_lte.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/test_contigs.bam create mode 100644 tests/data/test_GenomicIntervals/test_contigs.bam.pbi create mode 100644 tests/data/test_GenomicIntervals/test_contigs.fasta create mode 100644 tests/data/test_GenomicIntervals/two_contigs.alignmentset.xml create mode 100644 tests/data/test_GenomicIntervals/whole_contig.alignmentset.xml create mode 100644 tests/data/test_group_query/group.fofn.in create mode 100644 tests/data/test_group_query/test1.bam create mode 100644 tests/data/test_group_query/test2.bam create mode 100644 tests/data/test_group_query/test2.bam.pbi create mode 100644 tests/data/test_group_query/test3.bam create mode 100644 tests/data/test_windows_formatted_fasta/windows.fasta create mode 100644 tests/data/test_windows_formatted_fasta/windows.fastq create mode 100644 tests/data/transcript.subreads.bam create mode 100644 tests/data/transcript.subreads.bam.pbi create mode 100644 tests/data/transcriptset.xml create mode 100644 tests/data/unmap1.bam create mode 100644 tests/data/unmap1.bam.bai create mode 100644 tests/data/unmap2.bam create mode 100644 tests/data/unmap2.bam.bai create mode 100644 tests/data/vcf/structural_variants.vcf create mode 100644 tests/data/vcf/unsorted.vcf create mode 100644 tests/meson.build create mode 100755 tests/scripts/generate_data.py create mode 100644 tests/src/PbbamTestData.h.in create mode 100644 tests/src/cram/bam2sam.t.in create mode 100644 tests/src/cram/pbbamify.t.in create mode 100644 tests/src/cram/pbindexdump_cpp.t.in create mode 100644 tests/src/cram/pbindexdump_json.t.in create mode 100644 tests/src/cram/pbmerge_aligned_ordering.t.in create mode 100644 tests/src/cram/pbmerge_dataset.t.in create mode 100644 tests/src/cram/pbmerge_fofn.t.in create mode 100644 tests/src/cram/pbmerge_mixed_ordering.t.in create mode 100644 tests/src/cram/pbmerge_pacbio_ordering.t.in create mode 100644 tests/src/meson.build create mode 100644 tests/src/test_Accuracy.cpp create mode 100644 tests/src/test_AlignmentPrinter.cpp create mode 100644 tests/src/test_BamFile.cpp create mode 100644 tests/src/test_BamHeader.cpp create mode 100644 tests/src/test_BamRecord.cpp create mode 100644 tests/src/test_BamRecordBuilder.cpp create mode 100644 tests/src/test_BamRecordClipping.cpp create mode 100644 tests/src/test_BamRecordImplCore.cpp create mode 100644 tests/src/test_BamRecordImplTags.cpp create mode 100644 tests/src/test_BamRecordImplVariableData.cpp create mode 100644 tests/src/test_BamRecordMapping.cpp create mode 100644 tests/src/test_BamWriter.cpp create mode 100644 tests/src/test_BarcodeQuery.cpp create mode 100644 tests/src/test_Cigar.cpp create mode 100644 tests/src/test_Compare.cpp create mode 100644 tests/src/test_DataSetCore.cpp create mode 100644 tests/src/test_DataSetIO.cpp create mode 100644 tests/src/test_DataSetQuery.cpp create mode 100644 tests/src/test_DataSetXsd.cpp create mode 100644 tests/src/test_EndToEnd.cpp create mode 100644 tests/src/test_EntireFileQuery.cpp create mode 100644 tests/src/test_Fasta.cpp create mode 100644 tests/src/test_Fastq.cpp create mode 100644 tests/src/test_FileUtils.cpp create mode 100644 tests/src/test_Frames.cpp create mode 100644 tests/src/test_GenomicIntervalQuery.cpp create mode 100644 tests/src/test_GenomicIntervals.cpp create mode 100644 tests/src/test_IndexedBamWriter.cpp create mode 100644 tests/src/test_IndexedFastaReader.cpp create mode 100644 tests/src/test_Intervals.cpp create mode 100644 tests/src/test_LongCigar.cpp create mode 100644 tests/src/test_PacBioIndex.cpp create mode 100644 tests/src/test_PbiFilter.cpp create mode 100644 tests/src/test_PbiFilterQuery.cpp create mode 100644 tests/src/test_Pulse2BaseCache.cpp create mode 100644 tests/src/test_QNameQuery.cpp create mode 100644 tests/src/test_QualityValues.cpp create mode 100644 tests/src/test_ReadAccuracyQuery.cpp create mode 100644 tests/src/test_ReadGroupInfo.cpp create mode 100644 tests/src/test_SamWriter.cpp create mode 100644 tests/src/test_SequenceUtils.cpp create mode 100644 tests/src/test_StringUtils.cpp create mode 100644 tests/src/test_SubreadLengthQuery.cpp create mode 100644 tests/src/test_Tags.cpp create mode 100644 tests/src/test_TimeUtils.cpp create mode 100644 tests/src/test_Validator.cpp create mode 100644 tests/src/test_VcfFile.cpp create mode 100644 tests/src/test_VcfFormat.cpp create mode 100644 tests/src/test_VcfHeader.cpp create mode 100644 tests/src/test_VcfQuery.cpp create mode 100644 tests/src/test_VcfReader.cpp create mode 100644 tests/src/test_VcfSort.cpp create mode 100644 tests/src/test_VcfVariant.cpp create mode 100644 tests/src/test_VcfWriter.cpp create mode 100644 tests/src/test_Version.cpp create mode 100644 tests/src/test_WhitelistedZmwReadStitcher.cpp create mode 100644 tests/src/test_ZmwQuery.cpp create mode 100644 tests/src/test_ZmwReadStitcher.cpp create mode 100644 tools/bam2sam/src/Bam2Sam.cpp create mode 100644 tools/bam2sam/src/Bam2Sam.h create mode 100644 tools/bam2sam/src/Bam2SamVersion.h.in create mode 100644 tools/bam2sam/src/Settings.h create mode 100644 tools/bam2sam/src/main.cpp create mode 100755 tools/check-formatting create mode 100644 tools/common/OptionParser.cpp create mode 100644 tools/common/OptionParser.h create mode 100755 tools/format-all create mode 100755 tools/git-clang-format create mode 100644 tools/meson.build create mode 100644 tools/pbbamify/src/PbBamify.cpp create mode 100644 tools/pbbamify/src/PbBamify.h create mode 100644 tools/pbbamify/src/PbBamifyVersion.h.in create mode 100644 tools/pbbamify/src/QueryLookup.cpp create mode 100644 tools/pbbamify/src/QueryLookup.h create mode 100644 tools/pbbamify/src/main.cpp create mode 100644 tools/pbindex/src/PbIndex.cpp create mode 100644 tools/pbindex/src/PbIndex.h create mode 100644 tools/pbindex/src/PbIndexVersion.h.in create mode 100644 tools/pbindex/src/main.cpp create mode 100644 tools/pbindexdump/src/CppFormatter.cpp create mode 100644 tools/pbindexdump/src/CppFormatter.h create mode 100644 tools/pbindexdump/src/IFormatter.h create mode 100644 tools/pbindexdump/src/JsonFormatter.cpp create mode 100644 tools/pbindexdump/src/JsonFormatter.h create mode 100644 tools/pbindexdump/src/PbIndexDump.cpp create mode 100644 tools/pbindexdump/src/PbIndexDump.h create mode 100644 tools/pbindexdump/src/PbIndexDumpVersion.h.in create mode 100644 tools/pbindexdump/src/Settings.h create mode 100644 tools/pbindexdump/src/json.hpp create mode 100644 tools/pbindexdump/src/main.cpp create mode 100644 tools/pbmerge/src/PbMergeVersion.h.in create mode 100644 tools/pbmerge/src/main.cpp diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..1519f35 --- /dev/null +++ b/.clang-format @@ -0,0 +1,13 @@ +BasedOnStyle: Google +BreakBeforeBraces: Mozilla + +AllowShortLoopsOnASingleLine: false +AccessModifierOffset: -4 +BreakConstructorInitializersBeforeComma: true +ColumnLimit: 100 +IndentWidth: 4 +PointerAlignment: Left +TabWidth: 4 + +ReflowComments: false # protect ASCII art in comments +KeepEmptyLinesAtTheStartOfBlocks: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d4972ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,87 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +CMakeLists.txt.user + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +.vscode + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + +# Generated directories +bin +build +lib + +# Meson WrapDB stuff +subprojects/packagecache/ +subprojects/googletest* + +# generated Doxyfile +*Doxyfile diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..33b861e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,61 @@ +language: cpp +compiler: + - gcc + +before_install: + + # Travis's default installs of gcc, boost, & cmake currently lag behind the minimums we need. + # So we need to manually setup them up. + # + # - gcc 4.8 (current default on Travis is 4.7, which is no good for C++11 work) + # - boost 1.55 + # - cmake 3.x + + # add external repos + - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test # gcc + - sudo add-apt-repository -y ppa:boost-latest/ppa # boost + - sudo add-apt-repository -y ppa:george-edison55/precise-backports # cmake + + # remove existing cmake install + - sudo apt-get remove -qq cmake cmake-data + - sudo apt-get autoremove -qq + + # update apt + - sudo apt-get update -y -qq + + # install + - sudo apt-get install -y -qq g++-4.8 boost1.55 cmake-data cmake + + # make sure we're using new gcc tools + - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90 + - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 90 + - sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.8 90 + + # prep zlib + - sudo apt-get install -y -qq zlib1g-dev + + # prep GoogleTest + - sudo apt-get install -y -qq libgtest-dev + +before_script: + # run cmake + - mkdir build + - cd build + - cmake .. -DGTEST_SRC_DIR=/usr/src/gtest -DCMAKE_BUILD_TYPE=Debug + +script: + # build & test + - make -j 3 + - make test + +branches: + only: + - master + +notifications: + recipients: + - dbarnett@pacb.com + email: + on_success: change + on_failure: always + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..60a9a48 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,549 @@ +# 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 + +## [0.23.0] - 2019-03-11 + +### Added + - PbiIndexCache and FastaCache for reusing file data + - BaiIndexedBamReader and GenomicIntervalQuery can be constructed without + initial interval. + +## [0.22.0] - 2019-02-11 + +### Fixed + - Handles zero-length reads for stitching ZMW reads. + - Clipping to query on reverse-strand aligned reads. + - Removed UB in dataset API. + +### Added + - "exciseFlankingInserts" option for clipping reads w.r.t reference. + +## [0.21.0] - 2018-12-21 + +### Added + - New local context flags: ADAPTER_BEFORE_BAD and ADAPTER_AFTER_BAD. + +### Changed + - Current PacBioBAM spec now 3.0.7. + +### Removed + - CMake has been removed completely. + +## [0.20.0] - 2018-10-03 + +### Added + - Support for (optionally) barcode-labeled read group IDs. + +## [0.19.0] - 2018-09-11 + +### Added + - TranscriptAlignmentSet to XML support + +## [0.17.0] - 2018-03-18 + +### Added +- CompressionLevel/NumThreads parameter implementation to PbiBuilder. +- Dataset ctor to PbiFileQuery. +- TranscriptSet to XML support. +- Auto-enabled "permissive CIGAR mode" for pbbamify tool. +- IndexedBamWriter, for more efficient writing of BAM & PBI simultaneously. + +## [0.16.0] - 2018-01-17 + +### Removed +- Removed the PbiIndex class and its "lookup data"-related helpers. These were +never as useful as initially intended. PbiRawData and its related classes are the +recommended interface for working with PBI index data. + +## [0.15.0] - 2018-01-12 + +### Added +- Support for long CIGARs (>64K operations). + +## [0.14.0] - 2017-12-12 + +### Added +- Support for newer style QNAMEs. Recent version of htslib (1.4+) have started +adding extra null terminators to make the subsequent CIGAR section 32-bit aligned. + +### Changed +- Requirements for htslib version used. Must now be htslib v1.4+. + +## [0.13.2] - 2017-09-25 + +### Added +- Backward compatibility for C++11 (std::make_unique which is 11/14 agnostic). + +## [0.13.1] - 2017-09-25 + +### Added +- Support for "pe" tag in stitched, virtual reads. + +## [0.13.0] - 2017-09-25 + +### Changed +- Ran clang-tidy (modernize) over codebase to clean up legacy coding styles. + +## [0.12.2] - 2017-09-22 + +### Added +- HasPulseExclusion() to BamRecord (& derived types). + +## [0.12.1] - 2017-09-21 + +### Added +- Pulse exclusion base feature to read group. + +## [0.12.0] - 2017-09-19 + +### Added +- NumReads() for PBI filter-based queries. This allows fetching of the number +of reads that pass the filter, without needing to iterate over the entire +file(s). + +## [0.11.0] - 2017-09-15 + +### Added +- Support for internal tag: pulse exclusion reason ("pe"). New methods on +BamRecord, and new enum PulseExclusionReason. + +### Changed +- Default PacBioBAM format version now 3.0.5 + +## [0.10.2] - 2017-09-14 + +### Changed +- Explicitly trim all whitespace from FASTA input. + +## [0.10.1] - 2017-09-11 + +### Changed +- Frames, add mutex to avoid race condition in InitIpdDownsampling(void) + +## [0.10.0] - 2017-09-08 + +### Changed +- PbiBuilder backend for generating PBI index files "on-the-fly" along with +writing BAM files. The previous implementation's memory usage scaled linearly +with the number of reads, sometimes reaching huge numbers (several gigs or more). +The new implementation's memory usage remains constant for any number of reads, +without any runtime hit on files/architectures tested. + +### Removed +- PbiBuilder::Result(). Returned an intermediate snapshot of the index under +construction. This method isn't usable with the new PbiBuilder backend and was +really only useful for initial debugging/testing. It is no longer used in the +test framework and is unlikely to be used by client code either. Dropping this +method from the API, and thus bumping the version number. + +## [0.9.0] - 2017-08-07 + +### Removed +- Bundled htslib. Now using 'stock' htslib (v1.3.1+). +- Built-in SWIG wrappers. + +## [0.8.0] - 2017-07-24 + +### Added +- Default DataSet 'Version' attribute if none already present (currently 4.0.0) +- Added whitelist support for filtering ZMWs via DataSetXML. +- Added iterable query over FASTA files & ReferenceSet datasets. +- Added DataSet::AllFiles to access primary resources AND their child files (indices, +scraps, etc). + +### Fixed +- Bug in the build system preventing clean rebuilds. + +### Removed +- Dropped the bundled, PacBio-forked version of htslib. Now using stock htslib (v1.3.1+). + +## [0.7.4] - 2016-11-18 + +### Changed +- Compatibility for merging BAM files no longer requires exact match of PacBioBAM +version number (header @HD:pb tag). As long as both files meet the minimum +supported version number, the merge is allowed. + +## [0.7.3] - 2016-11-11 + +### Added +- Support for S/P2-C2 chemistry and forthcoming 4.0 basecaller + +## [0.7.2] - 2016-11-10 + +### Removed +- SAM header version equality check for merging BAM files. PacBioBAM version +number carries more meaning for PacBio data and thus will be the basis of +ensuring compatible merging. + +## [0.7.1] - 2016-11-09 + +### Added +- (Unindexed) FASTA reader & FastaSequence data structure. +- Missing unit tests for internal BAM tag access. +- Chemistry data for basecaller v3.3. +- Missing parsers for filtering barcode quality ("bq"), barcode forward ("bcf"), +and barcode reverse ("bcr") from DataSetXML. +- Integrated htslib into project. + +### Fixed +- Reverse complement on padding base. + +## [0.7.0] - 2016-09-26 + +### Added +- Clipping for CCS records + +### Fixed +- Cached position data leaking across records while iterating. +- Rolled back default pulse behavior in internal BAM API, to be backward- +compatible with existing client code (for now at least). v0.6.0 introduced +returning basecalled positions ONLY by default, rather than return ALL +pulses. +- Fixed crash when attempting to read from empty BAM/PBI files using the +PbiFilter-enabled APIs. + +## [0.6.0] - 2016-09-13 + +### Added +- BamWriter writes to a BAM file with the target name plus a ".tmp" suffix. On +successful completion (i.e. normal BamWriter destruction, not triggered by a +thrown exception) the file is renamed to the actual requested filename. +- PBI file creation follows the same temporary naming convention. +- Support for barcode pair (forward, reverse) in DataSetXML filter. +- Validation API & 'auto-validate' compile-time switch. +- Added support for a batched QNAME whitelist filter in DataSet XML. Uses (new) +Property name 'qname_file', with the value being the filepath containing the +whitelist. +- Exposed MD5 hashing to API. +- Ability to remove base features from a ReadGroupInfo object. +- Can construct an aggregate PbiRawData index object from a DataSet: essentially +concatenates all PBI data within the dataset. +- New SamWriter class to create SAM-formatted output of PacBio BAM data. +- Extended APIs for accessing "internal BAM" data, including PulseBehavior +switch for selecting between all pulses & basecalls only. + +### Fixed +- Improper 'clip to reference' product for BamRecord in some cases. +- Improper behavior in tag accessors (e.g. BamRecord::IPD()) on reverse strand- +aligned reads (bug 31339). +- Improper basecaller version parsing in ReadGroupInfo. + +### Changed +- RecordType::POLYMERASE renamed to RecordType::ZMW to reflect changes in +PacBio BAM spec v3.0.4 +- Refactored the 'virtual' reader classes - to match the new nomenclature, +and to combine the virtual reader & composite readers behind a shared +interface. The old class names still exist, as typedefs to the new ones, +and the interfaces are completely source-compatible - so as not to break +existing code. However, the old classes should be considered deprecated and +the new ones preferred. Below is the mapping of old -> new: + + VirtualPolymeraseBamRecord -> VirtualZmwBamRecord + VirtualPolymeraseReader -> ZmwReadStitcher + VirtualPolymeraseCompositeReader -> ZmwReadStitcher + ZmwWhitelistVirtualReader -> WhitelistedZmwReadStitcher + + +## [0.5.0] - 2016-02-22 + +### Added +- Platform model tag added to read group as RG::PM +- New scrap zmw type sz +- pbmerge accepts DataSetXML as input - using top-level resource BAMs as input, +applying filters, and generating a merged BAM. Also added FOFN support, instead +of listing out BAMs as command line args. +- PbiLocalContextFilter to allow filtering on subread local context. +- PbiBuilder: multithreading & zlib compression-level tuning for PBI output + +### Fixed +- Fixed mishandling of relative BAM filenames in the filename constructor for +DataSet (e.g. DataSet ds("../data.bam")). + +## [0.4.5] - 2016-01-14 + +### Changed +- PbiFilterQuery (and any other PBI-backed query, e.g. ZmwQuery ) now throws if +PBI file(s) missing insted of returning empty result. +- GenomicIntervalQuery now throws if BAI file(s) missing instead of returning +empty result. +- BamFile will throw if file is truncated (e.g. missing the EOF block). Disable +by defining PBBAM_NO_CHECK_EOF . + +## [0.4.4] - 2016-01-07 + +### Added +- bam2sam command line utility. The primary benefit is removing the dependency +on samtools during tests, but also provides users a functioning BAM -> SAM +converter in the absence of samtools. +- pbmerge command line utility. Allows merging N BAM files into one, optionally +creating the PBI file alongside. +- Added BamRecord::Pkmean2 & Pkmid2, 2D equivalent of Pkmean/Pkmid, for internal +BAMs. + +### Removed +- samtools dependency + +## [0.4.3] - 2015-12-22 + +### Added +- Compile using ccache by default, if available. Can be manually disabled using +-DPacBioBAM_use_ccache=OFF with cmake. +- pbindexdump: command-line utility that converts PBI file data into human- +readable formats. (JSON by default). + +### Changed +- CMake option PacBioBAM_build_pbindex is being deprecated. Use +PacBioBAM_build_tools instead. + +## [0.4.2] - 2015-12-22 + +### Changed +- BamFile::PacBioIndexExists & StandardIndexExists no longer check timestamps. +Copying/moving files around can yield timestamps that are not helpful (no longer +guaranteed that the .pbi will be "newer" than the .bam, even though no content +changed). Added methods (e.g. bool BamFile::PacBioIndexIsNewer()) to do that +lookup if needed, but it is no longer done automatically. + +## [0.4.1] - 2015-12-18 + +### Added +- BamRecord::HasNumPasses + +### Changed +- VirtualPolymeraseBamRecord::VirtualRegionsTable(type) returns an empty vector +of regions if none are associated with the requested type, instead of throwing. + +## [0.4.0] - 2015-12-15 + +### Changed +- Redesigned PbiFilter interface and backend. Previous implementation did not +scale well as intermediate results were far too unwieldy. This redesign provides +speedups of orders of magnitude in many cases. + +## [0.3.2] - 2015-12-10 + +### Added +- Support for ReadGroupInfo sequencing chemistry data. +InvalidSequencingChemistryException thrown if an unsupported combination is +encountered. +- VirtualPolymeraseCompositeReader - for re-stitching records, across multiple +resources (e.g. from DataSetXML). Reader respects DataSet filter criteria. + +## [0.3.1] - 2015-10-30 + +### Added +- ZmwWhitelistVirtualReader: similar to VirtualPolymeraseReader but restricts +iteration to a whitelist of ZMW hole numbers, leveraging PBI index data for +random-access. + +### Fixed +- Fixed error in PBI construction, in which entire file sections (e.g. +BarcodeData or MappedData) where being dropped when any one record lacked data. +Correct behavior is to allow file section ommission if all records lack that +data type. + +## [0.3.0] - 2015-10-29 + +### Fixed +- Improper reporting of current offset from multi-threaded BamWriter. This had +the effect of creating broken PBIs that were written alongside the BAM. Added a +flush step, which incurs a performance hit, but restores correctness. + +## [0.2.4] - 2015-10-26 + +### Fixed +- Empty PbiFilter now returns all records, instead of filtering away all records. + +## [0.2.3] - 2015-10-26 + +### Added/Fixed +- Syncing DataSetXML across APIs. Primary changes include output of Version +attribute ("3.0.1") on appropriate elements, as well as resolution of namespace +issues. + +## [0.2.2] - 2015-10-22 + +### Added +- Added BAI bin calculation to BamWriter::Write, to ensure maximal compatibility +with downstream tools (e.g. 'samtools index'). A new BinCalculationMode enum +flag in BamWriter constructor cotnrols whether this behavior is enabled[default] +or not. + +## [0.2.1] - 2015-10-19 + +### Added +- Exposed the following classes to public API: + - BamReader + - BaiIndexedBamReader + - PbiIndexedBamReader + - GenomicIntervalCompositeBamReader + - PbiFilterCompositeBamReader + +## [0.2.0] - 2015-10-09 + +### Changed +- BAM spec v3.0.1 compliance. Previous (betas) versions of the BAM spec are not +supported and will causean exception to be throw if encountered. +- PBI lookup interface & backend, see PbiIndex.h & PbiLookupData.h for details. + +### 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. +- Built-in PBI filters. See PbiFlter.h & PbiFilterTypes.h for built-in filters +and constructing composite filters. These can be used in conjunction with the +new PbiFilterQuery, which takes a generic PbiFilter and applies that to a +DataSet for iteration. +- New built-in queries: BarcodeQuery, ReadAccuracyQuery, SubreadLengthQuery. +These leverage the new filter API to construct a PbiFilter and apply to a +DataSet. +- Built-in BamRecord comparators that are STL-compatible. See Compare.h for full +list. This allows for statements like the following, which sorts records by ZMW +number: +``` c++ + vector data; + std::sort(data.begin(), data.end(), Compare::Zmw()); +``` +- "exciseSoftClips" option to BamRecord::CigarData() + +## [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 or +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 . 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/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..86dddda --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,3 @@ +# PacBio::BAM - building & integrating + +Detailed build instructions can be found [here](http://pbbam.readthedocs.org/en/latest/getting_started.html). diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..fc6affb --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,34 @@ +Copyright (c) 2014-2018, 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c9db996 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# pbbam + +[![Build Status](https://travis-ci.org/PacificBiosciences/pbbam.svg?branch=master)](https://travis-ci.org/PacificBiosciences/pbbam) [![Documentation Status](https://readthedocs.org/projects/pbbam/badge/?version=latest)](http://pbbam.readthedocs.org/en/latest/?badge=latest) + +As of the 3.0 release of SMRTanalysis, PacBio is embracing the industry standard BAM +format for (both aligned and unaligned) basecall data files. We have also formulated +a BAM companion file format (bam.pbi) enabling fast access to a richer set of per-read +information as well as compatibility for software built around the legacy cmp.h5 format. + +The **pbbam** software package provides components to create, query, & edit PacBio BAM +files and associated indices. These components include a core C++ library, bindings for +additional languages, and command-line utilities. + +### Note: + +This library is **not** intended to be used as a general-purpose BAM utility - all input & output BAMs must adhere to the [PacBio BAM format specification](https://github.com/PacificBiosciences/PacBioFileFormats/blob/3.0/BAM.rst). Non-PacBio BAMs will cause exceptions to be thrown. + +## Documentation + + - [Documentation Home](http://pbbam.readthedocs.org/en/latest/index.html) + - [Getting Started](http://pbbam.readthedocs.org/en/latest/getting_started.html) + - [C++ API Reference](http://pbbam.readthedocs.org/en/latest/api_reference.html) + + - [Changelog](https://github.com/PacificBiosciences/pbbam/blob/master/CHANGELOG.md) + +## FAQ + +### [Help! I am getting "unsupported sequencing chemistry combination"!](#chemistry-bundle) + +**pbbam** validates all BAM files, and as part of this validation, it checks whether the +`BindingKit` and `SequencingKit` variables in every ReadGroup of the provided BAM file are +known. As part of ongoing chemistry developments, we might need to introduce new part numbers +to identify novel reagents and/or SMRT Cells. You are unlikely to encounter such issues +when using SMRT Link, as it has an integrated auto-updater that will periodically check and +install new chemistries automatically. All PacBio tools being used without a proper SMRT Link +installation will require manual intervention to download new chemistries: + + ```sh + cd + export SMRT_CHEMISTRY_BUNDLE_DIR="${PWD}" + + wget https://raw.githubusercontent.com/PacificBiosciences/pbcore/develop/pbcore/chemistry/resources/mapping.xml -O chemistry.xml + ``` + +This will cause **pbbam** to try to load the out-of-band `chemistry.xml` from +`SMRT_CHEMISTRY_BUNDLE_DIR` and should allow you to use somewhat older software +with somewhat newer BAMs. **Note:** this only allows **pbbam**'s internal validation +to pass, this will not automatically make other chemistry-dependent software work +with newer chemistries. For instance, Arrow's backend ([Unanimity](https://github.com/PacificBiosciences/unanimity)) +is parametrized on chemistry too, and it will fail should a completely new chemistry +be introduced. See Unanimity's FAQ on how to employ `SMRT_CHEMISTRY_BUNDLE_DIR` +to load models for new chemistries. + + +## License + + - [PacBio open source license](https://github.com/PacificBiosciences/pbbam/blob/master/LICENSE.txt) + +DISCLAIMER +---------- +THIS WEBSITE AND CONTENT AND ALL SITE-RELATED SERVICES, INCLUDING ANY DATA, ARE PROVIDED "AS IS," WITH ALL FAULTS, WITH NO REPRESENTATIONS OR WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, NON-INFRINGEMENT OR FITNESS FOR A PARTICULAR PURPOSE. YOU ASSUME TOTAL RESPONSIBILITY AND RISK FOR YOUR USE OF THIS SITE, ALL SITE-RELATED SERVICES, AND ANY THIRD PARTY WEBSITES OR APPLICATIONS. NO ORAL OR WRITTEN INFORMATION OR ADVICE SHALL CREATE A WARRANTY OF ANY KIND. ANY REFERENCES TO SPECIFIC PRODUCTS OR SERVICES ON THE WEBSITES DO NOT CONSTITUTE OR IMPLY A RECOMMENDATION OR ENDORSEMENT BY PACIFIC BIOSCIENCES. + diff --git a/bamboo_build.sh b/bamboo_build.sh new file mode 100755 index 0000000..05501d0 --- /dev/null +++ b/bamboo_build.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -vex + +################ +# DEPENDENCIES # +################ + +## Load modules +type module >& /dev/null || . /mnt/software/Modules/current/init/bash + +module purge + +module load meson +module load ninja + +module load zlib +module load htslib +module load samtools + +module load boost + +module load cram + + +export BUILD_NUMBER="0" +case "${bamboo_planRepository_branchName}" in + develop|master) + _install_image_default="${INSTALL_IMAGE:-false}" + _create_artifact_default="${CREATE_ARTIFACT:-false}" + + export PREFIX_ARG="/mnt/software/p/pbbam/${bamboo_planRepository_branchName}" + export BUILD_NUMBER="${bamboo_globalBuildNumber:-0}" + ;; +esac + +export _install_image="${_install_image_default:-false}" +export _create_artifact="${_create_artifact_default:-false}" + + +BOOST_ROOT="${BOOST_ROOT%/include}" +# unset these variables to have meson discover all +# boost-dependent variables from BOOST_ROOT alone +unset BOOST_INCLUDEDIR +unset BOOST_LIBRARYDIR + +# in order to make shared libraries consumable +# by conda and other package managers +export LDFLAGS="-static-libstdc++ -static-libgcc" + +source scripts/ci/setup.sh +source scripts/ci/build.sh +source scripts/ci/test.sh +source scripts/ci/install.sh +source scripts/ci/artifact.sh diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in new file mode 100644 index 0000000..90f6f63 --- /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 = @PacBioBAM_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 = YES + +# 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 = @PacBioBAM_IncludeDir@ + +# 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 = YES + +# 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 = NO + +# 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 = YES + +# 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 = NO + +# 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 , where is the value of +# the FILE_VERSION_FILTER tag, and 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@ + +# 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 = @PacBioBAM_IncludeDir@/pbbam/internal + +# 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 = pugi, PacBio::BAM::internal + +# 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 = examples + +# 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 , where +# is the value of the INPUT_FILTER tag, and 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 +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +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 = YES + +# 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/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..14e0fb1 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,168 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build +SOURCEDIR = source + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCEDIR) +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCEDIR) + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext fig + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: basefig MANY_CLUSTER.png + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pbtoolkits.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pbtoolkits.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/pbtoolkits" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pbtoolkits" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +basefig: + dot -Tpng $(SOURCEDIR)/dependencies.dot > $(SOURCEDIR)/$@ + grep -v "\"pbsmrtpipe\" ->" $(SOURCEDIR)/dependencies.dot \ + | grep -v "> \"pbcore\"" \ + | sed 's/All/Sparse/' > $(SOURCEDIR)/sparse_dependencies.dot + dot -Tpng $(SOURCEDIR)/sparse_dependencies.dot \ + > $(SOURCEDIR)/sparse_dependencies.png + +%.png: basefig + grep -v $* $(SOURCEDIR)/sparse_dependencies.dot | \ + grep -v \? | sed 's/Sparse dependencies/Module bundles/' | \ + dot -Tpng > $(SOURCEDIR)/$@ + diff --git a/docs/examples/code/BarcodeQuery.txt b/docs/examples/code/BarcodeQuery.txt new file mode 100644 index 0000000..3fe8fce --- /dev/null +++ b/docs/examples/code/BarcodeQuery.txt @@ -0,0 +1,17 @@ +// using C++11 range-based for loop +BarcodeQuery query(42, dataset); +for (const BamRecord& r : query) { + assert(r.HasBarcodes()); + assert(r.BarcodeForward() == 42 || r.barcodeReverse() == 42); +} + +// OR + +// using iterators directly +BarcodeQuery query(42, dataset); +auto iter = query.cbegin(); +auto end = query.cend(); +for (; iter != end; ++iter) { + assert(iter->HasBarcodes()); + assert(iter->BarcodeForward() == 42 || iter->barcodeReverse() == 42); +} diff --git a/docs/examples/code/Compare.txt b/docs/examples/code/Compare.txt new file mode 100644 index 0000000..deecd8d --- /dev/null +++ b/docs/examples/code/Compare.txt @@ -0,0 +1,3 @@ +// sort on increasing ZMW hole number +std::vector records; +std::sort(records.begin(), records.end(), Compare::Zmw()); diff --git a/docs/examples/code/Compare_AlignedEnd.txt b/docs/examples/code/Compare_AlignedEnd.txt new file mode 100644 index 0000000..d34ed67 --- /dev/null +++ b/docs/examples/code/Compare_AlignedEnd.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::AlignedEnd()); diff --git a/docs/examples/code/Compare_AlignedStart.txt b/docs/examples/code/Compare_AlignedStart.txt new file mode 100644 index 0000000..68de3e2 --- /dev/null +++ b/docs/examples/code/Compare_AlignedStart.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::AlignedStart()); diff --git a/docs/examples/code/Compare_AlignedStrand.txt b/docs/examples/code/Compare_AlignedStrand.txt new file mode 100644 index 0000000..6c22cdc --- /dev/null +++ b/docs/examples/code/Compare_AlignedStrand.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::AlignedStrand()); diff --git a/docs/examples/code/Compare_BarcodeForward.txt b/docs/examples/code/Compare_BarcodeForward.txt new file mode 100644 index 0000000..1967341 --- /dev/null +++ b/docs/examples/code/Compare_BarcodeForward.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::BarcodeForward()); diff --git a/docs/examples/code/Compare_BarcodeQuality.txt b/docs/examples/code/Compare_BarcodeQuality.txt new file mode 100644 index 0000000..144f483 --- /dev/null +++ b/docs/examples/code/Compare_BarcodeQuality.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::BarcodeQuality()); diff --git a/docs/examples/code/Compare_BarcodeReverse.txt b/docs/examples/code/Compare_BarcodeReverse.txt new file mode 100644 index 0000000..9d3b245 --- /dev/null +++ b/docs/examples/code/Compare_BarcodeReverse.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::BarcodeReverse()); diff --git a/docs/examples/code/Compare_FullName.txt b/docs/examples/code/Compare_FullName.txt new file mode 100644 index 0000000..4b392b9 --- /dev/null +++ b/docs/examples/code/Compare_FullName.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::FullName()); diff --git a/docs/examples/code/Compare_LocalContextFlag.txt b/docs/examples/code/Compare_LocalContextFlag.txt new file mode 100644 index 0000000..aeab944 --- /dev/null +++ b/docs/examples/code/Compare_LocalContextFlag.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::LocalContextFlag()); diff --git a/docs/examples/code/Compare_MapQuality.txt b/docs/examples/code/Compare_MapQuality.txt new file mode 100644 index 0000000..fe22821 --- /dev/null +++ b/docs/examples/code/Compare_MapQuality.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::MapQuality()); diff --git a/docs/examples/code/Compare_MovieName.txt b/docs/examples/code/Compare_MovieName.txt new file mode 100644 index 0000000..cddcb64 --- /dev/null +++ b/docs/examples/code/Compare_MovieName.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::MovieName()); diff --git a/docs/examples/code/Compare_NumDeletedBases.txt b/docs/examples/code/Compare_NumDeletedBases.txt new file mode 100644 index 0000000..aa6dd4b --- /dev/null +++ b/docs/examples/code/Compare_NumDeletedBases.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::NumDeletedBases()); diff --git a/docs/examples/code/Compare_NumInsertedBases.txt b/docs/examples/code/Compare_NumInsertedBases.txt new file mode 100644 index 0000000..917d87f --- /dev/null +++ b/docs/examples/code/Compare_NumInsertedBases.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::NumInsertedBases()); diff --git a/docs/examples/code/Compare_NumMatches.txt b/docs/examples/code/Compare_NumMatches.txt new file mode 100644 index 0000000..47e3081 --- /dev/null +++ b/docs/examples/code/Compare_NumMatches.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::NumMatches()); diff --git a/docs/examples/code/Compare_NumMismatches.txt b/docs/examples/code/Compare_NumMismatches.txt new file mode 100644 index 0000000..12affb1 --- /dev/null +++ b/docs/examples/code/Compare_NumMismatches.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::NumMismatches()); diff --git a/docs/examples/code/Compare_QueryEnd.txt b/docs/examples/code/Compare_QueryEnd.txt new file mode 100644 index 0000000..d664d28 --- /dev/null +++ b/docs/examples/code/Compare_QueryEnd.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::QueryEnd()); diff --git a/docs/examples/code/Compare_QueryStart.txt b/docs/examples/code/Compare_QueryStart.txt new file mode 100644 index 0000000..12f6244 --- /dev/null +++ b/docs/examples/code/Compare_QueryStart.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::QueryStart()); diff --git a/docs/examples/code/Compare_ReadAccuracy.txt b/docs/examples/code/Compare_ReadAccuracy.txt new file mode 100644 index 0000000..9454309 --- /dev/null +++ b/docs/examples/code/Compare_ReadAccuracy.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReadAccuracy()); diff --git a/docs/examples/code/Compare_ReadGroupId.txt b/docs/examples/code/Compare_ReadGroupId.txt new file mode 100644 index 0000000..dab3497 --- /dev/null +++ b/docs/examples/code/Compare_ReadGroupId.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReadGroupId()); diff --git a/docs/examples/code/Compare_ReadGroupNumericId.txt b/docs/examples/code/Compare_ReadGroupNumericId.txt new file mode 100644 index 0000000..5ad8f9d --- /dev/null +++ b/docs/examples/code/Compare_ReadGroupNumericId.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReadGroupNumericId()); diff --git a/docs/examples/code/Compare_ReferenceEnd.txt b/docs/examples/code/Compare_ReferenceEnd.txt new file mode 100644 index 0000000..ed42d05 --- /dev/null +++ b/docs/examples/code/Compare_ReferenceEnd.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReferenceEnd()); diff --git a/docs/examples/code/Compare_ReferenceId.txt b/docs/examples/code/Compare_ReferenceId.txt new file mode 100644 index 0000000..5628427 --- /dev/null +++ b/docs/examples/code/Compare_ReferenceId.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReferenceId()); diff --git a/docs/examples/code/Compare_ReferenceName.txt b/docs/examples/code/Compare_ReferenceName.txt new file mode 100644 index 0000000..1f76e7e --- /dev/null +++ b/docs/examples/code/Compare_ReferenceName.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReferenceName()); diff --git a/docs/examples/code/Compare_ReferenceStart.txt b/docs/examples/code/Compare_ReferenceStart.txt new file mode 100644 index 0000000..0ccaf36 --- /dev/null +++ b/docs/examples/code/Compare_ReferenceStart.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::ReferenceStart()); diff --git a/docs/examples/code/Compare_TypeFromOperator.txt b/docs/examples/code/Compare_TypeFromOperator.txt new file mode 100644 index 0000000..afb0848 --- /dev/null +++ b/docs/examples/code/Compare_TypeFromOperator.txt @@ -0,0 +1,2 @@ +Compare::Type type = Compare::TypeFromOperator("!="); +assert(type == Compare::NOT_EQUAL); diff --git a/docs/examples/code/Compare_TypeToName.txt b/docs/examples/code/Compare_TypeToName.txt new file mode 100644 index 0000000..c44e1cb --- /dev/null +++ b/docs/examples/code/Compare_TypeToName.txt @@ -0,0 +1,2 @@ +string name = Compare::TypeToName(Compare::LESS_THAN); +assert(name = "Compare::LESS_THAN"); diff --git a/docs/examples/code/Compare_Zmw.txt b/docs/examples/code/Compare_Zmw.txt new file mode 100644 index 0000000..b02c426 --- /dev/null +++ b/docs/examples/code/Compare_Zmw.txt @@ -0,0 +1,2 @@ +std::vector records; +std::sort(records.begin(), records.end(), Compare::Zmw()); diff --git a/docs/examples/code/EntireFileQuery.txt b/docs/examples/code/EntireFileQuery.txt new file mode 100644 index 0000000..d3fcc2c --- /dev/null +++ b/docs/examples/code/EntireFileQuery.txt @@ -0,0 +1,15 @@ +// using C++11 range-based for loop +EntireFileQuery query(dataset); +for (const BamRecord& record : query) { + // ... do stuff ... +} + +// OR + +// using iterators +EntireFileQuery query(dataset); +auto iter = query.cbegin(); +auto end = query.cend(); +for (; iter != end; ++iter) { + // ... do stuff ... +} diff --git a/docs/examples/code/EntireFileQuery_BamFilename.txt b/docs/examples/code/EntireFileQuery_BamFilename.txt new file mode 100644 index 0000000..484db61 --- /dev/null +++ b/docs/examples/code/EntireFileQuery_BamFilename.txt @@ -0,0 +1,4 @@ +EntireFileQuery query("foo.bam"); +for (const BamRecord& record : query) { + // do stuff +} diff --git a/docs/examples/code/EntireFileQuery_NonConst.txt b/docs/examples/code/EntireFileQuery_NonConst.txt new file mode 100644 index 0000000..a0a092e --- /dev/null +++ b/docs/examples/code/EntireFileQuery_NonConst.txt @@ -0,0 +1,4 @@ +EntireFileQuery query("foo.bam"); +for (BamRecord& record : query) { + // ok to modify 'record' here +} diff --git a/docs/examples/code/GenomicIntervalQuery.txt b/docs/examples/code/GenomicIntervalQuery.txt new file mode 100644 index 0000000..651f254 --- /dev/null +++ b/docs/examples/code/GenomicIntervalQuery.txt @@ -0,0 +1,16 @@ +// using C++11 range-based for loop +GenomicIntervalQuery query(GenomicInterval("chr1:1000-2000"), dataset); +for (const BamRecord& record : query) { + // ... do stuff ... +} + +// OR + +// using iterators directly +GenomicIntervalQuery query(GenomicInterval("chr1:1000-2000"), dataset); +auto iter = query.cbegin(); +auto end = query.cend(); +for (; iter != end; ++iter) { + // ... do stuff ... +} + diff --git a/docs/examples/code/GenomicIntervalQuery_Reuse.txt b/docs/examples/code/GenomicIntervalQuery_Reuse.txt new file mode 100644 index 0000000..339ae95 --- /dev/null +++ b/docs/examples/code/GenomicIntervalQuery_Reuse.txt @@ -0,0 +1,8 @@ +DataSet ds("data.xml"); +GenomicIntervalQuery query(GenomicInterval(), ds); +for (const GenomicInterval& interval : intervals) { + query.Interval(interval); + for (const BamRecord& record : query) {} + // do stuff + } +} \ No newline at end of file diff --git a/docs/examples/code/PbiAlignedEndFilter.txt b/docs/examples/code/PbiAlignedEndFilter.txt new file mode 100644 index 0000000..bac1a46 --- /dev/null +++ b/docs/examples/code/PbiAlignedEndFilter.txt @@ -0,0 +1,4 @@ +PbiFilterQuery query(PbiAlignedEndFilter{3000, Compare::GREATER_THAN}); +for (const BamRecord& record : query) { + assert(record.AlignedEnd() > 3000); +} diff --git a/docs/examples/code/PbiAlignedLengthFilter.txt b/docs/examples/code/PbiAlignedLengthFilter.txt new file mode 100644 index 0000000..38dc3ff --- /dev/null +++ b/docs/examples/code/PbiAlignedLengthFilter.txt @@ -0,0 +1,4 @@ +PbiFilterQuery query(PbiAlignedLengthFilter{1000, Compare::GREATER_THAN}); +for (const BamRecord& record : query) { + assert((record.AlignedEnd() - record.AlignedStart()) > 1000); +} diff --git a/docs/examples/code/PbiAlignedStartFilter.txt b/docs/examples/code/PbiAlignedStartFilter.txt new file mode 100644 index 0000000..b78bb2c --- /dev/null +++ b/docs/examples/code/PbiAlignedStartFilter.txt @@ -0,0 +1,4 @@ +PbiFilterQuery query(PbiAlignedStartFilter{3000, Compare::GREATER_THAN}); +for (const BamRecord& record : query) { + assert(record.AlignedStart() > 3000); +} diff --git a/docs/examples/code/PbiAlignedStrandFilter.txt b/docs/examples/code/PbiAlignedStrandFilter.txt new file mode 100644 index 0000000..9f9a885 --- /dev/null +++ b/docs/examples/code/PbiAlignedStrandFilter.txt @@ -0,0 +1,5 @@ +PbiFilterQuery query(PbiAlignedStrandFilter{Strand::FORWARD}); +for (const BamRecord& record : query) { + assert(record.AlignedStrand() == Strand::FORWARD); +} + diff --git a/docs/examples/code/PbiBarcodeFilter.txt b/docs/examples/code/PbiBarcodeFilter.txt new file mode 100644 index 0000000..c7ce5cb --- /dev/null +++ b/docs/examples/code/PbiBarcodeFilter.txt @@ -0,0 +1,17 @@ +// single value +PbiFilter filter{ PbiBarcodeFilter{17} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + const auto barcodes = record.Barcodes(); + assert(barcodes.first == 17 || barcodes.second == 17); +} + +// whitelist +vector whitelist = { 50, 100 }; +PbiFilter filter{ PbiBarcodeFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + const auto barcodes = record.Barcodes(); + assert(barcodes.first == 50 || barcodes.second == 50 || + barcodes.first == 100 || barcodes.second == 100); +} diff --git a/docs/examples/code/PbiBarcodeForwardFilter.txt b/docs/examples/code/PbiBarcodeForwardFilter.txt new file mode 100644 index 0000000..a6c12fd --- /dev/null +++ b/docs/examples/code/PbiBarcodeForwardFilter.txt @@ -0,0 +1,15 @@ +// single value +PbiFilter filter{ PbiBarcodeForwardFilter{50} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.BarcodeForward() == 50); +} + +// whitelist +vector whitelist = { 50, 100 }; +PbiFilter filter{ PbiBarcodeForwardFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.BarcodeForward() == 50 || record.BarcodeForward() == 100); +} + diff --git a/docs/examples/code/PbiBarcodeQualityFilter.txt b/docs/examples/code/PbiBarcodeQualityFilter.txt new file mode 100644 index 0000000..34311d0 --- /dev/null +++ b/docs/examples/code/PbiBarcodeQualityFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiBarcodeQualityFilter{42, Compare::GREATER_THAN_EQUAL} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.BarcodeQuality() >= 42); +} diff --git a/docs/examples/code/PbiBarcodeReverseFilter.txt b/docs/examples/code/PbiBarcodeReverseFilter.txt new file mode 100644 index 0000000..24134f8 --- /dev/null +++ b/docs/examples/code/PbiBarcodeReverseFilter.txt @@ -0,0 +1,15 @@ +// single value +PbiFilter filter{ PbiBarcodeReverseFilter{50} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.BarcodeReverse() == 50); +} + +// whitelist +vector whitelist = { 50, 100 }; +PbiFilter filter{ PbiBarcodeReverseFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.BarcodeReverse() == 50 || record.BarcodeReverse() == 100); +} + diff --git a/docs/examples/code/PbiBarcodesFilter.txt b/docs/examples/code/PbiBarcodesFilter.txt new file mode 100644 index 0000000..a655c57 --- /dev/null +++ b/docs/examples/code/PbiBarcodesFilter.txt @@ -0,0 +1,6 @@ +PbiFilter filter{ PbiBarcodesFilter{17, 18} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.BarcodeForward() == 17 && + record.BarcodeReverse() == 18); +} diff --git a/docs/examples/code/PbiBuilder_WithReader.txt b/docs/examples/code/PbiBuilder_WithReader.txt new file mode 100644 index 0000000..e2748c2 --- /dev/null +++ b/docs/examples/code/PbiBuilder_WithReader.txt @@ -0,0 +1,30 @@ +// To simply create a PBI file from BAM, the following is the easiest method: +// +#include +#include + +BamFile bamFile("data.bam"); +PbiFile::CreateFrom(bamFile); + + +// However if you need to perform additional operations while reading the BAM file, +// you can do something like the following: +// +{ + BamFile bamFile("data.bam"); + PbiBuilder builder(bamFile.PacBioIndexFilename(), + bamFile.Header().Sequences().size()); + BamReader reader(bamFile); + BamRecord b; + int64_t offset = reader.VirtualTell(); // first record's vOffset + while (reader.GetNext(b)) { + + // store PBI recrod entry & get next record's vOffset + builder.AddRecord(b, offset); + offset = reader.VirtualTell(); + + // ... additional stuff as needed ... + } + +} // <-- PBI data will only be written here, as PbiBuilder goes out of scope + diff --git a/docs/examples/code/PbiBuilder_WithWriter.txt b/docs/examples/code/PbiBuilder_WithWriter.txt new file mode 100644 index 0000000..0c7d6d1 --- /dev/null +++ b/docs/examples/code/PbiBuilder_WithWriter.txt @@ -0,0 +1,12 @@ +BamWriter writer(...); +PbiBuilder pbiBuilder(...); +int64_t vOffset; +BamRecord record; +while (...) { + + // ... populate record data ... + + // write record to BAM and add PBI entry + writer.Write(record, &vOffset); + pbiBuilder.AddRecord(record, vOffset); +} diff --git a/docs/examples/code/PbiFilterQuery.txt b/docs/examples/code/PbiFilterQuery.txt new file mode 100644 index 0000000..4914eab --- /dev/null +++ b/docs/examples/code/PbiFilterQuery.txt @@ -0,0 +1,22 @@ +// setup filter +PbiFilter filter; +filter.Add(PbiZmwFilter(42)); +filter.Add(PbiReadAccuracyFilter(0.9, Compare::GREATER_THAN_EQUAL)); + +// using C++11 range-based for loop +PbiFilterQuery query(filter, dataset); +for (const BamRecord& r : query) { + assert(r.HoleNumber() == 42); + assert(r.ReadAccuracy() >= 0.9); +} + +// OR + +// using iterators directly +PbiFilterQuery query(filter, dataset); +auto iter = query.cbegin(); +auto end = query.cend(); +for (; iter != end; ++iter) { + assert(iter->HoleNumber() == 42); + assert(iter->ReadAccuracy() >= 0.9); +} diff --git a/docs/examples/code/PbiFilter_Composition.txt b/docs/examples/code/PbiFilter_Composition.txt new file mode 100644 index 0000000..22cc6ff --- /dev/null +++ b/docs/examples/code/PbiFilter_Composition.txt @@ -0,0 +1,8 @@ +// (f1 && f2) || f3 + +PbiFilter f1; +PbiFilter f2; +PbiFilter intersect_f1_f2 = PbiFilter::Intersection(f1, f2); + +PbiFilter f3; +PbiFilter final = PbiFilter::Union(intersect_f1_f2, f3); diff --git a/docs/examples/code/PbiFilter_CustomFilter.txt b/docs/examples/code/PbiFilter_CustomFilter.txt new file mode 100644 index 0000000..f9cdd21 --- /dev/null +++ b/docs/examples/code/PbiFilter_CustomFilter.txt @@ -0,0 +1,21 @@ +struct MyCustomFilter +{ + bool Accepts(const PbiRawData& index, const size_t row) const + { + // Look up data for record at the provided row. Do any calculations + // necessary, then return whether that record passes your + // filter criteria. + + return true; + } +}; + +// use in composite filters +PbiFilter f; +f.Add(PbiMovieNameFilter("foo")); +f.Add(MyCustomFilter()); + +// pass directly to PbiFilterQuery +PbiFilterQuery query(MyCustomFilter(), "foo.bam"); +for (const BamRecord& record : query) + // ... do stuff ... diff --git a/docs/examples/code/PbiFilter_Interface.txt b/docs/examples/code/PbiFilter_Interface.txt new file mode 100644 index 0000000..0fea900 --- /dev/null +++ b/docs/examples/code/PbiFilter_Interface.txt @@ -0,0 +1 @@ +bool Accepts(const PbiRawData& index, const size_t row) const; diff --git a/docs/examples/code/PbiIdentityFilter.txt b/docs/examples/code/PbiIdentityFilter.txt new file mode 100644 index 0000000..6fcb8d0 --- /dev/null +++ b/docs/examples/code/PbiIdentityFilter.txt @@ -0,0 +1,6 @@ +// single value +PbiFilter filter{ PbiIdentityFilter{ 0.5, Compare::GREATER_THAN_EQUAL } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + // ... at least 50% of record was aligned ... +} diff --git a/docs/examples/code/PbiLocalContextFilter.txt b/docs/examples/code/PbiLocalContextFilter.txt new file mode 100644 index 0000000..0aaa3eb --- /dev/null +++ b/docs/examples/code/PbiLocalContextFilter.txt @@ -0,0 +1,22 @@ + +// -------------------- +// has adapter_before +// -------------------- + +PbiFilter filter{ PbiLocalContextFilter{LocalContextFlags::ADAPTER_BEFORE, Compare::CONTAINS} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + const bool hasAdapterBefore = (record.LocalContextFlags() & LocalContextFlags::ADAPTER_BEFORE) != 0; + assert(hasAdapterBefore); +} + +// ---------------------------------- +// has any adapters, barcodes, etc. +// ---------------------------------- + +PbiFilter filter{ PbiLocalContextFilter{LocalContextFlags::NO_LOCAL_CONTEXT, Compare::NOT_EQUAL} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + const bool hasContext = (record.LocalContextFlags() != LocalContextFlags::NO_LOCAL_CONTEXT); + assert(hasContext); +} diff --git a/docs/examples/code/PbiMapQualityFilter.txt b/docs/examples/code/PbiMapQualityFilter.txt new file mode 100644 index 0000000..67fb5dc --- /dev/null +++ b/docs/examples/code/PbiMapQualityFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiMapQualityFilter{75, Compare::GREATER_THAN_EQUAL} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.MapQuality() >= 75); +} diff --git a/docs/examples/code/PbiMovieNameFilter.txt b/docs/examples/code/PbiMovieNameFilter.txt new file mode 100644 index 0000000..dd124e2 --- /dev/null +++ b/docs/examples/code/PbiMovieNameFilter.txt @@ -0,0 +1,14 @@ +// single value +PbiFilter filter{ PbiMovieFilter{ "foo" } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.MovieName() == "foo"); +} + +// whitelist +vector whitelist = { "foo", "bar" }; +PbiFilter filter{ PbiMovieNameFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.MovieName() == "foo" || record.MovieName() == "bar"); +} diff --git a/docs/examples/code/PbiNumDeletedBasesFilter.txt b/docs/examples/code/PbiNumDeletedBasesFilter.txt new file mode 100644 index 0000000..e1e3d1f --- /dev/null +++ b/docs/examples/code/PbiNumDeletedBasesFilter.txt @@ -0,0 +1,6 @@ +PbiFilter filter{ PbiNumDeletedBasesFilter{50, Compare::LESS_THAN} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.NumDeletedBases() < 50); +} + diff --git a/docs/examples/code/PbiNumInsertedBasesFilter.txt b/docs/examples/code/PbiNumInsertedBasesFilter.txt new file mode 100644 index 0000000..ab385e4 --- /dev/null +++ b/docs/examples/code/PbiNumInsertedBasesFilter.txt @@ -0,0 +1,6 @@ +PbiFilter filter{ PbiNumInsertedBasesFilter{50, Compare::LESS_THAN} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.NumInsertedBases() < 50); +} + diff --git a/docs/examples/code/PbiNumMatchesFilter.txt b/docs/examples/code/PbiNumMatchesFilter.txt new file mode 100644 index 0000000..4e1b97d --- /dev/null +++ b/docs/examples/code/PbiNumMatchesFilter.txt @@ -0,0 +1,6 @@ +PbiFilter filter{ PbiNumMatchesFilter{2000, Compare::GREATER_THAN_EQUAL} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.NumMatches() >= 2000); +} + diff --git a/docs/examples/code/PbiNumMismatchesFilter.txt b/docs/examples/code/PbiNumMismatchesFilter.txt new file mode 100644 index 0000000..690e4a1 --- /dev/null +++ b/docs/examples/code/PbiNumMismatchesFilter.txt @@ -0,0 +1,6 @@ +PbiFilter filter{ PbiNumMismatchesFilter{500, Compare::LESS_THAN} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.NumMismatches() < 500); +} + diff --git a/docs/examples/code/PbiQueryEndFilter.txt b/docs/examples/code/PbiQueryEndFilter.txt new file mode 100644 index 0000000..f85166b --- /dev/null +++ b/docs/examples/code/PbiQueryEndFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiQueryEndFilter{3000, Compare::GREATER_THAN} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.QueryEnd() > 3000); +} diff --git a/docs/examples/code/PbiQueryLengthFilter.txt b/docs/examples/code/PbiQueryLengthFilter.txt new file mode 100644 index 0000000..123412a --- /dev/null +++ b/docs/examples/code/PbiQueryLengthFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiQueryLengthFilter{2000, Compare::GREATER_THAN} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert( (record.QueryEnd() - record.QueryStart()) > 2000 ); +} diff --git a/docs/examples/code/PbiQueryNameFilter.txt b/docs/examples/code/PbiQueryNameFilter.txt new file mode 100644 index 0000000..f1e51c7 --- /dev/null +++ b/docs/examples/code/PbiQueryNameFilter.txt @@ -0,0 +1,15 @@ +// single value +PbiFilter filter{ PbiQueryNameFilter{ "movie_1/42/100_200" } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.FullName() == "movie_1/42/100_200"); +} + +// whitelist +vector whitelist = { "movie_1/42/100_200", "movie_3/24/300_500" }; +PbiFilter filter{ PbiQueryNameFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.FullName() == "movie_1/42/100_200" || + record.FullName() == "movie_3/24/300_500"); +} diff --git a/docs/examples/code/PbiQueryStartFilter.txt b/docs/examples/code/PbiQueryStartFilter.txt new file mode 100644 index 0000000..56353df --- /dev/null +++ b/docs/examples/code/PbiQueryStartFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiQueryStartFilter{3000, Compare::GREATER_THAN} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.QueryStart() > 3000); +} diff --git a/docs/examples/code/PbiReadAccuracyFilter.txt b/docs/examples/code/PbiReadAccuracyFilter.txt new file mode 100644 index 0000000..dd2df32 --- /dev/null +++ b/docs/examples/code/PbiReadAccuracyFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiReadAccuracyFilter{0.8, Compare::GREATER_THAN_EQUAL} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadAccuracy() >= 0.8); +} diff --git a/docs/examples/code/PbiReadGroupFilter.txt b/docs/examples/code/PbiReadGroupFilter.txt new file mode 100644 index 0000000..9af096d --- /dev/null +++ b/docs/examples/code/PbiReadGroupFilter.txt @@ -0,0 +1,64 @@ +// ------------------------- +// numeric ID +// ------------------------- + +// single value +PbiFilter filter{ PbiReadGroupFilter{ 2458765 } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadGroupNumericId() == 2458765); +} + +// whitelist +vector whitelist = { 2458765, -32143 }; +PbiFilter filter{ PbiReadGroupFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadGroupNumericId() == 2458765 || + record.ReadGroupNumericId() == -32143); +} + +// ------------------------- +// printable ID +// ------------------------- + +// single value +PbiFilter filter{ PbiReadGroupFilter{ "12B33F00" } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadGroupId() == "12B33F00"); +} + +// whitelist +vector whitelist = { "12B33F00", "123ABC77" }; +PbiFilter filter{ PbiReadGroupFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadGroupId() == "12B33F00" || + record.ReadGroupId() == "123ABC77"); +} + + +// ------------------------- +// read group +// ------------------------- + +BamFile file("foo.bam"); +BamHeader header = file.Header(); +assert(header.ReadGroups().size() > 1); + +// single value +PbiFilter filter{ PbiReadGroupFilter{ header.ReadGroups()[0] } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadGroup() == header.ReadGroups()[0]); +} + +// whitelist +vector whitelist = { header.ReadGroups()[0], header.ReadGroups()[1] }; +PbiFilter filter{ PbiReadGroupFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReadGroup() == header.ReadGroups()[0] || + record.ReadGroup() == header.ReadGroups()[1]); +} diff --git a/docs/examples/code/PbiReferenceEndFilter.txt b/docs/examples/code/PbiReferenceEndFilter.txt new file mode 100644 index 0000000..ce005c6 --- /dev/null +++ b/docs/examples/code/PbiReferenceEndFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiReferenceEndFilter{ 2000 } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReferenceEnd() == 2000); +} diff --git a/docs/examples/code/PbiReferenceIdFilter.txt b/docs/examples/code/PbiReferenceIdFilter.txt new file mode 100644 index 0000000..d963d28 --- /dev/null +++ b/docs/examples/code/PbiReferenceIdFilter.txt @@ -0,0 +1,16 @@ +// single value +PbiFilter filter{ PbiReferenceIdFilter{ 4 } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReferenceId() == 4); +} + +// whitelist +vector whitelist = { 0, 1 }; +PbiFilter filter{ PbiReferenceIdFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReferenceId() == 0 || + record.ReferenceId() == 1); +} + diff --git a/docs/examples/code/PbiReferenceNameFilter.txt b/docs/examples/code/PbiReferenceNameFilter.txt new file mode 100644 index 0000000..c86b14a --- /dev/null +++ b/docs/examples/code/PbiReferenceNameFilter.txt @@ -0,0 +1,15 @@ +// single value +PbiFilter filter{ PbiReferenceNameFilter{ "chr1" } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReferenceName() == "chr1"); +} + +// whitelist +vector whitelist = { "chr1", "chr5" }; +PbiFilter filter{ PbiReferenceNameFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReferenceName() == "chr1" || + record.ReferenceName() == "chr5"); +} diff --git a/docs/examples/code/PbiReferenceStartFilter.txt b/docs/examples/code/PbiReferenceStartFilter.txt new file mode 100644 index 0000000..d3ffdbb --- /dev/null +++ b/docs/examples/code/PbiReferenceStartFilter.txt @@ -0,0 +1,5 @@ +PbiFilter filter{ PbiReferenceStartFilter{ 2000 } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.ReferenceStart() == 2000); +} diff --git a/docs/examples/code/PbiZmwFilter.txt b/docs/examples/code/PbiZmwFilter.txt new file mode 100644 index 0000000..c63a804 --- /dev/null +++ b/docs/examples/code/PbiZmwFilter.txt @@ -0,0 +1,16 @@ +// single value +PbiFilter filter{ PbiZmwFilter{ 4000 } }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.HoleNumber() == 4000); +} + +// whitelist +vector whitelist = { 4000, 8000 }; +PbiFilter filter{ PbiZmwFilter{whitelist} }; +PbiFilterQuery query(filter); +for (const BamRecord& record : query) { + assert(record.HoleNumber() == 4000 || + record.HoleNumber() == 8000); +} + diff --git a/docs/examples/code/ReadAccuracyQuery.txt b/docs/examples/code/ReadAccuracyQuery.txt new file mode 100644 index 0000000..5b0404f --- /dev/null +++ b/docs/examples/code/ReadAccuracyQuery.txt @@ -0,0 +1,15 @@ +// using C++11 range-based for loop +ReadAccuracyQuery query(0.9, Compare::GREATER_THAN_EQUAL, dataset); +for (const BamRecord& r : query) { + assert(r.ReadAccuracy() >= 0.9); +} + +// OR + +// using iterators directly +ReadAccuracyQuery query(0.9, Compare::GREATER_THAN_EQUAL, dataset); +auto iter = query.cbegin(); +auto end = query.cend(); +for (; iter != end; ++iter) { + assert(iter->ReadAccuracy() >= 0.9); +} diff --git a/docs/examples/code/SubreadLengthQuery.txt b/docs/examples/code/SubreadLengthQuery.txt new file mode 100644 index 0000000..466a1d9 --- /dev/null +++ b/docs/examples/code/SubreadLengthQuery.txt @@ -0,0 +1,15 @@ +// using C++11 range-based for loop +SubreadLengthQuery query(500, Compare::GREATER_THAN_EQUAL, dataset); +for (const BamRecord& r : query) { + assert((r.QueryEnd() - r.QueryStart()) >= 500); +} + +// OR + +// using iterators directly +SubreadLengthQuery query(500, Compare::GREATER_THAN_EQUAL, dataset); +auto iter = query.cbegin(); +auto end = query.cend(); +for (; iter != end; ++iter) { + assert((iter->QueryEnd() - iter->QueryStart()) >= 500); +} diff --git a/docs/examples/code/Tag_AsciiCtor.txt b/docs/examples/code/Tag_AsciiCtor.txt new file mode 100644 index 0000000..057d22f --- /dev/null +++ b/docs/examples/code/Tag_AsciiCtor.txt @@ -0,0 +1,10 @@ +// One-step construction +// +// This is useful in situations that require a const Tag. +// +const auto t = Tag('A', TagModifier::ASCII_CHAR); + +// or two-step construction +auto t = Tag('A'); +t.Modifier(TagModifier::ASCII_CHAR); + diff --git a/docs/examples/code/WhitelistedZmwReadStitcher.txt b/docs/examples/code/WhitelistedZmwReadStitcher.txt new file mode 100644 index 0000000..a94c27b --- /dev/null +++ b/docs/examples/code/WhitelistedZmwReadStitcher.txt @@ -0,0 +1,6 @@ +vector zmws = { ... }; +WhitelistedZmwReadStitcher reader(zmws, "primary.bam", "scraps.bam"); +while(reader.HasNext()) { + auto virtualRecord = reader.Next(); + // ... do stuff ... +} diff --git a/docs/examples/code/ZmwGroupQuery.txt b/docs/examples/code/ZmwGroupQuery.txt new file mode 100644 index 0000000..1d728ac --- /dev/null +++ b/docs/examples/code/ZmwGroupQuery.txt @@ -0,0 +1,23 @@ +bool allHoleNumbersEqual(const vector& group) +{ + if (group.empty()) + return true; + const auto firstHoleNumber = group[0].HoleNumber(); + for (size_t i = 1; i < group.size(); ++i) { + if (group[i].HoleNumber() != firstHoleNumber) + return false; + } + return true; +} + +vector whitelist = { 50, 100 }; +ZmwGroupQuery query(whitelist, dataset); +for(const vector& group : query) { + + assert(allHoleNumbersEqual(group)); + + for (const BamRecord& record : group) { + assert(record.HoleNumber() == 50 || + record.HoleNumber() == 100); + } +} diff --git a/docs/examples/code/ZmwQuery.txt b/docs/examples/code/ZmwQuery.txt new file mode 100644 index 0000000..59c22c4 --- /dev/null +++ b/docs/examples/code/ZmwQuery.txt @@ -0,0 +1,6 @@ +vector whitelist = { 50, 100 }; +ZmwQuery query(whitelist, dataset); +for (const BamRecord& record : query) { + assert(record.HoleNumber() == 50 || + record.HoleNumber() == 100); +} diff --git a/docs/examples/plaintext/AlignmentPrinterOutput.txt b/docs/examples/plaintext/AlignmentPrinterOutput.txt new file mode 100644 index 0000000..21d948b --- /dev/null +++ b/docs/examples/plaintext/AlignmentPrinterOutput.txt @@ -0,0 +1,13 @@ +Read : singleInsertion2 +Reference : lambda_NEB3011 + +Read-length : 49 +Concordance : 0.96 + +5210 : GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGG : 5249 + |||||||| ||||||||||||||||||| ||||||||||| + 0 : GGCTGCAG-GTACAGCGGTCAGGAGGCCAATTGATGCCGG : 39 + +5249 : ACTGGCTGAT : 5259 + |||||||||| + 39 : ACTGGCTGAT : 49 diff --git a/docs/examples/plaintext/PbiFilter_DataSetXmlFilters.txt b/docs/examples/plaintext/PbiFilter_DataSetXmlFilters.txt new file mode 100644 index 0000000..5b5e8c2 --- /dev/null +++ b/docs/examples/plaintext/PbiFilter_DataSetXmlFilters.txt @@ -0,0 +1,14 @@ + + + + # A + # B + + + + + # C + # D + + + diff --git a/docs/meson.build b/docs/meson.build new file mode 100644 index 0000000..cffad5c --- /dev/null +++ b/docs/meson.build @@ -0,0 +1,24 @@ +################# +# documentation # +################# + +doxygen = find_program('doxygen', required : true) + +pbbam_doxygen_config = configuration_data() +pbbam_doxygen_config.set('PacBioBAM_NAME', meson.project_name()) +pbbam_doxygen_config.set('PacBioBAM_VERSION', meson.project_version()) +pbbam_doxygen_config.set('PacBioBAM_DocsDir', '.') +pbbam_doxygen_config.set('PacBioBAM_IncludeDir', join_paths([meson.current_source_dir(), '../include'])) + +doxyfile = configure_file( + input : 'Doxyfile.in', + output : 'Doxyfile', + configuration : pbbam_doxygen_config, + install : false) + +custom_target('docs', + input : doxyfile, + output : 'docs', + command : [doxygen, doxyfile], + build_by_default : true, + install : false) diff --git a/docs/source/api/Accuracy.rst b/docs/source/api/Accuracy.rst new file mode 100644 index 0000000..f88b722 --- /dev/null +++ b/docs/source/api/Accuracy.rst @@ -0,0 +1,11 @@ +Accuracy +======== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Accuracy + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/AlignmentPrinter.rst b/docs/source/api/AlignmentPrinter.rst new file mode 100644 index 0000000..ef0b191 --- /dev/null +++ b/docs/source/api/AlignmentPrinter.rst @@ -0,0 +1,11 @@ +AlignmentPrinter +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::AlignmentPrinter + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/AlignmentSet.rst b/docs/source/api/AlignmentSet.rst new file mode 100644 index 0000000..1817962 --- /dev/null +++ b/docs/source/api/AlignmentSet.rst @@ -0,0 +1,11 @@ +AlignmentSet +============ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::AlignmentSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BaiIndexedBamReader.rst b/docs/source/api/BaiIndexedBamReader.rst new file mode 100644 index 0000000..aab136f --- /dev/null +++ b/docs/source/api/BaiIndexedBamReader.rst @@ -0,0 +1,11 @@ +BaiIndexedBamReader +=================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BaiIndexedBamReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamFile.rst b/docs/source/api/BamFile.rst new file mode 100644 index 0000000..c7e48fb --- /dev/null +++ b/docs/source/api/BamFile.rst @@ -0,0 +1,11 @@ +BamFile +======= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamFile + :members: + :protected-members: + :undoc-members: diff --git a/docs/source/api/BamHeader.rst b/docs/source/api/BamHeader.rst new file mode 100644 index 0000000..6cf06af --- /dev/null +++ b/docs/source/api/BamHeader.rst @@ -0,0 +1,11 @@ +BamHeader +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamHeader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamReader.rst b/docs/source/api/BamReader.rst new file mode 100644 index 0000000..e0b6f3c --- /dev/null +++ b/docs/source/api/BamReader.rst @@ -0,0 +1,11 @@ +BamReader +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamRecord.rst b/docs/source/api/BamRecord.rst new file mode 100644 index 0000000..a749775 --- /dev/null +++ b/docs/source/api/BamRecord.rst @@ -0,0 +1,17 @@ +BamRecord +========= + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::ClipType + +.. doxygenenum:: PacBio::BAM::RecordType + +.. doxygenenum:: PacBio::BAM::FrameEncodingType + +.. doxygenclass:: PacBio::BAM::BamRecord + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamRecordBuilder.rst b/docs/source/api/BamRecordBuilder.rst new file mode 100644 index 0000000..ce477b4 --- /dev/null +++ b/docs/source/api/BamRecordBuilder.rst @@ -0,0 +1,11 @@ +BamRecordBuilder +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamRecordBuilder + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamRecordImpl.rst b/docs/source/api/BamRecordImpl.rst new file mode 100644 index 0000000..92b6759 --- /dev/null +++ b/docs/source/api/BamRecordImpl.rst @@ -0,0 +1,11 @@ +BamRecordImpl +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamRecordImpl + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamRecordView.rst b/docs/source/api/BamRecordView.rst new file mode 100644 index 0000000..2bc8fc4 --- /dev/null +++ b/docs/source/api/BamRecordView.rst @@ -0,0 +1,11 @@ +BamRecordView +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamRecordView + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamTagCodec.rst b/docs/source/api/BamTagCodec.rst new file mode 100644 index 0000000..9307421 --- /dev/null +++ b/docs/source/api/BamTagCodec.rst @@ -0,0 +1,11 @@ +BamTagCodec +=========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamTagCodec + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BamWriter.rst b/docs/source/api/BamWriter.rst new file mode 100644 index 0000000..2e2951b --- /dev/null +++ b/docs/source/api/BamWriter.rst @@ -0,0 +1,11 @@ +BamWriter +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BamWriter + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BarcodeQuery.rst b/docs/source/api/BarcodeQuery.rst new file mode 100644 index 0000000..5836059 --- /dev/null +++ b/docs/source/api/BarcodeQuery.rst @@ -0,0 +1,11 @@ +BarcodeQuery +============ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BarcodeQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/BarcodeSet.rst b/docs/source/api/BarcodeSet.rst new file mode 100644 index 0000000..a7ee056 --- /dev/null +++ b/docs/source/api/BarcodeSet.rst @@ -0,0 +1,11 @@ +BarcodeSet +========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::BarcodeSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Cigar.rst b/docs/source/api/Cigar.rst new file mode 100644 index 0000000..cea30d5 --- /dev/null +++ b/docs/source/api/Cigar.rst @@ -0,0 +1,11 @@ +Cigar +===== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Cigar + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/CigarOperation.rst b/docs/source/api/CigarOperation.rst new file mode 100644 index 0000000..856400a --- /dev/null +++ b/docs/source/api/CigarOperation.rst @@ -0,0 +1,13 @@ +CigarOperation +============== + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::CigarOperationType + +.. doxygenclass:: PacBio::BAM::CigarOperation + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Compare.rst b/docs/source/api/Compare.rst new file mode 100644 index 0000000..bb28a7e --- /dev/null +++ b/docs/source/api/Compare.rst @@ -0,0 +1,8 @@ +Compare +======= + +.. code-block:: cpp + + #include + +.. doxygenfile:: Compare.h \ No newline at end of file diff --git a/docs/source/api/Config.rst b/docs/source/api/Config.rst new file mode 100644 index 0000000..c4be9e4 --- /dev/null +++ b/docs/source/api/Config.rst @@ -0,0 +1,8 @@ +Config +======= + +.. code-block:: cpp + + #include + +.. doxygenfile:: Config.h \ No newline at end of file diff --git a/docs/source/api/ConsensusAlignmentSet.rst b/docs/source/api/ConsensusAlignmentSet.rst new file mode 100644 index 0000000..bc5a7e5 --- /dev/null +++ b/docs/source/api/ConsensusAlignmentSet.rst @@ -0,0 +1,11 @@ +ConsensusAlignmentSet +===================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ConsensusAlignmentSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ConsensusReadSet.rst b/docs/source/api/ConsensusReadSet.rst new file mode 100644 index 0000000..846698d --- /dev/null +++ b/docs/source/api/ConsensusReadSet.rst @@ -0,0 +1,11 @@ +ConsensusReadSet +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ConsensusReadSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ContigSet.rst b/docs/source/api/ContigSet.rst new file mode 100644 index 0000000..96bb20b --- /dev/null +++ b/docs/source/api/ContigSet.rst @@ -0,0 +1,11 @@ +ContigSet +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ContigSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/DataSet.rst b/docs/source/api/DataSet.rst new file mode 100644 index 0000000..8b3f0db --- /dev/null +++ b/docs/source/api/DataSet.rst @@ -0,0 +1,11 @@ +DataSet +======= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::DataSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/DataSetBase.rst b/docs/source/api/DataSetBase.rst new file mode 100644 index 0000000..f23fbb5 --- /dev/null +++ b/docs/source/api/DataSetBase.rst @@ -0,0 +1,11 @@ +DataSetBase +======= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::DataSetBase + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/DataSetMetadata.rst b/docs/source/api/DataSetMetadata.rst new file mode 100644 index 0000000..eea260d --- /dev/null +++ b/docs/source/api/DataSetMetadata.rst @@ -0,0 +1,11 @@ +DataSetMetadata +=============== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::DataSetMetadata + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/EntireFileQuery.rst b/docs/source/api/EntireFileQuery.rst new file mode 100644 index 0000000..4e7b86b --- /dev/null +++ b/docs/source/api/EntireFileQuery.rst @@ -0,0 +1,11 @@ +EntireFileQuery +=============== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::EntireFileQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ExtensionElement.rst b/docs/source/api/ExtensionElement.rst new file mode 100644 index 0000000..980303e --- /dev/null +++ b/docs/source/api/ExtensionElement.rst @@ -0,0 +1,11 @@ +ExtensionElement +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ExtensionElement + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Extensions.rst b/docs/source/api/Extensions.rst new file mode 100644 index 0000000..6704807 --- /dev/null +++ b/docs/source/api/Extensions.rst @@ -0,0 +1,11 @@ +Extensions +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Extensions + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ExternalResource.rst b/docs/source/api/ExternalResource.rst new file mode 100644 index 0000000..03ab0d3 --- /dev/null +++ b/docs/source/api/ExternalResource.rst @@ -0,0 +1,11 @@ +ExternalResource +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ExternalResource + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ExternalResources.rst b/docs/source/api/ExternalResources.rst new file mode 100644 index 0000000..bd72ea4 --- /dev/null +++ b/docs/source/api/ExternalResources.rst @@ -0,0 +1,11 @@ +ExternalResources +================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ExternalResources + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/FileIndex.rst b/docs/source/api/FileIndex.rst new file mode 100644 index 0000000..c117214 --- /dev/null +++ b/docs/source/api/FileIndex.rst @@ -0,0 +1,11 @@ +FileIndex +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::FileIndex + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/FileIndices.rst b/docs/source/api/FileIndices.rst new file mode 100644 index 0000000..b25720c --- /dev/null +++ b/docs/source/api/FileIndices.rst @@ -0,0 +1,11 @@ +FileIndices +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::FileIndices + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Filter.rst b/docs/source/api/Filter.rst new file mode 100644 index 0000000..6faa8aa --- /dev/null +++ b/docs/source/api/Filter.rst @@ -0,0 +1,11 @@ +Filter +====== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Filter + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Filters.rst b/docs/source/api/Filters.rst new file mode 100644 index 0000000..7ea1620 --- /dev/null +++ b/docs/source/api/Filters.rst @@ -0,0 +1,11 @@ +Filters +======= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Filters + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Frames.rst b/docs/source/api/Frames.rst new file mode 100644 index 0000000..cf260f2 --- /dev/null +++ b/docs/source/api/Frames.rst @@ -0,0 +1,11 @@ +Frames +====== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Frames + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/GenomicInterval.rst b/docs/source/api/GenomicInterval.rst new file mode 100644 index 0000000..811b83a --- /dev/null +++ b/docs/source/api/GenomicInterval.rst @@ -0,0 +1,11 @@ +GenomicInterval +=============== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::GenomicInterval + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/GenomicIntervalCompositeBamReader.rst b/docs/source/api/GenomicIntervalCompositeBamReader.rst new file mode 100644 index 0000000..f658621 --- /dev/null +++ b/docs/source/api/GenomicIntervalCompositeBamReader.rst @@ -0,0 +1,11 @@ +GenomicIntervalCompositeBamReader +================================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::GenomicIntervalCompositeBamReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/GenomicIntervalQuery.rst b/docs/source/api/GenomicIntervalQuery.rst new file mode 100644 index 0000000..7bae558 --- /dev/null +++ b/docs/source/api/GenomicIntervalQuery.rst @@ -0,0 +1,11 @@ +GenomicIntervalQuery +==================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::GenomicIntervalQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/HdfSubreadSet.rst b/docs/source/api/HdfSubreadSet.rst new file mode 100644 index 0000000..88bf008 --- /dev/null +++ b/docs/source/api/HdfSubreadSet.rst @@ -0,0 +1,11 @@ +HdfSubreadSet +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::HdfSubreadSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/IndexResultBlock.rst b/docs/source/api/IndexResultBlock.rst new file mode 100644 index 0000000..fac804a --- /dev/null +++ b/docs/source/api/IndexResultBlock.rst @@ -0,0 +1,17 @@ +IndexResultBlock +================ + +.. code-block:: cpp + + #include + +.. doxygenstruct:: PacBio::BAM::IndexResultBlock + :members: + :protected-members: + :undoc-members: + +.. doxygentypedef:: PacBio::BAM::IndexResultBlocks + +.. doxygentypedef:: PacBio::BAM::IndexList + +.. doxygentypedef:: PacBio::BAM::IndexRange \ No newline at end of file diff --git a/docs/source/api/IndexedFastaReader.rst b/docs/source/api/IndexedFastaReader.rst new file mode 100644 index 0000000..7c46064 --- /dev/null +++ b/docs/source/api/IndexedFastaReader.rst @@ -0,0 +1,11 @@ +IndexedFastaReader +================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::IndexedFastaReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Interval.rst b/docs/source/api/Interval.rst new file mode 100644 index 0000000..f506a19 --- /dev/null +++ b/docs/source/api/Interval.rst @@ -0,0 +1,11 @@ +Interval +======== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::Interval + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/InvalidSequencingChemistryException.rst b/docs/source/api/InvalidSequencingChemistryException.rst new file mode 100644 index 0000000..d521ecc --- /dev/null +++ b/docs/source/api/InvalidSequencingChemistryException.rst @@ -0,0 +1,11 @@ +InvalidSequencingChemistryException +=================================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::InvalidSequencingChemistryException + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/LocalContextFlags.rst b/docs/source/api/LocalContextFlags.rst new file mode 100644 index 0000000..8cd63be --- /dev/null +++ b/docs/source/api/LocalContextFlags.rst @@ -0,0 +1,8 @@ +LocalContextFlags +================= + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::LocalContextFlags diff --git a/docs/source/api/NamespaceInfo.rst b/docs/source/api/NamespaceInfo.rst new file mode 100644 index 0000000..c7613ec --- /dev/null +++ b/docs/source/api/NamespaceInfo.rst @@ -0,0 +1,11 @@ +NamespaceInfo +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::NamespaceInfo + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/NamespaceRegistry.rst b/docs/source/api/NamespaceRegistry.rst new file mode 100644 index 0000000..2f8f9a7 --- /dev/null +++ b/docs/source/api/NamespaceRegistry.rst @@ -0,0 +1,11 @@ +NamespaceRegistry +================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::NamespaceRegistry + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Orientation.rst b/docs/source/api/Orientation.rst new file mode 100644 index 0000000..e9bbc42 --- /dev/null +++ b/docs/source/api/Orientation.rst @@ -0,0 +1,8 @@ +Orientation +=========== + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::Orientation diff --git a/docs/source/api/ParentTool.rst b/docs/source/api/ParentTool.rst new file mode 100644 index 0000000..e2ffa1b --- /dev/null +++ b/docs/source/api/ParentTool.rst @@ -0,0 +1,11 @@ +ParentTool +========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ParentTool + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiBuilder.rst b/docs/source/api/PbiBuilder.rst new file mode 100644 index 0000000..d795d0f --- /dev/null +++ b/docs/source/api/PbiBuilder.rst @@ -0,0 +1,11 @@ +PbiBuilder +========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiBuilder + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiFile.rst b/docs/source/api/PbiFile.rst new file mode 100644 index 0000000..5a8b85a --- /dev/null +++ b/docs/source/api/PbiFile.rst @@ -0,0 +1,14 @@ +PbiFile +======= + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::PbiFile::Section + +.. doxygentypedef:: PacBio::BAM::PbiFile::Sections + +.. doxygenenum:: PacBio::BAM::PbiFile::VersionEnum + +.. doxygenfunction:: PacBio::BAM::PbiFile::CreateFrom diff --git a/docs/source/api/PbiFilter.rst b/docs/source/api/PbiFilter.rst new file mode 100644 index 0000000..261498b --- /dev/null +++ b/docs/source/api/PbiFilter.rst @@ -0,0 +1,11 @@ +PbiFilter +========= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiFilter + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiFilterCompositeBamReader.rst b/docs/source/api/PbiFilterCompositeBamReader.rst new file mode 100644 index 0000000..7a69df3 --- /dev/null +++ b/docs/source/api/PbiFilterCompositeBamReader.rst @@ -0,0 +1,11 @@ +PbiFilterCompositeBamReader +=========================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiFilterCompositeBamReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiFilterQuery.rst b/docs/source/api/PbiFilterQuery.rst new file mode 100644 index 0000000..75bbc12 --- /dev/null +++ b/docs/source/api/PbiFilterQuery.rst @@ -0,0 +1,11 @@ +PbiFilterQuery +============== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiFilterQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiFilterTypes.rst b/docs/source/api/PbiFilterTypes.rst new file mode 100644 index 0000000..052389b --- /dev/null +++ b/docs/source/api/PbiFilterTypes.rst @@ -0,0 +1,8 @@ +PbiFilterTypes +============== + +.. code-block:: cpp + + #include + +.. doxygenfile:: PbiFilterTypes.h \ No newline at end of file diff --git a/docs/source/api/PbiIndexedBamReader.rst b/docs/source/api/PbiIndexedBamReader.rst new file mode 100644 index 0000000..5450c8a --- /dev/null +++ b/docs/source/api/PbiIndexedBamReader.rst @@ -0,0 +1,11 @@ +PbiIndexedBamReader +=================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiIndexedBamReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiRawBarcodeData.rst b/docs/source/api/PbiRawBarcodeData.rst new file mode 100644 index 0000000..c72ebfb --- /dev/null +++ b/docs/source/api/PbiRawBarcodeData.rst @@ -0,0 +1,11 @@ +PbiRawBarcodeData +================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiRawBarcodeData + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiRawBasicData.rst b/docs/source/api/PbiRawBasicData.rst new file mode 100644 index 0000000..2282387 --- /dev/null +++ b/docs/source/api/PbiRawBasicData.rst @@ -0,0 +1,11 @@ +PbiRawBasicData +=============== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiRawBasicData + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiRawData.rst b/docs/source/api/PbiRawData.rst new file mode 100644 index 0000000..1a974e8 --- /dev/null +++ b/docs/source/api/PbiRawData.rst @@ -0,0 +1,11 @@ +PbiRawData +========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiRawData + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiRawMappedData.rst b/docs/source/api/PbiRawMappedData.rst new file mode 100644 index 0000000..42e1de1 --- /dev/null +++ b/docs/source/api/PbiRawMappedData.rst @@ -0,0 +1,11 @@ +PbiRawMappedData +================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiRawMappedData + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiRawReferenceData.rst b/docs/source/api/PbiRawReferenceData.rst new file mode 100644 index 0000000..460cde4 --- /dev/null +++ b/docs/source/api/PbiRawReferenceData.rst @@ -0,0 +1,11 @@ +PbiRawReferenceData +=================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiRawReferenceData + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/PbiReferenceEntry.rst b/docs/source/api/PbiReferenceEntry.rst new file mode 100644 index 0000000..472e586 --- /dev/null +++ b/docs/source/api/PbiReferenceEntry.rst @@ -0,0 +1,11 @@ +PbiReferenceEntry +================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::PbiReferenceEntry + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Position.rst b/docs/source/api/Position.rst new file mode 100644 index 0000000..3c945f2 --- /dev/null +++ b/docs/source/api/Position.rst @@ -0,0 +1,10 @@ +Position +======== + +.. code-block:: cpp + + #include + +.. doxygentypedef:: PacBio::BAM::Position + +.. doxygenvariable:: PacBio::BAM::UnmappedPosition \ No newline at end of file diff --git a/docs/source/api/ProgramInfo.rst b/docs/source/api/ProgramInfo.rst new file mode 100644 index 0000000..b58c93a --- /dev/null +++ b/docs/source/api/ProgramInfo.rst @@ -0,0 +1,11 @@ +ProgramInfo +=========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ProgramInfo + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/QNameQuery.rst b/docs/source/api/QNameQuery.rst new file mode 100644 index 0000000..b549436 --- /dev/null +++ b/docs/source/api/QNameQuery.rst @@ -0,0 +1,11 @@ +QNameQuery +========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::QNameQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/QualityValue.rst b/docs/source/api/QualityValue.rst new file mode 100644 index 0000000..3520c5a --- /dev/null +++ b/docs/source/api/QualityValue.rst @@ -0,0 +1,11 @@ +QualityValue +============ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::QualityValue + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/QualityValues.rst b/docs/source/api/QualityValues.rst new file mode 100644 index 0000000..8f6dfa5 --- /dev/null +++ b/docs/source/api/QualityValues.rst @@ -0,0 +1,11 @@ +QualityValues +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::QualityValues + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ReadAccuracyQuery.rst b/docs/source/api/ReadAccuracyQuery.rst new file mode 100644 index 0000000..abfd1e6 --- /dev/null +++ b/docs/source/api/ReadAccuracyQuery.rst @@ -0,0 +1,11 @@ +ReadAccuracyQuery +================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ReadAccuracyQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ReadGroupInfo.rst b/docs/source/api/ReadGroupInfo.rst new file mode 100644 index 0000000..7fb4f69 --- /dev/null +++ b/docs/source/api/ReadGroupInfo.rst @@ -0,0 +1,21 @@ +ReadGroupInfo +============= + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::BaseFeature + +.. doxygenenum:: PacBio::BAM::FrameCodec + +.. doxygenenum:: PacBio::BAM::BarcodeModeType + +.. doxygenenum:: PacBio::BAM::BarcodeQualityType + +.. doxygenclass:: PacBio::BAM::ReadGroupInfo + :members: + :protected-members: + :undoc-members: + +.. doxygenfunction:: PacBio::BAM::MakeReadGroupId \ No newline at end of file diff --git a/docs/source/api/ReferenceSet.rst b/docs/source/api/ReferenceSet.rst new file mode 100644 index 0000000..22e4703 --- /dev/null +++ b/docs/source/api/ReferenceSet.rst @@ -0,0 +1,11 @@ +ReferenceSet +============ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ReferenceSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/SamTagCodec.rst b/docs/source/api/SamTagCodec.rst new file mode 100644 index 0000000..4f8d65d --- /dev/null +++ b/docs/source/api/SamTagCodec.rst @@ -0,0 +1,11 @@ +SamTagCodec +=========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::SamTagCodec + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/SequenceInfo.rst b/docs/source/api/SequenceInfo.rst new file mode 100644 index 0000000..393d5bb --- /dev/null +++ b/docs/source/api/SequenceInfo.rst @@ -0,0 +1,11 @@ +SequenceInfo +============ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::SequenceInfo + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/SequentialCompositeBamReader.rst b/docs/source/api/SequentialCompositeBamReader.rst new file mode 100644 index 0000000..31ed3b1 --- /dev/null +++ b/docs/source/api/SequentialCompositeBamReader.rst @@ -0,0 +1,11 @@ +SequentialCompositeBamReader +============================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::SequentialCompositeBamReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Strand.rst b/docs/source/api/Strand.rst new file mode 100644 index 0000000..4978f72 --- /dev/null +++ b/docs/source/api/Strand.rst @@ -0,0 +1,8 @@ +Strand +====== + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::Strand diff --git a/docs/source/api/SubDataSets.rst b/docs/source/api/SubDataSets.rst new file mode 100644 index 0000000..d179065 --- /dev/null +++ b/docs/source/api/SubDataSets.rst @@ -0,0 +1,11 @@ +SubDataSets +=========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::SubDataSets + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/SubreadLengthQuery.rst b/docs/source/api/SubreadLengthQuery.rst new file mode 100644 index 0000000..23000b3 --- /dev/null +++ b/docs/source/api/SubreadLengthQuery.rst @@ -0,0 +1,11 @@ +SubreadLengthQuery +================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::SubreadLengthQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/SubreadSet.rst b/docs/source/api/SubreadSet.rst new file mode 100644 index 0000000..bfc3c13 --- /dev/null +++ b/docs/source/api/SubreadSet.rst @@ -0,0 +1,11 @@ +SubreadSet +========== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::SubreadSet + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/Tag.rst b/docs/source/api/Tag.rst new file mode 100644 index 0000000..50b85c7 --- /dev/null +++ b/docs/source/api/Tag.rst @@ -0,0 +1,15 @@ +Tag +=== + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::TagDataType + +.. doxygenenum:: PacBio::BAM::TagModifier + +.. doxygenclass:: PacBio::BAM::Tag + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/TagCollection.rst b/docs/source/api/TagCollection.rst new file mode 100644 index 0000000..1314b13 --- /dev/null +++ b/docs/source/api/TagCollection.rst @@ -0,0 +1,11 @@ +TagCollection +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::TagCollection + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/VirtualPolymeraseBamRecord.rst b/docs/source/api/VirtualPolymeraseBamRecord.rst new file mode 100644 index 0000000..06d5531 --- /dev/null +++ b/docs/source/api/VirtualPolymeraseBamRecord.rst @@ -0,0 +1,11 @@ +VirtualPolymeraseBamRecord +========================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::VirtualPolymeraseBamRecord + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/VirtualPolymeraseCompositeReader.rst b/docs/source/api/VirtualPolymeraseCompositeReader.rst new file mode 100644 index 0000000..e6cab4e --- /dev/null +++ b/docs/source/api/VirtualPolymeraseCompositeReader.rst @@ -0,0 +1,11 @@ +VirtualPolymeraseCompositeReader +================================ + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::VirtualPolymeraseCompositeReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/VirtualPolymeraseReader.rst b/docs/source/api/VirtualPolymeraseReader.rst new file mode 100644 index 0000000..14a46e8 --- /dev/null +++ b/docs/source/api/VirtualPolymeraseReader.rst @@ -0,0 +1,11 @@ +VirtualPolymeraseReader +======================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::VirtualPolymeraseReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/VirtualRegion.rst b/docs/source/api/VirtualRegion.rst new file mode 100644 index 0000000..7a09846 --- /dev/null +++ b/docs/source/api/VirtualRegion.rst @@ -0,0 +1,11 @@ +VirtualRegion +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::VirtualRegion + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/VirtualRegionType.rst b/docs/source/api/VirtualRegionType.rst new file mode 100644 index 0000000..4279200 --- /dev/null +++ b/docs/source/api/VirtualRegionType.rst @@ -0,0 +1,8 @@ +VirtualRegionType +================= + +.. code-block:: cpp + + #include + +.. doxygenenum:: PacBio::BAM::VirtualRegionType diff --git a/docs/source/api/VirtualRegionTypeMap.rst b/docs/source/api/VirtualRegionTypeMap.rst new file mode 100644 index 0000000..eebe637 --- /dev/null +++ b/docs/source/api/VirtualRegionTypeMap.rst @@ -0,0 +1,11 @@ +VirtualRegionTypeMap +==================== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::VirtualRegionTypeMap + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ZmwGroupQuery.rst b/docs/source/api/ZmwGroupQuery.rst new file mode 100644 index 0000000..01fc18a --- /dev/null +++ b/docs/source/api/ZmwGroupQuery.rst @@ -0,0 +1,11 @@ +ZmwGroupQuery +============= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ZmwGroupQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ZmwQuery.rst b/docs/source/api/ZmwQuery.rst new file mode 100644 index 0000000..375fcb0 --- /dev/null +++ b/docs/source/api/ZmwQuery.rst @@ -0,0 +1,11 @@ +ZmwQuery +======== + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ZmwQuery + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api/ZmwWhitelistVirtualReader.rst b/docs/source/api/ZmwWhitelistVirtualReader.rst new file mode 100644 index 0000000..95d2d1a --- /dev/null +++ b/docs/source/api/ZmwWhitelistVirtualReader.rst @@ -0,0 +1,11 @@ +ZmwWhitelistVirtualReader +========================= + +.. code-block:: cpp + + #include + +.. doxygenclass:: PacBio::BAM::ZmwWhitelistVirtualReader + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api_reference.rst b/docs/source/api_reference.rst new file mode 100644 index 0000000..354c0de --- /dev/null +++ b/docs/source/api_reference.rst @@ -0,0 +1,12 @@ +.. _api_reference: + +C++ API Reference +================= + +Watch this space for more recipes & how-tos. + +.. toctree:: + :maxdepth: 1 + :glob: + + api/* diff --git a/docs/source/commandline_utilities.rst b/docs/source/commandline_utilities.rst new file mode 100644 index 0000000..7f1bdaf --- /dev/null +++ b/docs/source/commandline_utilities.rst @@ -0,0 +1,15 @@ +.. _command_line: + +Command Line Utilities +====================== + +In addition to the main library and wrappers, pbbam also provides a few basic +utilities for working with PacBio indices (".pbi" files). + +.. toctree:: + :maxdepth: 1 + + tools/bam2sam + tools/pbindex + tools/pbindexdump + tools/pbmerge diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100755 index 0000000..30291f6 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,332 @@ +# -*- coding: utf-8 -*- +# +# pbbam documentation build configuration file, created by +# sphinx-quickstart on Fri Dec 4 10:08:52 2015. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os +import shlex +import re +import subprocess + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# get RTD to run doxygen first, per http://breathe.readthedocs.org/en/latest/readthedocs.html +# but... we generate our actual Doxyfile via CMake in a normal build, +# so we need to create one here, subbing actual values +read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' +if read_the_docs_build: + + # fetch directory info + this_dir = os.path.abspath(os.getcwd()) + docs_dir = os.path.abspath(os.path.join(this_dir, '..')) + root_dir = os.path.abspath(os.path.join(docs_dir, '..')) + include_dir = os.path.abspath(os.path.join(root_dir, 'include')) + + # get project version + version = '' + with open(os.path.abspath(os.path.join(root_dir, 'CMakeLists.txt')), 'r') as cmakeFile: + for line in cmakeFile: + if line.startswith('project'): + version = re.search(r'VERSION\s*([\d.]+)', line).group(1) + break + + # read Doxyfile.in, replace markers with real values, and write Doxyfile + inDoxyfile = open(os.path.abspath(os.path.join(docs_dir, 'Doxyfile.in')), 'r') + configIn = inDoxyfile.read() + configOut = re.sub('@PacBioBAM_NAME@', 'pbbam', \ + re.sub('@PacBioBAM_VERSION@', version, \ + re.sub('@PacBioBAM_DocsDir@', docs_dir, \ + re.sub('@PacBioBAM_IncludeDir@', include_dir, configIn)))) + outDoxyfile = open(os.path.abspath(os.path.join(docs_dir, 'Doxyfile')), 'w') + #print(configOut, outDoxyfile) + print >>outDoxyfile, configOut + outDoxyfile.close() + + # now run Doxygen + subprocess.call('cd ..; doxygen', shell=True) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['breathe'] +#extensions = [ +# 'sphinx.ext.autodoc', + # 'sphinx.ext.coverage', + # 'breathe', +#] + +# Setup Breathe extension varialbes +breathe_projects = { 'pbbam' : os.path.join(os.getcwd(), '..', 'xml') + os.path.sep } +breathe_default_project = 'pbbam' +breathe_default_members = ('members', 'undoc-members') +breathe_implementation_filename_extensions = [ '.cpp', '.inl' ] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'pbbam' +copyright = u'2015, Derek Barnett' +author = u'Derek Barnett' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.23.0' +# The full version, including alpha/beta/rc tags. +release = '0.23.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'pacbio-theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = ['.'] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pbbamdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'pbbam.tex', u'pbbam Documentation', + u'Derek Barnett', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pbbam', u'pbbam Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'pbbam', u'pbbam Documentation', + author, 'pbbam', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst new file mode 100644 index 0000000..a69a987 --- /dev/null +++ b/docs/source/getting_started.rst @@ -0,0 +1,105 @@ + +.. _getting_started: + +Getting Started +=============== + +.. _getting_started-requirements: + +Requirements +------------ + +These components will almost certainly already be on your system. + +* `gcc`_ (4.8+) OR `clang`_ (v3.1+) +* pthreads +* zlib + +Double-check your compiler version, to be sure it is compatible. + +.. code-block:: console + + $ g++ -v + $ clang -v + +Additional requirements: + +* `Boost`_ (1.55+) +* `Meson`_ (0.48+) +* `Google Test`_ +* `htslib`_ (1.4+) + +For building API documentation locally: + +* `Doxygen`_ + +For maximal convenience, install htslib and google test in the same parent directory you plan to install pbbam. + +.. _Boost: http://www.boost.org/ +.. _clang: http://clang.llvm.org/ +.. _Meson: https://mesonbuild.com +.. _Ninja: https://ninja-build.org/ (only required when using Meson, optional for CMake) +.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/ +.. _gcc: https://gcc.gnu.org/ +.. _Google Test: https://github.com/google/googletest +.. _htslib: https://github.com/samtools/htslib.git + +.. _getting_started-build: + +Clone & Build +------------- + +.. note:: + + The following steps are for building the C++ library and command-line utilities. + If you are integrating pbbam into a C#, Python, or R project, take a look at the + instructions for :ref:`additional languages `. + +The basic steps for obtaining pbbam and building it from source are as follows: + +Build and install htslib, per the project's instructions (or on OSX "brew install htslib"). + +Clone +^^^^^ + +You should first clone the repository: + +.. code-block:: console + + $ git clone https://github.com/PacificBiosciences/pbbam.git + $ cd pbbam + +Building with Meson +^^^^^^^^^^^^^^^^^^^ + +Building with Meson is generally faster and more versatile. Meson strictly requires building out of source: + +.. code-block:: console + + $ mkdir build + $ cd build + $ meson --prefix /my/install/prefix -Dtests=true .. + $ ninja + +where ninja will by default utilize a number of threads for compilation equal to the number of logical +cores on your system. Here ``-Dtests=true`` enables pulling in dependencies for testing. In +order to run the test suite, run: + +.. code-block:: console + + $ ninja test + +If you wish to install pbbam, run: + +.. code-block:: console + + $ ninja install + +and ninja will install pbbam to ``/my/install/prefix``. + +Integrate +--------- + +If you built and installed pbbam, pkg-config files will be available to be consumed by projects +wishing to utilize pbbam. Autoconf, CMake, Waf, SCons and Meson all have means to determine +dependency information from pkg-config files. diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..426c3c5 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,33 @@ +.. pbbam documentation master file, created by + sphinx-quickstart on Fri Dec 4 10:08:52 2015. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _home: + +pbbam documentation +=================== + +As of the 3.0 release of SMRTanalysis, PacBio is embracing the industry standard BAM +format for (both aligned and unaligned) basecall data files. We have also formulated +a BAM companion file format (bam.pbi) enabling fast access to a richer set of per-read +information as well as compatibility for software built around the legacy cmp.h5 format. + +The **pbbam** software package provides components to create, query, & edit PacBio BAM +files and associated indices. These components include a core C++ library, bindings for +additional languages, and command-line utilities. + +.. toctree:: + :maxdepth: 1 + + getting_started + api_reference + swig_bindings + commandline_utilities + + +Search: + +* :ref:`genindex` +* :ref:`search` + diff --git a/docs/source/pacbio-theme/static/headerGradient.jpg b/docs/source/pacbio-theme/static/headerGradient.jpg new file mode 100644 index 0000000000000000000000000000000000000000..883f147e6c9560851c7b8bb1b38e9382e1348954 GIT binary patch literal 7099 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 FzW{1@AD93D literal 0 HcmV?d00001 diff --git a/docs/source/pacbio-theme/static/pacbio.css b/docs/source/pacbio-theme/static/pacbio.css new file mode 100644 index 0000000..b4ab87f --- /dev/null +++ b/docs/source/pacbio-theme/static/pacbio.css @@ -0,0 +1,238 @@ +/** + * Sphinx stylesheet -- default theme + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Arial, sans-serif; + font-size: 100%; + background-color: #555; + color: #555; + margin: 0; + padding: 0; + min-width: 500px; + max-width: 956px; + margin: 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +hr{ + border: 1px solid #B1B4B6; + +} + +div.document { + background-color: #eee; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 30px 30px 30px 30px; + font-size: 0.8em; +} + +div.footer { + color: #555; + background-color: #fff; + padding: 13px 0; + text-align: center; + font-size: 75%; + +} +div.footer a { + color: #444; + text-decoration: underline; +} + +div.related { + background: #fff url(headerGradient.jpg); + line-height: 80px; + color: #fff; + font-size: 0.80em; + height: 79px; + z-index: -1; +} + +div.related ul { + background: url(pacbioLogo.png) 10px no-repeat; + padding: 0 0 0 200px; +} + +div.related a { + color: #E2F3CC; +} + +div.sphinxsidebar { + font-size: 0.75em; + line-height: 1.5em; +} + +div.sphinxsidebarwrapper{ + padding: 20px 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Arial, sans-serif; + color: #222; + font-size: 1.2em; + font-weight: bold; + margin: 0; + padding: 5px 10px 0 10px; +} + +div.sphinxsidebar h4{ + font-size: 1.1em; +} + +div.sphinxsidebar h3 a { + color: #444; +} + + +div.sphinxsidebar p { + color: #888; + padding: 0px 20px; + margin-top: 5px; +} + +div.sphinxsidebar p.topless { +} + +div.sphinxsidebar ul { + margin: 5px 20px 10px 20px; + padding: 0; + color: #000; +} + +div.sphinxsidebar a { + color: #444; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar input[type=text]{ + margin-left: 20px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #005B81; + text-decoration: none; +} + +a:hover { + color: #E32E00; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Arial, sans-serif; + font-weight: bold; + color: #264868; + margin: 30px 0px 10px 0px; + padding: 5px 0 5px 0px; +} + +div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 180%; font-weight: normal; } +div.body h2 { font-size: 125%; } +div.body h3 { font-size: 110%; } +div.body h4 { font-size: 100%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + line-height: 1.5em; + font-size: 1em; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.highlight{ + background-color: white; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 10px; + background-color: White; + color: #222; + line-height: 1.2em; + border: 1px solid #C6C9CB; + font-size: 1.2em; + margin: 1.5em 0 1.5em 0; + -webkit-box-shadow: 1px 1px 1px #d8d8d8; + -moz-box-shadow: 1px 1px 1px #d8d8d8; +} + +tt { + background-color: #ecf0f3; + color: #222; + padding: 1px 2px; + font-size: 1.2em; + font-family: monospace; +} + diff --git a/docs/source/pacbio-theme/static/pacbioLogo.png b/docs/source/pacbio-theme/static/pacbioLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e4887b12d19e498b2390551bec828d18f27915 GIT binary patch literal 3128 zcmV-849D|{P)DDTkIz_xVB(6~y5HClp(S9$KWt2h;;avBma)_TWS+9H5mQ!38c!KwAke zekqr7pzGZONaT>WQW5mfuD3-3sYqeIx4+N%GMSn8{QR7>&HJR0?dSPFzxmDgeKYfB z)tGYqz9-B2qo%_Z9V$AM%{Y%fTN{4ml@|wlFTb|CclFinXa4)kDzK0GVQ`#-m znbPm-Z~*|S>;EZDmGcyJ=!uml^i3d9_m(J^2%(R1sf-;oo^mrLw=mKgP% zE_cIME+&a=&)EYibkfQR*MT~`3nrhI5C|eLXB{A;K@YLau86o5p+owZn!sKK;Pa4* zm;i}tj%k3M8KAQ2+SVb@k!hf7_C->dCU1)wt4wf8h9w0M{l4(oyzl*)+h=gJHBHmh!y7 zvg>#rIaZcJd_aXWzswH_m;|sdeD@h=LIU1jf4HvR(cojb^wRg@bf!>#6dri$arM}> zRkio>YijT6tF~;3RhKfhrRrEFL*bI5HV)wPG=W1#RT!%ee3%_iN6ywn;w8XT~)#*wVhy5Zvz0!VBH>6 zfPG?5cn~P?j#R7{=eausAE_*N^(4yuxBxYi-;|c_FJD_7u_+1ZooR&`JN7IbPd84T zBIS3y2l#&@1*2^+xb^P_47&k5B7KB9K)qn>9)*a@hEbTM?kKm4JUS`LJu^VHvKQ%+ zE}{RP_~XxGkV$rYcnqMDy#4Ffk1;c(JO&H(e0%C-n7~0ErpT*>xI>Ya4uDAc9D&JX zXQXT5doyXD-&c34Yua+pn$>?yp7_JhM(!tOKGG@4aAF1|kV-xEv&R9KRm!T6Lec=0 zgnXWlU9)di*?ge{=0XZNaiFqmiTt2)cgge!u>aKOC9ui)M<2eY;|@P4Mxv0(fZG4k zw-PgX0Q#(JTh%7!rh>)DI5oiz6@_6M!v&rNHUI}{EOMD9jsAQ}{SfeYnVOGNr3oAe%nCk=!Y`u zav<8Y&+alKZa+nRS|WbU)Aq6`zk{%aKHi#DW9%`z0LRupGb1_meUAUjzj$e6kdeV= zku2_)$N+drw2L}u!Nm#yA)mt?!VN@QnsW+QK#<4iKr=vfL)3Q%-lgfE=C30<+YW{pLVZq@lW8^t5x3#`R@*P^hlW z6w5J#v}b}*fS6VU^O9jR#S+f_Wlr9MFqH>)Ta;BD63j)sIe{Z2)k~D&b(cMdvTsbW-$h z8xxdvN!LZ3QQTQNsdW9mCkL*uSkvcr^-LS;3O5F?tHAn!A(uj(kw^(AafQbS_D)04so!dwUdxP1B}bq#2ETa}f##)IdZSjJ?zcXMD#))ifo$)>+H zVEB;=usMaZ0v%u13DxE{RG^B)8s1f~;X4REYv@(|Q*_&{Pk6_l25Hx_>=StDB@`EU zFFr>dnAm3VzGr3#Rf@FZ|r*p5jyQUR3bT?8400Cqb?f3;w2R*e3tfN8JT z^y4Ey)gTEqtFEilx!^aLkWEQ;ZHJ+2qg_4JBXGU-1WQ$2 z=+Th?o{Nd+ER&_=0ykKgHypw#P1;DTT;}z3RwvdxlW8rb;ptLI7PGEs$AAiEtDXR} z<_*$0aT=aOUFhAR&7i_F)?K^UMlJJFhh>uUSQktEHh|a1wrGhbhH&mnKP&5Ab-7)N zGV1E^bv{XkU&+!=8A?eifU>-41%}K3&-aZs@m6s~*)J7VJoTxduOh_j%Xe<^7O7AT zLZ?OMVWZaT=fAc#1(1eV?xP$Sv!#+>UP0w8!M_;*c%js@0G5t&->*Ni110pez%vn> z(vnS4#yT5(WJ*>Or@<_}i zwHoh*>Zp8Pnie~tPxJk#7^FI8Z_hG-{9aN96L}JP9s?u5l2#FI%5T})DDtlfgRqy-rU=Gr&tm+Qla_tUWHsOWx|{Tlf|;~{z$<^&G6HtwS1jH* zT}USVdfWtQ-r=tfPx!=4QM|*ykcoln*{Um~kdKU + + 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. + + Options: + -h, --help show this help message and exit + --version show program's version number and exit + + Input/Output: + input Input BAM file diff --git a/docs/source/tools/pbindexdump.rst b/docs/source/tools/pbindexdump.rst new file mode 100644 index 0000000..6829064 --- /dev/null +++ b/docs/source/tools/pbindexdump.rst @@ -0,0 +1,233 @@ +.. _pbindexdump: + +pbindexdump +=========== + +:: + + Usage: pbindexdump [options] [input] + + pbindexdump prints a human-readable view of PBI data to stdout. + + Options: + -h, --help show this help message and exit + --version show program's version number and exit + + Input/Output: + input Input PBI file. If not provided, stdin will be used as input. + --format=STRING Output format, one of: + json, cpp + + json: pretty-printed JSON [default] + + cpp: copy/paste-able C++ code that can be used to + construct the equivalent PacBio::BAM::PbiRawData object + + JSON Formatting: + --json-indent-level=INT + JSON indent level [4] + --json-raw Prints fields in a manner that more closely reflects the + PBI file format - presenting data as per-field columns, + not per-record objects. + +JSON Output Schemas +------------------- + +Normal JSON: + +.. code-block:: JSON + + { + "type": "object", + "properties": { + "fileSections": { + "type": "array", + "items": { "type": "string" }, + }, + "numReads": { "type": "integer" }, + "reads": { + "type": "array", + "items": { + "type": "object", + "properties": { + "aEnd": { "type": "integer" }, + "aStart": { "type": "integer" }, + "bcForward": { "type": "integer" }, + "bcQuality": { "type": "integer" }, + "bcReverse": { "type": "integer" }, + "contextFlag": { "type": "integer" }, + "fileOffset": { "type": "integer" }, + "holeNumber": { "type": "integer" }, + "mapQuality": { "type": "integer" }, + "nM": { "type": "integer" }, + "nMM": { "type": "integer" }, + "qEnd": { "type": "integer" }, + "qStart": { "type": "integer" }, + "readQuality": { "type": "number" }, + "reverseStrand": { "type": "integer" }, + "rgId": { "type": "integer" }, + "tEnd": { "type": "integer" }, + "tId": { "type": "integer" }, + "tStart: { "type": "integer" } + }, + "required": [ + "contextFlag", + "fileOffset", + "holeNumber", + "qEnd", + "qStart", + "readQuality", + "rgId" + ] + } + }, + "references": { + "type": "array", + "items": { + "type": "object", + "properties": { + "beginRow": { "type": "integer" }, + "endRow": { "type": "integer" }, + "tId": { "type": "integer" } + }, + "required" : [ "beginRow", "endRow","tId" ] + } + }q + "version": { "type": "string" } + }, + "required": [ + "fileSections", + "numReads", + "reads", + "version" + ] + } + +"Raw" JSON: + +.. code-block:: JSON + + { + "type": "object", + "properties": { + "barcodeData" : { + "type" : "object", + "properties: { + "bcForward" : { + "type": "array", + "items" : { "type": "integer" } + }, + "bcQuality" : { + "type": "array", + "items" : { "type": "integer" } + }, + "bcReverse" : { + "type": "array", + "items" : { "type": "integer" } + } + } + }, + "basicData" : { + "type" : "object", + "properties: { + "contextFlag" : { + "type": "array", + "items" : { "type": "integer" } + }, + "fileOffset" : { + "type": "array", + "items" : { "type": "integer" } + }, + "holeNumber" : { + "type": "array", + "items" : { "type": "integer" } + }, + "qEnd" : { + "type": "array", + "items" : { "type": "integer" } + }, + "qStart" : { + "type": "array", + "items" : { "type": "integer" } + }, + "readQuality" : { + "type": "array", + "items" : { "type": "number" } + }, + "rgId : { + "type": "array", + "items" : { "type": "integer" } + } + } + }, + "fileSections": { + "type": "array", + "items": { "type": "string" }, + }, + "mappedData" : { + "type" : "object", + "properties: { + "aEnd" : { + "type": "array", + "items" : { "type": "integer" } + }, + "aStart" : { + "type": "array", + "items" : { "type": "integer" } + }, + "mapQuality" : { + "type": "array", + "items" : { "type": "integer" } + }, + "nM" : { + "type": "array", + "items" : { "type": "integer" } + }, + "nMM" : { + "type": "array", + "items" : { "type": "integer" } + }, + "readQuality" : { + "type": "array", + "items" : { "type": "number" } + }, + "reverseStrand" : { + "type": "array", + "items" : { "type": "integer" } + }, + "tEnd" : { + "type": "array", + "items" : { "type": "integer" } + }, + "tId" : { + "type": "array", + "items" : { "type": "integer" } + }, + "tStart" : { + "type": "array", + "items" : { "type": "integer" } + } + } + }, + "numReads": { "type": "integer" }, + "references": { + "type": "array", + "items": { + "type": "object", + "properties": { + "beginRow": { "type": "integer" }, + "endRow": { "type": "integer" }, + "tId": { "type": "integer" } + }, + "required" : [ "beginRow", "endRow","tId" ] + } + }, + "version" : { "type": "string" } + }, + "required": [ + "fileSections", + "numReads", + "basicData", + "version" + ] + } diff --git a/docs/source/tools/pbmerge.rst b/docs/source/tools/pbmerge.rst new file mode 100644 index 0000000..937ec56 --- /dev/null +++ b/docs/source/tools/pbmerge.rst @@ -0,0 +1,30 @@ +.. _pbmerge: + +pbmerge +======= + +:: + + Usage: pbmerge [options] [-o ] + + pbmerge merges PacBio BAM files. If the input is DataSetXML, any filters will be + applied. If no output filename is specified, new BAM will be written to stdout. + + Options: + -h, --help show this help message and exit + --version show program's version number and exit + + Input/Output: + -o output Output BAM filename. + --no-pbi Set this option to skip PBI index file creation. PBI + creation is automatically skipped if no output filename + is provided. + INPUT Input may be one of: + DataSetXML, list of BAM files, or FOFN + + fofn: pbmerge -o merged.bam bams.fofn + + bams: pbmerge -o merged.bam 1.bam 2.bam 3.bam + + xml: pbmerge -o merged.bam foo.subreadset.xml + diff --git a/docs/specs/pbbam.rst b/docs/specs/pbbam.rst new file mode 100644 index 0000000..993cae2 --- /dev/null +++ b/docs/specs/pbbam.rst @@ -0,0 +1,630 @@ +================================================================= +**pbbam Software Design & Functional Specification** +================================================================= +| *Version 0.1* +| *Pacific Biosciences Engineering Group* +| *Jan 29, 2016* + +1. Revision History +=================== + ++-------------+---------------+--------------------+---------------------------+ +| **Date** | **Revision** | **Author(s)** | **Comments** | ++=============+===============+====================+===========================+ +| 01-29-2016 | 0.1 | Derek Barnett | Initial draft created | +| | | | | ++-------------+---------------+--------------------+---------------------------+ + +2. Introduction +=============== + +2.1. Document Specification Identifier +-------------------------------------- + ++-----------------------------------+------------------------------------------+ +| **Document Specification Prefix** | **Description** | ++===================================+==========================================+ +| FS\_SA\_PBBAM\_ | Functional spec for pbbam | ++-----------------------------------+------------------------------------------+ + +2.2. Purpose +------------ + +This document is intended to describe the requirements and interface of the pbbam +library, which provides functionality for creating, querying, and editing PacBio +BAM files and associated file formats. + +2.3. Scope of Document +---------------------- + +This document covers the expected usage of the pbbam library, as well as any +desired or required performance characteristics with respect to quality or speed. + +This document does not provide installation instructions or API documentation. + +2.4. Glossary of Terms +---------------------- + +The table below specifies only terms specific to this document, and skips +acronyms/terms that are specified in `Pacific Biosciences Software Glossary`_. + +.. _Pacific Biosciences Software Glossary: http://smrtanalysis-docs/pb_sw_glossary.html + ++------------------+-----------------------------------------------------------+ +| **Acronym/Term** | **Description** | ++==================+===========================================================+ +| API | Application Programming Interface - a set of routines, | +| | protocols, and tools for building software applications. | +| | In this document , this will consist of one or more | +| | cooperating libraries that specify data structures, | +| | methods, etc. for use within a target programming | +| | language. | ++------------------+-----------------------------------------------------------+ +| Client | An application that uses the library. | ++------------------+-----------------------------------------------------------+ +| I/O | Input/output of data. | ++------------------+-----------------------------------------------------------+ + +2.5. References +--------------- + ++-------------+------------------------------+--------------------------------------+ +| **Ref No.** | **Document Name, Link** | **Description** | ++=============+==============================+======================================+ +| (1) | `BAM format`_ | General SAM/BAM specification | ++-------------+------------------------------+--------------------------------------+ +| (2) | `PacBio BAM`_ | PacBio BAM specification | ++-------------+------------------------------+--------------------------------------+ +| (3) | `PacBio BAM index`_ | PacBio BAM index specification | ++-------------+------------------------------+--------------------------------------+ +| (4) | `DataSet XML`_ | PacBio DataSet XML specification | ++-------------+------------------------------+--------------------------------------+ +| (5) | `Software Style Guide`_ | PacBio coding standards | ++-------------+------------------------------+--------------------------------------+ +| (6) | `SMRT Analysis`_ | General SMRT Analysis infrastructure | ++-------------+------------------------------+--------------------------------------+ + +.. _BAM format: https://samtools.github.io/hts-specs/SAMv1.pdf +.. _PacBio BAM: http://pacbiofileformats.readthedocs.org/en/3.0/BAM.html +.. _PacBio BAM index: http://pacbiofileformats.readthedocs.org/en/3.0/PacBioBamIndex.html +.. _DataSet XML: https://github.com/PacificBiosciences/PacBioFileFormats/blob/3.0/DataSet.rst +.. _Software Style Guide: http://smrtanalysis-docs/_downloads/PBISoftwareStyleGuide.doc +.. _SMRT Analysis: http://smrtanalysis-docs/smrt_docs.html + +3. Software Overview +==================== + +3.1. Product Description +------------------------ + +As of the 3.0 release of SMRTanalysis, PacBio is embracing the industry standard +`BAM format`_ (1) for (both aligned and unaligned) basecall data files. We have +also formulated a BAM companion file format (.bam.pbi) enabling fast access to a +richer set of per-read information as well as compatibility for software built +around the legacy cmp.h5 format. + +The pbbam library provides components to create, query, & transform PacBio BAM +data: sequence files and their associated indices. This includes a core C++ +library as well as bindings for additional programming languages. + +3.2. Product Functional Capabilities +------------------------------------ + +The library must be able to read and write BAM files that conform to the +`PacBio BAM`_ specification (2). BAM records must be editable e.g. adding +alignment information. Random access must be supported, whether by genomic +region or by filtering record features. To this end, the library will be able to +read, write, and create associated index files - both the standard BAM index +(.bai) and the `PacBio BAM index`_ (.pbi) (3). In addition to working with +individual files, datasets of related BAM files will be supported. These are +described in a `DataSet XML`_ document. (4) + +3.3. User Characteristics +------------------------- + ++---------------------+--------------------------------------------------------+ +| **User Class/Role** | **User Knowledge and Skill Levels** | ++=====================+========================================================+ +| Developer | Competence in one or more programming languages | +| | supported (C++, R, Python, C#). No knowledge of | +| | molecular biology wet lab techniques required. | ++---------------------+--------------------------------------------------------+ + +3.4. User Operations and Practices +---------------------------------- + +Developer users will interact with the software by incorporating the library +into a client application. + +3.5. Operating Environment +-------------------------- + +The software is intended to be run in a Linux or OSX environment, with ideally 4 +or more cores. + +3.6. Design and Implementation Constraints +------------------------------------------ + +Currently there are no constraints outside the operating environment and speed +requirements. In particular, as the library will be used for writing the BAM +files coming off a Sequel instrument, it should be able to keep pace. + +3.7. Assumptions and Dependencies +--------------------------------- + +Input routines for the library will expect to receive files that conform to the +`PacBio BAM`_ (2) or `DataSet XML`_ (4) specifications. + +The pbbam library depends on Boost, zlib, and htslib libraries. + +3.8. Other Software +------------------- + +Output PacBio BAMs will be compatible with the `PacBio BAM`_ specification (2) +and thus compatible with the general `BAM format`_ specification (1). This +ensures that a wide variety of downstream tools can interact with data files. + +The software uses `Meson`_ as its build system. + +The core C++ API relies on the following 3rd party components: + +* `zlib`_ +* `htslib`_ +* `Boost`_ (header-only modules) + +Wrapper APIs for additional languages (Python, R, C#) are generated by `SWIG`_. + +API documentation is generated via `Doxygen`_. + +.. _Meson: https://mesonbuild.com +.. _zlib: http://www.zlib.net/ +.. _htslib: https://github.com/samtools/htslib +.. _Boost: http://www.boost.org/ +.. _SWIG: http://www.swig.org/ +.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/ + +4. External Interfaces +====================== + +4.1. User Interfaces +-------------------- + +N/A + +4.2. Software Interfaces +------------------------ + +pbbam will require the following software: + +* `htslib`_ & `zlib`_ - provides low-level handling of compressed BAM data +* `Boost`_ - provides utility classes + +Incoming data from upstream components will be compliant with +PacBio BAM format - see `PacBio BAM`_ specification (2) for more detail. + +4.3. Hardware Interfaces +------------------------ + +N/A + +4.4. Communications Interfaces +------------------------------ + +N/A + +5. Functional Requirements +========================== + +5.1. Query BAM data by genomic region +----------------------------------------- + +5.1.1. Description +~~~~~~~~~~~~~~~~~~ + +pbbam shall allow client applications to query data, limited to some genomic +region of interest. + +5.1.2. Inputs +~~~~~~~~~~~~~ + +* BAM file(s) or DataSet XML +* a standard index (.bai) for each source BAM file +* genomic interval (e.g. "chr1:1000-2000") + +5.1.3. Processing +~~~~~~~~~~~~~~~~~ + +Obtain an `htslib`_ "iterator" object for a given file and region. This will be +wrapped by pbbam to hide the low-level nature of this type, as well as handling +memory lifetime. + +5.1.4. Outputs +~~~~~~~~~~~~~~ + +Iterator providing access to individual BAM records from the input data sources, +which are aligned to the requested genomic interval. + +For example: + +.. code:: c++ + + GenomicIntervalQuery query(interval, dataset); + for (const BamRecord& record : query) { + // ... do stuff ... + } + + +5.1.5. Regulatory Compliance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +N/A + +5.2. Query BAM data by filter criteria +----------------------------------------- + +5.2.1. Description +~~~~~~~~~~~~~~~~~~ + +pbbam shall allow client applications to query data, limited to some filter +criteria (e.g. only reads from ZMW hole number 200 with a read quality of >0.5). + +5.2.2. Inputs +~~~~~~~~~~~~~ + +* BAM file(s) or DataSet XML +* a `PacBio BAM index`_ (.pbi) for each source BAM file +* filters supported by data contained in the PBI + +5.2.3. Processing +~~~~~~~~~~~~~~~~~ + +Query PBI files(s) for records that match the provided filter criteria. Merge +contiguous runs of records into record blocks, to minimize seeks. Advancing the +iterator either reads the next read from the current block or seeks to the next +block and fetches the next record. + +5.2.4. Outputs +~~~~~~~~~~~~~~ + +Iterator providing access to individual BAM records from the input data sources, +which satisfy the requested filter criteria. + +For example: + +.. code:: c++ + + PbiFilterQuery query(filter, dataset); + for (const BamRecord& record : query) { + // ... do stuff ... + } + +5.2.5. Regulatory Compliance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +N/A + +5.3. Write PacBio BAM data +------------------------------------------ + +5.3.1. Description +~~~~~~~~~~~~~~~~~~ + +pbbam shall be able to write `PacBio BAM`_ files conforming to the specification. + +5.3.2. Inputs +~~~~~~~~~~~~~ + +* filename +* header information +* BAM records + +5.3.3. Processing +~~~~~~~~~~~~~~~~~ + +Create file handle for the provided filename, output initial header information. +As records are passed in, write to file. Upon completion, flush any buffers and +close file handle. + +Multithreading, provided by `htslib`_, will be utilized where possible to speed +up the compression process - often then main bottleneck of BAM throughput. + +5.3.4. Outputs +~~~~~~~~~~~~~~ + +BAM file conforming to the `PacBio BAM`_ specification. + +5.3.5. Regulatory Compliance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +N/A + +5.4. Create PacBio BAM index file +------------------------------------------ + +5.4.1. Description +~~~~~~~~~~~~~~~~~~ + +Much of PacBio BAM data processing relies on the presence of a `PacBio BAM index`_ +file. pbbam shall be able to generate this file type for a `PacBio BAM`_ file. + +5.4.2. Inputs +~~~~~~~~~~~~~ + +`PacBio BAM`_ file + +5.4.3. Processing +~~~~~~~~~~~~~~~~~ + +Read through the input BAM records, storing the values relevant to a PBI index. +At end of file, write the index contents to a file and close. + +5.4.4. Outputs +~~~~~~~~~~~~~~ + +`PacBio BAM index`_ file + +5.4.5. Regulatory Compliance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +N/A + +6. Non-Functional Requirements +============================== + +6.1. Performance Requirements +----------------------------- + +Since pbbam will be used to write all BAM files coming off a Sequel device, the +library must keep pace with data generation requirements. + +** come back to this, hard numbers ?? ** + +6.2. Safety Requirements +------------------------ + +N/A + +6.3. Security Requirements +-------------------------- + +N/A + +6.4. Quality Attributes +----------------------- + +6.4.1. Availability +~~~~~~~~~~~~~~~~~~~ + +N/A + +6.4.2. Integrity +~~~~~~~~~~~~~~~~ + +Inputs and outputs shall adhere to the PacBio BAM or DataSet XML specifications. +Files that do not meet this requirement will raise exceptions and will not be +accepted. + +6.4.3. Interoperability +~~~~~~~~~~~~~~~~~~~~~~~ + +Inputs and outputs shall adhere to the PacBio BAM or DataSet XML specifications. + +6.4.4. Reliability +~~~~~~~~~~~~~~~~~~ + +The developed software shall meet the overall product reliability requirements. + +6.4.5. Robustness +~~~~~~~~~~~~~~~~~ + +pbbam will raise exceptions upon encountering failure cases, allowing client +applications to recover or report the error to a UI. + +6.4.6. Usability +~~~~~~~~~~~~~~~~ + +pbbam shall have comprehensive API documentation, available both on- and offline. +Further documentation will be provided for installation, API usage tips, etc. + +Raised exceptions shall carry as much information as possible so that client +applications can respond with appropriate actions or display useful messages. + +6.4.7. Maintainability +~~~~~~~~~~~~~~~~~~~~~~ + +The source code of the software covered in this functional specification shall +adhere to the PacBio `Software Style Guide`_ (9) work instruction, to guarantee +high quality of code that facilitates maintainability. + +6.4.8. Customizability +~~~~~~~~~~~~~~~~~~~~~~ + +N/A + +6.5. Business Rules +------------------- + +N/A + +6.6. Installation and Upgrade +----------------------------- + +Installation and Upgrade of this software will be handled as part of the SMRT +Analysis subsystem. See `SMRT Analysis`_ (6) specifications for more detail. + +Additionally, the library may be built independently, either from internal +version control (Perforce) or from the public-facing Github repository. In +either case, `Meson`_ is used to drive the build process. + +6.7. Administration +------------------- + +N/A + +6.8. User Documentation +----------------------- + +pbbam shall have comprehensive API documentation, available both on- and offline. +Further documentation will be provided for installation, API usage tips, etc. + +The "offline" API documentation may be built directly from the source code, using +`Doxygen`_. Online documentation will be generated via a continuous integration +server, thus ensuring it is always pointing to the current codebase. + +7. High Level Design +==================== + +7.1. Top Level Context +---------------------- + +The pbbam library is intended to be linked in with client applications, +providing programmatic access to data files. + +7.2. Use Cases +-------------- + +Primary use cases for pbbam include: + +* BAM file creation +* BAM file query - iterable access to various subsets of data + +8. Detailed Design +================== + +8.1. Structural Representation +------------------------------ + + *image(s) here* + +8.2. Behavioral Representation +------------------------------ + +This section provides behavioral (dynamic) representation of how the +elements of the system realize the required use cases. + +Describe how the significant subsystems and classes interact with each +other to realize the architecturally significant use cases. + +Provide a link to a file containing Sequence Diagram or Activity Diagram, when applicable. +The link may be provided with use of 'image' directive. + +Sequence Diagram shows one use case scenario, executed by class model, +with sequence of operations over period of time (time increased from top +to bottom). It shows interactions between objects, but does not show +relationships between them. + +Activity Diagram is a virtual representation of the sequential flow and +control logic of a set of related activities or actions. It is a type of +flowchart, frequently called Swim Lane Diagram, because activities of +each entity are presented within its swim lane. + +Note: You may use http://wsd tool to auto-generate a sequence diagram from +a descriptive text file, save the diagram to the wsd site, get link to the image, +and add this link to the document with use of 'image' directive. + +8.3. Information Storage +------------------------ + +pbbam software requires no persistent storage outside of availability of input +and output during analysis. + +8.4. Technology Overview +------------------------ + +pbbam is implemented in C++-11 and should perform as designed on any UNIX-like +operating system (Linux distributions, Apple OSX, etc.). + +8.5. SOUP Components +-------------------- + +pbbam utilizes Meson for its build system. The C++ library uses the following +3rd-party software components: Boost, htslib and zlib. + +8.6. Deployment and Configuration +--------------------------------- + +Please refer to `SMRT Analysis`_ (6) documentation + +9. Automated Tests +================== + +9.1. Unit Testing +----------------- + +The library shall have unit tests for all classes & components. + +9.2. Performance Testing +------------------------ + +Unit tests may evaluate performance requirements as desired. + +9.3. Regression Testing +----------------------- + +As its role is primarily in data I/O, pbbam has no "scientific quality/validity" +metrics that would indicate a regression. Instead, passing its unit tests and +end-to-end tests will indicate that a regression has not been introduced. + +These tests will be run after each check-in and nightly. + +10. Requirements Traceability Matrices +====================================== + +This section provides traces from requirements specified in PRD/DIR documents to the +requirements covered in this functional specification, and from these +functional requirements to corresponding Test Cases/Procedures. + +10.1. HPQC Functional Specifications +------------------------------------ + ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+-------------------------------------------+ +| **PBI_ID** | **Name** | **Description** | **Comment** | **Metric** | **Owner** | **PRD/DIR Path** | ++=============+===========================+===================================================+=============+============+===========+===========================================+ +| 5.1 | Query BAM data by | pbbam shall allow client applications to query | | | dbarnett | | +| | genomic region | data, limited to some genomic region of interest. | | | | | +| | | | | | | | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+-------------------------------------------+ +| 5.2 | Query BAM data by | pbbam shall allow client applications to query | | | dbarnett | | +| | filter criteria | data, limited to some filter criteria (e.g. only | | | | | +| | | reads from ZMW hole number 200 with a read | | | | | +| | | quality of >0.5). | | | | | +| | | | | | | | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+-------------------------------------------+ +| 5.3 | Write PacBio BAM data | pbbam shall be able to write files conforming to | | | dbarnett | | +| | | the `PacBio BAM`_ specifictation. | | | | | +| | | | | | | | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+-------------------------------------------+ +| 5.4 | Create PacBio BAM index | Much of PacBio BAM data processing relies on the | | | dbarnett | | +| | file | presence of a `PacBio BAM index`_ file. pbbam | | | | | +| | | shall be able to generate this file type for a | | | | | +| | | `PacBio BAM`_ file. | | | | | +| | | | | | | | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+-------------------------------------------+ + +10.2. Automated Tests Coverage +------------------------------ + ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| **FS Item** | **FS Item Title** | **Use Case Description** | **Test Case Name/ID** | ++=============+===========================+====================================================+==================================================================+ +| 5.1 | Query BAM data by | pbbam shall allow client applications to query | TODO | +| | genomic region | data, limited to some genomic region of interest. | | +| | | | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| 5.2 | Query BAM data by | pbbam shall allow client applications to query | TODO | +| | filter criteria | data, limited to some filter criteria (e.g. only | | +| | | reads from ZMW hole number 200 with a read | | +| | | quality of >0.5). | | +| | | | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| 5.3 | Write PacBio BAM data | pbbam shall be able to write files conforming to | TODO | +| | | the `PacBio BAM`_ specifictation. | | +| | | | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| 5.4 | Create PacBio BAM index | Much of PacBio BAM data processing relies on the | TODO | +| | file | presence of a `PacBio BAM index`_ file. pbbam | | +| | | shall be able to generate this file type for a | | +| | | `PacBio BAM`_ file. | | +| | | | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ + diff --git a/docs/specs/pbbam_structure.png b/docs/specs/pbbam_structure.png new file mode 100755 index 0000000000000000000000000000000000000000..40f50cf35456454a1da86f1bb49d7c0f43e80cce GIT binary patch literal 23521 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 UlC}|G%YDjF&-4cJ`u%7B1K`or&j0`b literal 0 HcmV?d00001 diff --git a/docs/specs/pbbam_updated_release3_2.rst b/docs/specs/pbbam_updated_release3_2.rst new file mode 100755 index 0000000..72d9b76 --- /dev/null +++ b/docs/specs/pbbam_updated_release3_2.rst @@ -0,0 +1,618 @@ +============================================================= +**Pbbam Core API Software Design & Functional Specification** +============================================================= +| *Version 0.2* +| *Pacific Biosciences Engineering Group* +| *Oct 17, 2016* + +1. Revision History +=================== + ++-------------+---------------+--------------------+---------------------------------+ +| **Date** | **Revision** | **Author(s)** | **Comments** | ++=============+===============+====================+=================================+ +| 01-29-2016 | 0.1 | Derek Barnett | Initial draft created | +| | | | | ++-------------+---------------+--------------------+---------------------------------+ +| 10-17-2016 | 0.2 | Derek Barnett | Added behavioral representation | +| | | | and structural representation | +| | | | diagram | ++-------------+---------------+--------------------+---------------------------------+ + +2. Introduction +=============== + +2.1. Document Specification Identifier +-------------------------------------- + ++-----------------------------------+------------------------------------------+ +| **Document Specification Prefix** | **Description** | ++===================================+==========================================+ +| FS\_SA\_PBBAM\_ | Functional spec for pbbam | ++-----------------------------------+------------------------------------------+ + +2.2. Purpose +------------ + +This document is intended to describe the requirements and interface of the pbbam +library, which provides functionality for creating, querying, and editing PacBio +BAM files and associated file formats. + +2.3. Scope of Document +---------------------- + +This document covers the expected usage of the pbbam library, as well as any +desired or required performance characteristics with respect to quality or speed. + +This document does not provide installation instructions or API documentation. + +2.4. Glossary of Terms +---------------------- + +The table below specifies only terms specific to this document, and skips +acronyms/terms that are specified in `Pacific Biosciences Software Glossary`_. + +.. _Pacific Biosciences Software Glossary: http://smrtanalysis-docs/pb_sw_glossary.html + ++------------------+-----------------------------------------------------------+ +| **Acronym/Term** | **Description** | ++==================+===========================================================+ +| API | Application Programming Interface - a set of routines, | +| | protocols, and tools for building software applications. | +| | In this document, this will consist of one or more | +| | cooperating libraries that specify data structures, | +| | methods, etc. for use within a target programming | +| | language. | ++------------------+-----------------------------------------------------------+ +| Client | An application that uses the library. | ++------------------+-----------------------------------------------------------+ +| I/O | Input/output of data. | ++------------------+-----------------------------------------------------------+ + +2.5. References +--------------- + ++-------------+------------------------------+--------------------------------------+ +| **Ref No.** | **Document Name, Link** | **Description** | ++=============+==============================+======================================+ +| (1) | `BAM format`_ | General SAM/BAM specification | ++-------------+------------------------------+--------------------------------------+ +| (2) | `PacBio BAM`_ | PacBio BAM specification | ++-------------+------------------------------+--------------------------------------+ +| (3) | `PacBio BAM index`_ | PacBio BAM index specification | ++-------------+------------------------------+--------------------------------------+ +| (4) | `DataSet XML`_ | PacBio DataSet XML specification | ++-------------+------------------------------+--------------------------------------+ +| (5) | `Software Style Guide`_ | PacBio coding standards | ++-------------+------------------------------+--------------------------------------+ +| (6) | `SMRT Analysis`_ | General SMRT Analysis infrastructure | ++-------------+------------------------------+--------------------------------------+ + +.. _BAM format: https://samtools.github.io/hts-specs/SAMv1.pdf +.. _PacBio BAM: http://pacbiofileformats.readthedocs.org/en/3.0/BAM.html +.. _PacBio BAM index: http://pacbiofileformats.readthedocs.org/en/3.0/PacBioBamIndex.html +.. _DataSet XML: https://github.com/PacificBiosciences/PacBioFileFormats/blob/3.0/DataSet.rst +.. _Software Style Guide: http://smrtanalysis-docs/_downloads/PBISoftwareStyleGuide.doc +.. _SMRT Analysis: http://smrtanalysis-docs/smrt_docs.html + +3. Software Overview +==================== + +3.1. Software Module Description +-------------------------------- + +As of the 3.0 release of SMRT Analysis, PacBio is embracing the industry standard +`BAM format`_ (1) for (both aligned and unaligned) basecall data files. We have +also formulated a BAM companion file format (.bam.pbi) enabling fast access to a +richer set of per-read information as well as compatibility for software built +around the legacy cmp.h5 format. + +The pbbam library provides components to create, query, & transform PacBio BAM +data: sequence files and their associated indices. This includes a core C++ +library as well as bindings for additional programming languages. + +3.2. Software Module Functional Capabilities +-------------------------------------------- + +The library must be able to read and write BAM files that conform to the +`PacBio BAM`_ specification (2). BAM records must be editable e.g. adding +alignment information. Random access must be supported, whether by genomic +region or by filtering record features. To this end, the library will be able to +read, write, and create associated index files - both the standard BAM index +(.bai) and the `PacBio BAM index`_ (.pbi) (3). In addition to working with +individual files, datasets of related BAM files will be supported. These are +described in a `DataSet XML`_ document. (4) + +3.3. User Characteristics +------------------------- + ++---------------------+--------------------------------------------------------+ +| **User Class/Role** | **User Knowledge and Skill Levels** | ++=====================+========================================================+ +| Developer | Competence in one or more programming languages | +| | supported (C++, R, Python, C#). No knowledge of | +| | molecular biology wet lab techniques required. | ++---------------------+--------------------------------------------------------+ + +3.4. User Operations and Practices +---------------------------------- + +Developer users will interact with the software by incorporating the library +into a client application. + +3.5. Operating Environment +-------------------------- + +The software is intended to be run in a Linux or OSX environment, with ideally 4 +or more cores. + +3.6. General Constraints +------------------------ + +Currently there are no constraints outside the operating environment and speed +requirements. In particular, as the library will be used for writing the BAM +files coming off a Sequel instrument, it should be able to keep pace. + +3.7. Assumptions and Dependencies +--------------------------------- + +Input routines for the library will expect to receive files that conform to the +`PacBio BAM`_ (2) or `DataSet XML`_ (4) specifications. + +The pbbam library depends on Boost, zlib, and htslib libraries. + +3.8. Other Software +------------------- + +Output PacBio BAMs will be compatible with the `PacBio BAM`_ specification (2) +and thus compatible with the general `BAM format`_ specification (1). This +ensures that a wide variety of downstream tools can interact with data files. + +The software uses `CMake`_ as its build system. + +The core C++ API relies on the following 3rd party components: + +* `zlib`_ +* `htslib`_ +* `Boost`_ (header-only modules) + +Wrapper APIs for additional languages (Python, R, C#) are generated by `SWIG`_. + +API documentation is generated via `Doxygen`_. + +.. _CMake: https://cmake.org/ +.. _zlib: http://www.zlib.net/ +.. _htslib: https://github.com/samtools/htslib +.. _Boost: http://www.boost.org/ +.. _SWIG: http://www.swig.org/ +.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/ + +4. External Interfaces +====================== + +4.1. User Interfaces +-------------------- + +N/A + +4.2. Software Interfaces +------------------------ + +pbbam will require the following software: + +* `htslib`_ & `zlib`_ - provides low-level handling of compressed BAM data +* `Boost`_ - provides utility classes + +Incoming data from upstream components will be compliant with +PacBio BAM format - see `PacBio BAM`_ specification (2) for more detail. + +4.3. Hardware Interfaces +------------------------ + +N/A + +4.4. Communications Interfaces +------------------------------ + +N/A + +5. Functional Requirements +========================== + +5.1. Query BAM data by genomic region +------------------------------------- + +5.1.1. Description +~~~~~~~~~~~~~~~~~~ + +pbbam shall allow client applications to query data, limited to some genomic +region of interest. + +5.1.2. Inputs +~~~~~~~~~~~~~ + +* BAM file(s) or DataSet XML +* a standard index (.bai) for each source BAM file +* genomic interval (e.g. "chr1:1000-2000") + +5.1.3. Processing +~~~~~~~~~~~~~~~~~ + +Obtain an `htslib`_ "iterator" object for a given file and region. This will be +wrapped by pbbam to hide the low-level nature of this type, as well as handling +memory lifetime. + +5.1.4. Outputs +~~~~~~~~~~~~~~ + +Iterator providing access to individual BAM records from the input data sources, +which are aligned to the requested genomic interval. + +For example: + +.. code:: c++ + + GenomicIntervalQuery query(interval, dataset); + for (const BamRecord& record : query) { + // ... use record data ... + } + + +5.2. Query BAM data by filter criteria +-------------------------------------- + +5.2.1. Description +~~~~~~~~~~~~~~~~~~ + +pbbam shall allow client applications to query data, limited to some filter +criteria (e.g. only reads from ZMW hole number 200 with a read quality of >0.5). + +5.2.2. Inputs +~~~~~~~~~~~~~ + +* BAM file(s) or DataSet XML +* a `PacBio BAM index`_ (.pbi) for each source BAM file +* filters supported by data contained in the PBI + +5.2.3. Processing +~~~~~~~~~~~~~~~~~ + +Query PBI files(s) for records that match the provided filter criteria. Merge +contiguous runs of records into record blocks, to minimize seeks. Advancing the +iterator either reads the next read from the current block or seeks to the next +block and fetches the next record. + +5.2.4. Outputs +~~~~~~~~~~~~~~ + +Iterator providing access to individual BAM records from the input data sources, +which satisfy the requested filter criteria. + +For example: + +.. code:: c++ + + PbiFilterQuery query(filter, dataset); + for (const BamRecord& record : query) { + // ... do stuff ... + } + + +5.3. Write PacBio BAM data +-------------------------- + +5.3.1. Description +~~~~~~~~~~~~~~~~~~ + +pbbam shall be able to write `PacBio BAM`_ files conforming to the specification. + +5.3.2. Inputs +~~~~~~~~~~~~~ + +* filename +* header information +* BAM records + +5.3.3. Processing +~~~~~~~~~~~~~~~~~ + +Create file handle for the provided filename, output initial header information. +As records are passed in, write to file. Upon completion, flush any buffers and +close file handle. + +Multithreading, provided by `htslib`_, will be utilized where possible to speed +up the compression process - often then main bottleneck of BAM throughput. + +5.3.4. Outputs +~~~~~~~~~~~~~~ + +BAM file conforming to the `PacBio BAM`_ specification. + +5.4. Create PacBio BAM index file +--------------------------------- + +5.4.1. Description +~~~~~~~~~~~~~~~~~~ + +Much of PacBio BAM data processing relies on the presence of a `PacBio BAM index`_ +file. pbbam shall be able to generate this file type for a `PacBio BAM`_ file. + +5.4.2. Inputs +~~~~~~~~~~~~~ + +`PacBio BAM`_ file + +5.4.3. Processing +~~~~~~~~~~~~~~~~~ + +Read through the input BAM records, storing the values relevant to a PBI index. +At end of file, write the index contents to a file and close. + +5.4.4. Outputs +~~~~~~~~~~~~~~ + +`PacBio BAM index`_ file + +6. Non-Functional Requirements +============================== + +6.1. Performance Requirements +----------------------------- + +Since pbbam will be used to write all BAM files coming off a Sequel instrument, the +library must keep pace with data generation requirements. + +6.2. Safety Requirements +------------------------ + +N/A + +6.3. Security Requirements +-------------------------- + +N/A + +6.4. Quality Attributes +----------------------- + +6.4.1. Availability +~~~~~~~~~~~~~~~~~~~ + +The developed software shall meet the overall product availability requirements. + +6.4.2. Data Integrity +~~~~~~~~~~~~~~~~~~~~~ + +Inputs and outputs shall adhere to the PacBio BAM or DataSet XML specifications. +Files that do not meet this requirement will raise exceptions and will not be +accepted. + +6.4.3. Interoperability +~~~~~~~~~~~~~~~~~~~~~~~ + +Inputs and outputs shall adhere to the PacBio BAM or DataSet XML specifications. + +6.4.4. Reliability +~~~~~~~~~~~~~~~~~~ + +The developed software shall meet the overall product reliability requirements. + +6.4.5. Robustness +~~~~~~~~~~~~~~~~~ + +pbbam will raise exceptions upon encountering failure cases, allowing client +applications to recover or report the error to a UI. + +6.4.6. Usability +~~~~~~~~~~~~~~~~ + +pbbam shall have comprehensive API documentation, available both on- and offline. +Further documentation will be provided for installation, API usage tips, etc. + +Raised exceptions shall carry as much information as possible so that client +applications can respond with appropriate actions or display useful messages. + +6.4.7. Maintainability +~~~~~~~~~~~~~~~~~~~~~~ + +The source code of the software covered in this functional specification shall +adhere to the PacBio `Software Style Guide`_ (9) work instruction, to guarantee +high quality of code that facilitates maintainability. + +6.4.8. Customizability +~~~~~~~~~~~~~~~~~~~~~~ + +N/A + +6.4.9. Compatibility +~~~~~~~~~~~~~~~~~~~~ + +pbbam shall support backward compatibility of the API and BAM format versions +in order not to break existing clients. + +6.5. Business Rules +------------------- + +N/A + +6.6. Compliance Requirements +---------------------------- + +N/A + +6.7. Alarms and Error Handling +------------------------------ + +Raised exceptions shall carry as much information as possible so that client +applications can respond with appropriate actions or display useful messages. + +6.8. Persistence Requirements +----------------------------- + +pbbam software requires no persistent storage outside of availability of input +and output during analysis. + +6.9. Installation and Upgrade +----------------------------- + +Installation and Upgrade of this software will be handled as part of the SMRT +Analysis subsystem. See `SMRT Analysis`_ (6) specifications for more detail. + +Additionally, the library may be built independently, either from internal +version control (Perforce) or from the public-facing Github repository. In +either case, `CMake`_ is used to drive the build process. + +6.10. Administration and Maintenance +------------------------------------ + +N/A + +6.11. User Documentation +------------------------ + +pbbam shall have comprehensive API documentation, available both on- and offline. +Further documentation will be provided for installation, API usage tips, etc. + +The "offline" API documentation may be built directly from the source code, using +`Doxygen`_. Online documentation will be generated via a continuous integration +server, thus ensuring it is always pointing to the current codebase. + +7. High Level Design +==================== + +7.1. Top Level Context +---------------------- + +The pbbam library is intended to be linked in with client applications, +providing programmatic access to data files. + +7.2. Use Cases +-------------- + +Primary use cases for pbbam include: + +* BAM file creation +* BAM file query - iterable access to various subsets of data + +8. Detailed Design +================== + +8.1. Structural Representation +------------------------------ + +.. image:: ./pbbam_structure.png + +8.2. Behavioral Representation +------------------------------ + +The typical access pattern involves a client query against BAM data, optionally +described in DataSet XML. The query may involve some number of filter criteria. + +pbbam queries the associated index files (*.pbi) to pre-determine which records +pass filtering criteria and where they reside on disk. The client code is given +an iterable object, such that each iteration of the main access loop returns a +valid BAM record for analysis, modification, etc. + +8.3. Information Storage +------------------------ + +pbbam software requires no persistent storage outside of availability of input +and output during analysis. + +8.4. Technology Overview +------------------------ + +pbbam is implemented in C++-11 and should perform as designed on any UNIX-like +operating system (Linux distributions, Apple OSX, etc.). + +8.5. SOUP Components +-------------------- + +pbbam utilizes CMake for its build system. The C++ library uses the following +3rd-party software components: `Boost`_, `htslib`_, & `zlib`_. Wrappers for additional +languages are generated using SWIG. + +8.6. Deployment and Configuration +--------------------------------- + +Please refer to `SMRT Analysis`_ (6) documentation + +9. Automated Tests +================== + +9.1. Unit Testing +----------------- + +The library shall have unit tests for all classes & components. + +9.2. Performance Testing +------------------------ + +Unit tests may evaluate performance requirements as desired. + +9.3. Regression Testing +----------------------- + +As its role is primarily in data I/O, pbbam has no "scientific quality/validity" +metrics that would indicate a regression. Instead, passing its unit tests and +end-to-end tests will indicate that a regression has not been introduced. + +These tests will be run after each check-in and nightly. + +10. Requirements Traceability Matrices +====================================== + +This section provides traces from requirements specified in PRD/DIR documents to the +requirements covered in this functional specification, and from these +functional requirements to corresponding Test Cases/Procedures. + +10.1. HPQC Functional Specifications +------------------------------------ + ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+--------------------------------------------------+ +| **PBI_ID** | **Name** | **Description** | **Comment** | **Metric** | **Owner** | **PRD/DIR Path** | ++=============+===========================+===================================================+=============+============+===========+==================================================+ +| 5.1 | Query BAM data by | pbbam shall allow client applications to query | | Yes | dbarnett | \\DIR\\Functionality\\Software\Common\APIs\\ | +| | genomic region | data, limited to some genomic region of interest. | | | | Software shall provide an API to allow 3rd | +| | | | | | | party software to extract all run information | +| | | | | | | including summary reports and locations | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+--------------------------------------------------+ +| 5.2 | Query BAM data by | pbbam shall allow client applications to query | | Yes | dbarnett | \\DIR\\Functionality\\Software\Common\APIs\\ | +| | filter criteria | data, limited to some filter criteria (e.g. only | | | | Software shall provide an API to allow 3rd | +| | | reads from ZMW hole number 200 with a read | | | | party software to extract all run information | +| | | quality of >0.5). | | | | including summary reports and locations | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+--------------------------------------------------+ +| 5.3 | Write PacBio BAM data | pbbam shall be able to write files conforming to | | Yes | dbarnett | \\DIR\\Functionality\\Software\\PostProcessing\\ | +| | | the `PacBio BAM`_ specification. | | | | Software shall provide base files including | +| | | | | | | kinetic information in industry standard format | +| | | | | | | such as SAM/BAM using current specifications | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+--------------------------------------------------+ +| 5.4 | Create PacBio BAM index | Much of PacBio BAM data processing relies on the | | Yes | dbarnett | \\DIR\\Functionality\\Software\\PostProcessing\\ | +| | file | presence of a `PacBio BAM index`_ file. pbbam | | | | Software shall provide base files including | +| | | shall be able to generate this file type for a | | | | kinetic information in industry standard format | +| | | `PacBio BAM`_ file. | | | | such as SAM/BAM using current specifications | ++-------------+---------------------------+---------------------------------------------------+-------------+------------+-----------+--------------------------------------------------+ + +10.2. Automated Tests Coverage +------------------------------ + ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| **FS Item** | **FS Item Title** | **Use Case Description** | **Test Case Name/ID** | ++=============+===========================+====================================================+==================================================================+ +| 5.1 | Query BAM data by | pbbam shall allow client applications to query | See section 9.1. Unit Testing. | +| | genomic region | data, limited to some genomic region of interest. | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| 5.2 | Query BAM data by | pbbam shall allow client applications to query | See section 9.1. Unit Testing. | +| | filter criteria | data, limited to some filter criteria (e.g. only | | +| | | reads from ZMW hole number 200 with a read | | +| | | quality of >0.5). | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| 5.3 | Write PacBio BAM data | pbbam shall be able to write files conforming to | See section 9.1. Unit Testing. | +| | | the `PacBio BAM`_ specification. | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ +| 5.4 | Create PacBio BAM index | Much of PacBio BAM data processing relies on the | See section 9.1. Unit Testing. | +| | file | presence of a `PacBio BAM index`_ file. pbbam | | +| | | shall be able to generate this file type for a | | +| | | `PacBio BAM`_ file. | | ++-------------+---------------------------+----------------------------------------------------+------------------------------------------------------------------+ + diff --git a/include/meson.build b/include/meson.build new file mode 100644 index 0000000..e96750d --- /dev/null +++ b/include/meson.build @@ -0,0 +1,139 @@ +########### +# headers # +########### + +if not meson.is_subproject() + install_headers( + files([ + 'pbbam/Accuracy.h', + 'pbbam/AlignmentPrinter.h', + 'pbbam/BaiIndexedBamReader.h', + 'pbbam/BamFile.h', + 'pbbam/BamFileMerger.h', + 'pbbam/BamHeader.h', + 'pbbam/BamReader.h', + 'pbbam/BamRecord.h', + 'pbbam/BamRecordBuilder.h', + 'pbbam/BamRecordImpl.h', + 'pbbam/BamRecordTag.h', + 'pbbam/BamRecordView.h', + 'pbbam/BamTagCodec.h', + 'pbbam/BamWriter.h', + 'pbbam/BarcodeQuery.h', + 'pbbam/Cigar.h', + 'pbbam/CigarOperation.h', + 'pbbam/ClipType.h', + 'pbbam/Compare.h', + 'pbbam/CompositeBamReader.h', + 'pbbam/CompositeFastaReader.h', + 'pbbam/Config.h', + 'pbbam/DataSet.h', + 'pbbam/DataSetTypes.h', + 'pbbam/DataSetXsd.h', + 'pbbam/EntireFileQuery.h', + 'pbbam/FastaCache.h', + 'pbbam/FastaReader.h', + 'pbbam/FastaSequence.h', + 'pbbam/FastaSequenceQuery.h', + 'pbbam/FastaWriter.h', + 'pbbam/FastqReader.h', + 'pbbam/FastqSequence.h', + 'pbbam/FastqWriter.h', + 'pbbam/FrameEncodingType.h', + 'pbbam/Frames.h', + 'pbbam/GenomicInterval.h', + 'pbbam/GenomicIntervalQuery.h', + 'pbbam/IndexedBamWriter.h', + 'pbbam/IndexedFastaReader.h', + 'pbbam/Interval.h', + 'pbbam/IRecordWriter.h', + 'pbbam/LocalContextFlags.h', + 'pbbam/MakeUnique.h', + 'pbbam/MD5.h', + 'pbbam/MoveAppend.h', + 'pbbam/Orientation.h', + 'pbbam/PbiBasicTypes.h', + 'pbbam/PbiBuilder.h', + 'pbbam/PbiFile.h', + 'pbbam/PbiFilter.h', + 'pbbam/PbiFilterQuery.h', + 'pbbam/PbiFilterTypes.h', + 'pbbam/PbiIndexedBamReader.h', + 'pbbam/PbiRawData.h', + 'pbbam/Position.h', + 'pbbam/ProgramInfo.h', + 'pbbam/PulseBehavior.h', + 'pbbam/PulseExclusionReason.h', + 'pbbam/QNameQuery.h', + 'pbbam/QualityValue.h', + 'pbbam/QualityValues.h', + 'pbbam/ReadAccuracyQuery.h', + 'pbbam/ReadGroupInfo.h', + 'pbbam/RecordType.h', + 'pbbam/SamTagCodec.h', + 'pbbam/SamWriter.h', + 'pbbam/SequenceInfo.h', + 'pbbam/Strand.h', + 'pbbam/StringUtilities.h', + 'pbbam/SubreadLengthQuery.h', + 'pbbam/Tag.h', + 'pbbam/TagCollection.h', + 'pbbam/Unused.h', + 'pbbam/Validator.h', + 'pbbam/ZmwGroupQuery.h', + 'pbbam/ZmwQuery.h', + 'pbbam/ZmwType.h', + 'pbbam/ZmwTypeMap.h']), + subdir : 'pbbam') + + install_headers( + files([ + 'pbbam/exception/BundleChemistryMappingException.h', + 'pbbam/exception/InvalidSequencingChemistryException.h', + 'pbbam/exception/ValidationException.h']), + subdir : 'pbbam/exception') + + install_headers( + files([ + 'pbbam/internal/Compare.inl', + 'pbbam/internal/CompositeBamReader.inl', + 'pbbam/internal/DataSetBaseTypes.h', + 'pbbam/internal/DataSetElement.h', + 'pbbam/internal/DataSetElement.inl', + 'pbbam/internal/Interval.inl', + 'pbbam/internal/PbiBasicTypes.inl', + 'pbbam/internal/PbiFilter.inl', + 'pbbam/internal/PbiFilterTypes.inl', + 'pbbam/internal/QueryBase.h', + 'pbbam/internal/QueryBase.inl']), + subdir : 'pbbam/internal') + + install_headers( + files([ + 'pbbam/vcf/VcfVariant.h', + 'pbbam/vcf/VcfFile.h', + 'pbbam/vcf/VcfFormat.h', + 'pbbam/vcf/VcfHeader.h', + 'pbbam/vcf/VcfHeaderTypes.h', + 'pbbam/vcf/VcfReader.h', + 'pbbam/vcf/VcfSort.h', + 'pbbam/vcf/VcfQuery.h', + 'pbbam/vcf/VcfWriter.h']), + subdir : 'pbbam/vcf') + + install_headers( + files([ + 'pbbam/virtual/VirtualPolymeraseBamRecord.h', + 'pbbam/virtual/VirtualPolymeraseCompositeReader.h', + 'pbbam/virtual/VirtualPolymeraseReader.h', + 'pbbam/virtual/VirtualRegion.h', + 'pbbam/virtual/VirtualRegionType.h', + 'pbbam/virtual/VirtualRegionTypeMap.h', + 'pbbam/virtual/VirtualZmwBamRecord.h', + 'pbbam/virtual/WhitelistedZmwReadStitcher.h', + 'pbbam/virtual/ZmwReadStitcher.h', + 'pbbam/virtual/ZmwWhitelistVirtualReader.h']), + subdir : 'pbbam/virtual') +endif + +pbbam_include_directories = include_directories('.') diff --git a/include/pbbam/Accuracy.h b/include/pbbam/Accuracy.h new file mode 100644 index 0000000..72a8e74 --- /dev/null +++ b/include/pbbam/Accuracy.h @@ -0,0 +1,56 @@ +// File Description +/// \file Accuracy.h +/// \brief Defines the Accuracy class. +// +// 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 fall within [0,1]. +/// +class PBBAM_EXPORT Accuracy +{ +public: + static const float MIN; ///< Minimum valid accuracy value [0.0] + static const float MAX; ///< Maximum valid accuracy value [1.0] + +public: + /// \name Constructors & Related Methods + /// \{ + + /// Constructs an Accuracy object from a floating-point number. + /// + /// \note This is not an \b explicit ctor, to make it as easy as + /// possible to use in numeric operations. We really just want + /// to make sure that the acceptable range is respected. + /// + Accuracy(float accuracy); + + Accuracy(const Accuracy&); + Accuracy(Accuracy&&); + Accuracy& operator=(const Accuracy&); + Accuracy& operator=(Accuracy&&); + ~Accuracy(); + + /// \} + +public: + /// \returns Accuracy as float primitive + operator float() const; + +private: + float 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..b132b53 --- /dev/null +++ b/include/pbbam/AlignmentPrinter.h @@ -0,0 +1,76 @@ +// File Description +/// \file AlignmentPrinter.h +/// \brief Defines the AlignmentPrinter class. +// +// Author: Armin Töpfer + +#ifndef ALIGNMENTPRINTER_H +#define ALIGNMENTPRINTER_H + +#include +#include + +#include "pbbam/BamRecord.h" +#include "pbbam/IndexedFastaReader.h" +#include "pbbam/Orientation.h" + +namespace PacBio { +namespace BAM { + +class BamRecord; + +/// \brief The AlignmentPrinter class "pretty-prints" an alignment with respect +/// to its associated reference sequence. +/// +/// Example output: +/// \verbinclude plaintext/AlignmentPrinterOutput.txt +/// +class AlignmentPrinter +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// Constructs the alignment printer with an associated FASTA file reader. + /// + /// \param[in] ifr FASTA reader + /// + /// \throws std::runtime_error if FASTA file cannot be opened for reading. + /// + AlignmentPrinter(const IndexedFastaReader& ifr); + + AlignmentPrinter() = delete; + AlignmentPrinter(const AlignmentPrinter&) = delete; + AlignmentPrinter(AlignmentPrinter&&); + AlignmentPrinter& operator=(const AlignmentPrinter&) = delete; + AlignmentPrinter& operator=(AlignmentPrinter&&); + ~AlignmentPrinter(); + + /// \} + +public: + /// \name Printing + /// \{ + + /// Pretty-prints an aligned BamRecord to std::string. + /// + /// \note The current implementation includes ANSI escape sequences for + /// coloring terminal output. Future versions of this method will + /// likely make this optional. + /// + /// \returns formatted string containing the alignment and summary + /// information + /// + std::string Print(const BamRecord& record, + const Orientation orientation = Orientation::GENOMIC); + + /// \} + +private: + std::unique_ptr ifr_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ALIGNMENTPRINTER_H diff --git a/include/pbbam/BaiIndexedBamReader.h b/include/pbbam/BaiIndexedBamReader.h new file mode 100644 index 0000000..bb9b7be --- /dev/null +++ b/include/pbbam/BaiIndexedBamReader.h @@ -0,0 +1,99 @@ +// File Description +/// \file BaiIndexedBamReader.h +/// \brief Defines the BaiIndexedBamReader class. +// +// Author: Derek Barnett + +#ifndef BAIINDEXEDBAMREADER_H +#define BAIINDEXEDBAMREADER_H + +#include "pbbam/BamFile.h" +#include "pbbam/BamReader.h" +#include "pbbam/GenomicInterval.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BaiIndexedBamReader class provides read-only iteration over %BAM +/// records, bounded by a particular genomic interval. +/// +/// The SAM/BAM standard index (*.bai) is used to allow random-access operations. +/// +class PBBAM_EXPORT BaiIndexedBamReader : public BamReader +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Constructs %BAM reader, that can be queried on genomic interval. + /// + /// \param filename input %BAM filename + /// + /// \throws std::runtime_error if either file (*.bam or *.bai) fails to open + /// for reading, or if the interval is invalid + /// + explicit BaiIndexedBamReader(std::string filename); + + /// \brief Constructs %BAM reader, that can be queried on genomic interval. + /// + /// \param[in] bamFile input BamFile object + /// + /// \throws std::runtime_error if either file (*.bam or *.bai) fails to open + /// for reading, or if the interval is invalid + /// + explicit BaiIndexedBamReader(BamFile bamFile); + + /// \brief Constructs %BAM reader, bounded by a genomic interval. + /// + /// All reads that overlap the interval will be available. + /// + /// \param[in] interval iteration will be bounded by this GenomicInterval. + /// \param[in] filename input %BAM filename + /// + /// \throws std::runtime_error if either file (*.bam or *.bai) fails to open + /// for reading, or if the interval is invalid + /// + BaiIndexedBamReader(const GenomicInterval& interval, std::string filename); + + /// \brief Constructs %BAM reader, bounded by a genomic interval. + /// + /// All reads that overlap the interval will be available. + /// + /// \param[in] interval iteration will be bounded by this GenomicInterval. + /// \param[in] bamFile input BamFile object + /// + /// \throws std::runtime_error if either file (*.bam or *.bai) fails to open + /// for reading, or if the interval is invalid + /// + BaiIndexedBamReader(const GenomicInterval& interval, BamFile bamFile); + + /// \} + +public: + /// \name Random-Access + /// \{ + + /// \returns the current GenomicInterval in use by this reader + const GenomicInterval& Interval() const; + + /// \brief Sets a new genomic interval on the reader. + /// + /// \param[in] interval + /// \returns reference to this reader + /// + BaiIndexedBamReader& Interval(const GenomicInterval& interval); + + /// \} + +protected: + int ReadRawData(BGZF* bgzf, bam1_t* b) override; + +private: + class BaiIndexedBamReaderPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAIINDEXEDBAMREADER_H diff --git a/include/pbbam/BamFile.h b/include/pbbam/BamFile.h new file mode 100644 index 0000000..3c7b697 --- /dev/null +++ b/include/pbbam/BamFile.h @@ -0,0 +1,182 @@ +// File Description +/// \file BamFile.h +/// \brief Defines the BamFile class. +// +// Author: Derek Barnett + +#ifndef BAMFILE_H +#define BAMFILE_H + +#include +#include + +#include "pbbam/BamHeader.h" +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BamFile class represents a %BAM file. +/// +/// It provides access to header metadata and methods for finding/creating +/// associated index files. +/// +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 to open %BAM file for reading + /// + BamFile(std::string filename); + + BamFile(const BamFile& other); + BamFile(BamFile&& other); + BamFile& operator=(const BamFile& other); + BamFile& operator=(BamFile&& other); + ~BamFile(); + + /// \} + +public: + /// \name Index & Filename Methods + /// \{ + + /// \brief Creates a ".pbi" file for this %BAM file. + /// + /// \note Existing index file will be overwritten. Use + /// EnsurePacBioIndexExists() if this is not desired. + /// + /// \throws if PBI file could not be properly created and/or + /// written to disk + /// + void CreatePacBioIndex() const; + + /// \brief Creates a ".bai" file for this %BAM file. + /// + /// \note Existing index file will be overwritten. Use + /// EnsureStandardIndexExists() if this is not desired. + /// + /// \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 CreateStandardIndex() const; + + /// \brief Creates a ".pbi" file if one does not exist or is older than its + /// %BAM file. + /// + /// Equivalent to: + /// \code{.cpp} + /// if (!file.PacBioIndexExists()) + /// file.CreatePacBioIndex(); + /// \endcode + /// + /// \note As of v0.4.02+, no timestamp check is performed. Previously we requr + /// with an additional timestamp check. + /// + /// \throws if PBI file could not be properly created and/or + /// written to disk + /// + void EnsurePacBioIndexExists() const; + + /// \brief Creates a ".bai" file if one does not exist or is older than its + /// %BAM file. + /// + /// Equivalent to: + /// \code{.cpp} + /// if (!file.StandardIndexExists()) + /// file.CreateStandardIndex(); + /// \endcode + /// + /// \note As of v0.4.2, no timestamp check is performed. + /// + /// \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() const; + + /// \returns %BAM filename + const std::string& Filename() const; + + /// \returns true if %BAM file has EOF marker (empty BGZF block). Streamed + /// input (filename: "-") + bool HasEOF() const; + + /// \returns true if ".pbi" exists and is newer than this %BAM file. + bool PacBioIndexExists() 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() const; + + /// \returns true if ".pbi" has a more recent timestamp than this file + bool PacBioIndexIsNewer() const; + + /// \returns true if ".bai" exists + bool StandardIndexExists() const; + + /// \note No guarantee is made on the existence of this file. + /// This method simply returns the expected filename. + std::string StandardIndexFilename() const; + + /// \returns true if ".bai" has a more recent timestamp than this file + bool StandardIndexIsNewer() const; + + /// \} + +public: + /// \name File Header Data + /// \{ + + /// \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() const; + + /// \returns true if file is a %PacBio %BAM file (i.e. has non-empty version + /// associated with header "pb" tag) + bool IsPacBioBAM() const; + + /// \returns ID for reference \p name (can be used for e.g. + /// GenomicIntervalQuery), or -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; + + /// \} + +public: + /// \name Additional Attributes + /// \{ + + /// \returns virtual offset of first alignment. Intended mostly for internal + /// use. Note that this is a BGZF \b virtual offset, not a + /// 'normal' file position. + /// + int64_t FirstAlignmentOffset() const; + + /// \} + +private: + class BamFilePrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAMFILE_H diff --git a/include/pbbam/BamFileMerger.h b/include/pbbam/BamFileMerger.h new file mode 100644 index 0000000..277d384 --- /dev/null +++ b/include/pbbam/BamFileMerger.h @@ -0,0 +1,58 @@ +// Author: Derek Barnett + +#ifndef BAMFILEMERGER_H +#define BAMFILEMERGER_H + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +class DataSet; +class IRecordWriter; + +class BamFileMerger +{ +public: + /// \brief Runs merger on BAM files. + /// + /// When this function exits, a merged BAM (and optional PBI) will have been + /// written and closed. + /// + /// \param[in] bamFilenames input filenames + /// \param[in] outputFilename resulting BAM output + /// \param[in] createPbi if true, creates a PBI alongside output BAM + /// \param[in] pgInfo allows client applications to add its @PG entry to merged header + /// + /// \throws std::runtime_error if any any errors encountered while reading or writing + /// + static void Merge(const std::vector& bamFilenames, + const std::string& outputFilename, bool createPbi = true, + const ProgramInfo& pgInfo = ProgramInfo{}); + + /// \brief Runs merger on a dataset, applying any supplied filters. + /// + /// When this function exits, a merged BAM (and optional PBI) will have been + /// written and closed. + /// + /// \param[in] dataset provides input filenames & filters + /// \param[in] outputFilename resulting BAM output + /// \param[in] createPbi if true, creates a PBI alongside output BAM + /// \param[in] pgInfo allows client applications to add its @PG entry to merged header + /// + /// \throws std::runtime_error if any any errors encountered while reading or writing + /// + static void Merge(const PacBio::BAM::DataSet& dataset, const std::string& outputFilename, + bool createPbi = true, const ProgramInfo& pgInfo = ProgramInfo{}); + + static void Merge(const std::vector& bamFilenames, IRecordWriter& writer); + + static void Merge(const PacBio::BAM::DataSet& dataset, IRecordWriter& writer); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAMFILEMERGER_H diff --git a/include/pbbam/BamHeader.h b/include/pbbam/BamHeader.h new file mode 100644 index 0000000..93ddb67 --- /dev/null +++ b/include/pbbam/BamHeader.h @@ -0,0 +1,388 @@ +// File Description +/// \file BamHeader.h +/// \brief Defines the BamHeader class. +// +// Author: Derek Barnett + +#ifndef BAMHEADER_H +#define BAMHEADER_H + +#include +#include +#include +#include +#include +#include + +#include "pbbam/Config.h" +#include "pbbam/ProgramInfo.h" +#include "pbbam/ReadGroupInfo.h" +#include "pbbam/SequenceInfo.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BamHeader class represents the header section of the %BAM file. +/// +/// It provides metadata about the file including file version, reference +/// sequences, read groups, comments, etc. +/// +/// A BamHeader may be fetched from a BamFile to view an existing file's +/// metadata. Or one may be created/edited for use with writing to a new file +/// (via BamWriter). +/// +/// \note A particular BamHeader is likely to be re-used in lots of places +/// throughout the library, for read-only purposes. For this reason, even +/// though a BamHeader may be returned by value, it is essentially a thin +/// wrapper for a shared-pointer to the actual data. This means, though, +/// that if you need to edit an existing BamHeader for use with a +/// BamWriter, please consider using BamHeader::DeepCopy. Otherwise any +/// modifications will affect all BamHeaders that are sharing its +/// underlying data. +/// +class PBBAM_EXPORT BamHeader +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// + /// \brief Creates a BamHeader from SAM-formatted text + /// \param samHeaderText + /// + BamHeader(const std::string& samHeaderText); + + BamHeader(); + BamHeader(const BamHeader&); + BamHeader(BamHeader&&); + BamHeader& operator=(const BamHeader&); + BamHeader& operator=(BamHeader&&); + ~BamHeader(); + + /// \brief Detaches underlying data from the shared-pointer, returning a + /// independent copy of the header contents. + /// + /// This ensures that any modifications to the newly returned BamHeader do + /// not affect other BamHeader objects that were sharing its underlying data. + /// + BamHeader DeepCopy() const; + + /// \} + +public: + /// \name Operators + /// \{ + + /// \brief Merges another header with this one. + /// + /// Headers must be compatible for merging. This means that their Version, + /// SortOrder, PacBioBamVersion (and in the case of aligned BAM data, + /// Sequences) must all match. If not, an exception will be thrown. + /// + /// \param[in] other header to merge with this one + /// \returns reference to this header + /// + /// \throws std::runtime_error if the headers are not compatible + /// + BamHeader& operator+=(const BamHeader& other); + + /// \brief Creates a new, merged header. + /// + /// Headers must be compatible for merging. This means that their Version, + /// SortOrder, PacBioBamVersion (and in the case of aligned BAM data, + /// Sequences) must all match. If not, an exception will be thrown. + /// + /// Both original headers (this header and \p other) will not be modified. + /// + /// \param[in] other header to merge with this one + /// \returns merged header + /// + /// \throws std::runtime_error if the headers are not compatible + /// + BamHeader operator+(const BamHeader& other) const; + + /// \} + +public: + /// \name General Attributes + /// \{ + + /// \returns the %PacBio %BAM version number (\@HD:pb) + /// + /// \note This is different from the SAM/BAM version number + /// \sa BamHeader::Version. + /// + std::string PacBioBamVersion() const; + + /// \returns the sort order used + /// + /// Valid values: "unknown", "unsorted", "queryname", or "coordinate" + /// + std::string SortOrder() const; + + /// \returns the SAM/BAM version number (\@HD:VN) + /// + /// \note This is different from the %PacBio %BAM version number + /// \sa BamHeader::PacBioBamVersion + /// + std::string Version() const; + + /// \} + +public: + /// \name Read Groups + /// \{ + + /// \returns true if the header contains a read group with \p id (\@RG:ID) + bool HasReadGroup(const std::string& id) const; + + /// \returns a ReadGroupInfo object representing the read group matching + /// \p id (\@RG:ID) + /// \throws std::runtime_error if \p id is unknown + /// + ReadGroupInfo ReadGroup(const std::string& id) const; + + /// \returns vector of read group IDs listed in this header + std::vector ReadGroupIds() const; + + /// \returns vector of ReadGroupInfo objects, representing all read groups + /// listed in this header + /// + std::vector ReadGroups() const; + + /// \} + +public: + /// \name Sequences + /// \{ + + /// \returns true if header contains a sequence with \p name (\@SQ:SN) + bool HasSequence(const std::string& name) const; + + /// \returns number of sequences (\@SQ entries) stored in this header + size_t NumSequences() const; + + /// \returns numeric ID for sequence matching \p name (\@SQ:SN) + /// + /// This is the numeric ID used elsewhere throughout the API. + /// + /// \throws std::runtime_error if \p name is unknown + /// \sa BamReader::ReferenceId, PbiReferenceIdFilter, + /// PbiRawMappedData::tId_ + /// + int32_t SequenceId(const std::string& name) const; + + /// \returns the length of the sequence (\@SQ:LN, e.g. chromosome length) at + /// index \p id + /// + /// \sa SequenceInfo::Length, BamHeader::SequenceId + /// + std::string SequenceLength(const int32_t id) const; + + /// \returns the name of the sequence (\@SQ:SN) at index \p id + /// + /// \sa SequenceInfo::Name, BamHeader::SequenceId + /// + std::string SequenceName(const int32_t id) const; + + /// \returns vector of sequence names (\@SQ:SN) stored in this header + /// + /// Position in the vector is equivalent to SequenceId. + /// + std::vector SequenceNames() const; + + /// \returns SequenceInfo object at index \p id + /// + /// \throws std::out_of_range if \p is an invalid or unknown index + /// \sa BamHeader::SequenceId + /// + SequenceInfo Sequence(const int32_t id) const; + + /// \returns SequenceInfo for the sequence matching \p name + SequenceInfo Sequence(const std::string& name) const; + + /// \returns vector of SequenceInfo objects representing the sequences + /// (\@SQ entries) stored in this header + /// + std::vector Sequences() const; + + /// \} + +public: + /// \name Programs + /// \{ + + /// \returns true if this header contains a program entry with ID (\@PG:ID) + /// matching \p id + /// + bool HasProgram(const std::string& id) const; + + /// \returns ProgramInfo object for the program entry matching \p id + /// \throws std::runtime_error if \p id is unknown + /// + ProgramInfo Program(const std::string& id) const; + + /// \returns vector of program IDs (\@PG:ID) + std::vector ProgramIds() const; + + /// \returns vector of ProgramInfo objects representing program entries + /// (\@PG) stored in this heder + /// + std::vector Programs() const; + + /// \} + +public: + /// \name Comments + /// \{ + + /// \returns vector of comment (\@CO) strings + std::vector Comments() const; + + /// \} + +public: + /// \name Conversion Methods + /// \{ + + /// \returns SAM-header-formatted string representing this header's data + std::string ToSam() const; + + /// \} + +public: + /// \name General Attributes + /// \{ + + /// \brief Sets this header's PacBioBAM version number (\@HD:pb). + /// + /// \returns reference to this object + /// \throws std::runtime_error if version number cannot be parsed or + /// is less than the minimum version allowed. + /// + BamHeader& PacBioBamVersion(const std::string& version); + + /// \brief Sets this header's sort order label (\@HD:SO). + /// + /// Valid values: "unknown", "unsorted", "queryname", or "coordinate" + /// + /// \returns reference to this object + /// + BamHeader& SortOrder(std::string order); + + /// \brief Sets this header's SAM/BAM version number (\@HD:VN). + /// + /// \returns reference to this object + /// + BamHeader& Version(std::string version); + + /// \} + +public: + /// \name Read Groups + /// \{ + + /// \brief Appends a read group entry (\@RG) to this header. + /// + /// \returns reference to this object + /// + BamHeader& AddReadGroup(ReadGroupInfo readGroup); + + /// \brief Removes all read group entries from this header. + /// + /// \returns reference to this object + /// + BamHeader& ClearReadGroups(); + + /// \brief Replaces this header's list of read group entries with those in + /// \p readGroups. + /// + /// \returns reference to this object + /// + BamHeader& ReadGroups(std::vector readGroups); + + /// \} + +public: + /// \name Sequences + /// \{ + + /// \brief Appends a sequence entry (\@SQ) to this header. + /// + /// \returns reference to this object + /// + BamHeader& AddSequence(SequenceInfo sequence); + + /// \brief Removes all sequence entries from this header. + /// + /// \returns reference to this object + /// + BamHeader& ClearSequences(); + + /// \brief Replaces this header's list of sequence entries with those in + /// \p sequences. + /// + /// \returns reference to this object + /// + BamHeader& Sequences(std::vector sequences); + + /// \} + +public: + /// \name Programs + /// \{ + + /// \brief Appends a program entry (\@PG) to this header. + /// + /// \returns reference to this object + /// + BamHeader& AddProgram(ProgramInfo pg); + + /// \brief Removes all program entries from this header. + /// + /// \returns reference to this object + /// + BamHeader& ClearPrograms(); + + /// \brief Replaces this header's list of program entries with those in + /// \p programs. + /// + /// \returns reference to this object + /// + BamHeader& Programs(std::vector programs); + + /// \} + +public: + /// \name Comments + /// \{ + + /// \brief Appends a comment (\@CO) to this header. + /// + /// \returns reference to this object + /// + BamHeader& AddComment(std::string comment); + + /// \brief Removes all comments from this header. + /// + /// \returns reference to this object + /// + BamHeader& ClearComments(); + + /// \brief Replaces this header's list of comments with those in \p comments. + /// + /// \returns reference to this object + /// + BamHeader& Comments(std::vector comments); + + /// \} + +private: + class BamHeaderPrivate; + std::shared_ptr 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..2b2178b --- /dev/null +++ b/include/pbbam/BamReader.h @@ -0,0 +1,150 @@ +// File Description +/// \file BamReader.h +/// \brief Defines the BamReader class. +// +// Author: Derek Barnett + +#ifndef BAMREADER_H +#define BAMREADER_H + +#include +#include +#include + +#include + +#include "pbbam/BamFile.h" +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/Config.h" +#include "pbbam/GenomicInterval.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BamReader class provides basic read-access to a %BAM file. +/// +/// The base-class implementation provides a sequential read-through of BAM +/// records. Derived classes may implement other access schemes (e.g. genomic +/// region, PBI-enabled record filtering). +/// +class PBBAM_EXPORT BamReader +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Opens BAM file for reading. + /// + /// \param[in] fn %BAM filename + /// \throws std::runtime_error if failed to open + /// + explicit BamReader(std::string fn); + + /// \brief Opens BAM file for reading. + /// + /// \param[in] bamFile BamFile object + /// \throws std::runtime_error if failed to open + /// + explicit BamReader(BamFile bamFile); + + virtual ~BamReader(); + + /// \} + +public: + /// \name BAM File Attributes + /// \{ + + /// \returns the underlying BamFile + const BamFile& File() const; + + /// \returns %BAM filename + const std::string& Filename() const; + + /// \returns BamHeader object from %BAM header contents + const BamHeader& Header() const; + + /// \} + +public: + /// \name BAM File I/O + /// \{ + + /// \brief Fetches the "next" %BAM record. + /// + /// Default implementation will read records until EOF. Derived readers may + /// use additional criteria to decide which record is "next" and when + /// reading is done. + /// + /// \param[out] record next BamRecord object. Should not be used if method + /// returns false. + /// + /// \returns true if record was read successfully. Returns false if EOF (or + /// end of iterator in derived readers). False is not an error, + /// it indicates "end of data". + /// + /// \throws std::runtime_error if failed to read from file (e.g. possible + /// truncated or corrupted file). + /// + bool GetNext(BamRecord& record); + + /// \brief Seeks to virtual offset in %BAM. + /// + /// \note This is \b NOT a normal file offset, but the virtual offset used + /// in %BAM indexing. + /// + /// \throws std::runtime_error if failed to seek + /// + void VirtualSeek(int64_t virtualOffset); + + /// \returns current (virtual) file position. + /// + /// \note This is \b NOT a normal file offset, but the virtual offset used + /// in %BAM indexing. + /// + int64_t VirtualTell() const; + + /// \} + +protected: + /// \name BAM File I/O + /// \{ + + /// \brief Helper method for access to underlying BGZF stream pointer. + /// + /// Useful for derived readers' contact points with htslib methods. + /// + /// \returns BGZF stream pointer + /// + BGZF* Bgzf() const; + + /// \brief Performs the actual raw read of the next record from the BAM + /// file. + /// + /// Default implementation will read records, sequentially, until EOF. + /// Derived readers may use additional criteria to decide which record is + /// "next" and when reading is done. + /// + /// Return value should be equivalent to htslib's bam_read1(): + /// >= 0 : normal + /// -1 : EOF (not an error) + /// < -1 : error + /// + /// \param[in] bgzf BGZF stream pointer + /// \param[out] b %BAM record pointer + /// \returns integer status code, see description + /// + virtual int ReadRawData(BGZF* bgzf, bam1_t* b); + + /// \} + +private: + class BamReaderPrivate; + std::unique_ptr d_; +}; + +} // 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..c65b05b --- /dev/null +++ b/include/pbbam/BamRecord.h @@ -0,0 +1,1273 @@ +// File Description +/// \file BamRecord.h +/// \brief Defines the BamRecord class. +// +// Author: Derek Barnett + +#ifndef BAMRECORD_H +#define BAMRECORD_H + +#include +#include +#include +#include +#include +#include + +#include "pbbam/Accuracy.h" +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecordImpl.h" +#include "pbbam/ClipType.h" +#include "pbbam/FrameEncodingType.h" +#include "pbbam/Frames.h" +#include "pbbam/LocalContextFlags.h" +#include "pbbam/Orientation.h" +#include "pbbam/PulseBehavior.h" +#include "pbbam/PulseExclusionReason.h" +#include "pbbam/QualityValues.h" +#include "pbbam/ReadGroupInfo.h" +#include "pbbam/RecordType.h" +#include "pbbam/Strand.h" +#include "pbbam/ZmwType.h" +#include "pbbam/virtual/VirtualRegionType.h" + +namespace PacBio { +namespace BAM { + +class Pulse2BaseCache; + +/// \brief The BamRecord class represents a %PacBio %BAM record. +/// +/// %PacBio %BAM records are extensions of normal SAM/BAM records. Thus in +/// addition to normal fields like bases, qualities, mapping coordinates, etc., +/// tags are used extensively to annotate records with additional +/// PacBio-specific data. +/// +/// Mapping and clipping APIs are provided as well to ensure that such +/// operations "trickle down" to all data fields properly. +/// +/// \sa https://samtools.github.io/hts-specs/SAMv1.pdf +/// for more information on standard %BAM data, and +/// https://github.com/PacificBiosciences/PacBioFileFormats/blob/3.0/BAM.rst +/// for more information on %PacBio %BAM fields. +/// +class PBBAM_EXPORT BamRecord +{ +public: + /// \name Constructors & Related Methods + /// \{ + + BamRecord(); + BamRecord(BamHeader header); + BamRecord(BamRecordImpl impl); + BamRecord(const BamRecord& other); + BamRecord(BamRecord&& other); + BamRecord& operator=(const BamRecord& other); + BamRecord& operator=(BamRecord&& other); + virtual ~BamRecord(); + + /// \} + +public: + /// \name General Data + /// \{ + + /// \returns this record's full name + /// \sa BamRecordImpl::Name + /// + std::string FullName() const; + + /// \returns shared pointer to this record's associated BamHeader + BamHeader Header() const; + + /// \returns ZMW hole number + /// \throws if missing zm tag & record name does not contain hole number + /// + int32_t HoleNumber() const; + + /// \returns this record's LocalContextFlags + PacBio::BAM::LocalContextFlags LocalContextFlags() const; + + /// \returns this record's movie name + std::string MovieName() const; + + /// \returns "number of complete passes of the insert" + int32_t NumPasses() const; + + /// \returns the record's query end position, or Sequence().length() if not + /// stored + /// \note QueryEnd is in polymerase read coordinates, NOT genomic + /// coordinates. + /// + Position QueryEnd() const; + + /// \returns the record's query start position, or 0 if not stored + /// + /// \note QueryStart is in polymerase read coordinates, NOT genomic + /// coordinates. + /// + Position QueryStart() const; + + /// \returns this record's expected read accuracy [0, 1000] + Accuracy ReadAccuracy() const; + + /// \returns ReadGroupInfo object for this record + ReadGroupInfo ReadGroup() const; + + /// \returns string ID of this record's read group + /// + /// This method should be perferred over ReadGroupBaseId() in most cases, + /// e.g. mapping between header info. + /// + /// For "ID:12345678": + /// b.ReadGroupId() -> "12345678" + /// b.ReadGroupBaseId() -> "12345678" + /// + /// For "ID:12345678/0--0": + /// b.ReadGroupId() -> "12345678/0--0"; + /// b.ReadGroupBaseId -> "12345678" + /// + /// \sa BamRecord::ReadGroupBaseId + /// \sa ReadGroupInfo::Id + /// \sa ReadGroupInfo::BaseId + /// + std::string ReadGroupId() const; + + /// \returns string base ID (stripped of optional barcode labels) + /// + /// ReadGroupId() should be preferred over this method in most cases. This + /// is intended for use with hash-string or integers directly. + /// + /// For "ID:12345678": + /// b.ReadGroupId() -> "12345678" + /// b.ReadGroupBaseId() -> "12345678" + /// + /// For "ID:12345678/0--0": + /// b.ReadGroupId() -> "12345678/0--0"; + /// b.ReadGroupBaseId -> "12345678" + /// + /// \sa BamRecord::ReadGroupId + /// \sa ReadGroupInfo::Id + /// \sa ReadGroupInfo::BaseId + /// + std::string ReadGroupBaseId() const; + + /// \returns integer value for this record's read group ID + int32_t ReadGroupNumericId() const; + + /// \returns this scrap record's scrap region type + VirtualRegionType ScrapRegionType() const; + + /// \returns this scrap record's scrap ZMW type + ZmwType ScrapZmwType() const; + + /// \returns this record's average signal-to-noise for each of A, C, G, + /// and T + /// + std::vector SignalToNoise() const; + + /// \returns this record's type + /// \sa RecordType + RecordType Type() const; + + /// \} + +public: + /// \name Mapping Data + /// \{ + + /// \returns the record's aligned end position + /// + /// \note AlignedEnd is in polymerase read coordinates, NOT genomic + /// coordinates. + /// + Position AlignedEnd() const; + + /// \returns the record's aligned start position + /// + /// \note AlignedStart is in polymerase read coordinates, NOT genomic + /// coordinates. + /// + Position AlignedStart() const; + + /// \returns the record's strand as a Strand enum value + Strand AlignedStrand() const; + + /// \returns the record's CIGAR data as a Cigar object + /// + /// \param[in] exciseAllClips if true, remove all clipping operations + /// (hard & soft) [default:false] + /// + Cigar CigarData(bool exciseAllClips = false) const; + + /// \returns true if this record was mapped by aligner + bool IsMapped() const; + + /// \returns this record's mapping quality. A value of 255 indicates + /// "unknown" + /// + uint8_t MapQuality() const; + + /// \returns the number of deleted bases (relative to reference) + size_t NumDeletedBases() const; + + /// \returns the number of inserted bases (relative to reference) + size_t NumInsertedBases() const; + + /// \returns the number of matching bases (sum of '=' CIGAR op lengths) + size_t NumMatches() const; + + /// \returns a tuple containing NumMatches (first) and NumMismatches + /// (second) + /// + std::pair NumMatchesAndMismatches() const; + + /// \returns the number of mismatching bases (sum of 'X' CIGAR op lengths) + size_t NumMismatches() 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() const; + + /// \returns this record's reference name. + /// + /// \throws an exception if unmapped record. + /// + std::string ReferenceName() const; + + /// \returns the record's reference end position, or UnmappedPosition if + /// unmapped + /// + /// \note ReferenceEnd is in reference coordinates, NOT polymerase read + /// coordinates. + /// + Position ReferenceEnd() const; + + /// \returns the record's reference start position, or UnmappedPosition if + /// unmapped + /// + /// \note ReferenceStart is in reference coordinates, NOT polymerase read + /// coordinates. + /// + Position ReferenceStart() const; + + /// \} + +public: + /// \name Barcode Data + /// \{ + + /// \returns forward barcode id + /// + /// \throws std::runtime_error if barcode data is absent or malformed. + /// \sa HasBarcodes + /// + int16_t BarcodeForward() const; + + /// \returns barcode call confidence (Phred-scaled posterior probability + /// of correct barcode call) + /// + /// \sa HasBarcodeQuality + /// + uint8_t BarcodeQuality() const; + + /// \returns reverse barcode id + /// + /// \throws std::runtime_error if barcode data is absent or malformed. + /// \sa HasBarcodes + /// + int16_t BarcodeReverse() const; + + /// \returns the forward and reverse barcode ids + /// + /// \throws std::runtime_error if barcode data is absent or malformed. + /// \sa HasBarcodes + /// + std::pair Barcodes() const; + + /// \} + +public: + /// \name Auxiliary Data Queries + /// \{ + + /// \returns true if this record has AltLabelQV data + bool HasAltLabelQV() const; + + /// \returns true if this record has AltLabelTag data + bool HasAltLabelTag() const; + + /// \returns true if this record has Barcode data + bool HasBarcodes() const; + + /// \returns true is this record has BarcodeQuality data + bool HasBarcodeQuality() const; + + /// \returns true if this record has DeletionQV data + bool HasDeletionQV() const; + + /// \returns true if this record has DeletionTag data + bool HasDeletionTag() const; + + /// \returns true if this record has a HoleNumber + bool HasHoleNumber() const; + + /// \returns true if this record has InsertionQV data + bool HasInsertionQV() const; + + /// \returns true if this record has IPD data + bool HasIPD() const; + + /// \returns true if this record has LabelQV data + bool HasLabelQV() const; + + /// \returns true if this record has LocalContextFlags (absent in CCS) + bool HasLocalContextFlags() const; + + /// \returns true if this record has MergeQV data + bool HasMergeQV() const; + + /// \returns true if this record has NumPasses data + bool HasNumPasses() const; + + /// \returns true if this record has Pkmean data + bool HasPkmean() const; + + /// \returns true if this record has Pkmid data + bool HasPkmid() const; + + /// \returns true if this record has Pkmean2 data + bool HasPkmean2() const; + + /// \returns true if this record has Pkmid2 data + bool HasPkmid2() const; + + /// \returns true if this record has PreBaseFrames aka IPD data + bool HasPreBaseFrames() const; + + /// \returns true if this record has PrePulseFrames data + bool HasPrePulseFrames() const; + + /// \returns true if this record has PulseCall data + bool HasPulseCall() const; + + /// \returns true if this record has PulseCallWidth data + bool HasPulseCallWidth() const; + + /// \returns true if this record has PulseExclusion data + bool HasPulseExclusion() const; + + /// \returns true if this record has PulseMergeQV data + bool HasPulseMergeQV() const; + + /// \returns true if this record has PulseWidth data + bool HasPulseWidth() const; + + /// \returns true if this record has ReadAccuracyTag data + bool HasReadAccuracy() const; + + /// \returns true if this record has QueryEnd data + bool HasQueryEnd() const; + + /// \returns true if this record has QueryStart data + bool HasQueryStart() const; + + /// \returns true if this record has ScrapRegionType data (only in SCRAP) + bool HasScrapRegionType() const; + + /// \returns true if this record has scrap ZMW type data (only in SCRAP) + bool HasScrapZmwType() const; + + /// \returns true if this record has signal-to-noise data (absent in + /// POLYMERASE) + /// + bool HasSignalToNoise() const; + + /// \returns true if this record has StartFrame data + bool HasStartFrame() const; + + /// \returns true if this record has SubstitutionQV data + bool HasSubstitutionQV() const; + + /// \returns true if this record has SubstitutionTag data + bool HasSubstitutionTag() const; + + /// \} + +public: + /// \name Sequence & Tag Data + /// \{ + + /// \brief Fetches 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, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches 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 Fetches 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 Fetches 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 Quality Data + /// \{ + + /// \brief Fetches 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, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches 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 Fetches 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 Fetches 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, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches 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 Fetches 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 Fetches 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; + + /// \} + +public: + /// \name Pulse Data + /// \{ + + /// \brief Fetches 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 Fetches 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 Fetches this record's Pkmean values ("pa" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns Pkmean as vector object + /// + std::vector Pkmean(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches this record's Pkmid values ("pm" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns Pkmid as vector object + /// + std::vector Pkmid(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches this record's Pkmean2 values ("pi" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns Pkmean as vector object + /// + std::vector Pkmean2(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches this record's Pkmid2 values ("ps" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns Pkmid as vector object + /// + std::vector Pkmid2(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches 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 Fetches this record's PrePulseFrames values ("pd" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns PrePulseFrames as Frames object + /// + Frames PrePulseFrames(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches this record's PulseCall values ("pc" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns PulseCalls string + /// + std::string PulseCall(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches this record's PulseCallWidth values ("px" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns PulseCallWidth as Frames object + /// + Frames PulseCallWidth(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches this record's PulseExclusionReason values ("pe" tag). + /// + /// \returns vector of pulse exclusion reason value + /// + std::vector PulseExclusionReason( + Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetch this record's PulseMergeQV values ("pg" tag). + /// + /// \param[in] orientation Orientation of output. + /// \returns PulseMergeQV as QualityValues object + /// + QualityValues PulseMergeQV(Orientation orientation = Orientation::NATIVE, bool aligned = false, + bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \brief Fetches 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 Fetches 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, bool aligned = false, + bool exciseSoftClips = false) const; + + /// \brief Fetches this record's StartFrame values ("sf" tag). + /// + /// \param[in] orientation Orientation of output + /// + /// \returns StartFrame as uint32_t vector + /// + std::vector StartFrame(Orientation orientation = Orientation::NATIVE, + bool aligned = false, bool exciseSoftClips = false, + PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + /// \} + +public: + /// \name Low-Level Access & Operations + /// \{ + + /// \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() 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(); + + /// \} + +public: + /// \name General Data + /// \{ + + /// \brief Sets this record's ZMW hole number. + /// + /// \param[in] holeNumber + /// \returns reference to this record + /// + BamRecord& HoleNumber(const int32_t holeNumber); + + /// \brief Sets this record's local context flags + /// + /// \param[in] flags + /// \returns reference to this record + /// + BamRecord& LocalContextFlags(const PacBio::BAM::LocalContextFlags flags); + + /// \brief 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); + + /// \brief Sets this record's query end position. + /// + /// \note Changing this will modify the name of non-CCS records. + /// + /// \param[in] pos + /// \returns reference to this record + /// + BamRecord& QueryEnd(const PacBio::BAM::Position pos); + + /// \brief Sets this record's query start position. + /// + /// \note Changing this will modify the name of non-CCS records. + /// + /// \param[in] pos + /// \returns reference to this record + /// + BamRecord& QueryStart(const PacBio::BAM::Position pos); + + /// \brief Sets this record's expected read accuracy [0, 1000] + /// + /// \param[in] accuracy + /// \returns reference to this record + /// + BamRecord& ReadAccuracy(const Accuracy& accuracy); + + /// \brief Attaches this record to the provided read group, changing the + /// record name & 'RG' tag. + /// + /// \param[in] rg + /// \returns reference to this record + /// + BamRecord& ReadGroup(const ReadGroupInfo& rg); + + /// \brief Attaches this record to the provided read group, changing the + /// record name & 'RG' tag. + /// + /// \param[in] id + /// \returns reference to this record + /// + BamRecord& ReadGroupId(const std::string& id); + + /// \brief Sets this scrap record's ScrapRegionType + /// + /// \param[in] type + /// \returns reference to this record + /// + BamRecord& ScrapRegionType(const VirtualRegionType type); + + /// \brief Sets this scrap record's ScrapRegionType + /// + /// \param[in] type character equivalent of VirtualRegionType + /// \returns reference to this record + /// + BamRecord& ScrapRegionType(const char type); + + /// \brief Sets this scrap record's ScrapZmwType + /// + /// \param[in] type + /// \returns reference to this record + /// + BamRecord& ScrapZmwType(const ZmwType type); + + /// \brief Sets this scrap record's ScrapZmwType + /// + /// \param[in] type character equivalent of ZmwType + /// \returns reference to this record + /// + BamRecord& ScrapZmwType(const char type); + + /// \brief Sets this record's average signal-to-noise in each of A, C, G, + /// and T + /// + /// \param[in] snr average signal-to-noise of A, C, G, and T (in this order) + /// \returns reference to this record + /// + BamRecord& SignalToNoise(const std::vector& snr); + + /// \} + +public: + /// \name Barcode Data + /// \{ + + /// \brief Sets this record's barcode IDs ('bc' tag) + /// + /// \param[in] barcodeIds + /// \returns reference to this record + /// + BamRecord& Barcodes(const std::pair& barcodeIds); + + /// \brief Sets this record's barcode quality ('bq' tag) + /// + /// \param[in] quality Phred-scaled confidence call + /// \returns reference to this record + /// + BamRecord& BarcodeQuality(const uint8_t quality); + + /// \} + +public: + /// \name Sequence & Tag Data + /// \{ + + /// \brief Sets this record's AltLabelTag values ("at" tag). + /// + /// \param[in] tags + /// \returns reference to this record + /// + BamRecord& AltLabelTag(const std::string& tags); + + /// \brief Sets this record's DeletionTag values ("dt" tag). + /// + /// \param[in] tags + /// \returns reference to this record + /// + BamRecord& DeletionTag(const std::string& tags); + + /// \brief Sets this record's SubstitutionTag values ("st" tag). + /// + /// \param[in] tags + /// \returns reference to this record + /// + BamRecord& SubstitutionTag(const std::string& tags); + + /// \} + +public: + /// \name Quality Data + /// \{ + + /// \brief Sets this record's AltLabelQV values ("pv" tag). + /// + /// \param[in] altLabelQVs + /// \returns reference to this record + /// + BamRecord& AltLabelQV(const QualityValues& altLabelQVs); + + /// \brief Sets this record's DeletionQV values ("dq" tag). + /// + /// \param[in] deletionQVs + /// \returns reference to this record + /// + BamRecord& DeletionQV(const QualityValues& deletionQVs); + + /// \brief Sets this record's InsertionQV values ("iq" tag). + /// + /// \param[in] insertionQVs + /// \returns reference to this record + /// + BamRecord& InsertionQV(const QualityValues& insertionQVs); + + /// \brief Sets this record's LabelQV values ("pq" tag). + /// + /// \param[in] labelQVs + /// \returns reference to this record + /// + BamRecord& LabelQV(const QualityValues& labelQVs); + + /// \brief Sets this record's MergeQV values ("mq" tag). + /// + /// \param[in] mergeQVs + /// \returns reference to this record + /// + BamRecord& MergeQV(const QualityValues& mergeQVs); + + /// \brief Sets this record's SubstitutionQV values ("sq" tag). + /// + /// \param[in] substitutionQVs + /// \returns reference to this record + /// + BamRecord& SubstitutionQV(const QualityValues& substitutionQVs); + + /// \} + +public: + /// \name Pulse Data + /// \{ + + /// \brief 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); + + /// \brief Sets this record's Pkmean values ("pm" tag). + /// + /// \param[in] photons + /// \returns reference to this record + /// + BamRecord& Pkmean(const std::vector& photons); + + /// \brief Sets this record's Pkmean values ("pm" tag). + /// + /// \param[in] encodedPhotons + /// \returns reference to this record + /// + BamRecord& Pkmean(const std::vector& encodedPhotons); + + /// \brief Sets this record's Pkmid values ("pa" tag). + /// + /// \param[in] photons + /// \returns reference to this record + /// + BamRecord& Pkmid(const std::vector& photons); + + /// \brief Sets this record's Pkmid values ("pa" tag). + /// + /// \param[in] encodedPhotons + /// \returns reference to this record + /// + BamRecord& Pkmid(const std::vector& encodedPhotons); + + /// \brief Sets this record's Pkmean2 values ("ps" tag). + /// + /// \param[in] photons + /// \returns reference to this record + /// + BamRecord& Pkmean2(const std::vector& photons); + + /// \brief Sets this record's Pkmean2 values ("ps" tag). + /// + /// \param[in] encodedPhotons + /// \returns reference to this record + /// + BamRecord& Pkmean2(const std::vector& encodedPhotons); + + /// \brief Sets this record's Pkmid2 values ("pi" tag). + /// + /// \param[in] photons + /// \returns reference to this record + /// + BamRecord& Pkmid2(const std::vector& photons); + + /// \brief Sets this record's Pkmid2 values ("pi" tag). + /// + /// \param[in] encodedPhotons + /// \returns reference to this record + /// + BamRecord& Pkmid2(const std::vector& encodedPhotons); + + /// \brief 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); + + /// \brief 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); + + /// \brief Sets this record's PulseCall values ("pc" tag). + /// + /// \param[in] tags + /// \returns reference to this record + /// + BamRecord& PulseCall(const std::string& tags); + + /// \brief 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); + + /// + /// \\brief Sets this record's PulseExclusionReason values ("pe" tag). + /// \param[in] reasons + /// \return reference to this record + /// + BamRecord& PulseExclusionReason(const std::vector& reasons); + + /// \brief Sets this record's PulseMergeQV values ("pg" tag). + /// + /// \param[in] pulseMergeQVs + /// \returns reference to this record + /// + BamRecord& PulseMergeQV(const QualityValues& pulseMergeQVs); + + /// \brief 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); + + /// \brief Sets this record's StartFrame values ("sf" tag). + /// + /// \param[in] startFrame + /// \returns reference to this record + /// + BamRecord& StartFrame(const std::vector& startFrame); + + /// \} + +public: + /// \name Low-Level Access & Operations + /// \{ + + /// \brief 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. + /// + void ResetCachedPositions() const; + + /// \brief 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. + /// + void ResetCachedPositions(); + + /// \brief Updates the record's name (BamRecord::FullName) to reflect + /// modifications to name components (movie name, ZMW hole number, + /// etc.) + /// + void UpdateName(); + + /// \} + +public: + /// \name Pulse Data + /// \{ + + static const float photonFactor; + + static std::vector EncodePhotons(const std::vector& data); + + /// \} + +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, + const bool exciseFlankingInserts = false); + + /// 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, const bool exciseFlankingInserts = false); + + /// 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 bool exciseFlankingInserts = false) 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: + /// \internal + /// cached positions (mutable to allow lazy-calc in const methods) + mutable Position alignedStart_; + mutable Position alignedEnd_; + +private: + /// \internal + /// pulse to bam mapping cache + mutable std::unique_ptr p2bCache_; + +public: + /// clips the PacBio tags to a specified length + void ClipTags(const size_t clipPos, const size_t clipLength); + +private: + ///\internal + /// clipping methods + + void ClipFields(const size_t clipPos, const size_t clipLength); + + BamRecord& ClipToQuery(const PacBio::BAM::Position start, const PacBio::BAM::Position end); + BamRecord& ClipToQueryForward(const PacBio::BAM::Position start, + const PacBio::BAM::Position end); + BamRecord& ClipToQueryReverse(const PacBio::BAM::Position start, + const PacBio::BAM::Position end); + BamRecord& ClipToReference(const PacBio::BAM::Position start, const PacBio::BAM::Position end, + const bool exciseFlankingInserts); + BamRecord& ClipToReferenceForward(const PacBio::BAM::Position start, + const PacBio::BAM::Position end, + const bool exciseFlankingInserts); + BamRecord& ClipToReferenceReverse(const PacBio::BAM::Position start, + const PacBio::BAM::Position end, + const bool exciseFlankingInserts); + +private: + ///\internal + /// raw tag data fetching + + // sequence tags + std::string FetchBasesRaw(const BamRecordTag tag) const; + std::string FetchBases(const BamRecordTag tag, + const Orientation orientation = Orientation::NATIVE, + const bool aligned = false, const bool exciseSoftClips = false, + const PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + // frame tags + Frames FetchFramesRaw(const BamRecordTag tag) const; + Frames FetchFrames(const BamRecordTag tag, const Orientation orientation = Orientation::NATIVE, + const bool aligned = false, const bool exciseSoftClips = false, + const PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + // pulse tags + std::vector FetchPhotonsRaw(const BamRecordTag tag) const; + std::vector FetchPhotons(const BamRecordTag tag, + const Orientation orientation = Orientation::NATIVE, + const bool aligned = false, const bool exciseSoftClips = false, + const PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + // QV tags + QualityValues FetchQualitiesRaw(const BamRecordTag tag) const; + QualityValues FetchQualities(const BamRecordTag tag, + const Orientation orientation = Orientation::NATIVE, + const bool aligned = false, const bool exciseSoftClips = false, + const PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + // UInt tags (e.g. start frame) + // + // TODO (DB): clean this up w.r.t FetchUInt8s + // + std::vector FetchUInt32sRaw(const BamRecordTag tag) const; + std::vector FetchUInt32s( + const BamRecordTag tag, const Orientation orientation = Orientation::NATIVE, + const bool aligned = false, const bool exciseSoftClips = false, + const PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + + // UInt tags (e.g. pulse exclusion) + // + // ODO (DB): clean this up w.r.t FetchUInt32s + // + std::vector FetchUInt8sRaw(const BamRecordTag tag) const; + std::vector FetchUInt8s(const BamRecordTag tag, + const Orientation orientation = Orientation::NATIVE, + const bool aligned = false, const bool exciseSoftClips = false, + const PulseBehavior pulseBehavior = PulseBehavior::ALL) const; + +private: + ///\internal + /// marked const to allow calling from const methods + /// but updates our mutable cached values + void CalculateAlignedPositions() const; + void CalculatePulse2BaseCache() const; + + friend class BamRecordMemory; +}; + +} // 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..35cbb2d --- /dev/null +++ b/include/pbbam/BamRecordBuilder.h @@ -0,0 +1,243 @@ +// File Description +/// \file BamRecordBuilder.h +/// \brief Defines the BamRecordBuilder class. +// +// Author: Derek Barnett + +#ifndef BAMRECORDBUILDER_H +#define BAMRECORDBUILDER_H + +#include +#include +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BamRecordBuilder class provides a helper utility for building +/// BamRecords. +/// +/// This class provides a mechanism for building up %BAM data and +/// lazy-encoding/constructing the actual BamRecord. Currently, the methods here +/// really only support filling in the low-level SAM/BAM-style fields, not so +/// much the PacBio-specific fields. +/// +class PBBAM_EXPORT BamRecordBuilder +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty %BAM record builder. + BamRecordBuilder(); + + /// \brief Creates an empty %BAM record builder, with header info to apply + /// to built records. + /// + /// \param[in] header BamHeader object + /// + explicit BamRecordBuilder(BamHeader header); + + /// \brief Creates record builder with inital record data. + /// + /// \param[in] prototype data from this record will be used to seed the + /// builder + /// + BamRecordBuilder(const BamRecord& prototype); + + BamRecordBuilder(const BamRecordBuilder&); + BamRecordBuilder(BamRecordBuilder&&); + BamRecordBuilder& operator=(const BamRecordBuilder&); + BamRecordBuilder& operator=(BamRecordBuilder&&); + ~BamRecordBuilder(); + + /// \} + +public: + /// \name Record-Building + /// \{ + + /// \brief Builds a BamRecord from current builder attributes. + /// + /// \returns newly-built BamRecord object + /// + BamRecord Build() const; + + /// \brief Replaces an existing BamRecord's data with current builder + /// attributes. + /// + /// \param[out] record resulting record + /// \returns true if successful + /// + bool BuildInPlace(BamRecord& record) const; + + /// \brief Resets builder attributes to default values. + /// + void Reset(); + + /// \brief Resets builder attributes with \p prototype's data. + /// + /// \param[in] prototype + /// + void Reset(BamRecord prototype); + + /// \} + +public: + /// \name Core Attribute Setup + /// \{ + + /// \brief 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); + + /// \brief 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); + + /// \brief Sets this record's insert size. + /// + /// \param[in] iSize insert size + /// \returns reference to this record + /// + BamRecordBuilder& InsertSize(const int32_t iSize); + + /// \brief 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); + + /// \brief 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); + + /// \brief 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); + + /// \brief 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); + + /// \brief 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 + /// \{ + + /// \brief Sets whether this record is a PCR/optical duplicate + BamRecordBuilder& SetDuplicate(bool ok); + + /// \brief Sets whether this record failed quality controls + BamRecordBuilder& SetFailedQC(bool ok); + + /// \brief Sets whether this record is the first mate of a pair. + BamRecordBuilder& SetFirstMate(bool ok); + + /// \brief Sets whether this record was aligned. + BamRecordBuilder& SetMapped(bool ok); + + /// \brief Sets whether this record's mate was aligned. + BamRecordBuilder& SetMateMapped(bool ok); + + /// \brief Sets whether this record's mate mapped to reverse strand. + BamRecordBuilder& SetMateReverseStrand(bool ok); + + /// \brief Sets whether this record came from paired-end sequencing. + BamRecordBuilder& SetPaired(bool ok); + + /// \brief Sets whether this record is a read's primary alignment. + BamRecordBuilder& SetPrimaryAlignment(bool ok); + + /// \brief Sets whether this record & its mate were properly mapped, per the + /// aligner. + /// + BamRecordBuilder& SetProperPair(bool ok); + + /// \brief Sets whether this record mapped to reverse strand. + BamRecordBuilder& SetReverseStrand(bool ok); + + /// \brief Sets whether this record is the second mate of a pair. + BamRecordBuilder& SetSecondMate(bool ok); + + /// \brief Sets whether this record is a supplementary alignment. + BamRecordBuilder& SetSupplementaryAlignment(bool ok); + + /// \} + +public: + /// \name Variable-Length Data Setup + /// \{ + + /// \brief Sets the record's CIGAR data. + /// + /// \returns reference to this builder + /// + BamRecordBuilder& Cigar(PacBio::BAM::Cigar cigar); + + /// \brief Sets the record's name. + /// + /// \returns reference to this builder + /// + BamRecordBuilder& Name(std::string name); + + /// \brief Sets the record's qualities. + /// + /// \returns reference to this builder + /// + BamRecordBuilder& Qualities(std::string qualities); + + /// \brief Sets the record's sequence. + /// + /// \returns reference to this builder + /// + BamRecordBuilder& Sequence(std::string sequence); + + /// \brief Sets the record's tags. + /// + /// \returns reference to this builder + /// + 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_; +}; + +} // 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..a8a27f8 --- /dev/null +++ b/include/pbbam/BamRecordImpl.h @@ -0,0 +1,590 @@ +// File Description +/// \file BamRecordImpl.h +/// \brief Defines the BamRecordImpl class. +// +// Author: Derek Barnett + +#ifndef BAMRECORDIMPL_H +#define BAMRECORDIMPL_H + +#include +#include +#include +#include +#include +#include +#include "pbbam/BamRecordTag.h" +#include "pbbam/Cigar.h" +#include "pbbam/Config.h" +#include "pbbam/Position.h" +#include "pbbam/QualityValues.h" +#include "pbbam/TagCollection.h" + +namespace PacBio { +namespace BAM { + +class SamWriter; + +/// \brief The BamRecordImpl class holds all data necessary for creating, +/// querying or editing a generic %BAM record. +/// +/// For PacBio-specific extensions and convenience methods, see BamRecord. +/// +/// \note This class is mostly an internal implementation detail and will +/// likely be removed from the public API in the future. Please use +/// BamRecord as much as possible. +/// +class PBBAM_EXPORT BamRecordImpl +{ +public: + // clang-format off + /// 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 + }; + // clang-format on + +public: + /// \name Constructors & Related Methods + /// \{ + + BamRecordImpl(); + BamRecordImpl(const BamRecordImpl& other); + BamRecordImpl(BamRecordImpl&& other); + BamRecordImpl& operator=(const BamRecordImpl& other); + BamRecordImpl& operator=(BamRecordImpl&& other); + virtual ~BamRecordImpl(); + + /// \} + +public: + /// \name Core Data + /// \{ + + /// \returns this record's assigned (BAI) index bin ID. + uint32_t Bin() const; + + /// \returns this record's alignment flag, in raw integer form. + uint32_t Flag() const; + + /// \returns this record's insert size + int32_t InsertSize() const; + + /// \returns this record's mapping quality. A value of 255 indicates "unknown" + uint8_t MapQuality() const; + + /// \returns this record's mate's mapped position, or -1 if unmapped + PacBio::BAM::Position MatePosition() const; + + /// \returns this record's mate's mapped reference ID, or -1 if unmapped + int32_t MateReferenceId() const; + + /// \returns this record's mapped position, or -1 if unmapped + PacBio::BAM::Position Position() const; + + /// \returns this record's mate's mapped reference ID, or -1 if unmapped + int32_t ReferenceId() const; + + /// Sets the record's (BAI) index bin ID. + /// + /// \param[in] bin BAI index bin ID. + /// \returns reference to this record + /// + 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 + /// + BamRecordImpl& Flag(uint32_t flag); + + /// Sets this record's insert size. + /// + /// \param[in] iSize insert size + /// \returns reference to this record + /// + 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 + /// + 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 + /// + 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 + /// + 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 + /// + 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 + /// + BamRecordImpl& ReferenceId(int32_t id); + + /// \} + +public: + /// \name Alignment Flags + /// \{ + + /// \returns true if this record is a PCR/optical duplicate + bool IsDuplicate() const; + + /// \returns true if this record failed quality controls + bool IsFailedQC() const; + + /// \returns true if this record is the first mate of a pair + bool IsFirstMate() const; + + /// \returns true if this record was mapped by aligner + bool IsMapped() const; + + /// \returns true if this record's mate was mapped by aligner + bool IsMateMapped() const; + + /// \returns true if this record's mate was mapped to the reverse strand + bool IsMateReverseStrand() const; + + /// \returns true if this record comes from paired-end sequencing + bool IsPaired() const; + + /// \returns true if this record is a read's primary alignment + bool IsPrimaryAlignment() const; + + /// \returns true if this record & its mate were properly aligned + bool IsProperPair() const; + + /// \returns true if this record was mapped to the reverse strand + bool IsReverseStrand() const; + + /// \returns true if this record is the second mate of a pair + bool IsSecondMate() const; + + /// \returns true if this record is a supplementary alignment + bool IsSupplementaryAlignment() const; + + /// Sets whether this record is a PCR/optical duplicate + BamRecordImpl& SetDuplicate(bool ok); + + /// Sets whether this record failed quality controls + BamRecordImpl& SetFailedQC(bool ok); + + /// Sets whether this record is the first mate of a pair. + BamRecordImpl& SetFirstMate(bool ok); + + /// Sets whether this record was aligned. + BamRecordImpl& SetMapped(bool ok); + + /// Sets whether this record's mate was aligned. + BamRecordImpl& SetMateMapped(bool ok); + + /// Sets whether this record's mate mapped to reverse strand. + BamRecordImpl& SetMateReverseStrand(bool ok); + + /// Sets whether this record came from paired-end sequencing. + BamRecordImpl& SetPaired(bool ok); + + /// Sets whether this record is a read's primary alignment. + BamRecordImpl& SetPrimaryAlignment(bool ok); + + /// Sets whether this record & its mate were properly mapped, per the aligner. + BamRecordImpl& SetProperPair(bool ok); + + /// Sets whether this record mapped to reverse strand. + BamRecordImpl& SetReverseStrand(bool ok); + + /// Sets whether this record is the second mate of a pair. + BamRecordImpl& SetSecondMate(bool ok); + + /// Sets whether this record is a supplementary alignment. + BamRecordImpl& SetSupplementaryAlignment(bool ok); + + /// \} + +public: + /// \name Variable-length Data (sequence, qualities, etc.) + /// \{ + + /// \returns the record's CIGAR data as a Cigar object + Cigar CigarData() 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() 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() const; + + /// \returns the record's DNA sequence. + std::string Sequence() const; + + size_t SequenceLength() 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 lengths? + /// + /// \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 = nullptr); + + /// \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 = nullptr); + + /// \} + +public: + /// \name Tag Data + /// \{ + + /// \returns record's full tag data as a TagCollection object + TagCollection Tags() const; + + /// \brief Sets the record's full tag data via a TagCollection object + /// + BamRecordImpl& Tags(const TagCollection& tags); + + /// \brief 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 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); + + /// \brief Adds a new tag to this record. + /// + /// This is an overloaded method. + /// + /// \param[in] tag BamRecordTag enum + /// \param[in] value Tag object that describes the type & value of data + /// to be added + /// \returns true if tag was successfully added. + /// + bool AddTag(const BamRecordTag tag, const Tag& value); + + /// \brief Adds a new tag to this record, with an optional modifier. + /// + /// \param[in] tagName 2-character tag name. + /// \param[in] value Tag object that describes the type & + /// value of data to be added + /// \param[in] additionalModifier optional extra modifier (for explicit + /// modification of an otherwise const Tag) + /// + /// \note Any value that can be used to implicitly construct a Tag is valid. + /// \code + /// char c; + /// string h; + /// record.AddTag("XX", c, TagModifier::ASCII_CHAR); // will add a char-type tag + /// record.AddTag("YY", h, TagModifier::HEX_STRING); // will add a hex string-type tag + /// \endcode + /// + /// \returns true if tag was successfully added. + /// + bool AddTag(const std::string& tagName, const Tag& value, const TagModifier additionalModifier); + + /// \brief Adds a new tag to this record, with an optional modifier. + /// + /// This is an overloaded method. + /// + /// \param[in] tag BamRecordTag enum. + /// \param[in] value Tag object that describes the type & + /// value of data to be added + /// \param[in] additionalModifier optional extra modifier (for explicit + /// modification of an otherwise const Tag) + /// + /// \returns true if tag was successfully added. + /// + bool AddTag(const BamRecordTag tag, const Tag& value, const TagModifier additionalModifier); + + /// \brief 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 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); + + /// \brief Edits an existing tag on this record. + /// + /// This is an overloaded method. + /// + /// \param[in] tag BamRecordTag enum + /// \param[in] newValue Tag object that describes the type & value of + /// new data to be added + /// + /// \returns true if tag was successfully edited. + /// + bool EditTag(const BamRecordTag tag, const Tag& newValue); + + /// \brief Edits an existing tag on this record. + /// + /// \param[in] tagName 2-character tag name. Name must be + /// present (see HasTag) + /// \param[in] value Tag object that describes the type & + /// value of new data to be added + /// \param[in] additionalModifier optional extra modifier (for explicit + /// modification of an otherwise const Tag) + /// + /// \note Any value that can be used to implicitly construct a Tag is valid. + /// \code + /// char c; + /// string h; + /// record.EditTag("XX", c, TagModifier::ASCII_CHAR); // will overwrite tag XX with a char-type tag + /// record.EditTag("YY", h, TagModifier::HEX_STRING); // will overwrite tag YY with a hex string-type tag + /// \endcode + /// + /// \returns true if tag was successfully edited. + /// + bool EditTag(const std::string& tagName, const Tag& value, + const TagModifier additionalModifier); + + /// \brief Edits an existing tag on this record. + /// + /// This is an overloaded method. + /// + /// \param[in] tag BamRecordTag enum + /// \param[in] value Tag object that describes the type & + /// value of new data to be added + /// \param[in] additionalModifier optional extra modifier (for explicit + /// modification of an otherwise const Tag) + /// + /// \returns true if tag was successfully edited. + /// + bool EditTag(const BamRecordTag tag, const Tag& value, const TagModifier additionalModifier); + + /// \returns true if a tag with this name is present in this record. + bool HasTag(const std::string& tagName) const; + + /// \returns true if this tag is present in this record. + /// + /// This is an overloaded method. + /// + bool HasTag(const BamRecordTag tag) const; + + /// \brief 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); + + /// \brief Removes an existing tag from this record. + /// + /// This is an overloaded method. + /// + /// \param[in] tag BamRecordTag enum + /// + /// \returns true if tag was actaully removed (i.e. false if tagName + /// previously unknown) + /// \sa HasTag + /// + bool RemoveTag(const BamRecordTag tag); + + /// \brief 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; + + /// \brief Fetches a tag from this record. + /// + /// This is an overloaded method + /// + /// \param[in] tag BamRecordTag enum + /// + /// \returns Tag object for the requested name. If name is unknown, a + /// default constructed Tag is returned (Tag::IsNull() is true). + /// + Tag TagValue(const BamRecordTag tag) const; + + // change above to Tag(); + + // template + // T TagValue(const std::string& tagName) const; + + /// \} + +private: + // returns a BamRecordImpl object, with a deep copy of @rawData contents + static BamRecordImpl FromRawData(const std::shared_ptr& rawData); + + // internal memory setup/expand methods + void InitializeData(); + void MaybeReallocData(); + void UpdateTagMap() const; // allowed to be called from const methods + // (lazy update on request) + + // internal tag helper methods + bool AddTagImpl(const std::string& tagName, const Tag& value, + const TagModifier additionalModifier); + bool RemoveTagImpl(const std::string& tagName); + int TagOffset(const std::string& tagName) const; + + // internal CIGAR handling + void SetCigarData(const Cigar& cigar); + + // 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 + std::shared_ptr d_; + mutable std::map tagOffsets_; + + // friends + friend class BamRecordMemory; + + // remove this when we drop support for htslib pre-v1.7 + friend class SamWriter; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAMRECORDIMPL_H diff --git a/include/pbbam/BamRecordTag.h b/include/pbbam/BamRecordTag.h new file mode 100644 index 0000000..c8de2cd --- /dev/null +++ b/include/pbbam/BamRecordTag.h @@ -0,0 +1,60 @@ +// File Description +/// \file BamRecordTag.h +/// \brief Defines the BamRecordTag enum. +// +// Author: Derek Barnett + +#ifndef BAMRECORDTAG_H +#define BAMRECORDTAG_H + +namespace PacBio { +namespace BAM { + +enum class BamRecordTag +{ + ALT_LABEL_QV, + ALT_LABEL_TAG, + BARCODE_QUALITY, + BARCODES, + CONTEXT_FLAGS, + DELETION_QV, + DELETION_TAG, + HOLE_NUMBER, + INSERTION_QV, + IPD, + LABEL_QV, + LONG_CIGAR, + MERGE_QV, + NUM_PASSES, + PKMEAN, + PKMEAN_2, + PKMID, + PKMID_2, + PRE_PULSE_FRAMES, + PULSE_CALL, + PULSE_CALL_WIDTH, + PULSE_EXCLUSION, + PULSE_MERGE_QV, + PULSE_WIDTH, + QUERY_END, + QUERY_START, + READ_ACCURACY, + READ_GROUP, + SCRAP_REGION_TYPE, + SCRAP_ZMW_TYPE, + SNR, + START_FRAME, + SUBSTITUTION_QV, + SUBSTITUTION_TAG, + + // + // not tags per se, but faking these here to simplify data fetching + // + QUAL, + SEQ +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAMRECORDTAG_H diff --git a/include/pbbam/BamRecordView.h b/include/pbbam/BamRecordView.h new file mode 100644 index 0000000..68f4025 --- /dev/null +++ b/include/pbbam/BamRecordView.h @@ -0,0 +1,130 @@ +// File Description +/// \file BamRecordView.h +/// \brief Defines the BamRecordView class. +// +// Author: Derek Barnett + +#ifndef BAMRECORDVIEW_H +#define BAMRECORDVIEW_H + +#include + +#include "pbbam/BamRecord.h" + +namespace PacBio { +namespace BAM { + +/// \brief Provides a re-usable "view" onto a BamRecord +/// +/// This class acts a convenience wrapper for working with per-base BamRecord +/// data. Most of these BamRecord methods take a list of parameters, to adjust +/// how the underlying data are presented to client code. Often these parameters +/// will be re-used for each BamRecord method call. Thus, to simplify such +/// client code, a BamRecordView can be used to state those parameters once, and +/// then simply request the desired fields. +/// +/// \internal +/// \todo Sync up method names with BamRecord +/// \endinternal +/// +class PBBAM_EXPORT BamRecordView +{ +public: + /// \brief Constructs a view onto \p record using the supplied parameters. + /// + /// For frame or QV data, if \p aligned is true, a value of 0 (Accuracy or + /// QualityValue) will be used at each inserted or padded base location. + /// + /// \param[in] record BamRecord data source. + /// \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 + /// + BamRecordView(const BamRecord& record, const Orientation orientation, const bool aligned, + const bool exciseSoftClips, + const PulseBehavior pulseBehavior = PulseBehavior::ALL); + +public: + /// \returns BamRecord::AltLabelQV with this view's parameters applied + QualityValues AltLabelQVs() const; + + /// \returns BamRecord::AltLabelTag with this view's parameters applied + std::string AltLabelTags() const; + + /// \returns BamRecord::DeletionQV with this view's parameters applied + QualityValues DeletionQVs() const; + + /// \returns BamRecord::DeletionTag with this view's parameters applied + std::string DeletionTags() const; + + /// \returns BamRecord::InsertionQV with this view's parameters applied + QualityValues InsertionQVs() const; + + /// \returns BamRecord::IPD with this view's parameters applied + Frames IPD() const; + + /// \returns BamRecord::LabelQV with this view's parameters applied + QualityValues LabelQVs() const; + + /// \returns BamRecord::MergeQV with this view's parameters applied + QualityValues MergeQVs() const; + + /// \returns BamRecord::PulseMergeQV with this view's parameters applied + QualityValues PulseMergeQVs() const; + + /// \returns BamRecord::Pkmean with this view's parameters applied + std::vector Pkmean() const; + + /// \returns BamRecord::Pkmid with this view's parameters applied + std::vector Pkmid() const; + + /// \returns BamRecord::Pkmean2 with this view's parameters applied + std::vector Pkmean2() const; + + /// \returns BamRecord::Pkmid2 with this view's parameters applied + std::vector Pkmid2() const; + + /// \returns BamRecord::PreBaseFrames with this view's parameters applied + Frames PrebaseFrames() const; + + /// \returns BamRecord::PrePulseFrames with this view's parameters applied + Frames PrePulseFrames() const; + + /// \returns BamRecord::PulseCalls with this view's parameters applied + std::string PulseCalls() const; + + /// \returns BamRecord::PulseCallWidth with this view's parameters applied + Frames PulseCallWidth() const; + + /// \returns BamRecord::PulseWidths with this view's parameters applied + Frames PulseWidths() const; + + /// \returns BamRecord::Qualities with this view's parameters applied + QualityValues Qualities() const; + + /// \returns BamRecord::Sequence with this view's parameters applied + std::string Sequence() const; + + /// \returns BamRecord::StartFrame with this view's parameters applied + std::vector StartFrames() const; + + /// \returns BamRecord::SubstitutionQV with this view's parameters applied + QualityValues SubstitutionQVs() const; + + /// \returns BamRecord::SubstitutionTag with this view's parameters applied + std::string SubstitutionTags() const; + +private: + const BamRecord& record_; + Orientation orientation_; + bool aligned_; + bool exciseSoftClips_; + PulseBehavior pulseBehavior_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAMRECORDVIEW_H diff --git a/include/pbbam/BamTagCodec.h b/include/pbbam/BamTagCodec.h new file mode 100644 index 0000000..68924bf --- /dev/null +++ b/include/pbbam/BamTagCodec.h @@ -0,0 +1,90 @@ +// File Description +/// \file BamTagCodec.h +/// \brief Defines the BamTagCodec class. +// +// Author: Derek Barnett + +#ifndef BAMTAGCODEC_H +#define BAMTAGCODEC_H + +#include +#include +#include "pbbam/Config.h" +#include "pbbam/TagCollection.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BamTagCodec class provides binary encoding/decoding of %BAM tag +/// data. +/// +/// \note BamTagCodec is mostly an implementation and/or testing detail, and may +/// be removed from the public API. +/// +class PBBAM_EXPORT BamTagCodec +{ +public: + /// \name Tag Collection Methods + /// \{ + + /// \brief Creates a TagCollection from raw BAM data. + /// + /// \param[in] data BAM-formatted (binary) tag data + /// \returns TagCollection containing tag data + /// + static TagCollection Decode(const std::vector& data); + + /// \brief Creates binary BAM data from a TagCollection. + /// + /// \param[in] tags TagCollection containing tag data + /// \returns vector of bytes (encoded BAM data) + /// + static std::vector Encode(const PacBio::BAM::TagCollection& tags); + + /// \} + +public: + /// \name Per-Tag Methods + /// \{ + + /// \brief Determines the SAM/BAM tag code for a Tag. + /// + /// \param[in] tag Tag object to check + /// \param[in] additionalModifier optional extra modifier (allows explicit + /// modification of an otherwise const Tag) + /// + /// \returns the SAM/BAM single char code for tag type + /// + static uint8_t TagTypeCode(const PacBio::BAM::Tag& tag, + const TagModifier& additionalModifier = TagModifier::NONE); + + /// \brief Encodes a single Tag's contents in %BAM binary + /// + /// \note This method does \b NOT encode the tag name & tag type. It does + /// include the element type for array-type tags. + /// + /// \param[in] tag Tag object containing data to encode + /// \param[in] additionalModifier optional extra modifier (allows explicit + /// modification of an otherwise const Tag) + /// + /// \returns vector of bytes (encoded BAM data) + /// + static std::vector ToRawData( + const PacBio::BAM::Tag& tag, const TagModifier& additionalModifier = TagModifier::NONE); + + /// \brief Creates a Tag object from binary BAM data. + /// + /// \param[in] rawData raw BAM bytes (assumed to be the result of + /// htslib's bam_aux_get()) + /// + /// \returns resulting Tag object + /// + 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..10310cf --- /dev/null +++ b/include/pbbam/BamWriter.h @@ -0,0 +1,219 @@ +// File Description +/// \file BamWriter.h +/// \brief Defines the BamWriter class. +// +// Author: Derek Barnett + +#ifndef BAMWRITER_H +#define BAMWRITER_H + +#include +#include +#include +#include +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/Config.h" +#include "pbbam/IRecordWriter.h" + +namespace PacBio { +namespace BAM { + +class BamFile; + +/// \brief The BamWriter class provides a writing interface for creating +/// new %BAM files. +/// +/// \note The underlying buffered data may not be flushed to the file until the +/// destructor is called. Trying to access the file (reading, stat-ing, +/// indexing, etc.) before the BamWriter is destroyed yields undefined +/// behavior. Enclose the BamWriter in some form of local scope (curly +/// braces, a separate function, etc.) to ensure that its destructor is +/// called before proceeding to read-based operations. +/// +/// \code{.cpp} +/// { +/// BamWriter w(...); +/// // write data +/// } +/// // now safe to access the new file +/// \endcode +/// +/// +class PBBAM_EXPORT BamWriter : public IRecordWriter +{ +public: + /// \brief 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 + }; + + /// \brief This enum allows you to control whether BAI bin numbers are + /// calculated for output records. + /// + /// For most cases, the default behavior (ON) should be retained for maximum + /// compatibility with downstream tools (e.g. samtools index). Disabling bin + /// calculation should only be used if all records are known to never be + /// mapped, and even then only if profiling revelas the calculation to + /// affect extremely performance-sensitive, "critical paths". + /// + enum BinCalculationMode + { + BinCalculation_ON = 0, + BinCalculation_OFF + }; + + /// + /// \brief The Config struct provides a "parameter object" for BamWriter + /// settings. This allows for writer configuration without having to + /// refer to ordering of parameters, default values, etc. + /// + struct Config + { + // zlib compression level + CompressionLevel compressionLevel = DefaultCompression; + + // The 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. + size_t numThreads = 4; + + // If ON, ensures that proper BAI bin numbers are provided for all records. + BamWriter::BinCalculationMode binCalculationMode = BamWriter::BinCalculation_ON; + + // If true, write to .tmp, and rename to in dtor. + // This allows downstream checks to see if BAM file may be truncated + // due to early termination (e.g. a thrown exception). If false, write + // directly to . + bool useTempFile = true; + }; + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Opens a %BAM file for writing & writes the header information. + /// + /// \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. + /// + /// \param[in] binCalculationMode BAI bin calculation mode. The default + /// behavior will ensure proper bin numbers are provided for all + /// records written. This extra step may turned off when bin + /// numbers are not needed. Though if in doubt, keep the default. + /// + /// \param[in] useTempFile If true, write to .tmp, and rename + /// to . This provides for downstream + /// checks to see if BAM file may be truncated + /// due to early termination (a thrown exception). + /// + /// \throws std::runtmie_error if there was a problem opening the file for + /// writing or if an error occurred while writing the header + /// + BamWriter(const std::string& filename, const BamHeader& header, + const BamWriter::CompressionLevel compressionLevel = BamWriter::DefaultCompression, + const size_t numThreads = 4, + const BinCalculationMode binCalculationMode = BamWriter::BinCalculation_ON, + const bool useTempFile = true); + + /// + /// \brief Opens a %BAM file for writing & writes the header information. + /// + /// \param[in] filename path to output %BAM file + /// \param[in] header BamHeader object + /// \param[in] config container for add'l configuration options + /// + /// \throws std::runtmie_error if there was a problem opening the file for + /// writing or if an error occurred while writing the header + /// + BamWriter(const std::string& filename, const BamHeader& header, + const BamWriter::Config& config); + + BamWriter(const BamWriter&) = delete; + BamWriter(BamWriter&&); + BamWriter& operator=(const BamWriter&) = delete; + BamWriter& operator=(BamWriter&&); + + /// Fully flushes all buffered data & closes file. + ~BamWriter() override; + + /// \} + +public: + /// \name Data Writing & Resource Management + /// \{ + + /// \brief 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 std::runtime_error if flush fails + /// + void TryFlush() override; + + /// \brief 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) override; + + /// \brief 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); + + /// \brief 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) override; + + /// \} + +private: + class BamWriterPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BAMWRITER_H diff --git a/include/pbbam/BarcodeQuery.h b/include/pbbam/BarcodeQuery.h new file mode 100644 index 0000000..0588260 --- /dev/null +++ b/include/pbbam/BarcodeQuery.h @@ -0,0 +1,62 @@ +// File Description +/// \file BarcodeQuery.h +/// \brief Defines the BarcodeQuery class. +// +// Author: Derek Barnett + +#ifndef BARCODEQUERY_H +#define BARCODEQUERY_H + +#include +#include +#include "pbbam/Config.h" +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The BarcodeQuery class provides iterable access to a DataSet's %BAM +/// records, limiting results to those matching a particular barcode. +/// +/// Example: +/// \include code/BarcodeQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".pbi" index file. +/// Use BamFile::EnsurePacBioIndexExists before creating the query if one +/// may not be present. +/// +class PBBAM_EXPORT BarcodeQuery : public internal::IQuery +{ +public: + /// \brief Creates a new BarcodeQuery, limiting record results to only those + /// annotated with a particular barcode ID. + /// + /// \param[in] barcode filtering criteria + /// \param[in] dataset input data source(s) + /// + /// \sa BamRecord::Barcodes + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or PBI + /// files. + /// + BarcodeQuery(const int16_t barcode, const DataSet& dataset); + + ~BarcodeQuery() override; + +public: + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + +private: + class BarcodeQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BARCODEQUERY_H diff --git a/include/pbbam/Cigar.h b/include/pbbam/Cigar.h new file mode 100644 index 0000000..8d46450 --- /dev/null +++ b/include/pbbam/Cigar.h @@ -0,0 +1,75 @@ +// File Description +/// \file Cigar.h +/// \brief Defines the Cigar class. +// +// Author: Derek Barnett + +#ifndef CIGAR_H +#define CIGAR_H + +#include +#include +#include "pbbam/CigarOperation.h" +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The Cigar class represents the CIGAR string used to report alignment +/// charateristics in SAM/BAM. +/// +/// \note Use of the 'M' operator is forbidden in PacBio BAMs. See +/// CigarOperationType description for more information. +/// +/// \sa https://samtools.github.io/hts-specs/SAMv1.pdf for more information on CIGAR in general. +/// +class PBBAM_EXPORT Cigar : public std::vector +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a Cigar object from SAM/BAM string input + /// + /// \param [in] stdString SAM/BAM formatted CIGAR data + /// \returns a Cigar object representing the input data + /// + /// \note This class may be removed from the public API in the future, + /// as the constructor taking a std::string accomplishes the same end. + /// + static Cigar FromStdString(const std::string& stdString); + + /// \brief Creates an empty Cigar. + Cigar(); + + /// \brief Creates a Cigar object from SAM/BAM string input + /// + /// \param [in] cigarString SAM/BAM formatted CIGAR data + /// + Cigar(const std::string& cigarString); + + Cigar(const Cigar&); + Cigar(Cigar&&); + Cigar& operator=(const Cigar&); + Cigar& operator=(Cigar&&); + ~Cigar(); + + /// \} + +public: + /// \name Conversion Methods + /// \{ + + /// Converts Cigar object data to SAM/BAM formatted string + /// + /// \returns SAM/BAM formatted std::string + /// + std::string ToStdString() const; + + /// \} +}; + +} // 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..71d4fa7 --- /dev/null +++ b/include/pbbam/CigarOperation.h @@ -0,0 +1,145 @@ +// File Description +/// \file CigarOperation.h +/// \brief Defines the CigarOperationType enum & CigarOperation class. +// +// Author: Derek Barnett + +#ifndef CIGAROPERATION_H +#define CIGAROPERATION_H + +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +namespace pbbamify { +class Settings; +} + +/// \brief 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. Any attempt to read or +/// write a record containing this operation will trigger a +/// std::runtime_error. SEQUENCE_MATCH('=) or SEQUENCE_MISMATCH('X') +/// should be used instead. +/// +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] +}; + +/// \brief The CigarOperation class represents a single CIGAR operation +/// (consisting of a type & length). +/// +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(); + CigarOperation(char c, uint32_t length); + CigarOperation(CigarOperationType op, uint32_t length); + + CigarOperation(const CigarOperation&); + CigarOperation(CigarOperation&&); + CigarOperation& operator=(const CigarOperation&); + CigarOperation& operator=(CigarOperation&&); + ~CigarOperation(); + + /// \} + +public: + /// \returns operation type as SAM/BAM char code + char Char() const; + + /// \returns operation length + uint32_t Length() const; + + /// \returns operation type as CigarOperationType enum value + CigarOperationType Type() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// Sets this operation type. + /// + /// \param[in] opChar SAM/BAM character code + /// \returns reference to this operation + CigarOperation& Char(const char opChar); + + /// Sets this operation length. + /// + /// \param[in] length + /// \returns reference to this operation + CigarOperation& Length(const uint32_t length); + + /// Sets this operation type. + /// + /// \param[in] opType CigarOperationType value + /// \returns reference to this operation + CigarOperation& Type(const CigarOperationType opType); + + /// \} + +public: + /// \name Comparison Operators + /// \{ + + /// \returns true if both CIGAR operation type & length match + bool operator==(const CigarOperation& other) const; + + /// \returns true if either CIGAR operation type or length differ + bool operator!=(const CigarOperation& other) const; + + /// \} + +private: + CigarOperationType type_ = CigarOperationType::UNKNOWN_OP; + uint32_t length_ = 0; + + // runtime disabling of Cigar validation + static bool validate_; + friend class pbbamify::Settings; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // CIGAROPERATION_H diff --git a/include/pbbam/ClipType.h b/include/pbbam/ClipType.h new file mode 100644 index 0000000..fe13dee --- /dev/null +++ b/include/pbbam/ClipType.h @@ -0,0 +1,30 @@ +// File Description +/// \file ClipType.h +/// \brief Defines the ClipType enum. +// +// Author: Derek Barnett + +#ifndef CLIPTYPE_H +#define CLIPTYPE_H + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the modes supported by BamRecord clipping +/// operations. +/// +/// Methods like BamRecord::Clip accept Position parameters - which may be in +/// either polymerase or reference coorindates. Using this enum as a flag +/// indicates how the positions should be interpreted. +/// +enum class ClipType +{ + CLIP_NONE, ///< No clipping will be performed. + CLIP_TO_QUERY, ///< Clipping positions are in polymerase coordinates. + CLIP_TO_REFERENCE ///< Clipping positions are in genomic coordinates. +}; + +} // namespace BAM +} // namespace PacBio + +#endif // CLIPTYPE_H diff --git a/include/pbbam/Compare.h b/include/pbbam/Compare.h new file mode 100644 index 0000000..caf94b8 --- /dev/null +++ b/include/pbbam/Compare.h @@ -0,0 +1,466 @@ +// File Description +/// \file Compare.h +/// \brief Defines the Compare class & a number of function objects for +/// comparing BamRecords. +// +// Author: Derek Barnett + +#ifndef COMPARE_H +#define COMPARE_H + +#include +#include +#include +#include +#include +#include "pbbam/BamRecord.h" + +namespace PacBio { +namespace BAM { + +/// \brief The Compare class provides utilities for sorting collections of +/// BamRecords. +/// +/// \note The functors provided here currently only support std::less +/// comparisons (i.e. sorting by ascending value). +/// +/// \include code/Compare.txt +/// +struct PBBAM_EXPORT Compare +{ +public: + /// \name Comparison Type + /// \{ + + /// \brief This enum defines the supported comparison types + /// { ==, !=, <, <=, >, >=, & (contains), ~ (not contains) }. + /// + enum Type + { + EQUAL = 0, + NOT_EQUAL, + LESS_THAN, + LESS_THAN_EQUAL, + GREATER_THAN, + GREATER_THAN_EQUAL, + CONTAINS, + NOT_CONTAINS + }; + + /// \brief Convert operator string to Compare::Type. + /// + /// \include code/Compare_TypeFromOperator.txt + /// + /// \param[in] opString operator string. Can be C++-style operators + /// ("==", "!=", "<=", etc) or alpha equivalents + /// ("eq", "ne", "lte", etc). + /// + /// \returns comparison type from an operator string + /// \throws std::runtime_error if cannot convert opString to Compare::Type + /// \sa Compare::TypeToOperator + /// + static Compare::Type TypeFromOperator(const std::string& opString); + + /// \brief Convert a Compare::Type to printable enum name. + /// + /// \include code/Compare_TypeToName.txt + /// + /// \param[in] type Compare::Type to convert + /// \returns the printable name for a Compare::Type enum value.are::Type + /// \throws std::runtime_error on unknown Compare::Type + /// + static std::string TypeToName(const Compare::Type& type); + + /// \brief Convert a Compare::Type to printable operator. + /// + /// \param[in] type Compare::Type to convert + /// \param[in] asAlpha (optional) flag to print using alpha equivalents + /// e.g. "lte" rather than "<=" + /// \returns the printable operator string + /// \throws std::runtime_error on unknown Compare::Type + /// + static std::string TypeToOperator(const Compare::Type& type, bool asAlpha = false); + + /// \} + +public: + /// \name Comparison Function Objects + /// \{ + + /// %Base class for all BamRecord compare functors. + /// + /// Mostly used for method signatures that can accept any comparator. + /// + /// Custom comparators may be used by inheriting from this class. + /// + struct Base : public std::function + { + }; + +private: + /// \internal + /// + /// Exists to provide the typedef we'll use in the actual + /// MemberFunctionBase, since we need to use it in the template signature. + /// This keeps that a lot easier to read. + /// + template + struct MemberFunctionBaseHelper : public Compare::Base + { + using MemberFnType = ValueType (BamRecord::*)() const; + }; + +public: + /// \brief %Base class for all BamRecord compare functors that take a + /// BamRecord function pointer and compare on its return type. + /// + /// Derived comparators usually need only declare the return value & + /// function pointer in the template signature. This class implements the + /// basic method-calling machinery. + /// + /// Custom comparators will work for any BamRecord member function that does + /// not take any input parameters. + /// + template ::MemberFnType fn, + typename CompareType = std::less > + struct MemberFunctionBase : public Compare::MemberFunctionBaseHelper + { + bool operator()(const BamRecord& lhs, const BamRecord& rhs) const; + }; + +public: + /// \brief Compares on BamRecord::AlignedEnd. + /// + /// Example: + /// \include code/Compare_AlignedEnd.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct AlignedEnd : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::AlignedStart. + /// + /// Example: + /// \include code/Compare_AlignedStart.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct AlignedStart : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::AlignedStrand + /// + /// Example: + /// \include code/Compare_AlignedStrand.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct AlignedStrand : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::BarcodeForward. + /// + /// Example: + /// \include code/Compare_BarcodeForward.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct BarcodeForward : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::BarcodeQuality. + /// + /// Example: + /// \include code/Compare_BarcodeQuality.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct BarcodeQuality : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::BarcodeReverse. + /// + /// Example: + /// \include code/Compare_BarcodeReverse.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct BarcodeReverse : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::FullName. + /// + /// Example: + /// \include code/Compare_FullName.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct FullName : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::LocalContextFlags. + /// + /// Example: + /// \include code/Compare_LocalContextFlag.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct LocalContextFlag + : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::MapQuality. + /// + /// Example: + /// \include code/Compare_MapQuality.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct MapQuality : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::MovieName. + /// + /// Example: + /// \include code/Compare_MovieName.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct MovieName : public MemberFunctionBase + { + }; + + /// \brief Provides an operator() is essentially a no-op for + /// comparing/sorting. + /// + /// If used in a sorting operation, then no change will occur. + /// + struct None : public Compare::Base + { + bool operator()(const BamRecord&, const BamRecord&) const; + }; + + ///\brief Compares on BamRecord::NumDeletedBases. + /// + /// Example: + /// \include code/Compare_NumDeletedBases.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct NumDeletedBases : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::NumInsertedBases. + /// + /// Example: + /// \include code/Compare_NumInsertedBases.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct NumInsertedBases : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::NumMatches. + /// + /// Example: + /// \include code/Compare_NumMatches.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct NumMatches : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::NumMismatches. + /// + /// Example: + /// \include code/Compare_NumMismatches.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct NumMismatches : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::QueryEnd. + /// + /// Example: + /// \include code/Compare_QueryEnd.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct QueryEnd : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::QueryStart. + /// + /// Example: + /// \include code/Compare_QueryStart.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct QueryStart : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReadAccuracy. + /// + /// Example: + /// \include code/Compare_ReadAccuracy.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReadAccuracy : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReadGroupId. + /// + /// \note Even though the ReadGroupId string contains hex values, it is + /// still just a std::string. Comparisons will use lexical, not + /// numeric ordering. If numeric ordering is desired, use + /// Compare::ReadGroupNumericId instead. + /// + /// Example: + /// \include code/Compare_ReadGroupId.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReadGroupId : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReadGroupNumericId. + /// + /// Example: + /// \include code/Compare_ReadGroupNumericId.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReadGroupNumericId : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReferenceEnd. + /// + /// Example: + /// \include code/Compare_ReferenceEnd.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReferenceEnd : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReferenceId. + /// + /// Example: + /// \include code/Compare_ReferenceId.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReferenceId : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReferenceName. + /// + /// Example: + /// \include code/Compare_ReferenceName.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReferenceName : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::ReferenceStart. + /// + /// Example: + /// \include code/Compare_ReferenceStart.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct ReferenceStart : public MemberFunctionBase + { + }; + + /// \brief Compares on BamRecord::HoleNumber. + /// + /// Example: + /// \include code/Compare_Zmw.txt + /// + /// \note Currently only supports std::less comparisons (i.e. sorting by + /// ascending value). + /// + struct Zmw : public MemberFunctionBase + { + }; + + /// \} + + template + static inline bool Check(const T& lhs, const T& rhs, const Compare::Type cmp) + { + switch (cmp) { + case Compare::EQUAL: + return lhs == rhs; + case Compare::LESS_THAN: + return lhs < rhs; + case Compare::LESS_THAN_EQUAL: + return lhs <= rhs; + case Compare::GREATER_THAN: + return lhs > rhs; + case Compare::GREATER_THAN_EQUAL: + return lhs >= rhs; + case Compare::NOT_EQUAL: + return lhs != rhs; + default: + assert(false); + throw std::runtime_error{"unsupported compare type requested"}; + } + } +}; + +} // namespace BAM +} // namespace PacBio + +#include "pbbam/internal/Compare.inl" + +#endif // COMPARE_H diff --git a/include/pbbam/CompositeBamReader.h b/include/pbbam/CompositeBamReader.h new file mode 100644 index 0000000..dac9b8b --- /dev/null +++ b/include/pbbam/CompositeBamReader.h @@ -0,0 +1,277 @@ +// File Description +/// \file CompositeBamReader.h +/// \brief Defines the composite BAM readers, for working with multiple input +/// files. +// +// Author: Derek Barnett + +#ifndef COMPOSITEBAMREADER_H +#define COMPOSITEBAMREADER_H + +#include +#include +#include +#include +#include +#include "pbbam/BaiIndexedBamReader.h" +#include "pbbam/BamFile.h" +#include "pbbam/BamHeader.h" +#include "pbbam/BamReader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/Config.h" +#include "pbbam/DataSet.h" +#include "pbbam/GenomicInterval.h" +#include "pbbam/PbiIndexedBamReader.h" + +namespace PacBio { +namespace BAM { + +namespace internal { + +/// \internal +/// \brief The CompositeMergeItem class provides a helper struct for composite +/// readers, containing a single-file reader and its "next" record. +/// +struct CompositeMergeItem +{ +public: + std::unique_ptr reader; + BamRecord record; + +public: + CompositeMergeItem(std::unique_ptr rdr); + CompositeMergeItem(std::unique_ptr rdr, BamRecord rec); + CompositeMergeItem(CompositeMergeItem&&) = default; + CompositeMergeItem& operator=(CompositeMergeItem&&) = default; + ~CompositeMergeItem() = default; +}; + +/// \internal +/// \brief The CompositeMergeItemSorter class provides a helper function object +/// for ordering composite reader results. +/// +/// Essentially just exracts a BamRecord from its parent CompositeMergeItem for +/// further checks. +/// +template +struct CompositeMergeItemSorter + : public std::function +{ + bool operator()(const CompositeMergeItem& lhs, const CompositeMergeItem& rhs) const; +}; + +} // namespace internal + +/// \brief The GenomicIntervalCompositeBamReader class provides read access to +/// multipe %BAM files, limiting results to a genomic region. +/// +/// Requires a ".bai" file for each input %BAM file. +/// +/// Results will be returned in order of genomic coordinate (first by reference +/// ID, then by position). +/// +class PBBAM_EXPORT GenomicIntervalCompositeBamReader +{ +public: + /// \name Contstructors & Related Methods + /// \{ + + /// \brief Constructs composite %BAM reader, that can be queried on genomic interval. + /// + /// \note Using this constructor means that an interval must be provided, via + /// reader.Interval(i), before iterating. + /// + /// \param[in] bamFiles input BamFile objects + /// + /// \throws std::runtime_error if either file (*.bam or *.bai) fails to open + /// for reading, or if the interval is invalid + /// + GenomicIntervalCompositeBamReader(const std::vector& bamFiles); + + /// \brief Constructs composite %BAM reader, that can be queried on genomic interval. + /// + /// \note Using this constructor means that an interval must be provided, via + /// reader.Interval(i), before iterating. + /// + /// \param[in] dataset input DataSet + /// + /// \throws std::runtime_error if either file (*.bam or *.bai) fails to open + /// for reading, or if the interval is invalid + /// + GenomicIntervalCompositeBamReader(const DataSet& dataset); + + /// \brief Constructs composite %BAM reader, limiting record results to + /// only those overalpping a GenomicInterval. + /// + /// \param[in] interval genomic interval of interest + /// \param[in] bamFiles input BamFile objects + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// BAI files. + /// + GenomicIntervalCompositeBamReader(const GenomicInterval& interval, + const std::vector& bamFiles); + + /// \brief Constructs composite %BAM reader, limiting record results to + /// only those overalpping a GenomicInterval. + /// + /// \param[in] interval genomic interval of interest + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// BAI files. + /// + GenomicIntervalCompositeBamReader(const GenomicInterval& interval, const DataSet& dataset); + + /// \} + +public: + /// \name Data Access + /// \{ + + /// Fetches next BAM record in the interval specified, storing in \p record + /// + /// \param[out] record + /// \returns true on success, false if no more data available. + /// + bool GetNext(BamRecord& record); + + /// Sets a new genomic interval of interest. + /// + /// \returns reference to this reader + /// + GenomicIntervalCompositeBamReader& Interval(const GenomicInterval& interval); + + /// \returns the current specified interval + /// + const GenomicInterval& Interval() const; + + /// \} + +private: + void UpdateSort(); + +private: + GenomicInterval interval_; + std::deque mergeItems_; + std::vector filenames_; +}; + +/// \brief Provides read access to multipe %BAM files, limiting results to those +/// passing a PbiFilter. +/// +/// Requires a ".pbi" file for each input %BAM file. +/// +/// \note The template parameter OrderByType is not fully implemented at this +/// time. Use of comparison functor (e.g. Compare::Zmw) for this will +/// currently result in the proper "next" value at each iteration +/// step, independently, but not over the full data set. If all +/// files' "order-by" data values are accessible in increasing order +/// within each file, then the expected ordering will be observed, +/// However, if these data are not sorted within a file, the final results +/// will appear unordered. \n +/// \n +/// Example:\n +/// file 1: { 1, 5, 2, 6 } \n +/// file 2: { 3, 8, 4, 7 } \n +/// results: { 1, 3, 5, 2, 6, 8, 4, 7 } \n +/// \n +/// This a known issue and will be addressed in a future update. But in +/// the meantime, use of Compare::None as the OrderByType is recommended, +/// to explicitly indicate that no particular ordering is expected. +/// +template +class PBBAM_EXPORT PbiFilterCompositeBamReader +{ +public: + using value_type = internal::CompositeMergeItem; + using merge_sorter_type = internal::CompositeMergeItemSorter; + using container_type = std::deque; + using iterator = typename container_type::iterator; + using const_iterator = typename container_type::const_iterator; + +public: + /// \name Contstructors & Related Methods + /// \{ + + PbiFilterCompositeBamReader(const PbiFilter& filter, const std::vector& bamFiles); + PbiFilterCompositeBamReader(const PbiFilter& filter, const std::vector& bamFiles, + const PbiIndexCache& cache); + + PbiFilterCompositeBamReader(const PbiFilter& filter, const DataSet& dataset); + PbiFilterCompositeBamReader(const PbiFilter& filter, const DataSet& dataset, + const PbiIndexCache& cache); + + /// \} + +public: + /// \name Data Access + /// \{ + + /// Fetches next BAM record in the interval specified. + /// + /// \returns true on success, false if no more data available. + /// + bool GetNext(BamRecord& record); + + /// Sets a new PBI filter + /// + /// \returns reference to this reader + /// + PbiFilterCompositeBamReader& Filter(const PbiFilter& filter); + + uint32_t NumReads() const; + + /// \} + +private: + void UpdateSort(); + +private: + PbiIndexCache indexCache_; + container_type mergeQueue_; + std::vector filenames_; + uint32_t numReads_; +}; + +/// \brief The SequentialCompositeBamReader class provides read access to +/// multiple %BAM files, reading through the entire contents of each +/// file. +/// +/// Input files will be accessed in the order provided to the constructor. Each +/// file's contents will be exhausted before moving on to the next one (as +/// opposed to a "round-robin" scheme). +/// +class PBBAM_EXPORT SequentialCompositeBamReader +{ +public: + /// \name Contstructors & Related Methods + /// \{ + + SequentialCompositeBamReader(std::vector bamFiles); + SequentialCompositeBamReader(const DataSet& dataset); + + /// \} + +public: + /// \name Data Access + /// \{ + + /// Fetches next BAM record from the . + /// + /// \returns true on success, false if no more data available. + /// + bool GetNext(BamRecord& record); + + /// \} + +private: + std::deque > readers_; +}; + +} // namespace BAM +} // namespace PacBio + +#include "pbbam/internal/CompositeBamReader.inl" + +#endif // COMPOSITEBAMREADER_H diff --git a/include/pbbam/CompositeFastaReader.h b/include/pbbam/CompositeFastaReader.h new file mode 100644 index 0000000..43f45ac --- /dev/null +++ b/include/pbbam/CompositeFastaReader.h @@ -0,0 +1,62 @@ +// File Description +/// \file CompositeFastaReader.h +/// \brief Defines the composite FASTA reader, for working with multiple input +/// files. +// +// Author: Derek Barnett + +#ifndef COMPOSITEFASTAREADER_H +#define COMPOSITEFASTAREADER_H + +#include "pbbam/Config.h" +#include "pbbam/DataSet.h" +#include "pbbam/FastaReader.h" +#include "pbbam/FastaSequence.h" + +#include +#include +#include +#include + +namespace PacBio { +namespace BAM { + +/// \brief The CompositeFastaReader class provides read access to +/// multiple FASTA files, reading through the entire contents of each +/// file. +/// +/// Input files will be accessed in the order provided to the constructor. Each +/// file's contents will be exhausted before moving on to the next one (as +/// opposed to a "round-robin" scheme). +/// +class PBBAM_EXPORT CompositeFastaReader +{ +public: + /// \name Contstructors & Related Methods + /// \{ + + CompositeFastaReader(const std::vector& fastaFiles); + CompositeFastaReader(const DataSet& dataset); + + /// \} + +public: + /// \name Data Access + /// \{ + + /// Fetches next FASTA sequence. + /// + /// \returns true on success, false if no more data available. + /// + bool GetNext(FastaSequence& seq); + + /// \} + +private: + std::deque > readers_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // COMPOSITEFASTAREADER_H diff --git a/include/pbbam/Config.h b/include/pbbam/Config.h new file mode 100644 index 0000000..77fb1c0 --- /dev/null +++ b/include/pbbam/Config.h @@ -0,0 +1,56 @@ +// File Description +/// \file Config.h +/// \brief Defines library-wide macros & global variables. +// +// Author: Derek Barnett + +#ifndef PBBAM_CONFIG_H +#define PBBAM_CONFIG_H + +/// \name Library Import/Export +/// \{ + +#ifndef PBBAM_EXPORT +#if defined(WIN32) +#define PBBAM_EXPORT __declspec(dllimport) +#else +#define PBBAM_EXPORT +#endif +#endif + +/// \} + +namespace PacBio { +namespace BAM { + +/// \name Verbosity Settings +/// \{ + +/// \brief Sets the desired verbosity level of htslib warnings. +/// +/// Change this value to allow debug/warning statements from htslib itself. +/// The valid range seems to be [0-3], where 0 indicates OFF, and 3 is the +/// most verbose. +/// +/// By default, pbbam disables htslib statements to keep output channels clean. +/// We rely on exceptions & their associated messages instead. +/// +/// This global variable is obviously not thread-safe by any means. But as a +/// debug flag, it is unlikely to cause any real issues. The worst case would be +/// unexpected presence/absence of output statements. +/// +extern int HtslibVerbosity; + +/// +/// \brief DoesHtslibSupportLongCigar +/// +/// \return true if runtime htslib is >= v1.7 +/// +bool DoesHtslibSupportLongCigar(); + +/// \} + +} // namespace BAM +} // namespace PacBio + +#endif // PBBAM_CONFIG_H diff --git a/include/pbbam/DataSet.h b/include/pbbam/DataSet.h new file mode 100644 index 0000000..c654d9f --- /dev/null +++ b/include/pbbam/DataSet.h @@ -0,0 +1,820 @@ +// File Description +/// \file DataSet.h +/// \brief Defines the DataSet class. +// +// Author: Derek Barnett + +#ifndef DATASET_H +#define DATASET_H + +#include +#include +#include +#include +#include + +#include "pbbam/BamFile.h" +#include "pbbam/Config.h" +#include "pbbam/DataSetTypes.h" +#include "pbbam/GenomicInterval.h" + +namespace PacBio { +namespace BAM { + +/// \brief The DataSet class represents a %PacBio analyis dataset (e.g. from +/// XML). +/// +/// \nosubgrouping +/// +/// It provides resource paths, filters, and metadata associated with a dataset +/// under analysis. +/// +class PBBAM_EXPORT DataSet +{ +public: + /// \name DataSet Type + /// \{ + + /// \brief This enum defines the currently-supported DataSet types. + /// + enum TypeEnum + { + GENERIC = 0, + ALIGNMENT, + BARCODE, + CONSENSUS_ALIGNMENT, + CONSENSUS_READ, + CONTIG, + HDF_SUBREAD, + REFERENCE, + SUBREAD, + TRANSCRIPT, + TRANSCRIPT_ALIGNMENT + }; + + /// \brief Converts printable dataset type to type enum. + /// + /// \param[in] typeName printable dataset type + /// \returns dataset type enum + /// \throws std::runtime_error if \p typeName is unknown + /// + static DataSet::TypeEnum NameToType(const std::string& typeName); + + /// \brief Converts dataset type enum to printable name. + /// + /// \param[in] type dataset type enum + /// \returns printable dataset type + /// \throws std::runtime_error if \p type is unknown + /// + static std::string TypeToName(const DataSet::TypeEnum& type); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Constructs an empty, generic DataSet. + /// + DataSet(); + + /// \brief Constructs an empty DataSet of the type specified. + /// + /// \param[in] type dataset type + /// \throws std::runtime_error if \p type is unknown + /// + DataSet(const DataSet::TypeEnum type); + + /// \brief Constructs a DataSet from a %BAM file. + /// + /// This currently defaults to a SubreadSet, with an ExternalResource + /// pointing to BamFile::Filename. + /// + /// \param[in] bamFile BamFile object + /// + DataSet(const BamFile& bamFile); + + /// \brief Loads a DataSet from a file. + /// + /// \p filename may be one of the following types, indicated by its extension:\n + /// - %BAM ("*.bam") \n + /// - FOFN ("*.fofn") \n + /// - FASTA ("*.fa" or "*.fasta") \n + /// - DataSetXML ("*.xml") \n + /// + /// \param[in] filename input filename + /// \throws std::runtime_error if \p filename has an unsupported extension, + /// or if a valid DataSet could not be created from its contents + /// + DataSet(const std::string& filename); + + /// \brief Constructs a DataSet from a list of files. + /// + /// \param[in] filenames input filenames + /// \throws std::runtime_error if DataSet could not be created from + /// \p filenames + /// + DataSet(const std::vector& filenames); + + DataSet(const DataSet&); + DataSet(DataSet&&); + DataSet& operator=(const DataSet&); + DataSet& operator=(DataSet&&); + ~DataSet(); + + /// \brief Creates a DataSet from "raw" XML data. + /// + /// \param[in] xml DataSetXML text + /// + static DataSet FromXml(const std::string& xml); + + /// \} + +public: + /// \name Operators + /// \{ + + /// \brief Merges DataSet contents. + /// + /// Adds contents of \p other to this dataset object + /// + /// \param[in] other some other dataset to add to this one + /// \returns reference to this dataset object + /// + DataSet& operator+=(const DataSet& other); + + /// \} + +public: + /// \name Serialization + /// \{ + + /// \brief Saves dataset XML to file. + /// + /// \param[in] outputFilename destination for XML contents + /// + /// \throws std::runtime_error if file could be opened or if DataSet + /// elements could not be converted to XML + /// + void Save(const std::string& outputFilename) const; + + /// \brief Saves dataset XML to output stream, e.g. std::cout, + /// std::stringstream. + /// + /// \param[out] out destination for XML contents + /// + /// \throws std::runtime_error if DataSet elements could not be converted to + /// XML + /// + void SaveToStream(std::ostream& out) const; + + /// \} + +public: + /// \name Attributes + /// \{ + /// + + /// \brief Fetches the value of a DataSet root element's attribute. + /// + /// These are the attributes attached to the root dataset element: \n + /// \verbatim \endverbatim + /// + /// Built-in accessors exist for the standard attributes (e.g. CreatedAt) + /// but additional attributes can be used as well via these generic + /// Attribute methods. + /// + /// \param[in] name root element's attribute name + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& Attribute(const std::string& name) const; + + /// \brief Fetches the value of dataset's CreatedAt attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& CreatedAt() const; + + /// \brief Fetches the value of dataset's Format attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& Format() const; + + /// \brief Fetches the value of dataset's MetaType attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& MetaType() const; + + /// \brief Fetches the value of dataset's ModifiedAt attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& ModifiedAt() const; + + /// \brief Fetches the value of dataset's Name attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& Name() const; + + /// \brief Fetches the value of dataset's ResourceId attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& ResourceId() const; + + /// \brief Fetches the value of dataset's Tags attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& Tags() const; + + /// \brief Fetches the value of dataset's TimeStampedName attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& TimeStampedName() const; + + /// \brief Fetches the value of dataset's UniqueId attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& UniqueId() const; + + /// \brief Fetches the value of dataset's Version attribute. + /// + /// \returns const reference to attribute's value (empty string if not + /// present) + /// + const std::string& Version() const; + + /// \} + +public: + /// \name DataSet Type + /// \{ + + /// \brief Fetches the dataset's type. + /// + /// \returns dataset type enum + /// + PacBio::BAM::DataSet::TypeEnum Type() const; + + /// \brief Fetches the dataset's type. + /// + /// \returns printable dataset type + /// + std::string TypeName() const; + + /// \} + +public: + /// \name Child Elements + /// \{ + + /// \brief Fetches the dataset's Extensions element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::Extensions& Extensions() const; + + /// \brief Fetches the dataset's ExternalResources element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::ExternalResources& ExternalResources() const; + + /// \brief Fetches the dataset's Filters element. + /// + /// \returns const reference to child element + /// + const PacBio::BAM::Filters& Filters() const; + + /// \brief Fetches the dataset's DataSetMetadata element. + /// + /// \returns const reference to child element + /// + const PacBio::BAM::DataSetMetadata& Metadata() const; + + /// \brief Fetches the dataset's DataSets element. + /// + /// \returns const reference to child element + /// + const PacBio::BAM::SubDataSets& SubDataSets() const; + + /// \} + +public: + /// \name Resource Handling + /// \{ + + /// \brief Returns all of this dataset's resource files, with relative + /// filepaths already resolved. + /// + /// Includes both primary resources (e.g. subread BAM files), as well as all + /// secondary or child resources (e.g. index files, scraps BAM, etc). + /// + /// \returns vector of (resolveD) filepaths + /// + /// \sa DataSet::ResolvedResourceIds + /// + std::vector AllFiles() const; + + /// \brief Returns this dataset's primary %BAM resources, with relative + /// filepaths already resolved. + /// + /// Primary resources are those listed as top-level %ExternalResources, not + /// associated files (indices, references, scraps %BAMs, etc.). + /// + /// \returns vector of BamFiles + /// + /// \sa DataSet::ResolvedResourceIds + /// + std::vector BamFiles() const; + + /// \brief Returns this dataset's primary FASTA resources, with relative + /// filepaths already resolved. + /// + /// Primary resources are those listed as top-level %ExternalResources, not + /// associated files (indices, references, scraps %BAMs, etc.). + /// + /// \returns vector of filepaths to FASTA resources + /// + /// \sa DataSet::ResolvedResourceIds + /// + std::vector FastaFiles() const; + + /// \brief Returns all primary external resource filepaths, with relative + /// paths resolved. + /// + /// Primary resources are those listed as top-level %ExternalResources, not + /// associated files (indices, references, scraps %BAMs, etc.). + /// + /// \sa ResolvePath + /// + /// \returns resourceIds + /// + std::vector ResolvedResourceIds() const; + + /// \brief Resolves a filepath (that may be relative to the dataset). + /// + /// A DataSet's resources may be described using absolute filepaths or with + /// relative paths. For absolute paths, nothing is changed from the input. + /// For relative paths, these are resolved using the DataSet's own path + /// as a starting point. A DataSet's own path will be one of:\n + /// 1 - the location of its XML or %BAM input file, e.g. created using + /// DataSet("foo.xml") or DataSet("foo.bam")\n + /// 2 - application's current working directory for all other DataSet + /// construction methods { DataSet(), DataSet(type), + /// DataSet("foo.fofn") }\n + /// + /// \param[in] originalPath input file path (absolute or relative) + /// \returns resolved path + /// + std::string ResolvePath(const std::string& originalPath) const; + + /// \returns sequence chemistry info for all read groups in this dataset + /// + /// \sa ReadGroupInfo::SequencingChemistry + /// + std::set SequencingChemistries() const; + + /// \brief Return a minimal list of genomic intervals covered by filters. + /// + /// \param[out] vector of genomic intervals + /// + /// \throws std::runtime_error if DataSet contains invalid or non-sensical + /// filters, such as rname appearing twice, etc. + /// + std::vector GenomicIntervals() const; + + /// \} + +public: + /// \name XML Namespace Handling + /// \{ + + /// \brief Access this dataset's namespace info. + /// + /// \returns const reference to dataset's NamespaceRegistry + /// + const NamespaceRegistry& Namespaces() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \brief Fetches the value of a DataSet root element's attribute. + /// + /// These are the attributes attached to the root dataset element: \n + /// \verbatim \endverbatim + /// + /// Built-in accessors exist for the standard attributes (e.g. CreatedAt) + /// but additional attributes can be used as well via these generic methods. + /// + /// A new attribute will be created if it does not yet exist. + /// + /// \param[in] name root element's attribute name + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& Attribute(const std::string& name); + + /// \brief Fetches the value of dataset's CreatedAt attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& CreatedAt(); + + /// \brief Fetches the value of dataset's Format attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& Format(); + + /// \brief Fetches the value of dataset's MetaType attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& MetaType(); + + /// \brief Fetches the value of dataset's ModifiedAt attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& ModifiedAt(); + + /// \brief Fetches the value of dataset's Name attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& Name(); + + /// \brief Fetches the value of dataset's ResourceId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& ResourceId(); + + /// \brief Fetches the value of dataset's Tags attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& Tags(); + + /// \brief Fetches the value of dataset's TimeStampedName attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& TimeStampedName(); + + /// \brief Fetches the value of dataset's UniqueId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& UniqueId(); + + /// \brief Fetches the value of dataset's Version attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute's value (empty string if this + /// is a new attribute) + /// + std::string& Version(); + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \brief Sets this dataset's XML attribute \p name, with \p value + /// + /// These are the attributes attached to the root dataset element: \n + /// \verbatim \endverbatim + /// + /// Built-in accessors exist for the standard attributes (e.g. CreatedAt) + /// but additional attributes can be used as well via these generic methods. + /// + /// The attribute will be created if it does not yet exist. + /// + /// \param[in] name root element's attribute name + /// \param[in] value new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& Attribute(const std::string& name, const std::string& value); + + /// \brief Sets this dataset's CreatedAt attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] createdAt new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& CreatedAt(const std::string& createdAt); + + /// \brief Sets this dataset's Format attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] format new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& Format(const std::string& format); + + /// \brief Sets this dataset's MetaType attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] metatype new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& MetaType(const std::string& metatype); + + /// \brief Sets this dataset's ModifiedAt attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] modifiedAt new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& ModifiedAt(const std::string& modifiedAt); + + /// \brief Sets this dataset's Name attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] name new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& Name(const std::string& name); + + /// \brief Sets this dataset's ResourceId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] resourceId new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& ResourceId(const std::string& resourceId); + + /// \brief Sets this dataset's Tags attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] tags new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& Tags(const std::string& tags); + + /// \brief Sets this dataset's TimeStampedName attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] timeStampedName new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& TimeStampedName(const std::string& timeStampedName); + + /// \brief Sets this dataset's UniqueId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] uuid new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& UniqueId(const std::string& uuid); + + /// \brief Sets this dataset's Version attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] version new value for the attribute + /// \returns reference to this dataset object + /// + DataSet& Version(const std::string& version); + + /// \} + +public: + /// \name DataSet Type + /// \{ + + /// \brief Edits dataset type. + /// + /// \param[in] type new dataset type + /// \returns reference to this dataset object + /// + DataSet& Type(const PacBio::BAM::DataSet::TypeEnum type); + + /// \} + +public: + /// \name Child Elements + /// \{ + + /// \brief Fetches the dataset's Extensions element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::Extensions& Extensions(); + + /// \brief Fetches the dataset's ExternalResources element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::ExternalResources& ExternalResources(); + + /// \brief Fetches the dataset's Filters element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::Filters& Filters(); + + /// \brief Fetches the dataset's DataSetMetadata element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::DataSetMetadata& Metadata(); + + /// \brief Fetches the dataset's DataSets element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::SubDataSets& SubDataSets(); + + /// \} + +public: + /// \name Child Elements + /// \{ + + /// \brief Sets this dataset's Extensions element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] extensions new value for the element + /// \returns reference to this dataset object + /// + DataSet& Extensions(const PacBio::BAM::Extensions& extensions); + + /// \brief Sets this dataset's ExternalResources element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] resources new value for the element + /// \returns reference to this dataset object + /// + DataSet& ExternalResources(const PacBio::BAM::ExternalResources& resources); + + /// \brief Sets this dataset's Filters element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] filters new value for the element + /// \returns reference to this dataset object + /// + DataSet& Filters(const PacBio::BAM::Filters& filters); + + /// \brief Sets this dataset's DataSetMetadata element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] metadata new value for the element + /// \returns reference to this dataset object + /// + DataSet& Metadata(const PacBio::BAM::DataSetMetadata& metadata); + + /// \brief Sets this dataset's DataSets element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] subdatasets new value for the element + /// \returns reference to this dataset object + /// + DataSet& SubDataSets(const PacBio::BAM::SubDataSets& subdatasets); + + /// \} + +public: + /// \name XML Namespace Handling + /// \{ + + /// \brief Access this dataset's namespace info. + /// + /// \returns non-const reference to dataset's NamespaceRegistry + /// + NamespaceRegistry& Namespaces(); + + /// \} + +private: + std::unique_ptr d_; + std::string path_; +}; + +/// \name DataSet Timestamp Utilities +/// \{ + +/// \brief Fetches current time, in "DataSetXML format". +/// +/// \returns DataSetXML formatted timestamp +/// +/// \sa ToDataSetFormat +/// +PBBAM_EXPORT std::string CurrentTimestamp(); + +/// \brief Converts a time_point to "DataSetXML-formatted" timestamp. +/// +/// This is the format used as a component of the DataSet::TimeStampedName +/// (yymmdd_HHmmssttt>. +/// +/// \returns "DataSetXML-formatted" timestamp +/// +PBBAM_EXPORT std::string ToDataSetFormat(const std::chrono::system_clock::time_point& tp); + +/// \brief Converts a time_t to "DataSetXML-formatted" timestamp. +/// +/// This is the format used as a component of the DataSet::TimeStampedName +/// (yymmdd_HHmmssttt>. +/// +/// \returns "DataSetXML-formatted" timestamp +/// +PBBAM_EXPORT std::string ToDataSetFormat(const time_t& tp); + +/// \brief Converts a time_point to ISO-8601 formatted timestamp. +/// +/// This is the format used in DataSet::CreatedAt and DataSet::ModifiedAt. +/// +/// \returns ISO-8601 formatted timestamp +/// +PBBAM_EXPORT std::string ToIso8601(const std::chrono::system_clock::time_point& tp); + +/// \brief Converts a time_t to ISO-8601 formatted timestamp. +/// +/// This is the format used in DataSet::CreatedAt and DataSet::ModifiedAt. +/// +/// \returns ISO-8601 formatted timestamp +/// +PBBAM_EXPORT std::string ToIso8601(const time_t& t); + +/// \} + +} // namespace BAM +} // namespace PacBio + +#endif // DATASET_H diff --git a/include/pbbam/DataSetTypes.h b/include/pbbam/DataSetTypes.h new file mode 100644 index 0000000..51bc8f8 --- /dev/null +++ b/include/pbbam/DataSetTypes.h @@ -0,0 +1,1060 @@ +// File Description +/// \file DataSetTypes.h +/// \brief Defines the public DataSet component classes. +// +// Author: Derek Barnett + +#ifndef DATASETTYPES_H +#define DATASETTYPES_H + +#include +#include "pbbam/BamFile.h" +#include "pbbam/Config.h" +#include "pbbam/DataSetXsd.h" +#include "pbbam/internal/DataSetBaseTypes.h" + +namespace PacBio { +namespace BAM { + +/// \brief The DataSetMetadata class represents the %DataSetMetadata child +/// element in DataSetXML. +/// +/// A few top-level elements are built-in, but as pbbam is not primarily a +/// DataSetXML API, most of the metadata hierarchy needs to be manually managed. +/// +class PBBAM_EXPORT DataSetMetadata : public internal::DataSetElement +{ +public: + /// \name Constructors & Related Methods + /// \{ + + DataSetMetadata(); + DataSetMetadata(const internal::FromInputXml& fromInputXml); + + /// \brief Constructs a DataSetMetadata with required fields. + DataSetMetadata(const std::string& numRecords, const std::string& totalLength); + DataSetMetadata(const std::string& numRecords, const std::string& totalLength, + const internal::FromInputXml& fromInputXml); + + /// \} + +public: + /// \name Operators + /// \{ + + /// \brief Merges DataSetMetadata contents. + /// + /// Adds contents of \p other to this metadata object + /// + /// \param[in] other some other metadata to add to this one + /// \returns reference to this object + /// + DataSetMetadata& operator+=(const DataSetMetadata& other); + + /// \} + +public: + /// \name Child Elements + /// \{ + + /// \brief Fetches the text of the NumRecords element. + /// + /// \returns const reference to element text (empty string if not present) + /// + const std::string& NumRecords() const; + + /// \brief Fetches the text of the TotalLength element. + /// + /// \returns const reference to element text (empty string if not present) + /// + const std::string& TotalLength() const; + + /// \brief Fetches the Provenance element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::Provenance& Provenance() const; + + /// \} + +public: + /// \name Child Elements + /// \{ + + /// \brief Fetches the text of the NumRecords element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to element text + /// + std::string& NumRecords(); + + /// \brief Fetches the text of the TotalLength element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to element text + /// + std::string& TotalLength(); + + /// \brief Fetches Provenance element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::Provenance& Provenance(); + + /// \} + +public: + /// \name Child Elements + /// \{ + + /// \brief Sets the text of the NumRecords element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns reference to this metadata object + /// + DataSetMetadata& NumRecords(const std::string& numRecords); + + /// \brief Sets the text of the TotalLength element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns reference to this metadata object + /// + DataSetMetadata& TotalLength(const std::string& totalLength); + + /// \brief Sets the Provenance child element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns reference to this metadata object + /// + DataSetMetadata& Provenance(const PacBio::BAM::Provenance& provenance); + + /// \} +}; + +/// \brief The ExtensionElement class represents an %ExtensionElement element in +/// DataSetXML. +/// +class PBBAM_EXPORT ExtensionElement : public internal::DataSetElement +{ +public: + ExtensionElement(); + ExtensionElement(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The Extensions class represents an %Extensions element in DataSetXML. +/// +/// The Extensions element is essentially just a list of ExtensionElement +/// objects. +/// +class PBBAM_EXPORT Extensions : public internal::DataSetElement +{ +public: + /// \brief Creates an empty extensions list. + Extensions(); + Extensions(const internal::FromInputXml& fromInputXml); + +public: + using value_type = ExtensionElement; + using iterator_type = internal::DataSetElementIterator; + using const_iterator_type = internal::DataSetElementConstIterator; + + const value_type& operator[](size_t index) const; + value_type& operator[](size_t index); + + iterator_type begin(); + const_iterator_type begin() const; + const_iterator_type cbegin() const; + iterator_type end(); + const_iterator_type end() const; + const_iterator_type cend() const; +}; + +class ExternalResources; + +/// \brief The ExternalResource class represents an %ExternalResource element in +/// DataSetXML. +/// +/// An ExternalResource can itself have a child element, ExternalResources, that +/// lists related files (e.g. index files). +/// +class PBBAM_EXPORT ExternalResource : public internal::IndexedDataType +{ +public: + /// \brief Creates an ExternalResource from a BamFile object. + /// + /// The metatype & resourceId are automatically set. + /// + ExternalResource(const BamFile& bamFile); + + /// \brief Creates an ExternalResource with provided \p metatype and + /// \p filename as resource ID. + /// + ExternalResource(const std::string& metatype, const std::string& filename); + + ExternalResource(const std::string& metatype, const std::string& filename, + const internal::FromInputXml& fromInputXml); + +public: + /// \brief Fetches the resource's ExternalResources child element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::ExternalResources& ExternalResources() const; + +public: + /// \brief Fetches the resource's ExternalResources child element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::ExternalResources& ExternalResources(); + + /// \brief Sets this resource's ExternalResources child element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] resources new value for the element + /// \returns reference to this resource object + /// + ExternalResource& ExternalResources(const PacBio::BAM::ExternalResources& resources); + +public: + /// \brief Converts an ExternalResource to a BamFile object + /// + /// \returns corresponding BamFile object for this ExternalResource + /// \throws std::runtime_error if fails to open %BAM file (e.g. does not + /// exist, not a %BAM file, etc.) + /// + /// \deprecated Use the results from DataSet::BamFiles instead. This method + /// cannot resolve relative filepaths and will be removed in the + /// near future. + /// + BamFile ToBamFile() const; +}; + +/// \brief The ExternalResources class represents an %ExternalResources element +/// in DataSetXML. +/// +/// The ExternalResources element is essentially just a list of ExternalResource +/// elements. +/// +class PBBAM_EXPORT ExternalResources : public internal::DataSetElement +{ +public: + /// \brief Creates an empty resource list. + ExternalResources(); + ExternalResources(const internal::FromInputXml& fromInputXml); + + /// \brief Merges \p other resource list with this one. + ExternalResources& operator+=(const ExternalResources& other); + +public: + /// \brief Adds an ExternalResource to this list. + void Add(const ExternalResource& ext); + + /// \brief Removes an ExternalResource from this list. + void Remove(const ExternalResource& ext); + +public: + /// \brief Converts resource list to BamFile objects. + /// + /// \deprecated Use DataSet::BamFiles instead. This method cannot resolve + /// relative filepaths and will be removed in the near future. + /// + std::vector BamFiles() const; + +public: + using value_type = ExternalResource; + using iterator_type = internal::DataSetElementIterator; + using const_iterator_type = internal::DataSetElementConstIterator; + + const value_type& operator[](size_t index) const; + value_type& operator[](size_t index); + + iterator_type begin(); + const_iterator_type begin() const; + const_iterator_type cbegin() const; + iterator_type end(); + const_iterator_type end() const; + const_iterator_type cend() const; +}; + +/// \brief The FileIndex class represents a %FileIndex element in DataSetXML. +/// +/// A FileIndex is used as an auxiliary to an ExternalResource, providing +/// information about a data file's index file (e.g. for %BAM files, *.bai or +/// *.pbi). +/// +class PBBAM_EXPORT FileIndex : public internal::InputOutputDataType +{ +public: + /// \brief Creates a FileIndex with provided \p metatype and \p filename as + /// resource ID. + /// + FileIndex(const std::string& metatype, const std::string& filename); + + FileIndex(const std::string& metatype, const std::string& filename, + const internal::FromInputXml& fromInputXml); +}; + +/// \brief The FileIndices class represents a %FileIndices element in DataSetXML. +/// +/// The FileIndices element is essentially just a list of FileIndex elements, +/// providing information about a data file's index files (e.g. for %BAM files +/// this will usually be *.bai and/or *.pbi). +/// +class PBBAM_EXPORT FileIndices : public internal::DataSetElement +{ +public: + /// \brief Creates an empty index list. + FileIndices(); + FileIndices(const internal::FromInputXml& fromInputXml); + +public: + /// \brief Adds a FileIndex to this list. + void Add(const FileIndex& index); + + /// \brief Removes a FileIndex from this list. + void Remove(const FileIndex& index); + +public: + using value_type = FileIndex; + using iterator_type = internal::DataSetElementIterator; + using const_iterator_type = internal::DataSetElementConstIterator; + + const value_type& operator[](size_t index) const; + value_type& operator[](size_t index); + + iterator_type begin(); + const_iterator_type begin() const; + const_iterator_type cbegin() const; + iterator_type end(); + const_iterator_type end() const; + const_iterator_type cend() const; +}; + +/// \brief The Filter class represents a %Filter element in DataSetXML. +/// +/// The Filter element allows analysis pipelines to describe filters on data +/// that should be respected downstream, without needing to create filtered +/// intermediate files. +/// +/// A filter consists of a list of Property elements, each of which must be +/// passed (logical AND) to pass the filter, e.g. property1 && property2 && +/// property3. +/// +class PBBAM_EXPORT Filter : public internal::DataSetElement +{ +public: + /// \brief Creates an empty filter. + Filter(); + Filter(const internal::FromInputXml& fromInputXml); + +public: + /// \brief Fetches the filter's property list element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::Properties& Properties() const; + +public: + /// \brief Fetches the filter's property list child element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::Properties& Properties(); + + /// \brief Sets this filter's Properties child element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] properties new value for the element + /// \returns reference to this filter object + /// + Filter& Properties(const PacBio::BAM::Properties& properties); +}; + +/// \brief The Filters class represents a %Filters list element in DataSetXML. +/// +/// The Filters element is essentially a list of Filter elements. For analysis +/// purpose, each filter is considered separately (logical OR) to consider which +/// data passes, e.g. filter1 || filter2 || filter3. +/// +class PBBAM_EXPORT Filters : public internal::DataSetElement +{ +public: + /// \brief Creates an empty filter list. + Filters(); + Filters(const internal::FromInputXml& fromInputXml); + + /// \brief Merges \p other filter list with this one. + Filters& operator+=(const Filters& other); + +public: + /// \brief Adds a filter to this list. + void Add(const Filter& filter); + + /// \brief Removes a filter from this list. + void Remove(const Filter& filter); + +public: + using value_type = Filter; + using iterator_type = internal::DataSetElementIterator; + using const_iterator_type = internal::DataSetElementConstIterator; + + const value_type& operator[](size_t index) const; + value_type& operator[](size_t index); + + iterator_type begin(); + const_iterator_type begin() const; + const_iterator_type cbegin() const; + iterator_type end(); + const_iterator_type end() const; + const_iterator_type cend() const; +}; + +/// \brief The ParentTool class represents a %ParentTool element in DataSetXML. +/// +class PBBAM_EXPORT ParentTool : public internal::BaseEntityType +{ +public: + /// \brief Creates an empty %ParentTool element. + ParentTool(); + ParentTool(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The Property class represents a %Property element in DataSetXML. +/// +/// A Property is the primary building block of %DataSetXML filtering. The +/// %Property element describes a data record's property (or field), some value, +/// and a comparison operator. +/// +/// For example, one could filter all %BAM records with a read accuracy at or +/// above 0.9. In C++ this could be constructed like: +/// \code{.cpp} +/// Property p("accuracy", "0.9", ">="); +/// \endcode +/// +class PBBAM_EXPORT Property : public internal::DataSetElement +{ +public: + /// \brief Constructs a filter property. + Property(const std::string& name, const std::string& value, const std::string& op); + Property(const std::string& name, const std::string& value, const std::string& op, + const internal::FromInputXml& fromInputXml); + +public: + /// \brief Fetches the value of property's Name attribute. + /// + /// \returns const reference to attribute value + /// + const std::string& Name() const; + + /// \brief Fetches the value of property's Operator attribute. + /// + /// \returns const reference to attribute value + /// + const std::string& Operator() const; + + /// \brief Fetches the value of property's Value attribute. + /// + /// \returns const reference to attribute value + /// + const std::string& Value() const; + +public: + /// \brief Fetches the value of property's Name attribute. + /// + /// \returns non-const reference to attribute value + /// + std::string& Name(); + + /// \brief Fetches the value of property's Operator attribute. + /// + /// \returns non-const reference to attribute value + /// + std::string& Operator(); + + /// \brief Fetches the value of property's Value attribute. + /// + /// \returns nonconst reference to attribute value + /// + std::string& Value(); + +public: + /// \brief Sets this property's Name attribute. + /// + /// \param[in] name new value for the attribute + /// \returns reference to this property object + /// + Property& Name(const std::string& name); + + /// \brief Sets this property's Operator attribute. + /// + /// \param[in] op new value for the attribute + /// \returns reference to this property object + /// + Property& Operator(const std::string& op); + + /// \brief Sets this property's Value attribute. + /// + /// \param[in] value new value for the attribute + /// \returns reference to this property object + /// + Property& Value(const std::string& value); +}; + +/// \brief The Properties class represents a %Properties list element in +/// DataSetXML. +/// +/// The Properties element is essentially a list of Property elements. +/// +class PBBAM_EXPORT Properties : public internal::DataSetElement +{ +public: + /// \brief Creates an empty property list. + Properties(); + Properties(const internal::FromInputXml& fromInputXml); + +public: + /// \brief Adds a property to this list. + void Add(const Property& property); + + /// \brief Removes a property from this list. + void Remove(const Property& property); + +public: + using value_type = Property; + using iterator_type = internal::DataSetElementIterator; + using const_iterator_type = internal::DataSetElementConstIterator; + + const value_type& operator[](size_t index) const; + value_type& operator[](size_t index); + + iterator_type begin(); + const_iterator_type begin() const; + const_iterator_type cbegin() const; + iterator_type end(); + const_iterator_type end() const; + const_iterator_type cend() const; +}; + +/// \brief The Provenance class represents a %Provenance element in DataSetXML. +/// +class PBBAM_EXPORT Provenance : public internal::DataSetElement +{ +public: + /// \brief Creates a empty provenance element. + Provenance(); + Provenance(const internal::FromInputXml& fromInputXml); + +public: + /// \brief Fetches the value of CreatedBy attribute. + /// + /// \returns const reference to attribute value (empty string if not + /// present) + /// + const std::string& CreatedBy() const; + + /// \brief Fetches the value of CommonServicesInstanceId attribute. + /// + /// \returns const reference to attribute value (empty string if not + /// present) + /// + const std::string& CommonServicesInstanceId() const; + + /// \brief Fetches the value of CreatorUserId attribute. + /// + /// \returns const reference to attribute value (empty string if not + /// present) + /// + const std::string& CreatorUserId() const; + + /// \brief Fetches the value of ParentJobId attribute. + /// + /// \returns const reference to attribute value (empty string if not + /// present) + /// + const std::string& ParentJobId() const; + + /// \brief Fetches the ParentTool child element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::ParentTool& ParentTool() const; + +public: + /// \brief Fetches the value of CreatedBy attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute value (empty string if this is + /// a new attribute) + /// + std::string& CreatedBy(); + + /// \brief Fetches the value of CommonServicesInstanceId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute value (empty string if this is + /// a new attribute) + /// + std::string& CommonServicesInstanceId(); + + /// \brief Fetches the value of CreatorUserId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute value (empty string if this is + /// a new attribute) + /// + std::string& CreatorUserId(); + + /// \brief Fetches the value of ParentJobId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \returns non-const reference to attribute value (empty string if this is + /// a new attribute) + /// + std::string& ParentJobId(); + + /// \brief Fetches the ParentTool element element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::ParentTool& ParentTool(); + +public: + /// \brief Sets the CreatedBy attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] createdBy new value for the attribute + /// \returns reference to this object + /// + Provenance& CreatedBy(const std::string& createdBy); + + /// \brief Sets the CommonServicesInstanceId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] id new value for the attribute + /// \returns reference to this object + /// + Provenance& CommonServicesInstanceId(const std::string& id); + + /// \brief Sets the CreatorUserId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] id new value for the attribute + /// \returns reference to this object + /// + Provenance& CreatorUserId(const std::string& id); + + /// \brief Sets the ParentJobId attribute. + /// + /// This attribute will be created if it does not yet exist. + /// + /// \param[in] id new value for the attribute + /// \returns reference to this object + /// + Provenance& ParentJobId(const std::string& id); + + /// \brief Sets the ParentTool child element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] tool new value for the element + /// \returns reference to this dataset object + /// + Provenance& ParentTool(const PacBio::BAM::ParentTool& tool); +}; + +class SubDataSets; + +/// \brief The DataSetBase class provides the attributes & child elements shared +/// by all dataset types. +/// +/// Client code should not need to use this class directly. It should be +/// considered as more of an implementation detail and may in fact be removed +/// from public API in the future. The top-level DataSet is the recommended +/// entry point. +/// +class PBBAM_EXPORT DataSetBase : public internal::StrictEntityType +{ +public: + /// \brief Creates a DataSetBase object, or one of its subclasses, from an + /// XML element name (e.g. SubreadSet) + /// + static std::shared_ptr Create(const std::string& typeName); + static std::shared_ptr Create(const std::string& typeName, + const internal::FromInputXml& fromInputXml); + +public: + /// \brief Creates an empty, generic DataSetBase. + DataSetBase(); + DataSetBase(const internal::FromInputXml& fromInputXml); + +protected: + /// \brief Creates a DataSetBase with key values initialized. + DataSetBase(const std::string& metatype, const std::string& label, const XsdType& xsd); + DataSetBase(const std::string& metatype, const std::string& label, + const internal::FromInputXml& fromInputXml, const XsdType& xsd); + + /// \brief Returns a new DataSetBase containing a deep copy of contents + DataSetBase* DeepCopy() const; + +public: + /// \brief Merges dataset contents. + /// + /// Adds contents of \p other to this dataset object + /// + /// \param[in] other some other dataset to add to this one + /// \returns reference to this dataset object + /// + DataSetBase& operator+=(const DataSetBase& other); + +public: + /// \brief Fetches the dataset's ExternalResources element. + /// + /// \returns const reference to child element + /// \throws std::runtime_error if element does not exist + /// + const PacBio::BAM::ExternalResources& ExternalResources() const; + + /// \brief Fetches the dataset's Filters element. + /// + /// \returns const reference to child element + /// + const PacBio::BAM::Filters& Filters() const; + + /// \brief Fetches the dataset's DataSetMetadata element. + /// + /// \returns const reference to child element + /// + const PacBio::BAM::DataSetMetadata& Metadata() const; + + /// \brief Fetches the dataset's DataSets element. + /// + /// \returns const reference to child element + /// + const PacBio::BAM::SubDataSets& SubDataSets() const; + +public: + /// \brief Access this dataset's namespace info. + /// + /// \returns const reference to dataset's NamespaceRegistry + /// + const NamespaceRegistry& Namespaces() const; + +public: + /// \brief Fetches the dataset's ExternalResources element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::ExternalResources& ExternalResources(); + + /// \brief Fetches the dataset's Filters element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::Filters& Filters(); + + /// \brief Fetches the dataset's DataSetMetadata element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::DataSetMetadata& Metadata(); + + /// \brief Fetches the dataset's DataSets element. + /// + /// This element will be created if it does not yet exist. + /// + /// \returns non-const reference to child element + /// + PacBio::BAM::SubDataSets& SubDataSets(); + +public: + /// \brief Sets this dataset's ExternalResources element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] resources new value for the element + /// \returns reference to this dataset object + /// + DataSetBase& ExternalResources(const PacBio::BAM::ExternalResources& resources); + + /// \brief Sets this dataset's Filters element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] filters new value for the element + /// \returns reference to this dataset object + /// + DataSetBase& Filters(const PacBio::BAM::Filters& filters); + + /// \brief Sets this dataset's DataSetMetadata element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] metadata new value for the element + /// \returns reference to this dataset object + /// + DataSetBase& Metadata(const PacBio::BAM::DataSetMetadata& metadata); + + /// \brief Sets this dataset's DataSets element. + /// + /// This element will be created if it does not yet exist. + /// + /// \param[in] subdatasets new value for the element + /// \returns reference to this dataset object + /// + DataSetBase& SubDataSets(const PacBio::BAM::SubDataSets& subdatasets); + +public: + /// \brief Access this dataset's namespace info. + /// + /// \returns non-const reference to dataset's NamespaceRegistry + /// + NamespaceRegistry& Namespaces(); + +public: + /// \brief Saves dataset XML to file. + /// + /// \param[in] outputFilename destination for XML contents + /// + /// \throws std::runtime_error if file could be opened or if DataSet + /// elements could not be converted to XML + /// + void Save(const std::string& outputFilename); + + /// \brief Saves dataset XML to output stream, e.g. std::cout, + /// std::stringstream. + /// + /// \param[out] out destination for XML contents + /// + /// \throws std::runtime_error if DataSet elements could not be converted to + /// XML + /// + void SaveToStream(std::ostream& out); + +private: + NamespaceRegistry registry_; +}; + +/// \brief The AlignmentSet class represents an %AlignmentSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT AlignmentSet : public DataSetBase +{ +public: + /// \brief Creates an empty AlignmentSet dataset. + AlignmentSet(); + AlignmentSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The BarcodeSet class represents a %BarcodeSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT BarcodeSet : public DataSetBase +{ +public: + /// \brief Creates an empty BarcodeSet dataset. + BarcodeSet(); + BarcodeSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The ConsensusAlignmentSet class represents a %ConsensusAlignmentSet +/// root element in DataSetXML. +/// +class PBBAM_EXPORT ConsensusAlignmentSet : public DataSetBase +{ +public: + /// \brief Creates an empty ConsensusAlignmentSet dataset. + ConsensusAlignmentSet(); + ConsensusAlignmentSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The ConsensusReadSet class represents a %ConsensusReadSet root +/// element in DataSetXML. +/// +class PBBAM_EXPORT ConsensusReadSet : public DataSetBase +{ +public: + /// \brief Creates an empty ConsensusReadSet dataset. + ConsensusReadSet(); + ConsensusReadSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The ContigSet class represents a %ContigSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT ContigSet : public DataSetBase +{ +public: + /// \brief Creates an empty ContigSet dataset. + ContigSet(); + ContigSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The HdfSubreadSet class represents a %HdfSubreadSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT HdfSubreadSet : public DataSetBase +{ +public: + /// \brief Creates an empty HdfSubreadSet dataset. + HdfSubreadSet(); + HdfSubreadSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The ReferenceSet class represents a %ReferenceSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT ReferenceSet : public DataSetBase +{ +public: + /// \brief Creates an empty ReferenceSet dataset. + ReferenceSet(); + ReferenceSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The SubDataSets class represents a %DataSets list element in +/// DataSetXML. +/// +/// The SubDataSets element is essentially a list of DataSets. +/// +class PBBAM_EXPORT SubDataSets : public internal::DataSetElement +{ +public: + /// \brief Creates an empty list of sub-datasets. + SubDataSets(); + SubDataSets(const internal::FromInputXml& fromInputXml); + +public: + /// \brief Adds \p other sub-dataset to this list. + SubDataSets& operator+=(const DataSetBase& other); // single + + /// \brief Adds \p other sub-dataset list to this list. + SubDataSets& operator+=(const SubDataSets& other); // list + +public: + /// \brief Adds a sub-dataset to this list. + void Add(const DataSetBase& subdataset); + + /// \brief Removes a sub-dataset from this list. + void Remove(const DataSetBase& subdataset); + +public: + using value_type = DataSetBase; + using iterator_type = internal::DataSetElementIterator; + using const_iterator_type = internal::DataSetElementConstIterator; + + const value_type& operator[](size_t index) const; + value_type& operator[](size_t index); + + iterator_type begin(); + const_iterator_type begin() const; + const_iterator_type cbegin() const; + iterator_type end(); + const_iterator_type end() const; + const_iterator_type cend() const; +}; + +/// \brief The SubreadSet class represents a %SubreadSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT SubreadSet : public DataSetBase +{ +public: + /// \brief Creates an empty SubreadSet dataset. + SubreadSet(); + SubreadSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The TranscriptSet class represents a %TranscriptSet root element in +/// DataSetXML. +/// +class PBBAM_EXPORT TranscriptSet : public DataSetBase +{ +public: + /// \brief Creates an empty TranscriptSet dataset. + TranscriptSet(); + TranscriptSet(const internal::FromInputXml& fromInputXml); +}; + +/// \brief The TranscriptAlignmentSet class represents a %TranscriptAlignmentSet +/// root element in DataSetXML. +/// +class PBBAM_EXPORT TranscriptAlignmentSet : public DataSetBase +{ +public: + /// \brief Creates an empty TranscriptAlignmentSet dataset. + TranscriptAlignmentSet(); + TranscriptAlignmentSet(const internal::FromInputXml& fromInputXml); +}; + +enum class XmlElementType +{ + GENERIC_ELEMENT, + DATASET_METADATA, + EXTENSION, + EXTENSIONS, + EXTERNAL_RESOURCE, + EXTERNAL_RESOURCES, + FILE_INDEX, + FILE_INDICES, + FILTER, + FILTERS, + PARENT_TOOL, + PROPERTY, + PROPERTIES, + PROVENANCE, + + GENERIC_DATASET, + ALIGNMENT_SET, + BARCODE_SET, + CONSENSUS_ALIGNMENT_SET, + CONSENSUS_READ_SET, + CONTIG_SET, + HDF_SUBREAD_SET, + REFERENCE_SET, + SUBREAD_SET, + TRANSCRIPT_SET, + TRANSCRIPT_ALIGNMENT_SET, + SUBDATASETS +}; + +/// \returns the enum value for the requested XML element +/// (generic if not a built-in element type) +XmlElementType ElementTypeFromName(const std::string& name); + +} // namespace BAM +} // namespace PacBio + +#endif // DATASETTYPES_H diff --git a/include/pbbam/DataSetXsd.h b/include/pbbam/DataSetXsd.h new file mode 100644 index 0000000..b939b9c --- /dev/null +++ b/include/pbbam/DataSetXsd.h @@ -0,0 +1,120 @@ +// File Description +/// \file DataSetXsd.h +/// \brief Defines the XSD- and namespace-related classes for DataSetXML. +// +// Author: Derek Barnett + +#ifndef DATASETXSD_H +#define DATASETXSD_H + +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The XsdType enum defines the supported XSD namespaces. +/// +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 +}; + +/// \brief The NamespaceInfo class provides XML namespace info (prefix & URI). +/// +class PBBAM_EXPORT NamespaceInfo +{ +public: + /// \brief Creates an empty entry. + /// + /// This constructor only exists for STL container compatibility. + /// + NamespaceInfo(); + + /// \brief Creates a valid info entry. + NamespaceInfo(std::string name, std::string uri); + +public: + /// \brief Fetches namespace name (i.e. prefix) + const std::string& Name() const; + + /// \brief Fetches namespace URI. + const std::string& Uri() const; + +private: + std::string name_; + std::string uri_; +}; + +/// \brief The NamespaceRegistry class provides a per-dataset registry of XML +/// namespace information. +/// +/// This is used to format XML output - properly prefixing element labels with +/// namespace as appropriate. +/// +class PBBAM_EXPORT NamespaceRegistry +{ +public: + /// \name Constructors & Related Methods + /// \{ + + NamespaceRegistry(); + NamespaceRegistry(const NamespaceRegistry&); + NamespaceRegistry(NamespaceRegistry&&); + NamespaceRegistry& operator=(const NamespaceRegistry&); + NamespaceRegistry& operator=(NamespaceRegistry&&); + ~NamespaceRegistry(); + + /// \} + +public: + /// \name Registry Access + /// \{ + + /// \brief Fetches namespace info for the dataset's default XSD type. + const NamespaceInfo& DefaultNamespace() const; + + /// \brief Fetches dataset's default XSD type. + XsdType DefaultXsd() const; + + /// \brief Fetches namespace info for the requested XSD type. + const NamespaceInfo& Namespace(const XsdType& xsd) const; + + /// \brief Registers namespace info for a particular XSD type. + void Register(const XsdType& xsd, const NamespaceInfo& namespaceInfo); + + /// \brief Updates dataset's default XSD type. + void SetDefaultXsd(const XsdType& xsd); + + /// \brief Fetches the XSD type for \p elementLabel. + XsdType XsdForElement(const std::string& elementLabel) const; + + /// \brief Fetches the XSD type for a particular URI. + XsdType XsdForUri(const std::string& uri) const; + + /// \} + +private: + std::map data_; + XsdType defaultXsdType_ = XsdType::DATASETS; +}; + +} // 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..83de962 --- /dev/null +++ b/include/pbbam/EntireFileQuery.h @@ -0,0 +1,62 @@ +// File Description +/// \file EntireFileQuery.h +/// \brief Defines the EntireFileQuery class. +// +// Author: Derek Barnett + +#ifndef ENTIREFILEQUERY_H +#define ENTIREFILEQUERY_H + +#include +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The EntireFileQuery class provides iterable access to a DataSet's +/// %BAM records, reading through the entire contents of each file. +/// +/// Input files will be accessed in the order listed in the DataSet. +/// +/// \include code/EntireFileQuery.txt +/// +/// Iteration is not limited to only 'const' records. The files themselves will +/// not be affected, but individual records may be modified if needed. +/// +/// \include code/EntireFileQuery_NonConst.txt +/// +/// \note DataSets can be implicitly constructed from %BAM filenames as well. +/// Thus a single %BAM file can be read through using the following: +/// +/// \include code/EntireFileQuery_BamFilename.txt +/// +class PBBAM_EXPORT EntireFileQuery : public internal::IQuery +{ +public: + /// \brief Creates a new EntireFileQuery, reading through the entire + /// contents of a dataset. + /// + /// \param[in] dataset input data source(s) + /// \throws std::runtime_error on failure to open/read underlying %BAM + /// files. + /// + EntireFileQuery(const PacBio::BAM::DataSet& dataset); + ~EntireFileQuery() override; + +public: + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + +private: + class EntireFileQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namspace PacBio + +#endif // ENTIREFILEQUERY_H diff --git a/include/pbbam/FastaCache.h b/include/pbbam/FastaCache.h new file mode 100644 index 0000000..3dc6ca7 --- /dev/null +++ b/include/pbbam/FastaCache.h @@ -0,0 +1,59 @@ +// File Description +/// \file FastaCache.h +/// \brief Defines the FastaCache +// +// Author: Derek Barnett + +#ifndef FASTACACHE_H +#define FASTACACHE_H + +#include +#include +#include +#include + +#include "pbbam/Config.h" +#include "pbbam/FastaSequence.h" + +namespace PacBio { +namespace BAM { + +class FastaCacheData +{ +public: + explicit FastaCacheData(const std::string& filename); + + /// \brief Fetches FASTA sequence for desired interval. + /// + /// \param[in] name reference sequence name + /// \param[in] begin start position + /// \param[in] end end position + /// + /// \returns sequence string at desired interval + /// + /// \throws std::runtime_error on failure to fetch sequence + /// + std::string Subsequence(const std::string& name, size_t begin, size_t end) const; + + /// \returns the names of all sequences stored in the FASTA file + std::vector Names() const; + + /// \returns length of FASTA sequence + /// + /// \throws std::runtime_error if name is unknown + /// + size_t SequenceLength(const std::string& name) const; + +private: + std::vector cache_; + std::unordered_map lookup_; +}; + +using FastaCache = std::shared_ptr; + +FastaCache MakeFastaCache(const std::string& filename); + +} // namespace BAM +} // namespace PacBio + +#endif // FASTACACHE_H \ No newline at end of file diff --git a/include/pbbam/FastaReader.h b/include/pbbam/FastaReader.h new file mode 100644 index 0000000..cdf7207 --- /dev/null +++ b/include/pbbam/FastaReader.h @@ -0,0 +1,76 @@ +// File Description +/// \file FastaReader.h +/// \brief Defines the FastaReader class. +// +// Author: Derek Barnett + +#ifndef FASTAREADER_H +#define FASTAREADER_H + +#include +#include +#include "pbbam/FastaSequence.h" + +namespace PacBio { +namespace BAM { + +/// +/// \brief The FastaReader provides sequential access to FASTA records. +/// +class FastaReader +{ +public: + /// + /// \brief Reads all FASTA sequences from a file + /// + /// \param fn FASTA filename + /// \return vector of FastaSequence results + /// + static std::vector ReadAll(const std::string& fn); + +public: + /// \name Constructors & Related Methods + /// \{ + + explicit FastaReader(const std::string& fn); + + FastaReader(const FastaReader&) = delete; + FastaReader(FastaReader&&); + FastaReader& operator=(const FastaReader&) = delete; + FastaReader& operator=(FastaReader&&); + ~FastaReader(); + + /// \} + +public: + /// \name Sequence Access + /// \{ + + /// + /// \brief GetNext + /// + /// \code{cpp} + /// + /// FastaReader reader{ fn }; + /// FastaSequence f; + /// while (reader.GetNext(f)) { + /// // do stuff with f + /// } + /// \endcode + /// + /// \param[out] record + /// \return success/failure + /// + bool GetNext(FastaSequence& record); + + /// \} + +private: + class FastaReaderPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTAREADER_H diff --git a/include/pbbam/FastaSequence.h b/include/pbbam/FastaSequence.h new file mode 100644 index 0000000..561251a --- /dev/null +++ b/include/pbbam/FastaSequence.h @@ -0,0 +1,66 @@ +// File Description +/// \file FastaSequence.h +/// \brief Defines the FastaSequence class. +// +// Author: Derek Barnett + +#ifndef FASTASEQUENCE_H +#define FASTASEQUENCE_H + +#include + +namespace PacBio { +namespace BAM { + +/// +/// \brief The FastaSequence class represents a FASTA record (name & bases) +/// +class FastaSequence +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// + /// \brief FastaSequence + /// \param name + /// \param bases + /// + explicit FastaSequence(std::string name, std::string bases); + + FastaSequence(); + FastaSequence(const FastaSequence&); + FastaSequence(FastaSequence&&); + FastaSequence& operator=(const FastaSequence&); + FastaSequence& operator=(FastaSequence&&); + ~FastaSequence(); + + /// \} + +public: + /// \name Attributes + /// \{ + + /// + /// \brief Name + /// \return + /// + const std::string& Name() const; + + /// + /// \brief Bases + /// \return + /// + const std::string& Bases() const; + + /// \} + +private: + std::string name_; + std::string bases_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTASEQUENCE_H diff --git a/include/pbbam/FastaSequenceQuery.h b/include/pbbam/FastaSequenceQuery.h new file mode 100644 index 0000000..611818d --- /dev/null +++ b/include/pbbam/FastaSequenceQuery.h @@ -0,0 +1,50 @@ +// File Description +/// \file FastaSequenceQuery.h +/// \brief Defines the FastaSequenceQuery class. +// +// Author: Derek Barnett + +#ifndef FASTASEQUENCEQUERY_H +#define FASTASEQUENCEQUERY_H + +#include "pbbam/DataSet.h" +#include "pbbam/FastaSequence.h" +#include "pbbam/internal/QueryBase.h" + +#include +#include + +namespace PacBio { +namespace BAM { + +/// +/// \brief The FastaSequence class represents a FASTA record (name & bases) +/// +class FastaSequenceQuery : public internal::QueryBase +{ +public: + /// \name Constructors & Related Methods + /// \{ + + FastaSequenceQuery(const PacBio::BAM::DataSet& dataset); + ~FastaSequenceQuery() override; + + /// \} + +public: + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(FastaSequence& seq) override; + +private: + class FastaSequenceQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTASEQUENCEQUERY_H diff --git a/include/pbbam/FastaWriter.h b/include/pbbam/FastaWriter.h new file mode 100644 index 0000000..fbfcb4c --- /dev/null +++ b/include/pbbam/FastaWriter.h @@ -0,0 +1,44 @@ +// File Description +/// \file FastaWriter.h +/// \brief Defines the FastaWriter class. +// +// Author: Derek Barnett + +#ifndef FASTAWRITER_H +#define FASTAWRITER_H + +#include +#include +#include + +#include "pbbam/IRecordWriter.h" + +namespace PacBio { +namespace BAM { + +class BamRecord; +class BamRecordImpl; +class FastaSequence; + +class FastaWriter : public IRecordWriter +{ +public: + FastaWriter(const std::string& fn); + +public: + void Write(const FastaSequence& fastq); + void Write(const std::string& name, const std::string& bases); + + // IRecordWriter + void TryFlush() override; + void Write(const BamRecord& bam) override; + void Write(const BamRecordImpl& bam) override; + +private: + std::ofstream file_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTAWRITER_H diff --git a/include/pbbam/FastqReader.h b/include/pbbam/FastqReader.h new file mode 100644 index 0000000..3181d0a --- /dev/null +++ b/include/pbbam/FastqReader.h @@ -0,0 +1,76 @@ +// File Description +/// \file FastqReader.h +/// \brief Defines the FastqReader class. +// +// Author: Derek Barnett + +#ifndef FASTQREADER_H +#define FASTQREADER_H + +#include +#include +#include "pbbam/FastqSequence.h" + +namespace PacBio { +namespace BAM { + +/// +/// \brief The FastqReader provides sequential access to Fastq records. +/// +class FastqReader +{ +public: + /// + /// \brief Reads all Fastq sequences from a file + /// + /// \param fn Fastq filename + /// \return vector of FastqSequence results + /// + static std::vector ReadAll(const std::string& fn); + +public: + /// \name Constructors & Related Methods + /// \{ + + explicit FastqReader(const std::string& fn); + + FastqReader(const FastqReader&) = delete; + FastqReader(FastqReader&&); + FastqReader& operator=(const FastqReader&) = delete; + FastqReader& operator=(FastqReader&&); + ~FastqReader(); + + /// \} + +public: + /// \name Sequence Access + /// \{ + + /// + /// \brief GetNext + /// + /// \code{cpp} + /// + /// FastqReader reader{ fn }; + /// FastqSequence f; + /// while (reader.GetNext(f)) { + /// // do stuff with f + /// } + /// \endcode + /// + /// \param[out] record + /// \return success/failure + /// + bool GetNext(FastqSequence& record); + + /// \} + +private: + class FastqReaderPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTQREADER_H diff --git a/include/pbbam/FastqSequence.h b/include/pbbam/FastqSequence.h new file mode 100644 index 0000000..0b0749a --- /dev/null +++ b/include/pbbam/FastqSequence.h @@ -0,0 +1,72 @@ +// File Description +/// \file FastqSequence.h +/// \brief Defines the FastqSequence class. +// +// Author: Derek Barnett + +#ifndef FASTQSEQUENCE_H +#define FASTQSEQUENCE_H + +#include +#include + +#include + +namespace PacBio { +namespace BAM { + +/// +/// \brief The FastqSequence class represents a FASTQ record (name, bases, and +/// qualities) +/// +class FastqSequence : public FastaSequence +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// + /// \brief FastaSequence + /// \param name + /// \param bases + /// \param qualities + /// + explicit FastqSequence(std::string name, std::string bases, QualityValues qualities); + + /// + /// \brief FastaSequence + /// \param name + /// \param bases + /// \param qualities + /// + explicit FastqSequence(std::string name, std::string bases, std::string qualities); + + FastqSequence(); + FastqSequence(const FastqSequence&); + FastqSequence(FastqSequence&&); + FastqSequence& operator=(const FastqSequence&); + FastqSequence& operator=(FastqSequence&&); + ~FastqSequence(); + + /// \} + +public: + /// \name Attributes + /// \{ + + /// + /// \brief Qualities + /// \return + /// + const QualityValues& Qualities() const; + + /// \} + +private: + QualityValues qualities_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTQSEQUENCE_H diff --git a/include/pbbam/FastqWriter.h b/include/pbbam/FastqWriter.h new file mode 100644 index 0000000..f47ddd0 --- /dev/null +++ b/include/pbbam/FastqWriter.h @@ -0,0 +1,46 @@ +// File Description +/// \file FastqWriter.h +/// \brief Defines the FastqWriter class. +// +// Author: Derek Barnett + +#ifndef FASTQWRITER_H +#define FASTQWRITER_H + +#include +#include +#include + +#include "pbbam/IRecordWriter.h" + +namespace PacBio { +namespace BAM { + +class BamRecord; +class BamRecordImpl; +class FastqSequence; +class QualityValues; + +class FastqWriter : public IRecordWriter +{ +public: + FastqWriter(const std::string& fn); + +public: + void Write(const FastqSequence& fastq); + void Write(const std::string& name, const std::string& bases, const QualityValues& quals); + void Write(const std::string& name, const std::string& bases, const std::string& quals); + + // IRecordWriter + void TryFlush() override; + void Write(const BamRecord& bam) override; + void Write(const BamRecordImpl& bam) override; + +private: + std::ofstream file_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FASTQWRITER_H diff --git a/include/pbbam/FrameEncodingType.h b/include/pbbam/FrameEncodingType.h new file mode 100644 index 0000000..da7a7a9 --- /dev/null +++ b/include/pbbam/FrameEncodingType.h @@ -0,0 +1,31 @@ +// File Description +/// \file FrameEncodingType.h +/// \brief Defines the FrameEncodingType enum. +// +// Author: Derek Barnett + +#ifndef FRAMEENCODINGTYPE_H +#define FRAMEENCODINGTYPE_H + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the possible encoding modes used in Frames data +/// (e.g. BamRecord::IPD or BamRecord::PulseWidth). +/// +/// The LOSSY mode is the default in production output; LOSSLESS mode +/// being used primarily for internal applications. +/// +/// \sa https://github.com/PacificBiosciences/PacBioFileFormats/blob/3.0/BAM.rst +/// for more information on pulse frame encoding schemes. +/// +enum class FrameEncodingType +{ + LOSSY, ///< 8-bit compression (using CodecV1) of frame data + LOSSLESS ///< 16-bit native frame data +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FRAMEENCODINGTYPE_H diff --git a/include/pbbam/Frames.h b/include/pbbam/Frames.h new file mode 100644 index 0000000..9fb2bf7 --- /dev/null +++ b/include/pbbam/Frames.h @@ -0,0 +1,145 @@ +// File Description +/// \file Frames.h +/// \brief Defines the Frames class. +// +// Author: Derek Barnett + +#ifndef FRAMES_H +#define FRAMES_H + +#include +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The Frames class represents pulse frame data. +/// +/// Frame data may be stored in either their raw, 16-bit values or +/// using a lossy, 8-bit compression scheme. +/// +/// This class is used to store the data and convert between the 2 storage types. +/// +class PBBAM_EXPORT Frames +{ +public: + /// \name Conversion Methods + /// \{ + + /// \brief 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& codedData); + + /// \brief Creates encoded, compressed frame data from raw input data. + /// + /// \param[in] frames raw frame data + /// \returns lossy, 8-bit encoded frame data + /// + static std::vector Encode(const std::vector& frames); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + Frames(std::vector frames); + + Frames(); + Frames(const Frames&); + Frames(Frames&&); + Frames& operator=(const Frames&); + Frames& operator=(Frames&&); + ~Frames(); + + /// \} + +public: + /// \name Access Data + /// \{ + + /// \returns Frame data in expanded (not encoded) form + std::vector& DataRaw(); + const std::vector& Data() const; + + /// \} + +public: + /// \name Conversion Methods + /// \{ + + /// \returns Frame data in (lossy, 8-bit) encoded form. + std::vector Encode() const; + + /// \} + +public: + /// \name Comparison Operators + /// \{ + + bool operator==(const Frames& other) const; + bool operator!=(const Frames& other) const; + + /// \} + +public: + /// \name STL Compatbility + /// \{ + + /// \returns A const_iterator to the beginning of the sequence. + std::vector::const_iterator cbegin() const; + + /// \returns A const_iterator to the element past the end of the sequence. + std::vector::const_iterator cend() const; + + /// \returns A const_iterator to the beginning of the sequence. + std::vector::const_iterator begin() const; + + /// \returns A const_iterator to the element past the end of the sequence. + std::vector::const_iterator end() const; + + /// \returns An iterator to the beginning of the sequence. + std::vector::iterator begin(); + + /// \returns An iterator to the element past the end of the sequence. + std::vector::iterator end(); + + /// \returns The number of frame data points. + size_t size() const; + + /// \returns True if the container is empty, false otherwise. + bool empty() const; + + /// \} + +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(std::vector frames); + + /// \} + +private: + std::vector data_; +}; + +} // 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..2765c8b --- /dev/null +++ b/include/pbbam/GenomicInterval.h @@ -0,0 +1,150 @@ +// File Description +/// \file GenomicInterval.h +/// \brief Defines the GenomicInterval class. +// +// Author: Derek Barnett + +#ifndef GENOMICINTERVAL_H +#define GENOMICINTERVAL_H + +#include +#include +#include "pbbam/Config.h" +#include "pbbam/Interval.h" +#include "pbbam/Position.h" + +namespace PacBio { +namespace BAM { + +/// \brief The GenomicInterval class represents a genomic interval (reference +/// name and 0-based coordinates). +/// +class PBBAM_EXPORT GenomicInterval +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty genomic interval + GenomicInterval(); + + /// \brief Creates a genomic interval on sequence with \p name, using range: + /// [\p start, \p stop) + GenomicInterval(std::string name, Position start, Position stop); + + /// \brief Creates a genomic interval, using REGION string + /// + /// ":-" ("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&); + GenomicInterval(GenomicInterval&&); + GenomicInterval& operator=(const GenomicInterval&); + GenomicInterval& operator=(GenomicInterval&&); + ~GenomicInterval(); + + /// \} + +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; + + /// \} + +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() const; + + /// \returns length of underlying + size_t Length() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \returns interval reference name + std::string Name() const; + + /// \returns underlying Interval object + PacBio::BAM::Interval Interval() const; + + /// \returns interval start coordinate + Position Start() const; + + /// \returns interval stop coordinate + Position Stop() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// Sets this interval's reference name. + /// + /// \param[in] name + /// \returns reference to this interval + /// + GenomicInterval& Name(std::string name); + + /// Sets this underlying Interval + /// + /// \param[in] interval + /// \returns reference to this interval + /// + GenomicInterval& Interval(PacBio::BAM::Interval 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); + + /// \} + +private: + std::string name_; + PacBio::BAM::Interval interval_; +}; + +} // 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..c9d57a4 --- /dev/null +++ b/include/pbbam/GenomicIntervalQuery.h @@ -0,0 +1,88 @@ +// File Description +/// \file GenomicIntervalQuery.h +/// \brief Defines the GenomicIntervalQuery class. +// +// Author: Derek Barnett + +#ifndef GENOMICINTERVALQUERY_H +#define GENOMICINTERVALQUERY_H + +#include +#include "pbbam/GenomicInterval.h" +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The GenomicIntervalQuery class provides iterable access to a +/// DataSet's %BAM records, limiting results to those overlapping a +/// GenomicInterval. +/// +/// Example: +/// \include code/GenomicIntervalQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".bai" index file. +/// Use BamFile::EnsureStandardIndexExists before creating the query if +/// one may not be present. +/// +class PBBAM_EXPORT GenomicIntervalQuery : public internal::IQuery +{ +public: + /// \brief Constructs a new GenomiIntervalQuery, that can be used to retrieve + /// only those records overlapping a GenomicInterval. + /// + /// \note Using this constructor means that an interval must be provided, via + /// query.Interval(i), before iterating. + /// + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// BAI files. + /// + GenomicIntervalQuery(const PacBio::BAM::DataSet& dataset); + + /// \brief Constructs a new GenomiIntervalQuery, limiting record results to + /// only those overalpping a GenomicInterval. + /// + /// \param[in] interval genomic interval of interest + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// BAI files. + /// + GenomicIntervalQuery(const GenomicInterval& interval, const PacBio::BAM::DataSet& dataset); + ~GenomicIntervalQuery() override; + +public: + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + +public: + /// \brief Sets a new genomic interval. + /// + /// This allows the same dataset/query to be re-used over multiple regions of + /// interest: + /// + /// \include code/GenomicIntervalQuery_Reuse.txt + /// + /// \param[in] interval new genomic interval + /// \returns reference to this query + /// + GenomicIntervalQuery& Interval(const GenomicInterval& interval); + + /// \returns Current genomic interval active on this query. + const GenomicInterval& Interval() const; + +private: + class GenomicIntervalQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // GENOMICINTERVALQUERY_H diff --git a/include/pbbam/IRecordWriter.h b/include/pbbam/IRecordWriter.h new file mode 100644 index 0000000..184ff3b --- /dev/null +++ b/include/pbbam/IRecordWriter.h @@ -0,0 +1,55 @@ +// File Description +/// \file IRecordWriter.h +/// \brief Defines the IRecordWriter interface. +// +// Author: Derek Barnett + +#ifndef IRECORDWRITER_H +#define IRECORDWRITER_H + +namespace PacBio { +namespace BAM { + +class BamRecord; +class BamRecordImpl; + +class IRecordWriter +{ +public: + virtual ~IRecordWriter(); + +public: + /// \brief Try to flush any buffered data to file. + /// + /// \note The underlying implementation may not necessarily flush buffered + /// data immediately, especially in a multithreaded writer situation. + /// Let the writer go out of scope to fully ensure flushing. + /// + /// \throws std::runtime_error if flush fails + /// + virtual void TryFlush() = 0; + + /// \brief Write a record to the output %BAM file. + /// + /// \param[in] record BamRecord object + /// + /// \throws std::runtime_error on failure to write + /// + virtual void Write(const BamRecord& record) = 0; + + /// \brief Write a record to the output %BAM file. + /// + /// \param[in] recordImpl BamRecordImpl object + /// + /// \throws std::runtime_error on failure to write + /// + virtual void Write(const BamRecordImpl& recordImpl) = 0; + +protected: + IRecordWriter(); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // IRECORDWRITER_H diff --git a/include/pbbam/IndexedBamWriter.h b/include/pbbam/IndexedBamWriter.h new file mode 100644 index 0000000..e08d683 --- /dev/null +++ b/include/pbbam/IndexedBamWriter.h @@ -0,0 +1,156 @@ +// File Description +/// \file IndexedBamWriter.h +/// \brief Defines the IndexedBamWriter class. +// +// Author: Derek Barnett + +#ifndef INDEXEDBAMWRITER_H +#define INDEXEDBAMWRITER_H + +#include +#include + +#include "pbbam/BamWriter.h" +#include "pbbam/Config.h" +#include "pbbam/IRecordWriter.h" +#include "pbbam/PbiBuilder.h" + +namespace PacBio { +namespace BAM { + +class BamHeader; +class BamRecord; +class BamRecordImpl; + +struct IndexedBamWriterConfig +{ + std::string outputFilename; + BamHeader header; + + BamWriter::CompressionLevel bamCompressionLevel = BamWriter::DefaultCompression; + PbiBuilder::CompressionLevel pbiCompressionLevel = PbiBuilder::DefaultCompression; + + // Number of threads used while writing to BAM file + size_t numBamThreads = 4; + // Number of threads used while writing to pbi file + size_t numPbiThreads = 4; + // Number of threads used while doing a trailing read of the BaM file being + // written (to help compute indexes) + size_t numGziThreads = 4; + + // Max size in memory for temporary files before flushing to disk. + size_t tempFileBufferSize = 0x10000; +}; +/// +/// \brief The IndexedBamWriter class +/// +/// +/// +/// +/// +/// +class IndexedBamWriter : public IRecordWriter +{ +public: + /// + /// \brief IndexedBamWriter + /// + /// \param[in] filename path to output %BAM file + /// \param[in] header BAM file header + /// + /// \param[in] bamCompressionLevel zlib compression level for output BAM + /// \param[in] numBamThreads number of threads for BAM compression. + /// If set to 0, the writer 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. + /// + /// \param[in] pbiCompressionLevel zlib compression level for output PBI + /// \param[in] numPbiThreads number of threads for PBI compression. + /// If set to 0, the writer 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. + /// \param[in] numGziThreads number of threads used by the trailing + /// reader process used to help compute indexes. + /// If set to 0, the writer 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. + /// \param[in] tempFileBufferBytes Maximum number of bytes various temporary + /// files can use before they flush to disk. + /// Larger numbers require more resources but + /// may increase disk IO efficiency. + /// + /// \throws std::runtime_error if there was a problem + /// + IndexedBamWriter( + const std::string& outputFilename, const BamHeader& header, + const BamWriter::CompressionLevel bamCompressionLevel = BamWriter::DefaultCompression, + const size_t numBamThreads = 4, + const PbiBuilder::CompressionLevel pbiCompressionLevel = PbiBuilder::DefaultCompression, + const size_t numPbiThreads = 4, const size_t numGziThreads = 4, + const size_t tempFileBufferSize = 0x10000); + + /// \brief IndexedBamWRiter + /// + /// \param[in] config Struct containing all the parameters used to construct + /// this object. See documentation for other constructor + /// for more details + IndexedBamWriter(const IndexedBamWriterConfig& config) + : IndexedBamWriter(config.outputFilename, config.header, config.bamCompressionLevel, + config.numBamThreads, config.pbiCompressionLevel, config.numPbiThreads, + config.numGziThreads, config.tempFileBufferSize) + { + } + + IndexedBamWriter(const IndexedBamWriter&) = delete; + IndexedBamWriter(IndexedBamWriter&&); + IndexedBamWriter& operator=(const IndexedBamWriter&) = delete; + IndexedBamWriter& operator=(IndexedBamWriter&&); + ~IndexedBamWriter() override; + +public: + /// + /// \brief TryFlush + /// + void TryFlush() override; + + /// + /// \brief Write + /// + /// \param[in] record + /// + void Write(const BamRecord& record) override; + + /// + /// \brief Write + /// + /// \param[in] record + /// + void Write(const BamRecordImpl& record) override; + + /// \brief ReaderTrailingDistance + /// + /// Allows calling code to monitor how far behind (in bytes) + /// the reader thread trails behind the tip of the current + /// being written BAM file. May be useful for diagnosing + /// performance issues if the reader thread falls enough behind + /// that caching is insufficient to prevent an IO hit from the + /// extra read operations. + /// + /// Note: Returns a "high water mark", not a current value. + size_t MaxReaderLag() const; + +private: + class IndexedBamWriterPrivate2; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // INDEXEDBAMWRITER_H diff --git a/include/pbbam/IndexedFastaReader.h b/include/pbbam/IndexedFastaReader.h new file mode 100644 index 0000000..d1b83f8 --- /dev/null +++ b/include/pbbam/IndexedFastaReader.h @@ -0,0 +1,144 @@ +// File Description +/// \file IndexedFastaReader.h +/// \brief Defines the IndexedFastaReader class. +// +// Author: David Alexander + +#ifndef INDEXEDFASTAREADER_H +#define INDEXEDFASTAREADER_H + +#include +#include +#include +#include +#include +#include +#include "pbbam/Orientation.h" +#include "pbbam/Position.h" + +namespace PacBio { +namespace BAM { + +class GenomicInterval; +class BamRecord; + +/// \brief The IndexedFastaReader class provides random-access to FASTA file +/// data. +/// +class IndexedFastaReader +{ + +public: + /// \name Constructors & Related Methods + /// \{ + + IndexedFastaReader(const std::string& filename); + IndexedFastaReader(const IndexedFastaReader& src); + + IndexedFastaReader() = delete; + IndexedFastaReader(IndexedFastaReader&&); + IndexedFastaReader& operator=(const IndexedFastaReader& rhs); + IndexedFastaReader& operator=(IndexedFastaReader&&); + ~IndexedFastaReader(); + + /// \} + +public: + /// name Sequence Access + /// \{ + + /// \brief Fetches FASTA sequence for desired interval. + /// + /// \param[in] id reference sequence name + /// \param[in] begin start position + /// \param[in] end end position + /// + /// \returns sequence string at desired interval + /// + /// \throws std::runtime_error on failure to fetch sequence + /// + std::string Subsequence(const std::string& id, Position begin, Position end) const; + + /// \brief Fetches FASTA sequence for desired interval. + /// + /// \param[in] interval desired interval + /// + /// \returns sequence string at desired interval + /// + /// \throws std::runtime_error on failure to fetch sequence + /// + std::string Subsequence(const GenomicInterval& interval) const; + + /// \brief Fetches FASTA sequence for desired interval. + /// + /// \param[in] htslibRegion htslib/samtools-formatted REGION string + /// representing the desired interval + /// + /// \returns sequence string at desired interval + /// + /// \throws std::runtime_error on failure to fetch sequence + /// + std::string Subsequence(const char* htslibRegion) const; + + /// \brief Fetches FASTA sequence corresponding to a 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. + /// + /// \param[in] bamRecord input BamRecord to derive interval/CIGAR + /// data + /// \param[in] orientation orientation of output + /// \param[in] gapped if true, gaps/padding will be inserted, per + /// record's CIGAR info. + /// \param[in] exciseSoftClips if true, any soft-clipped positions will be + /// removed from query ends + /// + /// \returns sequence string over the record's interval + /// + /// \throws std::runtime_error on failure to fetch sequence + /// + std::string ReferenceSubsequence(const BamRecord& bamRecord, + const Orientation orientation = Orientation::GENOMIC, + const bool gapped = false, + const bool exciseSoftClips = false) const; + + /// \} + +public: + /// \name File Attributes + /// \{ + + /// \returns true if FASTA file contains a sequence matching \p name + bool HasSequence(const std::string& name) const; + + /// \returns the names of the sequence at a specific index in the FASTA file + std::string Name(const size_t idx) const; + + /// \returns the names of all sequences stored in the FASTA file + std::vector Names() const; + + /// \returns number of sequences stored in FASTA file + int NumSequences() const; + + /// \returns length of FASTA sequence + /// + /// \throws std::runtime_error if length could not be determined + /// + int SequenceLength(const std::string& name) const; + + /// \} + +private: + std::string filename_; + faidx_t* handle_; + + void Close(); + bool Open(std::string filename); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // INDEXEDFASTAREADER_H diff --git a/include/pbbam/Interval.h b/include/pbbam/Interval.h new file mode 100644 index 0000000..ed85203 --- /dev/null +++ b/include/pbbam/Interval.h @@ -0,0 +1,121 @@ +// File Description +/// \file Interval.h +/// \brief Defines the Interval class. +// +// Author: Derek Barnett + +#ifndef INTERVAL_H +#define INTERVAL_H + +#include +#include +#include "pbbam/Config.h" + +#define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS +#include +#include + +namespace PacBio { +namespace BAM { + +/// \brief Represents a half-open (right-open) interval [start, stop) +/// +/// \note This class is agnostic whether the values are 0-based or 1-based. +/// Client code should primarily work with GenomicInterval, which does +/// enforce this distinction. +/// +template +class Interval +{ +public: + using interval_type = boost::icl::discrete_interval; + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty interval [0,0) + Interval(); + + /// \brief Creates a 'singleton' interval [val,val+1) + Interval(const T val); + + /// brief Creates an interval from [start, stop) */ + Interval(const T start, const T stop); + + Interval(const Interval&) = default; + Interval(Interval&&) = default; + Interval& operator=(const Interval&) = default; + Interval& operator=(Interval&&) = default; + ~Interval() = default; + + /// \} + +public: + /// \name Comparison Operators + /// \{ + + /// \returns true if both intervals share the same endpoints + bool operator==(const Interval& other) const; + + /// \returns true if either interval's endpoints differ + bool operator!=(const Interval& other) const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \returns interval's start coordinate + T Start() const; + + /// Sets this interval's start coordinate. + /// + /// \param[in] start + /// \returns reference to this interval + /// + Interval& Start(const T& start); + + /// \returns interval's stop coordinate + T Stop() const; + + /// Sets this interval's stop coordinate. + /// + /// \param[in] stop + /// \returns reference to this interval + /// + Interval& Stop(const T& stop); + + /// \} + +public: + /// \name Interval Operations + + /// \returns true if this interval is fully covered by (or contained in) \p other + bool CoveredBy(const Interval& other) const; + + //// \returns true if this interval covers (or contains) \p other + bool Covers(const Interval& other) const; + + /// \returns true if intervals interset + bool Intersects(const Interval& other) const; + + /// \returns true if interval is valid (e.g. start < stop) + bool IsValid() const; + + /// \returns interval length + size_t Length() const; + + /// \} + +private: + interval_type data_; +}; + +} // namespace BAM +} // namspace PacBio + +#include "pbbam/internal/Interval.inl" + +#endif // GENOMICINTERVAL_H diff --git a/include/pbbam/LocalContextFlags.h b/include/pbbam/LocalContextFlags.h new file mode 100644 index 0000000..703f44e --- /dev/null +++ b/include/pbbam/LocalContextFlags.h @@ -0,0 +1,45 @@ +// File Description +/// \file LocalContextFlags.h +/// \brief Defines the LocalContextFlags enum & helper method(s). +// +// Author: Lance Hepler + +#ifndef LOCALCONTEXTFLAGS_H +#define LOCALCONTEXTFLAGS_H + +#include + +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The LocalContextFlags enum defines the flags that can be used +/// to describe a subread's "local context", i.e. whether it is +/// flanked by barcodes/adapters or its pass orientation. +/// +enum LocalContextFlags : uint8_t +{ + NO_LOCAL_CONTEXT = 0, ///< No context information available + ADAPTER_BEFORE = 1, ///< Adapter precedes subread + ADAPTER_AFTER = 2, ///< Adapter follows subread + BARCODE_BEFORE = 4, ///< Barcode precedes subread + BARCODE_AFTER = 8, ///< Barcode follows subread + FORWARD_PASS = 16, ///< Subread's orientation is 'forward pass' + REVERSE_PASS = 32, ///< Subread's orientation is 'reverse pass' + ADAPTER_BEFORE_BAD = 64, ///< Adapter preceding subread does not align to adapter reference + ADAPTER_AFTER_BAD = 128 ///< Adapter following subread does not align to adapter reference +}; + +/// \returns a LocalContextFlags value containing the result of the bitwise-OR +/// operation of \p lhs and \p rhs. +// constexpr is implicitly inline +constexpr LocalContextFlags operator|(const LocalContextFlags lhs, const LocalContextFlags rhs) +{ + return static_cast(static_cast(lhs) | static_cast(rhs)); +} + +} // namespace BAM +} // namespace PacBio + +#endif // LOCALCONTEXTFLAGS_H diff --git a/include/pbbam/MD5.h b/include/pbbam/MD5.h new file mode 100644 index 0000000..37885aa --- /dev/null +++ b/include/pbbam/MD5.h @@ -0,0 +1,22 @@ +// File Description +/// \file MD5.h +/// \brief Defines basic MD5 hash utilities +// +// Author: Brett Bowman + +#ifndef MD5_H +#define MD5_H + +#include + +namespace PacBio { +namespace BAM { + +/// \brief MD5 hash of a string as a 32-digit hexadecimal string +/// +std::string MD5Hash(const std::string& str); + +} // namespace BAM +} // namespace PacBio + +#endif // MD5_H diff --git a/include/pbbam/MakeUnique.h b/include/pbbam/MakeUnique.h new file mode 100644 index 0000000..48b0bc5 --- /dev/null +++ b/include/pbbam/MakeUnique.h @@ -0,0 +1,27 @@ +// File Description +// +// Author: Derek Barnett, David Seifert + +#ifndef PBBAM_MAKE_UNIQUE_H +#define PBBAM_MAKE_UNIQUE_H + +// Only include if in C++11 mode or if using GCC 4.8 +// +#if (__cplusplus <= 201103L) || ((__GNUC__ == 4) && (__GNUC_MINOR__ == 8)) + +#include +#include + +namespace std { + +template +inline std::unique_ptr make_unique(Args&&... args) +{ + return std::unique_ptr(new T(std::forward(args)...)); +} + +} // namespace std + +#endif // <= C++11 + +#endif // PBBAM_MAKE_UNIQUE_H diff --git a/include/pbbam/MoveAppend.h b/include/pbbam/MoveAppend.h new file mode 100644 index 0000000..c24e727 --- /dev/null +++ b/include/pbbam/MoveAppend.h @@ -0,0 +1,50 @@ +// Author: Derek Barnett + +#ifndef MOVEAPPEND_H +#define MOVEAPPEND_H + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +// \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] dst Output vector that will be appended to +/// +template +inline void MoveAppend(std::vector& src, std::vector& 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] dst Output vector that will be appended to +/// +template +inline void MoveAppend(std::vector&& src, std::vector& 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 // MOVEAPPEND_H diff --git a/include/pbbam/Orientation.h b/include/pbbam/Orientation.h new file mode 100644 index 0000000..637e5a5 --- /dev/null +++ b/include/pbbam/Orientation.h @@ -0,0 +1,34 @@ +// File Description +/// \file Orientation.h +/// \brief Defines the Orientation enum. +// +// Author: Derek Barnett + +#ifndef ORIENTATION_H +#define ORIENTATION_H + +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the orientations recognized by BamRecord, for +/// presenting "per-base" data. +/// +/// Orientation::NATIVE indicates that data should be presented in the subread's +/// original form. +/// +/// Orientation::GENOMIC indicates that data should be presented relative to +/// genomic forward strand. This means that data will be reversed (or +/// reverse-complemented) if the subread was aligned to the reverse strand. +/// +enum class Orientation +{ + NATIVE, ///< Present data in 'raw' original orientation, regardless of aligned Strand + GENOMIC ///< Present data in aligned orientation, always relative to Strand::FORWARD. +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ORIENTATION_H diff --git a/include/pbbam/PbiBasicTypes.h b/include/pbbam/PbiBasicTypes.h new file mode 100644 index 0000000..a8820bb --- /dev/null +++ b/include/pbbam/PbiBasicTypes.h @@ -0,0 +1,81 @@ +// File Description +/// \file PbiBasicTypes.h +/// \brief Defines the basic data structures used in PBI lookups. +// +// Author: Derek Barnett + +#ifndef PBIBASICTYPES_H +#define PBIBASICTYPES_H + +#include +#include +#include +#include +#include +#include "pbbam/Compare.h" +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The IndexResultBlock class represents a contiguous group of records +/// returned from a PBI lookup. +/// +/// Contiguous reads that satisfy a PBI lookup query will be merged down into a +/// single block. This helps to minimize the number of seeks in subsequent read +/// operations. +/// +/// An PBI-enabled reader or query can iterate over a list of IndexResultBlocks; +/// for each block, seeking to the first record and then sequentially reading +/// 'numReads' consecutive records before needing to seek again. +/// +struct PBBAM_EXPORT IndexResultBlock +{ +public: + IndexResultBlock(size_t idx, size_t numReads); + + IndexResultBlock() = default; + IndexResultBlock(const IndexResultBlock&) = default; + IndexResultBlock(IndexResultBlock&&) = default; + IndexResultBlock& operator=(const IndexResultBlock&) = default; + IndexResultBlock& operator=(IndexResultBlock&&) = default; + ~IndexResultBlock() = default; + +public: + bool operator==(const IndexResultBlock& other) const; + bool operator!=(const IndexResultBlock& other) const; + +public: + size_t firstIndex_ = 0; ///< index of block's first record in BAM/PBI files (e.g. i-th record) + size_t numReads_ = 0; ///< number of reads in this block + int64_t virtualOffset_ = -1; ///< virtual offset of first record in this block +}; + +/// \brief container of PBI result blocks +/// +using IndexResultBlocks = std::deque; + +/// \brief container of raw PBI indices +/// +/// This is the primary result of PbiFilter -associated classes. This raw list +/// can participate in set operations (union, intersect) for compound filters, +/// and then be merged down into IndexResultBlocks for actual data file +/// random-access. +/// +using IndexList = std::vector; + +/// \brief pair representing a range of PBI indices: where interval +/// is [first, second) +/// +/// Used primarily by the PBI's CoordinateSortedData components. +/// +/// \sa PbiReferenceEntry, PbiRawReferenceData, & ReferenceLookupData +/// +using IndexRange = std::pair; + +} // namespace BAM +} // namespace PacBio + +#include "pbbam/internal/PbiBasicTypes.inl" + +#endif // PBIBASICTYPES_H diff --git a/include/pbbam/PbiBuilder.h b/include/pbbam/PbiBuilder.h new file mode 100644 index 0000000..ade0d2f --- /dev/null +++ b/include/pbbam/PbiBuilder.h @@ -0,0 +1,178 @@ +// File Description +/// \file PbiBuilder.h +/// \brief Defines the PbiBuilder class. +// +// Author: Derek Barnett + +#ifndef PBIBUILDER_H +#define PBIBUILDER_H + +#include +#include +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +class BamRecord; +class PbiRawData; + +/// \brief The PbiBuilder class construct PBI index data from %BAM record data. +/// +/// Records are added one-by-one. This allows for either whole-file indexing of +/// existing %BAM files or for indexing "on-the-fly" alongside a %BAM file as it +/// is generated. +/// +/// For simple PBI creation from existing %BAM files, see PbiFile::CreateFrom. +/// This is the recommended approach, unless finer control or additional +/// processing is needed. +/// +class PBBAM_EXPORT PbiBuilder +{ +public: + /// \brief This enum allows you to control the compression level of the + /// output PBI 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 + /// \{ + + /// \brief Initializes builder to write data to \p pbiFilename. + /// + /// \param[in] pbiFilename output filename + /// \param[in] compressionLevel zlib compression level + /// \param[in] numThreads number of threads for compression. If set to + /// 0, PbiBuilder 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. + /// + /// \throws std::runtime_error if PBI file cannot be opened for writing + /// + PbiBuilder(const std::string& pbiFilename, + const PbiBuilder::CompressionLevel compressionLevel = PbiBuilder::DefaultCompression, + const size_t numThreads = 4); + + /// \brief Initializes 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). + /// + /// \param[in] pbiFilename output filename + /// \param[in] numReferenceSequences number of possible reference + /// sequences, e.g. BamHeader::NumSequences + /// \param[in] compressionLevel zlib compression level + /// \param[in] numThreads number of threads for compression. If set to + /// 0, PbiBuilder 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. + /// + /// \throws std::runtime_error if PBI file cannot be opened for writing + /// + PbiBuilder(const std::string& pbiFilename, const size_t numReferenceSequences, + const PbiBuilder::CompressionLevel compressionLevel = PbiBuilder::DefaultCompression, + const size_t numThreads = 4); + + /// \brief Initializes builder to write data to \p pbiFilename. + /// + /// Reference data-tracking structures will be initialized to expect + /// \p numReferenceSequences, but only if \p isCoordinateSorted is true. + /// + /// \param[in] pbiFilename output filename + /// \param[in] numReferenceSequences number of possible reference + /// sequences, e.g. BamHeader::NumSequences + /// \param[in] isCoordinateSorted if false, disables reference + /// sequence tracking + /// (BamHeader::SortOrder != "coordinate") + /// \param[in] compressionLevel zlib compression level + /// \param[in] numThreads number of threads for compression. If set to + /// 0, PbiBuilder 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. + /// + /// \throws std::runtime_error if PBI file cannot be opened for writing + /// + PbiBuilder(const std::string& pbiFilename, const size_t numReferenceSequences, + const bool isCoordinateSorted, + const PbiBuilder::CompressionLevel compressionLevel = PbiBuilder::DefaultCompression, + const size_t numThreads = 4); + + /// \brief Destroys builder, writing its data out to PBI file. + /// + /// + /// \note Exceptions are swallowed. Use Close() if you want to catch them. + /// + ~PbiBuilder() noexcept; + + /// \} + +public: + /// \name Index Building + /// \{ + + /// \brief Adds \p record's data to underlying raw data structure. + /// + /// \note \p vOffset is a BGZF \b virtual offset into the %BAM file. To get + /// this value, you should use one of the following: \n + /// - while reading existing %BAM: BamReader::VirtualTell \n + /// - while writing new %BAM: BamWriter::Write(const BamRecord& record, int64_t* vOffset) \n + /// + /// + /// To build a PBI index while generating a %BAM file: + /// \include code/PbiBuilder_WithWriter.txt + /// + /// To build a PBI index from an existing %BAM file: + /// \include code/PbiBuilder_WithReader.txt + /// + /// \param[in] record input BamRecord to pull index data from + /// \param[in] vOffset \b virtual offset into %BAM file where record begins + /// + void AddRecord(const BamRecord& record, const int64_t vOffset); + + /// \brief Writes data out to PBI file & closes builder. + /// + /// \note Any exceptions are thrown to caller. If you don't care about + /// catching exceptions with file I/O, just let the builder go out of + /// scope and data will be written, but exceptions swallowed (to avoid + /// throwing from destructor). + /// + void Close(); + + /// \} + +private: + class PbiBuilderPrivate; + std::unique_ptr 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..eb44561 --- /dev/null +++ b/include/pbbam/PbiFile.h @@ -0,0 +1,108 @@ +// File Description +/// \file PbiFile.h +/// \brief Defines the PbiFile enums, typedefs, and methods. +// +// Author: Derek Barnett + +#ifndef PBIFILE_H +#define PBIFILE_H + +#include +#include +#include +#include "pbbam/Config.h" +#include "pbbam/PbiBuilder.h" + +namespace PacBio { +namespace BAM { + +class BamFile; + +struct PbiFile +{ + + /// \brief This enum describes the PBI file sections + /// + enum Section + { + BASIC = 0x0000, ///< BasicData (required) + MAPPED = 0x0001, ///< MappedData (always optional) + REFERENCE = 0x0002, ///< ReferenceData (always optional) + BARCODE = 0x0004, ///< BarcodeData (always optional) + + ALL = BASIC | MAPPED | REFERENCE | BARCODE ///< Synonym for 'all sections' + }; + + /// \brief Helper typedef for storing multiple Section flags. + /// + using Sections = uint16_t; + + /// \brief This enum describes the PBI file version. + enum VersionEnum + { + Version_3_0_0 = 0x030000, ///< v3.0.0 + Version_3_0_1 = 0x030001, ///< v3.0.1 + Version_3_0_2 = 0x030002, ///< v3.0.2 + + CurrentVersion = Version_3_0_2 ///< Synonym for the current PBI version. + }; + + /// + /// \brief The BasicField enum + /// + enum class BasicField + { + RG_ID, + Q_START, + Q_END, + ZMW, + READ_QUALITY, + CONTEXT_FLAG, + VIRTUAL_OFFSET + }; + + /// + /// \brief The MappedField enum + /// + enum class MappedField + { + T_ID, + T_START, + T_END, + A_START, + A_END, + N_M, + N_MM, + N_INS, + N_DEL, + MAP_QUALITY, + STRAND + }; + + /// + /// \brief The BarcodeField enum + /// + enum class BarcodeField + { + BC_FORWARD, + BC_REVERSE, + BC_QUALITY + }; + + /// \brief Builds PBI index data from the supplied %BAM file and writes a + /// ".pbi" file. + /// + /// \param[in] bamFile source %BAM file + /// + /// \throws std::runtime_error if index file could not be created + /// + static void CreateFrom( + const BamFile& bamFile, + const PbiBuilder::CompressionLevel compressionLevel = PbiBuilder::DefaultCompression, + const size_t numThreads = 4); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PBIFILE_H diff --git a/include/pbbam/PbiFilter.h b/include/pbbam/PbiFilter.h new file mode 100644 index 0000000..0af1be4 --- /dev/null +++ b/include/pbbam/PbiFilter.h @@ -0,0 +1,247 @@ +// File Description +/// \file PbiFilter.h +/// \brief Defines the PbiFilter class & helper 'concept'. +// +// Author: Derek Barnett + +#ifndef PBIFILTER_H +#define PBIFILTER_H + +#include +#include +#include +#include +#include +#include "pbbam/DataSet.h" +#include "pbbam/PbiBasicTypes.h" +#include "pbbam/PbiRawData.h" +#include "pbbam/Unused.h" + +namespace PacBio { +namespace BAM { + +namespace internal { +struct PbiFilterPrivate; +} + +/// \brief The PbiFilterConcept class provides compile-time enforcement of the +/// required interface for PbiFilter's child filters. +/// +template +struct PbiFilterConcept +{ + BOOST_CONCEPT_USAGE(PbiFilterConcept) + { + // All PBI filters (built-in or client-define) need only provide this + // interface: + // + // bool Accepts(const PbiRawData& index, const size_t row) const; + // + PbiRawData index; + auto result = filter.Accepts(index, 0); + UNUSED(result); + } + +private: + T filter; + // PbiRawData index; +}; + +/// \brief The PbiFilter class provides a mechanism for performing PBI-enabled +/// lookups. +/// +/// The PbiFilter API is designed to be flexible, both built-in and for +/// client-side customization. Built-in filters are provided for common queries, +/// and client code can define and use custom filters as well. More complex +/// filtering rules can be constructed via composition of simpler child filters. +/// +/// Filter objects used as children of PbiFilter need only provide a method that +/// matches this signature: +/// +/// \include code/PbiFilter_Interface.txt +/// +/// This requirement is enforced internally, using the PbiFilterConcept to +/// require a compatible interface without requiring inheritance. This approach +/// allows composition of heterogeneous filter types without worrying about a +/// class hierarchy, pointer ownership across library/client boundaries, etc. +/// +/// Thus a client application can define a custom filter if the built-in filters +/// do not quite meet requirements. This filter may then be used in further +/// PbiFilter composition, or directly to PbiFilterQuery +/// +/// \include code/PbiFilter_CustomFilter.txt +/// +/// As mentioned above, complex filters can be built up using multiple "child" +/// filters. These complex filters are constructed by using either +/// PbiFilter::Union (logical-OR over all direct children) or +/// PbiFilter::Intersection (logical-AND over direct children). +/// +/// \include code/PbiFilter_Composition.txt +/// +class PBBAM_EXPORT PbiFilter +{ +public: + enum CompositionType + { + INTERSECT, + UNION + }; + +public: + /// \name Set Operations + /// \{ + + /// \brief Creates a PbiFilter that acts as an intersection of the input + /// filters. + /// + /// A record must satisfy \b all of this filter's direct "child" filters. + /// + /// \param[in] filters vector of child filters + /// \returns composite filter + /// + static PbiFilter Intersection(std::vector filters); + + /// \brief Creates a PbiFilter that acts as a union of the input filters. + /// + /// A record must satisfy \b any of this filter's direct "child" filters. + /// + /// \param[in] filters vector of child filters + /// \returns composite filter + /// + static PbiFilter Union(std::vector filters); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a PbiFilter from a %DataSet's described filters. + /// + /// A DataSet may contain a Filters element, itself a list of Filter + /// elements. Each Filter element will contain a Properties element, itself + /// a list of Property elements. + /// + /// The Filters hierarchy looks like this (in its XML output): + /// \verbinclude examples/plaintext/PbiFilter_DataSetXmlFilters.txt + /// + /// The resulting PbiFilter represents a union over all Filter elements, + /// with each Filter element requiring an intersection of all of its + /// Property criteria. These Property elements are mapped to built-in PBI + /// filter types. To use the labels in the example XML above, the filter + /// created here is equivalent to: + /// + /// (A && B) || (C && D) + /// + /// If a DataSet lacks any Filters, then an empty PbiFilter will be created + /// - corresponding to the dataset's entire contents. + /// + /// \param[in] dataset maybe containing filters + /// \returns composite filter + /// + static PbiFilter FromDataSet(const DataSet& dataset); + +public: + /// \brief Creates an empty filter. + /// + /// \note An empty filter will result in all records being returned, e.g. + /// for query iteration. + /// + /// \param[in] type composition type. Any additional child filters added to + /// this composite will be treated according to this type. + /// If INTERSECT, a record must match all child filters. If + /// UNION, a record must match any child filter. + /// + PbiFilter(const CompositionType type = INTERSECT); + + /// \brief Creates a composite filter (of INTERSECT type) with an initial + /// child filter. + /// + /// \note T must satisfy PbiFilterConcept + /// + /// \param[in] filter initial child filter + /// + template + PbiFilter(T filter); + + /// \brief Creates composite filter (of INTERSECT type) with a list of + /// initial child filters. + /// + /// \param[in] filters initial child filters + /// + PbiFilter(std::vector filters); + + PbiFilter(const PbiFilter&); + PbiFilter(PbiFilter&&) noexcept = default; + PbiFilter& operator=(const PbiFilter&); + PbiFilter& operator=(PbiFilter&&) noexcept = default; + ~PbiFilter() = default; + + /// \} + +public: + /// \name Composition + /// \{ + + /// \brief Adds a new child filter of type T. + /// + /// \param[in] filter additional child filter. Type T must satisfy + /// PbiFilterConcept. + /// \returns reference to this filter + /// + template + PbiFilter& Add(T filter); + + /// \brief Adds a new child filter. + /// + /// \param[in] filter additional child filter + /// \returns reference to this filter + /// + PbiFilter& Add(PbiFilter filter); + + /// \brief Add child filters. + /// + /// \param[in] filters additional child filters + /// \returns reference to this filter + /// + PbiFilter& Add(std::vector filters); + + /// \returns true if this filter has no child filters. + bool IsEmpty() const; + + /// \returns number of child filters + size_t NumChildren() const; + + /// \returns filter type (intersect, union) + CompositionType Type() const; + + /// \} + +public: + /// \name Lookup + /// \{ + + /// \brief Performs the PBI index lookup, combining child results a + /// composite filter. + /// + /// \param[in] idx PBI (raw) index object + /// \param[in] row record number in %BAM/PBI files + /// + /// \returns true if record at \p row passes this filter criteria, + /// including children (if any) + /// + bool Accepts(const BAM::PbiRawData& idx, const size_t row) const; + + /// \} + +private: + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#include "pbbam/PbiFilterTypes.h" +#include "pbbam/internal/PbiFilter.inl" + +#endif // PBIFILTER_H diff --git a/include/pbbam/PbiFilterQuery.h b/include/pbbam/PbiFilterQuery.h new file mode 100644 index 0000000..3f7c5ee --- /dev/null +++ b/include/pbbam/PbiFilterQuery.h @@ -0,0 +1,78 @@ +// File Description +/// \file PbiFilterQuery.h +/// \brief Defines the PbiFilterQuery class. +// +// Author: Derek Barnett + +#ifndef PBIFILTERQUERY_H +#define PBIFILTERQUERY_H + +#include +#include "pbbam/Config.h" +#include "pbbam/PbiFilter.h" +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The PbiFilter class provides iterable access to a DataSet's %BAM +/// records, limiting results to those matching filter criteria. +/// +/// Example: +/// \include code/PbiFilterQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".pbi" index file. +/// Use BamFile::EnsurePacBioIndexExists before creating the query if one +/// may not be present. +/// +class PBBAM_EXPORT PbiFilterQuery : public internal::IQuery +{ +public: + /// + /// \brief Creates a new PbiFilterQuery, limiting record results to only + /// those matching filter criteria defined in the DataSet XML. + /// + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// PBI files. + /// + PbiFilterQuery(const DataSet& dataset); + + PbiFilterQuery(const DataSet& dataset, const PbiIndexCache& cache); + + /// \brief Creates a new PbiFilterQuery, limiting record results to only + /// those matching filter criteria + /// + /// \param[in] filter filtering criteria + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// PBI files. + /// + PbiFilterQuery(const PbiFilter& filter, const DataSet& dataset); + + PbiFilterQuery(const PbiFilter& filter, const DataSet& dataset, const PbiIndexCache& cache); + + ~PbiFilterQuery() override; + + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + + /// \brief Return number of records that pass the provided filter + /// + uint32_t NumReads() const; + +private: + class PbiFilterQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PBIFILTERQUERY_H diff --git a/include/pbbam/PbiFilterTypes.h b/include/pbbam/PbiFilterTypes.h new file mode 100644 index 0000000..6421f64 --- /dev/null +++ b/include/pbbam/PbiFilterTypes.h @@ -0,0 +1,902 @@ +// File Description +/// \file PbiFilterTypes.h +/// \brief Defines the built-in PBI filters. +// +// Author: Derek Barnett + +#ifndef PBIFILTERTYPES_H +#define PBIFILTERTYPES_H + +#include +#include +#include +#include +#include +#include + +#include "pbbam/Compare.h" +#include "pbbam/PbiFile.h" +#include "pbbam/PbiFilter.h" + +namespace PacBio { +namespace BAM { + +namespace internal { + +/// \internal +/// +/// Provides basic container for value/compare-type pair +/// +template +class FilterBase +{ +public: + T value_; + boost::optional> multiValue_; + Compare::Type cmp_; + +protected: + FilterBase(T value, const Compare::Type cmp); + FilterBase(std::vector values, const Compare::Type cmp = Compare::EQUAL); + + bool CompareHelper(const T& lhs) const; + +private: + bool CompareSingleHelper(const T& lhs) const; + bool CompareMultiHelper(const T& lhs) const; +}; + +/// \internal +/// +/// Dispatches the lookup to BarcodeLookupData +/// +template +class BarcodeDataFilterBase : public FilterBase +{ +public: + bool Accepts(const PbiRawData& idx, const size_t row) const; + +protected: + BarcodeDataFilterBase(T value, const Compare::Type cmp); + BarcodeDataFilterBase(std::vector values, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \internal +/// +/// Dispatches the lookup to BasicLookupData +/// +template +class BasicDataFilterBase : public FilterBase +{ +public: + bool Accepts(const PbiRawData& idx, const size_t row) const; + +protected: + BasicDataFilterBase(T value, const Compare::Type cmp); + BasicDataFilterBase(std::vector values, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \internal +/// +/// Dispatches the lookup to MappedLookupData +/// +template +class MappedDataFilterBase : public FilterBase +{ +public: + bool Accepts(const PbiRawData& idx, const size_t row) const; + +protected: + MappedDataFilterBase(T value, const Compare::Type cmp); + MappedDataFilterBase(std::vector values, const Compare::Type cmp = Compare::EQUAL); +}; + +} // namespace internal + +/// \brief The PbiAlignedEndFilter class provides a PbiFilter-compatible filter +/// on aligned end. +/// +/// Example: \include code/PbiAlignedEndFilter.txt +/// +/// \sa BamRecord::AlignedEnd +/// +class PbiAlignedEndFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on aligned end. + /// + /// \param[in] position value to compare on + /// \param[in] cmp compare type + /// + PbiAlignedEndFilter(const uint32_t position, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiAlignedLengthFilter class provides a PbiFilter-compatible +/// filter on aligned length. +/// +/// Example: \include code/PbiAlignedLengthFilter.txt +/// +/// \sa BamRecord::AlignedEnd, BamRecord::AlignedStart +/// +class PbiAlignedLengthFilter : public internal::FilterBase +{ +public: + /// \brief Creates a filter on aligned length. + /// + /// \param[in] length value to compare on + /// \param[in] cmp compare type + /// + PbiAlignedLengthFilter(const uint32_t length, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; +}; + +/// \brief The PbiAlignedStartFilter class provides a PbiFilter-compatible +/// filter on aligned start. +/// +/// Example: \include code/PbiAlignedStartFilter.txt +/// +/// \sa BamRecord::AlignedStart +/// +class PbiAlignedStartFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on aligned start. + /// + /// \param[in] position value to compare on + /// \param[in] cmp compare type + /// + PbiAlignedStartFilter(const uint32_t position, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiAlignedStrandFilter class provides a PbiFilter-compatible +/// filter on aligned strand. +/// +/// Example: \include code/PbiAlignedStrandFilter.txt +/// +/// \sa BamRecord::AlignedStrand +/// +class PbiAlignedStrandFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a strand filter. + /// + /// \param[in] strand strand value to compare on + /// \param[in] cmp compare type + /// + PbiAlignedStrandFilter(const Strand strand, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiBarcodeFilter class provides a PbiFilter-compatible filter on +/// barcode ID. +/// +/// Any record with this barcode ID (forward or reverse) will pass this filter. +/// +/// Example: \include code/PbiBarcodeFilter.txt +/// +/// \sa BamRecord::BarcodeForward, BamRecord::BarcodeReverse +/// +class PbiBarcodeFilter +{ +public: + /// \brief Creates a single-value barcode filter. + /// + /// \param[in] barcode barcode ID to compare on + /// \param[in] cmp compare type + /// + PbiBarcodeFilter(const int16_t barcode, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' barcode filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly, in either bc_forward or bc_reverse. + /// + /// \param[in] whitelist barcode IDs to compare on + /// + PbiBarcodeFilter(std::vector whitelist, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + PbiFilter compositeFilter_; +}; + +/// \brief The PbiBarcodeForwardFilter class provides a PbiFilter-compatible +/// filter on forward barcode ID. +/// +/// Example: \include code/PbiBarcodeForwardFilter.txt +/// +/// \sa BamRecord::BarcodeForward +/// +class PbiBarcodeForwardFilter + : public internal::BarcodeDataFilterBase +{ +public: + /// \brief Creates a single-value forward barcode filter. + /// + /// \param[in] bcFwdId (forward) barcode ID to compare on + /// \param[in] cmp compare type + /// + PbiBarcodeForwardFilter(const int16_t bcFwdId, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' forward barcode filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly, in bc_forward. + /// + /// \param[in] whitelist barcode IDs to compare on + /// + PbiBarcodeForwardFilter(std::vector whitelist, + const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiBarcodeQualityFilter class provides a PbiFilter-compatible +/// filter on barcode quality. +/// +/// Example: \include code/PbiBarcodeQualityFilter.txt +/// +/// \sa BamRecord::BarcodeQuality +/// +class PbiBarcodeQualityFilter + : public internal::BarcodeDataFilterBase +{ +public: + /// \brief Creates a single-value barcode quality filter. + /// + /// \param[in] bcQuality barcode quality to compare on + /// \param[in] cmp compare type + /// + PbiBarcodeQualityFilter(const uint8_t bcQuality, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiBarcodeReverseFilter class provides a PbiFilter-compatible +/// filter on forward barcode ID. +/// +/// Example: \include code/PbiBarcodeReverseFilter.txt +/// +/// \sa BamRecord::BarcodeReverse +/// +class PbiBarcodeReverseFilter + : public internal::BarcodeDataFilterBase +{ +public: + /// \brief Creates a single-value reverse barcode filter. + /// + /// \param[in] bcRevId (reverse) barcode ID to compare on + /// \param[in] cmp compare type + /// + PbiBarcodeReverseFilter(const int16_t bcRevId, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' reverse barcode filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly, in bc_reverse. + /// + /// \param[in] whitelist barcode IDs to compare on + /// + PbiBarcodeReverseFilter(std::vector whitelist, + const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiBarcodesFilter class provides a PbiFilter-compatible filter on +/// both forward & reverse barcode IDs. +/// +/// A record must match both IDs to pass the filter. +/// +/// Example: \include code/PbiBarcodesFilter.txt +/// +/// \sa BamRecord::Barcodes +/// +class PbiBarcodesFilter +{ +public: + /// \brief Creates a barcodes filter from a std::pair of IDs. + /// + /// pair.first -> BarcodeForward\n + /// pair.second -> BarcodeReverse + /// + /// \param[in] barcodes barcode IDs to compare on + /// \param[in] cmp compare type + /// + PbiBarcodesFilter(const std::pair barcodes, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a barcodes filter from forward & reverse IDs. + /// + /// \param[in] bcForward forward barcode ID to compare on + /// \param[in] bcReverse reverse barcode ID to compare on + /// \param[in] cmp compare type + /// + PbiBarcodesFilter(const int16_t bcForward, const int16_t bcReverse, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + PbiFilter compositeFilter_; +}; + +/// \brief The PbiIdentityFilter class provides a PbiFilter-compatible filter on +/// read identity (% aligned match). +/// +/// Read identity is equivalent to: 1.0 - (nMM + nDel + nIns)/readLength. +/// +/// Example: \include code/PbiIdentityFilter.txt +/// +class PbiIdentityFilter : public internal::FilterBase +{ +public: + /// \brief Creates a read identity filter. + /// + /// \param[in] identity value to compare on + /// \param[in] cmp compare type + /// + PbiIdentityFilter(const float identity, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; +}; + +/// \brief The PbiLocalContextFilter class provides a PbiFilter-compatible +/// filter on local context (adapter, barcode, etc.). +/// +/// The primary Compare::Type operators intended for this filter are: +/// Compare::EQUAL, Compare::NOT_EQUAL, Compare::CONTAINS, and +/// Compare::NOT_CONTAINS. +/// +/// Example: \include code/PbiLocalContextFilter.txt +/// +class PbiLocalContextFilter + : public internal::BasicDataFilterBase +{ +public: + PbiLocalContextFilter(const LocalContextFlags& flags, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiMapQualityFilter class provides a PbiFilter-compatible filter on +/// mapping quality. +/// +/// Example: \include code/PbiMapQualityFilter.txt +/// +/// \sa BamRecord::MapQuality +/// +class PbiMapQualityFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a map quality filter. + /// + /// \param[in] mapQual value to compare on + /// \param[in] cmp compare type + /// + PbiMapQualityFilter(const uint8_t mapQual, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiMovieNameFilter class provides a PbiFilter-compatible filter +/// on movie name. +/// +/// Example: \include code/PbiMovieNameFilter.txt +/// +/// \sa BamRecord::MovieName +/// +class PbiMovieNameFilter +{ +public: + /// \brief Creates a single-value movie name filter. + /// + /// \param[in] movieName movie name to compare on + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match movie name, exactly. + /// + PbiMovieNameFilter(const std::string& movieName, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' movie name filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist movie names to compare on + /// + PbiMovieNameFilter(const std::vector& whitelist, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + PbiFilter compositeFilter_; + Compare::Type cmp_; +}; + +/// \brief The PbiNumDeletedBasesFilter class provides a PbiFilter-compatible +/// filter on the number of deleted bases. +/// +/// Example: \include code/PbiNumDeletedBasesFilter.txt +/// +/// \sa BamRecord::NumDeletedBases +/// +class PbiNumDeletedBasesFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on the number of deleted bases. + /// + /// \param[in] numDeletions value to compare on + /// \param[in] cmp compare type + /// + PbiNumDeletedBasesFilter(const size_t numDeletions, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiNumInsertededBasesFilter class provides a PbiFilter-compatible +/// filter on the number of inserted bases. +/// +/// Example: \include code/PbiNumInsertedBasesFilter.txt +/// +/// \sa BamRecord::NumInsertedBases +/// +class PbiNumInsertedBasesFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on the number of inserted bases. + /// + /// \param[in] numInsertions value to compare on + /// \param[in] cmp compare type + /// + PbiNumInsertedBasesFilter(const size_t numInsertions, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiNumMatchesFilter class provides a PbiFilter-compatible filter +/// on the number of matched bases. +/// +/// Example: \include code/PbiNumMatchesFilter.txt +/// +/// \sa BamRecord::NumMatches +/// +class PbiNumMatchesFilter : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on the number of matched bases. + /// + /// \param[in] numMatchedBases value to compare on + /// \param[in] cmp compare type + /// + PbiNumMatchesFilter(const size_t numMatchedBases, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiNumMismatchesFilter class provides a PbiFilter-compatible +/// filter on the number of mismatched bases. +/// +/// Example: \include code/PbiNumMismatchesFilter.txt +/// +/// \sa BamRecord::NumMismatches +/// +class PbiNumMismatchesFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on the number of mismatched bases. + /// + /// \param[in] numMismatchedBases value to compare on + /// \param[in] cmp compare type + /// + PbiNumMismatchesFilter(const size_t numMismatchedBases, + const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiQueryEndFilter class provides a PbiFilter-compatible filter +/// on query end. +/// +/// Example: \include code/PbiQueryEndFilter.txt +/// +/// \sa BamRecord::QueryEnd +/// +class PbiQueryEndFilter : public internal::BasicDataFilterBase +{ +public: + /// \brief Creates a filter on query end position. + /// + /// \param[in] position value to compare on + /// \param[in] cmp compare type + /// + PbiQueryEndFilter(const int32_t position, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiQueryLengthFilter class provides a PbiFilter-compatible filter +/// on query length. +/// +/// queryLength = (queryEnd - queryStart) +/// +/// Example: \include code/PbiQueryLengthFilter.txt +/// +/// \sa BamRecord::QueryEnd, BamRecord::QueryStart +/// +class PbiQueryLengthFilter : public internal::FilterBase +{ +public: + /// \brief Creates a filter on query length + /// + /// \param[in] length value to compare on + /// \param[in] cmp compare type + /// + PbiQueryLengthFilter(const int32_t length, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; +}; + +/// \brief The PbiQueryNameFilter class provides a PbiFilter-compatible filter +/// on name length. +/// +/// Example: \include code/PbiQueryNameFilter.txt +/// +/// \sa BamRecord::FullName +/// +class PbiQueryNameFilter +{ +public: + /// \brief Creates a single-value query name filter. + /// + /// \param[in] qname query name to compare on + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match query name, exactly. + /// + PbiQueryNameFilter(const std::string& qname, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' query name filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist query names to compare on + /// + PbiQueryNameFilter(const std::vector& whitelist, + const Compare::Type cmp = Compare::EQUAL); + + PbiQueryNameFilter(const PbiQueryNameFilter& other); + ~PbiQueryNameFilter(); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + struct PbiQueryNameFilterPrivate; + std::unique_ptr d_; +}; + +/// \brief The PbiQueryStartFilter class provides a PbiFilter-compatible filter +/// on query start. +/// +/// Example: \include code/PbiQueryStartFilter.txt +/// +/// \sa BamRecord::QueryStart +/// +class PbiQueryStartFilter + : public internal::BasicDataFilterBase +{ +public: + /// \brief Creates a filter on query start position. + /// + /// \param[in] position value to compare on + /// \param[in] cmp compare type + /// + PbiQueryStartFilter(const int32_t position, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiReadAccuracyFilter class provides a PbiFilter-compatible filter +/// on read accuracy. +/// +/// Example: \include code/PbiReadAccuracyFilter.txt +/// +/// \sa BamRecord::ReadAccuracy +/// +class PbiReadAccuracyFilter + : public internal::BasicDataFilterBase +{ +public: + /// \brief Creates a filter on read accuracy. + /// + /// \param[in] accuracy value to compare on + /// \param[in] cmp compare type + /// + PbiReadAccuracyFilter(const Accuracy accuracy, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiReadGroupFilter class provides a PbiFilter-compatible filter +/// on read group. +/// +/// Example: \include code/PbiReadGroupFilter.txt +/// +/// \sa BamRecord::ReadGroup, +/// BamRecord::ReadGroupId, +/// BamRecord::ReadGroupNumericId +/// +class PbiReadGroupFilter +{ +public: + /// \brief Creates a filter on read group (numeric) ID value + /// + /// \param[in] rgId numeric read group ID + /// \param[in] cmp compare type + /// + /// \sa BamRecord::ReadGroupNumericId + /// + PbiReadGroupFilter(const int32_t rgId, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a filter on printable read group ID value + /// + /// \param[in] rgId read group ID string + /// \param[in] cmp compare type + /// + /// \sa BamRecord::ReadGroupId + /// + PbiReadGroupFilter(const std::string& rgId, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a filter on read group (object). + /// + /// \param[in] rg read group object + /// \param[in] cmp compare type + /// + /// \sa BamRecord::ReadGroup + /// + PbiReadGroupFilter(const ReadGroupInfo& rg, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' filter on read group numeric IDs. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist read group IDs to compare on + /// + PbiReadGroupFilter(const std::vector& whitelist, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' filter on read group printable IDs. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist read group ID strings to compare on + /// + PbiReadGroupFilter(const std::vector& whitelist, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' filter using read group objects. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist read group objects to compare on + /// + PbiReadGroupFilter(const std::vector& whitelist, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + // RGID number => barcode(s) filter + std::unordered_map>>> lookup_; + Compare::Type cmp_; +}; + +/// \brief The PbiReferenceEndFilter class provides a PbiFilter-compatible +/// filter on reference end. +/// +/// Example: \include code/PbiReferenceEndFilter.txt +/// +/// \sa BamRecord::ReferenceEnd +/// +class PbiReferenceEndFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on reference end. + /// + /// \param[in] tEnd value to compare on + /// \param[in] cmp compare type + /// + PbiReferenceEndFilter(const uint32_t tEnd, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiReferenceIdFilter class provides a PbiFilter-compatible +/// filter on reference ID. +/// +/// Example: \include code/PbiReferenceIdFilter.txt +/// +/// \sa BamRecord::ReferenceId +/// +class PbiReferenceIdFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a single-value reference ID filter. + /// + /// \param[in] tId reference ID to compare on + /// \param[in] cmp compare type + /// + PbiReferenceIdFilter(const int32_t tId, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' reference ID filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist reference IDs to compare on + /// + PbiReferenceIdFilter(std::vector whitelist, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiReferenceNameFilter class provides a PbiFilter-compatible +/// filter on reference name. +/// +/// Example: \include code/PbiReferenceNameFilter.txt +/// +/// \sa BamRecord::ReferenceName +/// +class PbiReferenceNameFilter +{ +public: + /// \brief Creates a single-value reference name filter. + /// + /// \param[in] rname reference ID to compare on + /// \param[in] cmp compare type + /// + PbiReferenceNameFilter(std::string rname, Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' reference name filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist reference names to compare on + /// + PbiReferenceNameFilter(std::vector whitelist, + const Compare::Type cmp = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + mutable bool initialized_ = false; + mutable PbiFilter subFilter_; + std::string rname_; + boost::optional> rnameWhitelist_; + Compare::Type cmp_; + + // marked const so we can delay setup of filter in Accepts(), once we have + // access to PBI/BAM input. modified values marked mutable accordingly + void Initialize(const PbiRawData& idx) const; +}; + +/// \brief The PbiReferenceStartFilter class provides a PbiFilter-compatible +/// filter on reference start. +/// +/// Example: \include code/PbiReferenceStartFilter.txt +/// +/// \sa BamRecord::ReferenceStart +/// +class PbiReferenceStartFilter + : public internal::MappedDataFilterBase +{ +public: + /// \brief Creates a filter on reference start. + /// + /// \param[in] tStart value to compare on + /// \param[in] cmp compare type + /// + PbiReferenceStartFilter(const uint32_t tStart, const Compare::Type cmp = Compare::EQUAL); +}; + +/// \brief The PbiZmwFilter class provides a PbiFilter-compatible filter on +/// ZMW hole number. +/// +/// Example: \include code/PbiZmwFilter.txt +/// +/// \sa BamRecord::HoleNumber +/// +class PbiZmwFilter : public internal::BasicDataFilterBase +{ +public: + /// \brief Creates a single-value ZMW hole number filter. + /// + /// \param[in] zmw value to compare on + /// \param[in] cmp compare type + /// + PbiZmwFilter(const int32_t zmw, const Compare::Type cmp = Compare::EQUAL); + + /// \brief Creates a 'whitelisted' ZMW hole number filter. + /// + /// \note There is no compare type parameter here, it is always + /// Compare::EQUAL. Records will match at least one value from the + /// whitelist, exactly. + /// + /// \param[in] whitelist ZMW hole numbers to compare on + /// + PbiZmwFilter(std::vector whitelist, const Compare::Type cmp = Compare::EQUAL); +}; + +// ---------------------------------------------- +// NOTE: modulo filtering only enabled for ZMW. +// +// I need to generalize more if we're going to use +// this on more fields. +// ---------------------------------------------- + +enum class FilterHash +{ + UNSIGNED_LONG_CAST, + BOOST_HASH_COMBINE, +}; + +class PbiZmwModuloFilter +{ +public: + PbiZmwModuloFilter(const uint32_t denominator, const uint32_t value, + const FilterHash hashtype = FilterHash::UNSIGNED_LONG_CAST, + const Compare::Type = Compare::EQUAL); + + /// \brief Performs the actual index lookup. + /// + /// Most client code should not need to use this method directly. + /// + bool Accepts(const PbiRawData& idx, const size_t row) const; + +private: + uint32_t denominator_; + uint32_t value_; + FilterHash hash_; + Compare::Type cmp_; +}; + +} // namespace BAM +} // namespace PacBio + +#include "pbbam/internal/PbiFilterTypes.inl" + +#endif // PBIFILTERTYPES_H diff --git a/include/pbbam/PbiIndexedBamReader.h b/include/pbbam/PbiIndexedBamReader.h new file mode 100644 index 0000000..85026f8 --- /dev/null +++ b/include/pbbam/PbiIndexedBamReader.h @@ -0,0 +1,116 @@ +// File Description +/// \file PbiIndexedBamReader.h +/// \brief Defines the PbiIndexedBamReader class. +// +// Author: Derek Barnett + +#ifndef PBIINDEXEDBAMREADER_H +#define PBIINDEXEDBAMREADER_H + +#include +#include "pbbam/BamFile.h" +#include "pbbam/BamReader.h" +#include "pbbam/PbiBasicTypes.h" +#include "pbbam/PbiFilter.h" + +namespace PacBio { +namespace BAM { + +/// \brief The PbiIndexedBamReader class provides read-only iteration over %BAM +/// records, limited to some filtering criteria. +/// +/// The PacBio BAM index (*.pbi) is used to allow random-access operations. +/// +class PBBAM_EXPORT PbiIndexedBamReader : public BamReader +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Constructs %BAM reader, with an initial filter. + /// + /// All reads that satisfy the filter will be available. + /// + /// \param[in] filter PbiFilter or compatible object + /// \param[in] bamFilename input %BAM filename + /// + /// \throws std::runtime_error if either file (*.bam or *.pbi) cannot be + /// read + /// + PbiIndexedBamReader(PbiFilter filter, const std::string& bamFilename); + PbiIndexedBamReader(PbiFilter filter, const std::string& bamFilename, + const std::shared_ptr& index); + + /// \brief Constructs %BAM reader, with an initial filter. + /// + /// All reads that satisfy the filter will be available. + /// + /// \param[in] filter PbiFilter or compatible object + /// \param[in] bamFile input BamFile object + /// + /// \throws std::runtime_error if either file (*.bam or *.pbi) cannot be + /// read + /// + PbiIndexedBamReader(PbiFilter filter, BamFile bamFile); + PbiIndexedBamReader(PbiFilter filter, BamFile bamFile, + const std::shared_ptr& index); + + /// \brief Constructs %BAM reader, with no initial filter. + /// + /// Useful for delaying either specifying the filtering criteria or + /// performing the PBI lookups. + /// + /// \param[in] bamFilename input %BAM filename + /// + /// \throws std::runtime_error if either file (*.bam or *.pbi) cannot be + /// read + /// + PbiIndexedBamReader(const std::string& bamFilename); + PbiIndexedBamReader(const std::string& bamFilename, const std::shared_ptr& index); + + /// \brief Constructs %BAM reader, with no initial filter. + /// + /// Useful for delaying either specifying the filtering criteria or + /// performing the PBI lookups. + /// + /// \param[in] bamFile input BamFile object + /// + /// \throws std::runtime_error if either file (*.bam or *.pbi) cannot be + /// read + /// + PbiIndexedBamReader(BamFile bamFile); + PbiIndexedBamReader(BamFile bamFile, const std::shared_ptr& index); + + ~PbiIndexedBamReader() override; + + /// \} + + /// \name Filtering & Index Data + /// \{ + + /// \returns the current filter active on this reader + const PbiFilter& Filter() const; + + uint32_t NumReads() const; + + /// \brief Sets a new filter on the reader. + /// + /// \param[in] filter + /// \returns reference to this reader + /// + PbiIndexedBamReader& Filter(PbiFilter filter); + + /// \} + +protected: + int ReadRawData(BGZF* bgzf, bam1_t* b) override; + +private: + class PbiIndexedBamReaderPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PBIINDEXEDBAMREADER_H diff --git a/include/pbbam/PbiRawData.h b/include/pbbam/PbiRawData.h new file mode 100644 index 0000000..9f8499b --- /dev/null +++ b/include/pbbam/PbiRawData.h @@ -0,0 +1,494 @@ +// File Description +/// \file PbiRawData.h +/// \brief Defines the classes used for working with raw PBI data. +// +// Author: Derek Barnett + +#ifndef PBIRAWDATA_H +#define PBIRAWDATA_H + +#include +#include +#include +#include +#include +#include "pbbam/Config.h" +#include "pbbam/PbiFile.h" + +namespace PacBio { +namespace BAM { + +class BamFile; +class BamRecord; +class DataSet; + +/// \brief The PbiRawBarcodeData class represents the raw data stored in the +/// "BarcodeData" section of the PBI index. +/// +class PBBAM_EXPORT PbiRawBarcodeData +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty data structure, preallocating space for a known + /// number of records. + PbiRawBarcodeData(uint32_t numReads); + + PbiRawBarcodeData(); + PbiRawBarcodeData(const PbiRawBarcodeData&); + PbiRawBarcodeData(PbiRawBarcodeData&&); + PbiRawBarcodeData& operator=(const PbiRawBarcodeData&); + PbiRawBarcodeData& operator=(PbiRawBarcodeData&&); + ~PbiRawBarcodeData(); + + /// \} + +public: + /// \name Index Construction + /// \{ + + /// \brief Adds a record's barcode data. + /// + /// \param[in] b %BAM record + /// + void AddRecord(const BamRecord& b); + + /// \} + +public: + /// \name Raw Data Containers + /// \{ + + std::vector bcForward_; + std::vector bcReverse_; + std::vector bcQual_; + + /// \} +}; + +/// \brief The PbiRawMappedData class represents the raw data stored in the +/// "MappedData" section of the PBI index. +/// +class PBBAM_EXPORT PbiRawMappedData +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty data structure, preallocating space for a known + /// number of records. + PbiRawMappedData(uint32_t numReads); + + PbiRawMappedData(); + PbiRawMappedData(const PbiRawMappedData&); + PbiRawMappedData(PbiRawMappedData&&); + PbiRawMappedData& operator=(const PbiRawMappedData&); + PbiRawMappedData& operator=(PbiRawMappedData&&); + ~PbiRawMappedData(); + + /// \} + +public: + /// \name Index Construction + /// \{ + + /// \brief Adds a record's mapping data. + /// + /// \param[in] b %BAM record + /// + void AddRecord(const BamRecord& b); + + /// \} + +public: + /// \name Index Data Query + /// \{ + + /// \brief Calculates the number of deleted bases for a particular record. + /// + /// Convenvience method. Equivalent to: + /// \code{.cpp} + /// NumDeletedAndInsertedBasesAt(i).first; + /// \endcode + /// + /// \param[in] recordIndex i-th record + /// \returns number of deleted bases + /// + uint32_t NumDeletedBasesAt(size_t recordIndex) const; + + /// \brief Calculates the number of inserted bases for a particular record. + /// + /// Convenvience method. Equivalent to: + /// \code{.cpp} + /// NumDeletedAndInsertedBasesAt(i).second; + /// \endcode + /// + /// \param[in] recordIndex i-th record + /// \returns number of inserted bases + /// + uint32_t NumInsertedBasesAt(size_t recordIndex) const; + + /// \brief Calculates the number of deleted & inserted bases for a + /// particular record. + /// + /// \param[in] recordIndex i-th record in the data set + /// \returns a pair consisting of (numDeletions,numInsertions) + /// + std::pair NumDeletedAndInsertedBasesAt(size_t recordIndex) const; + + /// \} + +public: + /// \name Raw Data Containers + /// \{ + + std::vector tId_; + std::vector tStart_; + std::vector tEnd_; + std::vector aStart_; + std::vector aEnd_; + std::vector revStrand_; + std::vector nM_; + std::vector nMM_; + std::vector mapQV_; + + /// \} +}; + +/// \brief The PbiReferenceEntryClass represents a single reference in the PBI +/// CoordinateSorted section. +/// +/// A reference entry consists of an associated reference ID (tId), as well as +/// start and end indices into the %BAM or PBI. +/// +/// \note Rows are given in the interval [start, end). +/// +class PBBAM_EXPORT PbiReferenceEntry +{ +public: + using ID = uint32_t; + using Row = uint32_t; + +public: + static const ID UNMAPPED_ID; + static const Row UNSET_ROW; + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a default entry. + /// + /// - default ID: PbiReferenceEntry::UNMAPPED_ID \n + /// - default rows: PbiReferenceEntry::UNSET_ROW + /// + PbiReferenceEntry(); + + /// \brief Creates a reference entry, with no rows set. + /// + /// - default rows: PbiReferenceEntry::UNSET_ROW + /// + PbiReferenceEntry(ID id); + + /// \brief Creates a reference entry, with rows set. + /// + PbiReferenceEntry(ID id, Row beginRow, Row endRow); + + PbiReferenceEntry(const PbiReferenceEntry&); + PbiReferenceEntry(PbiReferenceEntry&&); + PbiReferenceEntry& operator=(const PbiReferenceEntry&); + PbiReferenceEntry& operator=(PbiReferenceEntry&&); + ~PbiReferenceEntry(); + + bool operator==(const PbiReferenceEntry& other) const; + + /// \} + +public: + /// \name Reference Data Members + /// \{ + + ID tId_; + Row beginRow_; + Row endRow_; + + /// \} +}; + +/// \brief The PbiRawReferenceData class represents the raw data stored in the +/// "CoordinateSortedData" section of the PBI index. +/// +class PBBAM_EXPORT PbiRawReferenceData +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty data structure, preallocating space for a + /// number of references. + /// + /// This constructor is recommended as this is the safest way to ensure that + /// references without observed mappings are included in the final output. + /// + PbiRawReferenceData(uint32_t numRefs); + + PbiRawReferenceData(); + PbiRawReferenceData(const PbiRawReferenceData&); + PbiRawReferenceData(PbiRawReferenceData&&); + PbiRawReferenceData& operator=(const PbiRawReferenceData&); + PbiRawReferenceData& operator=(PbiRawReferenceData&&); + ~PbiRawReferenceData(); + + /// \} + +public: + /// \name Raw Data Containers + /// \{ + + std::vector entries_; + + /// \} +}; + +/// \brief The PbiRawBasicData class represents the raw data stored in the +/// "BasicData" section of the PBI index. +/// +class PBBAM_EXPORT PbiRawBasicData +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty data structure, preallocating space for a known + /// number of records. + PbiRawBasicData(uint32_t numReads); + + PbiRawBasicData(); + PbiRawBasicData(const PbiRawBasicData&); + PbiRawBasicData(PbiRawBasicData&&); + PbiRawBasicData& operator=(const PbiRawBasicData&); + PbiRawBasicData& operator=(PbiRawBasicData&&); + ~PbiRawBasicData(); + + /// \} + +public: + /// \name Index Construction + /// \{ + + /// \brief Adds a record's mapping data. + /// + /// \param[in] b %BAM record + /// \param[in] offset \b virtual file offset where record begins + /// + void AddRecord(const BamRecord& b, int64_t offset); + + /// \} + +public: + /// \name Raw Data Containers + /// \{ + + std::vector rgId_; + std::vector qStart_; + std::vector qEnd_; + std::vector holeNumber_; + std::vector readQual_; + std::vector ctxtFlag_; + std::vector fileOffset_; + std::vector fileNumber_; + + /// \} +}; + +/// \brief The PbiRawData class provides an representation of raw PBI index +/// data, used mostly for construction or I/O. +/// +/// The PbiRawData class itself provides access to a few high-level attributes +/// (e.g. version, number of records, etc.). The actual index data is stored +/// in its member components: +/// PbiRawBasicData, +/// PbiRawMappedData, +/// PbiRawReferenceData, & +/// PbiRawBarcodeData . +/// +class PBBAM_EXPORT PbiRawData +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Loads raw PBI data from a file. + /// + /// \param[in] pbiFilename ".pbi" filename + /// + /// \throws std::runtime_error if file contents cannot be loaded properly + /// + PbiRawData(std::string pbiFilename); + + /// \brief Loads a raw, aggregate PBI data from a dataset + /// + /// This constructor creates a raw index object that contains an aggregation + /// of index data across the dataset. + /// + /// \note ReferenceData (the per-reference table for coordinate-sorted data) + /// is not currently available for the index aggregate. All other + /// per-record data sections will be present. + /// + /// \param[in] dataset DataSet object + /// + /// \throws std::runtime_error if file(s) contents cannot be loaded properly + /// + explicit PbiRawData(const DataSet& dataset); + + PbiRawData(); + PbiRawData(const PbiRawData&); + PbiRawData(PbiRawData&&); + PbiRawData& operator=(const PbiRawData&); + PbiRawData& operator=(PbiRawData&&); + ~PbiRawData(); + + /// \} + +public: + /// \name PBI General Attributes + /// \{ + + /// \returns true if index has BarcodeData section + bool HasBarcodeData() const; + + /// \returns true if index has MappedData section + bool HasMappedData() const; + + /// \returns true if index has ReferenceData section + bool HasReferenceData() const; + + /// \returns true if index has \b section + /// \param[in] section PbiFile::Section identifier + /// + bool HasSection(const PbiFile::Section section) const; + + /// \returns index filename ("*.pbi") + /// + /// \note Returns an empty string if the underlying data was calculated in + /// code or aggregated from a DataSet, rather than loaded from a + /// single PBI file. + /// + std::string Filename() const; + + /// \returns enum flags representing the file sections present + PbiFile::Sections FileSections() const; + + /// \returns the number of records in the PBI(s) + uint32_t NumReads() const; + + /// \returns the PBI file's version + PbiFile::VersionEnum Version() const; + + /// \} + +public: + /// \name Raw Data Components + /// \{ + + /// \returns const reference to BarcodeData lookup structure + /// + /// May be empty, check result of HasBarcodeData. + /// + const PbiRawBarcodeData& BarcodeData() const; + + /// \returns const reference to BasicData lookup structure + const PbiRawBasicData& BasicData() const; + + /// \returns const reference to MappedData lookup structure + /// + /// May be empty, check result of HasMappedData. + /// + const PbiRawMappedData& MappedData() const; + + /// \returns const reference to reference data lookup structure + /// + /// May be empty, check result of HasReferenceData. + /// + const PbiRawReferenceData& ReferenceData() const; + + /// \} + +public: + /// \name PBI General Attributes + /// \{ + + /// \brief Sets the file section flags. + /// + /// \param[in] sections section flags + /// \returns reference to this index + /// + PbiRawData& FileSections(PbiFile::Sections sections); + + /// \brief Sets the number of indexed records. + /// + /// \param[in] num number of records + /// \returns reference to this index + /// + PbiRawData& NumReads(uint32_t num); + + /// \brief Sets PBI file version. + /// + /// \param[in] version file version + /// \returns reference to this index + /// + PbiRawData& Version(PbiFile::VersionEnum version); + + /// \} + +public: + /// \name Raw Data Components + /// \{ + + /// \returns reference to BarcodeData lookup structure + /// + /// May be empty, check result of HasBarcodeData. + /// + PbiRawBarcodeData& BarcodeData(); + + /// \returns reference to BasicData lookup structure + PbiRawBasicData& BasicData(); + + /// \returns reference to MappedData lookup structure + /// + /// May be empty, check result of HasMappedData. + /// + PbiRawMappedData& MappedData(); + + /// \returns reference to reference data lookup structure + /// + /// May be empty, check result of HasReferenceData. + /// + PbiRawReferenceData& ReferenceData(); + + /// \} + +private: + std::string filename_; + PbiFile::VersionEnum version_ = PbiFile::CurrentVersion; + PbiFile::Sections sections_ = PbiFile::ALL; + uint32_t numReads_ = 0; + PbiRawBarcodeData barcodeData_; + PbiRawMappedData mappedData_; + PbiRawReferenceData referenceData_; + PbiRawBasicData basicData_; +}; + +// PBI index caching + +using PbiIndexCache = std::shared_ptr>>; + +PbiIndexCache MakePbiIndexCache(const DataSet& dataset); +PbiIndexCache MakePbiIndexCache(const std::vector&); +PbiIndexCache MakePbiIndexCache(const BamFile& bamFile); + +} // 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..15cb7f5 --- /dev/null +++ b/include/pbbam/Position.h @@ -0,0 +1,32 @@ +// File Description +/// \file Position.h +/// \brief Defines the Position typedef. +// +// Author: Derek Barnett + +#ifndef POSITION_H +#define POSITION_H + +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief This type is used to refer to genomic positions. +/// \typedef typedef int32_t PacBio::BAM::Position +/// +/// We use a signed integer because SAM/BAM uses the -1 value to indicate +/// unknown or unmapped positions. +/// +using Position = int32_t; + +/// \brief This constant is widely used as a "missing" or "invalid" position +/// marker. +/// +static const Position UnmappedPosition{-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..77df8da --- /dev/null +++ b/include/pbbam/ProgramInfo.h @@ -0,0 +1,182 @@ +// File Description +/// \file ProgramInfo.h +/// \brief Defines the ProgramInfo class. +// +// Author: Derek Barnett + +#ifndef PROGRAMINFO_H +#define PROGRAMINFO_H + +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The ProgramInfo class represents a program entry (\@PG) in the SAM +/// header. +/// +class PBBAM_EXPORT ProgramInfo +{ +public: + /// \name Conversion & Validation + /// + + /// \brief Creates a ProgramInfo object from SAM-formatted text. + /// + /// \param[in] sam SAM-formatted text + /// \returns program info object + /// + static ProgramInfo FromSam(const std::string& sam); + + /// \brief Converts a ProgramInfo object to its SAM-formatted text. + /// + /// \param[in] prog input ProgramInfo object + /// \returns SAM-formatted text (no trailing newline) + /// + static std::string ToSam(const ProgramInfo& prog); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a program info object with an ID. + /// + /// \param[in] id program ID (\@PG:ID) + /// + ProgramInfo(std::string id); + + ProgramInfo(); + ProgramInfo(const ProgramInfo&); + ProgramInfo(ProgramInfo&&); + ProgramInfo& operator=(const ProgramInfo&); + ProgramInfo& operator=(ProgramInfo&&); + ~ProgramInfo(); + + /// \} + +public: + /// \name Conversion & Validation + /// + + /// \returns true if program info is valid + /// + /// Currently this checks to see that ProgramInfo::Id does not contain an + /// empty string. + /// + bool IsValid() const; + + /// \brief Converts this object to its SAM-formatted text. + /// + /// \returns SAM-formatted text (no trailing newline) + /// + std::string ToSam() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \returns string value of \@PG:CL + std::string CommandLine() const; + + /// \returns any non-standard tags added to the \@PG entry + /// + /// Result map consists of {tagName => value}. + /// + std::map CustomTags() const; + + /// \returns string value of \@PG:DS + std::string Description() const; + + /// \returns string value of \@PG:ID + std::string Id() const; + + /// \returns string value of \@PG:PN + std::string Name() const; + + /// \returns string value of \@PG:PP + std::string PreviousProgramId() const; + + /// \returns string value of \@PG:VN + std::string Version() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \brief Sets the value for \@PG:CL + /// + /// \param[in] cmd new value + /// \returns reference to this object + /// + ProgramInfo& CommandLine(std::string cmd); + + /// \brief Sets a new collection of non-standard tags. + /// + /// Custom tag map entries should consist of {tagName => value}. + /// + /// \param[in] custom new tags + /// \returns reference to this object + /// + ProgramInfo& CustomTags(std::map custom); + + /// \brief Sets the value for \@PG:DS + /// + /// \param[in] description new value + /// \returns reference to this object + /// + ProgramInfo& Description(std::string description); + + /// \brief Sets the value for \@PG:ID + /// + /// \param[in] id new value + /// \returns reference to this object + /// + ProgramInfo& Id(std::string id); + + /// \brief Sets the value for \@PG:PN + /// + /// \param[in] name new value + /// \returns reference to this object + /// + ProgramInfo& Name(std::string name); + + /// \brief Sets the value for \@PG:PP + /// + /// \param[in] id new value + /// \returns reference to this object + /// + ProgramInfo& PreviousProgramId(std::string id); + + /// \brief Sets the value for \@PG:VN + /// + /// \param[in] version new value + /// \returns reference to this object + /// + ProgramInfo& Version(std::string version); + + /// \} + +private: + std::string commandLine_; // CL: + std::string description_; // DS: + std::string id_; // ID: * must be unique for valid SAM * + std::string name_; // PN: + std::string previousProgramId_; // PP: + std::string version_; // VN: + + // custom attributes + std::map custom_; // tag => value +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PROGRAMINFO_H diff --git a/include/pbbam/PulseBehavior.h b/include/pbbam/PulseBehavior.h new file mode 100644 index 0000000..494b7cc --- /dev/null +++ b/include/pbbam/PulseBehavior.h @@ -0,0 +1,25 @@ +// File Description +/// \file PulseBehavior.h +/// \brief Defines the PulseBehavior enum. +// +// Author: Derek Barnett + +#ifndef PULSEBEHAVIOR_H +#define PULSEBEHAVIOR_H + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the pulsecall modes supported by BamRecord tag +/// accessors. +/// +enum class PulseBehavior +{ + BASECALLS_ONLY, ///< "Squashed" pulses not included, only basecalls. + ALL ///< All pulses included. +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PULSEBEHAVIOR_H diff --git a/include/pbbam/PulseExclusionReason.h b/include/pbbam/PulseExclusionReason.h new file mode 100644 index 0000000..c6c2c9e --- /dev/null +++ b/include/pbbam/PulseExclusionReason.h @@ -0,0 +1,28 @@ +// File Description +/// \file PulseExclusionReason.h +/// \brief Defines the PulseExclusionReason enum. +// +// Author: Derek Barnett + +#ifndef PULSE_EXCLUSION_REASON_H +#define PULSE_EXCLUSION_REASON_H + +#include + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the possible pulse exclusion reasons +/// +enum class PulseExclusionReason : uint8_t +{ + BASE = 0, + SHORT_PULSE, + BURST, + PAUSE +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PULSE_EXCLUSION_REASON_H diff --git a/include/pbbam/QNameQuery.h b/include/pbbam/QNameQuery.h new file mode 100644 index 0000000..3324949 --- /dev/null +++ b/include/pbbam/QNameQuery.h @@ -0,0 +1,57 @@ +// File Description +/// \file QNameQuery.h +/// \brief Defines the QNameQuery class. +// +// Author: Derek Barnett + +#ifndef QNAMEQUERY_H +#define QNAMEQUERY_H + +#include +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The QNameQuery class provides iterable access to a DataSet's records, +/// with each iteration of the query returning a contiguous block of +/// records that share a name. +/// +/// There is no random-access here. It is simply a sequential read-through, +/// grouping contiguous results that share a BamRecord::FullName. +/// +/// \note The name is not ideal - but for legacy reasons, it will remain as-is +/// for now. It will likely become something more explicit, like +/// "SequentialQNameGroupQuery", so that the name "QNameQuery" will be +/// available for a built-in query on a QNAME filter (or whitelist). This +/// will make it more consistent with other queries (ReadAccuracyQuery, +/// SubreadLengthQuery, ZmwQuery, etc). +/// +class PBBAM_EXPORT QNameQuery : public internal::IGroupQuery +{ +public: + /// \brief Creates a new QNameQuery. + /// + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM files + /// + QNameQuery(const DataSet& dataset); + ~QNameQuery() override; + + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(std::vector& records) override; + +private: + class QNameQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // QNAMEQUERY_H diff --git a/include/pbbam/QualityValue.h b/include/pbbam/QualityValue.h new file mode 100644 index 0000000..376b5b5 --- /dev/null +++ b/include/pbbam/QualityValue.h @@ -0,0 +1,82 @@ +// File Description +/// \file QualityValue.h +/// \brief Defines the QualityValue class. +// +// Author: Derek Barnett + +#ifndef QUALITYVALUE_H +#define QUALITYVALUE_H + +#include +#include +#include +#include "pbbam/Config.h" + +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 QualityValue::FromFastq for constructing entries from FASTQ encoding +/// characters. Otherwise, the resulting QualityValue will be interpreted using +/// the character's numeric value (ignoring the FASTQ offset of 33). +/// +class PBBAM_EXPORT QualityValue +{ +public: + static const uint8_t MAX; + +public: + /// \name Conversion Methods + /// \{ + + /// \brief Creates a QualityValue from a FASTQ-encoding character. + /// + /// \param[in] c FASTQ character + /// \returns quality value representing (c - 33) + /// + static QualityValue FromFastq(const char c); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a QualityValue with specified value. + /// + /// \param[in] value quality value + /// + QualityValue(const uint8_t value = 0); + + QualityValue(const QualityValue&); + QualityValue(QualityValue&&); + QualityValue& operator=(const QualityValue&); + QualityValue& operator=(QualityValue&&); + ~QualityValue(); + + /// \} + +public: + /// \name Conversion Methods + /// \{ + + /// \returns the FASTQ-encoding char for this QualityValue + char Fastq() const; + + /// \returns the integer value of this QualityValue + operator uint8_t() const; + + /// \} + +private: + uint8_t value_; +}; + +} // 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..7d7c1fe --- /dev/null +++ b/include/pbbam/QualityValues.h @@ -0,0 +1,132 @@ +// File Description +/// \file QualityValues.h +/// \brief Defines the QualityValues class. +// +// Author: Derek Barnett + +#ifndef QUALITYVALUES_H +#define QUALITYVALUES_H + +#include +#include +#include +#include "pbbam/QualityValue.h" + +namespace PacBio { +namespace BAM { + +/// \brief The QualityValues class represents a sequence of FASTQ-compatible +/// quality values. See QualityValue documentation for more details. +/// +class PBBAM_EXPORT QualityValues : public std::vector +{ +public: + /// \brief Creates a QualityValues object from a FASTQ-encoded string. + /// + /// \param[in] fastq FASTQ-encoded string + /// \returns corresponding QualityValues object + /// + static QualityValues FromFastq(const std::string& fastq); + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Default constructor - creates an empty QualityValues object. + + /// \brief Creates a QualityValues object from a FASTQ-encoded string. + /// + /// \param[in] fastqString FASTQ-encoded string + /// + explicit QualityValues(const std::string& fastqString); + + /// \brief Creates a QualityValues object from a vector of QualityValue + /// elements. + /// + /// \param[in] quals vector of QualityValue elements + /// + QualityValues(std::vector quals); + + /// \brief Creates a QualityValues object from a vector of (numeric) quality + /// values. + /// + /// \param[in] quals vector of quality value numbers + /// + explicit QualityValues(const std::vector& quals); + + /// \brief Creates a QualityValues object from the contents of the range: + /// [first, last) + /// + /// \param[in] first input iterator, whose element is a numeric quality + /// \param[in] last input iterator, whose element is a numeric quality + /// + QualityValues(const std::vector::const_iterator first, + const std::vector::const_iterator last); + + /// \brief Creates a QualityValues object from the contents of the range: + /// [first, last) + /// + /// \param[in] first input iterator, whose element is a QualityValue + /// \param[in] last input iterator, whose element is a QualityValue + /// + QualityValues(const QualityValues::const_iterator first, + const QualityValues::const_iterator last); + + QualityValues(); + QualityValues(const QualityValues&); + QualityValues(QualityValues&&); + QualityValues& operator=(const QualityValues&); + QualityValues& operator=(QualityValues&&); + ~QualityValues(); + + QualityValues& operator=(std::vector quals); + + /// \} + +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::const_iterator cbegin() const; + + /// \returns a const_iterator to the element following the last element + std::vector::const_iterator cend() const; + + /// \returns a const_iterator to the beginning of the sequence + std::vector::const_iterator begin() const; + + /// \returns a const_iterator to the element following the last element + std::vector::const_iterator end() const; + + /// \returns an iterator to the beginning of the sequence + std::vector::iterator begin(); + + /// \returns an iterator to the element following the last element + std::vector::iterator end(); + + /// \} + +public: + /// \name Conversion Methods + /// \{ + + /// \returns the FASTQ-encoded string for this sequence of quality values + std::string Fastq() const; + + /// \} +}; + +} // namespace BAM +} // namespace PacBio + +#endif // QUALITYVALUES_H diff --git a/include/pbbam/ReadAccuracyQuery.h b/include/pbbam/ReadAccuracyQuery.h new file mode 100644 index 0000000..c28935e --- /dev/null +++ b/include/pbbam/ReadAccuracyQuery.h @@ -0,0 +1,67 @@ +// File Description +/// \file ReadAccuracyQuery.h +/// \brief Defines the ReadAccuracyQuery class. +// +// Author: Derek Barnett + +#ifndef READACCURACYQUERY_H +#define READACCURACYQUERY_H + +#include +#include "pbbam/Accuracy.h" +#include "pbbam/Compare.h" +#include "pbbam/Config.h" +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The ReadAccuracyQuery class provides iterable access to a DataSet's +/// %BAM records, limiting results to those matching a read accuracy +/// criterion. +/// +/// Example: +/// \include code/ReadAccuracyQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".pbi" index file. +/// Use BamFile::EnsurePacBioIndexExists before creating the query if one +/// may not be present. +/// +class PBBAM_EXPORT ReadAccuracyQuery : public internal::IQuery +{ +public: + /// \brief Creates a new ReadAccuracyQuery, limiting record results to only + /// those matching a read accuracy criterion. + /// + /// \param[in] accuracy read accuracy value + /// \param[in] compareType compare operator + /// \param[in] dataset input data source(s) + /// + /// \sa BamRecord::ReadAccuracy + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or PBI + /// files. + /// + ReadAccuracyQuery(const Accuracy accuracy, const Compare::Type compareType, + const DataSet& dataset); + + ~ReadAccuracyQuery() override; + + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + + uint32_t NumReads() const; + +private: + class ReadAccuracyQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // READACCURACYQUERY_H diff --git a/include/pbbam/ReadGroupInfo.h b/include/pbbam/ReadGroupInfo.h new file mode 100644 index 0000000..8a8d18b --- /dev/null +++ b/include/pbbam/ReadGroupInfo.h @@ -0,0 +1,715 @@ +// File Description +/// \file ReadGroupInfo.h +/// \brief Defines the ReadGroupInfo class. +// +// Author: Derek Barnett + +#ifndef READGROUPINFO_H +#define READGROUPINFO_H + +#include +#include +#include +#include +#include + +#include + +#include "pbbam/Config.h" +#include "pbbam/exception/InvalidSequencingChemistryException.h" + +namespace PacBio { +namespace BAM { + +/// \brief This enum describes the base features that may be present in a read +/// group's records. +/// +/// This information is stored in its description (\@RG:DS). +/// +enum class BaseFeature +{ + DELETION_QV, + DELETION_TAG, + INSERTION_QV, + MERGE_QV, + SUBSTITUTION_QV, + SUBSTITUTION_TAG, + IPD, + PULSE_WIDTH, + PKMID, + PKMEAN, + PKMID2, + PKMEAN2, + LABEL, + LABEL_QV, + ALT_LABEL, + ALT_LABEL_QV, + PULSE_MERGE_QV, + PULSE_CALL, + PRE_PULSE_FRAMES, + PULSE_CALL_WIDTH, + START_FRAME, + PULSE_EXCLUSION +}; + +/// \brief This enum describes the encoding types used for frame data within a +/// read group's records. +/// +/// This information is stored in its description (\@RG:DS). +/// +enum class FrameCodec +{ + RAW, + V1 +}; + +/// \brief This enum describes the experimental design of the barcodes within a +/// read group's records. +/// +/// This information is stored in its description (\@RG:DS). +/// +enum class BarcodeModeType +{ + NONE, + SYMMETRIC, + ASYMMETRIC, + TAILED +}; + +/// \brief This enum describes the type of value encoded by barcode quality, +/// within a read group's records. +/// +/// This information is stored in its description (\@RG:DS). +/// +enum class BarcodeQualityType +{ + NONE, + SCORE, + PROBABILITY +}; + +/// \brief This enum describes the instrument type / platform model, +/// within a read group's records. +/// +/// This information is stored in its description (\@RG:PM). +/// +enum class PlatformModelType +{ + ASTRO, + RS, + SEQUEL, + SEQUELII +}; + +/// \brief The ReadGroupInfo class represents a read group entry (\@RG) in the +/// SAM header. +/// +class PBBAM_EXPORT ReadGroupInfo +{ +public: + /// \name Conversion & Validation + /// + + /// \brief Creates a ReadGroupInfo object from SAM-formatted text. + /// + /// \param[in] sam SAM-formatted text + /// \returns read group info object + /// + static ReadGroupInfo FromSam(const std::string& sam); + + /// \brief Converts a ReadGroupInfo object to its SAM-formatted text. + /// + /// \param[in] rg input ReadGroupInfo object + /// \returns SAM-formatted text (no trailing newline) + /// + static std::string ToSam(const ReadGroupInfo& rg); + + /// + /// \brief GetBaseId + /// + /// \param id + /// \return the hash portion only of a read group ID, with (optional) + /// barcode labels removed) + /// + /// \sa ReadGroupInfo::BaseId + /// + static std::string GetBaseId(const std::string& id); + + /// \brief Converts a read group ID (string) to its numeric value. + /// + /// \note Accepts the optional barcode-labeled IDs. These will be stripped + /// and number calculated from the base value. + /// + /// \param[in] rgId read group ID string + /// \returns numeric value of ID + /// + static int32_t IdToInt(const std::string& rgId); + + /// \brief Converts a read group ID number to its string representation. + /// + /// \param[in] id read group ID number + /// \returns hexadecimal string representation of ID + /// + static std::string IntToId(const int32_t id); + + /// \returns sequencing chemistry from (bindingKig, sequencingKit, + /// basecallerVersion) + /// + static std::string SequencingChemistryFromTriple(const std::string& bindingKit, + const std::string& sequencingKit, + const std::string& basecallerVersion); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates an empty read group of UNKNOWN read type. + ReadGroupInfo(); + + /// \brief Creates a read group info object with an ID. + /// + /// \note \p id can be a "standard" ID or contain barcode labels. + /// + /// \param[in] id string representation of read group ID + /// + ReadGroupInfo(std::string id); + + /// \brief Creates a read group info object from a movie name & read type. + /// + /// \param[in] movieName sequencing movie name + /// \param[in] readType string version of record type + /// + /// \sa RecordType + /// + ReadGroupInfo(std::string movieName, std::string readType); + + /// \brief Creates a read group info object from a movie name, read type, + /// and platform model. + /// + /// \param[in] movieName sequencing movie name + /// \param[in] readType string version of record type + /// \param[in] platform platform model type + /// + /// \sa RecordType + /// + ReadGroupInfo(std::string movieName, std::string readType, PlatformModelType platform); + + /// \brief Creates a read group info object with an ID. + /// + /// \param[in] baseId string representation of numeric read group ID + /// \param[in] barcodes barcode pair for this read group + /// + ReadGroupInfo(std::string baseId, std::pair barcodes); + + /// \brief Creates a read group info object from a movie name & read type. + /// + /// \param[in] movieName sequencing movie name + /// \param[in] readType string version of record type + /// \param[in] barcodes barcode pair for this read group + /// + /// \sa RecordType + /// + ReadGroupInfo(std::string movieName, std::string readType, + std::pair barcodes); + + /// \brief Creates a read group info object from a movie name, read type, + /// and platform model. + /// + /// \param[in] movieName sequencing movie name + /// \param[in] readType string version of record type + /// \param[in] platform platform model type + /// \param[in] barcodes barcode pair for this read group + /// + /// \sa RecordType + /// + ReadGroupInfo(std::string movieName, std::string readType, PlatformModelType platform, + std::pair barcodes); + + ReadGroupInfo(const ReadGroupInfo&); + ReadGroupInfo(ReadGroupInfo&&); + ReadGroupInfo& operator=(const ReadGroupInfo&); + ReadGroupInfo& operator=(ReadGroupInfo&&); + ~ReadGroupInfo(); + + /// \} + +public: + /// \name Comparison Operators + /// \{ + + bool operator==(const ReadGroupInfo& other) const; + + /// \} + +public: + /// \name Conversion & Validation + /// \{ + + /// \returns true if read group info is valid + /// + /// Currently this checks to see that ReadGroupInfo::Id does not contain an + /// empty string. + /// + bool IsValid() const; + + /// \brief Converts this object to its SAM-formatted text. + /// + /// \returns SAM-formatted text (no trailing newline) + /// + std::string ToSam() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \returns the number of barcode sequences in BarcodeFile, as stored in + /// the description tag (\@RG:DS) + /// + /// \throws std::runtime_error if barcode data not set. + /// Check HasBarcodeData if this data may be absent. + /// + size_t BarcodeCount() const; + + /// \returns name of FASTA file containing barcode sequences, as stored in + /// the description tag (\@RG:DS) + /// + /// \throws std::runtime_error if barcode data not set. + /// Check HasBarcodeData if this data may be absent. + /// + std::string BarcodeFile() const; + + /// \returns MD5 hash of the contents of BarcodeFile, as stored in the + /// description tag (\@RG:DS) + /// + /// \throws std::runtime_error if barcode data not set. + /// Check HasBarcodeData if this data may be absent. + /// + std::string BarcodeHash() const; + + /// \returns experimental design type of barcodes, as stored in the + /// description tag (\@RG:DS) + /// + /// \throws std::runtime_error if barcode data not set. + /// Check HasBarcodeData if this data may be absent. + /// + BarcodeModeType BarcodeMode() const; + + /// \returns type of value encoded by the 'bq' tag, as stored in the + /// description tag (\@RG:DS) + /// + /// \throws std::runtime_error if barcode data is not set. + /// Check HasBarcodeData if this data may be absent. + /// + BarcodeQualityType BarcodeQuality() const; + + /// \returns barcode pair stored in the read group ID (\@RG:ID) + /// + /// \note This does **NOT** refer to any data in the description (DS) tag. + /// + boost::optional> Barcodes() const; + + /// \returns forward barcode label stored in the read group ID (\@RG:ID) + /// + /// \note This does **NOT** refer to any data in the description (DS) tag. + /// + boost::optional BarcodeForward() const; + + /// \returns reverse barcode label stored in the read group ID (\@RG:ID) + /// + /// \note This does **NOT** refer to any data in the description (DS) tag. + /// + boost::optional BarcodeReverse() const; + + /// \returns basecaller version number (e.g. "2.1") + std::string BasecallerVersion() const; + + /// \returns tag name in use for the specified for base feature + std::string BaseFeatureTag(BaseFeature feature) const; + + /// \returns the hash portion only of a read group ID, with (optional) + /// barcode labels removed) + /// + /// For most read groups (without barcode labels), this will be the same as + /// ID(). However, for those read groups with barcoded-labels, this method + /// will return the ID without those labels. + /// + /// Id() should be preferred over this method in most cases. This is + /// intended for use with hash-string or integers directly. + /// + /// For "ID:12345678": + /// rg.Id() -> "12345678" + /// rg.BaseId() -> "12345678" + /// + /// For "ID:12345678/0--0": + /// rg.Id() -> "12345678/0--0"; + /// rg.BaseId -> "12345678" + /// + /// \sa Id + /// + std::string BaseId() const; + + /// \returns binding kit part number (e.g. "100236500") + std::string BindingKit() const; + + /// \returns true if reads are classified as spike-in controls + bool Control() const; + + /// \returns any non-standard tags added to the \@PG entry + /// + /// Result map consists of {tagName => value}. + /// + std::map CustomTags() const; + + /// \returns string value of \@RG:DT + std::string Date() const; + + /// \returns string value of \@RG:FO + std::string FlowOrder() const; + + /// \returns frame rate in Hz + std::string FrameRateHz() const; + + /// \returns true if the read group description (\@RG:DS) contains barcode data + /// + /// \note This does **NOT** refer to the optional barcode labels. + /// + bool HasBarcodeData() const; + + /// \returns true if read group has an entry for the specified base feature + bool HasBaseFeature(BaseFeature feature) const; + + /// \returns full string value of \@RG:ID, whether optional barcode labels + /// are present + /// + /// This method should be perferred over BaseId() in most cases, + /// e.g. mapping between header info. + /// + /// For "ID:12345678": + /// rg.Id() -> "12345678" + /// rg.BaseId() -> "12345678" + /// + /// For "ID:12345678/0--0": + /// rg.Id() -> "12345678/0--0"; + /// rg.BaseId -> "12345678" + /// + /// \sa BaseId + /// + std::string Id() const; + + /// \returns codec type in use for IPD + FrameCodec IpdCodec() const; + + /// \returns string value of \@RG:KS + std::string KeySequence() const; + + /// \returns string value of \@RG:LB + std::string Library() const; + + /// \returns movie name (stored in \@RG:PU) + std::string MovieName() const; + + /// \returns string value of \@RG:PL + std::string Platform() const; + + /// \returns string value of \@RG:PM + PlatformModelType PlatformModel() const; + + /// \returns string value of \@RG:PI + std::string PredictedInsertSize() const; + + /// \returns string value of \@RG:PG + std::string Programs() const; + + /// \returns codec type in use for PulseWidth + FrameCodec PulseWidthCodec() const; + + /// \returns string value of read type + std::string ReadType() const; + + /// \returns string value of \@RG:SM + std::string Sample() const; + + /// \returns string value of \@RG:CN + std::string SequencingCenter() const; + + /// \returns sequencing chemistry name + std::string SequencingChemistry() const; + + /// \returns sequencing kit part number + std::string SequencingKit() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \brief Sets barcode data for the read group's description tag. + /// + /// Barcode fields are either absent or all must be present. + /// + /// \param[in] barcodeFile barcode filename + /// \param[in] barcodeHash MD5 hash of barcode file + /// \param[in] barcodeCount number of records in barcode file + /// \param[in] barcodeMode experimental design of barcodes + /// \param[in] barcodeQuality type of barcode quality value + /// + /// \sa BarcodeFile \n + /// BarcodeHash \n + /// BarcodeCount \n + /// BarcodeMode \n + /// BarcodeQuality \n + /// ReadGroupInfo::ClearBarcodeData + /// + /// \returns reference to this object + /// + ReadGroupInfo& BarcodeData(std::string barcodeFile, std::string barcodeHash, + size_t barcodeCount, BarcodeModeType barcodeMode, + BarcodeQualityType barcodeQuality); + + /// \brief Sets the basecaller version number. + /// + /// \param[in] versionNumber new value + /// \returns reference to this object + /// + ReadGroupInfo& BasecallerVersion(std::string versionNumber); + + /// \brief Sets the tag to be used for a particular base feature. + /// + /// \param[in] feature feature type begin updated + /// \param[in] tag new value + /// \returns reference to this object + /// + ReadGroupInfo& BaseFeatureTag(BaseFeature feature, std::string tag); + + /// \brief Sets the binding kit part number. + /// + /// \param[in] kitNumber new value + /// \returns reference to this object + /// + ReadGroupInfo& BindingKit(std::string kitNumber); + + /// \brief Removes all barcode data from this read group. + /// + /// \returns reference to this read group + /// + ReadGroupInfo& ClearBarcodeData(); + + /// \brief Removes all base features from this read group. + /// + /// \returns reference to this read group + /// + ReadGroupInfo& ClearBaseFeatures(); + + /// \brief Sets whether read group's records are classifed as spike-in + /// controls. + /// + /// \param[in] ctrl true if records are spike-in controls + /// \returns reference to this object + /// + ReadGroupInfo& Control(bool ctrl); + + /// \brief Sets a new collection of non-standard tags. + /// + /// Custom tag map entries should consist of {tagName => value}. + /// + /// \param[in] custom new tags + /// \returns reference to this object + /// + ReadGroupInfo& CustomTags(std::map custom); + + /// \brief Sets the value for \@RG:DT + /// + /// \param[in] date new value + /// \returns reference to this object + /// + ReadGroupInfo& Date(std::string date); + + /// \brief Sets the value for \@RG:FO + /// + /// \param[in] order new value + /// \returns reference to this object + /// + ReadGroupInfo& FlowOrder(std::string order); + + /// \brief Sets the frame rate. + /// + /// \param[in] frameRateHz string value of frame rate in Hz + /// \returns reference to this object + /// + ReadGroupInfo& FrameRateHz(std::string frameRateHz); + + /// \brief Sets the read group's ID. + /// + /// \param[in] id string value of ID + /// \returns reference to this object + /// + ReadGroupInfo& Id(std::string id); + + /// \brief Sets the read group's ID, from movie name & read type + /// + /// \param[in] movieName sequencing movie name + /// \param[in] readType string version of read type + /// \returns reference to this object + /// + ReadGroupInfo& Id(const std::string& movieName, const std::string& readType); + + /// \brief Sets the codec type used for IPD + /// + /// \param[in] codec codec type + /// \param[in] tag IPD tag + /// \returns reference to this object + /// + ReadGroupInfo& IpdCodec(FrameCodec codec, std::string tag = std::string()); + + /// \brief Sets the value for \@RG:KS + /// + /// \param[in] sequence new value + /// \returns reference to this object + /// + ReadGroupInfo& KeySequence(std::string sequence); + + /// \brief Sets the value for \@RG:LB + /// + /// \param[in] library new value + /// \returns reference to this object + /// + ReadGroupInfo& Library(std::string library); + + /// \brief Sets the value for movie name (stored in \@RG:PU). + /// + /// \param[in] movieName new value + /// \returns reference to this object + /// + ReadGroupInfo& MovieName(std::string movieName); + + /// \brief Sets the value for \@RG:PI + /// + /// \param[in] size new value + /// \returns reference to this object + /// + ReadGroupInfo& PredictedInsertSize(std::string size); + + /// \brief Sets the value for \@RG:PG + /// + /// \param[in] programs new value + /// \returns reference to this object + /// + ReadGroupInfo& Programs(std::string programs); + + /// \brief Sets the value for \@RG:PM + /// + /// \param[in] platformModel new value + /// \returns reference to this object + /// + ReadGroupInfo& PlatformModel(PlatformModelType platform); + + /// \brief Sets the codec type used for PulseWidth + /// + /// \param[in] codec codec type + /// \param[in] tag pulse width tag + /// \returns reference to this object + /// + ReadGroupInfo& PulseWidthCodec(FrameCodec codec, std::string tag = std::string()); + + /// \brief Sets the read type. + /// + /// \param[in] type new value + /// \returns reference to this object + /// + ReadGroupInfo& ReadType(std::string type); + + /// \brief Removes a particular base feature from this read group. + /// + /// \param[in] feature feature to remove + /// \returns reference to this object + /// + ReadGroupInfo& RemoveBaseFeature(BaseFeature feature); + + /// \brief Sets the value for \@RG:SM + /// + /// \param[in] sample new value + /// \returns reference to this object + /// + ReadGroupInfo& Sample(std::string sample); + + /// \brief Sets the value for \@RG:CN + /// + /// \param[in] center new value + /// \returns reference to this object + /// + ReadGroupInfo& SequencingCenter(std::string center); + + /// \brief Sets the sequencing kit part number. + /// + /// \param[in] kitNumber new value + /// \returns reference to this object + /// + ReadGroupInfo& SequencingKit(std::string kitNumber); + + /// \} + +private: + std::string id_; // ID * must be unique for valid SAM * + 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 + std::string sample_; // SM + + PlatformModelType platformModel_ = PlatformModelType::SEQUEL; // PM + + // DS: components + std::string readType_; + std::string bindingKit_; + std::string sequencingKit_; + std::string basecallerVersion_; + mutable std::string sequencingChemistry_; + std::string frameRateHz_; + bool control_ = false; + FrameCodec ipdCodec_ = FrameCodec::V1; + FrameCodec pulseWidthCodec_ = FrameCodec::V1; + bool hasBarcodeData_ = false; + std::string barcodeFile_; + std::string barcodeHash_; + size_t barcodeCount_ = 0; + BarcodeModeType barcodeMode_ = BarcodeModeType::NONE; + BarcodeQualityType barcodeQuality_ = BarcodeQualityType::NONE; + std::map features_; + + // (optional) barcode label handling + boost::optional> barcodes_ = boost::none; + std::string baseId_; + + // custom attributes + std::map custom_; // tag => value + +private: + std::string EncodeSamDescription() const; + void DecodeSamDescription(const std::string& description); + void DecodeBarcodeKey(const std::string& key, std::string value); + void DecodeFrameCodecKey(const std::string& key, std::string value); +}; + +/// \brief Creates a read group ID from a movie name & read type. +/// +/// \param[in] movieName sequencing movie name +/// \param[in] readType string version of read type +/// +/// \returns hexadecimal string read group ID +/// +PBBAM_EXPORT +std::string MakeReadGroupId(const std::string& movieName, const std::string& readType); + +} // namespace BAM +} // namespace PacBio + +#endif // READGROUPINFO_H diff --git a/include/pbbam/RecordType.h b/include/pbbam/RecordType.h new file mode 100644 index 0000000..13ea7f0 --- /dev/null +++ b/include/pbbam/RecordType.h @@ -0,0 +1,54 @@ +// File Description +/// \file RecordType.h +/// \brief Defines the RecordType enum. +// +// Author: Derek Barnett + +#ifndef RECORDTYPE_H +#define RECORDTYPE_H + +#include + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the possible PacBio BAM record types. +/// +/// \sa ReadGroupInfo::ReadType +/// +enum class RecordType +{ + ZMW, ///< Polymerase read + HQREGION, ///< High-quality region + SUBREAD, ///< Subread + CCS, ///< Circular consensus sequence + SCRAP, ///< Additional sequence (barcodes, adapters, etc.) + UNKNOWN, ///< Unknown read type + TRANSCRIPT, ///< Transcript + + POLYMERASE = ZMW ///< \deprecated as of PacBio BAM spec v 3.0.4 (use RecordType::ZMW instead) +}; + +/// +/// \brief IsCcsOrTranscript +/// +/// CCS & Transcript type records handle queryStart/End in the same way. This +/// status is checked in several places, so this is a convenient helper. +/// +/// \param[in] type +/// +bool IsCcsOrTranscript(const RecordType type); + +/// +/// \brief Returns string representation of RecordType +/// +/// \param type +/// \return std::string +/// \throws std::runtime_error if type is unrecognized +/// +std::string ToString(const RecordType type); + +} // namespace BAM +} // namespace PacBio + +#endif // RECORDTYPE_H diff --git a/include/pbbam/SamTagCodec.h b/include/pbbam/SamTagCodec.h new file mode 100644 index 0000000..bc06edf --- /dev/null +++ b/include/pbbam/SamTagCodec.h @@ -0,0 +1,57 @@ +// File Description +/// \file SamTagCodec.h +/// \brief Defines the SamTagCodec class. +// +// Author: Derek Barnett + +#ifndef SAMTAGCODEC_H +#define SAMTAGCODEC_H + +#include +#include "pbbam/Config.h" +#include "pbbam/TagCollection.h" + +namespace PacBio { +namespace BAM { + +/// \brief The SamTagCodec class provides text-based encoding/decoding of %BAM +/// tag data. +/// +/// \note SamTagCodec is mostly an implementation and/or testing detail, and may +/// be removed from the public API. +/// +class PBBAM_EXPORT SamTagCodec +{ +public: + /// \name Tag Collection Methods + /// \{ + + /// \brief Creates a TagCollection from SAM-formatted tag data. + /// + /// \param[in] tagString SAM-formmated string + /// \returns resulting tag collection + /// + static TagCollection Decode(const std::string& tagString); + + /// \brief Creates SAM-formatted string from a TagCollection. + /// + /// \param[in] tags TagCollection containing tag data + /// \returns SAM-formatted string + /// + static std::string Encode(const PacBio::BAM::TagCollection& tags); +}; + +/// +/// \brief creates a tag per the SAM/BAM text format +/// +/// \param tag tag name +/// \param value tag value +/// +/// \return formatted tag string +/// +std::string MakeSamTag(std::string tag, std::string value); + +} // namespace BAM +} // namespace PacBio + +#endif // SAMTAGCODEC_H diff --git a/include/pbbam/SamWriter.h b/include/pbbam/SamWriter.h new file mode 100644 index 0000000..a655c1c --- /dev/null +++ b/include/pbbam/SamWriter.h @@ -0,0 +1,96 @@ +// File Description +/// \file SamWriter.h +/// \brief Defines the SamWriter class. +// +// Author: Derek Barnett + +#ifndef SAMWRITER_H +#define SAMWRITER_H + +#include +#include +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/IRecordWriter.h" + +namespace PacBio { +namespace BAM { + +/// \brief The SamWriter class provides a writing interface for creating +/// new SAM files. +/// +/// \note The underlying buffered data may not be flushed to the file until the +/// destructor is called. Trying to access the file (reading, stat-ing, +/// indexing, etc.) before the SamWriter is destroyed yields undefined +/// behavior. Enclose the SamWriter in some form of local scope (curly +/// braces, a separate function, etc.) to ensure that its destructor is +/// called before proceeding to read-based operations. +/// +/// \code{.cpp} +/// { +/// SamWriter w(...); +/// // write data +/// } +/// // now safe to access the new file +/// \endcode +/// +/// +class SamWriter : public IRecordWriter +{ +public: + /// \brief Opens a SAM file for writing & writes the header information. + /// + /// \note Set \p filename to "-" for stdout. + /// + /// \param[in] filename path to output SAM file + /// \param[in] header BamHeader object + /// + /// \throws std::runtime_error if there was a problem opening the file for + /// writing or if an error occurred while writing the header + /// + SamWriter(std::string filename, const BamHeader& header); + + /// Fully flushes all buffered data & closes file. + /// + ~SamWriter() override; + + SamWriter(const SamWriter&) = delete; + SamWriter(SamWriter&&); + SamWriter& operator=(const SamWriter&) = delete; + SamWriter& operator=(SamWriter&&); + + /// \brief Try to flush any buffered data to file. + /// + /// \note The underlying implementation may not necessarily flush buffered + /// data immediately, especially in a multithreaded writer situation. + /// Let the SamWriter go out of scope to fully ensure flushing. + /// + /// \throws std::runtime_error if flush fails + /// + void TryFlush() override; + + /// \brief Write a record to the output SAM file. + /// + /// \param[in] record BamRecord object + /// + /// \throws std::runtime_error on failure to write + /// + void Write(const BamRecord& record) override; + + /// \brief Write a record to the output SAM file. + /// + /// \param[in] recordImpl BamRecordImpl object + /// + /// \throws std::runtime_error on failure to write + /// + void Write(const BamRecordImpl& recordImpl) override; + +private: + class SamWriterPrivate; + std::unique_ptr d_; +}; + +} // namesapce BAM +} // namespace PacBio + +#endif // SAMWRITER_H diff --git a/include/pbbam/SequenceInfo.h b/include/pbbam/SequenceInfo.h new file mode 100644 index 0000000..b62e7b3 --- /dev/null +++ b/include/pbbam/SequenceInfo.h @@ -0,0 +1,192 @@ +// File Description +/// \file SequenceInfo.h +/// \brief Defines the SequenceInfo class. +// +// Author: Derek Barnett + +#ifndef SEQUENCEINFO_H +#define SEQUENCEINFO_H + +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief The SequenceInfo class represents a program entry (\@SQ) in the SAM +/// header. +/// +class PBBAM_EXPORT SequenceInfo +{ +public: + /// \name Conversion & Validation + /// + + /// \brief Creates a SequenceInfo object from SAM-formatted text. + /// + /// \param[in] sam SAM-formatted text + /// \returns program info object + /// + static SequenceInfo FromSam(const std::string& sam); + + /// \brief Converts a SequenceInfo object to its SAM-formatted text. + /// + /// \param[in] seq input SequenceInfo object + /// \returns SAM-formatted text (no trailing newline) + /// + static std::string ToSam(const SequenceInfo& seq); + + /// \} + +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a sequence info object with name & (optional) length. + /// + /// \param[in] name sequence name (\@SQ:SN) + /// \param[in] length sequence length (\@SQ:LN) + /// + SequenceInfo(std::string name, std::string length = "0"); + + SequenceInfo(); + SequenceInfo(const SequenceInfo&); + SequenceInfo(SequenceInfo&&); + SequenceInfo& operator=(const SequenceInfo&); + SequenceInfo& operator=(SequenceInfo&&); + ~SequenceInfo(); + + /// \} + +public: + /// \name Operators + /// \{ + + bool operator==(const SequenceInfo& other) const; + bool operator!=(const SequenceInfo& other) const; + + /// \} + +public: + /// \name Conversion & Validation + /// + + /// \returns true if sequence info is valid + /// + /// Currently this checks to see that Name is non-empty and Length is within + /// the accepted range. + /// + bool IsValid() const; + + /// \brief Converts this object to its SAM-formatted text. + /// + /// \returns SAM-formatted text (no trailing newline) + /// + std::string ToSam() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \returns string value of \@SQ:AS + std::string AssemblyId() const; + + /// \returns string value of \@SQ:M5 + std::string Checksum() const; + + /// \returns any non-standard tags added to the \@PG entry + /// + /// Result map consists of {tagName => value}. + /// + std::map CustomTags() const; + + /// \returns string value of \@SQ:LN + std::string Length() const; + + /// \returns string value of \@SQ:SN + std::string Name() const; + + /// \returns string value of \@SQ:SP + std::string Species() const; + + /// \returns string value of \@SQ:UR + std::string Uri() const; + + /// \} + +public: + /// \name Attributes + /// \{ + + /// \brief Sets the value for \@SQ:AS + /// + /// \param[in] id new value + /// \returns reference to this object + /// + SequenceInfo& AssemblyId(std::string id); + + /// \brief Sets the value for \@SQ:M5 + /// + /// \param[in] checksum new value + /// \returns reference to this object + /// + SequenceInfo& Checksum(std::string checksum); + + /// \brief Sets a new collection of non-standard tags. + /// + /// Custom tag map entries should consist of {tagName => value}. + /// + /// \param[in] custom new tags + /// \returns reference to this object + /// + SequenceInfo& CustomTags(std::map custom); + + /// \brief Sets the value for \@SQ:LN + /// + /// \param[in] length new value + /// \returns reference to this object + /// + SequenceInfo& Length(std::string length); + + /// \brief Sets the value for \@SQ:SN + /// + /// \param[in] name new value + /// \returns reference to this object + /// + SequenceInfo& Name(std::string name); + + /// \brief Sets the value for \@SQ:SP + /// + /// \param[in] species new value + /// \returns reference to this object + /// + SequenceInfo& Species(std::string species); + + /// \brief Sets the value for \@SQ:UR + /// + /// \param[in] uri new value + /// \returns reference to this object + /// + SequenceInfo& Uri(std::string uri); + + /// \} + +private: + std::string name_; // SN: * must be unique for valid SAM * + std::string length_; // LN: * must be within [0 - 2^31-1] * + std::string assemblyId_; // AS: + std::string checksum_; // M5: + std::string species_; // SP: + std::string uri_; // UR: + + // custom attributes + std::map custom_; // tag => value +}; + +} // 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..6bc5cc1 --- /dev/null +++ b/include/pbbam/Strand.h @@ -0,0 +1,27 @@ +// File Description +/// \file Strand.h +/// \brief Defines the Strand enum. +// +// Author: Derek Barnett + +#ifndef STRAND_H +#define STRAND_H + +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the strand orientations used for reporting +/// alignment-related information. +/// +enum class Strand +{ + FORWARD, ///< Forward strand + REVERSE ///< Reverse strand +}; + +} // namespace BAM +} // namespace PacBio + +#endif // STRAND_H diff --git a/include/pbbam/StringUtilities.h b/include/pbbam/StringUtilities.h new file mode 100644 index 0000000..6cd43bc --- /dev/null +++ b/include/pbbam/StringUtilities.h @@ -0,0 +1,42 @@ +// Author: Derek Barnett + +#ifndef PBBAM_STRINGUTILITIES_H +#define PBBAM_STRINGUTILITIES_H + +#include +#include + +namespace PacBio { +namespace BAM { + +/// +/// \brief Joins tokens into a single string +/// +/// \param tokens input strings +/// \param delim delimiter character +/// +/// \return joined string +/// +std::string Join(const std::vector& tokens, const char delim); + +/// \brief Splits a string into tokens +/// +/// \param[in] line input string +/// \param[in] delim character to split on +/// +/// \returns vector of tokens +/// +std::vector Split(const std::string& line, const char delim = '\t'); + +/// \brief Remove all whitespace from input string (start, end, & internal) +/// +/// \param[in] input original string +/// +/// \returns new string with no whitespace +/// +std::string RemoveAllWhitespace(std::string input); + +} // namespace BAM +} // namespace PacBio + +#endif // PBBAM_STRINGUTILITIES_H diff --git a/include/pbbam/SubreadLengthQuery.h b/include/pbbam/SubreadLengthQuery.h new file mode 100644 index 0000000..485781a --- /dev/null +++ b/include/pbbam/SubreadLengthQuery.h @@ -0,0 +1,65 @@ +// File Description +/// \file SubreadLengthQuery.h +/// \brief Defines the SubreadLengthQuery class. +// +// Author: Derek Barnett + +#ifndef SUBREADLENGTHQUERY_H +#define SUBREADLENGTHQUERY_H + +#include +#include +#include "pbbam/Compare.h" +#include "pbbam/Config.h" +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The SubreadLengthQuery class provides iterable access to a DataSet's +/// %BAM records, limiting results to those matching a subread length +/// criterion. +/// +/// Example: +/// \include code/SubreadLengthQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".pbi" index file. +/// Use BamFile::EnsurePacBioIndexExists before creating the query if one +/// may not be present. +/// +class PBBAM_EXPORT SubreadLengthQuery : public internal::IQuery +{ +public: + /// \brief Creates a new SubreadLengthQuery, limiting record results to only + /// those matching a subread length criterion. + /// + /// \param[in] length subread length value + /// \param[in] compareType compare operator + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or PBI + /// files. + /// + SubreadLengthQuery(const int32_t length, const Compare::Type compareType, + const DataSet& dataset); + + ~SubreadLengthQuery(); + + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + + uint32_t NumReads() const; + +private: + class SubreadLengthQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // SUBREADLENGTHQUERY_H diff --git a/include/pbbam/Tag.h b/include/pbbam/Tag.h new file mode 100644 index 0000000..7f2e6ef --- /dev/null +++ b/include/pbbam/Tag.h @@ -0,0 +1,416 @@ +// File Description +/// \file Tag.h +/// \brief Defines the Tag class. +// +// Author: Derek Barnett + +#ifndef TAG_H +#define TAG_H + +#include +#include +#include +#include +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief This enum is used to describe 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 + UINT8_ARRAY = 10, ///< std::vector + INT16_ARRAY, ///< std::vector + UINT16_ARRAY, ///< std::vector + INT32_ARRAY, ///< std::vector + UINT32_ARRAY, ///< std::vector + FLOAT_ARRAY = 15 ///< std::vector +}; + +/// \brief This enum 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'). Thus a TagModifier may be used to indicate how to +/// properly distinguish between these shared data types. +/// +enum class TagModifier +{ + /// \brief This value indicates that 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++ - as + /// int8_t/uint8_t are likely implemented as typedefs around char/unsigned + /// char. Thus this modifier can be used to indicate a tag's value 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 +}; + +/// \brief The Tag class represents a SAM/BAM record tag value. +/// +/// SAM/BAM tags may store values from a variety of types: varying fixed-width +/// integers, strings, arrays of data, etc. +/// +/// The Tag class allow tags to be handled in a generic fashion, while +/// maintaining a high level of type-safety. Only those types recognized by the +/// SAM/BAM format are allowed, and extracting the value from a tag is subject +/// to allowed conversion rules, as well. +/// +// 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 + /// \{ + + /// \brief Creates a Tag from a signed 8-bit integer or character. + /// + /// Without a TagModifier, the resulting Tag will be annotated as containing + /// an 8-bit integer, whether the input \p value was an integer or a char. + /// For ASCII tags, use one of these methods: + /// \include code/Tag_AsciiCtor.txt + /// + Tag(int8_t value); + + /// \brief Creates a Tag from a signed 8-bit integer or character, + /// applying the provided modifier. + /// + /// This method allows direct construction of an ASCII character, rather + /// than an 8-bit integer (e.g. Tag('A', TagModifier::ASCII_CHAR) ). + /// + /// \throws runtime_error if \p modifier is not valid for int8_t data + /// + Tag(int8_t value, const TagModifier mod); + + /// \brief Creates a Tag from an unsigned 8-bit integer or character. + /// + /// Without a TagModifier, the resulting Tag will be annotated as containing + /// an 8-bit unsigned integer, whether the input \p value was an integer or + /// a char. For ASCII tags, use one of these methods: + /// \include code/Tag_AsciiCtor.txt + /// + Tag(uint8_t value); + + /// \brief Creates a Tag from 16-bit integer. + Tag(int16_t value); + + /// \brief Creates a Tag from 16-bit unsigned integer. + Tag(uint16_t value); + + /// \brief Creates a Tag from 32-bit signed integer. + Tag(int32_t value); + + /// \brief Creates a Tag from 32-bit unsigned integer. + Tag(uint32_t value); + + /// \brief Creates a Tag from floating-point value. + Tag(float value); + + /// \brief Creates a Tag from string data. + Tag(std::string value); + + /// \brief Creates a Tag from string data, adding modifier. + /// + /// \throws runtime_error if \p modifier is not valid for string data + /// + Tag(std::string value, TagModifier mod); + + /// \brief Creates a Tag from a vector of 8-bit integers. + Tag(std::vector value); + + /// \brief Creates a Tag from a vector of 8-bit unsigned integers. + Tag(std::vector value); + + /// \brief Creates a Tag from a vector of 16-bit integers. + Tag(std::vector value); + + /// \brief Creates a Tag from a vector of 16-bit unsigned integers. + Tag(std::vector value); + + /// Constructs a Tag from a vector of 32-bit integers. + Tag(std::vector value); + + /// \brief Creates a Tag from a vector of 32-bit unsigned integers. + Tag(std::vector value); + + /// \brief Creates a Tag from a vector of floating-point values. + Tag(std::vector value); + + Tag(); + Tag(const Tag&); + Tag(Tag&&); + Tag& operator=(const Tag&); + Tag& operator=(Tag&&); + ~Tag(); + + 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=(std::string value); + Tag& operator=(std::vector value); + Tag& operator=(std::vector value); + Tag& operator=(std::vector value); + Tag& operator=(std::vector value); + Tag& operator=(std::vector value); + Tag& operator=(std::vector value); + Tag& operator=(std::vector value); + + bool operator==(const Tag& other) const; + bool operator!=(const Tag& other) const; + + /// \} + +public: + /// \name Data Conversion & Validation + /// \{ + + /// \brief Converts the tag value to an ASCII character. + /// + /// Tag must hold an integral type, within the valid ASCII range [33-127]. + /// + /// \returns ASCII character value + /// \throws std::runtime_error if not ASCII-compatible + /// + char ToAscii() const; + + /// \returns tag data as signed 8-bit (casting if needed) + /// \throws std::runtime_error if not integral data, or out of valid range + int8_t ToInt8() const; + + /// \returns tag data as unsigned 8-bit (casting if needed) + /// \throws std::runtime_error if not integral data, or out of valid range + uint8_t ToUInt8() const; + + /// \returns tag data as signed 16-bit (casting if needed) + /// \throws std::runtime_error if not integral data, or out of valid range + int16_t ToInt16() const; + + /// \returns tag data as unsigned 16-bit (casting if needed) + /// \throws std::runtime_error if not integral data, or out of valid range + uint16_t ToUInt16() const; + + /// \returns tag data as signed 32-bit (casting if needed) + /// \throws std::runtime_error if not integral data, or out of valid range + int32_t ToInt32() const; + + /// \returns tag data as unsigned 32-bit (casting if needed) + /// \throws std::runtime_error if not integral data, or out of valid range + uint32_t ToUInt32() const; + + /// \returns tag data as float + /// \throws std::runtime_error if tag does not contain a value of + /// explicit type: float + float ToFloat() const; + + /// \returns tag data as std::string + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::string + std::string ToString() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToInt8Array() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToUInt8Array() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToInt16Array() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToUInt16Array() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToInt32Array() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToUInt32Array() const; + + /// \returns tag data as std::vector + /// \throws std::runtime_error if tag does not contain a value of explicit + /// type: std::vector + std::vector ToFloatArray() const; + + /// \} + +public: + /// \name Data Conversion & Validation + /// + + /// \returns true if tag is null (e.g. default-constructed) + bool IsNull() const; + + /// \returns true if tag contains a value of type: int8_t + bool IsInt8() const; + + /// \returns true if tag contains a value of type: uint8_t + bool IsUInt8() const; + + /// \returns true if tag contains a value of type: int16_t + bool IsInt16() const; + + /// \returns true if tag contains a value of type: uint16_t + bool IsUInt16() const; + + /// \returns true if tag contains a value of type: int32_t + bool IsInt32() const; + + /// \returns true if tag contains a value of type: uint32_t + bool IsUInt32() const; + + /// \returns true if tag contains a value of type: float + bool IsFloat() const; + + /// \returns true if tag contains a value of type: std::string + bool IsString() const; + + /// \returns true if tag contains a value of type: std::string \b AND has a + /// TagModifier of TagModifier::HEX_STRING + bool IsHexString() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsInt8Array() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsUInt8Array() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsInt16Array() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsUInt16Array() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsInt32Array() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsUInt32Array() const; + + /// \returns true if tag contains a value of type: std::vector + bool IsFloatArray() const; + + /// \returns true if tag contains a value with any signed integer type + bool IsSignedInt() const; + + /// \returns true if tag contains a value with any unsigned integer type + bool IsUnsignedInt() const; + + /// \returns true if tag contains a value with any integer type + bool IsIntegral() const; + + /// \returns true if tag contains a value with any integer or float type + bool IsNumeric() const; + + /// \returns true if tag contains a vector containing signed integers + bool IsSignedArray() const; + + /// \returns true if tag contains a vector containing unsigned integers + bool IsUnsignedArray() const; + + /// \returns true if tag contains a vector containing integers + bool IsIntegralArray() const; + + /// \returns true if tag contains a vector (integers or floats) + bool IsArray() const; + + /// \} + +public: + /// \name Type & Modifier Attributes + /// \{ + + /// \returns enum value for current tag data + TagDataType Type() const; + + /// \returns printable type name for current tag data + std::string Typename() const; + + /// \returns true if tag data modifier \p m is set + bool HasModifier(const TagModifier m) const; + + /// \returns current tag data modifier + TagModifier Modifier() const; + + /// \brief Sets tag data modifier. + /// + /// \param[in] m new modifier value + /// + /// \returns reference to this tag + Tag& Modifier(const TagModifier m); + + /// \} + +private: + // clang-format off + // NOTE - keep this synced with TagDataType enum ordering + using var_t = boost::variant, + std::vector, + std::vector, + std::vector, + std::vector, + std::vector, + std::vector >; + + var_t data_; + TagModifier modifier_ = TagModifier::NONE; + // clang-format on +}; + +} // namespace BAM +} // namespace PacBio + +#endif // TAG_H diff --git a/include/pbbam/TagCollection.h b/include/pbbam/TagCollection.h new file mode 100644 index 0000000..2563cb1 --- /dev/null +++ b/include/pbbam/TagCollection.h @@ -0,0 +1,33 @@ +// File Description +/// \file TagCollection.h +/// \brief Defines the TagCollection class. +// +// Author: Derek Barnett + +#ifndef TAGCOLLECTION_H +#define TAGCOLLECTION_H + +#include +#include +#include "pbbam/Config.h" +#include "pbbam/Tag.h" + +namespace PacBio { +namespace BAM { + +/// \brief The TagCollection class represents a collection (or "dictionary") of +/// tags. +/// +/// Tags are mapped to their tag name, a 2-character string. +/// +class PBBAM_EXPORT TagCollection : public std::map +{ +public: + /// \returns true if the collection contains a tag with \p name + bool Contains(const std::string& name) const; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // TAGCOLLECTION_H diff --git a/include/pbbam/Unused.h b/include/pbbam/Unused.h new file mode 100644 index 0000000..6b72ff9 --- /dev/null +++ b/include/pbbam/Unused.h @@ -0,0 +1,15 @@ +#ifndef PBBAM_UNUSED_H +#define PBBAM_UNUSED_H + +namespace PacBio { +namespace BAM { + +template +void UNUSED(const T&) +{ +} + +} // namespace BAM +} // namespace PacBio + +#endif // PBBAM_UNUSED_H diff --git a/include/pbbam/Validator.h b/include/pbbam/Validator.h new file mode 100644 index 0000000..b2c8743 --- /dev/null +++ b/include/pbbam/Validator.h @@ -0,0 +1,153 @@ +// File Description +/// \file Validator.h +/// \brief Defines the Validator class. +// +// Author: Derek Barnett + +#ifndef VALIDATOR_H +#define VALIDATOR_H + +#include +#include +#include "pbbam/Config.h" +#include "pbbam/exception/ValidationException.h" + +namespace PacBio { +namespace BAM { + +class BamFile; +class BamHeader; +class BamRecord; +class ReadGroupInfo; + +/// \brief The Validator class provides validation for %BAM data. +/// +/// There are 2 ways to use this class. If you are only compared with a quick & +/// dirty, yes/no validation, then you can use the IsValid() methods. This will +/// swallow the specific cause of the failure, but you don't have to catch an +/// exception and handle it in your client code. If you want to know, +/// specifically, what failed, then you can use the Validate*() methods that +/// will throw a ValidationException if the object is invalid. This exception +/// will provide more details as to what failed and why. +/// +/// See documentation for Config.h for details on building pbbam with +/// auto-validation enabled. +/// +class PBBAM_EXPORT Validator +{ +public: + /// \brief Checks that a %BAM file conforms to the %PacBio specification. + /// + /// When \p entireFile is false, this method only checks file metadata. If + /// \p entireFile is true, all records are checked as well. + /// + /// \param[in] file %BAM header to validate + /// \param[in] entireFile check records in addition to metadata + /// \returns true if \p file passes validation checks + /// + /// \sa Validator::ValidateFileMetdata, Validator::ValidateEntireFile + /// + static bool IsValid(const BamFile& file, const bool entireFile); + + /// \brief Checks that a %BAM header conforms to the %PacBio specification. + /// + /// \returns true if \p header passes validation checks + /// + /// \sa Validator::Validate(const BamHeader& header) + /// + static bool IsValid(const BamHeader& header); + + /// \brief Checks that a %BAM read group conforms to the %PacBio + /// specification. + /// + /// \returns true if \p rg passes validation checks + /// + /// \sa Validator::Validate(const ReadGroupInfo& rg) + /// + static bool IsValid(const ReadGroupInfo& rg); + + /// \brief Checks that a %BAM record conforms to the %PacBio specification. + /// + /// \returns true if \p record passes validation checks + /// + /// \sa Validator::Validate(const BamRecord& record) + /// + static bool IsValid(const BamRecord& record); + + Validator() = delete; + + /// \brief Checks that a %BAM file's header conforms to the + /// %PacBio specification. + /// + /// This validation step checks the SAM/%BAM version number, sort order, + /// PacBioBAM version number, and calls Validate(readGroup) internally for + /// all read groups. + /// + /// \param[in] file %BAM header to validate + /// \param[in] maxErrors maximum number of errors to allow before throwing + /// + /// \throws ValidationException if \p header fails validation checks + /// + static void Validate(const BamHeader& header, + const size_t maxErrors = std::numeric_limits::max()); + + /// \brief Checks that a %BAM read group conforms to the %PacBio + /// specification. + /// + /// \param[in] rg %BAM read group to validate + /// \param[in] maxErrors maximum number of errors to allow before throwing + /// + /// \throws ValidationException if \p rg fails validation checks + /// + static void Validate(const ReadGroupInfo& rg, + const size_t maxErrors = std::numeric_limits::max()); + + /// \brief Checks that a %BAM record conforms to the %PacBio specification. + /// + /// \param[in] record %BAM record to validate + /// \param[in] maxErrors maximum number of errors to allow before throwing + /// + /// \throws ValidationException if \p record fails validation checks + /// + static void Validate(const BamRecord& record, + const size_t maxErrors = std::numeric_limits::max()); + + /// \brief Checks that a %BAM file's (entire) contents conform to the + /// %PacBio specification. + /// + /// This is equivalent to: + /// + /// \code + /// Validator::ValidateMetadata(file); + /// EntireFileQuery query(file); + /// for (const BamRecord& record : query) + /// Validator::Validate(record); + /// \endcode + /// + /// \param[in] file %BAM file to validate + /// \param[in] maxErrors maximum number of errors to allow before throwing + /// + /// \throws ValidationException if \p file fails validation checks + /// + static void ValidateEntireFile(const BamFile& file, + const size_t maxErrors = std::numeric_limits::max()); + + /// \brief Checks that a %BAM file's metadata conforms to the + /// %PacBio specification. + /// + /// This validation step checks the filename, ensures EOF marker, and + /// presence of PBI. It also calls Validate(file.Header()) internally. + /// + /// \param[in] file %BAM header to validate + /// \param[in] maxErrors maximum number of errors to allow before throwing + /// + /// \throws ValidationException if \p header fails validation checks + /// + static void ValidateFileMetadata(const BamFile& file, + const size_t maxErrors = std::numeric_limits::max()); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VALIDATOR_H diff --git a/include/pbbam/ZmwGroupQuery.h b/include/pbbam/ZmwGroupQuery.h new file mode 100644 index 0000000..084a9f6 --- /dev/null +++ b/include/pbbam/ZmwGroupQuery.h @@ -0,0 +1,59 @@ +// File Description +/// \file ZmwGroupQuery.h +/// \brief Defines the ZmwGroupQuery class. +// +// Author: Derek Barnett + +#ifndef ZMWGROUPQUERY_H +#define ZMWGROUPQUERY_H + +#include +#include +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The ZmwGroupQuery class provides iterable access to a DataSet's +/// %BAM records, limiting results to those matching a ZMW hole number +/// whitelist, and grouping those results by hole number. +/// +/// Example: +/// \include code/ZmwGroupQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".pbi" index file. +/// Use BamFile::EnsurePacBioIndexExists before creating the query if one +/// may not be present. +/// +class PBBAM_EXPORT ZmwGroupQuery : public internal::IGroupQuery +{ +public: + /// \brief Creates a new ZmwGroupQuery, limiting record results to only + /// those matching a ZMW hole number criterion. + /// + /// \param[in] zmwWhitelist vector of allowed ZMW hole numbers + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// PBI files. + /// + ZmwGroupQuery(const std::vector& zmwWhitelist, const DataSet& dataset); + ~ZmwGroupQuery(); + +public: + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(std::vector& records) override; + +private: + class ZmwGroupQueryPrivate; + std::unique_ptr d_; +}; + +} // 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..239c758 --- /dev/null +++ b/include/pbbam/ZmwQuery.h @@ -0,0 +1,60 @@ +// File Description +/// \file ZmwQuery.h +/// \brief Defines the ZmwQuery class. +// +// Author: Derek Barnett + +#ifndef ZMWQUERY_H +#define ZMWQUERY_H + +#include +#include +#include "pbbam/Config.h" +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { + +/// \brief The ZmwQuery class provides iterable access to a DataSet's +/// %BAM records, limiting results to those matching a ZMW hole number +/// whitelist. +/// +/// Example: +/// \include code/ZmwQuery.txt +/// +/// \note Currently, all %BAM files must have a corresponding ".pbi" index file. +/// Use BamFile::EnsurePacBioIndexExists before creating the query if one +/// may not be present. +/// +class PBBAM_EXPORT ZmwQuery : public internal::IQuery +{ +public: + /// \brief Creates a new ZmwQuery, limiting record results to only + /// those matching a ZMW hole number criterion. + /// + /// \param[in] zmwWhitelist vector of allowed ZMW hole numbers + /// \param[in] dataset input data source(s) + /// + /// \throws std::runtime_error on failure to open/read underlying %BAM or + /// PBI files. + /// + ZmwQuery(std::vector zmwWhitelist, const DataSet& dataset); + + ~ZmwQuery(); + + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(BamRecord& r) override; + +private: + class ZmwQueryPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ZMWQUERY_H diff --git a/include/pbbam/ZmwType.h b/include/pbbam/ZmwType.h new file mode 100644 index 0000000..6447cc7 --- /dev/null +++ b/include/pbbam/ZmwType.h @@ -0,0 +1,28 @@ +// File Description +/// \file ZmwType.h +/// \brief Defines the ZmwType enum. +// +// Author: Armin Töpfer + +#ifndef ZMWTYPE_H +#define ZMWTYPE_H + +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the different ZMW categories of scraps +/// +enum class ZmwType : char +{ + CONTROL = 'C', + MALFORMED = 'M', + NORMAL = 'N', + SENTINEL = 'S' +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ZMWTYPE_H diff --git a/include/pbbam/ZmwTypeMap.h b/include/pbbam/ZmwTypeMap.h new file mode 100644 index 0000000..8d871d4 --- /dev/null +++ b/include/pbbam/ZmwTypeMap.h @@ -0,0 +1,30 @@ +// File Description +/// \file ZmwTypeMap.h +/// \brief Defines the ZmwTypeMap class. +// +// Author: Armin Töpfer + +#ifndef ZMWTYPEMAP_H +#define ZMWTYPEMAP_H + +#include + +#include "pbbam/Config.h" +#include "pbbam/ZmwType.h" + +namespace PacBio { +namespace BAM { + +/// \brief The ZmwTypeMap class provides mapping between char codes and +/// ZmwType enum keys. +/// +class ZmwTypeMap +{ +public: + static std::map ParseChar; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ZMWTYPEMAP_H diff --git a/include/pbbam/exception/BundleChemistryMappingException.h b/include/pbbam/exception/BundleChemistryMappingException.h new file mode 100644 index 0000000..2849e04 --- /dev/null +++ b/include/pbbam/exception/BundleChemistryMappingException.h @@ -0,0 +1,43 @@ +// File Description +/// \file BundleChemistryMappingException.h +/// \brief Defines the BundleChemistryMappingException class. +// +// Author: Derek Barnett, Lance Hepler + +#ifndef BUNDLECHEMISTRYMAPPINGEXCEPTION_H +#define BUNDLECHEMISTRYMAPPINGEXCEPTION_H + +#include +#include + +namespace PacBio { +namespace BAM { + +/// \brief The BundleChemistryMappingException class represents an exception +/// that will be thrown when an invalid sequencing chemistry combination +/// is encountered. +/// +class BundleChemistryMappingException : public std::exception +{ +public: + BundleChemistryMappingException(std::string mappingXml, std::string msg) + : mappingXml_(std::move(mappingXml)) + , what_(std::string("invalid ") + mappingXml_ + ": " + std::move(msg)) + { + } + + // This is a work around for the Intel PHI compiler (icpc) + ~BundleChemistryMappingException() throw() {} + +public: + const char* what() const noexcept override { return what_.c_str(); } + +protected: + std::string mappingXml_; + std::string what_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // BUNDLECHEMISTRYMAPPINGEXCEPTION_H diff --git a/include/pbbam/exception/InvalidSequencingChemistryException.h b/include/pbbam/exception/InvalidSequencingChemistryException.h new file mode 100644 index 0000000..501aa2e --- /dev/null +++ b/include/pbbam/exception/InvalidSequencingChemistryException.h @@ -0,0 +1,61 @@ +// File Description +/// \file InvalidSequencingChemistryException.h +/// \brief Defines the InvalidSequencingChemistryException class. +// +// Author: Derek Barnett + +#ifndef INVALIDSEQUENCINGCHEMISTRYEXCEPTION_H +#define INVALIDSEQUENCINGCHEMISTRYEXCEPTION_H + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +/// \brief The InvalidSequencingChemistryException class represents an exception +/// that will be thrown when an invalid sequencing chemistry combination +/// is encountered. +/// +class InvalidSequencingChemistryException : public std::exception +{ +public: + InvalidSequencingChemistryException(std::string bindingKit, std::string sequencingKit, + std::string basecallerVersion) + : bindingKit_(std::move(bindingKit)) + , sequencingKit_(std::move(sequencingKit)) + , basecallerVersion_(std::move(basecallerVersion)) + { + std::ostringstream s; + s << "unsupported sequencing chemistry combination:\n" + << " binding kit: " << bindingKit_ << '\n' + << " sequencing kit: " << sequencingKit_ << '\n' + << " basecaller version: " << basecallerVersion_ << '\n'; + what_ = s.str(); + } + + // This is a work around for the Intel PHI compiler (icpc) + ~InvalidSequencingChemistryException() throw() {} + +public: + const std::string& BindingKit() const { return bindingKit_; } + + const std::string& SequencingKit() const { return sequencingKit_; } + + const std::string& BasecallerVersion() const { return basecallerVersion_; } + +public: + const char* what() const noexcept override { return what_.c_str(); } + +protected: + std::string bindingKit_; + std::string sequencingKit_; + std::string basecallerVersion_; + std::string what_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // INVALIDSEQUENCINGCHEMISTRYEXCEPTION_H diff --git a/include/pbbam/exception/ValidationException.h b/include/pbbam/exception/ValidationException.h new file mode 100644 index 0000000..0ff7d1d --- /dev/null +++ b/include/pbbam/exception/ValidationException.h @@ -0,0 +1,58 @@ +// File Description +/// \file ValidationException.h +/// \brief Defines the ValidationException class. +// +// Author: Derek Barnett + +#ifndef VALIDATIONEXCEPTION_H +#define VALIDATIONEXCEPTION_H + +#include +#include +#include +#include +#include + +namespace PacBio { +namespace BAM { + +/// \brief The ValidationExecption represents an exception that will be thrown +/// when any error is encountered using the Validator API. In addition to +/// a default display message, it provides programmatic access to all +/// reported error messages. +/// +/// \sa Validator::Validate(const BamRecord& record) +/// +class ValidationException : public std::runtime_error +{ +public: + using ErrorList = std::vector; + using ErrorMap = std::map; + +public: + ValidationException(ErrorMap fileErrors, ErrorMap readGroupErrors, ErrorMap recordErrors); + + // This is a work around for the Intel PHI compiler (icpc) + ~ValidationException() throw() {} + +public: + const ErrorMap& FileErrors() const; + const ErrorMap& ReadGroupErrors() const; + const ErrorMap& RecordErrors() const; + + const char* what() const noexcept override; + +private: + ErrorMap fileErrors_; + ErrorMap readGroupErrors_; + ErrorMap recordErrors_; + std::string msg_; + +private: + void FormatMessage(); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VALIDATIONEXCEPTION_H diff --git a/include/pbbam/internal/Compare.inl b/include/pbbam/internal/Compare.inl new file mode 100644 index 0000000..663556f --- /dev/null +++ b/include/pbbam/internal/Compare.inl @@ -0,0 +1,43 @@ +// File Description +/// \file Compare.inl +/// \brief Inline implementations for the Compare class & inner classes. +// +// Author: Derek Barnett + +#include "pbbam/Compare.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +template struct MemberFnProxy; + +template +struct MemberFnProxy +{ + static R call(const T& obj, Args&&... args) + { + return (obj.*fn)(std::forward(args)...); + } +}; + +} // namespace internal + +template::MemberFnType fn, + typename CompareType> +inline bool Compare::MemberFunctionBase::operator()(const BamRecord& lhs, + const BamRecord& rhs) const +{ + using MemberFnTypeImpl = typename Compare::MemberFunctionBaseHelper::MemberFnType; + using Proxy = internal::MemberFnProxy; + + CompareType cmp; + return cmp(Proxy::call(lhs), Proxy::call(rhs)); +} + +inline bool Compare::None::operator()(const BamRecord&, const BamRecord&) const +{ return false; } + +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/CompositeBamReader.inl b/include/pbbam/internal/CompositeBamReader.inl new file mode 100644 index 0000000..e3155ac --- /dev/null +++ b/include/pbbam/internal/CompositeBamReader.inl @@ -0,0 +1,348 @@ +// File Description +/// \file CompositeBamReader.inl +/// \brief Inline implementations for the composite BAM readers, for +/// working with multiple input files. +// +// Author: Derek Barnett + +#include +#include +#include +#include +#include +#include "pbbam/CompositeBamReader.h" + +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +// ----------------------------------- +// Merging helpers +// ----------------------------------- + +inline CompositeMergeItem::CompositeMergeItem(std::unique_ptr rdr) + : reader{std::move(rdr)} +{} + +inline CompositeMergeItem::CompositeMergeItem(std::unique_ptr rdr, BamRecord rec) + : reader{std::move(rdr)}, record{std::move(rec)} +{} + +template +inline bool CompositeMergeItemSorter::operator()(const CompositeMergeItem& lhs, + const CompositeMergeItem& rhs) const +{ + const auto& l = lhs.record; + const auto& r = rhs.record; + return CompareType()(l, r); +} + +} // namespace internal + +// ----------------------------------- +// GenomicIntervalCompositeBamReader +// ----------------------------------- + +inline GenomicIntervalCompositeBamReader::GenomicIntervalCompositeBamReader( + const std::vector& bamFiles) +{ + filenames_.reserve(bamFiles.size()); + for (const auto& bamFile : bamFiles) + filenames_.push_back(bamFile.Filename()); +} + +inline GenomicIntervalCompositeBamReader::GenomicIntervalCompositeBamReader(const DataSet& dataset) + : GenomicIntervalCompositeBamReader{dataset.BamFiles()} +{} + +inline GenomicIntervalCompositeBamReader::GenomicIntervalCompositeBamReader( + const GenomicInterval& interval, const std::vector& bamFiles) + : GenomicIntervalCompositeBamReader{bamFiles} +{ + Interval(interval); +} + +inline GenomicIntervalCompositeBamReader::GenomicIntervalCompositeBamReader( + const GenomicInterval& interval, const DataSet& dataset) + : GenomicIntervalCompositeBamReader{interval, dataset.BamFiles()} +{} + +inline bool GenomicIntervalCompositeBamReader::GetNext(BamRecord& record) +{ + // nothing left to read + if (mergeItems_.empty()) return false; + + // non-destructive 'pop' of first item from queue + auto firstIter = mergeItems_.begin(); + auto firstItem = + internal::CompositeMergeItem{std::move(firstIter->reader), std::move(firstIter->record)}; + mergeItems_.pop_front(); + + // store its record in our output record + std::swap(record, firstItem.record); + + // try fetch 'next' from first item's reader + // if successful, re-insert it into container & re-sort on our new values + // otherwise, this item will go out of scope & reader destroyed + if (firstItem.reader->GetNext(firstItem.record)) { + mergeItems_.push_front(std::move(firstItem)); + UpdateSort(); + } + + // return success + return true; +} + +inline const GenomicInterval& GenomicIntervalCompositeBamReader::Interval() const +{ + return interval_; +} + +inline GenomicIntervalCompositeBamReader& GenomicIntervalCompositeBamReader::Interval( + const GenomicInterval& interval) +{ + std::deque updatedMergeItems; + std::set filesToCreate{filenames_.cbegin(), filenames_.cend()}; + + // update existing readers + while (!mergeItems_.empty()) { + + // non-destructive 'pop' of first item from queue + auto firstIter = mergeItems_.begin(); + internal::CompositeMergeItem firstItem{std::move(firstIter->reader), + std::move(firstIter->record)}; + mergeItems_.pop_front(); + + // reset interval + auto* baiReader = dynamic_cast(firstItem.reader.get()); + assert(baiReader); + baiReader->Interval(interval); + + // try fetch 'next' from first item's reader + // if successful, re-insert it into container & re-sort on our new values + // otherwise, this item will go out of scope & reader destroyed + if (firstItem.reader->GetNext(firstItem.record)) { + updatedMergeItems.push_front(std::move(firstItem)); + filesToCreate.erase(firstItem.reader->Filename()); + } + } + + // create readers for files that were not 'active' for the previous + std::vector missingBai; + for (auto&& fn : filesToCreate) { + BamFile bamFile{fn}; + if (bamFile.StandardIndexExists()) { + internal::CompositeMergeItem item{ + std::unique_ptr{new BaiIndexedBamReader{interval, std::move(bamFile)}}}; + if (item.reader->GetNext(item.record)) updatedMergeItems.push_back(std::move(item)); + // else not an error, simply no data matching interval + } else { + // maybe handle PBI-backed interval searches if BAI missing, but for now treat as error + missingBai.push_back(bamFile.Filename()); + } + } + + // throw if any files missing BAI + if (!missingBai.empty()) { + std::ostringstream e; + e << "GenomicIntervalCompositeBamReader: failed to open because the following files are " + "missing a *.bai index:\n"; + for (const auto& fn : missingBai) + e << " " << fn << '\n'; + throw std::runtime_error{e.str()}; + } + + // update our actual container and return + mergeItems_ = std::move(updatedMergeItems); + UpdateSort(); + return *this; +} + +struct OrderByPosition +{ + static inline bool less_than(const BamRecord& lhs, const BamRecord& rhs) + { + const int32_t lhsId = lhs.ReferenceId(); + const int32_t rhsId = rhs.ReferenceId(); + if (lhsId == -1) return false; + if (rhsId == -1) return true; + + if (lhsId == rhsId) + return lhs.ReferenceStart() < rhs.ReferenceStart(); + else + return lhsId < rhsId; + } + + static inline bool equals(const BamRecord& lhs, const BamRecord& rhs) + { + return lhs.ReferenceId() == rhs.ReferenceId() && + lhs.ReferenceStart() == rhs.ReferenceStart(); + } +}; + +struct PositionSorter + : std::binary_function +{ + bool operator()(const internal::CompositeMergeItem& lhs, + const internal::CompositeMergeItem& rhs) const + { + const BamRecord& l = lhs.record; + const BamRecord& r = rhs.record; + return OrderByPosition::less_than(l, r); + } +}; + +inline void GenomicIntervalCompositeBamReader::UpdateSort() +{ + std::sort(mergeItems_.begin(), mergeItems_.end(), PositionSorter{}); +} + +// ------------------------------ +// PbiRequestCompositeBamReader +// ------------------------------ + +template +inline PbiFilterCompositeBamReader::PbiFilterCompositeBamReader( + const PbiFilter& filter, const std::vector& bamFiles) + : PbiFilterCompositeBamReader{filter, bamFiles, MakePbiIndexCache(bamFiles)} +{} + +template +inline PbiFilterCompositeBamReader::PbiFilterCompositeBamReader( + const PbiFilter& filter, const std::vector& bamFiles, const PbiIndexCache& cache) + : indexCache_{cache}, numReads_{0} +{ + filenames_.reserve(bamFiles.size()); + for (const auto& bamFile : bamFiles) + filenames_.push_back(bamFile.Filename()); + Filter(filter); +} + +template +inline PbiFilterCompositeBamReader::PbiFilterCompositeBamReader( + const PbiFilter& filter, const DataSet& dataset) + : PbiFilterCompositeBamReader{filter, dataset.BamFiles()} +{} + +template +inline PbiFilterCompositeBamReader::PbiFilterCompositeBamReader( + const PbiFilter& filter, const DataSet& dataset, const PbiIndexCache& cache) + : PbiFilterCompositeBamReader{filter, dataset.BamFiles(), cache} +{} + +template +inline bool PbiFilterCompositeBamReader::GetNext(BamRecord& record) +{ + // nothing left to read + if (mergeQueue_.empty()) return false; + + // non-destructive 'pop' of first item from queue + auto firstIter = mergeQueue_.begin(); + value_type firstItem{std::move(firstIter->reader), std::move(firstIter->record)}; + mergeQueue_.pop_front(); + + // store its record in our output record + std::swap(record, firstItem.record); + + // try fetch 'next' from first item's reader + // if successful, re-insert it into container & re-sort on our new values + // otherwise, this item will go out of scope & reader destroyed + if (firstItem.reader->GetNext(firstItem.record)) { + mergeQueue_.push_front(std::move(firstItem)); + UpdateSort(); + } + + // return success + return true; +} + +template +inline PbiFilterCompositeBamReader& PbiFilterCompositeBamReader::Filter( + const PbiFilter& filter) +{ + // std::cerr << "PbiFilterCompositeBamReader::Filter()\n"; + + // reset reader queue + mergeQueue_.clear(); + + // create readers for files + container_type updatedMergeItems; + std::vector missingPbi; + for (size_t i = 0; i < filenames_.size(); ++i) { + const BamFile bamFile{filenames_.at(i)}; + if (bamFile.PacBioIndexExists()) { + auto item = internal::CompositeMergeItem{std::unique_ptr{ + new PbiIndexedBamReader{filter, std::move(bamFile), indexCache_->at(i)}}}; + if (item.reader->GetNext(item.record)) updatedMergeItems.push_back(std::move(item)); + // else not an error, simply no data matching filter + } else + missingPbi.push_back(filenames_.at(i)); + } + + // throw if any files missing PBI + if (!missingPbi.empty()) { + std::ostringstream e; + e << "PbiFilterCompositeBamReader: failed to open because the following files are " + "missing a *.pbi index:\n"; + for (const auto& fn : missingPbi) + e << " " << fn << '\n'; + throw std::runtime_error{e.str()}; + } + + // update our actual container, store num matching reads, sort & and return + mergeQueue_ = std::move(updatedMergeItems); + numReads_ = 0; + for (const auto& item : mergeQueue_) { + auto* pbiReader = dynamic_cast(item.reader.get()); + numReads_ += pbiReader->NumReads(); + } + UpdateSort(); + return *this; +} + +template +inline uint32_t PbiFilterCompositeBamReader::NumReads() const +{ + return numReads_; +} + +template +inline void PbiFilterCompositeBamReader::UpdateSort() +{ + std::stable_sort(mergeQueue_.begin(), mergeQueue_.end(), merge_sorter_type{}); +} + +// ------------------------------ +// SequentialCompositeBamReader +// ------------------------------ + +inline SequentialCompositeBamReader::SequentialCompositeBamReader(std::vector bamFiles) +{ + for (auto&& bamFile : bamFiles) + readers_.emplace_back(std::make_unique(std::move(bamFile))); +} + +inline SequentialCompositeBamReader::SequentialCompositeBamReader(const DataSet& dataset) + : SequentialCompositeBamReader{dataset.BamFiles()} +{} + +inline bool SequentialCompositeBamReader::GetNext(BamRecord& record) +{ + // try first reader, if successful return true + // else pop reader and try next, until all readers exhausted + while (!readers_.empty()) { + auto& reader = readers_.front(); + if (reader->GetNext(record)) + return true; + else + readers_.pop_front(); + } + + // no readers available + return false; +} + +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/DataSetBaseTypes.h b/include/pbbam/internal/DataSetBaseTypes.h new file mode 100644 index 0000000..c519704 --- /dev/null +++ b/include/pbbam/internal/DataSetBaseTypes.h @@ -0,0 +1,147 @@ +// Author: Derek Barnett + +#ifndef DATASETBASETYPES_H +#define DATASETBASETYPES_H + +#include +#include "pbbam/Config.h" +#include "pbbam/internal/DataSetElement.h" + +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); + BaseEntityType(const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd = XsdType::BASE_DATA_MODEL); + +public: + const std::string& CreatedAt() const; + const std::string& Description() const; + const PacBio::BAM::Extensions& Extensions() const; + const std::string& Format() const; + const std::string& ModifiedAt() const; + const std::string& Name() const; + const std::string& ResourceId() const; + const std::string& Tags() const; + const std::string& Version() const; + + std::string& CreatedAt(); + std::string& Description(); + PacBio::BAM::Extensions& Extensions(); + std::string& Format(); + std::string& ModifiedAt(); + std::string& Name(); + std::string& ResourceId(); + std::string& Tags(); + std::string& Version(); + + 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); + DataEntityType(const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd = XsdType::BASE_DATA_MODEL); + +public: + const std::string& Checksum() const; + const std::string& EncodedValue() const; + const std::string& MetaType() const; + const std::string& SimpleValue() const; + const std::string& TimeStampedName() const; + const std::string& UniqueId() const; + const std::string& ValueDataType() const; + + std::string& Checksum(); + std::string& EncodedValue(); + std::string& MetaType(); + std::string& SimpleValue(); + std::string& TimeStampedName(); + std::string& UniqueId(); + std::string& ValueDataType(); + + 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& metatype, const std::string& label, + const XsdType& xsd = XsdType::BASE_DATA_MODEL); + StrictEntityType(const std::string& metatype, const std::string& label, + const FromInputXml& fromInputXml, + const XsdType& xsd = XsdType::BASE_DATA_MODEL); + +public: + const std::string& MetaType() const; + const std::string& TimeStampedName() const; + const std::string& UniqueId() const; + + std::string& MetaType(); + std::string& TimeStampedName(); + std::string& UniqueId(); + + 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& metatype, const std::string& filename, + const std::string& label, const XsdType& xsd = XsdType::BASE_DATA_MODEL); + InputOutputDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd = XsdType::BASE_DATA_MODEL); +}; + +class IndexedDataType : public InputOutputDataType +{ +protected: + IndexedDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const XsdType& xsd = XsdType::BASE_DATA_MODEL); + IndexedDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd = XsdType::BASE_DATA_MODEL); + +public: + const PacBio::BAM::FileIndices& FileIndices() const; + PacBio::BAM::FileIndices& FileIndices(); + IndexedDataType& FileIndices(const PacBio::BAM::FileIndices& indices); +}; + +} // namespace internal +} // namespace BAM +} // namespace PacBio + +#endif // DATASETBASETYPES_H diff --git a/include/pbbam/internal/DataSetElement.h b/include/pbbam/internal/DataSetElement.h new file mode 100644 index 0000000..fa19bb7 --- /dev/null +++ b/include/pbbam/internal/DataSetElement.h @@ -0,0 +1,211 @@ +// Author: Derek Barnett + +#ifndef DATASETELEMENT_H +#define DATASETELEMENT_H + +#include "pbbam/DataSetXsd.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +class XmlName +{ + // qualified name + // | + // -------------- + // + // ---- --------- + // | | + // prefix local name + +public: + XmlName(std::string fullName, bool verbatim = false); + XmlName(const std::string& localName, const std::string& prefix); + + XmlName(const XmlName&) = default; + XmlName(XmlName&&) = default; + XmlName& operator=(const XmlName&) = default; + XmlName& operator=(XmlName&&) = default; + ~XmlName() = default; + +public: + bool operator==(const XmlName& other) const; + bool operator!=(const XmlName& other) const; + +public: + const boost::string_ref LocalName() const; + const boost::string_ref Prefix() const; + const std::string& QualifiedName() const; + bool Verbatim() const; + +private: + std::string qualifiedName_; + size_t prefixSize_; + size_t localNameOffset_; + size_t localNameSize_; + bool verbatim_; +}; + +struct FromInputXml +{ +}; + +class DataSetElement +{ +public: + DataSetElement(const std::string& label, const XsdType& xsd = XsdType::NONE); + DataSetElement(const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd = XsdType::NONE); + + DataSetElement(const DataSetElement&) = default; + DataSetElement(DataSetElement&&) = default; + DataSetElement& operator=(const DataSetElement&) = default; + DataSetElement& operator=(DataSetElement&&) = default; + virtual ~DataSetElement() = default; + +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& Attributes() const; + std::map& Attributes(); + bool HasAttribute(const std::string& name) const; + + const std::vector>& Children() const; + std::vector>& Children(); + bool HasChild(const std::string& label) const; + + const boost::string_ref LocalNameLabel() const; + const boost::string_ref PrefixLabel() const; + const std::string& QualifiedNameLabel() const; + bool IsVerbatimLabel() const; + + const std::string& Text() const; + std::string& Text(); + + const XsdType& Xsd() 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() const; + size_t NumChildren() const; + size_t Size() const; + +public: + template + void AddChild(const T& e); + + void AddChild(const DataSetElement& e); + void AddChild(std::shared_ptr e); + void RemoveChild(const DataSetElement& e); + + template + const T& Child(size_t index) const; + + template + T& Child(size_t index); + + template + const T& Child(const std::string& label) const; + + template + T& Child(const std::string& label); + + template + const T& operator[](size_t index) const; + + template + T& operator[](size_t index); + + template + const T& operator[](const std::string& label) const; + + template + T& operator[](const std::string& label); + +protected: + static const std::string& SharedNullString(); + +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 attributes_; + std::vector> children_; + +private: + int IndexOf(const std::string& label) const; +}; + +class DataSetElementIteratorBase +{ +public: + bool operator==(const DataSetElementIteratorBase& other) const; + bool operator!=(const DataSetElementIteratorBase& other) const; + +protected: + DataSetElementIteratorBase(const DataSetElement* parent, size_t i); + void Advance(); + +protected: + const DataSetElement* parent_; + size_t index_; +}; + +template +class DataSetElementIterator : public DataSetElementIteratorBase +{ +public: + DataSetElementIterator(const DataSetElement* parent, size_t i); + + T& operator*(); + T* operator->(); + + DataSetElementIterator& operator++(); + DataSetElementIterator operator++(int); +}; + +template +class DataSetElementConstIterator : public DataSetElementIteratorBase +{ +public: + DataSetElementConstIterator(const DataSetElement* parent, size_t i); + + const T& operator*() const; + const T* operator->() const; + + DataSetElementConstIterator& operator++(); + DataSetElementConstIterator operator++(int); +}; + +} // 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..7f87e74 --- /dev/null +++ b/include/pbbam/internal/DataSetElement.inl @@ -0,0 +1,409 @@ +// Author: Derek Barnett + +#include "pbbam/internal/DataSetElement.h" + +#include +#include +#include +#include + +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 std::string& label, const FromInputXml&, + const XsdType& xsd) + : xsd_(xsd), label_(label, true) +{ +} + +inline bool DataSetElement::operator==(const DataSetElement& other) const +{ + return std::tie(xsd_, label_, text_, attributes_, children_) == + std::tie(other.xsd_, other.label_, other.text_, other.attributes_, other.children_); +} + +inline bool DataSetElement::operator!=(const DataSetElement& other) const +{ + return !(*this == other); +} + +template +const T& DataSetElement::operator[](size_t index) const +{ + return Child(index); +} + +template +T& DataSetElement::operator[](size_t index) +{ + return Child(index); +} + +template +const T& DataSetElement::operator[](const std::string& label) const +{ + return Child(label); +} + +template +T& DataSetElement::operator[](const std::string& label) +{ + return Child(label); +} + +template +inline void DataSetElement::AddChild(const T& e) +{ + children_.push_back(std::make_shared(e)); +} + +inline void DataSetElement::AddChild(const DataSetElement& e) +{ + children_.push_back(std::make_shared(e)); +} + +inline void DataSetElement::AddChild(std::shared_ptr 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& DataSetElement::Attributes() const +{ + return attributes_; +} + +inline std::map& DataSetElement::Attributes() { return attributes_; } + +template +inline const T& DataSetElement::Child(size_t index) const +{ + DataSetElement* child = children_.at(index).get(); + if (child == nullptr) + throw std::runtime_error{"DataSetElement: cannot access null child at index: " + std::to_string(index)}; + const T* c = dynamic_cast(child); + return *c; +} + +template +inline T& DataSetElement::Child(size_t index) +{ + DataSetElement* child = children_.at(index).get(); + if (child == nullptr) + throw std::runtime_error{"DataSetElement: cannot access null child at index: " + std::to_string(index)}; + T* c = dynamic_cast(child); + return *c; +} + +template +inline const T& DataSetElement::Child(const std::string& label) const +{ + const auto index = IndexOf(label); + return Child(index); +} + +template +inline T& DataSetElement::Child(const std::string& label) +{ + const int i = IndexOf(label); + if (i >= 0) { + assert(static_cast(i) < NumChildren()); + return Child(i); + } else { + AddChild(T()); + return Child(NumChildren() - 1); + } +} + +template <> +inline DataSetElement& DataSetElement::Child(const std::string& label) +{ + const int i = IndexOf(label); + if (i >= 0) { + assert(static_cast(i) < NumChildren()); + return Child(i); + } else { + AddChild(DataSetElement{label}); + return Child(NumChildren() - 1); + } +} + +inline const std::vector>& DataSetElement::Children() const +{ + return children_; +} + +inline std::vector>& DataSetElement::Children() +{ + return children_; +} + +inline const std::string& DataSetElement::ChildText(const std::string& label) const +{ + if (!HasChild(label)) return SharedNullString(); + return Child(label).Text(); +} + +inline std::string& DataSetElement::ChildText(const std::string& label) +{ + if (!HasChild(label)) AddChild(DataSetElement(label)); + return Child(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).get()); + if (child.LocalNameLabel() == label || child.QualifiedNameLabel() == label || + child.label_ == label) + return i; + } + return -1; +} + +inline const boost::string_ref DataSetElement::LocalNameLabel() const { return label_.LocalName(); } + +inline const boost::string_ref DataSetElement::PrefixLabel() const { return label_.Prefix(); } + +inline const std::string& DataSetElement::QualifiedNameLabel() const +{ + return label_.QualifiedName(); +} + +inline void DataSetElement::Label(const std::string& label) { label_ = XmlName(label, true); } + +inline size_t DataSetElement::NumAttributes() const { return attributes_.size(); } + +inline size_t DataSetElement::NumChildren() const { return children_.size(); } + +inline size_t DataSetElement::Size() const { return children_.size(); } + +inline void DataSetElement::RemoveChild(const DataSetElement& e) +{ + std::vector> newChildren; + for (std::shared_ptr& child : children_) { + if (*(child.get()) != e) newChildren.push_back(std::move(child)); + } + children_ = std::move(newChildren); +} + +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(label).Text(text); + } +} + +inline bool DataSetElement::IsVerbatimLabel() const { return label_.Verbatim(); } + +inline const std::string& DataSetElement::Text() const { return text_; } + +inline std::string& DataSetElement::Text() { return text_; } + +inline void DataSetElement::Text(const std::string& text) { text_ = text; } + +inline const XsdType& DataSetElement::Xsd() const { return xsd_; } + +// ---------------------------- +// DataSetElementIteratorBase +// ---------------------------- + +inline DataSetElementIteratorBase::DataSetElementIteratorBase(const DataSetElement* parent, + size_t i) + : parent_(parent), index_(i) +{ +} + +inline bool DataSetElementIteratorBase::operator==(const DataSetElementIteratorBase& other) const +{ + return (parent_ == other.parent_) && (index_ == other.index_); +} + +inline bool DataSetElementIteratorBase::operator!=(const DataSetElementIteratorBase& other) const +{ + return !(*this == other); +} + +inline void DataSetElementIteratorBase::Advance() +{ + if (index_ >= parent_->NumChildren()) { + parent_ = nullptr; + return; + } + ++index_; +} + +// ------------------------ +// DataSetElementIterator +// ------------------------ + +template +inline DataSetElementIterator::DataSetElementIterator(const DataSetElement* parent, size_t i) + : DataSetElementIteratorBase(parent, i) +{ +} + +template +inline T& DataSetElementIterator::operator*() +{ + return parent_->template Child(index_); +} + +template +inline T* DataSetElementIterator::operator->() +{ + return &(operator*()); +} + +template +inline DataSetElementIterator& DataSetElementIterator::operator++() +{ + Advance(); + return *this; +} + +template +inline DataSetElementIterator DataSetElementIterator::operator++(int) +{ + DataSetElementIterator result(*this); + ++(*this); + return result; +} + +// ----------------------------- +// DataSetElementConstIterator +// ----------------------------- + +template +inline DataSetElementConstIterator::DataSetElementConstIterator(const DataSetElement* parent, + size_t i) + : DataSetElementIteratorBase(parent, i) +{ +} + +template +inline const T& DataSetElementConstIterator::operator*() const +{ + return parent_->template Child(index_); +} + +template +inline const T* DataSetElementConstIterator::operator->() const +{ + return &(operator*()); +} + +template +inline DataSetElementConstIterator& DataSetElementConstIterator::operator++() +{ + Advance(); + return *this; +} + +template +DataSetElementConstIterator DataSetElementConstIterator::operator++(int) +{ + DataSetElementConstIterator result(*this); + ++(*this); + return result; +} + +// ---------------- +// XmlName +// ---------------- + +inline XmlName::XmlName(std::string fullName, bool verbatim) + : qualifiedName_(std::move(fullName)) + , prefixSize_(0) + , localNameOffset_(0) + , localNameSize_(0) + , verbatim_(verbatim) +{ + 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_; +} + +inline XmlName::XmlName(const std::string& localName, const std::string& prefix) + : prefixSize_(prefix.size()) + , localNameOffset_(prefixSize_) + , localNameSize_(localName.size()) + , verbatim_(true) +{ + 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 bool XmlName::operator==(const XmlName& other) const +{ + return qualifiedName_ == other.qualifiedName_; +} + +inline bool XmlName::operator!=(const XmlName& other) const { return !(*this == other); } + +inline const boost::string_ref XmlName::LocalName() const +{ + return boost::string_ref(qualifiedName_.data() + localNameOffset_, localNameSize_); +} + +inline const boost::string_ref XmlName::Prefix() const +{ + return boost::string_ref(qualifiedName_.data(), prefixSize_); +} + +inline const std::string& XmlName::QualifiedName() const { return qualifiedName_; } + +inline bool XmlName::Verbatim() const { return verbatim_; } + +} // namespace internal +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/Interval.inl b/include/pbbam/internal/Interval.inl new file mode 100644 index 0000000..b804b15 --- /dev/null +++ b/include/pbbam/internal/Interval.inl @@ -0,0 +1,78 @@ +// File Description +/// \file Interval.inl +/// \brief Inline implementations for the Interval class. +// +// Author: Derek Barnett + +#include "pbbam/Interval.h" + +namespace PacBio { +namespace BAM { + +template +inline Interval::Interval() + : data_{boost::icl::discrete_interval::right_open(0,0)} +{ } + +template +inline Interval::Interval(const T val) + : data_{boost::icl::discrete_interval::right_open(val,val+1)} +{ } + +template +inline Interval::Interval(const T start, const T stop) + : data_{boost::icl::discrete_interval::right_open(start,stop)} +{ } + +template +inline bool Interval::operator==(const Interval& other) const +{ return data_ == other.data_; } + +template +inline bool Interval::operator!=(const Interval& other) const +{ return !(data_ == other.data_); } + +template +inline bool Interval::CoveredBy(const Interval& other) const +{ return boost::icl::within(data_, other.data_); } + +template +inline bool Interval::Covers(const Interval& other) const +{ return boost::icl::contains(data_, other.data_); } + +template +inline bool Interval::Intersects(const Interval& other) const +{ return boost::icl::intersects(data_, other.data_); } + +template +inline bool Interval::IsValid() const +{ return !boost::icl::is_empty(data_); } + +template +inline size_t Interval::Length() const +{ return boost::icl::length(data_); } + +template +inline T Interval::Start() const +{ return data_.lower(); } + +template +inline Interval& Interval::Start(const T& start) +{ + data_ = boost::icl::discrete_interval::right_open(start, data_.upper()); + return *this; +} + +template +inline T Interval::Stop() const +{ return data_.upper(); } + +template +inline Interval& Interval::Stop(const T& stop) +{ + data_ = boost::icl::discrete_interval::right_open(data_.lower(), stop); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/PbiBasicTypes.inl b/include/pbbam/internal/PbiBasicTypes.inl new file mode 100644 index 0000000..3024f6a --- /dev/null +++ b/include/pbbam/internal/PbiBasicTypes.inl @@ -0,0 +1,28 @@ +// File Description +/// \file PbiBasicTypes.inl +/// \brief Inline implementations for the basic data structures used in PBI lookups. +// +// Author: Derek Barnett + +#include "pbbam/PbiBasicTypes.h" + +namespace PacBio { +namespace BAM { + +inline IndexResultBlock::IndexResultBlock(size_t idx, size_t numReads) + : firstIndex_{idx} + , numReads_{numReads} +{ } + +inline bool IndexResultBlock::operator==(const IndexResultBlock& other) const +{ + return firstIndex_ == other.firstIndex_ && + numReads_ == other.numReads_ && + virtualOffset_ == other.virtualOffset_; +} + +inline bool IndexResultBlock::operator!=(const IndexResultBlock& other) const +{ return !(*this == other); } + +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/PbiFilter.inl b/include/pbbam/internal/PbiFilter.inl new file mode 100644 index 0000000..acf0258 --- /dev/null +++ b/include/pbbam/internal/PbiFilter.inl @@ -0,0 +1,241 @@ +// File Description +/// \file PbiFilter.inl +/// \brief Inline implementations for the PbiFilter class. +// +// Author: Derek Barnett + +#include "pbbam/PbiFilter.h" + +#include +#include +#include +#include +#include + +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +/// \internal +/// +/// This class wraps a the basic PBI filter (whether property filter or some operator +/// e.g. union, intersect, etc.). The wrapper allows PbiFilters to hold heterogeneous, +/// recursive filter types - without exposing pointers & worrying about memory ownership +/// issues between client & library. +/// +/// Filters can be given by value from client code and we will wrap them for composition. +/// +/// \code{.cpp} +/// PbiFilter f1(PbiZmwFilter(42)); +/// PbiFilter f2; +/// f2.Add(PbiQueryLengthFilter(3000, GREATER_THAN_EQUAL)); +/// f2.Add(MyApplicationCustomFilter("foo")); +/// PbiFilter intersect = PbiFilter::Intersect(f1, f2); +/// ... +/// \endcode +/// +struct FilterWrapper +{ +public: + template FilterWrapper(T x); + + FilterWrapper(const FilterWrapper& other); + FilterWrapper(FilterWrapper&&) noexcept = default; + FilterWrapper& operator=(const FilterWrapper& other); + FilterWrapper& operator=(FilterWrapper&&) noexcept = default; + ~FilterWrapper() = default; + +public: + bool Accepts(const PacBio::BAM::PbiRawData& idx, const size_t row) const; + +private: + struct WrapperInterface + { + virtual ~WrapperInterface() = default; + virtual WrapperInterface* Clone() const =0; + virtual bool Accepts(const PacBio::BAM::PbiRawData& idx, + const size_t row) const =0; + }; + + template + struct WrapperImpl : public WrapperInterface + { + WrapperImpl(T x); + WrapperImpl(const WrapperImpl& other); + WrapperInterface* Clone() const override; + bool Accepts(const PacBio::BAM::PbiRawData& idx, + const size_t row) const override; + T data_; + }; + +private: + std::unique_ptr self_; +}; + +// --------------- +// FilterWrapper +// --------------- + +template +inline FilterWrapper::FilterWrapper(T x) + : self_{std::make_unique>(std::move(x))} +{ } + +inline FilterWrapper::FilterWrapper(const FilterWrapper& other) + : self_{other.self_->Clone()} +{ } + +inline FilterWrapper& FilterWrapper::operator=(const FilterWrapper& other) +{ + self_.reset(other.self_->Clone()); + return *this; +} + +inline bool FilterWrapper::Accepts(const PbiRawData& idx, const size_t row) const +{ return self_->Accepts(idx, row); } + +// ---------------- +// WrapperImpl +// ---------------- + +template +inline FilterWrapper::WrapperImpl::WrapperImpl(T x) + : FilterWrapper::WrapperInterface{} + , data_(std::move(x)) +{ + BOOST_CONCEPT_ASSERT((PbiFilterConcept)); +} + +template +inline FilterWrapper::WrapperImpl::WrapperImpl(const WrapperImpl& other) + : FilterWrapper::WrapperInterface{} + , data_(other.data_) +{ } + +template +inline FilterWrapper::WrapperInterface* FilterWrapper::WrapperImpl::Clone() const +{ return new WrapperImpl(*this); } + +template +inline bool FilterWrapper::WrapperImpl::Accepts(const PbiRawData& idx, + const size_t row) const +{ return data_.Accepts(idx, row); } + +struct PbiFilterPrivate +{ + PbiFilterPrivate(PbiFilter::CompositionType type = PbiFilter::INTERSECT) + : type_{type} + { } + + template + void Add(T filter) + { + filters_.emplace_back(std::move(filter)); + } + + std::unique_ptr DeepCopy() + { + auto copy = std::make_unique(type_); + copy->filters_ = this->filters_; + return copy; + } + + bool Accepts(const PbiRawData& idx, const size_t row) const + { + // no filter -> accepts every record + if (filters_.empty()) + return true; + + // intersection of child filters + if (type_ == PbiFilter::INTERSECT) { + for (const auto& filter : filters_) { + if (!filter.Accepts(idx, row)) + return false; // break early on failure + } + return true; // all passed + } + + // union of child filters + else if (type_ == PbiFilter::UNION) { + for (const auto& filter : filters_) { + if (filter.Accepts(idx, row)) + return true; // break early on pass + } + return false; // none passed + } + + else + //assert(false); // invalid composite filter type + throw std::runtime_error{"PbiFilter: invalid composite filter type"}; + } + + PbiFilter::CompositionType type_; + std::vector filters_; +}; + +} // namespace internal + +inline PbiFilter::PbiFilter(const CompositionType type) + : d_{std::make_unique(type) } +{ } + +template inline +PbiFilter::PbiFilter(T filter) + : d_{std::make_unique() } +{ + Add(std::move(filter)); +} + +inline PbiFilter::PbiFilter(std::vector filters) + : d_{std::make_unique() } +{ + Add(std::move(filters)); +} + +inline PbiFilter::PbiFilter(const PbiFilter& other) + : d_{ other.d_->DeepCopy() } +{ } + +inline PbiFilter& PbiFilter::operator=(const PbiFilter& other) +{ + d_ = other.d_->DeepCopy(); + return *this; +} + +inline bool PbiFilter::Accepts(const PacBio::BAM::PbiRawData& idx, + const size_t row) const +{ return d_->Accepts(idx, row); } + +template +inline PbiFilter& PbiFilter::Add(T filter) +{ + d_->Add(std::move(filter)); + return *this; +} + +inline PbiFilter& PbiFilter::Add(PbiFilter filter) +{ + d_->Add(std::move(filter)); + return *this; +} + +inline PbiFilter& PbiFilter::Add(std::vector filters) +{ + for (auto&& filter : filters) + d_->Add(std::move(filter)); + return *this; +} + +inline bool PbiFilter::IsEmpty() const +{ return d_->filters_.empty(); } + +inline size_t PbiFilter::NumChildren() const +{ return d_->filters_.size(); } + +inline PbiFilter::CompositionType PbiFilter::Type() const +{ return d_->type_; } + +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/PbiFilterTypes.inl b/include/pbbam/internal/PbiFilterTypes.inl new file mode 100644 index 0000000..a4a701a --- /dev/null +++ b/include/pbbam/internal/PbiFilterTypes.inl @@ -0,0 +1,469 @@ +// File Description +/// \file PbiFilterTypes.inl +/// \brief Inline implementations for the built-in PBI filters. +// +// Author: Derek Barnett + +#include "pbbam/PbiFilterTypes.h" +#include +#include + +#include + +namespace PacBio { +namespace BAM { + +namespace internal { + +template +inline FilterBase::FilterBase(T value, const Compare::Type cmp) + : value_{std::move(value)} + , cmp_{cmp} +{ } + +template +inline FilterBase::FilterBase(std::vector values, const Compare::Type cmp) + : multiValue_{std::move(values)} + , cmp_{cmp} +{ } + +template +inline bool FilterBase::CompareHelper(const T& lhs) const +{ + if (multiValue_ == boost::none) + return CompareSingleHelper(lhs); + else + return CompareMultiHelper(lhs); +} + +template +inline bool FilterBase::CompareMultiHelper(const T& lhs) const +{ + if (cmp_ == Compare::EQUAL) + { + // check provided value against all filter criteria, + // return true on any exact match + auto iter = multiValue_.get().cbegin(); + const auto end = multiValue_.get().cend(); + for (; iter != end; ++iter) { + if (*iter == lhs) + return true; + } + return false; // no matches + } + else if (cmp_ == Compare::NOT_EQUAL) + { + // check provided value against all filter criteria, + // return true on any exact match + auto iter = multiValue_.get().cbegin(); + const auto end = multiValue_.get().cend(); + for (; iter != end; ++iter) { + if (*iter == lhs) + return false; + } + return true; + } + else + throw std::runtime_error{"PbiFilter: multi-valued filters (e.g. whitelists) can only check equality."}; +} + +template +inline bool FilterBase::CompareSingleHelper(const T& lhs) const +{ + return Compare::Check(lhs, value_, cmp_); +} + +template<> +inline bool FilterBase::CompareSingleHelper(const LocalContextFlags& lhs) const +{ + switch(cmp_) { + case Compare::EQUAL: return lhs == value_; + case Compare::LESS_THAN: return lhs < value_; + case Compare::LESS_THAN_EQUAL: return lhs <= value_; + case Compare::GREATER_THAN: return lhs > value_; + case Compare::GREATER_THAN_EQUAL: return lhs >= value_; + case Compare::NOT_EQUAL: return lhs != value_; + case Compare::CONTAINS: return ((lhs & value_) != 0); + case Compare::NOT_CONTAINS: return ((lhs & value_) == 0); + + default: + assert(false); + throw std::runtime_error{"PbiFilter: unknown compare type (" + Compare::TypeToName(cmp_) + ")" }; + } +} + +// BarcodeDataFilterBase + +template +inline BarcodeDataFilterBase::BarcodeDataFilterBase(T value, const Compare::Type cmp) + : FilterBase{std::move(value), cmp} +{ } + +template +inline BarcodeDataFilterBase::BarcodeDataFilterBase(std::vector values, const Compare::Type cmp) + : FilterBase{std::move(values), cmp} +{ } + +template +inline bool BarcodeDataFilterBase::BarcodeDataFilterBase::Accepts(const PbiRawData& idx, + const size_t row) const +{ + const PbiRawBarcodeData& barcodeData = idx.BarcodeData(); + switch (field) { + case PbiFile::BarcodeField::BC_FORWARD: return FilterBase::CompareHelper(barcodeData.bcForward_.at(row)); + case PbiFile::BarcodeField::BC_REVERSE: return FilterBase::CompareHelper(barcodeData.bcReverse_.at(row)); + case PbiFile::BarcodeField::BC_QUALITY: return FilterBase::CompareHelper(barcodeData.bcQual_.at(row)); + default: + assert(false); + throw std::runtime_error{"PbiFilter: unknown barcode field requested."}; + } +} + +// BasicDataFilterBase + +template +inline BasicDataFilterBase::BasicDataFilterBase(T value, const Compare::Type cmp) + : FilterBase{std::move(value), cmp} +{ } + +template +inline BasicDataFilterBase::BasicDataFilterBase(std::vector values, const Compare::Type cmp) + : FilterBase{std::move(values), cmp} +{ } + +template +inline bool BasicDataFilterBase::BasicDataFilterBase::Accepts(const PbiRawData& idx, + const size_t row) const +{ + const PbiRawBasicData& basicData = idx.BasicData(); + switch (field) { + case PbiFile::BasicField::RG_ID: return FilterBase::CompareHelper(basicData.rgId_.at(row)); + case PbiFile::BasicField::Q_START: return FilterBase::CompareHelper(basicData.qStart_.at(row)); + case PbiFile::BasicField::Q_END: return FilterBase::CompareHelper(basicData.qEnd_.at(row)); + case PbiFile::BasicField::ZMW: return FilterBase::CompareHelper(basicData.holeNumber_.at(row)); + case PbiFile::BasicField::READ_QUALITY: return FilterBase::CompareHelper(basicData.readQual_.at(row)); + // NOTE(DB): PbiFile::BasicField::CONTEXT_FLAG has its own specialization + default: + assert(false); + throw std::runtime_error{"PbiFilter: unknown basic data field requested."}; + } +} + +// this typedef exists purely so that the next method signature isn't 2 screen widths long +using LocalContextFilter__ = BasicDataFilterBase; + +template<> +inline bool LocalContextFilter__::BasicDataFilterBase::Accepts(const PbiRawData& idx, + const size_t row) const +{ + const auto& basicData = idx.BasicData(); + const auto rowFlags = static_cast(basicData.ctxtFlag_.at(row)); + return FilterBase::CompareHelper(rowFlags); +} + +// BasicDataFilterBase + +template +inline MappedDataFilterBase::MappedDataFilterBase(T value, const Compare::Type cmp) + : FilterBase{std::move(value), cmp} +{ } + +template +inline MappedDataFilterBase::MappedDataFilterBase(std::vector values, const Compare::Type cmp) + : FilterBase{std::move(values), cmp} +{ } + +template<> +inline bool MappedDataFilterBase::MappedDataFilterBase::Accepts(const PbiRawData& idx, + const size_t row) const +{ + const PbiRawMappedData& mappedData = idx.MappedData(); + const Strand strand = (mappedData.revStrand_.at(row) == 1 ? Strand::REVERSE : Strand::FORWARD); + return FilterBase::CompareHelper(strand); +} + +template +inline bool MappedDataFilterBase::MappedDataFilterBase::Accepts(const PbiRawData& idx, + const size_t row) const +{ + const PbiRawMappedData& mappedData = idx.MappedData(); + switch (field) { + case PbiFile::MappedField::T_ID: return FilterBase::CompareHelper(mappedData.tId_.at(row)); + case PbiFile::MappedField::T_START: return FilterBase::CompareHelper(mappedData.tStart_.at(row)); + case PbiFile::MappedField::T_END: return FilterBase::CompareHelper(mappedData.tEnd_.at(row)); + case PbiFile::MappedField::A_START: return FilterBase::CompareHelper(mappedData.aStart_.at(row)); + case PbiFile::MappedField::A_END: return FilterBase::CompareHelper(mappedData.aEnd_.at(row)); + case PbiFile::MappedField::N_M: return FilterBase::CompareHelper(mappedData.nM_.at(row)); + case PbiFile::MappedField::N_MM: return FilterBase::CompareHelper(mappedData.nMM_.at(row)); + case PbiFile::MappedField::N_DEL: return FilterBase::CompareHelper(mappedData.NumDeletedBasesAt(row)); + case PbiFile::MappedField::N_INS: return FilterBase::CompareHelper(mappedData.NumInsertedBasesAt(row)); + case PbiFile::MappedField::MAP_QUALITY: return FilterBase::CompareHelper(mappedData.mapQV_.at(row)); + default: + assert(false); + throw std::runtime_error{"PbiFilter: unknown mapped data field requested."}; + } +} + +} // namespace internal + +// PbiAlignedEndFilter + +inline PbiAlignedEndFilter::PbiAlignedEndFilter(const uint32_t position, const Compare::Type cmp) + : internal::MappedDataFilterBase{position, cmp} +{ } + +// PbiAlignedLengthFilter + +inline PbiAlignedLengthFilter::PbiAlignedLengthFilter(const uint32_t length, const Compare::Type cmp) + : internal::FilterBase{length, cmp} +{ } + +// PbiAlignedStartFilter + +inline PbiAlignedStartFilter::PbiAlignedStartFilter(const uint32_t position, const Compare::Type cmp) + : internal::MappedDataFilterBase{position, cmp} +{ } + +// PbiAlignedStrandFilter + +inline PbiAlignedStrandFilter::PbiAlignedStrandFilter(const Strand strand, const Compare::Type cmp) + : internal::MappedDataFilterBase{strand, cmp} +{ + if (cmp != Compare::EQUAL && cmp != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: compare type for aligned strand must be either EQUAL or NOT_EQUAL"}; +} + +// PbiBarcodeFilter + +inline PbiBarcodeFilter::PbiBarcodeFilter(const int16_t barcode, const Compare::Type cmp) + : compositeFilter_{ PbiFilter::Union({ PbiBarcodeForwardFilter{barcode,cmp}, + PbiBarcodeReverseFilter{barcode,cmp} + }) + } +{ } + +inline PbiBarcodeFilter::PbiBarcodeFilter(std::vector whitelist, const Compare::Type cmp) + : compositeFilter_{ PbiFilter::Union({ PbiBarcodeForwardFilter{std::move(whitelist), cmp}, + PbiBarcodeReverseFilter{std::move(whitelist), cmp} + }) + } +{ } + +inline bool PbiBarcodeFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ return compositeFilter_.Accepts(idx, row); } + +// PbiBarcodeForwardFilter + +inline PbiBarcodeForwardFilter::PbiBarcodeForwardFilter(const int16_t bcFwdId, const Compare::Type cmp) + : internal::BarcodeDataFilterBase{bcFwdId, cmp} +{ } + +inline PbiBarcodeForwardFilter::PbiBarcodeForwardFilter(std::vector whitelist, const Compare::Type cmp) + : internal::BarcodeDataFilterBase{std::move(whitelist), cmp} +{ } + +// PbiBarcodeQualityFilter + +inline PbiBarcodeQualityFilter::PbiBarcodeQualityFilter(const uint8_t bcQuality, const Compare::Type cmp) + : internal::BarcodeDataFilterBase{bcQuality, cmp} +{ } + +// PbiBarcodeReverseFilter + +inline PbiBarcodeReverseFilter::PbiBarcodeReverseFilter(const int16_t bcRevId, const Compare::Type cmp) + : internal::BarcodeDataFilterBase{bcRevId, cmp} +{ } + +inline PbiBarcodeReverseFilter::PbiBarcodeReverseFilter(std::vector whitelist, const Compare::Type cmp) + : internal::BarcodeDataFilterBase{std::move(whitelist), cmp} +{ } + +// PbiBarcodesFilter + +inline PbiBarcodesFilter::PbiBarcodesFilter(const std::pair barcodes, const Compare::Type cmp) + : PbiBarcodesFilter{barcodes.first, barcodes.second, cmp} +{ } + +inline PbiBarcodesFilter::PbiBarcodesFilter(const int16_t bcForward, const int16_t bcReverse, const Compare::Type cmp) + : compositeFilter_{ PbiFilter::Intersection({ PbiBarcodeForwardFilter{bcForward,cmp}, + PbiBarcodeReverseFilter{bcReverse,cmp} + }) + } +{ } + +inline bool PbiBarcodesFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ return compositeFilter_.Accepts(idx, row); } + +// PbiIdentityFilter + +inline PbiIdentityFilter::PbiIdentityFilter(const float identity, + const Compare::Type cmp) + : internal::FilterBase{identity, cmp} +{ } + +// PbiLocalContextFilter + +inline PbiLocalContextFilter::PbiLocalContextFilter(const LocalContextFlags& flags, + const Compare::Type cmp) + : internal::BasicDataFilterBase{flags, cmp} +{ } + +// PbiMapQualityFilter + +inline PbiMapQualityFilter::PbiMapQualityFilter(const uint8_t mapQual, const Compare::Type cmp) + : internal::MappedDataFilterBase{mapQual, cmp} +{ } + +// PbiMovieNameFilter + +inline bool PbiMovieNameFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + const bool found = compositeFilter_.Accepts(idx, row); + if (cmp_ == Compare::EQUAL) return found; + else if (cmp_ == Compare::NOT_EQUAL) return !found; + else throw std::runtime_error{"unsupported compare type on movie name filter"}; +} + +// PbiNumDeletedBasesFilter + +inline PbiNumDeletedBasesFilter::PbiNumDeletedBasesFilter(const size_t numDeletions, const Compare::Type cmp) + : internal::MappedDataFilterBase{numDeletions, cmp} +{ } + +// PbiNumInsertedBasesFilter + +inline PbiNumInsertedBasesFilter::PbiNumInsertedBasesFilter(const size_t numInsertions, const Compare::Type cmp) + : internal::MappedDataFilterBase{numInsertions, cmp} +{ } + +// PbiNumMatchesFilter + +inline PbiNumMatchesFilter::PbiNumMatchesFilter(const size_t numMatchedBases, const Compare::Type cmp) + : internal::MappedDataFilterBase{numMatchedBases, cmp} +{ } + +// PbiNumMismatchesFilter + +inline PbiNumMismatchesFilter::PbiNumMismatchesFilter(const size_t numMismatchedBases, const Compare::Type cmp) + : internal::MappedDataFilterBase{numMismatchedBases, cmp} +{ } + +// PbiQueryEndFilter + +inline PbiQueryEndFilter::PbiQueryEndFilter(const int32_t position, const Compare::Type cmp) + : internal::BasicDataFilterBase{position, cmp} +{ } + +// PbiQueryLengthFilter + +inline PbiQueryLengthFilter::PbiQueryLengthFilter(const int32_t length, const Compare::Type cmp) + : internal::FilterBase{length, cmp} +{ } + +// PbiQueryStartFilter + +inline PbiQueryStartFilter::PbiQueryStartFilter(const int32_t position, const Compare::Type cmp) + : internal::BasicDataFilterBase{position, cmp} +{ } + +// PbiReadAccuracyFilter + +inline PbiReadAccuracyFilter::PbiReadAccuracyFilter(const Accuracy accuracy, const Compare::Type cmp) + : internal::BasicDataFilterBase{accuracy, cmp} +{ } + +// PbiReferenceEndFilter + +inline PbiReferenceEndFilter::PbiReferenceEndFilter(const uint32_t tEnd, const Compare::Type cmp) + : internal::MappedDataFilterBase{tEnd, cmp} +{ } + +// PbiReferenceIdFilter + +inline PbiReferenceIdFilter::PbiReferenceIdFilter(const int32_t tId, const Compare::Type cmp) + : internal::MappedDataFilterBase{tId, cmp} +{ } + +inline PbiReferenceIdFilter::PbiReferenceIdFilter(std::vector whitelist, const Compare::Type cmp) + : internal::MappedDataFilterBase{std::move(whitelist), cmp} +{ } + +// PbiReferenceStartFilter + +inline PbiReferenceStartFilter::PbiReferenceStartFilter(const uint32_t tStart, const Compare::Type cmp) + : internal::MappedDataFilterBase{tStart, cmp} +{ } + +// PbiZmwFilter + +inline PbiZmwFilter::PbiZmwFilter(const int32_t zmw, const Compare::Type cmp) + : internal::BasicDataFilterBase{zmw, cmp} +{ } + +inline PbiZmwFilter::PbiZmwFilter(std::vector whitelist, const Compare::Type cmp) + : internal::BasicDataFilterBase{std::move(whitelist), cmp} +{ } + +// PbiZmwModuloFilter + +inline PbiZmwModuloFilter::PbiZmwModuloFilter( + const uint32_t denominator, + const uint32_t value, + const FilterHash hashType, + const Compare::Type cmp) + : denominator_{denominator} + , value_{value} + , hash_{hashType} + , cmp_{cmp} +{ } + +inline uint32_t UnsignedLongIntCast(const int32_t zm) +{ + return static_cast(zm); +} + +inline uint32_t BoostHashCombine(const int32_t zm) +{ + constexpr static const uint16_t mask = 0xFFFF; + + const uint16_t upper = (zm >> 16) & mask; + const uint16_t lower = zm & mask; + + // FIXME: discrepancies with Python API. Will return to nail down. + + size_t seed = 0; + boost::hash_combine(seed, upper); + boost::hash_combine(seed, lower); + return static_cast(seed); +} + +inline bool PbiZmwModuloFilter::Accepts(const PbiRawData& idx, + const size_t row) const +{ + const auto zm = idx.BasicData().holeNumber_.at(row); + + uint32_t hashValue; + switch(hash_) + { + case FilterHash::UNSIGNED_LONG_CAST : + { + hashValue = UnsignedLongIntCast(zm); + break; + } + + case FilterHash::BOOST_HASH_COMBINE : + { + hashValue = BoostHashCombine(zm); + break; + } + + default: + throw std::runtime_error{"unsupported filter hash type"}; + } + + const auto modResult = hashValue % denominator_; + return Compare::Check(modResult, value_, cmp_); +} + +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/internal/QueryBase.h b/include/pbbam/internal/QueryBase.h new file mode 100644 index 0000000..13b62b6 --- /dev/null +++ b/include/pbbam/internal/QueryBase.h @@ -0,0 +1,104 @@ +// Author: Derek Barnett + +#ifndef QUERYBASE_H +#define QUERYBASE_H + +#include +#include +#include +#include "pbbam/BamFile.h" +#include "pbbam/BamRecord.h" +#include "pbbam/DataSet.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +template +class QueryBase; + +template +class QueryIteratorBase +{ +public: + ~QueryIteratorBase() = default; + + bool operator==(const QueryIteratorBase& other) const; + bool operator!=(const QueryIteratorBase& other) const; + +protected: + QueryIteratorBase() = default; + QueryIteratorBase(QueryBase& query); + + void ReadNext(); + +protected: + QueryBase* query_ = nullptr; + T record_; +}; + +template +class QueryIterator : public QueryIteratorBase +{ +public: + QueryIterator() = default; + QueryIterator(QueryBase& query); + + T& operator*(); + T* operator->(); + + QueryIterator& operator++(); + QueryIterator operator++(int); +}; + +template +class QueryConstIterator : public QueryIteratorBase +{ +public: + QueryConstIterator() = default; + QueryConstIterator(const QueryBase& query); + + const T& operator*() const; + const T* operator->() const; + + QueryConstIterator& operator++(); + QueryConstIterator operator++(int); +}; + +template +class QueryBase +{ + +public: + using iterator = QueryIterator; + using const_iterator = QueryConstIterator; + +public: + virtual ~QueryBase() = default; + +public: + QueryConstIterator begin() const; + QueryConstIterator cbegin() const; + QueryIterator begin(); + + QueryConstIterator end() const; + QueryConstIterator cend() const; + QueryIterator end(); + +public: + virtual bool GetNext(T& r) = 0; + +protected: + QueryBase() = default; +}; + +using IQuery = QueryBase; +using IGroupQuery = QueryBase>; + +} // namespace internal +} // namespace BAM +} // namespace PacBio + +#include "pbbam/internal/QueryBase.inl" + +#endif // QUERYBASE_H diff --git a/include/pbbam/internal/QueryBase.inl b/include/pbbam/internal/QueryBase.inl new file mode 100644 index 0000000..49cf860 --- /dev/null +++ b/include/pbbam/internal/QueryBase.inl @@ -0,0 +1,122 @@ +// Author: Derek Barnett + +#include "pbbam/internal/QueryBase.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +// ------------------- +// QueryIteratorBase +// ------------------- + +template +inline QueryIteratorBase::QueryIteratorBase(QueryBase& query) + : query_{&query} +{ ReadNext(); } + +template inline +bool QueryIteratorBase::operator==(const QueryIteratorBase& other) const +{ return query_ == other.query_; } + +template inline +bool QueryIteratorBase::operator!=(const QueryIteratorBase& other) const +{ return !(*this == other); } + +// ------------------- +// QueryIterator +// ------------------- + +template inline +QueryIterator::QueryIterator(QueryBase& query) + : QueryIteratorBase{query} +{ } + +template inline +T& QueryIterator::operator*() +{ return QueryIteratorBase::record_; } + +template inline +T* QueryIterator::operator->() +{ return &(operator*()); } + +template inline +QueryIterator& QueryIterator::operator++() +{ QueryIteratorBase::ReadNext(); return *this; } + +template inline +QueryIterator QueryIterator::operator++(int) +{ + QueryIterator result(*this); + ++(*this); + return result; +} + +// -------------------- +// QueryConstIterator +// -------------------- + +template inline +QueryConstIterator::QueryConstIterator(const QueryBase& query) + : QueryIteratorBase{const_cast&>(query)} +{ } + +template inline +const T& QueryConstIterator::operator*() const +{ return QueryIteratorBase::record_; } + +template inline +const T* QueryConstIterator::operator->() const +{ return &(operator*()); } + +template inline +QueryConstIterator& QueryConstIterator::operator++() +{ QueryIteratorBase::ReadNext(); return *this; } + +template inline +QueryConstIterator QueryConstIterator::operator++(int) +{ + QueryConstIterator result(*this); + ++(*this); + return result; +} + +// ----------- +// QueryBase +// ----------- + +template inline +QueryConstIterator QueryBase::begin() const +{ return QueryConstIterator(*this); } + +template inline +QueryIterator QueryBase::begin() +{ return QueryIterator(*this); } + +template inline +QueryConstIterator QueryBase::cbegin() const +{ return QueryConstIterator(*this); } + +template inline +QueryConstIterator QueryBase::cend() const +{ return QueryConstIterator(); } + +template inline +QueryConstIterator QueryBase::end() const +{ return QueryConstIterator(); } + +template inline +QueryIterator QueryBase::end() +{ return QueryIterator(); } + +template +inline void QueryIteratorBase::ReadNext() +{ + assert(query_); + if (!query_->GetNext(record_)) + query_ = nullptr; +} + +} // namespace internal +} // namespace BAM +} // namespace PacBio diff --git a/include/pbbam/vcf/VcfFile.h b/include/pbbam/vcf/VcfFile.h new file mode 100644 index 0000000..9502af2 --- /dev/null +++ b/include/pbbam/vcf/VcfFile.h @@ -0,0 +1,37 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFFILE_H +#define PBBAM_VCF_VCFFILE_H + +#include + +#include + +namespace PacBio { +namespace VCF { + +class VcfFile +{ +public: + explicit VcfFile(std::string fn); + + VcfFile() = delete; + VcfFile(const VcfFile&); + VcfFile(VcfFile&&); + VcfFile& operator=(const VcfFile&); + VcfFile& operator=(VcfFile&&); + ~VcfFile(); + +public: + const std::string& Filename() const; + const VcfHeader& Header() const; + +private: + std::string filename_; + VcfHeader header_; +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFFILE_H diff --git a/include/pbbam/vcf/VcfFormat.h b/include/pbbam/vcf/VcfFormat.h new file mode 100644 index 0000000..6d009d3 --- /dev/null +++ b/include/pbbam/vcf/VcfFormat.h @@ -0,0 +1,105 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFFORMAT_H +#define PBBAM_VCF_VCFFORMAT_H + +#include +#include + +#include +#include + +namespace PacBio { +namespace VCF { + +struct VcfFormat +{ +public: + /// \name General format info + /// \{ + + static const char* CurrentVersion(); + + /// \} + +public: + /// \name Header format + /// \{ + + static VcfHeader ParsedHeader(const std::string& text); + + static std::string FormattedHeader(const VcfHeader& header); + + static VcfHeader HeaderFromFile(const std::string& fn); + + static VcfHeader HeaderFromStream(std::istream& in); + + /// \} + +public: + /// \name Variant format + /// \{ + + static VcfVariant ParsedVariant(const std::string& line); + + static std::string FormattedVariant(const VcfVariant& var); + + /// \} + + // ---------------------------------------------------------------------- // + // The following methods are mostly internal helpers, exposed here for // + // testing. Client code should probably not need these, but are available // + // here if needed. // + // ---------------------------------------------------------------------- // + +public: + /// \internal + /// \name Header format helpers + /// \{ + + static ContigDefinition ParsedContigDefinition(std::string line); + + static FilterDefinition ParsedFilterDefinition(std::string line); + + static FormatDefinition ParsedFormatDefinition(std::string line); + + static GeneralDefinition ParsedGeneralDefinition(const std::string& line); + + static InfoDefinition ParsedInfoDefinition(std::string line); + + static std::string FormattedContigDefinition(const ContigDefinition& def); + + static std::string FormattedFilterDefinition(const FilterDefinition& def); + + static std::string FormattedFormatDefinition(const FormatDefinition& def); + + static std::string FormattedGeneralDefinition(const GeneralDefinition& def); + + static std::string FormattedInfoDefinition(const InfoDefinition& def); + + /// \} + +public: + /// \internal + /// \name Variant format helpers + /// \{ + + static std::string FormattedInfoField(const InfoField& field); + + static std::string FormattedInfoFields(const std::vector& fields); + + static std::string FormattedGenotypeField(const GenotypeField& field); + + static InfoField ParsedInfoField(const std::string& text); + + static std::vector ParsedInfoFields(const std::string& text); + + static GenotypeField ParsedGenotypeField(const std::string& field); + + /// \} +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFFORMAT_H diff --git a/include/pbbam/vcf/VcfHeader.h b/include/pbbam/vcf/VcfHeader.h new file mode 100644 index 0000000..dc12be9 --- /dev/null +++ b/include/pbbam/vcf/VcfHeader.h @@ -0,0 +1,119 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFHEADER_H +#define PBBAM_VCF_VCFHEADER_H + +#include +#include +#include +#include + +#include + +#include + +namespace PacBio { +namespace VCF { + +class VcfHeader +{ +public: + VcfHeader(); + + explicit VcfHeader(const std::string& hdrText); + + VcfHeader(const VcfHeader&); + VcfHeader(VcfHeader&&); + VcfHeader& operator=(const VcfHeader&); + VcfHeader& operator=(VcfHeader&&); + ~VcfHeader(); + +public: + // general lines + + size_t NumLines() const; + + const std::string& FileDate() const; + const std::string& Version() const; + + const std::vector& GeneralDefinitions() const; + const PacBio::VCF::GeneralDefinition& GeneralDefinition(const std::string& id) const; + + // ##contig + const std::vector& ContigDefinitions() const; + const PacBio::VCF::ContigDefinition& ContigDefinition(const std::string& id) const; + + // INFO + + const std::vector& InfoDefinitions() const; + const PacBio::VCF::InfoDefinition& InfoDefinition(const std::string& id) const; + + // FILTER + + const std::vector& FilterDefinitions() const; + const PacBio::VCF::FilterDefinition& FilterDefinition(const std::string& id) const; + + // FORMAT + + const std::vector& FormatDefinitions() const; + const PacBio::VCF::FormatDefinition& FormatDefinition(const std::string& id) const; + + // samples + + size_t IndexOfSample(const Sample& sample) const; + const Sample& SampleAt(size_t index) const; + const std::vector& Samples() const; + +public: + // general lines + + VcfHeader& FileDate(std::string fileDate); + VcfHeader& Version(std::string version); + + VcfHeader& AddGeneralDefinition(PacBio::VCF::GeneralDefinition def); + VcfHeader& GeneralDefinitions(std::vector defs); + + // ##contig + VcfHeader& AddContigDefinition(PacBio::VCF::ContigDefinition def); + VcfHeader& ContigDefinitions(std::vector defs); + + // INFO + + VcfHeader& AddInfoDefinition(PacBio::VCF::InfoDefinition info); + VcfHeader& InfoDefinitions(std::vector defs); + + // FILTER + + VcfHeader& AddFilterDefinition(PacBio::VCF::FilterDefinition filter); + VcfHeader& FilterDefinitions(std::vector defs); + + // FORMAT + + VcfHeader& AddFormatDefinition(PacBio::VCF::FormatDefinition format); + VcfHeader& FormatDefinitions(std::vector defs); + + // samples + + VcfHeader& AddSample(std::string sample); + VcfHeader& Samples(std::vector names); + +private: + std::vector generalDefinitions_; + std::vector contigDefinitions_; + std::vector infoDefinitions_; + std::vector filterDefinitions_; + std::vector formatDefinitions_; + std::vector samples_; + + std::unordered_map generalLookup_; + std::unordered_map contigLookup_; + std::unordered_map infoLookup_; + std::unordered_map filterLookup_; + std::unordered_map formatLookup_; + std::unordered_map sampleLookup_; +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFHEADER_H diff --git a/include/pbbam/vcf/VcfHeaderTypes.h b/include/pbbam/vcf/VcfHeaderTypes.h new file mode 100644 index 0000000..d407c91 --- /dev/null +++ b/include/pbbam/vcf/VcfHeaderTypes.h @@ -0,0 +1,159 @@ + +#ifndef PBBAM_VCF_VCFHEADERTYPES_H +#define PBBAM_VCF_VCFHEADERTYPES_H + +#include +#include +#include + +#include + +namespace PacBio { +namespace VCF { + +using Sample = std::string; + +class ContigDefinition +{ +public: + explicit ContigDefinition(std::string id); + ContigDefinition(std::string id, std::vector> attributes); + + ContigDefinition() = delete; + ContigDefinition(const ContigDefinition&); + ContigDefinition(ContigDefinition&&); + ContigDefinition& operator=(const ContigDefinition&); + ContigDefinition& operator=(ContigDefinition&&); + ~ContigDefinition(); + +public: + const std::string& Id() const; + const std::vector>& Attributes() const; + + ContigDefinition& AddAttribute(std::string id, std::string value); + ContigDefinition& AddAttribute(std::pair attribute); + ContigDefinition& Attributes(std::vector> attributes); + +private: + std::string id_; + std::vector> attributes_; +}; + +/// +/// \brief The FilterDefinition class +/// +class FilterDefinition +{ +public: + FilterDefinition(std::string id, std::string description); + + FilterDefinition() = delete; + FilterDefinition(const FilterDefinition&); + FilterDefinition(FilterDefinition&&); + FilterDefinition& operator=(const FilterDefinition&); + FilterDefinition& operator=(FilterDefinition&&); + ~FilterDefinition(); + + const std::string& Id() const; + const std::string& Description() const; + +private: + // required fields + std::string id_; + std::string description_; +}; + +/// +/// \brief The FormatDefinition class +/// +class FormatDefinition +{ +public: + FormatDefinition(std::string id, std::string number, std::string type, std::string description); + + FormatDefinition() = delete; + FormatDefinition(const FormatDefinition&); + FormatDefinition(FormatDefinition&&); + FormatDefinition& operator=(const FormatDefinition&); + FormatDefinition& operator=(FormatDefinition&&); + ~FormatDefinition(); + + const std::string& Id() const; + const std::string& Number() const; + const std::string& Type() const; + const std::string& Description() const; + +private: + std::string id_; + std::string number_; // TODO: enum + std::string type_; // TODO: enum + std::string description_; +}; + +/// +/// \brief The GeneralDefinition class +/// +class GeneralDefinition +{ +public: + GeneralDefinition(std::string id, std::string text); + + GeneralDefinition() = delete; + GeneralDefinition(const GeneralDefinition&); + GeneralDefinition(GeneralDefinition&&); + GeneralDefinition& operator=(const GeneralDefinition&); + GeneralDefinition& operator=(GeneralDefinition&&); + ~GeneralDefinition(); + + const std::string& Id() const; + const std::string& Text() const; + +private: + // required fields + std::string id_; + std::string text_; +}; + +/// +/// \brief The InfoDefinition class +/// +class InfoDefinition +{ +public: + InfoDefinition(std::string id, std::string number, std::string type, std::string description, + std::string source = std::string{}, std::string version = std::string{}); + + InfoDefinition() = delete; + InfoDefinition(const InfoDefinition&); + InfoDefinition(InfoDefinition&&); + InfoDefinition& operator=(const InfoDefinition&); + InfoDefinition& operator=(InfoDefinition&&); + ~InfoDefinition(); + + const std::string& Id() const; + const std::string& Number() const; + const std::string& Type() const; + const std::string& Description() const; + const boost::optional& Source() const; + const boost::optional& Version() const; + + InfoDefinition& Source(std::string s); + InfoDefinition& Version(std::string v); + +private: + // required fields + // (functionally const, not marked as such to still allow moves) + std::string id_; + std::string number_; // TODO: enum + std::string type_; // TODO: enum + std::string description_; + + // optional fields - settable after ctor + boost::optional source_; + boost::optional version_; +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFHEADERTYPES_H diff --git a/include/pbbam/vcf/VcfQuery.h b/include/pbbam/vcf/VcfQuery.h new file mode 100644 index 0000000..de657ca --- /dev/null +++ b/include/pbbam/vcf/VcfQuery.h @@ -0,0 +1,45 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFQUERY_H +#define PBBAM_VCF_VCFQUERY_H + +#include + +#include + +#include +#include +#include + +namespace PacBio { +namespace VCF { + +class VcfQuery : public PacBio::BAM::internal::QueryBase +{ +public: + explicit VcfQuery(std::string fn); + explicit VcfQuery(const VcfFile& file); + + VcfQuery() = delete; + VcfQuery(const VcfQuery&) = delete; + VcfQuery(VcfQuery&&) = default; + VcfQuery& operator=(const VcfQuery&) = delete; + VcfQuery& operator=(VcfQuery&&) = default; + ~VcfQuery(); + +public: + /// \brief Main iteration point for record access. + /// + /// Most client code should not need to use this method directly. Use + /// iterators instead. + /// + bool GetNext(VcfVariant& var) override; + +private: + VcfReader reader_; +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFQUERY_H diff --git a/include/pbbam/vcf/VcfReader.h b/include/pbbam/vcf/VcfReader.h new file mode 100644 index 0000000..410aa3e --- /dev/null +++ b/include/pbbam/vcf/VcfReader.h @@ -0,0 +1,50 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFREADER_H +#define PBBAM_VCF_VCFREADER_H + +#include +#include +#include + +#include +#include +#include + +namespace PacBio { +namespace VCF { + +/// +/// \brief The VcfReader class +/// +class VcfReader +{ +public: + explicit VcfReader(std::string fn); + explicit VcfReader(const VcfFile& file); + + VcfReader() = delete; + VcfReader(const VcfReader&) = delete; + VcfReader(VcfReader&&) = default; + VcfReader& operator=(const VcfReader&) = delete; + VcfReader& operator=(VcfReader&&) = default; + ~VcfReader(); + +public: + const VcfHeader& Header() const; + + bool GetNext(VcfVariant& var); + +private: + void FetchNext(); + +private: + std::ifstream in_; + VcfHeader header_; + std::string line_; +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFREADER_H diff --git a/include/pbbam/vcf/VcfSort.h b/include/pbbam/vcf/VcfSort.h new file mode 100644 index 0000000..5f7d828 --- /dev/null +++ b/include/pbbam/vcf/VcfSort.h @@ -0,0 +1,31 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFSORT_H +#define PBBAM_VCF_VCFSORT_H + +#include + +#include "pbbam/Config.h" +#include "pbbam/vcf/VcfFile.h" + +namespace PacBio { +namespace VCF { + +/// +/// \brief SortFile +/// \param file +/// \param outputFilename +/// +void SortFile(const VcfFile& file, const std::string& outputFilename); + +/// +/// \brief SortFile +/// \param inputFilename +/// \param outputFilename +/// +void SortFile(const std::string& inputFilename, const std::string& outputFilename); + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFSORT_H diff --git a/include/pbbam/vcf/VcfVariant.h b/include/pbbam/vcf/VcfVariant.h new file mode 100644 index 0000000..1378814 --- /dev/null +++ b/include/pbbam/vcf/VcfVariant.h @@ -0,0 +1,149 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VARIANT_H +#define PBBAM_VCF_VARIANT_H + +#include +#include +#include + +#include + +#include +#include + +namespace PacBio { +namespace VCF { + +struct InfoField +{ + std::string id; + boost::optional value; + boost::optional> values; +}; + +struct GenotypeData +{ + boost::optional value; + boost::optional> values; +}; + +struct GenotypeField +{ + std::vector data; +}; + +class VcfVariant +{ +public: + VcfVariant(); + + explicit VcfVariant(const std::string& text); + + VcfVariant(std::string id, std::string chrom, PacBio::BAM::Position pos, std::string refAllele, + std::string altAllele); + + VcfVariant(const VcfVariant&); + VcfVariant(VcfVariant&&); + VcfVariant& operator=(const VcfVariant&); + VcfVariant& operator=(VcfVariant&&); + ~VcfVariant(); + +public: + // core fields + + const std::string& Chrom() const; + VcfVariant& Chrom(std::string chrom); + + PacBio::BAM::Position Position() const; + VcfVariant& Position(PacBio::BAM::Position pos); + + const std::string& Id() const; + VcfVariant& Id(std::string id); + + const std::string& RefAllele() const; + VcfVariant& RefAllele(std::string refAllele); + + const std::string& AltAllele() const; + VcfVariant& AltAllele(std::string altAllele); + + float Quality() const; + VcfVariant& Quality(float qual); + + const std::string& Filter() const; + VcfVariant& Filter(std::string filter); + + // convenience methods + bool IsDeletion() const; + bool IsInsertion() const; + bool IsQualityMissing() const; + bool IsSnp() const; + +public: + // info fields + + VcfVariant& AddInfoField(InfoField field); + VcfVariant& RemoveInfoField(const std::string& id); + + const std::vector& InfoFields() const; + VcfVariant& InfoFields(std::vector fields); + + bool HasInfoField(const std::string& id) const; + + const boost::optional InfoValue(const std::string& id) const; + VcfVariant& InfoValue(const std::string& id, boost::optional value); + + const boost::optional> InfoValues(const std::string& id) const; + VcfVariant& InfoValues(const std::string& id, boost::optional> values); + +public: + // sample genotypes + + // NOTE: if you want to look up by sample name, get the index from header + + std::vector GenotypeIds() const; + VcfVariant& GenotypeIds(std::vector ids); + + std::vector Genotypes() const; + VcfVariant& Genotypes(std::vector genotypes); + + const boost::optional& GenotypeValue(const size_t sampleIndex, + const std::string& id) const; + VcfVariant& GenotypeValue(const size_t sampleIndex, const std::string& id, + boost::optional value); + + const boost::optional>& GenotypeValues(const size_t sampleIndex, + const std::string& id) const; + VcfVariant& GenotypeValues(const size_t sampleIndex, const std::string& id, + boost::optional> values); + + bool IsSampleHeterozygous(const size_t sampleIndex) const; + bool IsSamplePhased(const size_t sampleIndex) const; + +private: + // FIXED data + std::string chrom_; + PacBio::BAM::Position pos_; + std::string id_; + std::string refAllele_; + std::string altAllele_; // multiple? KISS, only add if needed + float qual_; + std::string filter_; + + // INFO data + std::vector infoFields_; + std::unordered_map infoLookup_; + + // SAMPLE GENOTYPE data + std::vector format_; // order matches FORMAT string + std::unordered_map + genotypeDataLookup_; // genotype ID -> genotypeField.data index + std::vector sampleGenotypes_; // index matches sample order +}; + +} // namespace VCF +} // namespace PacBio + +// #include "pbbam/vcf/internal/VcfVariant.inl" + +#endif // PBBAM_VCF_VARIANT_H diff --git a/include/pbbam/vcf/VcfWriter.h b/include/pbbam/vcf/VcfWriter.h new file mode 100644 index 0000000..7b5adc4 --- /dev/null +++ b/include/pbbam/vcf/VcfWriter.h @@ -0,0 +1,35 @@ +// Author: Derek Barnett + +#ifndef PBBAM_VCF_VCFWRITER_H +#define PBBAM_VCF_VCFWRITER_H + +#include +#include + +namespace PacBio { +namespace VCF { + +class VcfHeader; +class VcfVariant; + +class VcfWriter +{ +public: + VcfWriter(std::string filename, const VcfHeader& header); + + VcfWriter(VcfWriter&&); + VcfWriter& operator=(VcfWriter&&); + ~VcfWriter(); + +public: + bool Write(const VcfVariant& var); + +private: + struct VcfWriterPrivate; + std::unique_ptr d_; +}; + +} // namespace VCF +} // namespace PacBio + +#endif // PBBAM_VCF_VCFWRITER_H diff --git a/include/pbbam/virtual/VirtualPolymeraseBamRecord.h b/include/pbbam/virtual/VirtualPolymeraseBamRecord.h new file mode 100644 index 0000000..48142e3 --- /dev/null +++ b/include/pbbam/virtual/VirtualPolymeraseBamRecord.h @@ -0,0 +1,21 @@ +// File Description +/// \file VirtualPolymeraseBamRecord.h +/// \brief Defines the VirtualPolymeraseBamRecord class. +// +// Author: Armin Töpfer + +#ifndef VIRTUALPOLYMERASEBAMRECORD_H +#define VIRTUALPOLYMERASEBAMRECORD_H + +#include "pbbam/virtual/VirtualZmwBamRecord.h" + +namespace PacBio { +namespace BAM { + +/// \deprecated Use VirtualZmwBamRecord instead. +using VirtualPolymeraseBamRecord = VirtualZmwBamRecord; + +} // namespace BAM +} // namespace PacBio + +#endif // VIRTUALPOLYMERASEBAMRECORD_H diff --git a/include/pbbam/virtual/VirtualPolymeraseCompositeReader.h b/include/pbbam/virtual/VirtualPolymeraseCompositeReader.h new file mode 100644 index 0000000..ecdada4 --- /dev/null +++ b/include/pbbam/virtual/VirtualPolymeraseCompositeReader.h @@ -0,0 +1,21 @@ +// File Description +/// \file VirtualPolymeraseCompositeReader.h +/// \brief Defines the VirtualPolymeraseCompositeReader class. +// +// Author: Derek Barnett + +#ifndef VIRTUALPOLYMERASECOMPOSITEREADER_H +#define VIRTUALPOLYMERASECOMPOSITEREADER_H + +#include "pbbam/virtual/ZmwReadStitcher.h" + +namespace PacBio { +namespace BAM { + +/// \deprecated Use ZmwReadStitcher instead. +using VirtualPolymeraseCompositeReader = ZmwReadStitcher; + +} // namespace BAM +} // namespace PacBio + +#endif // VIRTUALPOLYMERASECOMPOSITEREADER_H diff --git a/include/pbbam/virtual/VirtualPolymeraseReader.h b/include/pbbam/virtual/VirtualPolymeraseReader.h new file mode 100644 index 0000000..7797c6f --- /dev/null +++ b/include/pbbam/virtual/VirtualPolymeraseReader.h @@ -0,0 +1,21 @@ +// File Description +/// \file VirtualPolymeraseReader.h +/// \brief Defines the VirtualPolymeraseReader class. +// +// Author: Armin Töpfer + +#ifndef VIRTUALPOLYMERASEREADER_H +#define VIRTUALPOLYMERASEREADER_H + +#include "pbbam/virtual/ZmwReadStitcher.h" + +namespace PacBio { +namespace BAM { + +/// \deprecated Use ZmwReadStitcher instead. +using VirtualPolymeraseReader = ZmwReadStitcher; + +} // 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..e687225 --- /dev/null +++ b/include/pbbam/virtual/VirtualRegion.h @@ -0,0 +1,54 @@ +// File Description +/// \file VirtualRegion.h +/// \brief Defines the VirtualRegion class. +// +// Author: Armin Töpfer + +#ifndef VIRTUALREGION_H +#define VIRTUALREGION_H + +#include "pbbam/Config.h" +#include "pbbam/LocalContextFlags.h" +#include "pbbam/virtual/VirtualRegionType.h" + +namespace PacBio { +namespace BAM { + +/// \brief The VirtualRegion represents an annotation of a polymerase region. +/// +class VirtualRegion +{ +public: + VirtualRegionType type; + int beginPos; + int endPos; + LocalContextFlags cxTag = LocalContextFlags::NO_LOCAL_CONTEXT; + int barcodeLeft = -1; + int barcodeRight = -1; + int score = 0; + + /// \brief Creates a virtual region with basic type & position info. + /// + VirtualRegion(const VirtualRegionType type_, const int beginPos_, const int endPos_, + const int score_ = 0); + + /// \brief Creates a virtual region with type/position info, as well as context & barcode. + /// + VirtualRegion(const VirtualRegionType type_, const int beginPos_, const int endPos_, + const LocalContextFlags cxTag_, const int barcodeLeft_, const int barcodeRight_, + const int score_ = 0); + + VirtualRegion(); + VirtualRegion(const VirtualRegion&); + VirtualRegion(VirtualRegion&&); + VirtualRegion& operator=(const VirtualRegion&); + VirtualRegion& operator=(VirtualRegion&&); + ~VirtualRegion(); + + bool operator==(const VirtualRegion& v1) const; +}; + +} // 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..c23d3ee --- /dev/null +++ b/include/pbbam/virtual/VirtualRegionType.h @@ -0,0 +1,30 @@ +// File Description +/// \file VirtualRegionType.h +/// \brief Defines the VirtualRegionType enum. +// +// Author: Derek Barnett + +#ifndef REGIONTYPE_H +#define REGIONTYPE_H + +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +/// \brief This enum defines the types of annotated region. +/// +enum class VirtualRegionType // : char +{ + ADAPTER = 0x41, ///< Adapter region ('A') + BARCODE = 0x42, ///< Barcode region ('B') + FILTERED = 0x46, ///< Filtered subread ('F') + SUBREAD = 0x53, ///< Subread ('S') + HQREGION = 0x48, ///< High-quality region ('H') + LQREGION = 0x4C ///< Low-quality region ('L'), i.e. 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..6f5c7e0 --- /dev/null +++ b/include/pbbam/virtual/VirtualRegionTypeMap.h @@ -0,0 +1,30 @@ +// File Description +/// \file VirtualRegionTypeMap.h +/// \brief Defines the VirtualRegionTypeMap class. +// +// Author: Derek Barnett + +#ifndef VIRTUALREGIONTYPEMAP_H +#define VIRTUALREGIONTYPEMAP_H + +#include + +#include "pbbam/Config.h" +#include "pbbam/virtual/VirtualRegionType.h" + +namespace PacBio { +namespace BAM { + +/// \brief The VirtualRegionTypeMap class provides mapping between char codes and +/// VirtualRegionType enum keys. +/// +class VirtualRegionTypeMap +{ +public: + static std::map ParseChar; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VIRTUALREGIONTYPEMAP_H diff --git a/include/pbbam/virtual/VirtualZmwBamRecord.h b/include/pbbam/virtual/VirtualZmwBamRecord.h new file mode 100644 index 0000000..c1edcde --- /dev/null +++ b/include/pbbam/virtual/VirtualZmwBamRecord.h @@ -0,0 +1,84 @@ +// File Description +/// \file VirtualZmwBamRecord.h +/// \brief Defines the VirtualZmwBamRecord class. +// +// Author: Armin Töpfer + +#ifndef VirtualZmwBAMRECORD_H +#define VirtualZmwBAMRECORD_H + +#include +#include + +#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 { + +/// \brief The VirtualZmwBamRecord class represents a ZMW read stitched +/// on-the-fly from subreads|hqregion + scraps. +/// +class VirtualZmwBamRecord : public BamRecord +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a "virtual" ZMW %BAM record, by re-stitching its + /// constituent segments. + /// + /// \param[in] unorderedSources source data (subreads, scraps, etc.) + /// \param[in] header %BAM header to associate with the new record + /// + /// \throws std::runtime_error on failure to stitch virtual record + /// + VirtualZmwBamRecord(std::vector unorderedSources, const BamHeader& header); + + VirtualZmwBamRecord() = delete; + VirtualZmwBamRecord(const VirtualZmwBamRecord&); + VirtualZmwBamRecord(VirtualZmwBamRecord&&); + VirtualZmwBamRecord& operator=(const VirtualZmwBamRecord&); + VirtualZmwBamRecord& operator=(VirtualZmwBamRecord&&); + virtual ~VirtualZmwBamRecord(); + + /// \} + + /// \name Virtual Record Attributes + /// + + /// \returns true if requested VirtualRegionType has been annotated. + /// + bool HasVirtualRegionType(const VirtualRegionType regionType) const; + + /// \returns IPD frame data + /// + Frames IPDV1Frames(Orientation orientation = Orientation::NATIVE) const; + + /// \brief Provides all annotations of the polymerase read as a map (type => regions) + /// + std::map> VirtualRegionsMap() const; + + /// \brief Provides annotations of the polymerase read for a given VirtualRegionType. + /// + /// \param[in] regionType requested region type + /// \returns regions that match the requested type (empty vector if none found). + /// + std::vector VirtualRegionsTable(const VirtualRegionType regionType) const; + + /// \} + +private: + std::vector sources_; + std::map> virtualRegionsMap_; + + void StitchSources(); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VirtualZmwBAMRECORD_H diff --git a/include/pbbam/virtual/WhitelistedZmwReadStitcher.h b/include/pbbam/virtual/WhitelistedZmwReadStitcher.h new file mode 100644 index 0000000..b7888c8 --- /dev/null +++ b/include/pbbam/virtual/WhitelistedZmwReadStitcher.h @@ -0,0 +1,106 @@ +// File Description +/// \file WhitelistedZmwReadStitcher.h +/// \brief Defines the ZmwReadStitcher class. +// +// Author: Derek Barnett + +#ifndef WHITELISTEDZMWREADSTITCHER_H +#define WHITELISTEDZMWREADSTITCHER_H + +#include +#include +#include +#include +#include "pbbam/Config.h" +#include "pbbam/virtual/VirtualZmwBamRecord.h" + +namespace PacBio { +namespace BAM { + +class DataSet; +class PbiFilter; + +/// \brief The WhitelistedZmwReadStitcher class provides an interface for +/// re-stitching "virtual" ZMW reads from their constituent parts, +/// limiting results to only those reads originating from a 'whitelist' +/// of ZMW hole numbers. +/// +/// Whitelisted ZMWs that are not present in both primary and scraps BAMs +/// will be "pre-removed." This ensures that, given client code like this: +/// +/// \include code/WhitelistedZmwReadStitcher.txt +/// +/// each iteration will always provide valid data - either a valid virtual +/// record from Next() or a non-empty vector from NextRaw(). +/// +/// \note This reader requires that both input %BAM files also have associated +/// PBI files available for query. See BamFile::EnsurePacBioIndexExists . +/// +class PBBAM_EXPORT WhitelistedZmwReadStitcher +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// \brief Creates a reader that will operate on a primary %BAM file (e.g. subread data) + /// and a scraps file, using a ZMW whitelist to filter the input. + /// + /// \param[in] zmwWhitelist list of ZMWs to restrict iteration over + /// \param[in] primaryBamFilePath hqregion.bam or subreads.bam file path + /// \param[in] scrapsBamFilePath scraps.bam file path + /// + /// \note This reader requires that both input %BAM files also have associated PBI + /// files available for query. See BamFile::EnsurePacBioIndexExists . + /// + /// \throws std::runtime_error if any files (*.bam and/or *.pbi) were not available for reading, or + /// if malformed data encountered + /// + WhitelistedZmwReadStitcher(const std::vector& zmwWhitelist, + const std::string& primaryBamFilePath, + const std::string& scrapsBamFilePath); + + WhitelistedZmwReadStitcher() = delete; + WhitelistedZmwReadStitcher(const WhitelistedZmwReadStitcher&) = delete; + WhitelistedZmwReadStitcher(WhitelistedZmwReadStitcher&&) = delete; + WhitelistedZmwReadStitcher& operator=(const WhitelistedZmwReadStitcher&) = delete; + WhitelistedZmwReadStitcher& operator=(WhitelistedZmwReadStitcher&&) = delete; + ~WhitelistedZmwReadStitcher(); + + /// \} + + /// \name Stitched Record Reading + /// \{ + + /// \returns true if more ZMWs are available for reading. + bool HasNext() const; + + /// \returns the re-stitched polymerase read from the next ZMW in the whitelist + VirtualZmwBamRecord Next(); + + /// \returns the set of reads that belong to the next ZMW in the whitelist. + /// This enables stitching records in a distinct thread. + /// + std::vector NextRaw(); + + /// \} + + /// \name File Headers + /// \{ + + /// \returns the BamHeader associated with this reader's "primary" %BAM file + BamHeader PrimaryHeader() const; + + /// \returns the BamHeader associated with this reader's "scraps" %BAM file + BamHeader ScrapsHeader() const; + + /// \} + +private: + class WhitelistedZmwReadStitcherPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // WHITELISTEDZMWREADSTITCHER diff --git a/include/pbbam/virtual/ZmwReadStitcher.h b/include/pbbam/virtual/ZmwReadStitcher.h new file mode 100644 index 0000000..dd56b83 --- /dev/null +++ b/include/pbbam/virtual/ZmwReadStitcher.h @@ -0,0 +1,92 @@ +// File Description +/// \file ZmwReadStitcher.h +/// \brief Defines the ZmwReadStitcher class. +// +// Author: Derek Barnett + +#ifndef ZMWREADSTITCHER_H +#define ZMWREADSTITCHER_H + +#include +#include +#include +#include "pbbam/BamRecord.h" +#include "pbbam/Config.h" +#include "pbbam/virtual/VirtualZmwBamRecord.h" + +namespace PacBio { +namespace BAM { + +class DataSet; +class PbiFilter; + +/// \brief The ZmwReadStitcher class provides an interface for re-stitching +/// "virtual" polymerase reads from their constituent parts. +/// +/// \note This reader requires that any input %BAM files also have associated PBI +/// files available for query. See BamFile::EnsurePacBioIndexExists . +/// +class PBBAM_EXPORT ZmwReadStitcher +{ +public: + /// \name Constructors & Related Methods + /// \{ + + /// entire file, from BAM names + ZmwReadStitcher(std::string primaryBamFilePath, std::string scrapsBamFilePath); + + /// filtered input from BAM names + ZmwReadStitcher(std::string primaryBamFilePath, std::string scrapsBamFilePath, + PbiFilter filter); + + /// maybe filtered, from DataSet input + ZmwReadStitcher(const DataSet& dataset); + + ZmwReadStitcher() = delete; + ZmwReadStitcher(const ZmwReadStitcher&) = delete; + ZmwReadStitcher(ZmwReadStitcher&&) = delete; + ZmwReadStitcher& operator=(const ZmwReadStitcher&) = delete; + ZmwReadStitcher& operator=(ZmwReadStitcher&&) = delete; + ~ZmwReadStitcher(); + + /// \} + + /// \name File Headers + /// \{ + + /// \returns the BamHeader associated with this reader's "primary" %BAM file + BamHeader PrimaryHeader() const; + + /// \returns the BamHeader associated with this reader's "scraps" %BAM file + BamHeader ScrapsHeader() const; + + /// \return the BamHeader associated with the newly stitched BAM data + BamHeader StitchedHeader() const; + + /// \} + + /// \name Stitched Record Reading + /// + + /// \returns true if more ZMWs are available for reading. + bool HasNext(); + + /// \returns the next stitched polymerase read + VirtualZmwBamRecord Next(); + + /// \returns the next set of reads that belong to one ZMW. + /// This enables stitching records in a distinct thread. + /// + std::vector NextRaw(); + + /// \} + +private: + class ZmwReadStitcherPrivate; + std::unique_ptr d_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ZMWREADSTITCHER_H diff --git a/include/pbbam/virtual/ZmwWhitelistVirtualReader.h b/include/pbbam/virtual/ZmwWhitelistVirtualReader.h new file mode 100644 index 0000000..21101e1 --- /dev/null +++ b/include/pbbam/virtual/ZmwWhitelistVirtualReader.h @@ -0,0 +1,21 @@ +// File Description +/// \file ZmwWhitelistVirtualReader.h +/// \brief Defines the ZmwWhitelistVirtualReader class. +// +// Author: Derek Barnett + +#ifndef ZMWWHITELISTVIRTUALREADER_H +#define ZMWWHITELISTVIRTUALREADER_H + +#include "pbbam/virtual/WhitelistedZmwReadStitcher.h" + +namespace PacBio { +namespace BAM { + +/// \deprecated Use WhitelistedZmwReadStitcher instead. +using ZmwWhitelistVirtualReader = WhitelistedZmwReadStitcher; + +} // namespace BAM +} // namespace PacBio + +#endif // ZMWWHITELISTVIRTUALREADER_H diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..e248ac8 --- /dev/null +++ b/meson.build @@ -0,0 +1,129 @@ +project( + 'PacBioBAM', + 'cpp', + version : '0.23.0', + default_options : [ + 'buildtype=release', + 'warning_level=3', + 'cpp_std=c++11', + 'b_ndebug=if-release'], + license : 'BSD-3', + meson_version : '>= 0.46.0') + +############ +# CXXFLAGS # +############ + +pbbam_warning_flags = [] +cpp = meson.get_compiler('cpp') +foreach cflag: [ + '-Wduplicated-cond', + '-Wduplicated-branches', + '-Wlogical-op', + '-Wrestrict', + '-Wnull-dereference', + '-Wuseless-cast', + '-Wdouble-promotion', + '-Wshadow', + '-Wformat=1'] + if cpp.has_argument(cflag) + pbbam_warning_flags += cflag + endif +endforeach + +pbbam_macros = [] +if get_option('permissive-cigar') + pbbam_macros += ['-DPBBAM_PERMISSIVE_CIGAR'] + warning('**********************************************') + warning('* You have enabled allowing "M" in BAM files *') + warning('* This is an unsupported combination! *') + warning('**********************************************') +endif + +################ +# dependencies # +################ + +# threads +pbbam_thread_dep = dependency('threads', required : true) + +# boost +pbbam_boost_dep = dependency('boost', required : true) + +# TODO(dseifert): Add test for Winsock on Windows +# Winsock for htslib on Windows +#if(WIN32) +# set(SOCKET_LIBRARIES "ws2_32") +#endif() + +# zlib +pbbam_zlib_dep = dependency('zlib', required : true) + +# htslib +pbbam_htslib_dep = dependency('htslib', required : true, version : '>=1.4') + +########### +# headers # +########### + +subdir('include') + +##################### +# sources + library # +##################### + +subdir('src') + +######### +# tests # +######### + +if not meson.is_subproject() + if get_option('build-tools') or get_option('tests') + pbbam_python = find_program('python') + + if get_option('tests') + pbbam_clang_formatter = find_program('tools/check-formatting') + subdir('tests') + endif + endif +endif + +######### +# tools # +######### + +if not meson.is_subproject() + if get_option('build-tools') or get_option('tests') + subdir('tools') + endif +endif + +################# +# documentation # +################# + +if get_option('build-docs') + subdir('docs') +endif + +################### +# dependency info # +################### + +if not meson.is_subproject() + import('pkgconfig').generate( + libraries : pbbam_lib, + version : meson.project_version(), + name : 'pbbam', + requires : 'htslib', + filebase : 'pbbam', + description : 'Library for accessing PacBio-compatible BAM files') +endif + +pbbam_dep = declare_dependency( + include_directories : pbbam_include_directories, + link_with : pbbam_lib, + dependencies : pbbam_htslib_dep, + version : meson.project_version(), + compile_args : pbbam_macros) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..56dbe36 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,24 @@ +option('build-tools', + type : 'boolean', + value : true, + description : 'Build PacBioBAM command line utilities (e.g. pbindex)') + +option('build-docs', + type : 'boolean', + value : false, + description : 'Build PacBioBAM\'s API documentation') + +option('auto-validate', + type : 'boolean', + value : false, + description : 'Build PacBioBAM with BAM validation') + +option('tests', + type : 'boolean', + value : true, + description : 'Enable dependencies required for testing') + +option('permissive-cigar', + type : 'boolean', + value : false, + description : 'Allows loading BAM records which contain "M" operations in CIGAR strings.') diff --git a/scripts/ci/artifact.sh b/scripts/ci/artifact.sh new file mode 100755 index 0000000..a8aa64b --- /dev/null +++ b/scripts/ci/artifact.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -vex + +############ +# ARTIFACT # +############ + +if [[ ${_create_artifact} != true ]]; then + echo "Not creating artifact (branch: ${bamboo_planRepository_branchName}), returning." + return 0 +fi + +# *never* create artifacts with ASAN enabled +meson configure -Dprefix=/ -Db_sanitize=none "${CURRENT_BUILD_DIR:-build}" + +NEXUS_VERSION="$(${CURRENT_BUILD_DIR:-build}/tools/bam2sam --version)".${BUILD_NUMBER} +case "${bamboo_planRepository_branchName}" in + develop) + VERSION="$(${CURRENT_BUILD_DIR:-build}/tools/bam2sam --version)".SNAPSHOT${BUILD_NUMBER} + NEXUS_REPO=maven-snapshots + ;; + master) + VERSION="${NEXUS_VERSION}" + NEXUS_REPO=maven-releases + ;; + *) + echo "You can only create artifacts from 'develop' or 'master' branches" + exit 1 + ;; +esac + +DESTDIR="${PWD}/staging" ninja -C "${CURRENT_BUILD_DIR:-build}" -v install +if [[ ${_artifact_versionprepend:-false} == true ]]; then + ( cd staging && tar zcf ../pbbam-${VERSION}-x86_64.tgz . --transform "s,^\./,pbbam-${VERSION}/," ) +else + ( cd staging && tar zcf ../pbbam-${VERSION}-x86_64.tgz . ) +fi + +md5sum pbbam-${VERSION}-x86_64.tgz | awk -e '{print $1}' >| pbbam-${VERSION}-x86_64.tgz.md5 +sha1sum pbbam-${VERSION}-x86_64.tgz | awk -e '{print $1}' >| pbbam-${VERSION}-x86_64.tgz.sha1 + +NEXUS_URL=http://ossnexus.pacificbiosciences.com/repository/${NEXUS_REPO}/${NEXUS_PROJECT:-pacbio/sat/pbbam/pbbam}/${NEXUS_VERSION:-gcc-6.4.0}${NEXUS_TC} +curl -vn --upload-file pbbam-${VERSION}-x86_64.tgz ${NEXUS_URL}/pbbam-${VERSION}-x86_64.tgz +curl -vn --upload-file pbbam-${VERSION}-x86_64.tgz.md5 ${NEXUS_URL}/pbbam-${VERSION}-x86_64.tgz.md5 +curl -vn --upload-file pbbam-${VERSION}-x86_64.tgz.sha1 ${NEXUS_URL}/pbbam-${VERSION}-x86_64.tgz.sha1 diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh new file mode 100755 index 0000000..5f64d44 --- /dev/null +++ b/scripts/ci/build.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -vex + +######### +# BUILD # +######### + +# on PA, need to first build htslib +if [[ ${GCC_VERSION} == PA ]]; then + wget https://github.com/samtools/htslib/releases/download/1.9/htslib-1.9.tar.bz2 + tar -xjf htslib-1.9.tar.bz2 + pushd htslib-1.9 + CFLAGS="-O3" ./configure \ + --prefix="${bamboo_build_working_directory}/staging" \ + --libdir="${bamboo_build_working_directory}/staging/lib" \ + --disable-bz2 \ + --disable-gcs \ + --disable-libcurl \ + --disable-lzma \ + --disable-plugins \ + --disable-s3 + + make -j install + + # clean out unneeded cruft and shared libs, + # as -lhts will prefer shared libraries + rm -rf ${bamboo_build_working_directory}/staging/{bin,share} + rm -f ${bamboo_build_working_directory}/staging/lib/*.so* + + # set pkg-config variables + export PKG_CONFIG_LIBDIR+=":${bamboo_build_working_directory}/staging/lib/pkgconfig" + + # convert `-I` to `-isystem` in pkg-config file in order not to trigger -Werror + sed -e 's/-I/-isystem/g' -i "${bamboo_build_working_directory}/staging/lib/pkgconfig/htslib.pc" + popd +fi + +# configure +# '--wrap-mode nofallback' prevents meson from downloading +# stuff from the internet or using subprojects. +meson \ + --werror \ + --buildtype "${BUILDTYPE:-release}" \ + --default-library "${LIBRARYTYPE:-shared}" \ + --libdir lib \ + --unity "${ENABLED_UNITY_BUILD:-off}" \ + --wrap-mode nofallback \ + --prefix "${PREFIX_ARG:-/}" \ + -Db_coverage="${ENABLED_COVERAGE:-false}" \ + -Db_sanitize="${ENABLED_SANITIZERS:-none}" \ + -Dtests="${ENABLED_TESTS:-false}" \ + "${CURRENT_BUILD_DIR:-build}" . + +# build +ninja -C "${CURRENT_BUILD_DIR:-build}" -v diff --git a/scripts/ci/install.sh b/scripts/ci/install.sh new file mode 100755 index 0000000..7bf937b --- /dev/null +++ b/scripts/ci/install.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -vex + +########### +# INSTALL # +########### + +if [[ ${_install_image} != true ]]; then + echo "Not installing image (branch: ${bamboo_planRepository_branchName}), returning." + return 0 +fi + +if [[ ${PREFIX_ARG} ]]; then + ## Cleaning out old installation from /mnt/software + rm -rf "${PREFIX_ARG}"/* +fi + +# *never* install with ASAN enabled +meson configure -Db_sanitize=none "${CURRENT_BUILD_DIR:-build}" + +DESTDIR="${DESTDIR:-/}" ninja -C "${CURRENT_BUILD_DIR:-build}" -v install diff --git a/scripts/ci/setup.sh b/scripts/ci/setup.sh new file mode 100755 index 0000000..7d8f4d4 --- /dev/null +++ b/scripts/ci/setup.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -vex + +export ENABLED_TESTS="true" + +case "${GCC_VERSION}" in + 4.8) + module load gtest/gcc48 + ;; + + next) + module load gcc/8.1.0 + module load gtest + ;; + + PA) + # have to build htslib for PA + module unload htslib + module load zlib + module load gtest/gcc48 + + # load SCL GCC + source /opt/rh/devtoolset-6/enable + + export NEXUS_PROJECT=pacbio/seq/pa/pbbam + export NEXUS_TC="" + export _artifact_versionprepend="true" + ;; + + *) + module load gcc + module load gtest + ;; +esac + +module load ccache + +export CC="ccache gcc" +export CXX="ccache g++" +export CCACHE_BASEDIR="${PWD}" + +if [[ $USER == bamboo ]]; then + export CCACHE_DIR=/mnt/secondary/Share/tmp/bamboo.${bamboo_shortPlanKey}.${bamboo_shortJobKey}.ccachedir + export CCACHE_TEMPDIR=/scratch/bamboo.ccache_tempdir +fi diff --git a/scripts/ci/test.sh b/scripts/ci/test.sh new file mode 100755 index 0000000..3abbd6c --- /dev/null +++ b/scripts/ci/test.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -vex + +######## +# TEST # +######## + +ninja -C "${CURRENT_BUILD_DIR:-build}" -v test + +############ +# COVERAGE # +############ + +if [[ ${ENABLED_COVERAGE:-false} == true ]]; then + module load gcov + + pushd "${CURRENT_BUILD_DIR:-build}" + find . -type f -iname '*.o' | xargs gcov -acbrfu {} \; >/dev/null && \ + mkdir coverage && pushd coverage && mv ../*.gcov . && \ + sed -i -e 's@Source:@Source:../@' *.gcov && \ + sed -i -e 's@Graph:@Graph:../@' *.gcov && \ + sed -i -e 's@Data:@Data:../@' *.gcov && \ + rm pugixml* && popd + popd +fi diff --git a/src/Accuracy.cpp b/src/Accuracy.cpp new file mode 100644 index 0000000..06b96a1 --- /dev/null +++ b/src/Accuracy.cpp @@ -0,0 +1,39 @@ +// File Description +/// \file Accuracy.cpp +/// \brief Implements the Accuracy class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Accuracy.h" + +namespace PacBio { +namespace BAM { + +const float Accuracy::MIN = 0.0f; +const float Accuracy::MAX = 1.0f; + +Accuracy::Accuracy(float accuracy) +{ + if (accuracy < Accuracy::MIN) + accuracy = Accuracy::MIN; + else if (accuracy > Accuracy::MAX) + accuracy = Accuracy::MAX; + accuracy_ = accuracy; +} + +Accuracy::Accuracy(const Accuracy&) = default; + +Accuracy::Accuracy(Accuracy&&) = default; + +Accuracy& Accuracy::operator=(const Accuracy&) = default; + +Accuracy& Accuracy::operator=(Accuracy&&) = default; + +Accuracy::~Accuracy() = default; + +Accuracy::operator float() const { return accuracy_; } + +} // namespace BAM +} // namespace PacBio diff --git a/src/AlignmentPrinter.cpp b/src/AlignmentPrinter.cpp new file mode 100644 index 0000000..55b43c6 --- /dev/null +++ b/src/AlignmentPrinter.cpp @@ -0,0 +1,132 @@ +// File Description +/// \file AlignmentPrinter.cpp +/// \brief Implements the AlignmentPrinter class. +// +// Author: Armin Töpfer + +#include "PbbamInternalConfig.h" + +#include "pbbam/AlignmentPrinter.h" + +#include +#include +#include +#include +#include +#include + +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +AlignmentPrinter::AlignmentPrinter(const IndexedFastaReader& ifr) + : ifr_{std::make_unique(ifr)} +{ +} + +AlignmentPrinter::AlignmentPrinter(AlignmentPrinter&&) = default; + +AlignmentPrinter& AlignmentPrinter::operator=(AlignmentPrinter&&) = default; + +AlignmentPrinter::~AlignmentPrinter() = default; + +std::string AlignmentPrinter::Print(const BamRecord& record, const Orientation orientation) +{ + const std::string seq{record.Sequence(orientation, true, true)}; + const std::string ref{ifr_->ReferenceSubsequence(record, orientation, true, true)}; + + if (seq.size() != ref.size()) { + std::ostringstream s; + s << "AlignmentPrinter: sequence and reference lengths are not equal:\n" + << " seq: " << seq.size() << '\n' + << " ref: " << ref.size(); + throw std::runtime_error{s.str()}; + } + + 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();) { + auto refCoordStr = std::to_string(refCoord); + auto 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()); + + // clang-format off + 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; + } + } + // clang-format on + + 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"; + } + const 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(); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Autovalidate.h b/src/Autovalidate.h new file mode 100644 index 0000000..ee9c723 --- /dev/null +++ b/src/Autovalidate.h @@ -0,0 +1,22 @@ +// File Description +/// \file Autovalidate.h +/// \brief Sets the default macro for the autovalidation mode. +// +// Author: Derek Barnett + +#ifndef AUTOVALIDATE_H +#define AUTOVALIDATE_H + +// \brief Auto-validation +// +// To validate BAM components (header, records, etc.) you can either use the +// Validator API provided, or enable auto-validation. To compile pbbam for +// auto-validation, add the -Dauto-validate=true option to your Meson +// invocation. +// +// +#ifndef PBBAM_AUTOVALIDATE +#define PBBAM_AUTOVALIDATE 0 +#endif + +#endif // AUTOVALIDATE_H diff --git a/src/BaiIndexedBamReader.cpp b/src/BaiIndexedBamReader.cpp new file mode 100644 index 0000000..815ec18 --- /dev/null +++ b/src/BaiIndexedBamReader.cpp @@ -0,0 +1,112 @@ +// File Description +/// \file BaiIndexedBamReader.cpp +/// \brief Implements the BaiIndexedBamReader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BaiIndexedBamReader.h" + +#include +#include +#include + +#include "MemoryUtils.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class BaiIndexedBamReader::BaiIndexedBamReaderPrivate +{ +public: + BaiIndexedBamReaderPrivate(const BamFile& file) { LoadIndex(file.Filename()); } + + BaiIndexedBamReaderPrivate(const BamFile& file, const GenomicInterval& interval) + : BaiIndexedBamReaderPrivate(file) + { + Interval(file.Header(), interval); + } + + void Interval(const BamHeader& header, const GenomicInterval& interval) + { + htsIterator_.reset(); + + if (header.HasSequence(interval.Name())) { + auto id = header.SequenceId(interval.Name()); + if (id >= 0 && static_cast(id) < header.NumSequences()) { + htsIterator_.reset( + bam_itr_queryi(htsIndex_.get(), id, interval.Start(), interval.Stop())); + } + } + + if (!htsIterator_) { + std::ostringstream s; + s << "BaiIndexedBamReader: could not create iterator for requested region: " + << interval.Name() << " [" << interval.Start() << ", " << interval.Stop() << ')'; + throw std::runtime_error{s.str()}; + } + } + + void LoadIndex(const std::string& fn) + { + htsIndex_.reset(bam_index_load(fn.c_str())); + if (!htsIndex_) + throw std::runtime_error{ + "BaiIndexedBamReader: could not load *.bai index data for file: " + fn}; + } + + int ReadRawData(BGZF* bgzf, bam1_t* b) + { + assert(htsIterator_.get()); + return hts_itr_next(bgzf, htsIterator_.get(), b, nullptr); + } + + GenomicInterval interval_; + std::unique_ptr htsIndex_; + std::unique_ptr htsIterator_; +}; + +BaiIndexedBamReader::BaiIndexedBamReader(std::string filename) + : BaiIndexedBamReader{BamFile{std::move(filename)}} +{ +} + +BaiIndexedBamReader::BaiIndexedBamReader(BamFile bamFile) + : BamReader{std::move(bamFile)}, d_{std::make_unique(File())} +{ +} + +BaiIndexedBamReader::BaiIndexedBamReader(const GenomicInterval& interval, std::string filename) + : BaiIndexedBamReader{interval, BamFile{std::move(filename)}} +{ +} + +BaiIndexedBamReader::BaiIndexedBamReader(const GenomicInterval& interval, BamFile bamFile) + : BamReader{std::move(bamFile)} + , d_{std::make_unique(File(), interval)} +{ +} + +const GenomicInterval& BaiIndexedBamReader::Interval() const +{ + assert(d_); + return d_->interval_; +} + +int BaiIndexedBamReader::ReadRawData(BGZF* bgzf, bam1_t* b) +{ + assert(d_); + return d_->ReadRawData(bgzf, b); +} + +BaiIndexedBamReader& BaiIndexedBamReader::Interval(const GenomicInterval& interval) +{ + assert(d_); + d_->Interval(Header(), interval); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamFile.cpp b/src/BamFile.cpp new file mode 100644 index 0000000..397e5d8 --- /dev/null +++ b/src/BamFile.cpp @@ -0,0 +1,201 @@ +// File Description +/// \file BamFile.cpp +/// \brief Implements the BamFile class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamFile.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "Autovalidate.h" +#include "FileUtils.h" +#include "MemoryUtils.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFile.h" + +namespace PacBio { +namespace BAM { + +class BamFile::BamFilePrivate +{ +public: + explicit BamFilePrivate(std::string fn) : filename_{std::move(fn)}, firstAlignmentOffset_{-1} + { + // ensure we've updated htslib verbosity with requested verbosity here + hts_verbose = (PacBio::BAM::HtslibVerbosity == -1 ? 0 : PacBio::BAM::HtslibVerbosity); + + // attempt open + auto f = RawOpen(); + +#if !defined(PBBAM_NO_CHECK_EOF) || PBBAM_AUTOVALIDATE + // sanity check on file + const auto eofCheck = bgzf_check_EOF(f->fp.bgzf); + if (eofCheck <= 0) { + // 1: EOF present & correct + // 2: not seekable (e.g. reading from stdin) + // 0: EOF absent + // -1: some other error + std::ostringstream e; + if (eofCheck == 0) + e << "BamFile: missing EOF block in " << fn; + else + e << "BamFile: unknown error encountered while checking EOF in " << fn + << " (status code = " << eofCheck << ')'; + throw std::runtime_error{e.str()}; + } +#endif + + // attempt fetch header + std::unique_ptr hdr(sam_hdr_read(f.get())); + header_ = BamHeaderMemory::FromRawData(hdr.get()); + + // cache first alignment offset + firstAlignmentOffset_ = bgzf_tell(f->fp.bgzf); + } + + std::unique_ptr DeepCopy() + { + return std::make_unique(filename_); + } + + bool HasEOF() const + { + // streamed input is unknown, since it's not random-accessible + if (filename_ == "-") return false; + + // attempt open + auto f = RawOpen(); + return RawEOFCheck(f) == 1; + } + + int RawEOFCheck(const std::unique_ptr& f) const + { + assert(f); + assert(f->fp.bgzf); + return bgzf_check_EOF(f->fp.bgzf); + } + + std::unique_ptr RawOpen() const + { + std::unique_ptr f(sam_open(filename_.c_str(), "rb")); + if (!f || !f->fp.bgzf) throw std::runtime_error{"BamFile: could not open: " + filename_}; + if (f->format.format != bam) + throw std::runtime_error{"BamFile: expected BAM, encountered un supported format: " + + filename_}; + return f; + } + + std::string filename_; + BamHeader header_; + int64_t firstAlignmentOffset_; +}; + +BamFile::BamFile(std::string filename) : d_{std::make_unique(std::move(filename))} +{ +} + +BamFile::BamFile(const BamFile& other) : d_{other.d_->DeepCopy()} {} + +BamFile::BamFile(BamFile&& other) : d_{std::move(other.d_)} {} + +BamFile& BamFile::operator=(const BamFile& other) +{ + if (this != &other) { + d_ = other.d_->DeepCopy(); + } + return *this; +} + +BamFile& BamFile::operator=(BamFile&& other) +{ + if (this != &other) { + d_ = std::move(other.d_); + } + return *this; +} + +BamFile::~BamFile() = default; + +void BamFile::CreatePacBioIndex() const { PbiFile::CreateFrom(*this); } + +void BamFile::CreateStandardIndex() const +{ + const auto ret = bam_index_build(d_->filename_.c_str(), 0); + if (ret != 0) { + std::ostringstream s; + s << "BamFile: could not create *.bai index for file: " << d_->filename_ + << " (status code = " << ret << ')'; + throw std::runtime_error{s.str()}; + } +} + +void BamFile::EnsurePacBioIndexExists() const +{ + if (!PacBioIndexExists()) CreatePacBioIndex(); +} + +void BamFile::EnsureStandardIndexExists() const +{ + if (!StandardIndexExists()) CreateStandardIndex(); +} + +const std::string& BamFile::Filename() const { return d_->filename_; } + +int64_t BamFile::FirstAlignmentOffset() const { return d_->firstAlignmentOffset_; } + +bool BamFile::HasEOF() const { return d_->HasEOF(); } + +bool BamFile::HasReference(const std::string& name) const { return d_->header_.HasSequence(name); } + +const BamHeader& BamFile::Header() const { return d_->header_; } + +bool BamFile::IsPacBioBAM() const { return !d_->header_.PacBioBamVersion().empty(); } + +bool BamFile::PacBioIndexExists() const { return FileUtils::Exists(PacBioIndexFilename()); } + +std::string BamFile::PacBioIndexFilename() const { return d_->filename_ + ".pbi"; } + +bool BamFile::PacBioIndexIsNewer() const +{ + const auto bamTimestamp = FileUtils::LastModified(Filename()); + const auto pbiTimestamp = FileUtils::LastModified(PacBioIndexFilename()); + return bamTimestamp <= pbiTimestamp; +} + +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() const { return FileUtils::Exists(StandardIndexFilename()); } + +std::string BamFile::StandardIndexFilename() const { return d_->filename_ + ".bai"; } + +bool BamFile::StandardIndexIsNewer() const +{ + const auto bamTimestamp = FileUtils::LastModified(Filename()); + const auto baiTimestamp = FileUtils::LastModified(StandardIndexFilename()); + return bamTimestamp <= baiTimestamp; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamFileMerger.cpp b/src/BamFileMerger.cpp new file mode 100644 index 0000000..b246619 --- /dev/null +++ b/src/BamFileMerger.cpp @@ -0,0 +1,260 @@ +// File Description +/// \file BamFileMerger.cpp +/// \brief Implements the BamFileMerger & helper classes. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamFileMerger.h" + +#include +#include +#include +#include +#include + +#include "pbbam/BamFile.h" +#include "pbbam/BamHeader.h" +#include "pbbam/BamReader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/CompositeBamReader.h" +#include "pbbam/DataSet.h" +#include "pbbam/IRecordWriter.h" +#include "pbbam/IndexedBamWriter.h" +#include "pbbam/PbiBuilder.h" +#include "pbbam/PbiFilter.h" +#include "pbbam/PbiIndexedBamReader.h" +#include "pbbam/RecordType.h" + +namespace PacBio { +namespace BAM { +namespace { // anonymous + +using CompositeMergeItem = internal::CompositeMergeItem; + +struct QNameSorter +{ + bool operator()(const CompositeMergeItem& lhs, const CompositeMergeItem& rhs) const + { + const BamRecord& l = lhs.record; + const BamRecord& r = rhs.record; + + // movie name + std::string lMovieName, rMovieName; // TODO(CD): memoize movienames? + try { + lMovieName = l.MovieName(); + } catch (std::runtime_error const& err) { + std::ostringstream s; + s << "BamFileMerger: could not get movie name from file: " << lhs.reader->Filename() + << " (reason = " << err.what() << ')'; + throw std::runtime_error(s.str()); + } + try { + rMovieName = r.MovieName(); + } catch (std::runtime_error const& err) { + std::ostringstream s; + s << "BamFileMerger: could not get movie name from file: " << rhs.reader->Filename() + << " (reason = " << err.what() << ')'; + throw std::runtime_error(s.str()); + } + const int cmp = lMovieName.compare(rMovieName); + if (cmp != 0) return cmp < 0; + + // hole number + const auto lhsZmw = l.HoleNumber(); + const auto rhsZmw = r.HoleNumber(); + if (lhsZmw != rhsZmw) return lhsZmw < rhsZmw; + + // shuffle CCS/transcript reads after all others + if (IsCcsOrTranscript(l.Type())) return false; + if (IsCcsOrTranscript(r.Type())) return true; + + // sort on qStart, then finally qEnd + const auto lhsQStart = l.QueryStart(); + const auto rhsQStart = r.QueryStart(); + if (lhsQStart != rhsQStart) return lhsQStart < rhsQStart; + + const auto lhsQEnd = l.QueryEnd(); + const auto rhsQEnd = r.QueryEnd(); + return lhsQEnd < rhsQEnd; + } +}; + +class ICollator +{ +public: + virtual bool GetNext(BamRecord&) = 0; + virtual ~ICollator() = default; + +protected: + ICollator() = default; +}; + +template +class CollatorImpl : public ICollator +{ +public: + CollatorImpl(std::vector> readers) : ICollator() + { + for (auto&& reader : readers) { + auto item = CompositeMergeItem{std::move(reader)}; + if (item.reader->GetNext(item.record)) mergeItems_.insert(std::move(item)); + } + } + + bool GetNext(BamRecord& record) override + { + if (mergeItems_.empty()) return false; + + // Move first record into our result + auto& firstItem = const_cast(*mergeItems_.begin()); + auto& firstRecord = firstItem.record; + std::swap(record, firstRecord); + + // Try to read next record from current reader. If available, re-insert + // into the set. Otherwise, just drop it (dtor will release resource). + CompositeMergeItem tmp(std::move(firstItem)); + mergeItems_.erase(mergeItems_.begin()); + if (tmp.reader->GetNext(tmp.record)) mergeItems_.insert(std::move(tmp)); + return true; + } + +private: + std::multiset mergeItems_; +}; + +using QNameCollator = CollatorImpl; +using AlignedCollator = CollatorImpl; + +std::vector> MakeBamReaders(std::vector bamFiles, + PbiFilter filter = PbiFilter{}) +{ + std::vector> readers; + for (auto& file : bamFiles) { + if (filter.IsEmpty()) + readers.emplace_back(std::make_unique(std::move(file))); + else + readers.emplace_back(std::make_unique(filter, std::move(file))); + } + assert(!readers.empty()); + return readers; +} + +std::unique_ptr MakeCollator(std::vector> readers, + const bool isCoordinateSorted = false) +{ + std::unique_ptr collator; + if (isCoordinateSorted) + collator = std::make_unique(std::move(readers)); + else + collator = std::make_unique(std::move(readers)); + return collator; +} + +std::unique_ptr MakeBamWriter(const std::vector>& readers, + const std::string& outputFilename, + const bool createPbi, const ProgramInfo& pgInfo) +{ + if (outputFilename.empty()) + throw std::runtime_error{"BamFileMerger: no output filename provided"}; + + // read headers + std::vector headers; + for (const auto& reader : readers) + headers.push_back(reader->Header()); + assert(!headers.empty()); + + // merge headers + BamHeader mergedHeader = headers.at(0); + const std::string usingSortOrder = mergedHeader.SortOrder(); + for (size_t i = 1; i < headers.size(); ++i) { + const auto& header = headers.at(i); + if (header.SortOrder() != usingSortOrder) + throw std::runtime_error{ + "BamFileMerger: BAM file sort orders do not match, aborting merge"}; + mergedHeader += header; + } + + // maybe add program info + if (pgInfo.IsValid()) mergedHeader.AddProgram(pgInfo); + + // create BAM writer (PBI-on-the-fly?) + if (createPbi) + return std::make_unique(outputFilename, mergedHeader); + else + return std::make_unique(outputFilename, mergedHeader); +} + +} // namespace anonymous + +void BamFileMerger::Merge(const std::vector& bamFilenames, + const std::string& outputFilename, bool createPbi, + const ProgramInfo& pgInfo) +{ + std::vector bamFiles; + for (const auto& fn : bamFilenames) + bamFiles.emplace_back(fn); + + auto readers = MakeBamReaders(std::move(bamFiles)); + const bool isCoordinateSorted = readers.front()->Header().SortOrder() == "coordinate"; + + auto writer = MakeBamWriter(readers, outputFilename, createPbi, pgInfo); + auto collator = MakeCollator(std::move(readers), isCoordinateSorted); + + BamRecord record; + while (collator->GetNext(record)) + writer->Write(record); +} + +void BamFileMerger::Merge(const DataSet& dataset, const std::string& outputFilename, bool createPbi, + const ProgramInfo& pgInfo) +{ + std::vector bamFiles = dataset.BamFiles(); + if (bamFiles.empty()) throw std::runtime_error{"BamFileMerger: no input filenames provided"}; + + auto readers = MakeBamReaders(std::move(bamFiles), PbiFilter::FromDataSet(dataset)); + const bool isCoordinateSorted = readers.front()->Header().SortOrder() == "coordinate"; + + auto writer = MakeBamWriter(readers, outputFilename, createPbi, pgInfo); + auto collator = MakeCollator(std::move(readers), isCoordinateSorted); + + BamRecord record; + while (collator->GetNext(record)) + writer->Write(record); +} + +void BamFileMerger::Merge(const std::vector& bamFilenames, IRecordWriter& writer) +{ + std::vector bamFiles; + for (const auto& fn : bamFilenames) + bamFiles.emplace_back(fn); + if (bamFiles.empty()) throw std::runtime_error{"BamFileMerger: no input filenames provided"}; + + auto readers = MakeBamReaders(std::move(bamFiles)); + const bool isCoordinateSorted = readers.front()->Header().SortOrder() == "coordinate"; + + auto collator = MakeCollator(std::move(readers), isCoordinateSorted); + + BamRecord record; + while (collator->GetNext(record)) + writer.Write(record); +} + +void BamFileMerger::Merge(const DataSet& dataset, IRecordWriter& writer) +{ + std::vector bamFiles = dataset.BamFiles(); + if (bamFiles.empty()) throw std::runtime_error{"BamFileMerger: no input filenames provided"}; + + auto readers = MakeBamReaders(std::move(bamFiles), PbiFilter::FromDataSet(dataset)); + const bool isCoordinateSorted = readers.front()->Header().SortOrder() == "coordinate"; + + auto collator = MakeCollator(std::move(readers), isCoordinateSorted); + + BamRecord record; + while (collator->GetNext(record)) + writer.Write(record); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamHeader.cpp b/src/BamHeader.cpp new file mode 100644 index 0000000..2ec2839 --- /dev/null +++ b/src/BamHeader.cpp @@ -0,0 +1,452 @@ +// File Description +/// \file BamHeader.cpp +/// \brief Implements the BamHeader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamHeader.h" + +#include +#include +#include +#include +#include + +#include + +#include "Version.h" +#include "pbbam/SamTagCodec.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +const std::string BamHeaderPrefixHD{"@HD"}; +const std::string BamHeaderPrefixSQ{"@SQ"}; +const std::string BamHeaderPrefixRG{"@RG"}; +const std::string BamHeaderPrefixPG{"@PG"}; +static const std::string BamHeaderPrefixCO{"@CO"}; + +const std::string BamHeaderTokenVN{"VN"}; +const std::string BamHeaderTokenSO{"SO"}; +const std::string BamHeaderTokenpb{"pb"}; + +bool CheckSortOrder(const std::string& lhs, const std::string& rhs) { return lhs == rhs; } + +bool CheckPbVersion(const std::string& lhs, const std::string& rhs) +{ + using Version = PacBio::BAM::Version; + + return (Version{lhs} >= Version::Minimum && Version{rhs} >= Version::Minimum); +} + +bool CheckSequences(const std::string& sortOrder, const std::vector& lhs, + const std::vector& rhs) +{ + return ((sortOrder == "coordinate") ? lhs == rhs : true); +} + +static void EnsureCanMerge(const BamHeader& lhs, const BamHeader& rhs) +{ + // check compatibility + const auto sortOrderOk = CheckSortOrder(lhs.SortOrder(), rhs.SortOrder()); + const auto pbVersionOk = CheckPbVersion(lhs.PacBioBamVersion(), rhs.PacBioBamVersion()); + const auto sequencesOk = CheckSequences(lhs.SortOrder(), lhs.Sequences(), rhs.Sequences()); + if (sortOrderOk && pbVersionOk && sequencesOk) return; + + // if any checks failed, format error message & throw + std::ostringstream e; + e << "BamHeader: could not merge headers:\n"; + + if (!sortOrderOk) { + e << " mismatched sort orders (@HD:SO) : (" << lhs.SortOrder() << ", " << rhs.SortOrder() + << ")\n"; + } + + if (!pbVersionOk) { + e << " incompatible PacBio BAM versions (@HD:pb) : (" << lhs.PacBioBamVersion() << ", " + << rhs.PacBioBamVersion() << ")\n"; + } + + if (!sequencesOk) e << " mismatched sequence lists (@SQ entries)\n"; + + throw std::runtime_error{e.str()}; +} + +void ParseHeaderLine(const std::string& line, BamHeader& hdr) +{ + // pop off '@HD\t', then split HD lines into tokens + const auto tokens = Split(line.substr(4), '\t'); + for (const auto& token : tokens) { + const auto tokenTag = token.substr(0, 2); + const auto tokenValue = token.substr(3); + + // set header contents + if (tokenTag == BamHeaderTokenVN) + hdr.Version(tokenValue); + else if (tokenTag == BamHeaderTokenSO) + hdr.SortOrder(tokenValue); + else if (tokenTag == BamHeaderTokenpb) + hdr.PacBioBamVersion(tokenValue); + } +} + +} // anonymous + +class BamHeader::BamHeaderPrivate +{ +public: + std::string version_; + std::string pacbioBamVersion_; + std::string sortOrder_; + std::map headerLineCustom_; + + std::map readGroups_; // id => read group info + std::map programs_; // id => program info + std::vector comments_; + + // we need to preserve insertion order, use lookup for access by name + std::vector sequences_; + std::map sequenceIdLookup_; +}; + +BamHeader::BamHeader() : d_{std::make_shared()} {} + +BamHeader::BamHeader(const BamHeader&) = default; + +BamHeader::BamHeader(BamHeader&&) = default; + +BamHeader& BamHeader::operator=(const BamHeader&) = default; + +BamHeader& BamHeader::operator=(BamHeader&&) = default; + +BamHeader::~BamHeader() = default; + +BamHeader::BamHeader(const std::string& samHeaderText) : d_{std::make_shared()} +{ + std::istringstream s{samHeaderText}; + std::string line; + std::string firstToken; + while (std::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 == BamHeaderPrefixHD) { + ParseHeaderLine(line, *this); + if (Version().empty()) Version(std::string{hts_version()}); + } + + else if (firstToken == BamHeaderPrefixSQ) + AddSequence(SequenceInfo::FromSam(line)); + + else if (firstToken == BamHeaderPrefixRG) + AddReadGroup(ReadGroupInfo::FromSam(line)); + + else if (firstToken == BamHeaderPrefixPG) + AddProgram(ProgramInfo::FromSam(line)); + + else if (firstToken == BamHeaderPrefixCO) + AddComment(line.substr(4)); + } +} + +BamHeader& BamHeader::operator+=(const BamHeader& other) +{ + EnsureCanMerge(*this, other); + + // merge read groups + for (const auto& rg : other.ReadGroups()) { + if (!HasReadGroup(rg.Id())) AddReadGroup(rg); + } + + // merge programs + for (const auto& pg : other.Programs()) { + if (!HasProgram(pg.Id())) AddProgram(pg); + } + + // merge comments + for (const auto& comment : other.Comments()) + AddComment(comment); + + return *this; +} + +BamHeader BamHeader::operator+(const BamHeader& other) const { return DeepCopy() += other; } + +BamHeader& BamHeader::AddComment(std::string comment) +{ + d_->comments_.push_back(std::move(comment)); + return *this; +} + +BamHeader& BamHeader::AddProgram(ProgramInfo pg) +{ + d_->programs_[pg.Id()] = std::move(pg); + return *this; +} + +BamHeader& BamHeader::AddReadGroup(ReadGroupInfo readGroup) +{ + d_->readGroups_[readGroup.Id()] = std::move(readGroup); + return *this; +} + +BamHeader& BamHeader::AddSequence(SequenceInfo sequence) +{ + const std::string name = sequence.Name(); + d_->sequences_.push_back(std::move(sequence)); + d_->sequenceIdLookup_[name] = d_->sequences_.size() - 1; + return *this; +} + +BamHeader& BamHeader::ClearComments() +{ + d_->comments_.clear(); + return *this; +} + +BamHeader& BamHeader::ClearPrograms() +{ + d_->programs_.clear(); + return *this; +} + +BamHeader& BamHeader::ClearReadGroups() +{ + d_->readGroups_.clear(); + return *this; +} + +BamHeader& BamHeader::ClearSequences() +{ + d_->sequenceIdLookup_.clear(); + d_->sequences_.clear(); + return *this; +} + +std::vector BamHeader::Comments() const { return d_->comments_; } + +BamHeader& BamHeader::Comments(std::vector comments) +{ + d_->comments_ = std::move(comments); + return *this; +} + +BamHeader BamHeader::DeepCopy() 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(); +} + +size_t BamHeader::NumSequences() const { return d_->sequences_.size(); } + +std::string BamHeader::PacBioBamVersion() const { return d_->pacbioBamVersion_; } + +BamHeader& BamHeader::PacBioBamVersion(const std::string& version) +{ + d_->pacbioBamVersion_ = version; + const PacBio::BAM::Version fileVersion{version}; + if (fileVersion < Version::Minimum) { + throw std::runtime_error{ + "BamHeader: invalid PacBio BAM version number (" + fileVersion.ToString() + + ") is older than the minimum supported version (" + Version::Minimum.ToString() + ")"}; + } + 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{"BamHeader: program ID not found: " + id}; + return iter->second; +} + +std::vector BamHeader::ProgramIds() const +{ + std::vector result; + result.reserve(d_->programs_.size()); + for (const auto& pg : d_->programs_) + result.push_back(pg.first); + return result; +} + +std::vector BamHeader::Programs() const +{ + std::vector result; + result.reserve(d_->programs_.size()); + for (const auto& pg : d_->programs_) + result.push_back(pg.second); + return result; +} + +BamHeader& BamHeader::Programs(std::vector programs) +{ + d_->programs_.clear(); + for (const auto& pg : programs) + d_->programs_[pg.Id()] = std::move(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{"BamHeader: read group ID not found: " + id}; + return iter->second; +} + +std::vector BamHeader::ReadGroupIds() const +{ + std::vector result; + result.reserve(d_->readGroups_.size()); + for (const auto& rg : d_->readGroups_) + result.push_back(rg.first); + return result; +} + +std::vector BamHeader::ReadGroups() const +{ + std::vector result; + result.reserve(d_->readGroups_.size()); + for (const auto& rg : d_->readGroups_) + result.push_back(rg.second); + return result; +} + +BamHeader& BamHeader::ReadGroups(std::vector readGroups) +{ + d_->readGroups_.clear(); + for (auto&& rg : readGroups) + d_->readGroups_[rg.Id()] = std::move(rg); + return *this; +} + +SequenceInfo BamHeader::Sequence(const int32_t id) const { return d_->sequences_.at(id); } + +SequenceInfo BamHeader::Sequence(const std::string& name) const +{ + // TODO: SequenceId(name) throws if not found, should we do so here as well? + + const auto iter = d_->sequenceIdLookup_.find(name); + if (iter == d_->sequenceIdLookup_.cend()) return SequenceInfo(); + const auto index = iter->second; + assert(index >= 0 && static_cast(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{"BamHeader: sequence name not found: " + name}; + 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(); } + +std::vector BamHeader::SequenceNames() const +{ + std::vector result; + result.reserve(d_->sequences_.size()); + for (const auto& seq : d_->sequences_) + result.push_back(seq.Name()); + return result; +} + +std::vector BamHeader::Sequences() const { return d_->sequences_; } + +BamHeader& BamHeader::Sequences(std::vector sequences) +{ + d_->sequences_.clear(); + for (auto&& seq : sequences) + AddSequence(std::move(seq)); + return *this; +} + +std::string BamHeader::SortOrder() const { return d_->sortOrder_; } + +BamHeader& BamHeader::SortOrder(std::string order) +{ + d_->sortOrder_ = std::move(order); + return *this; +} + +std::string BamHeader::ToSam() const +{ + // init stream + std::ostringstream out; + + // @HD + const auto outputVersion = (d_->version_.empty() ? std::string{hts_version()} : d_->version_); + const auto outputSortOrder = (d_->sortOrder_.empty() ? std::string{"unknown"} : d_->sortOrder_); + const auto outputPbBamVersion = + (d_->pacbioBamVersion_.empty() ? Version::Current.ToString() : d_->pacbioBamVersion_); + + out << BamHeaderPrefixHD << MakeSamTag(BamHeaderTokenVN, outputVersion) + << MakeSamTag(BamHeaderTokenSO, outputSortOrder) + << MakeSamTag(BamHeaderTokenpb, outputPbBamVersion) << '\n'; + + // @SQ + for (const auto& seq : d_->sequences_) + out << seq.ToSam() << '\n'; + + // @RG + for (const auto& rgIter : d_->readGroups_) + out << rgIter.second.ToSam() << '\n'; + + // @PG + for (const auto& progIter : d_->programs_) + out << progIter.second.ToSam() << '\n'; + + // @CO + for (const auto& comment : d_->comments_) + out << BamHeaderPrefixCO << '\t' << comment << '\n'; + + // return result + return out.str(); +} + +std::string BamHeader::Version() const { return d_->version_; } + +BamHeader& BamHeader::Version(std::string version) +{ + d_->version_ = std::move(version); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamReader.cpp b/src/BamReader.cpp new file mode 100644 index 0000000..e859b47 --- /dev/null +++ b/src/BamReader.cpp @@ -0,0 +1,138 @@ +// File Description +/// \file BamReader.cpp +/// \brief Implements the BamReader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamReader.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "Autovalidate.h" +#include "MemoryUtils.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/Validator.h" + +namespace PacBio { +namespace BAM { + +class BamReader::BamReaderPrivate +{ +public: + explicit BamReaderPrivate(BamFile bamFile) : bamFile_{std::move(bamFile)} { DoOpen(); } + + void DoOpen() + { + // fetch file pointer + htsFile_.reset(sam_open(bamFile_.Filename().c_str(), "rb")); + if (!htsFile_) + throw std::runtime_error{"BamReader: could not open BAM file for reading: " + + bamFile_.Filename()}; + } + + std::unique_ptr htsFile_; + BamFile bamFile_; +}; + +BamReader::BamReader(std::string fn) : BamReader{BamFile{std::move(fn)}} {} + +BamReader::BamReader(BamFile bamFile) : d_{std::make_unique(std::move(bamFile))} +{ + // skip header + VirtualSeek(d_->bamFile_.FirstAlignmentOffset()); +} + +BamReader::~BamReader() = default; + +BGZF* BamReader::Bgzf() const +{ + assert(d_); + assert(d_->htsFile_); + assert(d_->htsFile_->fp.bgzf); + return d_->htsFile_->fp.bgzf; +} + +const BamFile& BamReader::File() const +{ + assert(d_); + return d_->bamFile_; +} + +const std::string& BamReader::Filename() const +{ + assert(d_); + return d_->bamFile_.Filename(); +} + +const BamHeader& BamReader::Header() const +{ + assert(d_); + return d_->bamFile_.Header(); +} + +bool BamReader::GetNext(BamRecord& record) +{ + assert(Bgzf()); + assert(BamRecordMemory::GetRawData(record).get()); + + const auto result = ReadRawData(Bgzf(), BamRecordMemory::GetRawData(record).get()); + + // success + if (result >= 0) { + BamRecordMemory::UpdateRecordTags(record); + record.header_ = Header(); + record.ResetCachedPositions(); + +#if PBBAM_AUTOVALIDATE + Validator::Validate(record); +#endif + return true; + } + + // EOF or end-of-data range (not an error) + else if (result == -1) + return false; + + // error corrupted file + else { + std::ostringstream msg; + msg << "BamReader: cannot read from corrupted file: " << Filename() << '\n' << " reason: "; + if (result == -2) + msg << "probably truncated"; + else if (result == -3) + msg << "could not read BAM record's' core data"; + else if (result == -4) + msg << "could not read BAM record's' variable-length data"; + else + msg << "unknown reason"; + msg << " (status code = " << result << ')'; + throw std::runtime_error{msg.str()}; + } +} + +int BamReader::ReadRawData(BGZF* bgzf, bam1_t* b) { return bam_read1(bgzf, b); } + +void BamReader::VirtualSeek(int64_t virtualOffset) +{ + const auto result = bgzf_seek(Bgzf(), virtualOffset, SEEK_SET); + if (result != 0) { + std::ostringstream s; + s << "BamReader: failed to seek in file: " << Filename() << " (offset = " << virtualOffset + << ')'; + throw std::runtime_error{s.str()}; + } +} + +int64_t BamReader::VirtualTell() const { return bgzf_tell(Bgzf()); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamRecord.cpp b/src/BamRecord.cpp new file mode 100644 index 0000000..f0fbec1 --- /dev/null +++ b/src/BamRecord.cpp @@ -0,0 +1,2345 @@ +// File Description +/// \file BamRecord.cpp +/// \brief Implements the BamRecord class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamRecord.h" + +#include +#include +#include +#include + +#include +#include + +#include "BamRecordTags.h" +#include "MemoryUtils.h" +#include "Pulse2BaseCache.h" +#include "SequenceUtils.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/StringUtilities.h" +#include "pbbam/ZmwTypeMap.h" +#include "pbbam/virtual/VirtualRegionTypeMap.h" + +namespace PacBio { +namespace BAM { +namespace { + +// record type names +const std::string recordTypeName_ZMW{"ZMW"}; +const std::string recordTypeName_Polymerase{"POLYMERASE"}; +const std::string recordTypeName_HqRegion{"HQREGION"}; +const std::string recordTypeName_Subread{"SUBREAD"}; +const std::string recordTypeName_CCS{"CCS"}; +const std::string recordTypeName_Scrap{"SCRAP"}; +const std::string recordTypeName_Transcript{"TRANSCRIPT"}; +const std::string recordTypeName_Unknown{"UNKNOWN"}; + +int32_t HoleNumberFromName(const std::string& fullName) +{ + const auto mainTokens = Split(fullName, '/'); + if (mainTokens.at(0) == "transcript") { + if (mainTokens.size() != 2) + throw std::runtime_error{"BamRecord: malformed transcript record name: " + fullName}; + return std::stoi(mainTokens.at(1)); + } else { + if (mainTokens.size() != 3) + throw std::runtime_error{"BamRecord: malformed record name: " + fullName}; + return std::stoi(mainTokens.at(1)); + } +} + +Position QueryEndFromName(const std::string& fullName) +{ + const auto mainTokens = Split(fullName, '/'); + if (mainTokens.size() != 3) + throw std::runtime_error{"BamRecord: malformed record name: " + fullName}; + + const auto queryTokens = Split(mainTokens.at(2), '_'); + if (queryTokens.size() != 2) + throw std::runtime_error{"BamRecord: malformed record name: " + fullName}; + + return stoi(queryTokens.at(1)); +} + +Position QueryStartFromName(const std::string& fullName) +{ + const auto mainTokens = Split(fullName, '/'); + if (mainTokens.size() != 3) + throw std::runtime_error{"BamRecord: malformed record name: " + fullName}; + + const auto queryTokens = Split(mainTokens.at(2), '_'); + if (queryTokens.size() != 2) + throw std::runtime_error{"BamRecord: malformed record name: " + fullName}; + + return stoi(queryTokens.at(0)); +} + +std::string Label(const BamRecordTag tag) { return BamRecordTags::LabelFor(tag); } + +BamRecordImpl* CreateOrEdit(const BamRecordTag tag, const Tag& value, BamRecordImpl* impl) +{ + if (impl->HasTag(tag)) + impl->EditTag(tag, value); + else + impl->AddTag(tag, value); + return impl; +} + +std::pair AlignedOffsets(const BamRecord& record, const int seqLength) +{ + int32_t startOffset = 0; + int32_t endOffset = seqLength; + + const auto b = BamRecordMemory::GetRawData(record); + uint32_t* cigarData = bam_get_cigar(b.get()); + const size_t numCigarOps = b->core.n_cigar; + if (numCigarOps > 0) { + + // start offset + for (size_t i = 0; i < numCigarOps; ++i) { + const auto type = static_cast(bam_cigar_op(cigarData[i])); + if (type == CigarOperationType::HARD_CLIP) { + if (startOffset != 0 && startOffset != seqLength) { + startOffset = -1; + break; + } + } else if (type == CigarOperationType::SOFT_CLIP) + startOffset += bam_cigar_oplen(cigarData[i]); + else + break; + } + + // end offset + for (int i = numCigarOps - 1; i >= 0; --i) { + const auto type = static_cast(bam_cigar_op(cigarData[i])); + if (type == CigarOperationType::HARD_CLIP) { + if (endOffset != 0 && endOffset != seqLength) { + endOffset = -1; + break; + } + } else if (type == CigarOperationType::SOFT_CLIP) + endOffset -= bam_cigar_oplen(cigarData[i]); + else + break; + } + + if (endOffset == 0) endOffset = seqLength; + } + return {startOffset, endOffset}; +} + +template +OutputIt Move_N(InputIt first, Size count, OutputIt result) +{ + return std::move(first, first + count, result); +} + +template +T ClipSeqQV(const T& input, const size_t pos, const size_t len) +{ + if (input.empty()) return {}; + return T{input.cbegin() + pos, input.cbegin() + pos + len}; +} + +template +T ClipPulse(const T& input, PacBio::BAM::Pulse2BaseCache* p2bCache, const size_t pos, + const size_t len) +{ + assert(p2bCache); + if (input.empty()) return {}; + + // find start + size_t start = p2bCache->FindFirst(); + size_t basesSeen = 0; + while (basesSeen < pos) { + start = p2bCache->FindNext(start); + ++basesSeen; + } + + // find end + size_t end = start; + size_t seen = 1; + while (seen < len) { + end = p2bCache->FindNext(end); + ++seen; + } + + // return clipped + return {input.cbegin() + start, input.cbegin() + end + 1}; +} + +template +void ClipAndGapify(const BamRecordImpl& impl, const bool aligned, const bool exciseSoftClips, + F* seq, N paddingNullValue, N deletionNullValue) +{ + assert(seq); + + const bool clipOrGapRequested = aligned || exciseSoftClips; + if (impl.IsMapped() && clipOrGapRequested) { + // determine final container length + auto incrementsOutputLength = [](const CigarOperationType type, const bool isAligned, + const bool exciseSoftClipsFromAln) { + if (type == CigarOperationType::HARD_CLIP || + type == CigarOperationType::REFERENCE_SKIP) { + return false; + } else if (type == CigarOperationType::SOFT_CLIP && exciseSoftClipsFromAln) { + return false; + } else if (!isAligned && (type == CigarOperationType::DELETION || + type == CigarOperationType::PADDING)) { + return false; + } else + return true; + }; + + size_t outputLength = 0; + const auto cigar = impl.CigarData(); + for (const CigarOperation& op : cigar) { + if (incrementsOutputLength(op.Type(), aligned, exciseSoftClips)) + outputLength += op.Length(); + } + + // move original data to temp, prep output container size + F originalSeq = std::move(*seq); + seq->resize(outputLength); + + // apply CIGAR ops + size_t srcIndex = 0; + size_t dstIndex = 0; + for (const CigarOperation& op : cigar) { + const auto opType = op.Type(); + const auto opLength = op.Length(); + + // nothing to do for hard-clipped & ref-skipped positions + if (opType == CigarOperationType::HARD_CLIP || + opType == CigarOperationType::REFERENCE_SKIP) { + continue; + } + + // maybe skip soft-clipped positions + else if (opType == CigarOperationType::SOFT_CLIP) { + if (exciseSoftClips) + srcIndex += opLength; + else { + Move_N(originalSeq.begin() + srcIndex, opLength, seq->begin() + dstIndex); + srcIndex += opLength; + dstIndex += opLength; + } + } + + // maybe add deletion/padding values + // either way, srcIndex is not incremented + else if (opType == CigarOperationType::DELETION) { + if (aligned) { + for (size_t i = 0; i < opLength; ++i) { + (*seq)[dstIndex] = deletionNullValue; + ++dstIndex; + } + } + } else if (opType == CigarOperationType::PADDING) { + if (aligned) { + for (size_t i = 0; i < opLength; ++i) { + (*seq)[dstIndex] = paddingNullValue; + ++dstIndex; + } + } + } + + // all other CIGAR ops + else { + Move_N(originalSeq.begin() + srcIndex, opLength, seq->begin() + dstIndex); + srcIndex += opLength; + dstIndex += opLength; + } + } + } +} + +void ClipAndGapifyBases(const BamRecordImpl& impl, const bool aligned, const bool exciseSoftClips, + std::string* seq) +{ + ClipAndGapify(impl, aligned, exciseSoftClips, seq, '*', '-'); +} + +void ClipAndGapifyFrames(const BamRecordImpl& impl, const bool aligned, const bool exciseSoftClips, + Frames* frames) +{ + assert(frames); + std::vector data{std::move(frames->Data())}; + ClipAndGapify, uint16_t>(impl, aligned, exciseSoftClips, &data, 0, 0); + frames->Data(data); +} + +void ClipAndGapifyPhotons(const BamRecordImpl& impl, const bool aligned, const bool exciseSoftClips, + std::vector* data) +{ + ClipAndGapify, float>(impl, aligned, exciseSoftClips, data, 0.0, 0.0); +} + +void ClipAndGapifyQualities(const BamRecordImpl& impl, const bool aligned, + const bool exciseSoftClips, QualityValues* quals) +{ + ClipAndGapify(impl, aligned, exciseSoftClips, quals, + QualityValue(0), QualityValue(0)); +} + +void ClipAndGapifyUInts(const BamRecordImpl& impl, const bool aligned, const bool exciseSoftClips, + std::vector* data) +{ + ClipAndGapify, uint32_t>(impl, aligned, exciseSoftClips, data, 0, 0); +} + +void ClipAndGapifyUInt8s(const BamRecordImpl& impl, const bool aligned, const bool exciseSoftClips, + std::vector* data) +{ + ClipAndGapify, uint8_t>(impl, aligned, exciseSoftClips, data, 0, 0); +} + +RecordType NameToType(const std::string& name) +{ + if (name == recordTypeName_Subread) return RecordType::SUBREAD; + if (name == recordTypeName_ZMW || name == recordTypeName_Polymerase) return RecordType::ZMW; + if (name == recordTypeName_HqRegion) return RecordType::HQREGION; + if (name == recordTypeName_CCS) return RecordType::CCS; + if (name == recordTypeName_Scrap) return RecordType::SCRAP; + if (name == recordTypeName_Transcript) return RecordType::TRANSCRIPT; + return RecordType::UNKNOWN; +} + +void OrientBasesAsRequested(std::string* bases, Orientation current, Orientation requested, + bool isReverseStrand, bool isPulse) +{ + assert(bases); + if (current != requested && isReverseStrand) { + if (isPulse) + ReverseComplementCaseSens(*bases); + else + ReverseComplement(*bases); + } +} + +template +void OrientTagDataAsRequested(Container* data, Orientation current, Orientation requested, + bool isReverseStrand) +{ + assert(data); + if (current != requested && isReverseStrand) std::reverse(data->begin(), data->end()); +} + +bool ConsumesQuery(const CigarOperationType type) +{ + return (bam_cigar_type(static_cast(type)) & 0x1) != 0; +} + +bool ConsumesReference(const CigarOperationType type) +{ + return (bam_cigar_type(static_cast(type)) & 0x2) != 0; +} + +} // anonymous + +const float BamRecord::photonFactor = 10.0; + +BamRecord::BamRecord() + : alignedStart_{PacBio::BAM::UnmappedPosition}, alignedEnd_{PacBio::BAM::UnmappedPosition} +{ +} + +BamRecord::BamRecord(BamHeader header) + : header_{std::move(header)} + , 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_)} + , p2bCache_{std::move(other.p2bCache_)} +{ +} + +BamRecord& BamRecord::operator=(const BamRecord& other) +{ + if (this != &other) { + impl_ = other.impl_; + header_ = other.header_; + alignedStart_ = other.alignedStart_; + alignedEnd_ = other.alignedEnd_; + p2bCache_.reset(); // just reset, for now at least + } + return *this; +} + +BamRecord& BamRecord::operator=(BamRecord&& other) +{ + if (this != &other) { + impl_ = std::move(other.impl_); + header_ = std::move(other.header_); + alignedStart_ = std::move(other.alignedStart_); + alignedEnd_ = std::move(other.alignedEnd_); + p2bCache_ = std::move(other.p2bCache_); + } + return *this; +} + +BamRecord::~BamRecord() = default; + +Position BamRecord::AlignedEnd() const +{ + if (alignedEnd_ == PacBio::BAM::UnmappedPosition) CalculateAlignedPositions(); + return alignedEnd_; +} + +Position BamRecord::AlignedStart() const +{ + if (alignedStart_ == PacBio::BAM::UnmappedPosition) CalculateAlignedPositions(); + return alignedStart_; +} + +Strand BamRecord::AlignedStrand() const +{ + return impl_.IsReverseStrand() ? Strand::REVERSE : Strand::FORWARD; +} + +QualityValues BamRecord::AltLabelQV(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchQualities(BamRecordTag::ALT_LABEL_QV, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::AltLabelQV(const QualityValues& altLabelQVs) +{ + CreateOrEdit(BamRecordTag::ALT_LABEL_QV, altLabelQVs.Fastq(), &impl_); + return *this; +} + +std::string BamRecord::AltLabelTag(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchBases(BamRecordTag::ALT_LABEL_TAG, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::AltLabelTag(const std::string& tags) +{ + CreateOrEdit(BamRecordTag::ALT_LABEL_TAG, tags, &impl_); + return *this; +} + +int16_t BamRecord::BarcodeForward() const { return Barcodes().first; } + +int16_t BamRecord::BarcodeReverse() const { return Barcodes().second; } + +uint8_t BamRecord::BarcodeQuality() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::BARCODE_QUALITY); + const auto bq = impl_.TagValue(tagName); + if (bq.IsNull()) + return 0; // ?? "missing" value for tags ?? should we consider boost::optional for these kind of guys ?? + return bq.ToUInt8(); +} + +BamRecord& BamRecord::BarcodeQuality(const uint8_t quality) +{ + CreateOrEdit(BamRecordTag::BARCODE_QUALITY, quality, &impl_); + return *this; +} + +std::pair BamRecord::Barcodes() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::BARCODES); + const Tag bc = impl_.TagValue(tagName); + if (bc.IsNull()) + throw std::runtime_error{"BamRecord: barcode tag (bc) was requested but is missing"}; + + // NOTE: barcodes are still stored, per the spec, as uint16, even though + // we're now using them as int16_t in the API (bug 31511) + // + if (!bc.IsUInt16Array()) + throw std::runtime_error{ + "BamRecord: barcode tag (bc) is malformed: should be a uint16_t array of size==2."}; + const auto bcArray = bc.ToUInt16Array(); + if (bcArray.size() != 2) + throw std::runtime_error{ + "BamRecord: barcode tag (bc) is malformed: should be a uint16_t array of size==2."}; + + return {boost::numeric_cast(bcArray[0]), boost::numeric_cast(bcArray[1])}; +} + +BamRecord& BamRecord::Barcodes(const std::pair& barcodeIds) +{ + const std::vector data{boost::numeric_cast(barcodeIds.first), + boost::numeric_cast(barcodeIds.second)}; + CreateOrEdit(BamRecordTag::BARCODES, data, &impl_); + return *this; +} + +void BamRecord::CalculateAlignedPositions() const +{ + // reset + ResetCachedPositions(); + + // skip if unmapped, or has no queryStart/End + if (!impl_.IsMapped()) return; + + // get the query start/end + const auto seqLength = static_cast(impl_.SequenceLength()); + const bool isCcsOrTranscript = IsCcsOrTranscript(Type()); + const Position qStart = isCcsOrTranscript ? 0 : QueryStart(); + const Position qEnd = isCcsOrTranscript ? seqLength : QueryEnd(); + + if (qStart == PacBio::BAM::UnmappedPosition || qEnd == PacBio::BAM::UnmappedPosition) return; + + // determine clipped end ranges + const auto alignedOffsets = AlignedOffsets(*this, seqLength); + const auto startOffset = alignedOffsets.first; + const auto endOffset = alignedOffsets.second; + 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); + } +} + +void BamRecord::CalculatePulse2BaseCache() const +{ + // skip already calculated + if (p2bCache_) return; + + // else try to calculate p2b cache. + if (!HasPulseCall()) + throw std::runtime_error{ + "BamRecord: cannot calculate pulse2base mapping without 'pc' tag."}; + const auto pulseCalls = + FetchBases(BamRecordTag::PULSE_CALL, Orientation::NATIVE, false, false, PulseBehavior::ALL); + p2bCache_ = std::make_unique(pulseCalls); +} + +Cigar BamRecord::CigarData(bool exciseAllClips) const +{ + auto isClippingOp = [](const CigarOperation& op) { + const auto type = op.Type(); + return type == CigarOperationType::SOFT_CLIP || type == CigarOperationType::HARD_CLIP; + }; + + auto cigar = impl_.CigarData(); + if (exciseAllClips) { + cigar.erase(std::remove_if(cigar.begin(), cigar.end(), isClippingOp), cigar.end()); + } + return cigar; +} + +BamRecord& BamRecord::Clip(const ClipType clipType, const Position start, const Position end, + const bool exciseFlankingInserts) +{ + switch (clipType) { + case ClipType::CLIP_NONE: + return *this; + case ClipType::CLIP_TO_QUERY: + // exciseFlankingInserts ignored, just clipping to query coordinates + return ClipToQuery(start, end); + case ClipType::CLIP_TO_REFERENCE: + return ClipToReference(start, end, exciseFlankingInserts); + default: + throw std::runtime_error{"BamRecord: unsupported clip type requested"}; + } +} + +BamRecord BamRecord::Clipped(const BamRecord& input, const ClipType clipType, + const PacBio::BAM::Position start, const PacBio::BAM::Position end, + const bool exciseFlankingInserts) +{ + return input.Clipped(clipType, start, end, exciseFlankingInserts); +} + +BamRecord BamRecord::Clipped(const ClipType clipType, const PacBio::BAM::Position start, + const PacBio::BAM::Position end, + const bool exciseFlankingInserts) const +{ + BamRecord result(*this); + result.Clip(clipType, start, end, exciseFlankingInserts); + return result; +} + +void BamRecord::ClipTags(const size_t clipFrom, const size_t clipLength) +{ + const auto ipdCodec = ReadGroup().IpdCodec(); + const auto pwCodec = ReadGroup().PulseWidthCodec(); + + // update BAM tags + TagCollection tags = impl_.Tags(); + if (HasDeletionQV()) + tags[Label(BamRecordTag::DELETION_QV)] = + ClipSeqQV(DeletionQV(Orientation::NATIVE), clipFrom, clipLength).Fastq(); + if (HasInsertionQV()) + tags[Label(BamRecordTag::INSERTION_QV)] = + ClipSeqQV(InsertionQV(Orientation::NATIVE), clipFrom, clipLength).Fastq(); + if (HasMergeQV()) + tags[Label(BamRecordTag::MERGE_QV)] = + ClipSeqQV(MergeQV(Orientation::NATIVE), clipFrom, clipLength).Fastq(); + if (HasSubstitutionQV()) + tags[Label(BamRecordTag::SUBSTITUTION_QV)] = + ClipSeqQV(SubstitutionQV(Orientation::NATIVE), clipFrom, clipLength).Fastq(); + if (HasIPD()) { + if (ipdCodec == FrameCodec::RAW) + tags[Label(BamRecordTag::IPD)] = + ClipSeqQV(IPD(Orientation::NATIVE).Data(), clipFrom, clipLength); + else if (ipdCodec == FrameCodec::V1) + tags[Label(BamRecordTag::IPD)] = + ClipSeqQV(IPD(Orientation::NATIVE).Encode(), clipFrom, clipLength); + } + if (HasPulseWidth()) { + if (pwCodec == FrameCodec::RAW) + tags[Label(BamRecordTag::PULSE_WIDTH)] = + ClipSeqQV(PulseWidth(Orientation::NATIVE).Data(), clipFrom, clipLength); + else if (pwCodec == FrameCodec::V1) + tags[Label(BamRecordTag::PULSE_WIDTH)] = + ClipSeqQV(PulseWidth(Orientation::NATIVE).Encode(), clipFrom, clipLength); + } + if (HasDeletionTag()) + tags[Label(BamRecordTag::DELETION_TAG)] = + ClipSeqQV(DeletionTag(Orientation::NATIVE), clipFrom, clipLength); + if (HasSubstitutionTag()) + tags[Label(BamRecordTag::SUBSTITUTION_TAG)] = + ClipSeqQV(SubstitutionTag(Orientation::NATIVE), clipFrom, clipLength); + + // internal BAM tags + if (HasPulseCall()) { + + // ensure p2bCache initialized + CalculatePulse2BaseCache(); + Pulse2BaseCache* p2bCache = p2bCache_.get(); + + if (HasAltLabelQV()) + tags[Label(BamRecordTag::ALT_LABEL_QV)] = + ClipPulse(AltLabelQV(Orientation::NATIVE), p2bCache, clipFrom, clipLength).Fastq(); + if (HasLabelQV()) + tags[Label(BamRecordTag::LABEL_QV)] = + ClipPulse(LabelQV(Orientation::NATIVE), p2bCache, clipFrom, clipLength).Fastq(); + if (HasPulseMergeQV()) + tags[Label(BamRecordTag::PULSE_MERGE_QV)] = + ClipPulse(PulseMergeQV(Orientation::NATIVE), p2bCache, clipFrom, clipLength) + .Fastq(); + if (HasAltLabelTag()) + tags[Label(BamRecordTag::ALT_LABEL_TAG)] = + ClipPulse(AltLabelTag(Orientation::NATIVE), p2bCache, clipFrom, clipLength); + if (HasPulseCall()) + tags[Label(BamRecordTag::PULSE_CALL)] = + ClipPulse(PulseCall(Orientation::NATIVE), p2bCache, clipFrom, clipLength); + if (HasPkmean()) + tags[Label(BamRecordTag::PKMEAN)] = EncodePhotons( + ClipPulse(Pkmean(Orientation::NATIVE), p2bCache, clipFrom, clipLength)); + if (HasPkmid()) + tags[Label(BamRecordTag::PKMID)] = EncodePhotons( + ClipPulse(Pkmid(Orientation::NATIVE), p2bCache, clipFrom, clipLength)); + if (HasPkmean2()) + tags[Label(BamRecordTag::PKMEAN_2)] = EncodePhotons( + ClipPulse(Pkmean2(Orientation::NATIVE), p2bCache, clipFrom, clipLength)); + if (HasPkmid2()) + tags[Label(BamRecordTag::PKMID_2)] = EncodePhotons( + ClipPulse(Pkmid2(Orientation::NATIVE), p2bCache, clipFrom, clipLength)); + if (HasPrePulseFrames()) + tags[Label(BamRecordTag::PRE_PULSE_FRAMES)] = ClipPulse( + PrePulseFrames(Orientation::NATIVE).Data(), p2bCache, clipFrom, clipLength); + if (HasPulseCallWidth()) + tags[Label(BamRecordTag::PULSE_CALL_WIDTH)] = ClipPulse( + PulseCallWidth(Orientation::NATIVE).Data(), p2bCache, clipFrom, clipLength); + if (HasStartFrame()) + tags[Label(BamRecordTag::START_FRAME)] = + ClipPulse(StartFrame(Orientation::NATIVE), p2bCache, clipFrom, clipLength); + } + + impl_.Tags(tags); +} + +void BamRecord::ClipFields(const size_t clipFrom, const size_t clipLength) +{ + const bool isForwardStrand = (AlignedStrand() == Strand::FORWARD); + + // clip seq, quals + std::string sequence{ClipSeqQV(Sequence(Orientation::NATIVE), clipFrom, clipLength)}; + QualityValues qualities{ClipSeqQV(Qualities(Orientation::NATIVE), clipFrom, clipLength)}; + if (!isForwardStrand) { + ReverseComplement(sequence); + Reverse(qualities); + } + impl_.SetSequenceAndQualities(sequence, qualities.Fastq()); + + ClipTags(clipFrom, clipLength); +} + +BamRecord& BamRecord::ClipToQuery(const Position start, const Position end) +{ + if (IsMapped() && (AlignedStrand() == Strand::REVERSE)) return ClipToQueryReverse(start, end); + return ClipToQueryForward(start, end); +} + +BamRecord& BamRecord::ClipToQueryForward(const PacBio::BAM::Position start, + const PacBio::BAM::Position end) +{ + // cache original coords, skip out if clip not needed + const auto seqLength = static_cast(impl_.SequenceLength()); + const bool isCcsOrTranscript = IsCcsOrTranscript(Type()); + const Position origQStart = isCcsOrTranscript ? 0 : QueryStart(); + const Position origQEnd = isCcsOrTranscript ? seqLength : QueryEnd(); + if (start <= origQStart && end >= origQEnd) return *this; + + // determine new offsets into data + const size_t startOffset = start - origQStart; + const size_t endOffset = origQEnd - end; + + // maybe update CIGAR & aligned position + if (IsMapped()) { + + // fetch a 'working copy' of CIGAR data + Cigar cigar = impl_.CigarData(); + + // clip leading CIGAR ops + size_t referencePositionOffset = 0; + size_t remaining = startOffset; + while (remaining > 0 && !cigar.empty()) { + CigarOperation& firstOp = cigar.front(); + const auto firstOpLength = firstOp.Length(); + const bool consumesQuery = ConsumesQuery(firstOp.Type()); + const bool consumesRef = ConsumesReference(firstOp.Type()); + + // CIGAR op ends at or before clip + if (firstOpLength <= remaining) { + cigar.erase(cigar.begin()); + if (consumesQuery) remaining -= firstOpLength; + if (consumesRef) referencePositionOffset += firstOpLength; + } + + // CIGAR op straddles clip + else { + firstOp.Length(firstOpLength - remaining); + if (consumesRef) referencePositionOffset += remaining; + remaining = 0; + } + } + + // clip trailing CIGAR ops + remaining = endOffset; + while (remaining > 0 && !cigar.empty()) { + CigarOperation& lastOp = cigar.back(); + const auto lastOpLength = lastOp.Length(); + const bool consumesQuery = ConsumesQuery(lastOp.Type()); + + // CIGAR op ends at or after clip + if (lastOpLength <= remaining) { + cigar.pop_back(); + if (consumesQuery) remaining -= lastOpLength; + } + + // CIGAR op straddles clip + else { + lastOp.Length(lastOpLength - remaining); + remaining = 0; + } + } + + // update CIGAR & position + impl_.CigarData(cigar); + impl_.Position(impl_.Position() + referencePositionOffset); + } + + // clip SEQ, QUAL, & tags + const size_t clipFrom = startOffset; + const size_t clipLength = (end - start); + ClipFields(clipFrom, clipLength); + + // update query start/end + // TODO: update name to reflect new QS/QE ??? + CreateOrEdit(BamRecordTag::QUERY_START, start, &impl_); + CreateOrEdit(BamRecordTag::QUERY_END, end, &impl_); + + // reset any cached aligned start/end + ResetCachedPositions(); + return *this; +} + +BamRecord& BamRecord::ClipToQueryReverse(const PacBio::BAM::Position start, + const PacBio::BAM::Position end) +{ + // cache original coords, skip out if clip not needed + const int seqLength = impl_.SequenceLength(); + const bool isCcsOrTranscript = IsCcsOrTranscript(Type()); + const Position origQStart = isCcsOrTranscript ? 0 : QueryStart(); + const Position origQEnd = isCcsOrTranscript ? seqLength : QueryEnd(); + if ((start <= origQStart) && (end >= origQEnd)) return *this; + + // determine new offsets into data + const size_t startOffset = start - origQStart; + const size_t endOffset = origQEnd - end; + + if (IsMapped()) { + Cigar cigar = impl_.CigarData(); + std::reverse(cigar.begin(), cigar.end()); + + size_t refPosRemoved = 0; + size_t remaining = startOffset; + + // clip CIGAR ops from beginning of query sequence + while ((remaining > 0) && !cigar.empty()) { + CigarOperation& op = cigar.front(); + const auto opLength = op.Length(); + const bool consumesQuery = ConsumesQuery(op.Type()); + const bool consumesRef = ConsumesReference(op.Type()); + + if (opLength <= remaining) { + cigar.erase(cigar.begin()); + if (consumesQuery) remaining -= opLength; + if (consumesRef) refPosRemoved += opLength; + } else { + op.Length(opLength - remaining); + if (consumesRef) refPosRemoved += remaining; + remaining = 0; + } + } + + // clip CIGAR ops from end of query sequence + remaining = endOffset; + while ((remaining > 0) && !cigar.empty()) { + CigarOperation& op = cigar.back(); + const auto opLength = op.Length(); + const bool consumesQuery = ConsumesQuery(op.Type()); + + if (opLength <= remaining) { + cigar.pop_back(); + if (consumesQuery) remaining -= opLength; + } else { + op.Length(opLength - remaining); + remaining = 0; + } + } + + // restore CIGAR + std::reverse(cigar.begin(), cigar.end()); + impl_.CigarData(cigar); + impl_.Position(impl_.Position() + refPosRemoved); + } + + // clip SEQ, QUAL, & tags + const size_t clipFrom = startOffset; + const size_t clipLength = (end - start); + ClipFields(clipFrom, clipLength); + + // update query start/end + // TODO: update name to reflect new QS/QE ??? + CreateOrEdit(BamRecordTag::QUERY_START, start, &impl_); + CreateOrEdit(BamRecordTag::QUERY_END, end, &impl_); + + // reset any cached aligned start/end + ResetCachedPositions(); + return *this; +} + +BamRecord& BamRecord::ClipToReference(const Position start, const Position end, + const bool exciseFlankingInserts) +{ + // skip if not mapped, clipping to reference doesn't make sense + // or should we even consider throwing here? + if (!IsMapped()) return *this; + + const bool isForwardStrand = (AlignedStrand() == Strand::FORWARD); + return (isForwardStrand ? ClipToReferenceForward(start, end, exciseFlankingInserts) + : ClipToReferenceReverse(start, end, exciseFlankingInserts)); +} + +BamRecord& BamRecord::ClipToReferenceForward(const PacBio::BAM::Position start, + const PacBio::BAM::Position end, + const bool exciseFlankingInserts) +{ + assert(IsMapped()); + assert(AlignedStrand() == Strand::FORWARD); + + // cache original coords + const int seqLength = static_cast(impl_.SequenceLength()); + const bool isCcsOrTranscript = IsCcsOrTranscript(Type()); + const Position origQStart = isCcsOrTranscript ? 0 : QueryStart(); + const Position origQEnd = isCcsOrTranscript ? seqLength : QueryEnd(); + const Position origTStart = ReferenceStart(); + const Position origTEnd = ReferenceEnd(); + assert(AlignedStart() >= origQStart); + assert(AlignedEnd() <= origQEnd); + + // skip if already within requested clip range + if (start <= origTStart && end >= origTEnd) return *this; + + const Position newTStart = std::max(origTStart, start); + const Position newTEnd = std::min(origTEnd, end); + + // fetch a 'working copy' of CIGAR data + Cigar cigar = impl_.CigarData(); + + // we're going to skip query sequence outside aligned region + size_t queryPosRemovedFront = 0; + size_t queryPosRemovedBack = 0; + + // ------------------------ + // clip leading CIGAR ops + // ------------------------ + + size_t remaining = newTStart - origTStart; + while (remaining > 0 && !cigar.empty()) { + CigarOperation& firstOp = cigar.front(); + const auto firstOpLength = firstOp.Length(); + const bool consumesQuery = ConsumesQuery(firstOp.Type()); + const bool consumesRef = ConsumesReference(firstOp.Type()); + + if (!consumesRef) { + + // e.g. softclip - just pop it completely + cigar.erase(cigar.begin()); + if (consumesQuery) queryPosRemovedFront += firstOpLength; + + } else { + assert(consumesRef); + + // CIGAR ends at or before clip + if (firstOpLength <= remaining) { + cigar.erase(cigar.begin()); + if (consumesQuery) queryPosRemovedFront += firstOpLength; + if (consumesRef) remaining -= firstOpLength; + } + + // CIGAR straddles clip + else { + assert(firstOpLength > remaining); + firstOp.Length(firstOpLength - remaining); + if (consumesQuery) queryPosRemovedFront += remaining; + remaining = 0; + } + } + } + + // ------------------------- + // clip trailing CIGAR ops + // ------------------------- + + remaining = origTEnd - newTEnd; + while (remaining > 0 && !cigar.empty()) { + CigarOperation& lastOp = cigar.back(); + const auto lastOpLength = lastOp.Length(); + const bool consumesQuery = ConsumesQuery(lastOp.Type()); + const bool consumesRef = ConsumesReference(lastOp.Type()); + + if (!consumesRef) { + + // e.g. softclip - just pop it completely + cigar.pop_back(); + if (consumesQuery) queryPosRemovedBack += lastOpLength; + + } else { + assert(consumesRef); + + // CIGAR ends at or after clip + if (lastOpLength <= remaining) { + cigar.pop_back(); + if (consumesQuery) queryPosRemovedBack += lastOpLength; + if (consumesRef) remaining -= lastOpLength; + } + + // CIGAR straddles clip + else { + assert(lastOpLength > remaining); + lastOp.Length(lastOpLength - remaining); + if (consumesQuery) queryPosRemovedBack += remaining; + remaining = 0; + } + } + } + + if (exciseFlankingInserts) { + // check for leading insertion + if (!cigar.empty()) { + const CigarOperation& op = cigar.front(); + if (op.Type() == CigarOperationType::INSERTION) { + queryPosRemovedFront += op.Length(); + cigar.erase(cigar.begin()); + } + } + + // check for trailing insertion + if (!cigar.empty()) { + const CigarOperation& op = cigar.back(); + if (op.Type() == CigarOperationType::INSERTION) { + queryPosRemovedBack += op.Length(); + cigar.pop_back(); + } + } + } + + // update CIGAR and position + impl_.CigarData(cigar); + impl_.Position(newTStart); + + // clip SEQ, QUAL, tags + const Position qStart = origQStart + queryPosRemovedFront; + const Position qEnd = origQEnd - queryPosRemovedBack; + const size_t clipFrom = queryPosRemovedFront; + const size_t clipLength = qEnd - qStart; + ClipFields(clipFrom, clipLength); + + // update query start/end + CreateOrEdit(BamRecordTag::QUERY_START, qStart, &impl_); + CreateOrEdit(BamRecordTag::QUERY_END, qEnd, &impl_); + + // reset any cached aligned start/end + ResetCachedPositions(); + return *this; +} + +BamRecord& BamRecord::ClipToReferenceReverse(const PacBio::BAM::Position start, + const PacBio::BAM::Position end, + const bool exciseFlankingInserts) +{ + assert(IsMapped()); + assert(AlignedStrand() == Strand::REVERSE); + + // cache original coords + const int seqLength = static_cast(impl_.SequenceLength()); + const bool isCcsOrTranscript = IsCcsOrTranscript(Type()); + const Position origQStart = isCcsOrTranscript ? 0 : QueryStart(); + const Position origQEnd = isCcsOrTranscript ? seqLength : QueryEnd(); + const Position origTStart = ReferenceStart(); + const Position origTEnd = ReferenceEnd(); + + // skip if already within requested clip range + if (start <= origTStart && end >= origTEnd) return *this; + assert(AlignedStart() >= origQStart); + assert(AlignedEnd() <= origQEnd); + + const Position newTStart = std::max(origTStart, start); + const Position newTEnd = std::min(origTEnd, end); + + Cigar cigar = impl_.CigarData(); + + size_t queryPosRemovedFront = 0; + size_t queryPosRemovedBack = 0; + + // update CIGAR - clip front ops, then clip back ops + size_t remaining = newTStart - origTStart; + while (remaining > 0 && !cigar.empty()) { + CigarOperation& firstOp = cigar.front(); + const auto firstOpType = firstOp.Type(); + const auto firstOpLength = firstOp.Length(); + const bool consumesQuery = ConsumesQuery(firstOpType); + const bool consumesRef = ConsumesReference(firstOpType); + + if (!consumesRef) { + + // e.g. softclip - just pop it completely + cigar.erase(cigar.begin()); + if (consumesQuery) queryPosRemovedBack += firstOpLength; + + } else { + assert(consumesRef); + + // CIGAR ends at or before clip + if (firstOpLength <= remaining) { + cigar.erase(cigar.begin()); + if (consumesQuery) queryPosRemovedBack += firstOpLength; + if (consumesRef) remaining -= firstOpLength; + } + + // CIGAR straddles clip + else { + assert(firstOpLength > remaining); + firstOp.Length(firstOpLength - remaining); + if (consumesQuery) queryPosRemovedBack += remaining; + remaining = 0; + } + } + } + + remaining = origTEnd - newTEnd; + while (remaining > 0 && !cigar.empty()) { + CigarOperation& lastOp = cigar.back(); + const auto lastOpType = lastOp.Type(); + const auto lastOpLength = lastOp.Length(); + const bool consumesQuery = ConsumesQuery(lastOpType); + const bool consumesRef = ConsumesReference(lastOpType); + + if (!consumesRef) { + + // e.g. softclip - just pop it completely + cigar.pop_back(); + if (consumesQuery) queryPosRemovedFront += lastOpLength; + + } else { + assert(consumesRef); + + // CIGAR ends at or before clip + if (lastOpLength <= remaining) { + cigar.pop_back(); + if (consumesQuery) queryPosRemovedFront += lastOpLength; + if (consumesRef) remaining -= lastOpLength; + } + + // CIGAR straddles clip + else { + assert(lastOpLength > remaining); + lastOp.Length(lastOpLength - remaining); + if (consumesQuery) queryPosRemovedFront += remaining; + remaining = 0; + } + } + } + + if (exciseFlankingInserts) { + // check for leading insertion + if (!cigar.empty()) { + const CigarOperation& op = cigar.front(); + if (op.Type() == CigarOperationType::INSERTION) { + queryPosRemovedBack += op.Length(); + cigar.erase(cigar.begin()); + } + } + + // check for trailing insertion + if (!cigar.empty()) { + const CigarOperation& op = cigar.back(); + if (op.Type() == CigarOperationType::INSERTION) { + queryPosRemovedFront += op.Length(); + cigar.pop_back(); + } + } + } + + impl_.CigarData(cigar); + + // update aligned reference position + impl_.Position(newTStart); + + // clip SEQ, QUAL, tags + const Position qStart = origQStart + queryPosRemovedFront; + const Position qEnd = origQEnd - queryPosRemovedBack; + const size_t clipFrom = queryPosRemovedFront; + const size_t clipLength = qEnd - qStart; + ClipFields(clipFrom, clipLength); + + // update query start/end + CreateOrEdit(BamRecordTag::QUERY_START, qStart, &impl_); + CreateOrEdit(BamRecordTag::QUERY_END, qEnd, &impl_); + // UpdateName(); + + // reset any cached aligned start/end + ResetCachedPositions(); + return *this; +} + +QualityValues BamRecord::DeletionQV(Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchQualities(BamRecordTag::DELETION_QV, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::DeletionQV(const QualityValues& deletionQVs) +{ + CreateOrEdit(BamRecordTag::DELETION_QV, deletionQVs.Fastq(), &impl_); + return *this; +} + +std::string BamRecord::DeletionTag(Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchBases(BamRecordTag::DELETION_TAG, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::DeletionTag(const std::string& tags) +{ + CreateOrEdit(BamRecordTag::DELETION_TAG, tags, &impl_); + return *this; +} + +std::vector BamRecord::EncodePhotons(const std::vector& data) +{ + std::vector encoded; + encoded.reserve(data.size()); + for (const auto& d : data) + encoded.emplace_back(d * photonFactor); + return encoded; +} + +std::string BamRecord::FetchBasesRaw(const BamRecordTag tag) const +{ + const Tag seqTag = impl_.TagValue(tag); + return seqTag.ToString(); +} + +std::string BamRecord::FetchBases(const BamRecordTag tag, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) const +{ + const bool isBamSeq = (tag == BamRecordTag::SEQ); + const bool isPulse = BamRecordTags::IsPulse(tag); + + // fetch raw + std::string bases; + Orientation current; + if (isBamSeq) { // SEQ stored in genomic orientation + bases = impl_.Sequence(); + current = Orientation::GENOMIC; + } else { // all tags stored in native orientation + bases = FetchBasesRaw(tag); + current = Orientation::NATIVE; + } + + // maybe strip 'squashed' pulse loci + if (isPulse && pulseBehavior == PulseBehavior::BASECALLS_ONLY) { + CalculatePulse2BaseCache(); + bases = p2bCache_->RemoveSquashedPulses(bases); + } + + // if we need to touch CIGAR + if (aligned || exciseSoftClips) { + + if (isPulse && pulseBehavior != PulseBehavior::BASECALLS_ONLY) + throw std::runtime_error{ + "BamRecord: cannot return data at all pulses when gapping and/or soft-clipping are " + "requested. " + "Use PulseBehavior::BASECALLS_ONLY instead."}; + + // force into genomic orientation + OrientBasesAsRequested(&bases, current, Orientation::GENOMIC, impl_.IsReverseStrand(), + isPulse); + current = Orientation::GENOMIC; + + // clip & gapify as requested + ClipAndGapifyBases(impl_, aligned, exciseSoftClips, &bases); + } + + // return in the orientation requested + OrientBasesAsRequested(&bases, current, orientation, impl_.IsReverseStrand(), isPulse); + return bases; +} + +Frames BamRecord::FetchFramesRaw(const BamRecordTag tag) const +{ + const Tag frameTag = impl_.TagValue(tag); + if (frameTag.IsNull()) return {}; // throw ? + + // lossy frame codes + if (frameTag.IsUInt8Array()) { + const auto codes = frameTag.ToUInt8Array(); + return Frames::Decode(codes); + } + + // lossless frame data + else { + assert(frameTag.IsUInt16Array()); + return Frames{frameTag.ToUInt16Array()}; + } +} + +Frames BamRecord::FetchFrames(const BamRecordTag tag, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) const +{ + const bool isPulse = BamRecordTags::IsPulse(tag); + + // fetch raw + Frames frames = FetchFramesRaw(tag); + Orientation current = Orientation::NATIVE; + + // maybe strip 'squashed' pulse loci + if (isPulse && pulseBehavior == PulseBehavior::BASECALLS_ONLY) { + CalculatePulse2BaseCache(); + frames.DataRaw() = p2bCache_->RemoveSquashedPulses(frames.Data()); + } + + // if we need to touch the CIGAR + if (aligned || exciseSoftClips) { + + if (isPulse && pulseBehavior != PulseBehavior::BASECALLS_ONLY) + throw std::runtime_error{ + "BamRecord: cannot return data at all pulses when gapping and/or soft-clipping are " + "requested. " + "Use PulseBehavior::BASECALLS_ONLY instead."}; + + // force into genomic orientation + OrientTagDataAsRequested(&frames, current, Orientation::GENOMIC, impl_.IsReverseStrand()); + current = Orientation::GENOMIC; + + // clip & gapify as requested + ClipAndGapifyFrames(impl_, aligned, exciseSoftClips, &frames); + } + + // return in the orientation requested + OrientTagDataAsRequested(&frames, current, orientation, impl_.IsReverseStrand()); + return frames; +} + +std::vector BamRecord::FetchPhotonsRaw(const BamRecordTag tag) const +{ + const Tag frameTag = impl_.TagValue(tag); + if (frameTag.IsNull()) return {}; + if (!frameTag.IsUInt16Array()) + throw std::runtime_error{"BamRecord: photons are not a uint16_t array, tag " + + BamRecordTags::LabelFor(tag)}; + + const auto data = frameTag.ToUInt16Array(); + std::vector photons; + photons.reserve(data.size()); + for (const auto& d : data) + photons.emplace_back(d / photonFactor); + return photons; +} + +std::vector BamRecord::FetchPhotons(const BamRecordTag tag, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) const +{ + const bool isPulse = BamRecordTags::IsPulse(tag); + + // fetch raw + auto data = FetchPhotonsRaw(tag); + Orientation current = Orientation::NATIVE; + + if (isPulse && pulseBehavior == PulseBehavior::BASECALLS_ONLY) { + // strip 'squashed' pulse loci + CalculatePulse2BaseCache(); + data = p2bCache_->RemoveSquashedPulses(data); + } + + if (aligned || exciseSoftClips) { + + if (isPulse && pulseBehavior != PulseBehavior::BASECALLS_ONLY) + throw std::runtime_error{ + "BamRecord: cannot return data at all pulses when gapping and/or soft-clipping are " + "requested. " + "Use PulseBehavior::BASECALLS_ONLY instead."}; + + // force into genomic orientation + OrientTagDataAsRequested(&data, current, Orientation::GENOMIC, impl_.IsReverseStrand()); + current = Orientation::GENOMIC; + + // clip & gapify as requested + ClipAndGapifyPhotons(impl_, aligned, exciseSoftClips, &data); + } + + // return in the orientation requested + OrientTagDataAsRequested(&data, current, orientation, impl_.IsReverseStrand()); + return data; +} + +QualityValues BamRecord::FetchQualitiesRaw(const BamRecordTag tag) const +{ + const Tag qvsTag = impl_.TagValue(tag); + return QualityValues::FromFastq(qvsTag.ToString()); +} + +QualityValues BamRecord::FetchQualities(const BamRecordTag tag, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) const +{ + // requested data info + const bool isBamQual = (tag == BamRecordTag::QUAL); + const bool isPulse = BamRecordTags::IsPulse(tag); + + // fetch raw + QualityValues quals; + Orientation current; + if (isBamQual) { // QUAL stored in genomic orientation + quals = impl_.Qualities(); + current = Orientation::GENOMIC; + } else { // all tags stored in native orientation + quals = FetchQualitiesRaw(tag); + current = Orientation::NATIVE; + } + + if (isPulse && pulseBehavior == PulseBehavior::BASECALLS_ONLY) { + // strip 'squashed' pulse loci + CalculatePulse2BaseCache(); + quals = p2bCache_->RemoveSquashedPulses(quals); + } + + // if we need to touch CIGAR + if (aligned || exciseSoftClips) { + + if (isPulse && pulseBehavior != PulseBehavior::BASECALLS_ONLY) + throw std::runtime_error{ + "BamRecord: cannot return data at all pulses when gapping and/or soft-clipping are " + "requested. " + "Use PulseBehavior::BASECALLS_ONLY instead."}; + + // force into genomic orientation + OrientTagDataAsRequested(&quals, current, Orientation::GENOMIC, impl_.IsReverseStrand()); + current = Orientation::GENOMIC; + + // clip & gapify as requested + ClipAndGapifyQualities(impl_, aligned, exciseSoftClips, &quals); + } + + // return in the orientation requested + OrientTagDataAsRequested(&quals, current, orientation, impl_.IsReverseStrand()); + return quals; +} + +std::vector BamRecord::FetchUInt32sRaw(const BamRecordTag tag) const +{ + // fetch tag data + const Tag frameTag = impl_.TagValue(tag); + if (frameTag.IsNull()) return {}; + if (!frameTag.IsUInt32Array()) + throw std::runtime_error{"BamRecord: tag data are not a uint32_t array, tag " + + BamRecordTags::LabelFor(tag)}; + return frameTag.ToUInt32Array(); +} + +std::vector BamRecord::FetchUInt32s(const BamRecordTag tag, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) const +{ + const bool isPulse = BamRecordTags::IsPulse(tag); + + // fetch raw + auto arr = FetchUInt32sRaw(tag); + Orientation current = Orientation::NATIVE; + + if (isPulse && pulseBehavior == PulseBehavior::BASECALLS_ONLY) { + // strip 'squashed' pulse loci + CalculatePulse2BaseCache(); + arr = p2bCache_->RemoveSquashedPulses(arr); + } + + if (aligned || exciseSoftClips) { + + if (isPulse && pulseBehavior != PulseBehavior::BASECALLS_ONLY) + throw std::runtime_error{ + "BamRecord: cannot return data at all pulses when gapping and/or soft-clipping are " + "requested. " + "Use PulseBehavior::BASECALLS_ONLY instead."}; + + // force into genomic orientation + OrientTagDataAsRequested(&arr, current, Orientation::GENOMIC, impl_.IsReverseStrand()); + current = Orientation::GENOMIC; + + // clip & gapify as requested + ClipAndGapifyUInts(impl_, aligned, exciseSoftClips, &arr); + } + + // return in the orientation requested + OrientTagDataAsRequested(&arr, current, orientation, impl_.IsReverseStrand()); + return arr; +} + +std::vector BamRecord::FetchUInt8sRaw(const BamRecordTag tag) const +{ + // fetch tag data + const Tag frameTag = impl_.TagValue(tag); + if (frameTag.IsNull()) return {}; + if (!frameTag.IsUInt8Array()) + throw std::runtime_error{"BamRecord: tag data are not a uint8_t array, tag " + + BamRecordTags::LabelFor(tag)}; + return frameTag.ToUInt8Array(); +} + +std::vector BamRecord::FetchUInt8s(const BamRecordTag tag, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) const +{ + const bool isPulse = BamRecordTags::IsPulse(tag); + + // fetch raw + auto arr = FetchUInt8sRaw(tag); + Orientation current = Orientation::NATIVE; + + if (isPulse && pulseBehavior == PulseBehavior::BASECALLS_ONLY) { + // strip 'squashed' pulse loci + CalculatePulse2BaseCache(); + arr = p2bCache_->RemoveSquashedPulses(arr); + } + + if (aligned || exciseSoftClips) { + + if (isPulse && pulseBehavior != PulseBehavior::BASECALLS_ONLY) + throw std::runtime_error{ + "BamRecord: cannot return data at all pulses when gapping and/or soft-clipping are " + "requested. " + "Use PulseBehavior::BASECALLS_ONLY instead."}; + + // force into genomic orientation + OrientTagDataAsRequested(&arr, current, Orientation::GENOMIC, impl_.IsReverseStrand()); + current = Orientation::GENOMIC; + + // clip & gapify as requested + ClipAndGapifyUInt8s(impl_, aligned, exciseSoftClips, &arr); + } + + // return in the orientation requested + OrientTagDataAsRequested(&arr, current, orientation, impl_.IsReverseStrand()); + return arr; +} + +std::string BamRecord::FullName() const { return impl_.Name(); } + +bool BamRecord::HasAltLabelQV() const { return impl_.HasTag(BamRecordTag::ALT_LABEL_QV); } + +bool BamRecord::HasAltLabelTag() const { return impl_.HasTag(BamRecordTag::ALT_LABEL_TAG); } + +bool BamRecord::HasBarcodes() const { return impl_.HasTag(BamRecordTag::BARCODES); } + +bool BamRecord::HasBarcodeQuality() const { return impl_.HasTag(BamRecordTag::BARCODE_QUALITY); } + +bool BamRecord::HasLabelQV() const { return impl_.HasTag(BamRecordTag::LABEL_QV); } + +bool BamRecord::HasDeletionQV() const { return impl_.HasTag(BamRecordTag::DELETION_QV); } + +bool BamRecord::HasDeletionTag() const { return impl_.HasTag(BamRecordTag::DELETION_TAG); } + +bool BamRecord::HasHoleNumber() const +{ + return impl_.HasTag(BamRecordTag::HOLE_NUMBER) && + !impl_.TagValue(BamRecordTag::HOLE_NUMBER).IsNull(); +} + +bool BamRecord::HasInsertionQV() const { return impl_.HasTag(BamRecordTag::INSERTION_QV); } + +bool BamRecord::HasNumPasses() const { return impl_.HasTag(BamRecordTag::NUM_PASSES); } + +bool BamRecord::HasPreBaseFrames() const { return HasIPD(); } + +bool BamRecord::HasIPD() const { return impl_.HasTag(BamRecordTag::IPD); } + +bool BamRecord::HasLocalContextFlags() const { return impl_.HasTag(BamRecordTag::CONTEXT_FLAGS); } + +bool BamRecord::HasMergeQV() const { return impl_.HasTag(BamRecordTag::MERGE_QV); } + +bool BamRecord::HasPulseMergeQV() const { return impl_.HasTag(BamRecordTag::PULSE_MERGE_QV); } + +bool BamRecord::HasPkmean() const { return impl_.HasTag(BamRecordTag::PKMEAN); } + +bool BamRecord::HasPkmean2() const { return impl_.HasTag(BamRecordTag::PKMEAN_2); } + +bool BamRecord::HasPkmid() const { return impl_.HasTag(BamRecordTag::PKMID); } + +bool BamRecord::HasPkmid2() const { return impl_.HasTag(BamRecordTag::PKMID_2); } + +bool BamRecord::HasPrePulseFrames() const { return impl_.HasTag(BamRecordTag::PRE_PULSE_FRAMES); } + +bool BamRecord::HasPulseCall() const +{ + return impl_.HasTag(BamRecordTag::PULSE_CALL) && + !impl_.TagValue(BamRecordTag::PULSE_CALL).IsNull(); +} + +bool BamRecord::HasPulseExclusion() const { return impl_.HasTag(BamRecordTag::PULSE_EXCLUSION); } + +bool BamRecord::HasPulseCallWidth() const { return impl_.HasTag(BamRecordTag::PULSE_CALL_WIDTH); } + +bool BamRecord::HasPulseWidth() const { return impl_.HasTag(BamRecordTag::PULSE_WIDTH); } + +bool BamRecord::HasQueryEnd() const { return impl_.HasTag(BamRecordTag::QUERY_END); } + +bool BamRecord::HasQueryStart() const { return impl_.HasTag(BamRecordTag::QUERY_START); } + +bool BamRecord::HasReadAccuracy() const +{ + return impl_.HasTag(BamRecordTag::READ_ACCURACY) && + !impl_.TagValue(BamRecordTag::READ_ACCURACY).IsNull(); +} + +bool BamRecord::HasScrapRegionType() const +{ + return impl_.HasTag(BamRecordTag::SCRAP_REGION_TYPE) && + !impl_.TagValue(BamRecordTag::SCRAP_REGION_TYPE).IsNull(); +} + +bool BamRecord::HasScrapZmwType() const +{ + return impl_.HasTag(BamRecordTag::SCRAP_ZMW_TYPE) && + !impl_.TagValue(BamRecordTag::SCRAP_ZMW_TYPE).IsNull(); +} + +bool BamRecord::HasStartFrame() const { return impl_.HasTag(BamRecordTag::START_FRAME); } + +bool BamRecord::HasSignalToNoise() const { return impl_.HasTag(BamRecordTag::SNR); } + +bool BamRecord::HasSubstitutionQV() const { return impl_.HasTag(BamRecordTag::SUBSTITUTION_QV); } + +bool BamRecord::HasSubstitutionTag() const { return impl_.HasTag(BamRecordTag::SUBSTITUTION_TAG); } + +BamHeader BamRecord::Header() const { return header_; } + +int32_t BamRecord::HoleNumber() const +{ + const Tag holeNumber = impl_.TagValue(BamRecordTag::HOLE_NUMBER); + if (!holeNumber.IsNull()) return holeNumber.ToInt32(); + + // missing zm tag - try to pull from name + return HoleNumberFromName(FullName()); +} + +BamRecord& BamRecord::HoleNumber(const int32_t holeNumber) +{ + CreateOrEdit(BamRecordTag::HOLE_NUMBER, holeNumber, &impl_); + return *this; +} + +BamRecordImpl& BamRecord::Impl() { return impl_; } + +const BamRecordImpl& BamRecord::Impl() const { return impl_; } + +QualityValues BamRecord::InsertionQV(Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchQualities(BamRecordTag::INSERTION_QV, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::InsertionQV(const QualityValues& insertionQVs) +{ + CreateOrEdit(BamRecordTag::INSERTION_QV, insertionQVs.Fastq(), &impl_); + return *this; +} + +Frames BamRecord::IPD(Orientation orientation, bool aligned, bool exciseSoftClips) const +{ + return FetchFrames(BamRecordTag::IPD, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::IPD(const Frames& frames, const FrameEncodingType encoding) +{ + if (encoding == FrameEncodingType::LOSSY) + CreateOrEdit(BamRecordTag::IPD, frames.Encode(), &impl_); + else + CreateOrEdit(BamRecordTag::IPD, frames.Data(), &impl_); + return *this; +} + +Frames BamRecord::IPDRaw(Orientation orientation) const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::IPD); + const Tag frameTag = impl_.TagValue(tagName); + if (frameTag.IsNull()) return {}; + + Frames frames; + + // lossy frame codes + if (frameTag.IsUInt8Array()) { + const auto codes = frameTag.ToUInt8Array(); + const std::vector codes16(codes.begin(), codes.end()); + frames.Data(std::move(codes16)); + } + + // lossless frame data + else { + assert(frameTag.IsUInt16Array()); + frames.Data(frameTag.ToUInt16Array()); + } + + // return in requested orientation + OrientTagDataAsRequested(&frames, + Orientation::NATIVE, // current + orientation, // requested + impl_.IsReverseStrand()); + return frames; +} + +bool BamRecord::IsMapped() const { return impl_.IsMapped(); } + +QualityValues BamRecord::LabelQV(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchQualities(BamRecordTag::LABEL_QV, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::LabelQV(const QualityValues& labelQVs) +{ + CreateOrEdit(BamRecordTag::LABEL_QV, labelQVs.Fastq(), &impl_); + return *this; +} + +LocalContextFlags BamRecord::LocalContextFlags() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::CONTEXT_FLAGS); + const Tag cxTag = impl_.TagValue(tagName); + return static_cast(cxTag.ToUInt8()); +} + +BamRecord& BamRecord::LocalContextFlags(const PacBio::BAM::LocalContextFlags flags) +{ + CreateOrEdit(BamRecordTag::CONTEXT_FLAGS, static_cast(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 + std::string sequence = impl_.Sequence(); + QualityValues qualities = impl_.Qualities(); + + ReverseComplement(sequence); + Reverse(qualities); + + impl_.SetSequenceAndQualities(sequence, qualities.Fastq()); + } + + // reset any cached aligned start/end + alignedStart_ = PacBio::BAM::UnmappedPosition; + alignedEnd_ = PacBio::BAM::UnmappedPosition; + + return *this; +} + +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); +} + +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; +} + +uint8_t BamRecord::MapQuality() const { return impl_.MapQuality(); } + +QualityValues BamRecord::MergeQV(Orientation orientation, bool aligned, bool exciseSoftClips) const +{ + return FetchQualities(BamRecordTag::MERGE_QV, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::MergeQV(const QualityValues& mergeQVs) +{ + CreateOrEdit(BamRecordTag::MERGE_QV, mergeQVs.Fastq(), &impl_); + return *this; +} + +std::string BamRecord::MovieName() const +{ + const auto& rgId = ReadGroupId(); + if (!rgId.empty()) + return header_.ReadGroup(rgId).MovieName(); + else { + const auto nameParts = Split(FullName(), '/'); + if (nameParts.empty()) + throw std::runtime_error{"BamRecord: has invalid name: '" + FullName() + "'"}; + return nameParts[0]; + } +} + +size_t BamRecord::NumDeletedBases() const +{ + size_t count = 0; + + auto b = BamRecordMemory::GetRawData(this); + uint32_t* cigarData = bam_get_cigar(b.get()); + for (uint32_t i = 0; i < b->core.n_cigar; ++i) { + const auto type = static_cast(bam_cigar_op(cigarData[i])); + if (type == CigarOperationType::DELETION) count += bam_cigar_oplen(cigarData[i]); + } + return count; +} + +size_t BamRecord::NumInsertedBases() const +{ + size_t count = 0; + + auto b = BamRecordMemory::GetRawData(this); + uint32_t* cigarData = bam_get_cigar(b.get()); + for (uint32_t i = 0; i < b->core.n_cigar; ++i) { + const auto type = static_cast(bam_cigar_op(cigarData[i])); + if (type == CigarOperationType::INSERTION) count += bam_cigar_oplen(cigarData[i]); + } + return count; +} + +size_t BamRecord::NumMatches() const { return NumMatchesAndMismatches().first; } + +std::pair BamRecord::NumMatchesAndMismatches() const +{ + std::pair result = std::make_pair(0, 0); + + auto b = BamRecordMemory::GetRawData(this); + uint32_t* cigarData = bam_get_cigar(b.get()); + for (uint32_t i = 0; i < b->core.n_cigar; ++i) { + const auto type = static_cast(bam_cigar_op(cigarData[i])); + if (type == CigarOperationType::SEQUENCE_MATCH) + result.first += bam_cigar_oplen(cigarData[i]); + else if (type == CigarOperationType::SEQUENCE_MISMATCH) + result.second += bam_cigar_oplen(cigarData[i]); + } + return result; +} + +size_t BamRecord::NumMismatches() const { return NumMatchesAndMismatches().second; } + +int32_t BamRecord::NumPasses() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::NUM_PASSES); + const Tag numPasses = impl_.TagValue(tagName); + return numPasses.ToInt32(); +} + +BamRecord& BamRecord::NumPasses(const int32_t numPasses) +{ + CreateOrEdit(BamRecordTag::NUM_PASSES, numPasses, &impl_); + return *this; +} + +std::vector BamRecord::Pkmean(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchPhotons(BamRecordTag::PKMEAN, orientation, aligned, exciseSoftClips, pulseBehavior); +} + +BamRecord& BamRecord::Pkmean(const std::vector& photons) +{ + Pkmean(EncodePhotons(photons)); + return *this; +} + +BamRecord& BamRecord::Pkmean(const std::vector& encodedPhotons) +{ + CreateOrEdit(BamRecordTag::PKMEAN, encodedPhotons, &impl_); + return *this; +} + +std::vector BamRecord::Pkmid(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchPhotons(BamRecordTag::PKMID, orientation, aligned, exciseSoftClips, pulseBehavior); +} + +BamRecord& BamRecord::Pkmid(const std::vector& photons) +{ + Pkmid(EncodePhotons(photons)); + return *this; +} + +BamRecord& BamRecord::Pkmid(const std::vector& encodedPhotons) +{ + CreateOrEdit(BamRecordTag::PKMID, encodedPhotons, &impl_); + return *this; +} + +std::vector BamRecord::Pkmean2(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchPhotons(BamRecordTag::PKMEAN_2, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::Pkmean2(const std::vector& photons) +{ + Pkmean2(EncodePhotons(photons)); + return *this; +} + +BamRecord& BamRecord::Pkmean2(const std::vector& encodedPhotons) +{ + CreateOrEdit(BamRecordTag::PKMEAN_2, encodedPhotons, &impl_); + return *this; +} + +std::vector BamRecord::Pkmid2(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchPhotons(BamRecordTag::PKMID_2, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::Pkmid2(const std::vector& photons) +{ + Pkmid2(EncodePhotons(photons)); + return *this; +} + +BamRecord& BamRecord::Pkmid2(const std::vector& encodedPhotons) +{ + CreateOrEdit(BamRecordTag::PKMID_2, encodedPhotons, &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::PrePulseFrames(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchFrames(BamRecordTag::PRE_PULSE_FRAMES, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::PrePulseFrames(const Frames& frames, const FrameEncodingType encoding) +{ + if (encoding == FrameEncodingType::LOSSY) { + CreateOrEdit(BamRecordTag::PRE_PULSE_FRAMES, frames.Encode(), &impl_); + } else { + CreateOrEdit(BamRecordTag::PRE_PULSE_FRAMES, frames.Data(), &impl_); + } + return *this; +} + +Frames BamRecord::PulseWidthRaw(Orientation orientation, bool /* aligned */, + bool /* exciseSoftClips */) const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::PULSE_WIDTH); + const Tag frameTag = impl_.TagValue(tagName); + if (frameTag.IsNull()) return {}; + + Frames frames; + + // lossy frame codes + if (frameTag.IsUInt8Array()) { + const auto codes = frameTag.ToUInt8Array(); + const std::vector codes16(codes.begin(), codes.end()); + frames.Data(std::move(codes16)); + } + + // lossless frame data + else { + assert(frameTag.IsUInt16Array()); + frames.Data(frameTag.ToUInt16Array()); + } + + // return in requested orientation + OrientTagDataAsRequested(&frames, + Orientation::NATIVE, // current + orientation, // requested + impl_.IsReverseStrand()); + return frames; +} + +QualityValues BamRecord::PulseMergeQV(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchQualities(BamRecordTag::PULSE_MERGE_QV, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::PulseMergeQV(const QualityValues& mergeQVs) +{ + CreateOrEdit(BamRecordTag::PULSE_MERGE_QV, mergeQVs.Fastq(), &impl_); + return *this; +} + +std::string BamRecord::PulseCall(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchBases(BamRecordTag::PULSE_CALL, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::PulseCall(const std::string& tags) +{ + CreateOrEdit(BamRecordTag::PULSE_CALL, tags, &impl_); + return *this; +} + +Frames BamRecord::PulseCallWidth(Orientation orientation, bool aligned, bool exciseSoftClips, + PulseBehavior pulseBehavior) const +{ + return FetchFrames(BamRecordTag::PULSE_CALL_WIDTH, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::PulseCallWidth(const Frames& frames, const FrameEncodingType encoding) +{ + if (encoding == FrameEncodingType::LOSSY) { + CreateOrEdit(BamRecordTag::PULSE_CALL_WIDTH, frames.Encode(), &impl_); + } else { + CreateOrEdit(BamRecordTag::PULSE_CALL_WIDTH, frames.Data(), &impl_); + } + return *this; +} + +std::vector BamRecord::PulseExclusionReason( + Orientation orientation, bool aligned, bool exciseSoftClips, PulseBehavior pulseBehavior) const +{ + std::vector reasons; + + const auto reasonNums = FetchUInt8s(BamRecordTag::PULSE_EXCLUSION, orientation, aligned, + exciseSoftClips, pulseBehavior); + + std::transform( + reasonNums.cbegin(), reasonNums.cend(), std::back_inserter(reasons), + [](const uint8_t num) { return static_cast(num); }); + + return reasons; +} + +BamRecord& BamRecord::PulseExclusionReason( + const std::vector& reasons) +{ + std::vector reasonNums; + std::transform(reasons.cbegin(), reasons.cend(), std::back_inserter(reasonNums), + [](const PacBio::BAM::PulseExclusionReason& reason) { + return static_cast(reason); + }); + + CreateOrEdit(BamRecordTag::PULSE_EXCLUSION, reasonNums, &impl_); + return *this; +} + +Frames BamRecord::PulseWidth(Orientation orientation, bool aligned, bool exciseSoftClips) const +{ + return FetchFrames(BamRecordTag::PULSE_WIDTH, orientation, aligned, exciseSoftClips, + PulseBehavior::ALL); +} + +BamRecord& BamRecord::PulseWidth(const Frames& frames, const FrameEncodingType encoding) +{ + if (encoding == FrameEncodingType::LOSSY) { + CreateOrEdit(BamRecordTag::PULSE_WIDTH, frames.Encode(), &impl_); + } else { + CreateOrEdit(BamRecordTag::PULSE_WIDTH, frames.Data(), &impl_); + } + return *this; +} + +QualityValues BamRecord::Qualities(Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchQualities(BamRecordTag::QUAL, orientation, aligned, exciseSoftClips); +} + +Position BamRecord::QueryEnd() const +{ + // try 'qe' tag + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::QUERY_END); + const Tag qe = impl_.TagValue(tagName); + 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 0; + } + if (type == RecordType::CCS) + throw std::runtime_error{"BamRecord: no query end for CCS read type"}; + if (type == RecordType::TRANSCRIPT) + throw std::runtime_error{"BamRecord: no query end for transcript read type"}; + + // PacBio BAM, non-CCS/transcript + try { + return QueryEndFromName(FullName()); + } catch (std::exception&) { + // return fallback position + return 0; + } +} + +BamRecord& BamRecord::QueryEnd(const Position pos) +{ + CreateOrEdit(BamRecordTag::QUERY_END, static_cast(pos), &impl_); + UpdateName(); + return *this; +} + +Position BamRecord::QueryStart() const +{ + // try 'qs' tag + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::QUERY_START); + const Tag qs = impl_.TagValue(tagName); + 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 0; + } + if (type == RecordType::CCS) + throw std::runtime_error{"BamRecord: no query start for CCS read type"}; + if (type == RecordType::TRANSCRIPT) + throw std::runtime_error{"BamRecord: no query start for transcript read type"}; + + // PacBio BAM, non-CCS/transcript + try { + return QueryStartFromName(FullName()); + } catch (std::exception&) { + // return fallback position + return 0; + } +} + +BamRecord& BamRecord::QueryStart(const Position pos) +{ + CreateOrEdit(BamRecordTag::QUERY_START, static_cast(pos), &impl_); + UpdateName(); + return *this; +} + +Accuracy BamRecord::ReadAccuracy() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::READ_ACCURACY); + const Tag readAccuracy = impl_.TagValue(tagName); + return {readAccuracy.ToFloat()}; +} + +BamRecord& BamRecord::ReadAccuracy(const Accuracy& accuracy) +{ + CreateOrEdit(BamRecordTag::READ_ACCURACY, static_cast(accuracy), &impl_); + return *this; +} + +ReadGroupInfo BamRecord::ReadGroup() const { return header_.ReadGroup(ReadGroupId()); } + +BamRecord& BamRecord::ReadGroup(const ReadGroupInfo& rg) +{ + CreateOrEdit(BamRecordTag::READ_GROUP, rg.Id(), &impl_); + UpdateName(); + return *this; +} + +std::string BamRecord::ReadGroupId() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::READ_GROUP); + const Tag rgTag = impl_.TagValue(tagName); + if (rgTag.IsNull()) return {}; + return rgTag.ToString(); +} + +std::string BamRecord::ReadGroupBaseId() const { return ReadGroup().BaseId(); } + +BamRecord& BamRecord::ReadGroupId(const std::string& id) +{ + CreateOrEdit(BamRecordTag::READ_GROUP, id, &impl_); + UpdateName(); + return *this; +} + +int32_t BamRecord::ReadGroupNumericId() const { return ReadGroupInfo::IdToInt(ReadGroupBaseId()); } + +Position BamRecord::ReferenceEnd() const +{ + if (!impl_.IsMapped()) return PacBio::BAM::UnmappedPosition; + const auto htsData = BamRecordMemory::GetRawData(impl_); + if (!htsData) return PacBio::BAM::UnmappedPosition; + return bam_endpos(htsData.get()); +} + +int32_t BamRecord::ReferenceId() const { return impl_.ReferenceId(); } + +std::string BamRecord::ReferenceName() const +{ + if (IsMapped()) + return Header().SequenceName(ReferenceId()); + else + throw std::runtime_error{"BamRecord: unmapped record has no associated reference name"}; +} + +Position BamRecord::ReferenceStart() const { return impl_.Position(); } + +void BamRecord::ResetCachedPositions() const +{ + alignedEnd_ = PacBio::BAM::UnmappedPosition; + alignedStart_ = PacBio::BAM::UnmappedPosition; +} + +void BamRecord::ResetCachedPositions() +{ + alignedEnd_ = PacBio::BAM::UnmappedPosition; + alignedStart_ = PacBio::BAM::UnmappedPosition; +} + +VirtualRegionType BamRecord::ScrapRegionType() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::SCRAP_REGION_TYPE); + const Tag srTag = impl_.TagValue(tagName); + return VirtualRegionTypeMap::ParseChar[srTag.ToUInt8()]; +} + +BamRecord& BamRecord::ScrapRegionType(const VirtualRegionType type) +{ + CreateOrEdit(BamRecordTag::SCRAP_REGION_TYPE, static_cast(type), &impl_); + return *this; +} + +BamRecord& BamRecord::ScrapRegionType(const char type) +{ + CreateOrEdit(BamRecordTag::SCRAP_REGION_TYPE, type, &impl_); + return *this; +} + +ZmwType BamRecord::ScrapZmwType() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::SCRAP_ZMW_TYPE); + const Tag szTag = impl_.TagValue(tagName); + return ZmwTypeMap::ParseChar[szTag.ToUInt8()]; +} + +BamRecord& BamRecord::ScrapZmwType(const ZmwType type) +{ + CreateOrEdit(BamRecordTag::SCRAP_ZMW_TYPE, static_cast(type), &impl_); + return *this; +} + +BamRecord& BamRecord::ScrapZmwType(const char type) +{ + CreateOrEdit(BamRecordTag::SCRAP_ZMW_TYPE, type, &impl_); + return *this; +} + +std::string BamRecord::Sequence(const Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchBases(BamRecordTag::SEQ, orientation, aligned, exciseSoftClips); +} + +std::vector BamRecord::SignalToNoise() const +{ + const auto tagName = BamRecordTags::LabelFor(BamRecordTag::SNR); + const Tag snTag = impl_.TagValue(tagName); + return snTag.ToFloatArray(); +} + +BamRecord& BamRecord::SignalToNoise(const std::vector& snr) +{ + CreateOrEdit(BamRecordTag::SNR, snr, &impl_); + return *this; +} + +std::vector BamRecord::StartFrame(Orientation orientation, bool aligned, + bool exciseSoftClips, PulseBehavior pulseBehavior) const +{ + return FetchUInt32s(BamRecordTag::START_FRAME, orientation, aligned, exciseSoftClips, + pulseBehavior); +} + +BamRecord& BamRecord::StartFrame(const std::vector& startFrame) +{ + CreateOrEdit(BamRecordTag::START_FRAME, startFrame, &impl_); + return *this; +} + +QualityValues BamRecord::SubstitutionQV(Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchQualities(BamRecordTag::SUBSTITUTION_QV, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::SubstitutionQV(const QualityValues& substitutionQVs) +{ + CreateOrEdit(BamRecordTag::SUBSTITUTION_QV, substitutionQVs.Fastq(), &impl_); + return *this; +} + +std::string BamRecord::SubstitutionTag(Orientation orientation, bool aligned, + bool exciseSoftClips) const +{ + return FetchBases(BamRecordTag::SUBSTITUTION_TAG, orientation, aligned, exciseSoftClips); +} + +BamRecord& BamRecord::SubstitutionTag(const std::string& tags) +{ + CreateOrEdit(BamRecordTag::SUBSTITUTION_TAG, tags, &impl_); + return *this; +} + +RecordType BamRecord::Type() const +{ + try { + const auto typeName = ReadGroup().ReadType(); + return NameToType(typeName); + } catch (std::exception&) { + + // read group not found, peek at name to see if we're possibly + // CCS or TRANSCRIPT + // + const auto name = FullName(); + if (name.find("transcript") == 0) + return RecordType::TRANSCRIPT; + else if (name.find("/ccs") != std::string::npos) + return RecordType::CCS; + else + return RecordType::UNKNOWN; + } +} + +void BamRecord::UpdateName() +{ + std::string newName; + newName.reserve(100); + + const auto holeNumber = (HasHoleNumber() ? std::to_string(HoleNumber()) : "?"); + if (Type() == RecordType::TRANSCRIPT) { + newName = "transcript/" + holeNumber; + } else { + newName += MovieName(); + newName += "/"; + newName += holeNumber; + 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); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamRecordBuilder.cpp b/src/BamRecordBuilder.cpp new file mode 100644 index 0000000..c08f60c --- /dev/null +++ b/src/BamRecordBuilder.cpp @@ -0,0 +1,393 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamRecordBuilder.h" + +#include +#include +#include +#include +#include + +#include + +#include "MemoryUtils.h" +#include "pbbam/BamTagCodec.h" + +namespace PacBio { +namespace BAM { + +BamRecordBuilder::BamRecordBuilder() +{ + // 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(BamHeader header) : header_{std::move(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&) = default; + +BamRecordBuilder::BamRecordBuilder(BamRecordBuilder&&) = default; + +BamRecordBuilder& BamRecordBuilder::operator=(const BamRecordBuilder&) = default; + +BamRecordBuilder& BamRecordBuilder::operator=(BamRecordBuilder&&) = default; + +BamRecordBuilder::~BamRecordBuilder() = default; + +BamRecordBuilder& BamRecordBuilder::Bin(const uint32_t bin) +{ + core_.bin = bin; + return *this; +} + +BamRecord BamRecordBuilder::Build() const +{ + BamRecord result{header_}; + BuildInPlace(result); + return result; +} + +bool BamRecordBuilder::BuildInPlace(BamRecord& record) const +{ + // initialize with basic 'core data' + auto recordRawData = BamRecordMemory::GetRawData(record); + if (!recordRawData || !recordRawData->data) + throw std::runtime_error{ + "BamRecordBuilder: cannot build record, target memory is in an invalid state"}; + recordRawData->core = core_; + + // setup variable length data + const auto encodedTags = 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; + if (!varLengthDataBlock) + throw std::runtime_error{ + "BamRecordBuilder: cannot build record, target memory is in an invalid state"}; + + size_t allocatedDataLength = recordRawData->m_data; + if (allocatedDataLength < dataLength) { + allocatedDataLength = dataLength; + kroundup32(allocatedDataLength); + varLengthDataBlock = + static_cast(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) { + std::vector encodedCigar(numCigarOps); + for (size_t i = 0; i < numCigarOps; ++i) { + const auto& op = cigar_.at(i); + encodedCigar[i] = op.Length() << BAM_CIGAR_SHIFT; + const auto type = static_cast(op.Type()); + if (type >= 8) + throw std::runtime_error{"BamRecordBuilder: invalid CIGAR op type: " + + std::to_string(type)}; + 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(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) { + if (encodedTags.empty()) + throw std::runtime_error{"BamRecordBuilder: expected tags but none are present"}; + memcpy(&varLengthDataBlock[index], &encodedTags[0], tagLength); + index += tagLength; + } + + // sanity check + if (index != dataLength) { + std::ostringstream s; + s << "BamRecordBuilder: incorrect number of bytes written to record:\n" + << " expected: " << dataLength << '\n' + << " actual: " << index; + throw std::runtime_error{s.str()}; + } + return true; +} + +BamRecordBuilder& BamRecordBuilder::Cigar(PacBio::BAM::Cigar cigar) +{ + core_.n_cigar = cigar.size(); + cigar_ = std::move(cigar); + return *this; +} + +BamRecordBuilder& BamRecordBuilder::Flag(const uint32_t flag) +{ + core_.flag = flag; + return *this; +} + +BamRecordBuilder& BamRecordBuilder::InsertSize(const int32_t iSize) +{ + core_.isize = iSize; + return *this; +} + +BamRecordBuilder& BamRecordBuilder::MapQuality(const uint8_t mapQual) +{ + core_.qual = mapQual; + return *this; +} + +BamRecordBuilder& BamRecordBuilder::MatePosition(const int32_t pos) +{ + core_.mpos = pos; + return *this; +} + +BamRecordBuilder& BamRecordBuilder::MateReferenceId(const int32_t id) +{ + core_.mtid = id; + return *this; +} + +BamRecordBuilder& BamRecordBuilder::Name(std::string name) +{ + core_.l_qname = name.size() + 1; // (NULL-term) + name_ = std::move(name); + return *this; +} + +BamRecordBuilder& BamRecordBuilder::Position(const int32_t pos) +{ + core_.pos = pos; + return *this; +} + +BamRecordBuilder& BamRecordBuilder::Qualities(std::string qualities) +{ + qualities_ = std::move(qualities); + return *this; +} + +BamRecordBuilder& BamRecordBuilder::ReferenceId(const int32_t id) +{ + core_.tid = id; + return *this; +} + +void BamRecordBuilder::Reset() +{ + // 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(BamRecord prototype) +{ + // ensure clean slate + Reset(); + header_ = prototype.Header(); + + // reset variable-length data + const BamRecordImpl& impl = BamRecordMemory::GetImpl(prototype); + name_ = impl.Name(); + sequence_ = impl.Sequence(); + qualities_ = impl.Qualities().Fastq(); + cigar_ = impl.CigarData(); + tags_ = impl.Tags(); + + // reset core data + const auto rawData = BamRecordMemory::GetRawData(prototype); + if (!rawData) + throw std::runtime_error{ + "BamRecordBuilder: cannot build record, target memory is in an invalid state"}; + core_ = std::move(rawData->core); +} + +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; +} + +BamRecordBuilder& BamRecordBuilder::Tags(TagCollection tags) +{ + tags_ = std::move(tags); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamRecordImpl.cpp b/src/BamRecordImpl.cpp new file mode 100644 index 0000000..020066e --- /dev/null +++ b/src/BamRecordImpl.cpp @@ -0,0 +1,841 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamRecordImpl.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "BamRecordTags.h" +#include "MemoryUtils.h" +#include "pbbam/BamTagCodec.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +namespace { + +static const bool has_native_long_cigar_support = DoesHtslibSupportLongCigar(); + +Cigar FetchRawCigar(const uint32_t* const src, const uint32_t len) +{ + Cigar result; + result.reserve(len); + for (uint32_t i = 0; i < len; ++i) { + const uint32_t length = bam_cigar_oplen(src[i]); + const auto type = static_cast(bam_cigar_op(src[i])); + result.push_back(CigarOperation(type, length)); + } + return result; +} + +bool HasLongCigar(const bam1_t* const b) +{ + auto* c = &b->core; + + // if empty CIGAR or unmapped + if (c->n_cigar == 0 || c->tid < 0 || c->pos < 0) return false; + + // if existing CIGAR doesn't look like a 'fake CIGAR' + const auto firstCigarOp = *(bam_get_cigar(b)); + if (bam_cigar_op(firstCigarOp) != static_cast(CigarOperationType::SOFT_CLIP) || + static_cast(bam_cigar_oplen(firstCigarOp)) != c->l_qseq) { + return false; + } + + // if CG tag missing, not expected type + const uint8_t* const CG = bam_aux_get(b, "CG"); + if (CG == nullptr) return false; + if (CG[0] != 'B' || CG[1] != 'I') return false; + + // if CG tag data is empty + uint32_t numElements = 0; + memcpy(&numElements, &CG[2], sizeof(uint32_t)); + if (numElements == 0) return false; + + // we've found long CIGAR data in the CG tag + return true; +} + +} // namespace anonymous + +BamRecordImpl::BamRecordImpl() : d_(nullptr) +{ + InitializeData(); + assert(d_); +} + +BamRecordImpl::BamRecordImpl(const BamRecordImpl& other) + : d_{bam_dup1(other.d_.get()), HtslibRecordDeleter()}, tagOffsets_{other.tagOffsets_} +{ + assert(d_); +} + +BamRecordImpl::BamRecordImpl(BamRecordImpl&& other) : tagOffsets_{std::move(other.tagOffsets_)} +{ + d_.swap(other.d_); + other.d_.reset(); + assert(d_); +} + +BamRecordImpl& BamRecordImpl::operator=(const BamRecordImpl& other) +{ + if (this != &other) { + if (d_ == nullptr) InitializeData(); + bam_copy1(d_.get(), other.d_.get()); + tagOffsets_ = other.tagOffsets_; + } + assert(d_); + return *this; +} + +BamRecordImpl& BamRecordImpl::operator=(BamRecordImpl&& other) +{ + if (this != &other) { + d_.swap(other.d_); + other.d_.reset(); + + tagOffsets_ = std::move(other.tagOffsets_); + } + assert(d_); + return *this; +} + +BamRecordImpl::~BamRecordImpl() = default; + +bool BamRecordImpl::AddTag(const std::string& tagName, const Tag& value) +{ + return AddTag(tagName, value, TagModifier::NONE); +} + +bool BamRecordImpl::AddTag(const BamRecordTag tag, const Tag& value) +{ + return AddTag(BamRecordTags::LabelFor(tag), value, TagModifier::NONE); +} + +bool BamRecordImpl::AddTag(const std::string& tagName, const Tag& value, + const TagModifier additionalModifier) +{ + if (tagName.size() != 2 || HasTag(tagName)) return false; + const auto added = AddTagImpl(tagName, value, additionalModifier); + if (added) UpdateTagMap(); + return added; +} + +bool BamRecordImpl::AddTag(const BamRecordTag tag, const Tag& value, + const TagModifier additionalModifier) +{ + return AddTag(BamRecordTags::LabelFor(tag), value, additionalModifier); +} + +bool BamRecordImpl::AddTagImpl(const std::string& tagName, const Tag& value, + const TagModifier additionalModifier) +{ + const auto rawData = BamTagCodec::ToRawData(value, additionalModifier); + if (rawData.empty()) return false; + + bam_aux_append(d_.get(), tagName.c_str(), BamTagCodec::TagTypeCode(value, additionalModifier), + rawData.size(), const_cast(rawData.data())); + return true; +} + +uint32_t BamRecordImpl::Bin() const { return d_->core.bin; } + +BamRecordImpl& BamRecordImpl::Bin(uint32_t bin) +{ + d_->core.bin = bin; + return *this; +} + +Cigar BamRecordImpl::CigarData() const +{ + const auto* b = d_.get(); + if (!has_native_long_cigar_support && HasLongCigar(b)) { + // fetch long CIGAR from tag + const auto cigarTag = TagValue("CG"); + const auto cigarTagValue = cigarTag.ToUInt32Array(); + return FetchRawCigar(cigarTagValue.data(), cigarTagValue.size()); + } else { + // fetch CIGAR from the standard location + return FetchRawCigar(bam_get_cigar(b), b->core.n_cigar); + } +} + +BamRecordImpl& BamRecordImpl::CigarData(const Cigar& cigar) +{ + // if long CIGAR, using htslib version < 1.7, set it "manually" + if (!has_native_long_cigar_support && cigar.size() >= 65536) { + // Add the 'fake' CIGAR in normal place. + Cigar fake; + fake.emplace_back(CigarOperationType::SOFT_CLIP, SequenceLength()); + const uint32_t alignedLength = + static_cast(bam_cigar2rlen(d_->core.n_cigar, bam_get_cigar(d_.get()))); + fake.emplace_back(CigarOperationType::REFERENCE_SKIP, alignedLength); + SetCigarData(fake); + + // Add raw CIGAR data to CG tag. + std::vector cigarData(cigar.size()); + cigarData.reserve(cigar.size()); + for (size_t i = 0; i < cigar.size(); ++i) { + const CigarOperation& op = cigar.at(i); + cigarData[i] = bam_cigar_gen(op.Length(), static_cast(op.Type())); + } + if (HasTag("CG")) + EditTag("CG", Tag{cigarData}); + else + AddTag("CG", Tag{cigarData}); + } + + // otherwise (v1.7+ or short CIGAR), use standard APIs + else { + if (HasTag("CG")) RemoveTag("CG"); + SetCigarData(cigar); + } + + return *this; +} + +BamRecordImpl& BamRecordImpl::CigarData(const std::string& cigarString) +{ + return CigarData(Cigar::FromStdString(cigarString)); +} + +bool BamRecordImpl::EditTag(const std::string& tagName, const Tag& newValue) +{ + return EditTag(tagName, newValue, TagModifier::NONE); +} + +bool BamRecordImpl::EditTag(const BamRecordTag tag, const Tag& newValue) +{ + return EditTag(BamRecordTags::LabelFor(tag), newValue, TagModifier::NONE); +} + +bool BamRecordImpl::EditTag(const std::string& tagName, const Tag& newValue, + const TagModifier additionalModifier) +{ + // try remove old value (with delayed tag map update) + const bool removed = RemoveTagImpl(tagName); + if (!removed) return false; + + // if old value removed, add new value + const bool added = AddTagImpl(tagName, newValue, additionalModifier); + if (added) UpdateTagMap(); + return added; +} + +bool BamRecordImpl::EditTag(const BamRecordTag tag, const Tag& newValue, + const TagModifier additionalModifier) +{ + return EditTag(BamRecordTags::LabelFor(tag), newValue, additionalModifier); +} + +uint32_t BamRecordImpl::Flag() const { return d_->core.flag; } + +BamRecordImpl& BamRecordImpl::Flag(uint32_t flag) +{ + d_->core.flag = flag; + return *this; +} + +BamRecordImpl BamRecordImpl::FromRawData(const std::shared_ptr& rawData) +{ + BamRecordImpl result; + bam_copy1(result.d_.get(), rawData.get()); + return result; +} + +bool BamRecordImpl::HasTag(const std::string& tagName) const +{ + if (tagName.size() != 2) return false; + return TagOffset(tagName) != -1; +} + +bool BamRecordImpl::HasTag(const BamRecordTag tag) const +{ + return HasTag(BamRecordTags::LabelFor(tag)); +} + +void BamRecordImpl::InitializeData() +{ + d_.reset(bam_init1(), HtslibRecordDeleter()); + d_->data = static_cast( + calloc(0x800, sizeof(uint8_t))); // maybe make this value tune-able later? + d_->m_data = 0x800; + + // init unmapped + Position(PacBio::BAM::UnmappedPosition); + MatePosition(PacBio::BAM::UnmappedPosition); + ReferenceId(-1); + MateReferenceId(-1); + SetMapped(false); + MapQuality(255); + + // initialized with empty qname (null term + 3 'extra nulls' for alignment + d_->core.l_extranul = 3; + d_->core.l_qname = 4; + d_->l_data = 4; +} + +int32_t BamRecordImpl::InsertSize() const { return d_->core.isize; } + +BamRecordImpl& BamRecordImpl::InsertSize(int32_t iSize) +{ + d_->core.isize = iSize; + return *this; +} + +bool BamRecordImpl::IsDuplicate() const { return (d_->core.flag & BamRecordImpl::DUPLICATE) != 0; } + +bool BamRecordImpl::IsFailedQC() const { return (d_->core.flag & BamRecordImpl::FAILED_QC) != 0; } + +bool BamRecordImpl::IsFirstMate() const { return (d_->core.flag & BamRecordImpl::MATE_1) != 0; } + +bool BamRecordImpl::IsMapped() const { return (d_->core.flag & BamRecordImpl::UNMAPPED) == 0; } + +bool BamRecordImpl::IsMateMapped() const +{ + return (d_->core.flag & BamRecordImpl::MATE_UNMAPPED) == 0; +} + +bool BamRecordImpl::IsMateReverseStrand() const +{ + return (d_->core.flag & BamRecordImpl::MATE_REVERSE_STRAND) != 0; +} + +bool BamRecordImpl::IsPaired() const { return (d_->core.flag & BamRecordImpl::PAIRED) != 0; } + +bool BamRecordImpl::IsPrimaryAlignment() const +{ + return (d_->core.flag & BamRecordImpl::SECONDARY) == 0; +} + +bool BamRecordImpl::IsProperPair() const +{ + return (d_->core.flag & BamRecordImpl::PROPER_PAIR) != 0; +} + +bool BamRecordImpl::IsReverseStrand() const +{ + return (d_->core.flag & BamRecordImpl::REVERSE_STRAND) != 0; +} + +bool BamRecordImpl::IsSecondMate() const { return (d_->core.flag & BamRecordImpl::MATE_2) != 0; } + +bool BamRecordImpl::IsSupplementaryAlignment() const +{ + return (d_->core.flag & BamRecordImpl::SUPPLEMENTARY) != 0; +} + +uint8_t BamRecordImpl::MapQuality() const { return d_->core.qual; } + +BamRecordImpl& BamRecordImpl::MapQuality(uint8_t mapQual) +{ + d_->core.qual = mapQual; + return *this; +} + +PacBio::BAM::Position BamRecordImpl::MatePosition() const { return d_->core.mpos; } + +BamRecordImpl& BamRecordImpl::MatePosition(PacBio::BAM::Position pos) +{ + d_->core.mpos = pos; + return *this; +} + +int32_t BamRecordImpl::MateReferenceId() const { return d_->core.mtid; } + +BamRecordImpl& BamRecordImpl::MateReferenceId(int32_t id) +{ + d_->core.mtid = id; + return *this; +} + +PacBio::BAM::Position BamRecordImpl::Position() const { return d_->core.pos; } + +BamRecordImpl& BamRecordImpl::Position(PacBio::BAM::Position pos) +{ + d_->core.pos = pos; + return *this; +} + +int32_t BamRecordImpl::ReferenceId() const { return d_->core.tid; } + +BamRecordImpl& BamRecordImpl::ReferenceId(int32_t id) +{ + d_->core.tid = id; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetDuplicate(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::DUPLICATE; + else + d_->core.flag &= ~BamRecordImpl::DUPLICATE; + return *this; +} + +void BamRecordImpl::MaybeReallocData() +{ + // 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 + // + // from sam.h: + // decltype(m_data) = uint32_t + // decltype(l_data) = int + if (d_->m_data < static_cast(d_->l_data)) { + d_->m_data = d_->l_data; + kroundup32(d_->m_data); + d_->data = static_cast(realloc(d_->data, d_->m_data)); + } +} + +std::string BamRecordImpl::Name() const { return std::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 size_t numExtraNulls = 4 - (numChars % 4); + const size_t totalNameSize = numChars + numExtraNulls; + + const int diffNumBytes = totalNameSize - 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 - (reinterpret_cast(oldCigarStart) - + reinterpret_cast(d_->data)); + d_->core.l_qname = totalNameSize; + d_->core.l_extranul = numExtraNulls; + uint32_t* newCigarStart = bam_get_cigar(d_); + memmove(newCigarStart, oldCigarStart, trailingDataLength); + + // fill in new name + memcpy(d_->data, name.c_str(), numChars); + memset(d_->data + numChars, '\0', numExtraNulls); + return *this; +} + +QualityValues BamRecordImpl::Qualities() 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; +} + +bool BamRecordImpl::RemoveTag(const std::string& tagName) +{ + const bool removed = RemoveTagImpl(tagName); + if (removed) UpdateTagMap(); + return removed; +} + +bool BamRecordImpl::RemoveTag(const BamRecordTag tag) +{ + return RemoveTag(BamRecordTags::LabelFor(tag)); +} + +bool BamRecordImpl::RemoveTagImpl(const std::string& tagName) +{ + if (tagName.size() != 2) return false; + uint8_t* data = bam_aux_get(d_.get(), tagName.c_str()); + if (data == nullptr) return false; + const bool ok = bam_aux_del(d_.get(), data) == 0; + return ok; +} + +std::string BamRecordImpl::Sequence() const +{ + std::string result(d_->core.l_qseq, '\0'); + static const constexpr std::array DnaLookup{ + {'=', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B', 'N'}}; + const uint8_t* seqData = bam_get_seq(d_); + for (int i = 0; i < d_->core.l_qseq; ++i) + result[i] = DnaLookup[bam_seqi(seqData, i)]; + return result; +} + +size_t BamRecordImpl::SequenceLength() const { return d_->core.l_qseq; } + +void BamRecordImpl::SetCigarData(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(cigarOp.Type())); + } +} + +BamRecordImpl& BamRecordImpl::SetFailedQC(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::FAILED_QC; + else + d_->core.flag &= ~BamRecordImpl::FAILED_QC; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetFirstMate(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::MATE_1; + else + d_->core.flag &= ~BamRecordImpl::MATE_1; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetMapped(bool ok) +{ + if (ok) + d_->core.flag &= ~BamRecordImpl::UNMAPPED; + else + d_->core.flag |= BamRecordImpl::UNMAPPED; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetMateMapped(bool ok) +{ + if (ok) + d_->core.flag &= ~BamRecordImpl::MATE_UNMAPPED; + else + d_->core.flag |= BamRecordImpl::MATE_UNMAPPED; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetMateReverseStrand(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::MATE_REVERSE_STRAND; + else + d_->core.flag &= ~BamRecordImpl::MATE_REVERSE_STRAND; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetPaired(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::PAIRED; + else + d_->core.flag &= ~BamRecordImpl::PAIRED; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetPrimaryAlignment(bool ok) +{ + if (ok) + d_->core.flag &= ~BamRecordImpl::SECONDARY; + else + d_->core.flag |= BamRecordImpl::SECONDARY; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetProperPair(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::PROPER_PAIR; + else + d_->core.flag &= ~BamRecordImpl::PROPER_PAIR; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetReverseStrand(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::REVERSE_STRAND; + else + d_->core.flag &= ~BamRecordImpl::REVERSE_STRAND; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetSecondMate(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::MATE_2; + else + d_->core.flag &= ~BamRecordImpl::MATE_2; + return *this; +} + +BamRecordImpl& BamRecordImpl::SetSequenceAndQualities(const std::string& sequence, + const std::string& qualities) +{ + if (!qualities.empty() && (sequence.size() != qualities.size())) { + std::ostringstream s; + s << "BamRecord: if qualities are provided, the length must match the sequence length:\n" + << " seq: " << sequence.size() << '\n' + << " qualities: " << qualities.size(); + throw std::runtime_error{s.str()}; + } + 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 auto encodedSequenceLength = static_cast((sequenceLength + 1) / 2); + const int oldSeqAndQualLength = + ((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 unsigned char* oldTagStart = bam_get_aux(d_); + const size_t trailingDataLength = + oldLengthData - (oldTagStart - reinterpret_cast(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[static_cast(sequence[i])] + << ((~i & 1) << 2); + } + + // fill in quality values + uint8_t* encodedQualities = bam_get_qual(d_); + if ((qualities == nullptr) || (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::SetSupplementaryAlignment(bool ok) +{ + if (ok) + d_->core.flag |= BamRecordImpl::SUPPLEMENTARY; + else + d_->core.flag &= ~BamRecordImpl::SUPPLEMENTARY; + return *this; +} + +int BamRecordImpl::TagOffset(const std::string& tagName) const +{ + if (tagName.size() != 2) + throw std::runtime_error{"BamRecord: tag name (" + tagName + + ") must have 2 characters only"}; + + if (tagOffsets_.empty()) UpdateTagMap(); + + const uint16_t tagCode = + (static_cast(tagName.at(0)) << 8) | static_cast(tagName.at(1)); + const auto found = tagOffsets_.find(tagCode); + return (found != tagOffsets_.cend() ? found->second : -1); +} + +BamRecordImpl& BamRecordImpl::Tags(const TagCollection& tags) +{ + // convert tags to binary + const std::vector 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(static_cast(tagStart), data, numBytes); + + // update tag info + UpdateTagMap(); + return *this; +} + +TagCollection BamRecordImpl::Tags() const +{ + const uint8_t* tagDataStart = bam_get_aux(d_); + const size_t numBytes = d_->l_data - (tagDataStart - d_->data); + return BamTagCodec::Decode(std::vector(tagDataStart, tagDataStart + numBytes)); +} + +Tag BamRecordImpl::TagValue(const std::string& tagName) const +{ + if (tagName.size() != 2) return {}; + + const int offset = TagOffset(tagName); + if (offset == -1) return {}; + + bam1_t* b = d_.get(); + assert(bam_get_aux(b)); + uint8_t* tagData = bam_get_aux(b) + offset; + if (offset >= b->l_data) return {}; + + // skip tag name + return BamTagCodec::FromRawData(tagData); +} + +Tag BamRecordImpl::TagValue(const BamRecordTag tag) const +{ + return TagValue(BamRecordTags::LabelFor(tag)); +} + +void BamRecordImpl::UpdateTagMap() const +{ + // clear out offsets, leave map structure basically intact + for (auto& tag : tagOffsets_) + tag.second = -1; + + const uint8_t* tagStart = bam_get_aux(d_); + if (tagStart == nullptr) return; + const ptrdiff_t numBytes = d_->l_data - (tagStart - d_->data); + + // NOTE: using a 16-bit 'code' for tag name here instead of string, to avoid + // a lot of string constructions & comparisons. All valid tags will be 2 chars + // anyway, so this should be a nice lookup mechanism. + // + uint16_t tagNameCode; + int64_t i = 0; + while (i < numBytes) { + + // store (tag name code -> start offset into tag data) + tagNameCode = static_cast(tagStart[i]) << 8 | static_cast(tagStart[i + 1]); + i += 2; + tagOffsets_[tagNameCode] = i; + + // skip tag contents + const auto tagType = static_cast(tagStart[i++]); + switch (tagType) { + case 'A': + case 'a': + case 'c': + case 'C': { + i += 1; + break; + } + case 's': + case 'S': { + i += 2; + break; + } + case 'i': + case 'I': + case 'f': { + i += 4; + break; + } + + case 'Z': + case 'H': { + // null-terminated string + i += strlen(reinterpret_cast(&tagStart[i])) + 1; + break; + } + + case 'B': { + const char subTagType = tagStart[i++]; + size_t elementSize = 0; + switch (subTagType) { + case 'c': + case 'C': + elementSize = 1; + break; + case 's': + case 'S': + elementSize = 2; + break; + case 'i': + case 'I': + case 'f': + elementSize = 4; + break; + + // unknown subTagType + default: + throw std::runtime_error{ + "BamRecord: unsupported array-tag-type encountered: " + + std::string{1, subTagType}}; + } + + uint32_t numElements = 0; + memcpy(&numElements, &tagStart[i], sizeof(uint32_t)); + i += (4 + (elementSize * numElements)); + break; + } + + // unknown tagType + default: + throw std::runtime_error{"BamRecord: unsupported tag-type encountered: " + + std::string{1, tagType}}; + } + } +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamRecordTags.cpp b/src/BamRecordTags.cpp new file mode 100644 index 0000000..b037e67 --- /dev/null +++ b/src/BamRecordTags.cpp @@ -0,0 +1,66 @@ +// File Description +/// \file BamRecordTags.h +/// \brief Implements the BamRecordTags utility class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "BamRecordTags.h" + +#include +#include + +#include "EnumClassHash.h" + +namespace PacBio { +namespace BAM { + +// clang-format off +const BamRecordTags::TagLookupType BamRecordTags::tagLookup = +{ + // enum name label isPulse? + // --------- ----- -------- + { BamRecordTag::ALT_LABEL_QV, {"pv", true} }, + { BamRecordTag::ALT_LABEL_TAG, {"pt", true} }, + { BamRecordTag::BARCODE_QUALITY, {"bq", false} }, + { BamRecordTag::BARCODES, {"bc", false} }, + { BamRecordTag::CONTEXT_FLAGS, {"cx", false} }, + { BamRecordTag::DELETION_QV, {"dq", false} }, + { BamRecordTag::DELETION_TAG, {"dt", false} }, + { BamRecordTag::HOLE_NUMBER, {"zm", false} }, + { BamRecordTag::INSERTION_QV, {"iq", false} }, + { BamRecordTag::IPD, {"ip", false} }, + { BamRecordTag::LABEL_QV, {"pq", true} }, + { BamRecordTag::LONG_CIGAR, {"CG", false} }, + { BamRecordTag::MERGE_QV, {"mq", false} }, + { BamRecordTag::NUM_PASSES, {"np", false} }, + { BamRecordTag::PKMEAN, {"pa", true} }, + { BamRecordTag::PKMEAN_2, {"ps", true} }, + { BamRecordTag::PKMID, {"pm", true} }, + { BamRecordTag::PKMID_2, {"pi", true} }, + { BamRecordTag::PRE_PULSE_FRAMES, {"pd", true} }, + { BamRecordTag::PULSE_CALL, {"pc", true} }, + { BamRecordTag::PULSE_CALL_WIDTH, {"px", true} }, + { BamRecordTag::PULSE_EXCLUSION, {"pe", true} }, + { BamRecordTag::PULSE_MERGE_QV, {"pg", true} }, + { BamRecordTag::PULSE_WIDTH, {"pw", false} }, // 'pulse' in the name; but stored per-base, not per-pulse + { BamRecordTag::QUERY_END, {"qe", false} }, + { BamRecordTag::QUERY_START, {"qs", false} }, + { BamRecordTag::READ_ACCURACY, {"rq", false} }, + { BamRecordTag::READ_GROUP, {"RG", false} }, + { BamRecordTag::SCRAP_REGION_TYPE, {"sc", false} }, + { BamRecordTag::SCRAP_ZMW_TYPE, {"sz", false} }, + { BamRecordTag::SNR, {"sn", false} }, + { BamRecordTag::START_FRAME, {"sf", true} }, + { BamRecordTag::SUBSTITUTION_QV, {"sq", false} }, + { BamRecordTag::SUBSTITUTION_TAG, {"st", false} }, + + // faux tags + { BamRecordTag::SEQ, {" ", false} }, + { BamRecordTag::QUAL, {" ", false} } +}; +// clang-format on + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamRecordTags.h b/src/BamRecordTags.h new file mode 100644 index 0000000..583855b --- /dev/null +++ b/src/BamRecordTags.h @@ -0,0 +1,55 @@ +// File Description +/// \file BamRecordTags.h +/// \brief Defines the BamRecordTags utility class. +// +// Author: Derek Barnett + +#ifndef BAMRECORDTAGS_H +#define BAMRECORDTAGS_H + +#include +#include +#include + +#include "EnumClassHash.h" +#include "pbbam/BamRecord.h" +#include "pbbam/BamRecordImpl.h" +#include "pbbam/BamRecordTag.h" + +namespace PacBio { +namespace BAM { + +class BamRecordTags +{ +public: + // tag info + static inline bool IsPulse(const BamRecordTag tag); + static inline std::string LabelFor(const BamRecordTag tag); + +private: + struct BamRecordTagData + { + const std::string label_; //[3]; // 2-char tag plus NULL + const bool isPulse_; + }; + + using TagLookupType = std::unordered_map; + static const TagLookupType tagLookup; +}; + +inline bool BamRecordTags::IsPulse(const BamRecordTag tag) +{ + assert(tagLookup.find(tag) != tagLookup.cend()); + return tagLookup.at(tag).isPulse_; +} + +inline std::string BamRecordTags::LabelFor(const BamRecordTag tag) +{ + assert(tagLookup.find(tag) != tagLookup.cend()); + return tagLookup.at(tag).label_; +} + +} // namespace BAM +} // namespace PacBio + +#endif // BAMRECORDTAGS_H diff --git a/src/BamRecordView.cpp b/src/BamRecordView.cpp new file mode 100644 index 0000000..a08b7d4 --- /dev/null +++ b/src/BamRecordView.cpp @@ -0,0 +1,138 @@ +// File Description +/// \file BamRecordView.cpp +/// \brief Implements the BamRecordTags utility class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamRecordView.h" + +namespace PacBio { +namespace BAM { + +BamRecordView::BamRecordView(const BamRecord& record, const Orientation orientation, + const bool aligned, const bool exciseSoftClips, + const PulseBehavior pulseBehavior) + : record_(record) + , orientation_{orientation} + , aligned_{aligned} + , exciseSoftClips_{exciseSoftClips} + , pulseBehavior_{pulseBehavior} +{ +} + +QualityValues BamRecordView::AltLabelQVs() const +{ + return record_.AltLabelQV(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +std::string BamRecordView::AltLabelTags() const +{ + return record_.AltLabelTag(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +QualityValues BamRecordView::DeletionQVs() const +{ + return record_.DeletionQV(orientation_, aligned_, exciseSoftClips_); +} + +std::string BamRecordView::DeletionTags() const +{ + return record_.DeletionTag(orientation_, aligned_, exciseSoftClips_); +} + +QualityValues BamRecordView::InsertionQVs() const +{ + return record_.InsertionQV(orientation_, aligned_, exciseSoftClips_); +} + +Frames BamRecordView::IPD() const { return record_.IPD(orientation_, aligned_, exciseSoftClips_); } + +Frames BamRecordView::PrebaseFrames() const +{ + return record_.IPD(orientation_, aligned_, exciseSoftClips_); +} + +QualityValues BamRecordView::LabelQVs() const +{ + return record_.LabelQV(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +QualityValues BamRecordView::MergeQVs() const +{ + return record_.MergeQV(orientation_, aligned_, exciseSoftClips_); +} + +QualityValues BamRecordView::PulseMergeQVs() const +{ + return record_.PulseMergeQV(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +std::vector BamRecordView::Pkmean() const +{ + return record_.Pkmean(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +std::vector BamRecordView::Pkmid() const +{ + return record_.Pkmid(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +std::vector BamRecordView::Pkmean2() const +{ + return record_.Pkmean2(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +std::vector BamRecordView::Pkmid2() const +{ + return record_.Pkmid2(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +Frames BamRecordView::PrePulseFrames() const +{ + return record_.PrePulseFrames(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +std::string BamRecordView::PulseCalls() const +{ + return record_.PulseCall(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +Frames BamRecordView::PulseCallWidth() const +{ + return record_.PulseCallWidth(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +Frames BamRecordView::PulseWidths() const +{ + return record_.PulseWidth(orientation_, aligned_, exciseSoftClips_); +} + +QualityValues BamRecordView::Qualities() const +{ + return record_.Qualities(orientation_, aligned_, exciseSoftClips_); +} + +std::string BamRecordView::Sequence() const +{ + return record_.Sequence(orientation_, aligned_, exciseSoftClips_); +} + +std::vector BamRecordView::StartFrames() const +{ + return record_.StartFrame(orientation_, aligned_, exciseSoftClips_, pulseBehavior_); +} + +QualityValues BamRecordView::SubstitutionQVs() const +{ + return record_.SubstitutionQV(orientation_, aligned_, exciseSoftClips_); +} + +std::string BamRecordView::SubstitutionTags() const +{ + return record_.SubstitutionTag(orientation_, aligned_, exciseSoftClips_); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamTagCodec.cpp b/src/BamTagCodec.cpp new file mode 100644 index 0000000..42fa048 --- /dev/null +++ b/src/BamTagCodec.cpp @@ -0,0 +1,546 @@ +// File Description +/// \file BamTagCodec.cpp +/// \brief Implements the BamTagCodec class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamTagCodec.h" + +#include +#include +#include + +#include + +namespace PacBio { +namespace BAM { +namespace { + +template +inline void appendBamValue(const T& value, kstring_t* str) +{ + kputsn_(reinterpret_cast(&value), sizeof(value), str); +} + +template +inline void appendBamMultiValue(const std::vector& container, kstring_t* str) +{ + const uint32_t n = container.size(); + kputsn_(&n, sizeof(n), str); + kputsn_(reinterpret_cast(&container[0]), n * sizeof(T), str); +} + +template +inline T readBamValue(const uint8_t* src, size_t& offset) +{ + T value; + memcpy(&value, &src[offset], sizeof(value)); + offset += sizeof(value); + return value; +} + +template +std::vector readBamMultiValue(const uint8_t* src, size_t& offset) +{ + uint32_t numElements; + memcpy(&numElements, &src[offset], sizeof(uint32_t)); + offset += 4; + + std::vector result; + result.reserve(numElements); + for (size_t i = 0; i < numElements; ++i) { + const T value = readBamValue(src, offset); + result.push_back(value); + } + return result; +} + +} // anonymous + +TagCollection BamTagCodec::Decode(const std::vector& 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) { + + std::string tagName; + tagName.reserve(2); + tagName.append(1, pData[i++]); + tagName.append(1, pData[i++]); + + const auto tagType = static_cast(pData[i++]); + switch (tagType) { + case 'A': + case 'a': { + tags[tagName] = readBamValue(pData, i); + tags[tagName].Modifier(TagModifier::ASCII_CHAR); + break; + } + + case 'c': + tags[tagName] = readBamValue(pData, i); + break; + case 'C': + tags[tagName] = readBamValue(pData, i); + break; + case 's': + tags[tagName] = readBamValue(pData, i); + break; + case 'S': + tags[tagName] = readBamValue(pData, i); + break; + case 'i': + tags[tagName] = readBamValue(pData, i); + break; + case 'I': + tags[tagName] = readBamValue(pData, i); + break; + case 'f': + tags[tagName] = readBamValue(pData, i); + break; + + case 'Z': + case 'H': { + const size_t dataLength = strlen(reinterpret_cast(&pData[i])); + std::string value(reinterpret_cast(&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(pData, i); + break; + case 'C': + tags[tagName] = readBamMultiValue(pData, i); + break; + case 's': + tags[tagName] = readBamMultiValue(pData, i); + break; + case 'S': + tags[tagName] = readBamMultiValue(pData, i); + break; + case 'i': + tags[tagName] = readBamMultiValue(pData, i); + break; + case 'I': + tags[tagName] = readBamMultiValue(pData, i); + break; + case 'f': + tags[tagName] = readBamMultiValue(pData, i); + break; + + // unknown subTagType + default: + throw std::runtime_error{ + "BamTagCodec: unsupported array-tag-type encountered: " + + std::string{1, subTagType}}; + } + break; + } + + // unknown tagType + default: + throw std::runtime_error{"BamTagCodec: unsupported tag-type encountered: " + + std::string{1, tagType}}; + } + } + + return tags; +} + +std::vector BamTagCodec::Encode(const TagCollection& tags) +{ + kstring_t str = {0, 0, nullptr}; + + for (const auto& tagIter : tags) { + + const auto& name = tagIter.first; + if (name.size() != 2) + throw std::runtime_error{"BamTagCodec: tag name (" + name + + ") must have 2 characters only"}; + + const auto& tag = tagIter.second; + if (tag.IsNull()) continue; + + // ":" + kputsn_(name.c_str(), 2, &str); + + // ":" for printable, ASCII char + if (tag.HasModifier(TagModifier::ASCII_CHAR)) { + const char c = tag.ToAscii(); + if (c != '\0') { + kputc_('A', &str); + kputc_(c, &str); + continue; + } + } + + // ":" 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 auto 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; + } + + // unsupported tag type + default: { + free(str.s); + throw std::runtime_error{"BamTagCodec: unsupported tag-type encountered: " + + std::to_string(static_cast(tag.Type()))}; + } + } + } + + std::vector result; + result.resize(str.l); + memcpy(reinterpret_cast(result.data()), str.s, str.l); + free(str.s); + return result; +} + +Tag BamTagCodec::FromRawData(uint8_t* rawData) +{ + size_t offset = 0; + const auto tagType = static_cast(*rawData++); + switch (tagType) { + case 'A': + case 'a': { + Tag t{readBamValue(rawData, offset)}; + t.Modifier(TagModifier::ASCII_CHAR); + return t; + } + + case 'c': + return {readBamValue(rawData, offset)}; + case 'C': + return {readBamValue(rawData, offset)}; + case 's': + return {readBamValue(rawData, offset)}; + case 'S': + return {readBamValue(rawData, offset)}; + case 'i': + return {readBamValue(rawData, offset)}; + case 'I': + return {readBamValue(rawData, offset)}; + case 'f': + return {readBamValue(rawData, offset)}; + + case 'Z': + case 'H': { + const size_t dataLength = strlen(reinterpret_cast(&rawData[0])); + std::string value(reinterpret_cast(&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 {readBamMultiValue(rawData, offset)}; + case 'C': + return {readBamMultiValue(rawData, offset)}; + case 's': + return {readBamMultiValue(rawData, offset)}; + case 'S': + return {readBamMultiValue(rawData, offset)}; + case 'i': + return {readBamMultiValue(rawData, offset)}; + case 'I': + return {readBamMultiValue(rawData, offset)}; + case 'f': + return {readBamMultiValue(rawData, offset)}; + + // unknown subTagType + default: + throw std::runtime_error{ + "BamTagCodec: unsupported array-tag-type encountered: " + + std::string{1, subTagType}}; + } + break; + } + + // unknown tagType + default: + throw std::runtime_error{"BamTagCodec: unsupported tag-type encountered: " + + std::string{1, tagType}}; + } + return Tag(); // to avoid compiler warning +} + +std::vector BamTagCodec::ToRawData(const Tag& tag, const TagModifier& additionalModifier) +{ + // temp raw data destination (for use with htslib methods) + kstring_t str = {0, 0, nullptr}; + + // ":" for printable, ASCII char + if (tag.HasModifier(TagModifier::ASCII_CHAR) || additionalModifier == TagModifier::ASCII_CHAR) { + const 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 auto 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; + } + + // unsupported tag type + default: { + free(str.s); + throw std::runtime_error{"BamTagCodec: unsupported tag-type encountered: " + + std::to_string(static_cast(tag.Type()))}; + } + } + } + + // store temp contents in actual destination + std::vector result; + result.resize(str.l); + memcpy(reinterpret_cast(&result[0]), str.s, str.l); + free(str.s); + return result; +} + +uint8_t BamTagCodec::TagTypeCode(const Tag& tag, const TagModifier& additionalModifier) +{ + if (tag.HasModifier(TagModifier::ASCII_CHAR) || additionalModifier == TagModifier::ASCII_CHAR) { + int64_t value = 0; + switch (tag.Type()) { + case TagDataType::INT8: + value = static_cast(tag.ToInt8()); + break; + case TagDataType::UINT8: + value = static_cast(tag.ToUInt8()); + break; + case TagDataType::INT16: + value = static_cast(tag.ToInt16()); + break; + case TagDataType::UINT16: + value = static_cast(tag.ToUInt16()); + break; + case TagDataType::INT32: + value = static_cast(tag.ToInt32()); + break; + case TagDataType::UINT32: + value = static_cast(tag.ToUInt32()); + break; + default: + // non integers not allowed + throw std::runtime_error{ + "BamTagCodec: tag-type not convertible to ASCII, tag-type: " + + std::to_string(static_cast(tag.Type()))}; + } + + // ensure value is in valid ASCII char range + if (value < 33 || value > 126) + throw std::runtime_error{"BamTagCodec: invalid integer value for ASCII char, value: " + + std::to_string(value)}; + + return static_cast('A'); + } + + switch (tag.Type()) { + case TagDataType::INT8: + return static_cast('c'); + case TagDataType::UINT8: + return static_cast('C'); + case TagDataType::INT16: + return static_cast('s'); + case TagDataType::UINT16: + return static_cast('S'); + case TagDataType::INT32: + return static_cast('i'); + case TagDataType::UINT32: + return static_cast('I'); + case TagDataType::FLOAT: + return static_cast('f'); + + case TagDataType::STRING: { + if (tag.HasModifier(TagModifier::HEX_STRING) || + additionalModifier == TagModifier::HEX_STRING) + return static_cast('H'); + return static_cast('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('B'); + + default: + throw std::runtime_error{"BamTagCodec: unsupported tag-type encountered: " + + std::to_string(static_cast(tag.Type()))}; + } + return 0; // to avoid compiler warning +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/BamWriter.cpp b/src/BamWriter.cpp new file mode 100644 index 0000000..7240d06 --- /dev/null +++ b/src/BamWriter.cpp @@ -0,0 +1,160 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BamWriter.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "Autovalidate.h" +#include "FileProducer.h" +#include "MemoryUtils.h" +#include "pbbam/BamFile.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/Unused.h" +#include "pbbam/Validator.h" + +namespace PacBio { +namespace BAM { + +class BamWriter::BamWriterPrivate +{ +public: + BamWriterPrivate(const std::string& filename, const std::shared_ptr rawHeader, + const BamWriter::CompressionLevel compressionLevel, const size_t numThreads, + const BamWriter::BinCalculationMode binCalculationMode, const bool useTempFile) + : calculateBins_{binCalculationMode == BamWriter::BinCalculation_ON}, header_{rawHeader} + { + if (!header_) throw std::runtime_error{"BamWriter: null header provided for: " + filename}; + + if (useTempFile) fileProducer_ = std::make_unique(filename); + + // open file + const auto usingFilename = (fileProducer_ ? fileProducer_->TempFilename() : filename); + const auto mode = std::string("wb") + std::to_string(static_cast(compressionLevel)); + file_.reset(sam_open(usingFilename.c_str(), mode.c_str())); + if (!file_) + throw std::runtime_error{"BamWriter: could not open BAM file for writing: " + + usingFilename}; + + // if no explicit thread count given, attempt built-in check + size_t actualNumThreads = numThreads; + if (actualNumThreads == 0) { + actualNumThreads = std::thread::hardware_concurrency(); + + // if still unknown, default to single-threaded + if (actualNumThreads == 0) actualNumThreads = 1; + } + + // if multithreading requested, enable it + if (actualNumThreads > 1) hts_set_threads(file_.get(), actualNumThreads); + + // write header + const auto ret = sam_hdr_write(file_.get(), header_.get()); + if (ret != 0) + throw std::runtime_error{"BamWriter: could not write header for file: " + + usingFilename}; + } + + void Write(const BamRecord& record) + { +#if PBBAM_AUTOVALIDATE + Validator::Validate(record); +#endif + + const auto rawRecord = BamRecordMemory::GetRawData(record); + + // (probably) store bins + // min_shift=14 & n_lvls=5 are BAM "magic numbers" + if (calculateBins_) + rawRecord->core.bin = + hts_reg2bin(rawRecord->core.pos, bam_endpos(rawRecord.get()), 14, 5); + + // write record to file + const auto ret = sam_write1(file_.get(), header_.get(), rawRecord.get()); + if (ret <= 0) throw std::runtime_error{"BamWriter: could not write record to file"}; + } + + void Write(const BamRecord& record, int64_t* vOffset) + { + BGZF* bgzf = file_.get()->fp.bgzf; + assert(bgzf); + assert(vOffset); + + // ensure offsets up-to-date + const auto ret = bgzf_flush(bgzf); + UNUSED(ret); + + // capture virtual offset where we’re about to write + const auto rawTell = htell(bgzf->fp); + const auto length = bgzf->block_offset; + *vOffset = (rawTell << 16) | length; + + // now write data + Write(record); + } + + void Write(const BamRecordImpl& recordImpl) { Write(BamRecord(recordImpl)); } + + bool calculateBins_; + std::unique_ptr file_; + std::shared_ptr header_; + std::unique_ptr fileProducer_; +}; + +BamWriter::BamWriter(const std::string& filename, const BamHeader& header, + const BamWriter::CompressionLevel compressionLevel, const size_t numThreads, + const BinCalculationMode binCalculationMode, const bool useTempFile) + : IRecordWriter() +{ +#if PBBAM_AUTOVALIDATE + Validator::Validate(header); +#endif + d_ = std::make_unique(filename, BamHeaderMemory::MakeRawHeader(header), + compressionLevel, numThreads, binCalculationMode, + useTempFile); +} + +BamWriter::BamWriter(const std::string& filename, const BamHeader& header, + const BamWriter::Config& config) + : BamWriter{filename, + header, + config.compressionLevel, + config.numThreads, + config.binCalculationMode, + config.useTempFile} +{ +} + +BamWriter::BamWriter(BamWriter&&) = default; + +BamWriter& BamWriter::operator=(BamWriter&&) = default; + +BamWriter::~BamWriter() +{ + const auto ret = bgzf_flush(d_->file_.get()->fp.bgzf); + UNUSED(ret); +} + +void BamWriter::TryFlush() +{ + // TODO: sanity checks on file_ & fp + const auto ret = bgzf_flush(d_->file_.get()->fp.bgzf); + if (ret != 0) throw std::runtime_error{"BamWriter: could not flush output buffer contents"}; +} + +void BamWriter::Write(const BamRecord& record) { d_->Write(record); } + +void BamWriter::Write(const BamRecord& record, int64_t* vOffset) { d_->Write(record, vOffset); } + +void BamWriter::Write(const BamRecordImpl& recordImpl) { d_->Write(recordImpl); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/BarcodeQuery.cpp b/src/BarcodeQuery.cpp new file mode 100644 index 0000000..1688e29 --- /dev/null +++ b/src/BarcodeQuery.cpp @@ -0,0 +1,41 @@ +// File Description +/// \file BarcodeQuery.cpp +/// \brief Implements the BarcodeQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/BarcodeQuery.h" + +#include + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFilterTypes.h" + +namespace PacBio { +namespace BAM { + +class BarcodeQuery::BarcodeQueryPrivate +{ +public: + BarcodeQueryPrivate(const int16_t barcode, const DataSet& dataset) + : reader_{PbiBarcodeFilter{barcode}, dataset} + { + } + + PbiFilterCompositeBamReader reader_; // unsorted +}; + +BarcodeQuery::BarcodeQuery(const int16_t barcode, const DataSet& dataset) + : internal::IQuery(), d_{std::make_unique(barcode, dataset)} +{ +} + +BarcodeQuery::~BarcodeQuery() = default; + +bool BarcodeQuery::GetNext(BamRecord& r) { return d_->reader_.GetNext(r); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/ChemistryTable.cpp b/src/ChemistryTable.cpp new file mode 100644 index 0000000..f96bdd9 --- /dev/null +++ b/src/ChemistryTable.cpp @@ -0,0 +1,176 @@ +// Author: Lance Hepler + +#include "PbbamInternalConfig.h" + +#include "ChemistryTable.h" + +#include +#include +#include + +#include "FileUtils.h" +#include "pbbam/exception/BundleChemistryMappingException.h" +#include "pugixml/pugixml.hpp" + +namespace PacBio { +namespace BAM { +namespace { + +ChemistryTable ChemistryTableFromXml(const std::string& mappingXml) +{ + if (!FileUtils::Exists(mappingXml)) + throw BundleChemistryMappingException{ + mappingXml, "SMRT_CHEMISTRY_BUNDLE_DIR defined but file not found"}; + + std::ifstream in(mappingXml); + pugi::xml_document doc; + const pugi::xml_parse_result loadResult = doc.load(in); + if (loadResult.status != pugi::status_ok) + throw BundleChemistryMappingException{ + mappingXml, "unparseable XML, error code:" + std::to_string(loadResult.status)}; + + // parse top-level attributes + pugi::xml_node rootNode = doc.document_element(); + if (rootNode == pugi::xml_node()) + throw BundleChemistryMappingException{mappingXml, "could not fetch XML root node"}; + + if (std::string(rootNode.name()) != "MappingTable") + throw BundleChemistryMappingException{mappingXml, "MappingTable not found"}; + + ChemistryTable table; + try { + for (const auto& childNode : rootNode) { + const std::string childName = childNode.name(); + if (childName != "Mapping") continue; + table.emplace_back( + std::array{{childNode.child("BindingKit").child_value(), + childNode.child("SequencingKit").child_value(), + childNode.child("SoftwareVersion").child_value(), + childNode.child("SequencingChemistry").child_value()}}); + } + } catch (std::exception& e) { + const std::string msg = std::string{"Mapping entries unparseable - "} + e.what(); + throw BundleChemistryMappingException{mappingXml, msg}; + } + return table; +} + +} // anonymous + +const ChemistryTable& BuiltInChemistryTable() +{ + // clang-format off + static ChemistryTable builtin{ + + // BindingKit, SequencingKit, BasecallerVersion, Chemistry + + // RS + {{"100356300", "100356200", "2.1", "P6-C4"}}, + {{"100356300", "100356200", "2.3", "P6-C4"}}, + {{"100356300", "100612400", "2.1", "P6-C4"}}, + {{"100356300", "100612400", "2.3", "P6-C4"}}, + {{"100372700", "100356200", "2.1", "P6-C4"}}, + {{"100372700", "100356200", "2.3", "P6-C4"}}, + {{"100372700", "100612400", "2.1", "P6-C4"}}, + {{"100372700", "100612400", "2.3", "P6-C4"}}, + + // 3.0 ("Dromedary"): S/P1-C1/beta + {{"100-619-300", "100-620-000", "3.0", "S/P1-C1/beta"}}, + {{"100-619-300", "100-620-000", "3.1", "S/P1-C1/beta"}}, + + // 3.1 ("Echidna"): S/P1-C1.1 + {{"100-619-300", "100-867-300", "3.1", "S/P1-C1.1"}}, + {{"100-619-300", "100-867-300", "3.2", "S/P1-C1.1"}}, + {{"100-619-300", "100-867-300", "3.3", "S/P1-C1.1"}}, + + // 3.1.1 ("Flea"): S/P1-C1.2 + {{"100-619-300", "100-902-100", "3.1", "S/P1-C1.2"}}, + {{"100-619-300", "100-902-100", "3.2", "S/P1-C1.2"}}, + {{"100-619-300", "100-902-100", "3.3", "S/P1-C1.2"}}, + {{"100-619-300", "100-902-100", "4.0", "S/P1-C1.2"}}, + {{"100-619-300", "100-902-100", "4.1", "S/P1-C1.2"}}, + + // 3.2 ("Goat"): S/P1-C1.3 + {{"100-619-300", "100-972-200", "3.2", "S/P1-C1.3"}}, + {{"100-619-300", "100-972-200", "3.3", "S/P1-C1.3"}}, + {{"100-619-300", "100-972-200", "4.0", "S/P1-C1.3"}}, + {{"100-619-300", "100-972-200", "4.1", "S/P1-C1.3"}}, + + // 4.0 ("Seabiscuit"); S/P2-C2 + {{"100-862-200", "100-861-800", "4.0", "S/P2-C2"}}, + {{"100-862-200", "100-861-800", "4.1", "S/P2-C2"}}, + {{"100-862-200", "101-093-700", "4.1", "S/P2-C2"}}, + + // 5.0 ("Iguana"); S/P2-C2 + {{"100-862-200", "100-861-800", "5.0", "S/P2-C2/5.0"}}, + {{"100-862-200", "101-093-700", "5.0", "S/P2-C2/5.0"}}, + + // 5.0.1 ChemRel ("Sequel® Sequencing Plate Silwet"); S/P2-C2 + {{"100-862-200", "101-309-500", "5.0", "S/P2-C2/5.0"}}, + // 5.0.1 ChemRel ("Sequel® Sequencing Plate Silwet (4 rxn)"); S/P2-C2 + {{"100-862-200", "101-309-400", "5.0", "S/P2-C2/5.0"}}, + + // --- SG1/16509P/PA5.0 --- + // 2.1 binding kit/5.1PA support with .. + // 5.0 ("Iguana"); S/P2-C2 + {{"101-365-900", "100-861-800", "5.0", "S/P2-C2/5.0"}}, + {{"101-365-900", "101-093-700", "5.0", "S/P2-C2/5.0"}}, + + // 5.0.1 ChemRel; Sequel® Binding Kit 2.1; S/P2-C2 + {{"101-365-900", "101-309-500", "5.0", "S/P2-C2/5.0"}}, // Sequel® Sequencing Plate 2.1 Silwet (8 rxn) + {{"101-365-900", "101-309-400", "5.0", "S/P2-C2/5.0"}}, // Sequel® Sequencing Plate 2.1 Silwet (4 rxn) + + // 5.0.1 ChemRel; Sequel® Binding Kit 3.0; S/P3-C3 + {{"101-500-400", "101-427-500", "5.0", "S/P3-C3/5.0"}}, // Sequel® Sequencing Plate 3.0 (8 rxn) + {{"101-500-400", "101-427-800", "5.0", "S/P3-C3/5.0"}}, // Sequel® Sequencing Plate 3.0 (4 rxn) + + // 5.0.1 ChemRel; Sequel® Dev Binding Kit; S/P2-C2 + {{"101-490-800", "101-490-900", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel II® Sequencing Plate (4 rxn) + {{"101-490-800", "101-491-000", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel II® Sequencing Plate (8 rxn) + + // 5.0.1 ChemRel; Sequel® Sequencing Plate 3.1 for Dynamic Loading placeholder (4 rxn) + {{"101-500-400", "101-646-800", "5.0", "S/P3-C3/5.0"}}, // Sequel® Sequencing Plate 3.1 for Dynamic Loading placeholder + + // 5.0.1 ChemRel; Sequel® Dev Sequencing Plate Dyn Loading (4 rxn) + {{"101-490-800", "101-644-500", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel® Dev Sequencing Plate Dyn Loading + + // 5.0.1 ChemRel; Sequel® Sequencing Plate Dyn Loading (4 rxn) + {{"101-490-800", "101-717-100", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel® Dev Sequencing Plate Dyn Loading + + // 5.0.1 ChemRel; Sequel® Dev Sequencing Plate Dyn Loading (4 rxn) + {{"101-717-300", "101-644-500", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel® Dev Sequencing Plate Dyn Loading + // 5.0.1 ChemRel; Sequel® Sequencing Plate Dyn Loading (4 rxn) + {{"101-717-300", "101-717-100", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel® Dev Sequencing Plate Dyn Loading + + // 5.0.1 ChemRel; Sequel® Dev Sequencing Plate Dyn Loading (4 rxn) + {{"101-717-400", "101-644-500", "5.0", "S/P3-C1/5.0-8M"}}, // Sequel® Dev Sequencing Plate Dyn Loading + // 5.0.1 ChemRel; Sequel® Sequencing Plate Dyn Loading (4 rxn) + {{"101-717-400", "101-717-100", "5.0", "S/P3-C1/5.0-8M"}} // Sequel® Dev Sequencing Plate Dyn Loading + }; + // clang-format on + + return builtin; +} + +const ChemistryTable& GetChemistryTableFromEnv() +{ + static const ChemistryTable empty{}; + static std::map tableCache; + + std::string chemPath; + const char* pth = getenv("SMRT_CHEMISTRY_BUNDLE_DIR"); + if (pth != nullptr && pth[0] != '\0') + chemPath = pth; + else + return empty; + + auto it = tableCache.find(chemPath); + if (it != tableCache.end()) return it->second; + + auto tbl = ChemistryTableFromXml(chemPath + "/chemistry.xml"); + it = tableCache.emplace(std::move(chemPath), std::move(tbl)).first; + return it->second; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/ChemistryTable.h b/src/ChemistryTable.h new file mode 100644 index 0000000..975e122 --- /dev/null +++ b/src/ChemistryTable.h @@ -0,0 +1,22 @@ +// Author: Lance Hepler + +#ifndef CHEMISTRYTABLE_H +#define CHEMISTRYTABLE_H + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +using ChemistryTable = std::vector>; + +const ChemistryTable& BuiltInChemistryTable(); + +const ChemistryTable& GetChemistryTableFromEnv(); + +} // namespace BAM +} // namespace PacBio + +#endif // CHEMISTRYTABLE_H diff --git a/src/Cigar.cpp b/src/Cigar.cpp new file mode 100644 index 0000000..1c59a68 --- /dev/null +++ b/src/Cigar.cpp @@ -0,0 +1,59 @@ +// File Description +/// \file Cigar.cpp +/// \brief Implements the Cigar class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Cigar.h" + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +Cigar::Cigar() = default; + +Cigar::Cigar(const std::string& cigarString) : std::vector{} +{ + 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; + } + } +} + +Cigar::Cigar(const Cigar&) = default; + +Cigar::Cigar(Cigar&&) = default; + +Cigar& Cigar::operator=(const Cigar&) = default; + +Cigar& Cigar::operator=(Cigar&&) = default; + +Cigar::~Cigar() = default; + +Cigar Cigar::FromStdString(const std::string& stdString) { return Cigar(stdString); } + +std::string Cigar::ToStdString() const +{ + std::ostringstream s; + const auto endIt = this->cend(); + for (auto iter = this->cbegin(); iter != endIt; ++iter) { + const CigarOperation& cigar = (*iter); + s << cigar.Length() << cigar.Char(); + } + return s.str(); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/CigarOperation.cpp b/src/CigarOperation.cpp new file mode 100644 index 0000000..71ef4ec --- /dev/null +++ b/src/CigarOperation.cpp @@ -0,0 +1,112 @@ +// File Description +/// \file CigarOperation.cpp +/// \brief Implements the CigarOperation class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/CigarOperation.h" + +#include + +namespace PacBio { +namespace BAM { + +bool CigarOperation::validate_ = true; + +CigarOperation::CigarOperation() = default; + +CigarOperation::CigarOperation(char c, uint32_t length) + : type_{CigarOperation::CharToType(c)}, length_{length} +{ +#ifndef PBBAM_PERMISSIVE_CIGAR + if (validate_ && (type_ == CigarOperationType::ALIGNMENT_MATCH)) + throw std::runtime_error{ + "CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead."}; +#endif +} + +CigarOperation::CigarOperation(CigarOperationType op, uint32_t length) : type_{op}, length_{length} +{ +#ifndef PBBAM_PERMISSIVE_CIGAR + if (validate_ && (type_ == CigarOperationType::ALIGNMENT_MATCH)) + throw std::runtime_error{ + "CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead."}; +#endif +} + +CigarOperation::CigarOperation(const CigarOperation&) = default; + +CigarOperation::CigarOperation(CigarOperation&&) = default; + +CigarOperation& CigarOperation::operator=(const CigarOperation&) = default; + +CigarOperation& CigarOperation::operator=(CigarOperation&&) = default; + +CigarOperation::~CigarOperation() = default; + +bool CigarOperation::operator==(const CigarOperation& other) const +{ + return type_ == other.type_ && length_ == other.length_; +} + +bool CigarOperation::operator!=(const CigarOperation& other) const { return !(*this == other); } + +char CigarOperation::Char() const { return CigarOperation::TypeToChar(type_); } + +CigarOperation& CigarOperation::Char(const char opChar) +{ + type_ = CigarOperation::CharToType(opChar); + return *this; +} + +CigarOperationType CigarOperation::CharToType(const char c) +{ + switch (c) { + case 'S': + return CigarOperationType::SOFT_CLIP; + case '=': + return CigarOperationType::SEQUENCE_MATCH; + case 'X': + return CigarOperationType::SEQUENCE_MISMATCH; + case 'I': + return CigarOperationType::INSERTION; + case 'D': + return CigarOperationType::DELETION; + case 'N': + return CigarOperationType::REFERENCE_SKIP; + case 'H': + return CigarOperationType::HARD_CLIP; + case 'P': + return CigarOperationType::PADDING; + case 'M': + return CigarOperationType::ALIGNMENT_MATCH; + default: + return CigarOperationType::UNKNOWN_OP; + } +} + +uint32_t CigarOperation::Length() const { return length_; } + +CigarOperation& CigarOperation::Length(const uint32_t length) +{ + length_ = length; + return *this; +} + +CigarOperationType CigarOperation::Type() const { return type_; } + +CigarOperation& CigarOperation::Type(const CigarOperationType opType) +{ + type_ = opType; + return *this; +} + +char CigarOperation::TypeToChar(const CigarOperationType type) +{ + return bam_cigar_opchr(static_cast(type)); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Compare.cpp b/src/Compare.cpp new file mode 100644 index 0000000..f9149bc --- /dev/null +++ b/src/Compare.cpp @@ -0,0 +1,110 @@ +// File Description +/// \file Compare.cpp +/// \brief Implements the Compare class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Compare.h" + +#include +#include +#include + +namespace PacBio { +namespace BAM { +namespace { + +struct TypeAlias +{ + std::string name_; + std::string op_; + std::string opAlpha_; + + TypeAlias(std::string name = std::string(), std::string op = std::string(), + std::string opAlpha = std::string()) + : name_(std::move(name)), op_(std::move(op)), opAlpha_(std::move(opAlpha)) + { + } +}; + +struct CompareTypeHash +{ + size_t operator()(const Compare::Type& t) const + { + return std::hash()(static_cast(t)); + } +}; + +// clang-format off +static const std::unordered_map opToTypeMap = +{ + // basic operators plus some permissiveness for other representations + { "==", Compare::EQUAL }, + { "=", Compare::EQUAL }, + { "eq", Compare::EQUAL }, + { "in", Compare::EQUAL }, + { "!=", Compare::NOT_EQUAL }, + { "ne", Compare::NOT_EQUAL }, + { "not_in", Compare::NOT_EQUAL }, + { "<", Compare::LESS_THAN }, + { "lt", Compare::LESS_THAN }, + { "<", Compare::LESS_THAN }, + { "<=", Compare::LESS_THAN_EQUAL }, + { "lte", Compare::LESS_THAN_EQUAL }, + { "<=", Compare::LESS_THAN_EQUAL }, + { ">", Compare::GREATER_THAN }, + { "gt", Compare::GREATER_THAN }, + { ">", Compare::GREATER_THAN }, + { ">=", Compare::GREATER_THAN_EQUAL }, + { "gte", Compare::GREATER_THAN_EQUAL }, + { ">=", Compare::GREATER_THAN_EQUAL }, + { "&", Compare::CONTAINS }, + { "~", Compare::NOT_CONTAINS } +}; + +static const std::unordered_map typeAliases = +{ + { Compare::EQUAL, TypeAlias{ "Compare::EQUAL", "==", "eq" } }, + { Compare::NOT_EQUAL, TypeAlias{ "Compare::NOT_EQUAL", "!=", "ne" } }, + { Compare::LESS_THAN, TypeAlias{ "Compare::LESS_THAN", "<", "lt" } }, + { Compare::LESS_THAN_EQUAL, TypeAlias{ "Compare::LESS_THAN_EQUAL", "<=", "lte" } }, + { Compare::GREATER_THAN, TypeAlias{ "Compare::GREATER_THAN", ">", "gt" } }, + { Compare::GREATER_THAN_EQUAL, TypeAlias{ "Compare::GREATER_THAN_EQUAL", ">=", "gte" } }, + { Compare::CONTAINS, TypeAlias{ "Compare::CONTAINS", "&", "and" } }, + { Compare::NOT_CONTAINS, TypeAlias{ "Compare::NOT_CONTAINS", "~", "not" } } +}; +// clang-format on + +} // anonymous + +Compare::Type Compare::TypeFromOperator(const std::string& opString) +{ + try { + return opToTypeMap.at(opString); + } catch (std::exception&) { + throw std::runtime_error{"Compare: " + opString + " is not a valid comparison operator."}; + } +} + +std::string Compare::TypeToName(const Compare::Type& type) +{ + try { + return typeAliases.at(type).name_; + } catch (std::exception&) { + throw std::runtime_error{"Compare: invalid comparison type encountered"}; + } +} + +std::string Compare::TypeToOperator(const Compare::Type& type, bool asAlpha) +{ + try { + return asAlpha ? typeAliases.at(type).opAlpha_ : typeAliases.at(type).op_; + } catch (std::exception&) { + throw std::runtime_error{"Compare: invalid comparison type encountered"}; + } +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/CompositeFastaReader.cpp b/src/CompositeFastaReader.cpp new file mode 100644 index 0000000..a53daaf --- /dev/null +++ b/src/CompositeFastaReader.cpp @@ -0,0 +1,42 @@ +// File Description +/// \file BamRecordView.cpp +/// \brief Implements the BamRecordTags utility class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/CompositeFastaReader.h" + +namespace PacBio { +namespace BAM { + +CompositeFastaReader::CompositeFastaReader(const std::vector& fastaFiles) +{ + for (const auto& fn : fastaFiles) + readers_.emplace_back(std::make_unique(fn)); +} + +CompositeFastaReader::CompositeFastaReader(const DataSet& dataset) + : CompositeFastaReader{dataset.FastaFiles()} +{ +} + +bool CompositeFastaReader::GetNext(FastaSequence& seq) +{ + // try first reader, if successful return true + // else pop reader and try next, until all readers exhausted + while (!readers_.empty()) { + auto& reader = readers_.front(); + if (reader->GetNext(seq)) + return true; + else + readers_.pop_front(); + } + + // no readers available + return false; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Config.cpp b/src/Config.cpp new file mode 100644 index 0000000..3b7aaf5 --- /dev/null +++ b/src/Config.cpp @@ -0,0 +1,50 @@ +// File Description +/// \file Config.cpp +/// \brief Initializes global variable defaults. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Config.h" + +#include +#include +#include + +#include + +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +// Initialized to -1 to indicate default. We will set this to HTS_LOG_OFF unless +// client code overrides. This keeps htslib from polluting stdout/stderr on its own. +// +int HtslibVerbosity = -1; + +bool DoesHtslibSupportLongCigar() +{ + const std::string htsVersion = hts_version(); + + // remove any "-" for non-release versions + const auto versionBase = PacBio::BAM::Split(htsVersion, '-'); + if (versionBase.empty()) + throw std::runtime_error{"invalid htslib version format: " + htsVersion}; + + // grab major/minor version numbers + const auto versionParts = PacBio::BAM::Split(versionBase[0], '.'); + if (versionParts.size() < 2) + throw std::runtime_error{"invalid htslib version format: " + htsVersion}; + + // check against v1.7 + const int versionMajor = std::stoi(versionParts[0]); + const int versionMinor = std::stoi(versionParts[1]); + static constexpr const int v17_major = 1; + static constexpr const int v17_minor = 7; + return std::tie(versionMajor, versionMinor) >= std::tie(v17_major, v17_minor); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/DataSet.cpp b/src/DataSet.cpp new file mode 100644 index 0000000..4803021 --- /dev/null +++ b/src/DataSet.cpp @@ -0,0 +1,608 @@ +// File Description +/// \file DataSet.cpp +/// \brief Implements the DataSet class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/DataSet.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "DataSetIO.h" +#include "FileUtils.h" +#include "TimeUtils.h" + +#include "pbbam/DataSetTypes.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/internal/DataSetBaseTypes.h" + +namespace PacBio { +namespace BAM { +namespace { + +const std::string defaultVersion{"4.0.0"}; + +void GetAllFiles(const ExternalResources& resources, std::vector* result) +{ + for (const auto& resource : resources) { + + // store this resource's path + result->push_back(resource.ResourceId()); + + // store any child indices + for (const auto& idx : resource.FileIndices()) + result->push_back(idx.ResourceId()); + + // recurse into any other child resources + GetAllFiles(resource.ExternalResources(), result); + } +} + +} // namespace + +using internal::DataSetElement; + +DataSet::DataSet() : DataSet(DataSet::GENERIC) {} + +DataSet::DataSet(const DataSet::TypeEnum type) : path_(FileUtils::CurrentWorkingDirectory()) +{ + switch (type) { + case DataSet::GENERIC: + d_ = std::make_unique(); + break; + case DataSet::ALIGNMENT: + d_ = std::make_unique(); + break; + case DataSet::BARCODE: + d_ = std::make_unique(); + break; + case DataSet::CONSENSUS_ALIGNMENT: + d_ = std::make_unique(); + break; + case DataSet::CONSENSUS_READ: + d_ = std::make_unique(); + break; + case DataSet::CONTIG: + d_ = std::make_unique(); + break; + case DataSet::HDF_SUBREAD: + d_ = std::make_unique(); + break; + case DataSet::REFERENCE: + d_ = std::make_unique(); + break; + case DataSet::SUBREAD: + d_ = std::make_unique(); + break; + case DataSet::TRANSCRIPT: + d_ = std::make_unique(); + break; + case DataSet::TRANSCRIPT_ALIGNMENT: + d_ = std::make_unique(); + break; + default: + throw std::runtime_error{"DataSet: unsupported type"}; + } +} + +DataSet::DataSet(const BamFile& bamFile) + : d_(DataSetIO::FromUri(bamFile.Filename())), path_(FileUtils::CurrentWorkingDirectory()) +{ +} + +DataSet::DataSet(const std::string& filename) + : d_(DataSetIO::FromUri(filename)), path_(FileUtils::DirectoryName(filename)) +{ + // for FOFN contents and raw BAM filenames, we can just use the current + // directory as the starting path. + // + // (any relative paths in the FOFN have already been resolved) + // + if (boost::algorithm::iends_with(filename, ".fofn") || + boost::algorithm::iends_with(filename, ".bam") || + boost::algorithm::iends_with(filename, ".fasta") || + boost::algorithm::iends_with(filename, ".fa")) { + path_ = FileUtils::CurrentWorkingDirectory(); + } +} + +DataSet::DataSet(const std::vector& filenames) + : d_(DataSetIO::FromUris(filenames)), path_(FileUtils::CurrentWorkingDirectory()) +{ +} + +DataSet::DataSet(const DataSet& other) : path_(other.path_) +{ + std::ostringstream out; + DataSetIO::ToStream(other.d_, out); + const std::string xml = out.str(); + d_ = DataSetIO::FromXmlString(xml); +} + +DataSet::DataSet(DataSet&&) = default; + +DataSet& DataSet::operator=(const DataSet& other) +{ + if (this != &other) { + std::ostringstream out; + DataSetIO::ToStream(other.d_, out); + const std::string xml = out.str(); + d_ = DataSetIO::FromXmlString(xml); + path_ = other.path_; + } + return *this; +} + +DataSet& DataSet::operator=(DataSet&&) = default; + +DataSet::~DataSet() = default; + +DataSet& DataSet::operator+=(const DataSet& other) +{ + *d_.get() += *other.d_.get(); + return *this; +} + +std::vector DataSet::AllFiles() const +{ + // get all files + std::vector result; + GetAllFiles(ExternalResources(), &result); + + // resolve relative paths + std::transform(result.begin(), result.end(), result.begin(), + [this](const std::string& fn) { return this->ResolvePath(fn); }); + return result; +} + +const std::string& DataSet::Attribute(const std::string& name) const { return d_->Attribute(name); } + +std::string& DataSet::Attribute(const std::string& name) { return d_->Attribute(name); } + +DataSet& DataSet::Attribute(const std::string& name, const std::string& value) +{ + d_->Attribute(name, value); + return *this; +} + +std::vector DataSet::BamFiles() const +{ + const PacBio::BAM::ExternalResources& resources = ExternalResources(); + + std::vector result; + result.reserve(resources.Size()); + for (const ExternalResource& ext : resources) { + + // only bother resolving file path if this is a BAM file + boost::iterator_range bamFound = + boost::algorithm::ifind_first(ext.MetaType(), "bam"); + if (!bamFound.empty()) { + const std::string fn = ResolvePath(ext.ResourceId()); + result.emplace_back(fn); + } + } + return result; +} + +const std::string& DataSet::CreatedAt() const { return d_->CreatedAt(); } + +std::string& DataSet::CreatedAt() { return d_->CreatedAt(); } + +DataSet& DataSet::CreatedAt(const std::string& createdAt) +{ + d_->CreatedAt(createdAt); + return *this; +} + +const PacBio::BAM::Extensions& DataSet::Extensions() const { return d_->Extensions(); } + +PacBio::BAM::Extensions& DataSet::Extensions() { return d_->Extensions(); } + +DataSet& DataSet::Extensions(const PacBio::BAM::Extensions& extensions) +{ + d_->Extensions(extensions); + return *this; +} + +const PacBio::BAM::ExternalResources& DataSet::ExternalResources() const +{ + return d_->ExternalResources(); +} + +PacBio::BAM::ExternalResources& DataSet::ExternalResources() { return d_->ExternalResources(); } + +DataSet& DataSet::ExternalResources(const PacBio::BAM::ExternalResources& resources) +{ + d_->ExternalResources(resources); + return *this; +} + +std::vector DataSet::FastaFiles() const +{ + const PacBio::BAM::ExternalResources& resources = ExternalResources(); + + std::vector result; + result.reserve(resources.Size()); + for (const ExternalResource& ext : resources) { + + // only bother resolving file path if this is a BAM file + boost::iterator_range fastaFound = + boost::algorithm::ifind_first(ext.MetaType(), "fasta"); + if (!fastaFound.empty()) { + const std::string fn = ResolvePath(ext.ResourceId()); + result.push_back(fn); + } + } + return result; +} + +const PacBio::BAM::Filters& DataSet::Filters() const { return d_->Filters(); } + +PacBio::BAM::Filters& DataSet::Filters() { return d_->Filters(); } + +DataSet& DataSet::Filters(const PacBio::BAM::Filters& filters) +{ + d_->Filters(filters); + return *this; +} + +const std::string& DataSet::Format() const { return d_->Format(); } + +std::string& DataSet::Format() { return d_->Format(); } + +DataSet& DataSet::Format(const std::string& format) +{ + d_->Format(format); + return *this; +} + +DataSet DataSet::FromXml(const std::string& xml) +{ + DataSet result; + result.d_ = DataSetIO::FromXmlString(xml); + return result; +} + +std::vector DataSet::GenomicIntervals() const +{ + // need to gather the contig lengths + std::map contigLengths; + for (const BamFile& b : BamFiles()) { + const BamHeader& header = b.Header(); + const int32_t numContigs = header.NumSequences(); + for (int32_t i = 0; i < numContigs; ++i) { + const std::string refName = header.SequenceName(i); + const int32_t refLength = boost::lexical_cast(header.SequenceLength(i)); + + const auto it = contigLengths.find(refName); + if (it == contigLengths.cend()) + contigLengths.emplace(refName, refLength); + else if (it->second != refLength) { + throw std::runtime_error{ + "DataSet: " + refName + " occurs twice with different lengths ('" + + std::to_string(it->second) + "' and '" + std::to_string(refLength) + "')"}; + } + } + } + + // with the lengths of all contigs known, we can build + // the minimal interval set induced by the filters + using intT = boost::icl::interval_set; + using intInterval = intT::interval_type; + + std::map contigIntervals; + int32_t numFilters = 0; + + for (const auto& xmlFilter : Filters()) { + ++numFilters; + boost::optional contigName; + + intT intersectedInterval{intInterval{0, std::numeric_limits::max()}}; + + for (const auto& xmlProperty : xmlFilter.Properties()) { + const std::string XmlName = xmlProperty.Name(); + const std::string XmlOperator = xmlProperty.Operator(); + const std::string XmlValue = xmlProperty.Value(); + + if ("rname" == XmlName) { + if ("=" == XmlOperator) { + contigName = XmlValue; + + const auto it = contigLengths.find(XmlValue); + if (it == contigLengths.cend()) + throw std::runtime_error{"DataSet: Could not find contig '" + XmlValue + + "' in BAM files"}; + else + intersectedInterval &= intInterval(0, it->second); + } else + throw std::runtime_error{ + "DatSet: '" + XmlOperator + + "' is an unrecognized property operator, only '=' is recognized"}; + } else if ("tstart" == XmlName) { + if ((XmlOperator != "<") && (XmlOperator != "<=")) + throw std::runtime_error{ + "DataSet: tstart only supports '<' and '<=' operators"}; + + const int32_t end = boost::lexical_cast(XmlValue) + ("<=" == XmlOperator); + intersectedInterval &= intInterval(0, end); + } else if ("tend" == XmlName) { + if ((XmlOperator != ">") && (XmlOperator != ">=")) + throw std::runtime_error{"DataSet: tend only supports '>' and '>=' operators"}; + + const int32_t start = + boost::lexical_cast(XmlValue) - (">=" == XmlOperator); + intersectedInterval &= intInterval(start, std::numeric_limits::max()); + } else + throw std::runtime_error{"DataSet: '" + XmlName + + "' is an unrecognized filter property name"}; + } + + if (contigName) + contigIntervals[contigName.value()] |= intersectedInterval; + else + throw std::runtime_error{ + "DataSet: current filter does not have a valid 'rname' attribute"}; + } + + // extract all GenomicIntervals + std::vector result; + if (numFilters) { + // have some filters, only return regions passing filters + for (const auto& contigs : contigIntervals) { + const std::string& contigName = contigs.first; + for (const auto& i : contigs.second) { + // don't append empty intervals to the result + if (boost::icl::length(i)) result.emplace_back(contigName, i.lower(), i.upper()); + } + } + } else { + // no filters, return complete list of intervals + for (const auto& contigs : contigLengths) + result.emplace_back(contigs.first, 0, contigs.second); + } + + return result; +} + +const PacBio::BAM::DataSetMetadata& DataSet::Metadata() const { return d_->Metadata(); } + +PacBio::BAM::DataSetMetadata& DataSet::Metadata() { return d_->Metadata(); } + +DataSet& DataSet::Metadata(const PacBio::BAM::DataSetMetadata& metadata) +{ + d_->Metadata(metadata); + return *this; +} + +const std::string& DataSet::MetaType() const { return d_->MetaType(); } + +std::string& DataSet::MetaType() { return d_->MetaType(); } + +DataSet& DataSet::MetaType(const std::string& metatype) +{ + d_->MetaType(metatype); + return *this; +} + +const std::string& DataSet::ModifiedAt() const { return d_->ModifiedAt(); } + +std::string& DataSet::ModifiedAt() { return d_->ModifiedAt(); } + +DataSet& DataSet::ModifiedAt(const std::string& modifiedAt) +{ + d_->ModifiedAt(modifiedAt); + return *this; +} + +const std::string& DataSet::Name() const { return d_->Name(); } + +std::string& DataSet::Name() { return d_->Name(); } + +DataSet& DataSet::Name(const std::string& name) +{ + d_->Name(name); + return *this; +} + +const NamespaceRegistry& DataSet::Namespaces() const { return d_->Namespaces(); } + +NamespaceRegistry& DataSet::Namespaces() { return d_->Namespaces(); } + +DataSet::TypeEnum DataSet::NameToType(const std::string& typeName) +{ + static std::unordered_map 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; + lookup["TranscriptSet"] = DataSet::TRANSCRIPT; + lookup["TranscriptAlignmentSet"] = DataSet::TRANSCRIPT_ALIGNMENT; + } + return lookup.at(typeName); // throws if unknown typename +} + +std::vector DataSet::ResolvedResourceIds() const +{ + const PacBio::BAM::ExternalResources& resources = ExternalResources(); + + std::vector result; + result.reserve(resources.Size()); + for (const ExternalResource& ext : resources) { + result.push_back(ResolvePath(ext.ResourceId())); + } + return result; +} + +std::string DataSet::ResolvePath(const std::string& originalPath) const +{ + return FileUtils::ResolvedFilePath(originalPath, path_); +} + +const std::string& DataSet::ResourceId() const { return d_->ResourceId(); } + +std::string& DataSet::ResourceId() { return d_->ResourceId(); } + +DataSet& DataSet::ResourceId(const std::string& resourceId) +{ + d_->ResourceId(resourceId); + return *this; +} + +void DataSet::Save(const std::string& outputFilename) const +{ + DataSetIO::ToFile(d_, outputFilename); +} + +void DataSet::SaveToStream(std::ostream& out) const { DataSetIO::ToStream(d_, out); } + +std::set DataSet::SequencingChemistries() const +{ + const std::vector bamFiles{BamFiles()}; + + std::set result; + for (const BamFile& bf : bamFiles) { + if (!bf.IsPacBioBAM()) + throw std::runtime_error{ + "DataSet: only PacBio BAMs are supported for fetching chemistry info"}; + const std::vector readGroups{bf.Header().ReadGroups()}; + for (const ReadGroupInfo& rg : readGroups) + result.insert(rg.SequencingChemistry()); + } + return result; +} + +const PacBio::BAM::SubDataSets& DataSet::SubDataSets() const { return d_->SubDataSets(); } + +PacBio::BAM::SubDataSets& DataSet::SubDataSets() { return d_->SubDataSets(); } + +DataSet& DataSet::SubDataSets(const PacBio::BAM::SubDataSets& subdatasets) +{ + d_->SubDataSets(subdatasets); + return *this; +} + +const std::string& DataSet::Tags() const { return d_->Tags(); } + +std::string& DataSet::Tags() { return d_->Tags(); } + +DataSet& DataSet::Tags(const std::string& tags) +{ + d_->Tags(tags); + return *this; +} + +const std::string& DataSet::TimeStampedName() const { return d_->TimeStampedName(); } + +std::string& DataSet::TimeStampedName() { return d_->TimeStampedName(); } + +DataSet& DataSet::TimeStampedName(const std::string& timeStampedName) +{ + d_->TimeStampedName(timeStampedName); + return *this; +} + +PacBio::BAM::DataSet::TypeEnum DataSet::Type() const { return DataSet::NameToType(TypeName()); } + +DataSet& DataSet::Type(const DataSet::TypeEnum type) +{ + d_->Label(DataSet::TypeToName(type)); + return *this; +} + +std::string DataSet::TypeName() const { return d_->LocalNameLabel().to_string(); } + +std::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"; + case DataSet::TRANSCRIPT: + return "TranscriptSet"; + case DataSet::TRANSCRIPT_ALIGNMENT: + return "TranscriptAlignmentSet"; + default: + throw std::runtime_error{"DataSet: unsupported dataset type"}; + } +} + +const std::string& DataSet::UniqueId() const { return d_->UniqueId(); } + +std::string& DataSet::UniqueId() { return d_->UniqueId(); } + +DataSet& DataSet::UniqueId(const std::string& uuid) +{ + d_->UniqueId(uuid); + return *this; +} + +const std::string& DataSet::Version() const { return d_->Version(); } + +std::string& DataSet::Version() { return d_->Version(); } + +DataSet& DataSet::Version(const std::string& version) +{ + d_->Version(version); + return *this; +} + +// Exposed timestamp utils + +std::string CurrentTimestamp() { return TimeUtils::ToDataSetFormat(TimeUtils::CurrentTime()); } + +std::string ToDataSetFormat(const std::chrono::system_clock::time_point& tp) +{ + return TimeUtils::ToDataSetFormat(tp); +} + +std::string ToDataSetFormat(const time_t& t) +{ + return TimeUtils::ToDataSetFormat(std::chrono::system_clock::from_time_t(t)); +} + +std::string ToIso8601(const std::chrono::system_clock::time_point& tp) +{ + return TimeUtils::ToIso8601(tp); +} + +std::string ToIso8601(const time_t& t) +{ + return TimeUtils::ToIso8601(std::chrono::system_clock::from_time_t(t)); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/DataSetBaseTypes.cpp b/src/DataSetBaseTypes.cpp new file mode 100644 index 0000000..63a820b --- /dev/null +++ b/src/DataSetBaseTypes.cpp @@ -0,0 +1,322 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/internal/DataSetBaseTypes.h" + +#include + +#include + +#include "DataSetUtils.h" +#include "TimeUtils.h" +#include "pbbam/DataSetTypes.h" +#include "pbbam/Unused.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +// ---------------- +// BaseEntityType +// ---------------- + +BaseEntityType::BaseEntityType(const std::string& label, const XsdType& xsd) + : DataSetElement(label, xsd) +{ + if (CreatedAt().empty()) CreatedAt(TimeUtils::ToIso8601(TimeUtils::CurrentTime())); + if (Version().empty()) Version(XML_VERSION); +} + +BaseEntityType::BaseEntityType(const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd) + : DataSetElement(label, fromInputXml, xsd) +{ +} + +const std::string& BaseEntityType::CreatedAt() const { return Attribute("CreatedAt"); } + +std::string& BaseEntityType::CreatedAt() { return Attribute("CreatedAt"); } + +BaseEntityType& BaseEntityType::CreatedAt(const std::string& createdAt) +{ + Attribute("CreatedAt", createdAt); + return *this; +} + +const std::string& BaseEntityType::Description() const { return Attribute("Description"); } + +std::string& BaseEntityType::Description() { return Attribute("Description"); } + +BaseEntityType& BaseEntityType::Description(const std::string& description) +{ + Attribute("Description", description); + return *this; +} + +DEFINE_ACCESSORS(BaseEntityType, Extensions, Extensions) + +BaseEntityType& BaseEntityType::Extensions(const PacBio::BAM::Extensions& extensions) +{ + Extensions() = extensions; + return *this; +} + +const std::string& BaseEntityType::Format() const { return Attribute("Format"); } + +std::string& BaseEntityType::Format() { return Attribute("Format"); } + +BaseEntityType& BaseEntityType::Format(const std::string& format) +{ + Attribute("Format", format); + return *this; +} + +const std::string& BaseEntityType::ModifiedAt() const { return Attribute("ModifiedAt"); } + +std::string& BaseEntityType::ModifiedAt() { return Attribute("ModifiedAt"); } + +BaseEntityType& BaseEntityType::ModifiedAt(const std::string& modifiedAt) +{ + Attribute("ModifiedAt", modifiedAt); + return *this; +} + +const std::string& BaseEntityType::Name() const { return Attribute("Name"); } + +std::string& BaseEntityType::Name() { return Attribute("Name"); } + +BaseEntityType& BaseEntityType::Name(const std::string& name) +{ + Attribute("Name", name); + return *this; +} + +const std::string& BaseEntityType::ResourceId() const { return Attribute("ResourceId"); } + +std::string& BaseEntityType::ResourceId() { return Attribute("ResourceId"); } + +BaseEntityType& BaseEntityType::ResourceId(const std::string& resourceId) +{ + Attribute("ResourceId", resourceId); + return *this; +} + +const std::string& BaseEntityType::Tags() const { return Attribute("Tags"); } + +std::string& BaseEntityType::Tags() { return Attribute("Tags"); } + +BaseEntityType& BaseEntityType::Tags(const std::string& tags) +{ + Attribute("Tags", tags); + return *this; +} + +const std::string& BaseEntityType::Version() const { return Attribute("Version"); } + +std::string& BaseEntityType::Version() { return Attribute("Version"); } + +BaseEntityType& BaseEntityType::Version(const std::string& version) +{ + Attribute("Version", version); + return *this; +} + +// ---------------- +// DataEntityType +// ---------------- + +DataEntityType::DataEntityType(const std::string& label, const XsdType& xsd) + : BaseEntityType(label, xsd) +{ +} + +DataEntityType::DataEntityType(const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd) + : BaseEntityType(label, fromInputXml, xsd) +{ +} + +const std::string& DataEntityType::Checksum() const { return ChildText("Checksum"); } + +std::string& DataEntityType::Checksum() { return ChildText("Checksum"); } + +DataEntityType& DataEntityType::Checksum(const std::string& checksum) +{ + ChildText("Checksum", checksum); + return *this; +} + +const std::string& DataEntityType::EncodedValue() const { return ChildText("EncodedValue"); } + +std::string& DataEntityType::EncodedValue() { return ChildText("EncodedValue"); } + +DataEntityType& DataEntityType::EncodedValue(const std::string& encodedValue) +{ + ChildText("EncodedValue", encodedValue); + return *this; +} + +const std::string& DataEntityType::MetaType() const { return Attribute("MetaType"); } + +std::string& DataEntityType::MetaType() { return Attribute("MetaType"); } + +DataEntityType& DataEntityType::MetaType(const std::string& metatype) +{ + Attribute("MetaType", metatype); + return *this; +} + +const std::string& DataEntityType::SimpleValue() const { return Attribute("SimpleValue"); } + +std::string& DataEntityType::SimpleValue() { return Attribute("SimpleValue"); } + +DataEntityType& DataEntityType::SimpleValue(const std::string& simpleValue) +{ + Attribute("SimpleValue", simpleValue); + return *this; +} + +const std::string& DataEntityType::TimeStampedName() const { return Attribute("TimeStampedName"); } + +std::string& DataEntityType::TimeStampedName() { return Attribute("TimeStampedName"); } + +DataEntityType& DataEntityType::TimeStampedName(const std::string& timeStampedName) +{ + Attribute("TimeStampedName", timeStampedName); + return *this; +} + +const std::string& DataEntityType::UniqueId() const { return Attribute("UniqueId"); } + +std::string& DataEntityType::UniqueId() { return Attribute("UniqueId"); } + +DataEntityType& DataEntityType::UniqueId(const std::string& uuid) +{ + Attribute("UniqueId", uuid); + return *this; +} + +const std::string& DataEntityType::ValueDataType() const { return Attribute("ValueDataType"); } + +std::string& DataEntityType::ValueDataType() { return Attribute("ValueDataType"); } + +DataEntityType& DataEntityType::ValueDataType(const std::string& valueDataType) +{ + Attribute("ValueDataType", valueDataType); + return *this; +} + +// ----------------- +// IndexedDataType +// ----------------- + +IndexedDataType::IndexedDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const XsdType& xsd) + : InputOutputDataType(metatype, filename, label, xsd) +{ +} + +IndexedDataType::IndexedDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd) + : InputOutputDataType(metatype, filename, label, fromInputXml, xsd) +{ +} + +DEFINE_ACCESSORS(IndexedDataType, FileIndices, FileIndices) + +IndexedDataType& IndexedDataType::FileIndices(const PacBio::BAM::FileIndices& indices) +{ + FileIndices() = indices; + return *this; +} + +// --------------------- +// InputOutputDataType +// --------------------- + +InputOutputDataType::InputOutputDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const XsdType& xsd) + : StrictEntityType(metatype, label, xsd) +{ + ResourceId(filename); +} + +InputOutputDataType::InputOutputDataType(const std::string& metatype, const std::string& filename, + const std::string& label, const FromInputXml& fromInputXml, + const XsdType& xsd) + : StrictEntityType(metatype, label, fromInputXml, xsd) +{ + ResourceId(filename); +} + +// ---------------- +// StrictEntityType +// ---------------- + +StrictEntityType::StrictEntityType(const std::string& metatype, const std::string& label, + const XsdType& xsd) + : BaseEntityType(label, xsd) +{ + // MetaType + MetaType(metatype); + + // TimeStampedName + const size_t numChars = metatype.size(); + std::string transformedMetatype; + transformedMetatype.resize(numChars); + for (size_t i = 0; i < numChars; ++i) { + const char c = metatype.at(i); + transformedMetatype[i] = ((c == '.') ? '_' : tolower(c)); + } + const std::string tsn = + transformedMetatype + "-" + TimeUtils::ToDataSetFormat(TimeUtils::CurrentTime()); + TimeStampedName(tsn); + + // UniqueId + UniqueId(GenerateUuid()); +} + +StrictEntityType::StrictEntityType(const std::string& /*metatype*/, const std::string& label, + const FromInputXml& fromInputXml, const XsdType& xsd) + : BaseEntityType(label, fromInputXml, xsd) +{ +} + +const std::string& StrictEntityType::MetaType() const { return Attribute("MetaType"); } + +std::string& StrictEntityType::MetaType() { return Attribute("MetaType"); } + +StrictEntityType& StrictEntityType::MetaType(const std::string& metatype) +{ + Attribute("MetaType", metatype); + return *this; +} + +const std::string& StrictEntityType::TimeStampedName() const +{ + return Attribute("TimeStampedName"); +} + +std::string& StrictEntityType::TimeStampedName() { return Attribute("TimeStampedName"); } + +StrictEntityType& StrictEntityType::TimeStampedName(const std::string& timeStampedName) +{ + Attribute("TimeStampedName", timeStampedName); + return *this; +} + +const std::string& StrictEntityType::UniqueId() const { return Attribute("UniqueId"); } + +std::string& StrictEntityType::UniqueId() { return Attribute("UniqueId"); } + +StrictEntityType& StrictEntityType::UniqueId(const std::string& uuid) +{ + Attribute("UniqueId", uuid); + return *this; +} + +} // namespace internal +} // namespace BAM +} // namespace PacBio diff --git a/src/DataSetElement.cpp b/src/DataSetElement.cpp new file mode 100644 index 0000000..fa8ee67 --- /dev/null +++ b/src/DataSetElement.cpp @@ -0,0 +1,20 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/internal/DataSetElement.h" + +#include "DataSetUtils.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +const std::string& DataSetElement::SharedNullString() +{ + return internal::NullObject(); +} + +} // namespace internal +} // namespace BAM +} // namespace PacBio diff --git a/src/DataSetIO.cpp b/src/DataSetIO.cpp new file mode 100644 index 0000000..78989d0 --- /dev/null +++ b/src/DataSetIO.cpp @@ -0,0 +1,157 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "DataSetIO.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "FileUtils.h" +#include "FofnReader.h" +#include "XmlReader.h" +#include "XmlWriter.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +std::unique_ptr DataSetFromXml(const std::string& xmlFn) +{ + std::ifstream in(xmlFn); + if (!in) throw std::runtime_error{"DataSet: could not open XML file for reading: " + xmlFn}; + return XmlReader::FromStream(in); +} + +std::unique_ptr DataSetFromBam(const std::string& bamFn) +{ + // peek at sort order to determine if file should be an AlignmentSet or else SubreadSet + const auto bamFile = BamFile{bamFn}; + const auto& header = bamFile.Header(); + const auto aligned = header.SortOrder() == "coordinate"; + + std::unique_ptr dataset; + if (aligned) + dataset = std::make_unique(); + else + dataset = std::make_unique(); + + auto& resources = dataset->ExternalResources(); + resources.Add(ExternalResource(BamFile(bamFn))); + return dataset; +} + +std::unique_ptr DataSetFromFasta(const std::string& fasta) +{ + // make FASTA data set + auto dataset = std::make_unique(); + auto& resources = dataset->ExternalResources(); + resources.Add(ExternalResource("PacBio.ReferenceFile.ReferenceFastaFile", fasta)); + return std::move(dataset); +} + +std::unique_ptr DataSetFromFofn(const std::string& fofn) +{ + const auto fofnDir = FileUtils::DirectoryName(fofn); + std::ifstream in(fofn); + if (!in) throw std::runtime_error{"DataSet: could not open FOFN for reading: " + fofn}; + + auto filenames = FofnReader::Files(in); + std::transform( + filenames.begin(), filenames.end(), filenames.begin(), + [&fofnDir](const std::string fn) { return FileUtils::ResolvedFilePath(fn, fofnDir); }); + return DataSetIO::FromUris(filenames); +} + +std::unique_ptr DataSetFromUri(const std::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 DataSetFromXml(uri); + else if (boost::algorithm::iends_with(uri, ".bam")) + return DataSetFromBam(uri); + else if (boost::algorithm::iends_with(uri, ".fofn")) + return DataSetFromFofn(uri); + else if (boost::algorithm::iends_with(uri, ".fasta") || + boost::algorithm::iends_with(uri, ".fa")) { + return DataSetFromFasta(uri); + } + + // unknown filename extension + throw std::runtime_error{"DataSet: unsupported extension on input file: " + uri}; +} + +} // anonymous + +std::unique_ptr DataSetIO::FromUri(const std::string& uri) +{ + return FromUris(std::vector(1, uri)); +} + +std::unique_ptr DataSetIO::FromUris(const std::vector& uris) +{ + if (uris.empty()) throw std::runtime_error{"DataSet: empty input URI list"}; + + // create dataset(s) from URI(s) + std::vector > datasets; + datasets.reserve(uris.size()); + for (const auto& uri : uris) + datasets.emplace_back(DataSetFromUri(uri)); + assert(!datasets.empty()); + + // if only 1, just return + if (datasets.size() == 1) return std::unique_ptr(datasets.front().release()); + + // else merge + else { + auto& result = datasets.at(0); + for (size_t i = 1; i < datasets.size(); ++i) { + const auto& next = datasets.at(i); + *result += *next; + } + return std::move(result); + } +} + +std::unique_ptr DataSetIO::FromXmlString(const std::string& xml) +{ + if (xml.empty()) throw std::runtime_error{"DataSet: cannot load from empty XML string"}; + std::istringstream s{xml}; + return XmlReader::FromStream(s); +} + +void DataSetIO::ToFile(const std::unique_ptr& dataset, const std::string& fn) +{ + DataSetIO::ToFile(*dataset, fn); +} + +void DataSetIO::ToStream(const std::unique_ptr& dataset, std::ostream& out) +{ + DataSetIO::ToStream(*dataset, out); +} + +void DataSetIO::ToFile(const DataSetBase& dataset, const std::string& fn) +{ + std::ofstream out(fn); + if (!out) throw std::runtime_error{"DataSet: could not open XML file for writing: " + fn}; + XmlWriter::ToStream(dataset, out); +} + +void DataSetIO::ToStream(const DataSetBase& dataset, std::ostream& out) +{ + XmlWriter::ToStream(dataset, out); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/DataSetIO.h b/src/DataSetIO.h new file mode 100644 index 0000000..2033e93 --- /dev/null +++ b/src/DataSetIO.h @@ -0,0 +1,33 @@ +// Author: Derek Barnett + +#ifndef DATASETIO_H +#define DATASETIO_H + +#include +#include +#include +#include +#include "pbbam/DataSet.h" + +namespace PacBio { +namespace BAM { + +class DataSetIO +{ +public: + // input + static std::unique_ptr FromUri(const std::string& uri); + static std::unique_ptr FromUris(const std::vector& uris); + static std::unique_ptr FromXmlString(const std::string& xml); + + // output + static void ToFile(const DataSetBase& dataset, const std::string& fn); + static void ToFile(const std::unique_ptr& dataset, const std::string& fn); + static void ToStream(const DataSetBase& dataset, std::ostream& out); + static void ToStream(const std::unique_ptr& dataset, std::ostream& out); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // DATASETIO_H diff --git a/src/DataSetTypes.cpp b/src/DataSetTypes.cpp new file mode 100644 index 0000000..4451efc --- /dev/null +++ b/src/DataSetTypes.cpp @@ -0,0 +1,975 @@ +// File Description +/// \file DataSetTypes.cpp +/// \brief Implementations for the public DataSet component classes. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/DataSetTypes.h" + +#include +#include +#include + +#include "pbbam/Unused.h" +#include "pbbam/internal/DataSetBaseTypes.h" + +#include "DataSetIO.h" +#include "DataSetUtils.h" +#include "FileUtils.h" +#include "TimeUtils.h" + +namespace { + +// clang-format off +using ElementType = PacBio::BAM::XmlElementType; +const std::unordered_map elementTypeLookup +{ + {"DataSetMetadata", ElementType::DATASET_METADATA}, + {"ExtensionElement", ElementType::EXTENSION}, + {"Extensions", ElementType::EXTENSIONS}, + {"ExternalResource", ElementType::EXTERNAL_RESOURCE}, + {"ExternalResources", ElementType::EXTERNAL_RESOURCES}, + {"FileIndex", ElementType::FILE_INDEX}, + {"FileIndices", ElementType::FILE_INDICES}, + {"Filter", ElementType::FILTER}, + {"Filters", ElementType::FILTERS}, + {"ParentTool", ElementType::PARENT_TOOL}, + {"Property", ElementType::PROPERTY}, + {"Properties", ElementType::PROPERTIES}, + {"Provenance", ElementType::PROVENANCE}, + {"AlignmentSet", ElementType::ALIGNMENT_SET}, + {"BarcodeSet", ElementType::BARCODE_SET}, + {"ConsensusAlignmentSet", ElementType::CONSENSUS_ALIGNMENT_SET}, + {"ConsensusReadSet", ElementType::CONSENSUS_READ_SET}, + {"ContigSet", ElementType::CONTIG_SET}, + {"HdfSubreadSet", ElementType::HDF_SUBREAD_SET}, + {"ReferenceSet", ElementType::REFERENCE_SET}, + {"SubreadSet", ElementType::SUBREAD_SET}, + {"TranscriptSet", ElementType::TRANSCRIPT_SET}, + {"TranscriptAlignmentSet", ElementType::TRANSCRIPT_ALIGNMENT_SET}, + {"DataSets", ElementType::SUBDATASETS}, + {"DataSet", ElementType::GENERIC_DATASET} +}; +// clang-format on + +} // anonymous + +namespace PacBio { +namespace BAM { + +// ------------------- +// AlignmentSet +// ------------------- + +AlignmentSet::AlignmentSet() + : DataSetBase("PacBio.DataSet.AlignmentSet", "AlignmentSet", XsdType::DATASETS) +{ +} + +AlignmentSet::AlignmentSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "AlignmentSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// BarcodeSet +// ------------------- + +BarcodeSet::BarcodeSet() : DataSetBase("PacBio.DataSet.BarcodeSet", "BarcodeSet", XsdType::DATASETS) +{ +} + +BarcodeSet::BarcodeSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "BarcodeSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ----------------------- +// ConsensusAlignmentSet +// ----------------------- + +ConsensusAlignmentSet::ConsensusAlignmentSet() + : DataSetBase("PacBio.DataSet.ConsensusAlignmentSet", "ConsensusAlignmentSet", + XsdType::DATASETS) +{ +} + +ConsensusAlignmentSet::ConsensusAlignmentSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "ConsensusAlignmentSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// ConsensusReadSet +// ------------------- + +ConsensusReadSet::ConsensusReadSet() + : DataSetBase("PacBio.DataSet.ConsensusReadSet", "ConsensusReadSet", XsdType::DATASETS) +{ +} + +ConsensusReadSet::ConsensusReadSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "ConsensusReadSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// ContigSet +// ------------------- + +ContigSet::ContigSet() : DataSetBase("PacBio.DataSet.ContigSet", "ContigSet", XsdType::DATASETS) {} + +ContigSet::ContigSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "ContigSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// DataSetBase +// ------------------- + +DataSetBase::DataSetBase() + : StrictEntityType("PacBio.DataSet.DataSet", "DataSet", XsdType::DATASETS) +{ +} + +DataSetBase::DataSetBase(const internal::FromInputXml& fromInputXml) + : StrictEntityType("", "DataSet", fromInputXml, XsdType::DATASETS) +{ +} + +DataSetBase::DataSetBase(const std::string& metatype, const std::string& label, const XsdType& xsd) + : StrictEntityType(metatype, label, xsd) +{ +} + +DataSetBase::DataSetBase(const std::string& metatype, const std::string& label, + const internal::FromInputXml& fromInputXml, const XsdType& xsd) + : StrictEntityType(metatype, label, fromInputXml, xsd) +{ +} + +const PacBio::BAM::ExternalResources& DataSetBase::ExternalResources() const +{ + return Child("ExternalResources"); +} + +PacBio::BAM::ExternalResources& DataSetBase::ExternalResources() +{ + if (!HasChild("ExternalResources")) AddChild(PacBio::BAM::ExternalResources()); + auto& c = Child("ExternalResources"); + return c; +} + +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 NamespaceRegistry& DataSetBase::Namespaces() const { return registry_; } + +NamespaceRegistry& DataSetBase::Namespaces() { return registry_; } + +const PacBio::BAM::SubDataSets& DataSetBase::SubDataSets() const +{ + try { + return Child("DataSets"); + } catch (std::exception&) { + return internal::NullObject(); + } +} + +PacBio::BAM::SubDataSets& DataSetBase::SubDataSets() +{ + if (!HasChild("DataSets")) AddChild(internal::NullObject()); + return Child("DataSets"); +} + +DataSetBase& DataSetBase::SubDataSets(const PacBio::BAM::SubDataSets& subdatasets) +{ + SubDataSets() = subdatasets; + return *this; +} + +DataSetBase* DataSetBase::DeepCopy() const +{ + auto* copyDataset = new DataSetElement(*this); + auto* result = static_cast(copyDataset); + result->registry_ = registry_; + return result; +} + +DataSetBase& DataSetBase::operator+=(const DataSetBase& other) +{ + // must be same dataset types (or 'other' must be generic) + if (other.LocalNameLabel() != LocalNameLabel() && other.LocalNameLabel() != "DataSet") + throw std::runtime_error{"DataSet: cannot merge different dataset types"}; + + // check object metadata + Metadata() += other.Metadata(); + ExternalResources() += other.ExternalResources(); + Filters() += other.Filters(); + SubDataSets() += other; + + return *this; +} + +std::shared_ptr DataSetBase::Create(const std::string& typeName) +{ + if (typeName == std::string("DataSet")) return std::make_shared(); + if (typeName == std::string("SubreadSet")) return std::make_shared(); + if (typeName == std::string("AlignmentSet")) return std::make_shared(); + if (typeName == std::string("BarcodeSet")) return std::make_shared(); + if (typeName == std::string("ConsensusAlignmentSet")) + return std::make_shared(); + if (typeName == std::string("ConsensusReadSet")) return std::make_shared(); + if (typeName == std::string("ContigSet")) return std::make_shared(); + if (typeName == std::string("HdfSubreadSet")) return std::make_shared(); + if (typeName == std::string("ReferenceSet")) return std::make_shared(); + if (typeName == std::string("TranscriptSet")) return std::make_shared(); + if (typeName == std::string("TranscriptAlignmentSet")) + return std::make_shared(); + + // unknown typename + throw std::runtime_error{"DataSet: unsupported type: " + typeName}; +} + +std::shared_ptr DataSetBase::Create(const std::string& typeName, + const internal::FromInputXml& fromInputXml) +{ + if (typeName == std::string("DataSet")) return std::make_shared(fromInputXml); + if (typeName == std::string("SubreadSet")) return std::make_shared(fromInputXml); + if (typeName == std::string("AlignmentSet")) + return std::make_shared(fromInputXml); + if (typeName == std::string("BarcodeSet")) return std::make_shared(fromInputXml); + if (typeName == std::string("ConsensusAlignmentSet")) + return std::make_shared(fromInputXml); + if (typeName == std::string("ConsensusReadSet")) + return std::make_shared(fromInputXml); + if (typeName == std::string("ContigSet")) return std::make_shared(fromInputXml); + if (typeName == std::string("HdfSubreadSet")) + return std::make_shared(fromInputXml); + if (typeName == std::string("ReferenceSet")) + return std::make_shared(fromInputXml); + if (typeName == std::string("TranscriptSet")) + return std::make_shared(fromInputXml); + if (typeName == std::string("TranscriptAlignmentSet")) + return std::make_shared(fromInputXml); + + // unknown typename + throw std::runtime_error{"DataSet: unsupported type: " + typeName}; +} + +void DataSetBase::Save(const std::string& outputFilename) +{ + DataSetIO::ToFile(*this, outputFilename); +} + +void DataSetBase::SaveToStream(std::ostream& out) { DataSetIO::ToStream(*this, out); } + +// ------------------- +// DataSetMetadata +// ------------------- + +DataSetMetadata::DataSetMetadata() : DataSetElement("DataSetMetadata", XsdType::DATASETS) {} + +DataSetMetadata::DataSetMetadata(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::DATASETS) +{ +} + +DataSetMetadata::DataSetMetadata(const std::string& numRecords, const std::string& totalLength) + : DataSetElement("DataSetMetadata", XsdType::DATASETS) +{ + TotalLength(totalLength); + NumRecords(numRecords); +} + +DataSetMetadata::DataSetMetadata(const std::string& numRecords, const std::string& totalLength, + const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::DATASETS) +{ + TotalLength(totalLength); + NumRecords(numRecords); +} + +DEFINE_ACCESSORS(DataSetMetadata, Provenance, Provenance) + +DataSetMetadata& DataSetMetadata::Provenance(const PacBio::BAM::Provenance& provenance) +{ + Provenance() = provenance; + return *this; +} + +DataSetMetadata& DataSetMetadata::operator+=(const DataSetMetadata& other) +{ + TotalLength() = TotalLength() + other.TotalLength(); + NumRecords() = NumRecords() + other.NumRecords(); + // merge add'l + return *this; +} + +const std::string& DataSetMetadata::NumRecords() const { return ChildText("NumRecords"); } + +std::string& DataSetMetadata::NumRecords() { return ChildText("NumRecords"); } + +DataSetMetadata& DataSetMetadata::NumRecords(const std::string& numRecords) +{ + ChildText("NumRecords", numRecords); + return *this; +} + +const std::string& DataSetMetadata::TotalLength() const { return ChildText("TotalLength"); } + +std::string& DataSetMetadata::TotalLength() { return ChildText("TotalLength"); } + +DataSetMetadata& DataSetMetadata::TotalLength(const std::string& totalLength) +{ + ChildText("TotalLength", totalLength); + return *this; +} + +// ------------------- +// ExtensionElement +// ------------------- + +ExtensionElement::ExtensionElement() : DataSetElement("ExtensionElement", XsdType::BASE_DATA_MODEL) +{ +} + +ExtensionElement::ExtensionElement(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::BASE_DATA_MODEL) +{ +} + +// ------------------- +// Extensions +// ------------------- + +Extensions::Extensions() : DataSetElement("Extensions", XsdType::BASE_DATA_MODEL) {} + +Extensions::Extensions(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::BASE_DATA_MODEL) +{ +} + +Extensions::iterator_type Extensions::begin() { return Extensions::iterator_type(this, 0); } + +Extensions::const_iterator_type Extensions::begin() const { return cbegin(); } + +Extensions::const_iterator_type Extensions::cbegin() const +{ + return Extensions::const_iterator_type(this, 0); +} + +Extensions::iterator_type Extensions::end() +{ + return Extensions::iterator_type(this, NumChildren()); +} + +Extensions::const_iterator_type Extensions::end() const { return cend(); } + +Extensions::const_iterator_type Extensions::cend() const +{ + return Extensions::const_iterator_type(this, NumChildren()); +} + +const Extensions::value_type& Extensions::operator[](size_t index) const +{ + return dynamic_cast(*(children_.at(index).get())); +} + +Extensions::value_type& Extensions::operator[](size_t index) +{ + return dynamic_cast(*(children_.at(index).get())); +} + +// ------------------- +// ExternalResource +// ------------------- + +ExternalResource::ExternalResource(const BamFile& bamFile) + : IndexedDataType("PacBio.SubreadFile.SubreadBamFile", bamFile.Filename(), "ExternalResource", + XsdType::BASE_DATA_MODEL) +{ +} + +ExternalResource::ExternalResource(const std::string& metatype, const std::string& filename) + : IndexedDataType(metatype, filename, "ExternalResource", XsdType::BASE_DATA_MODEL) +{ +} + +ExternalResource::ExternalResource(const std::string& metatype, const std::string& filename, + const internal::FromInputXml& fromInputXml) + : IndexedDataType("", filename, "ExternalResource", fromInputXml, XsdType::BASE_DATA_MODEL) +{ + UNUSED(metatype); +} + +DEFINE_ACCESSORS(ExternalResource, ExternalResources, ExternalResources) + +ExternalResource& ExternalResource::ExternalResources( + const PacBio::BAM::ExternalResources& resources) +{ + ExternalResources() = resources; + return *this; +} + +BamFile ExternalResource::ToBamFile() const { return BamFile(ResourceId()); } + +// ------------------- +// ExternalResources +// ------------------- + +ExternalResources::ExternalResources() + : DataSetElement("ExternalResources", XsdType::BASE_DATA_MODEL) +{ +} + +ExternalResources::ExternalResources(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::BASE_DATA_MODEL) +{ +} + +ExternalResources& ExternalResources::operator+=(const ExternalResources& other) +{ + // only keep unique resource ids + std::set myResourceIds; + for (size_t i = 0; i < NumChildren(); ++i) { + const ExternalResource& resource = this->operator[](i); + myResourceIds.insert(resource.ResourceId()); + } + + std::vector newResourceIndices; + const size_t numOtherResourceIds = other.Size(); + for (size_t i = 0; i < numOtherResourceIds; ++i) { + const std::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) +{ + // disallow external resources w/ duplicate ResourceIds + std::set myResourceIds; + for (size_t i = 0; i < NumChildren(); ++i) { + const ExternalResource& resource = this->operator[](i); + myResourceIds.insert(resource.ResourceId()); + } + + if (myResourceIds.find(ext.ResourceId()) == myResourceIds.cend()) AddChild(ext); +} + +std::vector ExternalResources::BamFiles() const +{ + + std::vector 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); } + +ExternalResources::iterator_type ExternalResources::begin() +{ + return ExternalResources::iterator_type(this, 0); +} + +ExternalResources::const_iterator_type ExternalResources::begin() const { return cbegin(); } + +ExternalResources::const_iterator_type ExternalResources::cbegin() const +{ + return ExternalResources::const_iterator_type(this, 0); +} + +ExternalResources::iterator_type ExternalResources::end() +{ + return ExternalResources::iterator_type(this, NumChildren()); +} + +ExternalResources::const_iterator_type ExternalResources::end() const { return cend(); } + +ExternalResources::const_iterator_type ExternalResources::cend() const +{ + return ExternalResources::const_iterator_type(this, NumChildren()); +} + +const ExternalResources::value_type& ExternalResources::operator[](size_t index) const +{ + return dynamic_cast(*(children_.at(index).get())); +} + +ExternalResources::value_type& ExternalResources::operator[](size_t index) +{ + return dynamic_cast(*(children_.at(index).get())); +} + +// ------------------- +// FileIndex +// ------------------- + +FileIndex::FileIndex(const std::string& metatype, const std::string& filename) + : InputOutputDataType(metatype, filename, "FileIndex", XsdType::BASE_DATA_MODEL) +{ +} + +FileIndex::FileIndex(const std::string& metatype, const std::string& filename, + const internal::FromInputXml& fromInputXml) + : InputOutputDataType("", filename, "FileIndex", fromInputXml, XsdType::BASE_DATA_MODEL) +{ + UNUSED(metatype); +} + +// ------------------- +// FileIndices +// ------------------- + +FileIndices::FileIndices() : DataSetElement("FileIndices", XsdType::BASE_DATA_MODEL) {} + +FileIndices::FileIndices(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::BASE_DATA_MODEL) +{ +} + +void FileIndices::Add(const FileIndex& index) { AddChild(index); } + +void FileIndices::Remove(const FileIndex& index) { RemoveChild(index); } + +FileIndices::iterator_type FileIndices::begin() { return FileIndices::iterator_type(this, 0); } + +FileIndices::const_iterator_type FileIndices::begin() const { return cbegin(); } + +FileIndices::const_iterator_type FileIndices::cbegin() const +{ + return FileIndices::const_iterator_type(this, 0); +} + +FileIndices::iterator_type FileIndices::end() +{ + return FileIndices::iterator_type(this, NumChildren()); +} + +FileIndices::const_iterator_type FileIndices::end() const { return cend(); } + +FileIndices::const_iterator_type FileIndices::cend() const +{ + return FileIndices::const_iterator_type(this, NumChildren()); +} + +const FileIndices::value_type& FileIndices::operator[](size_t index) const +{ + return dynamic_cast(*(children_.at(index).get())); +} + +FileIndices::value_type& FileIndices::operator[](size_t index) +{ + return dynamic_cast(*(children_.at(index).get())); +} + +// ------------------- +// Filter +// ------------------- + +Filter::Filter() : DataSetElement("Filter", XsdType::DATASETS) {} + +Filter::Filter(const internal::FromInputXml& fromInputXml) + : DataSetElement("Filter", fromInputXml, XsdType::DATASETS) +{ +} + +DEFINE_ACCESSORS(Filter, Properties, Properties) + +Filter& Filter::Properties(const PacBio::BAM::Properties& properties) +{ + Properties() = properties; + return *this; +} + +// ------------------- +// Filters +// ------------------- + +Filters::Filters() : DataSetElement("Filters", XsdType::DATASETS) {} + +Filters::Filters(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, 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); } + +Filters::iterator_type Filters::begin() { return Filters::iterator_type(this, 0); } + +Filters::const_iterator_type Filters::begin() const { return cbegin(); } + +Filters::const_iterator_type Filters::cbegin() const +{ + return Filters::const_iterator_type(this, 0); +} + +Filters::iterator_type Filters::end() { return Filters::iterator_type(this, NumChildren()); } + +Filters::const_iterator_type Filters::end() const { return cend(); } + +Filters::const_iterator_type Filters::cend() const +{ + return Filters::const_iterator_type(this, NumChildren()); +} + +const Filters::value_type& Filters::operator[](size_t index) const +{ + return dynamic_cast(*(children_.at(index).get())); +} + +Filters::value_type& Filters::operator[](size_t index) +{ + return dynamic_cast(*(children_.at(index).get())); +} + +// ------------------- +// HdfSubreadSet +// ------------------- + +HdfSubreadSet::HdfSubreadSet() + : DataSetBase("PacBio.DataSet.HdfSubreadSet", "HdfSubreadSet", XsdType::DATASETS) +{ +} + +HdfSubreadSet::HdfSubreadSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "HdfSubreadSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// ParentTool +// ------------------- + +ParentTool::ParentTool() : BaseEntityType("ParentTool", XsdType::DATASETS) {} + +ParentTool::ParentTool(const internal::FromInputXml& fromInputXml) + : BaseEntityType("", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// Properties +// ------------------- + +Properties::Properties() : DataSetElement("Properties", XsdType::BASE_DATA_MODEL) {} + +Properties::Properties(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::BASE_DATA_MODEL) +{ +} + +void Properties::Add(const Property& property) { AddChild(property); } + +void Properties::Remove(const Property& property) { RemoveChild(property); } + +Properties::iterator_type Properties::begin() { return Properties::iterator_type(this, 0); } + +Properties::const_iterator_type Properties::begin() const { return cbegin(); } + +Properties::const_iterator_type Properties::cbegin() const +{ + return Properties::const_iterator_type(this, 0); +} + +Properties::iterator_type Properties::end() +{ + return Properties::iterator_type(this, NumChildren()); +} + +Properties::const_iterator_type Properties::end() const { return cend(); } + +Properties::const_iterator_type Properties::cend() const +{ + return Properties::const_iterator_type(this, NumChildren()); +} + +const Properties::value_type& Properties::operator[](size_t index) const +{ + return dynamic_cast(*(children_.at(index).get())); +} + +Properties::value_type& Properties::operator[](size_t index) +{ + return dynamic_cast(*(children_.at(index).get())); +} + +// ------------------- +// 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); +} + +Property::Property(const std::string& name, const std::string& value, const std::string& op, + const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::BASE_DATA_MODEL) +{ + Name(name); + Value(value); + Operator(op); +} + +const std::string& Property::Name() const { return Attribute("Name"); } + +std::string& Property::Name() { return Attribute("Name"); } + +Property& Property::Name(const std::string& name) +{ + Attribute("Name", name); + return *this; +} + +const std::string& Property::Operator() const { return Attribute("Operator"); } + +std::string& Property::Operator() { return Attribute("Operator"); } + +Property& Property::Operator(const std::string& op) +{ + Attribute("Operator", op); + return *this; +} + +const std::string& Property::Value() const { return Attribute("Value"); } + +std::string& Property::Value() { return Attribute("Value"); } + +Property& Property::Value(const std::string& value) +{ + Attribute("Value", value); + return *this; +} + +// ------------------- +// Provenance +// ------------------- + +Provenance::Provenance() : DataSetElement("Provenance", XsdType::DATASETS) {} + +Provenance::Provenance(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, XsdType::DATASETS) +{ +} + +DEFINE_ACCESSORS(Provenance, ParentTool, ParentTool) + +const std::string& Provenance::CreatedBy() const { return Attribute("CreatedBy"); } + +std::string& Provenance::CreatedBy() { return Attribute("CreatedBy"); } + +Provenance& Provenance::CreatedBy(const std::string& createdBy) +{ + Attribute("CreatedBy", createdBy); + return *this; +} + +const std::string& Provenance::CommonServicesInstanceId() const +{ + return ChildText("CommonServicesInstanceId"); +} + +std::string& Provenance::CommonServicesInstanceId() +{ + return ChildText("CommonServicesInstanceId"); +} + +Provenance& Provenance::CommonServicesInstanceId(const std::string& id) +{ + ChildText("CommonServicesInstanceId", id); + return *this; +} + +const std::string& Provenance::CreatorUserId() const { return ChildText("CreatorUserId"); } + +std::string& Provenance::CreatorUserId() { return ChildText("CreatorUserId"); } + +Provenance& Provenance::CreatorUserId(const std::string& id) +{ + ChildText("CreatorUserId", id); + return *this; +} + +const std::string& Provenance::ParentJobId() const { return ChildText("ParentJobId"); } + +std::string& Provenance::ParentJobId() { return ChildText("ParentJobId"); } + +Provenance& Provenance::ParentJobId(const std::string& id) +{ + ChildText("ParentJobId", id); + return *this; +} + +Provenance& Provenance::ParentTool(const PacBio::BAM::ParentTool& tool) +{ + ParentTool() = tool; + return *this; +} + +// ------------------- +// ReferenceSet +// ------------------- + +ReferenceSet::ReferenceSet() + : DataSetBase("PacBio.DataSet.ReferenceSet", "ReferenceSet", XsdType::DATASETS) +{ +} + +ReferenceSet::ReferenceSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "ReferenceSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// SubDataSets +// ------------------- + +SubDataSets::SubDataSets() : DataSetElement("DataSets", XsdType::DATASETS) {} + +SubDataSets::SubDataSets(const internal::FromInputXml& fromInputXml) + : DataSetElement("", fromInputXml, 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); } + +SubDataSets::iterator_type SubDataSets::begin() { return SubDataSets::iterator_type(this, 0); } + +SubDataSets::const_iterator_type SubDataSets::begin() const { return cbegin(); } + +SubDataSets::const_iterator_type SubDataSets::cbegin() const +{ + return SubDataSets::const_iterator_type(this, 0); +} + +SubDataSets::iterator_type SubDataSets::end() +{ + return SubDataSets::iterator_type(this, NumChildren()); +} + +SubDataSets::const_iterator_type SubDataSets::end() const { return cend(); } + +SubDataSets::const_iterator_type SubDataSets::cend() const +{ + return SubDataSets::const_iterator_type(this, NumChildren()); +} + +const SubDataSets::value_type& SubDataSets::operator[](size_t index) const +{ + return dynamic_cast(*(children_.at(index).get())); +} + +SubDataSets::value_type& SubDataSets::operator[](size_t index) +{ + return dynamic_cast(*(children_.at(index).get())); +} + +// ------------------- +// SubreadSet +// ------------------- + +SubreadSet::SubreadSet() : DataSetBase("PacBio.DataSet.SubreadSet", "SubreadSet", XsdType::DATASETS) +{ +} + +SubreadSet::SubreadSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "SubreadSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// TranscriptSet +// ------------------- + +TranscriptSet::TranscriptSet() + : DataSetBase("PacBio.DataSet.TranscriptSet", "TranscriptSet", XsdType::DATASETS) +{ +} + +TranscriptSet::TranscriptSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "TranscriptSet", fromInputXml, XsdType::DATASETS) +{ +} + +// ------------------- +// TranscriptAlignmentSet +// ------------------- + +TranscriptAlignmentSet::TranscriptAlignmentSet() + : DataSetBase("PacBio.DataSet.TranscriptAlignmentSet", "TranscriptAlignmentSet", + XsdType::DATASETS) +{ +} + +TranscriptAlignmentSet::TranscriptAlignmentSet(const internal::FromInputXml& fromInputXml) + : DataSetBase("", "TranscriptAlignmentSet", fromInputXml, XsdType::DATASETS) +{ +} + +XmlElementType ElementTypeFromName(const std::string& name) +{ + const auto found = elementTypeLookup.find(name); + if (found == elementTypeLookup.cend()) return XmlElementType::GENERIC_ELEMENT; + return found->second; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/DataSetUtils.h b/src/DataSetUtils.h new file mode 100644 index 0000000..1b05f4c --- /dev/null +++ b/src/DataSetUtils.h @@ -0,0 +1,70 @@ +// Author: Derek Barnett + +#ifndef DATASETUTILS_H +#define DATASETUTILS_H + +#include +#include +#include "pbbam/DataSetTypes.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +static const std::string XML_VERSION = std::string{"3.0.1"}; + +template +inline const T& NullObject() +{ + static const T empty; + return empty; +} + +template <> +inline const PacBio::BAM::DataSetMetadata& NullObject() +{ + static const PacBio::BAM::DataSetMetadata empty("", ""); + return empty; +} + +inline std::string GenerateUuid() +{ + static boost::uuids::random_generator gen; + const boost::uuids::uuid uuid = gen(); + return boost::uuids::to_string(uuid); +} + +} // 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() const \ + { \ + try { \ + return Child(#Type); \ + } catch (std::exception&) { \ + return internal::NullObject(); \ + } \ + } +#endif + +#ifndef FETCH_CHILD_REF +#define FETCH_CHILD_REF(Class, Type, Method) \ + \ + PacBio::BAM::Type& Class::Method() \ + { \ + if (!HasChild(#Type)) AddChild(internal::NullObject()); \ + return Child(#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..f2f20a1 --- /dev/null +++ b/src/DataSetXsd.cpp @@ -0,0 +1,215 @@ +// File Description +/// \file DataSetXsd.cpp +/// \brief Implements the XSD- and namespace-related classes for DataSetXML. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/DataSetXsd.h" + +#include + +namespace PacBio { +namespace BAM { +namespace internal { + +// clang-format off +static std::map DefaultRegistry() +{ + const auto result = std::map + { + { XsdType::NONE, NamespaceInfo{ "", "" } }, + { XsdType::AUTOMATION_CONSTRAINTS, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioAutomationConstraints.xsd" } }, + { XsdType::BASE_DATA_MODEL, NamespaceInfo{ "pbbase", "http://pacificbiosciences.com/PacBioBaseDataModel.xsd" } }, + { XsdType::COLLECTION_METADATA, NamespaceInfo{ "pbmeta", "http://pacificbiosciences.com/PacBioCollectionMetadata.xsd" } }, + { XsdType::COMMON_MESSAGES, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioCommonMessages.xsd" } }, + { XsdType::DATA_MODEL, NamespaceInfo{ "pbdm", "http://pacificbiosciences.com/PacBioDataModel.xsd" } }, + { XsdType::DATA_STORE, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioDataStore.xsd" } }, + { XsdType::DATASETS, NamespaceInfo{ "pbds", "http://pacificbiosciences.com/PacBioDatasets.xsd" } }, + { XsdType::DECL_DATA, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioDeclData.xsd" } }, + { XsdType::PART_NUMBERS, NamespaceInfo{ "pbpn", "http://pacificbiosciences.com/PacBioPartNumbers.xsd" } }, + { XsdType::PRIMARY_METRICS, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioPrimaryMetrics.xsd" } }, + { XsdType::REAGENT_KIT, NamespaceInfo{ "pbrk", "http://pacificbiosciences.com/PacBioReagentKit.xsd" } }, + { XsdType::RIGHTS_AND_ROLES, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioRightsAndRoles.xsd" } }, + { XsdType::SAMPLE_INFO, NamespaceInfo{ "pbsample", "http://pacificbiosciences.com/PacBioSampleInfo.xsd" } }, + { XsdType::SEEDING_DATA, NamespaceInfo{ "", "http://pacificbiosciences.com/PacBioSeedingData.xsd" } } + }; + return result; +} + +static const auto elementRegistry = std::unordered_map +{ + // 'pbbase' elements + // + { "AutomationParameter" , XsdType::BASE_DATA_MODEL }, + { "AutomationParameters" , XsdType::BASE_DATA_MODEL }, + { "BinCount" , XsdType::BASE_DATA_MODEL }, + { "BinCounts" , XsdType::BASE_DATA_MODEL }, + { "BinLabel" , XsdType::BASE_DATA_MODEL }, + { "BinLabels" , XsdType::BASE_DATA_MODEL }, + { "BinWidth" , XsdType::BASE_DATA_MODEL }, + { "ExternalResource" , XsdType::BASE_DATA_MODEL }, + { "ExternalResources" , XsdType::BASE_DATA_MODEL }, + { "FileIndex" , XsdType::BASE_DATA_MODEL }, + { "FileIndices" , XsdType::BASE_DATA_MODEL }, + { "MaxBinValue" , XsdType::BASE_DATA_MODEL }, + { "MaxOutlierValue" , XsdType::BASE_DATA_MODEL }, + { "MetricDescription" , XsdType::BASE_DATA_MODEL }, + { "NumBins" , XsdType::BASE_DATA_MODEL }, + { "Properties" , XsdType::BASE_DATA_MODEL }, + { "Property" , XsdType::BASE_DATA_MODEL }, + { "Sample95thPct" , XsdType::BASE_DATA_MODEL }, + { "SampleMean" , XsdType::BASE_DATA_MODEL }, + { "SampleMed" , XsdType::BASE_DATA_MODEL }, + { "SampleSize" , XsdType::BASE_DATA_MODEL }, + { "SampleStd" , XsdType::BASE_DATA_MODEL }, + + // 'pbds' elements + // + { "AdapterDimerFraction", XsdType::DATASETS }, + { "AlignmentSet", XsdType::DATASETS }, + { "BarcodeConstruction", XsdType::DATASETS }, + { "BarcodeSet", XsdType::DATASETS }, + { "ConsensusAlignmentSet", XsdType::DATASETS }, + { "ConsensusReadSet", XsdType::DATASETS }, + { "Contig", XsdType::DATASETS }, + { "Contigs", XsdType::DATASETS }, + { "ContigSet", XsdType::DATASETS }, + { "ControlReadLenDist", XsdType::DATASETS }, + { "ControlReadQualDist", XsdType::DATASETS }, + { "DataSetMetdata", XsdType::DATASETS }, + { "DataSet", XsdType::DATASETS }, + { "DataSets", XsdType::DATASETS }, + { "Filter", XsdType::DATASETS }, + { "Filters", XsdType::DATASETS }, + { "HdfSubreadSet", XsdType::DATASETS }, + { "InsertReadLenDist", XsdType::DATASETS }, + { "InsertReadQualDist" , XsdType::DATASETS }, + { "MedianInsertDist", XsdType::DATASETS }, + { "NumRecords", XsdType::DATASETS }, + { "NumSequencingZmws", XsdType::DATASETS }, + { "Organism", XsdType::DATASETS }, + { "ParentTool", XsdType::DATASETS }, + { "Ploidy", XsdType::DATASETS }, + { "ProdDist", XsdType::DATASETS }, + { "Provenance", XsdType::DATASETS }, + { "ReadLenDist", XsdType::DATASETS }, + { "ReadQualDist", XsdType::DATASETS }, + { "ReadTypeDist", XsdType::DATASETS }, + { "ReferenceSet", XsdType::DATASETS }, + { "ShortInsertFraction", XsdType::DATASETS }, + { "SubreadSet", XsdType::DATASETS }, + { "SummaryStats", XsdType::DATASETS }, + { "TotalLength", XsdType::DATASETS }, + { "TranscriptSet", XsdType::DATASETS }, + { "TranscriptAlignmentSet",XsdType::DATASETS }, + + // 'pbmeta' elements + // + { "Automation", XsdType::COLLECTION_METADATA }, + { "AutomationName", XsdType::COLLECTION_METADATA }, + { "CellIndex", XsdType::COLLECTION_METADATA }, + { "CellPac", XsdType::COLLECTION_METADATA }, + { "CollectionFileCopy", XsdType::COLLECTION_METADATA }, + { "CollectionMetadata", XsdType::COLLECTION_METADATA }, + { "CollectionNumber", XsdType::COLLECTION_METADATA }, + { "CollectionPathUri", XsdType::COLLECTION_METADATA }, + { "Collections", XsdType::COLLECTION_METADATA }, + { "Concentration", XsdType::COLLECTION_METADATA }, + { "ConfigFileName", XsdType::COLLECTION_METADATA }, + { "CopyFiles", XsdType::COLLECTION_METADATA }, + { "InstCtrlVer", XsdType::COLLECTION_METADATA }, + { "MetricsVerbosity", XsdType::COLLECTION_METADATA }, + { "Name", XsdType::COLLECTION_METADATA }, + { "OutputOptions", XsdType::COLLECTION_METADATA }, + { "PlateId", XsdType::COLLECTION_METADATA }, + { "Primary", XsdType::COLLECTION_METADATA }, + { "Readout", XsdType::COLLECTION_METADATA }, + { "ResultsFolder", XsdType::COLLECTION_METADATA }, + { "RunDetails", XsdType::COLLECTION_METADATA }, + { "RunId", XsdType::COLLECTION_METADATA }, + { "SampleReuseEnabled", XsdType::COLLECTION_METADATA }, + { "SequencingCondition", XsdType::COLLECTION_METADATA }, + { "SigProcVer", XsdType::COLLECTION_METADATA }, + { "SizeSelectionEnabled", XsdType::COLLECTION_METADATA }, + { "StageHotstartEnabled", XsdType::COLLECTION_METADATA }, + { "UseCount", XsdType::COLLECTION_METADATA }, + { "WellName", XsdType::COLLECTION_METADATA }, + { "WellSample", XsdType::COLLECTION_METADATA }, + + // 'pbsample' elements + // + { "BioSample", XsdType::SAMPLE_INFO }, + { "BioSamplePointer", XsdType::SAMPLE_INFO }, + { "BioSamplePointers", XsdType::SAMPLE_INFO }, + { "BioSamples", XsdType::SAMPLE_INFO } +}; +// clang-format on + +} // namespace internal + +// --------------- +// NamespaceInfo +// --------------- + +NamespaceInfo::NamespaceInfo(std::string name, std::string uri) + : name_(std::move(name)), uri_(std::move(uri)) +{ +} + +NamespaceInfo::NamespaceInfo() = default; + +const std::string& NamespaceInfo::Name() const { return name_; } + +const std::string& NamespaceInfo::Uri() const { return uri_; } + +// ------------------- +// NamespaceRegistry +// ------------------- + +NamespaceRegistry::NamespaceRegistry() : data_(internal::DefaultRegistry()) {} + +NamespaceRegistry::NamespaceRegistry(const NamespaceRegistry&) = default; + +NamespaceRegistry::NamespaceRegistry(NamespaceRegistry&&) = default; + +NamespaceRegistry& NamespaceRegistry::operator=(const NamespaceRegistry&) = default; + +NamespaceRegistry& NamespaceRegistry::operator=(NamespaceRegistry&&) = default; + +NamespaceRegistry::~NamespaceRegistry() = default; + +const NamespaceInfo& NamespaceRegistry::DefaultNamespace() const { return Namespace(DefaultXsd()); } + +XsdType NamespaceRegistry::DefaultXsd() const { return defaultXsdType_; } + +const NamespaceInfo& NamespaceRegistry::Namespace(const XsdType& xsd) const +{ + return data_.at(xsd); +} + +void NamespaceRegistry::Register(const XsdType& xsd, const NamespaceInfo& namespaceInfo) +{ + data_[xsd] = namespaceInfo; +} + +void NamespaceRegistry::SetDefaultXsd(const XsdType& xsd) { defaultXsdType_ = xsd; } + +XsdType NamespaceRegistry::XsdForElement(const std::string& elementLabel) const +{ + const auto iter = internal::elementRegistry.find(elementLabel); + return (iter == internal::elementRegistry.cend() ? XsdType::NONE : iter->second); +} + +XsdType NamespaceRegistry::XsdForUri(const std::string& uri) const +{ + for (const auto& entry : data_) { + const auto& info = entry.second; + if (info.Uri() == uri) return entry.first; + } + return XsdType::NONE; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/EntireFileQuery.cpp b/src/EntireFileQuery.cpp new file mode 100644 index 0000000..85f65cf --- /dev/null +++ b/src/EntireFileQuery.cpp @@ -0,0 +1,34 @@ +// File Description +/// \file EntireFileQuery.cpp +/// \brief Implements the EntireFileQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/EntireFileQuery.h" + +#include "pbbam/CompositeBamReader.h" + +namespace PacBio { +namespace BAM { + +class EntireFileQuery::EntireFileQueryPrivate +{ +public: + EntireFileQueryPrivate(const DataSet &dataset) : reader_(dataset) {} + + SequentialCompositeBamReader reader_; +}; + +EntireFileQuery::EntireFileQuery(const DataSet &dataset) + : internal::IQuery(), d_(new EntireFileQueryPrivate(dataset)) +{ +} + +EntireFileQuery::~EntireFileQuery() = default; + +bool EntireFileQuery::GetNext(BamRecord &r) { return d_->reader_.GetNext(r); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/EnumClassHash.h b/src/EnumClassHash.h new file mode 100644 index 0000000..badf0d2 --- /dev/null +++ b/src/EnumClassHash.h @@ -0,0 +1,51 @@ +// File Description +/// \file EnumClassHash.h +/// \brief Defines the EnumClassHash class. +// +// Author: Derek Barnett + +#ifndef ENUMCLASSHASH_H +#define ENUMCLASSHASH_H + +#include + +namespace PacBio { +namespace BAM { + +/// +/// \brief The EnumClassHash struct enables the use of enum class types as keys +/// for std::unordered_map. +/// +/// Allows something like: +/// +/// \code{.cpp} +/// std::unordered_map myLookup; +/// \endcode +/// +/// where Key_t is an enum class. Without this sort of extra hand-holding to +/// provide a 'manual' hash value, enum classes as keys will fail to compile. +/// +/// \note This approach might be unnecessary in C++14, if I understand some of +/// the changes correctly. But this works for C++11 and should continue beyond. +/// +/// \sa http://stackoverflow.com/questions/18837857/cant-use-enum-class-as-unordered-map-key +/// +struct EnumClassHash +{ + // *** NOTE *** + // + // Remove this when we integrate pbcopper. + // This is a duplicate of pbcopper/utility/EnumClassHash.h + // + + template + size_t operator()(const T t) const + { + return static_cast(t); + } +}; + +} // namespace BAM +} // namespace PacBio + +#endif // ENUMCLASSHASH_H diff --git a/src/FastaCache.cpp b/src/FastaCache.cpp new file mode 100644 index 0000000..77eb94c --- /dev/null +++ b/src/FastaCache.cpp @@ -0,0 +1,53 @@ +#include "pbbam/FastaCache.h" + +#include + +#include "pbbam/FastaReader.h" + +namespace PacBio { +namespace BAM { + +FastaCacheData::FastaCacheData(const std::string& filename) : cache_{FastaReader::ReadAll(filename)} +{ + for (size_t i = 0; i < cache_.size(); ++i) + lookup_.emplace(cache_[i].Name(), i); +} + +std::string FastaCacheData::Subsequence(const std::string& name, size_t begin, size_t end) const +{ + const auto found = lookup_.find(name); + if (found == lookup_.cend()) { + throw std::runtime_error{""}; + } + const std::string& seq = cache_[found->second].Bases(); + + if (begin > end) throw std::runtime_error{""}; + const size_t length = end - begin; + return seq.substr(begin, length); +} + +std::vector FastaCacheData::Names() const +{ + std::vector result; + result.reserve(cache_.size()); + for (const auto& seq : cache_) + result.push_back(seq.Name()); + return result; +} + +size_t FastaCacheData::SequenceLength(const std::string& name) const +{ + const auto found = lookup_.find(name); + if (found == lookup_.cend()) { + throw std::runtime_error{""}; + } + return cache_[found->second].Bases().size(); +} + +FastaCache MakeFastaCache(const std::string& filename) +{ + return std::make_shared(filename); +} + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/FastaReader.cpp b/src/FastaReader.cpp new file mode 100644 index 0000000..e1572dd --- /dev/null +++ b/src/FastaReader.cpp @@ -0,0 +1,83 @@ +// File Description +/// \file FastaReader.cpp +/// \brief Implements the FastaReader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastaReader.h" + +#include +#include +#include + +#include +#include + +#include "pbbam/FastaSequence.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class FastaReader::FastaReaderPrivate +{ + KSEQ_INIT(gzFile, gzread) + struct KSeqDeleter + { + void operator()(kseq_t* seq) const + { + if (seq) kseq_destroy(seq); + seq = nullptr; + } + }; + +public: + explicit FastaReaderPrivate(const std::string& fn) + : fp_{gzopen(fn.c_str(), "r")}, seq_{kseq_init(fp_)} + { + if (fp_ == nullptr || seq_.get() == nullptr) + throw std::runtime_error{"FastaReader: could not open file for reading: " + fn}; + } + + ~FastaReaderPrivate() { gzclose(fp_); } + + bool GetNext(FastaSequence& record) + { + const auto result = kseq_read(seq_.get()); + if (result == -1) // EOF + return false; + record = FastaSequence{std::string{seq_->name.s, seq_->name.l}, + std::string{seq_->seq.s, seq_->seq.l}}; + return true; + } + +private: + gzFile fp_; + std::unique_ptr seq_; +}; + +FastaReader::FastaReader(const std::string& fn) : d_{std::make_unique(fn)} {} + +FastaReader::FastaReader(FastaReader&&) = default; + +FastaReader& FastaReader::operator=(FastaReader&&) = default; + +FastaReader::~FastaReader() = default; + +bool FastaReader::GetNext(FastaSequence& record) { return d_->GetNext(record); } + +std::vector FastaReader::ReadAll(const std::string& fn) +{ + std::vector result; + result.reserve(256); + FastaReader reader{fn}; + FastaSequence s; + while (reader.GetNext(s)) + result.emplace_back(s); + return result; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FastaSequence.cpp b/src/FastaSequence.cpp new file mode 100644 index 0000000..cf3563c --- /dev/null +++ b/src/FastaSequence.cpp @@ -0,0 +1,39 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastaSequence.h" + +#include +#include + +#include + +namespace PacBio { +namespace BAM { + +FastaSequence::FastaSequence(std::string name, std::string bases) + : name_{std::move(name)}, bases_{std::move(bases)} +{ + boost::algorithm::trim(name_); + boost::algorithm::trim(bases_); +} + +FastaSequence::FastaSequence() = default; + +FastaSequence::FastaSequence(const FastaSequence&) = default; + +FastaSequence::FastaSequence(FastaSequence&&) = default; + +FastaSequence& FastaSequence::operator=(const FastaSequence&) = default; + +FastaSequence& FastaSequence::operator=(FastaSequence&&) = default; + +FastaSequence::~FastaSequence() = default; + +const std::string& FastaSequence::Bases() const { return bases_; } + +const std::string& FastaSequence::Name() const { return name_; } + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/FastaSequenceQuery.cpp b/src/FastaSequenceQuery.cpp new file mode 100644 index 0000000..1f039af --- /dev/null +++ b/src/FastaSequenceQuery.cpp @@ -0,0 +1,35 @@ +// File Description +/// \file FastaSequenceQuery.cpp +/// \brief Implements the FastaSequenceQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastaSequenceQuery.h" + +#include "pbbam/CompositeFastaReader.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class FastaSequenceQuery::FastaSequenceQueryPrivate +{ +public: + FastaSequenceQueryPrivate(const DataSet& dataset) : reader_{dataset} {} + + CompositeFastaReader reader_; +}; + +FastaSequenceQuery::FastaSequenceQuery(const DataSet& dataset) + : internal::QueryBase(), d_{std::make_unique(dataset)} +{ +} + +FastaSequenceQuery::~FastaSequenceQuery() = default; + +bool FastaSequenceQuery::GetNext(FastaSequence& seq) { return d_->reader_.GetNext(seq); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/FastaWriter.cpp b/src/FastaWriter.cpp new file mode 100644 index 0000000..9516d34 --- /dev/null +++ b/src/FastaWriter.cpp @@ -0,0 +1,38 @@ +// File Description +/// \file FastaWriter.cpp +/// \brief Implements the FastaWriter class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastaWriter.h" + +#include "pbbam/BamRecord.h" +#include "pbbam/FastqSequence.h" +#include "pbbam/QualityValues.h" + +namespace PacBio { +namespace BAM { + +FastaWriter::FastaWriter(const std::string& fn) : IRecordWriter(), file_{fn} +{ + if (!file_) throw std::runtime_error{"FastaWriter: could not open file for writing: " + fn}; +} + +void FastaWriter::TryFlush() { file_.flush(); } + +void FastaWriter::Write(const BamRecordImpl& bam) { Write(bam.Name(), bam.Sequence()); } + +void FastaWriter::Write(const FastaSequence& fastq) { Write(fastq.Name(), fastq.Bases()); } + +void FastaWriter::Write(const BamRecord& bam) { Write(bam.FullName(), bam.Sequence()); } + +void FastaWriter::Write(const std::string& name, const std::string& bases) +{ + // TODO: wrap bases + file_ << ">" << name << '\n' << bases << '\n'; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FastqReader.cpp b/src/FastqReader.cpp new file mode 100644 index 0000000..aac050b --- /dev/null +++ b/src/FastqReader.cpp @@ -0,0 +1,84 @@ +// File Description +/// \file FastqReader.cpp +/// \brief Implements the FastqReader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastqReader.h" + +#include +#include +#include + +#include +#include + +#include "pbbam/FastqSequence.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class FastqReader::FastqReaderPrivate +{ + KSEQ_INIT(gzFile, gzread) + struct KSeqDeleter + { + void operator()(kseq_t* seq) const + { + if (seq) kseq_destroy(seq); + seq = nullptr; + } + }; + +public: + explicit FastqReaderPrivate(const std::string& fn) + : fp_{gzopen(fn.c_str(), "r")}, seq_{kseq_init(fp_)} + { + if (fp_ == nullptr || seq_.get() == nullptr) + throw std::runtime_error{"FastqReader: could not open file for reading: " + fn}; + } + + ~FastqReaderPrivate() { gzclose(fp_); } + + bool GetNext(FastqSequence& record) + { + const auto result = kseq_read(seq_.get()); + if (result == -1) // EOF + return false; + record = FastqSequence{std::string{seq_->name.s, seq_->name.l}, + std::string{seq_->seq.s, seq_->seq.l}, + std::string{seq_->qual.s, seq_->qual.l}}; + return true; + } + +private: + gzFile fp_; + std::unique_ptr seq_; +}; + +FastqReader::FastqReader(const std::string& fn) : d_{std::make_unique(fn)} {} + +FastqReader::FastqReader(FastqReader&&) = default; + +FastqReader& FastqReader::operator=(FastqReader&&) = default; + +FastqReader::~FastqReader() = default; + +bool FastqReader::GetNext(FastqSequence& record) { return d_->GetNext(record); } + +std::vector FastqReader::ReadAll(const std::string& fn) +{ + std::vector result; + result.reserve(256); + FastqReader reader{fn}; + FastqSequence s; + while (reader.GetNext(s)) + result.emplace_back(s); + return result; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FastqSequence.cpp b/src/FastqSequence.cpp new file mode 100644 index 0000000..26939aa --- /dev/null +++ b/src/FastqSequence.cpp @@ -0,0 +1,39 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastqSequence.h" + +#include +#include + +namespace PacBio { +namespace BAM { + +FastqSequence::FastqSequence(std::string name, std::string bases, QualityValues qualities) + : FastaSequence{std::move(name), std::move(bases)}, qualities_{std::move(qualities)} +{ +} + +FastqSequence::FastqSequence(std::string name, std::string bases, std::string qualities) + : FastaSequence{std::move(name), std::move(bases)} + , qualities_{QualityValues::FromFastq(qualities)} +{ +} + +FastqSequence::FastqSequence() = default; + +FastqSequence::FastqSequence(const FastqSequence&) = default; + +FastqSequence::FastqSequence(FastqSequence&&) = default; + +FastqSequence& FastqSequence::operator=(const FastqSequence&) = default; + +FastqSequence& FastqSequence::operator=(FastqSequence&&) = default; + +FastqSequence::~FastqSequence() = default; + +const QualityValues& FastqSequence::Qualities() const { return qualities_; } + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/FastqWriter.cpp b/src/FastqWriter.cpp new file mode 100644 index 0000000..506a5f8 --- /dev/null +++ b/src/FastqWriter.cpp @@ -0,0 +1,62 @@ +// File Description +/// \file FastqWriter.cpp +/// \brief Implements the FastqWriter class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/FastqWriter.h" + +#include "pbbam/BamRecord.h" +#include "pbbam/FastqSequence.h" +#include "pbbam/QualityValues.h" + +namespace PacBio { +namespace BAM { + +FastqWriter::FastqWriter(const std::string& fn) : IRecordWriter(), file_{fn} +{ + if (!file_) throw std::runtime_error{"FastqWriter: could not open file for writing: " + fn}; +} + +void FastqWriter::TryFlush() { file_.flush(); } + +void FastqWriter::Write(const FastqSequence& fastq) +{ + Write(fastq.Name(), fastq.Bases(), fastq.Qualities()); +} + +void FastqWriter::Write(const BamRecord& bam) +{ + Write(bam.FullName(), bam.Sequence(), bam.Qualities()); +} + +void FastqWriter::Write(const BamRecordImpl& bam) +{ + Write(bam.Name(), bam.Sequence(), bam.Qualities()); +} + +void FastqWriter::Write(const std::string& name, const std::string& bases, + const QualityValues& quals) +{ + Write(name, bases, quals.Fastq()); +} + +void FastqWriter::Write(const std::string& name, const std::string& bases, const std::string& quals) +{ + + file_ << "@" << name << '\n' << bases << '\n' << "+\n"; + + if (!quals.empty()) + file_ << quals; + else { + std::string q(bases.size(), '!'); + file_ << q; + } + + file_ << '\n'; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FileProducer.cpp b/src/FileProducer.cpp new file mode 100644 index 0000000..e0ba25f --- /dev/null +++ b/src/FileProducer.cpp @@ -0,0 +1,38 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "FileProducer.h" + +#include +#include + +namespace PacBio { +namespace BAM { + +FileProducer::FileProducer(std::string targetFilename) + : FileProducer(targetFilename, targetFilename + ".tmp") +{ +} + +FileProducer::FileProducer(std::string targetFilename, std::string tempFilename) + : targetFilename_{std::move(targetFilename)}, tempFilename_{std::move(tempFilename)} +{ + // override renaming if writing to stdout + // + // setting temp filename to '-' keeps consistent interfaces + // for derived classes to actually operate on temp filename + if (targetFilename_ == "-") tempFilename_ = "-"; +} + +FileProducer::~FileProducer() +{ + // skip renaming if there is a 'live' exception + // or if writing to stdout + if ((std::current_exception() == nullptr) && (tempFilename_ != "-")) { + std::rename(tempFilename_.c_str(), targetFilename_.c_str()); + } +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FileProducer.h b/src/FileProducer.h new file mode 100644 index 0000000..de7d6fe --- /dev/null +++ b/src/FileProducer.h @@ -0,0 +1,54 @@ +// Author: Derek Barnett + +#ifndef FILEPRODUCER_H +#define FILEPRODUCER_H + +#include +#include + +namespace PacBio { +namespace BAM { + +// The FileProducer class provides functionality for working with a temp +// file until successful destruction of a FileProducer-derived class. +// +// Derived classes should be sure to flush/close the temp file, and the +// FileProducer's destructor will ensure that the temp file will be renamed to +// the target filename. +// +// If destruction is triggered by an exception, no renaming will occur. +// +class FileProducer +{ +public: + FileProducer() = delete; + + // Initializes FileProducer with specified target filename. Temp filename is + // set to target filename plus ".tmp" suffix. + explicit FileProducer(std::string targetFilename); + + // Initializes FileProducer with specified target filename & explicit temp + // filename. + FileProducer(std::string targetFilename, std::string tempFilename); + + // Renames temp file to target filename. + // + // Derived classes should ensure that data is flushed and file handle closed + // before or during their destructor. + // + // Remaming will not occur if there is a 'live' exception being thrown. + // + ~FileProducer(); + + const std::string& TargetFilename() const { return targetFilename_; } + const std::string& TempFilename() const { return tempFilename_; } + +private: + std::string targetFilename_; + std::string tempFilename_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FILEPRODUCER_H diff --git a/src/FileUtils.cpp b/src/FileUtils.cpp new file mode 100644 index 0000000..8f3d848 --- /dev/null +++ b/src/FileUtils.cpp @@ -0,0 +1,203 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "FileUtils.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +namespace { + +// pops "file://" scheme off the front of a URI/filepath, if found +static std::string removeFileUriScheme(const std::string& uri) +{ + assert(!uri.empty()); + + auto schemeLess = uri; + const auto fileScheme = std::string{"file://"}; + const auto schemeFound = schemeLess.find(fileScheme); + if (schemeFound != std::string::npos) { + if (schemeFound != 0) + throw std::runtime_error{"FileUtils: malformed URI, scheme is not at beginning"}; + schemeLess = schemeLess.substr(fileScheme.size()); + } + return schemeLess; +} + +#ifdef PBBAM_WIN_FILEPATHS + +static std::string removeDiskName(const std::string& filePath) +{ + if (filePath.size() >= 2) { + const char firstChar = filePath.at(0); + if ((isalpha(firstChar) != 0) && (filePath.at(1) == ':')) return filePath.substr(2); + } + return filePath; +} + +static const char native_pathSeparator = '\\'; + +static bool native_pathIsAbsolute(const std::string& filePath) +{ + assert(!filePath.empty()); + + // if starts with single slash or double slash + if (boost::algorithm::starts_with(filePath, "\\")) return true; + + // if starts with single or double-dots -> not absolute + if (boost::algorithm::starts_with(filePath, ".")) return false; + + // if starts with disk drive name and colon ("C:\foo\bar.txt") + // strip the drive name and check to see if the remaining path is absolute + if (filePath.size() >= 2) { + const char firstChar = filePath.at(0); + if ((isalpha(firstChar) != 0) && (filePath.at(1) == ':')) + return native_pathIsAbsolute(removeDiskName(filePath)); + } + + // otherwise, likely relative + return false; +} + +static std::string native_resolvedFilePath(const std::string& filePath, const std::string& from) +{ + // strip file:// scheme if present + auto schemeLess = removeFileUriScheme(filePath); + + // if empty or already absolute path, just return it + // upfront empty check simplifies further parsing logic + if (schemeLess.empty() || native_pathIsAbsolute(schemeLess)) return schemeLess; + + // else make relative from the provided 'from' directory + // + // first pop disk name, then any leading single-dot '.' + // + // since we're prepending the 'from' directory, we can remove + // any leading './' form our file path. this may just mean that + // we pop it off to add it right back (when from == '.'), but this + // keeps it consistent with other 'from' parent directories + // + schemeLess = removeDiskName(schemeLess); + + const bool thisDirAtStart = (schemeLess.find(".") == 0); + if (thisDirAtStart) { + if (schemeLess.find(native_pathSeparator) == 1) schemeLess = schemeLess.substr(2); + } + return from + native_pathSeparator + schemeLess; +} + +#else // else for non-Windows systems + +static const char native_pathSeparator = '/'; + +static bool native_pathIsAbsolute(const std::string& filePath) { return filePath.at(0) == '/'; } + +static std::string native_resolvedFilePath(const std::string& filePath, const std::string& from) +{ + // strip file:// scheme if present + auto schemeLess = removeFileUriScheme(filePath); + + // if empty or already absolute path, just return it + // upfront empty check simplifies further parsing logic + if (schemeLess.empty() || native_pathIsAbsolute(schemeLess)) return schemeLess; + + // else make relative from the provided 'from' directory + // + // since we're prepending the 'from' directory, we can remove + // any leading './' form our file path. this may just mean that + // we pop it off to add it right back (when from == '.'), but this + // keeps it consistent with other 'from' parent directories + // + const bool thisDirAtStart = (schemeLess.find(".") == 0); + if (thisDirAtStart) { + if (schemeLess.find(native_pathSeparator) == 1) schemeLess = schemeLess.substr(2); + } + return from + native_pathSeparator + schemeLess; +} + +#endif // PBBAM_WIN_FILEPATHS + +} // anonymous + +// see http://stackoverflow.com/questions/2869594/how-return-a-stdstring-from-cs-getcwd-function +std::string FileUtils::CurrentWorkingDirectory() +{ + const size_t chunkSize = 1024; + const size_t maxNumChunks = 20; + + // stack-based buffer for 'normal' case + char buffer[chunkSize]; + if (getcwd(buffer, sizeof(buffer)) != nullptr) return std::string(buffer); + + // if error is not ERANGE, then it's not a problem of too-long name... something else happened + if (errno != ERANGE) + throw std::runtime_error{"FileUtils: could not determine current working directory path"}; + + // long path - use heap, trying progressively longer buffers + for (size_t chunks = 2; chunks < maxNumChunks; ++chunks) { + std::unique_ptr cwd(new char[chunkSize * chunks]); + if (getcwd(cwd.get(), chunkSize * chunks) != nullptr) return std::string(cwd.get()); + + // if error is not ERANGE, then it's not a problem of too-long name... something else happened + if (errno != ERANGE) + throw std::runtime_error{ + "FileUtils: could not determine current working directory path"}; + } + + // crazy long path name + throw std::runtime_error{ + "FileUtils: could not determine current working directory - extremely long path"}; +} + +std::string FileUtils::DirectoryName(const std::string& file) +{ + const auto found = file.rfind(Separator(), file.length()); + if (found != std::string::npos) return file.substr(0, found); + return std::string("."); +} + +bool FileUtils::Exists(const char* fn) +{ + struct stat buf; + return (stat(fn, &buf) != -1); +} + +std::chrono::system_clock::time_point FileUtils::LastModified(const char* fn) +{ + struct stat s; + if (stat(fn, &s) != 0) + throw std::runtime_error{"FileUtils: could not get timestamp for file: " + std::string{fn}}; + return std::chrono::system_clock::from_time_t(s.st_mtime); +} + +std::string FileUtils::ResolvedFilePath(const std::string& filePath, const std::string& from) +{ + return native_resolvedFilePath(filePath, from); +} + +constexpr char FileUtils::Separator() { return native_pathSeparator; } + +off_t FileUtils::Size(const char* fn) +{ + struct stat s; + if (stat(fn, &s) != 0) + throw std::runtime_error{"FileUtils: could not determine size of file: " + std::string{fn}}; + return s.st_size; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FileUtils.h b/src/FileUtils.h new file mode 100644 index 0000000..88b5adb --- /dev/null +++ b/src/FileUtils.h @@ -0,0 +1,106 @@ +// Author: Derek Barnett + +#ifndef FILEUTILS_H +#define FILEUTILS_H + +#include +#include + +namespace PacBio { +namespace BAM { + +class FileUtils +{ +public: + /// \returns application's current working directory + static std::string CurrentWorkingDirectory(); + + /// Parses a filepath for the the directory name for a file. + /// + /// Essentially this method strips the filename from the string provided (/path/to/file => /path/to). + /// If only a filename is provided, then "." is returned to indicate the current directory. + /// + /// \param[in] file name of file (can be just a filename or path/to/filename) + /// \returns file's directory name + /// + static std::string DirectoryName(const std::string& file); + + /// Check for existence of a file. + /// + /// \param[in] fn full path to file + /// \returns true if file exists & can be opened + /// + static bool Exists(const char* fn); + + /// Check for existence of a file. + /// + /// \param[in] fn full path to file + /// \returns true if file exists & can be opened + /// + static bool Exists(const std::string& fn); + + /// Check "last modified" timestamp for a file. + /// + /// \param[in] fn full path to file + /// \returns time of last modification + /// \throws runtime_error if file info can't be accessed + /// + static std::chrono::system_clock::time_point LastModified(const char* fn); + + /// Check "last modified" timestamp for a file. + /// + /// \param[in] fn full path to file + /// \returns time of last modification + /// \throws runtime_error if file info can't be accessed + /// + static std::chrono::system_clock::time_point LastModified(const std::string& fn); + + /// Resolves input file path using optional starting directory. + /// + /// \verbatim + /// /absolute/path/to/file.txt => /absolute/path/to/file.txt + /// ../relative/path/to/file.txt => /../relative/path/to/file.txt + /// file.txt => /file.txt + /// \endverbatim + /// + /// \note This method will strip any URI scheme as well ("file://") so that the result is immediately ready from I/O operations. + /// + /// \param[in] filePath file path to be resolved + /// \param[in] from optional starting directory (useful if not same as application's working directory) + /// \returns resolved file path + /// + static std::string ResolvedFilePath(const std::string& filePath, const std::string& from = "."); + + /// \returns native path separator + constexpr static char Separator(); + + /// Check size of file. + /// + /// \param[in] fn full path to file + /// \returns file size in bytes + /// \throws runtime_error if file info can't be accessed + /// + static off_t Size(const char* fn); + + /// Check size of file. + /// + /// \param[in] fn full path to file + /// \returns file size in bytes + /// \throws runtime_error if file info can't be accessed + /// + static off_t Size(const std::string& fn); +}; + +inline bool FileUtils::Exists(const std::string& fn) { return FileUtils::Exists(fn.c_str()); } + +inline std::chrono::system_clock::time_point FileUtils::LastModified(const std::string& fn) +{ + return FileUtils::LastModified(fn.c_str()); +} + +inline off_t FileUtils::Size(const std::string& fn) { return FileUtils::Size(fn.c_str()); } + +} // namespace BAM +} // namespace PacBio + +#endif // FILEUTILS_H diff --git a/src/FofnReader.cpp b/src/FofnReader.cpp new file mode 100644 index 0000000..a8ae80d --- /dev/null +++ b/src/FofnReader.cpp @@ -0,0 +1,22 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "FofnReader.h" + +#include + +namespace PacBio { +namespace BAM { + +std::vector FofnReader::Files(std::istream& in) +{ + std::vector files; + std::string fn; + while (std::getline(in, fn)) + files.push_back(fn); + return files; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/FofnReader.h b/src/FofnReader.h new file mode 100644 index 0000000..dde5517 --- /dev/null +++ b/src/FofnReader.h @@ -0,0 +1,23 @@ +// Author: Derek Barnett + +#ifndef FOFNREADER_H +#define FOFNREADER_H + +#include +#include +#include +#include "pbbam/DataSet.h" + +namespace PacBio { +namespace BAM { + +class FofnReader +{ +public: + static std::vector Files(std::istream& in); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // FOFNREADER_H diff --git a/src/Frames.cpp b/src/Frames.cpp new file mode 100644 index 0000000..72ffc96 --- /dev/null +++ b/src/Frames.cpp @@ -0,0 +1,165 @@ +// File Description +/// \file Frames.cpp +/// \brief Implements the Frames class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Frames.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace PacBio { +namespace BAM { +namespace { + +static std::vector framepoints; +static std::vector frameToCode; +static uint16_t maxFramepoint; +static std::mutex initIpdDownsamplingMutex; + +void InitIpdDownsampling() +{ + std::lock_guard lock(initIpdDownsamplingMutex); + + if (!framepoints.empty()) return; + + // liftover from Dave's python code: + // .../bioinformatics/tools/kineticsTools/kineticsTools/_downsampling.py + + 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); + std::vector 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 <= std::numeric_limits::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; +} + +uint16_t CodeToFrames(const uint8_t code) { return framepoints[code]; } + +std::vector CodeToFrames(const std::vector& codedData) +{ + InitIpdDownsampling(); + + const auto length = codedData.size(); + std::vector frames(length, 0); + for (size_t i = 0; i < length; ++i) + frames[i] = CodeToFrames(codedData[i]); + return frames; +} + +uint8_t FramesToCode(const uint16_t frame) { return frameToCode[std::min(maxFramepoint, frame)]; } + +std::vector FramesToCode(const std::vector& frames) +{ + InitIpdDownsampling(); + + const auto length = frames.size(); + std::vector result(length, 0); + for (size_t i = 0; i < length; ++i) + result[i] = FramesToCode(frames[i]); + return result; +} + +} // anonmyous + +Frames::Frames(std::vector frames) : data_{std::move(frames)} {} + +Frames::Frames() = default; + +Frames::Frames(const Frames&) = default; + +Frames::Frames(Frames&&) = default; + +Frames& Frames::operator=(const Frames&) = default; + +Frames& Frames::operator=(Frames&&) = default; + +Frames::~Frames() = default; + +const std::vector& Frames::Data() const { return data_; } + +std::vector& Frames::DataRaw() { return data_; } + +Frames Frames::Decode(const std::vector& codedData) +{ + return Frames{CodeToFrames(codedData)}; +} + +std::vector Frames::Encode(const std::vector& frames) +{ + return FramesToCode(frames); +} + +std::vector Frames::Encode() const { return Frames::Encode(data_); } + +Frames& Frames::Data(std::vector frames) +{ + data_ = std::move(frames); + return *this; +} + +std::vector::const_iterator Frames::begin() const { return data_.begin(); } + +std::vector::iterator Frames::begin() { return data_.begin(); } + +std::vector::const_iterator Frames::cbegin() const { return data_.cbegin(); } + +std::vector::const_iterator Frames::cend() const { return data_.cend(); } + +std::vector::const_iterator Frames::end() const { return data_.end(); } + +std::vector::iterator Frames::end() { return data_.end(); } + +bool Frames::empty() const { return data_.empty(); } + +size_t Frames::size() const { return data_.size(); } + +bool Frames::operator==(const Frames& other) const { return data_ == other.data_; } + +bool Frames::operator!=(const Frames& other) const { return !(*this == other); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/GenomicInterval.cpp b/src/GenomicInterval.cpp new file mode 100644 index 0000000..e201149 --- /dev/null +++ b/src/GenomicInterval.cpp @@ -0,0 +1,146 @@ +// File Description +/// \file GenomicInterval.cpp +/// \brief Implements the GenomicInterval class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/GenomicInterval.h" + +#include +#include +#include +#include + +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +// returns sequence name & sets begin/end, from input regionString +std::string parseRegionString(const std::string& reg, PacBio::BAM::Position* begin, + PacBio::BAM::Position* end) +{ + const std::vector parts = Split(reg, ':'); + if (parts.empty() || parts.size() > 2) + throw std::runtime_error{"GenomicInterval: malformed region string (" + reg + ")"}; + + // 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 std::vector intervalParts = Split(parts.at(1), '-'); + if (intervalParts.empty() || intervalParts.size() > 2) + throw std::runtime_error{"GenomicInterval: malformed region string (" + reg + ")"}; + *begin = std::stoi(intervalParts.at(0)); + *end = std::stoi(intervalParts.at(1)); + } + + return parts.at(0); +} + +} // anonymous + +GenomicInterval::GenomicInterval(std::string name, Position start, Position stop) + : name_{std::move(name)}, interval_{std::move(start), std::move(stop)} +{ +} + +GenomicInterval::GenomicInterval(const std::string& samtoolsRegionString) +{ + Position begin = UnmappedPosition; + Position end = UnmappedPosition; + + name_ = parseRegionString(samtoolsRegionString, &begin, &end); + if (begin == UnmappedPosition || end == UnmappedPosition) + throw std::runtime_error{"GenomicInterval: malformed region string (" + + samtoolsRegionString + ")"}; + + interval_ = PacBio::BAM::Interval(begin, end); +} + +GenomicInterval::GenomicInterval() = default; + +GenomicInterval::GenomicInterval(const GenomicInterval&) = default; + +GenomicInterval::GenomicInterval(GenomicInterval&&) = default; + +GenomicInterval& GenomicInterval::operator=(const GenomicInterval&) = default; + +GenomicInterval& GenomicInterval::operator=(GenomicInterval&&) = default; + +GenomicInterval::~GenomicInterval() = default; + +bool GenomicInterval::operator==(const GenomicInterval& other) const +{ + return name_ == other.name_ && interval_ == other.interval_; +} + +bool GenomicInterval::operator!=(const GenomicInterval& other) const { return !(*this == other); } + +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_); +} + +PacBio::BAM::Interval GenomicInterval::Interval() const { return interval_; } + +GenomicInterval& GenomicInterval::Interval(PacBio::BAM::Interval interval) +{ + interval_ = std::move(interval); + return *this; +} + +bool GenomicInterval::IsValid() const +{ + return (!name_.empty() && (interval_.Start() >= 0) && (interval_.Stop() >= 0) && + interval_.IsValid()); +} + +size_t GenomicInterval::Length() const { return interval_.Length(); } + +std::string GenomicInterval::Name() const { return name_; } + +GenomicInterval& GenomicInterval::Name(std::string name) +{ + name_ = std::move(name); + return *this; +} + +Position GenomicInterval::Start() const { return interval_.Start(); } + +GenomicInterval& GenomicInterval::Start(const Position start) +{ + interval_.Start(start); + return *this; +} + +Position GenomicInterval::Stop() const { return interval_.Stop(); } + +GenomicInterval& GenomicInterval::Stop(const Position stop) +{ + interval_.Stop(stop); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/GenomicIntervalQuery.cpp b/src/GenomicIntervalQuery.cpp new file mode 100644 index 0000000..09ece15 --- /dev/null +++ b/src/GenomicIntervalQuery.cpp @@ -0,0 +1,53 @@ +// File Description +/// \file GenomicIntervalQuery.cpp +/// \brief Implements the GenomicIntervalQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/GenomicIntervalQuery.h" + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class GenomicIntervalQuery::GenomicIntervalQueryPrivate +{ +public: + GenomicIntervalQueryPrivate(const DataSet& dataset) : reader_{dataset} {} + + GenomicIntervalQueryPrivate(const GenomicInterval& interval, const DataSet& dataset) + : reader_{interval, dataset} + { + } + + GenomicIntervalCompositeBamReader reader_; +}; + +GenomicIntervalQuery::GenomicIntervalQuery(const DataSet& dataset) + : internal::IQuery(), d_{std::make_unique(dataset)} +{ +} + +GenomicIntervalQuery::GenomicIntervalQuery(const GenomicInterval& interval, const DataSet& dataset) + : internal::IQuery(), d_{std::make_unique(interval, dataset)} +{ +} + +GenomicIntervalQuery::~GenomicIntervalQuery() = default; + +bool GenomicIntervalQuery::GetNext(BamRecord& r) { return d_->reader_.GetNext(r); } + +GenomicIntervalQuery& GenomicIntervalQuery::Interval(const GenomicInterval& interval) +{ + d_->reader_.Interval(interval); + return *this; +} + +const GenomicInterval& GenomicIntervalQuery::Interval() const { return d_->reader_.Interval(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/IRecordWriter.cpp b/src/IRecordWriter.cpp new file mode 100644 index 0000000..5931f78 --- /dev/null +++ b/src/IRecordWriter.cpp @@ -0,0 +1,19 @@ +// File Description +/// \file IRecordWriter.cpp +/// \brief Implements the IRecordWriter class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/IRecordWriter.h" + +namespace PacBio { +namespace BAM { + +IRecordWriter::IRecordWriter() = default; + +IRecordWriter::~IRecordWriter() = default; + +} // namespace BAM +} // namespace PacBio diff --git a/src/IndexedBamWriter.cpp b/src/IndexedBamWriter.cpp new file mode 100644 index 0000000..fc5811a --- /dev/null +++ b/src/IndexedBamWriter.cpp @@ -0,0 +1,1022 @@ +/// File Description +/// \file IndexedBamWriter.cpp +/// \brief Implements the IndexedBamWriter class +// +// Author: Derek Barnett + +#include "pbbam/IndexedBamWriter.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/BamRecordImpl.h" +#include "pbbam/BamWriter.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiRawData.h" +#include "pbbam/RecordType.h" +#include "pbbam/Unused.h" +#include "pbbam/Validator.h" + +#include "FileProducer.h" +#include "MemoryUtils.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +void bgzf_write_safe2(BGZF* fp, const void* data, size_t length) +{ + const auto ret = bgzf_write(fp, data, length); + if (ret < 0L) + throw std::runtime_error{ + "IndexedBamWriter: non-zero returned from bgzf_write(). Out of disk space?"}; +} + +struct GzIndexEntry +{ + int64_t vAddress; + int64_t uAddress; +}; + +template +inline void SwapEndianness2(std::vector& data) +{ + constexpr 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{"IndexedBamWriter: unsupported element size: " + + std::to_string(elementSize)}; + } +} + +template +inline void WriteBgzfVector2(BGZF* fp, std::vector& data) +{ + assert(fp); + if (fp->is_be) SwapEndianness2(data); + bgzf_write_safe2(fp, data.data(), data.size() * sizeof(T)); +} + +struct PbiFieldBlock2 +{ + int64_t pos_; // file position of block start + size_t n_; // number of entries in block +}; + +template +class PbiField2 +{ + constexpr static const size_t ElementSize = sizeof(T); + +public: + PbiField2(size_t maxBufferSize) : maxElementCount_{maxBufferSize / ElementSize} + { + buffer_.reserve(maxElementCount_); + } + + void Add(T value) { buffer_.push_back(value); } + bool IsFull() const { return buffer_.size() == maxElementCount_; } + + size_t maxElementCount_; + std::vector buffer_; + std::vector blocks_; +}; + +class PbiReferenceDataBuilder2 +{ +public: + using ReferenceRows = std::pair; // [startRow, endRow) + + explicit PbiReferenceDataBuilder2(const size_t numReferenceSequences) + { + // initialize with number of references we expect to see + // + // we can add more later, but want to ensure known references have an entry + // even if no records are observed mapping to it + // + for (size_t i = 0; i < numReferenceSequences; ++i) + rawReferenceEntries_[i] = PbiReferenceEntry(i); + + // also create an "unmapped" entry + rawReferenceEntries_[PbiReferenceEntry::UNMAPPED_ID] = PbiReferenceEntry{}; + } + + bool AddRecord(const BamRecord& record, const int32_t 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_.at(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_.at(static_cast(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_.at(static_cast(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 Result() 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()); + for (const auto& entry : rawReferenceEntries_) + result.entries_.push_back(entry.second); + return result; + } + + void WriteData(BGZF* bgzf) + { + const auto refData = Result(); + + // num_refs + uint32_t numRefs = refData.entries_.size(); + if (bgzf->is_be) numRefs = ed_swap_4(numRefs); + bgzf_write_safe2(bgzf, &numRefs, 4); + + // reference entries + numRefs = refData.entries_.size(); // need to reset after maybe endian-swapping + for (size_t i = 0; i < numRefs; ++i) { + auto& entry = refData.entries_[i]; + auto tId = entry.tId_; + auto beginRow = entry.beginRow_; + auto endRow = entry.endRow_; + if (bgzf->is_be) { + tId = ed_swap_4(tId); + beginRow = ed_swap_4(beginRow); + endRow = ed_swap_4(endRow); + } + bgzf_write_safe2(bgzf, &tId, 4); + bgzf_write_safe2(bgzf, &beginRow, 4); + bgzf_write_safe2(bgzf, &endRow, 4); + } + } + +private: + int32_t lastRefId_ = -1; + Position lastPos_ = -1; + std::map rawReferenceEntries_; +}; + +// TODO: come back to refseqs, sorting, etc +class PbiBuilder2 +{ + enum class FlushMode + { + FORCE, + NO_FORCE + }; + +public: + PbiBuilder2(const std::string& bamFilename, const std::string& pbiFilename, + const PbiBuilder::CompressionLevel compressionLevel, const size_t numThreads, + const size_t fileBufferSize) + // const size_t numReferenceSequences = 0 + // const bool isCoordinateSorted = false + : bamFilename_{bamFilename}, + pbiFilename_{pbiFilename}, + tempFilename_{pbiFilename + ".build"}, + tempFile_{std::fopen(tempFilename_.c_str(), "w+b")}, + compressionLevel_{compressionLevel}, + numThreads_{numThreads}, + rgIdField_{fileBufferSize}, + qStartField_{fileBufferSize}, + qEndField_{fileBufferSize}, + holeNumField_{fileBufferSize}, + readQualField_{fileBufferSize}, + ctxtField_{fileBufferSize}, + fileOffsetField_{fileBufferSize}, + tIdField_{fileBufferSize}, + tStartField_{fileBufferSize}, + tEndField_{fileBufferSize}, + aStartField_{fileBufferSize}, + aEndField_{fileBufferSize}, + revStrandField_{fileBufferSize}, + nMField_{fileBufferSize}, + nMMField_{fileBufferSize}, + mapQualField_{fileBufferSize}, + bcForwardField_{fileBufferSize}, + bcReverseField_{fileBufferSize}, + bcQualField_{fileBufferSize} + { + if (!tempFile_) + throw std::runtime_error{"IndexedBamWriter: could not open temp file: " + + tempFilename_}; + + // TODO: setup for ref data building + } + + void AddRecord(const BamRecord& b, const int64_t uOffset) + { + // ensure updated data (necessary?) + PacBio::BAM::BamRecordMemory::UpdateRecordTags(b); + b.ResetCachedPositions(); + + // store record data & maybe flush to temp file + AddBasicData(b, uOffset); + AddMappedData(b); + AddBarcodeData(b); + AddReferenceData(b, currentRow_); + FlushBuffers(FlushMode::NO_FORCE); + + ++currentRow_; + } + + void AddBasicData(const BamRecord& b, const int64_t uOffset) + { + // read group ID + const auto rgId = [&b]() -> int32_t { + auto rgIdString = b.ReadGroupBaseId(); + if (rgIdString.empty()) rgIdString = MakeReadGroupId(b.MovieName(), ToString(b.Type())); + return std::stoul(rgIdString, nullptr, 16); + }(); + + // query start/end + const auto isCcsOrTranscript = (IsCcsOrTranscript(b.Type())); + const int32_t qStart = (isCcsOrTranscript ? 0 : b.QueryStart()); + const int32_t qEnd = (isCcsOrTranscript ? b.Impl().SequenceLength() : b.QueryEnd()); + + // add'l data + const int32_t holeNum = (b.HasHoleNumber() ? b.HoleNumber() : 0); + const float readAccuracy = + (b.HasReadAccuracy() ? boost::numeric_cast(b.ReadAccuracy()) : 0.0F); + const uint8_t ctxt = (b.HasLocalContextFlags() ? b.LocalContextFlags() + : LocalContextFlags::NO_LOCAL_CONTEXT); + + // store + rgIdField_.Add(rgId); + qStartField_.Add(qStart); + qEndField_.Add(qEnd); + holeNumField_.Add(holeNum); + ctxtField_.Add(ctxt); + readQualField_.Add(readAccuracy); + fileOffsetField_.Add(uOffset); + } + + void AddMappedData(const BamRecord& b) + { + // alignment position + const auto tId = b.ReferenceId(); + const auto tStart = static_cast(b.ReferenceStart()); + const auto tEnd = static_cast(b.ReferenceEnd()); + const auto aStart = static_cast(b.AlignedStart()); + const auto aEnd = static_cast(b.AlignedEnd()); + const auto isReverseStrand = [&b]() -> uint8_t { + return (b.AlignedStrand() == Strand::REVERSE ? 1 : 0); + }(); + + // alignment quality + const auto matchData = b.NumMatchesAndMismatches(); + const auto nM = static_cast(matchData.first); + const auto nMM = static_cast(matchData.second); + const auto mapQuality = b.MapQuality(); + + if (tId >= 0) hasMappedData_ = true; + + // store + tIdField_.Add(tId); + tStartField_.Add(tStart); + tEndField_.Add(tEnd); + aStartField_.Add(aStart); + aEndField_.Add(aEnd); + revStrandField_.Add(isReverseStrand); + nMField_.Add(nM); + nMMField_.Add(nMM); + mapQualField_.Add(mapQuality); + } + + void AddBarcodeData(const BamRecord& b) + { + // initialize w/ 'missing' value + int16_t bcForward = -1; + int16_t bcReverse = -1; + int8_t bcQuality = -1; + + // check for any barcode data (both required) + if (b.HasBarcodes() && b.HasBarcodeQuality()) { + // fetch data from record + std::tie(bcForward, bcReverse) = b.Barcodes(); + bcQuality = static_cast(b.BarcodeQuality()); + + // double-check & reset to 'missing' value if any less than zero + if (bcForward < 0 && bcReverse < 0 && bcQuality < 0) { + bcForward = -1; + bcReverse = -1; + bcQuality = -1; + } else + hasBarcodeData_ = true; + } + + // store + bcForwardField_.Add(bcForward); + bcReverseField_.Add(bcReverse); + bcQualField_.Add(bcQuality); + } + + void AddReferenceData(const BamRecord& b, const uint32_t currentRow) + { + // only add if coordinate-sorted hint is set + // update with info from refDataBuilder + if (refDataBuilder_) { + const auto sorted = refDataBuilder_->AddRecord(b, currentRow); + if (!sorted) refDataBuilder_.reset(); + } + } + + void Close() + { + if (isClosed_) return; + + FlushBuffers(FlushMode::FORCE); + + OpenPbiFile(); + WritePbiHeader(); + WriteFromTempFile(); + + remove(tempFilename_.c_str()); + isClosed_ = true; + } + + void OpenPbiFile() + { + // open file handle + const auto mode = std::string("wb") + std::to_string(static_cast(compressionLevel_)); + pbiFile_.reset(bgzf_open(pbiFilename_.c_str(), mode.c_str())); + if (pbiFile_ == nullptr) + throw std::runtime_error{"IndexedBamWriter: could not open output PBI file"}; + + // if no explicit thread count given, attempt built-in check + size_t actualNumThreads = numThreads_; + if (actualNumThreads == 0) { + actualNumThreads = std::thread::hardware_concurrency(); + + // if still unknown, default to single-threaded + if (actualNumThreads == 0) actualNumThreads = 1; + } + + // if multithreading requested, enable it + if (actualNumThreads > 1) bgzf_mt(pbiFile_.get(), actualNumThreads, 256); + } + + template + void MaybeFlushBuffer(PbiField2& field, bool force) + { + // replace with lambda, in FlushBuffer(), once PPA can use C++14 ? + if (field.IsFull() || force) { + WriteToTempFile(field); + field.buffer_.clear(); + } + } + + void FlushBuffers(FlushMode mode) + { + const auto force = (mode == FlushMode::FORCE); + + MaybeFlushBuffer(rgIdField_, force); + MaybeFlushBuffer(qStartField_, force); + MaybeFlushBuffer(qEndField_, force); + MaybeFlushBuffer(holeNumField_, force); + MaybeFlushBuffer(readQualField_, force); + MaybeFlushBuffer(ctxtField_, force); + MaybeFlushBuffer(fileOffsetField_, force); + + MaybeFlushBuffer(tIdField_, force); + MaybeFlushBuffer(tStartField_, force); + MaybeFlushBuffer(tEndField_, force); + MaybeFlushBuffer(aStartField_, force); + MaybeFlushBuffer(aEndField_, force); + MaybeFlushBuffer(revStrandField_, force); + MaybeFlushBuffer(nMField_, force); + MaybeFlushBuffer(nMMField_, force); + MaybeFlushBuffer(mapQualField_, force); + + MaybeFlushBuffer(bcForwardField_, force); + MaybeFlushBuffer(bcReverseField_, force); + MaybeFlushBuffer(bcQualField_, force); + } + + template + void LoadFieldBlockFromTempFile(PbiField2& field, const PbiFieldBlock2& block) + { + // seek to block begin + const auto ret = std::fseek(tempFile_.get(), block.pos_, SEEK_SET); + if (ret != 0) + throw std::runtime_error{"IndexedBamWriter: could not seek in temp file: " + + tempFilename_ + ", offset: " + std::to_string(block.pos_)}; + + // read block elements + field.buffer_.assign(block.n_, 0); + const auto numElements = + std::fread(field.buffer_.data(), sizeof(T), block.n_, tempFile_.get()); + + if (numElements != block.n_) + throw std::runtime_error{ + "IndexedBamWriter: could not read expected element count from temp file: " + + tempFilename_}; + } + + template + void WriteField(PbiField2& field) + { + for (const auto& block : field.blocks_) { + LoadFieldBlockFromTempFile(field, block); + WriteBgzfVector2(pbiFile_.get(), field.buffer_); + } + } + + void WriteFromTempFile() + { + // load from temp file, in PBI format order, and write to index + + WriteField(rgIdField_); + WriteField(qStartField_); + WriteField(qEndField_); + WriteField(holeNumField_); + WriteField(readQualField_); + WriteField(ctxtField_); + + WriteVirtualOffsets(); + + if (hasMappedData_) { + WriteField(tIdField_); + WriteField(tStartField_); + WriteField(tEndField_); + WriteField(aStartField_); + WriteField(aEndField_); + WriteField(revStrandField_); + WriteField(nMField_); + WriteField(nMMField_); + WriteField(mapQualField_); + } + + if (refDataBuilder_) WriteReferenceData(); + + if (hasBarcodeData_) { + WriteField(bcForwardField_); + WriteField(bcReverseField_); + WriteField(bcQualField_); + } + } + + template + void WriteToTempFile(PbiField2& field) + { + if (field.buffer_.empty()) return; + + const auto pos = std::ftell(tempFile_.get()); + const auto numElements = + std::fwrite(field.buffer_.data(), sizeof(T), field.buffer_.size(), tempFile_.get()); + field.blocks_.emplace_back(PbiFieldBlock2{pos, numElements}); + } + + void WritePbiHeader() + { + BGZF* bgzf = pbiFile_.get(); + + // 'magic' string + static constexpr const std::array magic{{'P', 'B', 'I', '\1'}}; + bgzf_write_safe2(bgzf, magic.data(), 4); + + PbiFile::Sections sections = PbiFile::BASIC; + if (hasMappedData_) sections |= PbiFile::MAPPED; + if (hasBarcodeData_) sections |= PbiFile::BARCODE; + if (refDataBuilder_) sections |= PbiFile::REFERENCE; + + // version, pbi_flags, & n_reads + auto version = static_cast(PbiFile::CurrentVersion); + uint16_t pbi_flags = sections; + auto numReads = currentRow_; + if (bgzf->is_be) { + version = ed_swap_4(version); + pbi_flags = ed_swap_2(pbi_flags); + numReads = ed_swap_4(numReads); + } + bgzf_write_safe2(bgzf, &version, 4); + bgzf_write_safe2(bgzf, &pbi_flags, 2); + bgzf_write_safe2(bgzf, &numReads, 4); + + // reserved space + char reserved[18]; + memset(reserved, 0, 18); + bgzf_write_safe2(bgzf, reserved, 18); + } + + void WriteReferenceData() { refDataBuilder_->WriteData(pbiFile_.get()); } + + std::vector LoadGzi() + { + // + // Open GZI file & load its contents. About to use for offset transformation. + // + + const std::string gziFn{bamFilename_ + ".gzi"}; + std::unique_ptr gziFile{fopen(gziFn.c_str(), "rb")}; + if (!gziFile) throw std::runtime_error{"IndexedBamWriter: could not open gzi file"}; + + uint64_t numElements; + const auto ret = fread(&numElements, sizeof(numElements), 1, gziFile.get()); + if (ret != 1) throw std::runtime_error{"IndexedBamWriter: could not read from gziFile"}; + if (ed_is_big()) ed_swap_8(numElements); + + std::vector result; + result.reserve(numElements); + for (uint32_t i = 0; i < numElements; ++i) { + GzIndexEntry entry; + fread(&entry.vAddress, sizeof(entry.vAddress), 1, gziFile.get()); + fread(&entry.uAddress, sizeof(entry.uAddress), 1, gziFile.get()); + if (ed_is_big()) { + ed_swap_8(entry.vAddress); + ed_swap_8(entry.uAddress); + } + result.push_back(std::move(entry)); + } + return result; + } + + void WriteVirtualOffsets() + { + auto index = LoadGzi(); + if (index.empty()) throw std::runtime_error{"IndexedBamWriter: empty GZI file"}; + std::sort(index.begin(), index.end(), + [](const GzIndexEntry& lhs, const GzIndexEntry& rhs) -> bool { + return lhs.uAddress < rhs.uAddress; + }); + + size_t k = 0; + for (const auto& block : fileOffsetField_.blocks_) { + LoadFieldBlockFromTempFile(fileOffsetField_, block); + + // transform offsets from GZI + for (size_t j = 0; j < fileOffsetField_.buffer_.size(); ++j) { + while ((k < index.size() - 1) && (static_cast(index.at(k + 1).uAddress) <= + fileOffsetField_.buffer_[j])) { + ++k; + } + const GzIndexEntry& e = index.at(k); + const int64_t uOffset = fileOffsetField_.buffer_[j] - e.uAddress; + const auto result = ((e.vAddress << 16) | uOffset); + fileOffsetField_.buffer_[j] = result; + } + WriteBgzfVector2(pbiFile_.get(), fileOffsetField_.buffer_); + } + } + +private: + // file info + std::string bamFilename_; + std::string pbiFilename_; + std::string tempFilename_; + std::unique_ptr tempFile_; + std::unique_ptr pbiFile_; + PbiBuilder::CompressionLevel compressionLevel_; + size_t numThreads_; + + // PBI field buffers + PbiField2 rgIdField_; + PbiField2 qStartField_; + PbiField2 qEndField_; + PbiField2 holeNumField_; + PbiField2 readQualField_; + PbiField2 ctxtField_; + PbiField2 fileOffsetField_; + PbiField2 tIdField_; + PbiField2 tStartField_; + PbiField2 tEndField_; + PbiField2 aStartField_; + PbiField2 aEndField_; + PbiField2 revStrandField_; + PbiField2 nMField_; + PbiField2 nMMField_; + PbiField2 mapQualField_; + PbiField2 bcForwardField_; + PbiField2 bcReverseField_; + PbiField2 bcQualField_; + + // reference data + std::unique_ptr refDataBuilder_; + + // tracking data + uint32_t currentRow_ = 0; + bool isClosed_ = false; + bool hasBarcodeData_ = false; + bool hasMappedData_ = false; +}; + +} // namespace internal + +class IndexedBamWriter::IndexedBamWriterPrivate2 //: public internal::FileProducer +{ +public: + IndexedBamWriterPrivate2(const std::string& outputFilename, std::shared_ptr header, + const BamWriter::CompressionLevel bamCompressionLevel, + const size_t numBamThreads, + const PbiBuilder::CompressionLevel pbiCompressionLevel, + const size_t numPbiThreads, const size_t numGziThreads, + const size_t tempFileBufferSize) + : bamFilename_{outputFilename}, header_{header} + { + OpenBam(bamCompressionLevel, numBamThreads); + OpenGzi(numGziThreads); + OpenPbi(pbiCompressionLevel, numPbiThreads, tempFileBufferSize); + + isOpen_ = true; + } + + ~IndexedBamWriterPrivate2() noexcept + { + if (isOpen_) { + try { + Close(); + } catch (...) { + // swallow any exceptions & remain no-throw from dtor + } + } + } + + void Close() + { + // NOTE: keep this order of closing ( BAM -> GZI -> PBI ) + CloseBam(); + CloseGzi(); + ClosePbi(); + + remove(std::string{bamFilename_ + ".gzi"}.c_str()); + isOpen_ = false; + } + + void CloseBam() + { + const auto ret = bgzf_flush(bam_.get()->fp.bgzf); + UNUSED(ret); + bam_.reset(); + } + + void CloseGzi() + { + done_ = true; + gziThread_.join(); + + // TODO: remove GZI file, leaving now for debubging + } + + void ClosePbi() { builder_->Close(); } + + void OpenBam(const BamWriter::CompressionLevel compressionLevel, const size_t numThreads) + { + // + // TODO: Compression level & numThreads are hardcoded here. Ok for + // prototyping but need to be tune-able via API. + // + + if (!header_) + throw std::runtime_error{"IndexedBamWriter: null header provided for output file: " + + bamFilename_}; + + // open output BAM + const auto usingFilename = bamFilename_; + const auto mode = std::string("wb") + std::to_string(static_cast(compressionLevel)); + bam_.reset(sam_open(usingFilename.c_str(), mode.c_str())); + if (!bam_) + throw std::runtime_error{"IndexedBamWriter: could not open file for writing: " + + usingFilename}; + + // maybe set multithreaded writing + size_t actualNumThreads = numThreads; + if (actualNumThreads == 0) { + actualNumThreads = std::thread::hardware_concurrency(); + + // if still unknown, default to single-threaded + if (actualNumThreads == 0) actualNumThreads = 1; + } + if (actualNumThreads > 1) hts_set_threads(bam_.get(), actualNumThreads); + + // write header + auto ret = sam_hdr_write(bam_.get(), header_.get()); + if (ret != 0) + throw std::runtime_error{"IndexedBamWriter: could not write header to file: " + + usingFilename}; + ret = bgzf_flush(bam_.get()->fp.bgzf); + + // store file positions after header + auto headerLength = [](const bam_hdr_t* hdr) -> size_t { + const size_t textHeader = 12 + hdr->l_text; + size_t refHeader = 0; + for (int i = 0; i < hdr->n_targets; ++i) { + char* n = hdr->target_name[i]; + refHeader += (8 + (strlen(n) + 1)); + } + return textHeader + refHeader; + }; + uncompressedFilePos_ = headerLength(header_.get()); + } + + void OpenGzi(size_t numThreads) + { + size_t actualNumThreads = numThreads; + if (actualNumThreads == 0) { + actualNumThreads = std::thread::hardware_concurrency(); + + // if still unknown, default to single-threaded + if (actualNumThreads == 0) actualNumThreads = 1; + } + gziThread_ = std::thread{&IndexedBamWriterPrivate2::RunGziThread, this, actualNumThreads}; + } + + void OpenPbi(const PbiBuilder::CompressionLevel compressionLevel, const size_t numThreads, + const size_t fileBufferSize) + { + builder_ = std::make_unique( + bamFilename_, bamFilename_ + ".pbi", compressionLevel, numThreads, fileBufferSize); + } + + void RunGziThread(size_t numThreads) + { + // + // This thread is the GZI index-enabled reader that trails the writer + // thread(s). It checks for changes in the output BAM's file size & + // reads whatever data is available. When writing is complete, it reads + // anything that might remain & dumps the GZI index contents to disk. + // This index is used downstream to generate records' "virtual offsets". + // + + const auto& bamFilename = bamFilename_; + std::unique_ptr bgzf; + + struct stat st; + int ret = 0; + int64_t lastFileSize = 0; + int64_t numBytesRead = 0; + + auto initBgzf = [&bgzf, &bamFilename, numThreads]() { + bgzf.reset(bgzf_open(bamFilename.c_str(), "rb")); + if (!bgzf) + throw std::runtime_error{ + "IndexedBamWriter: could not open BAM for 'toy train' reading"}; + bgzf_index_build_init(bgzf.get()); + if (numThreads > 1) bgzf_mt(bgzf.get(), numThreads, 256); + }; + + // main thread loop + while (true) { + // Quit if writer thread(s) are finished. + if (done_) break; + + if (stat(bamFilename.c_str(), &st) != 0) { + gziStatus_ = GziStatus::MISC_ERROR; + return; + } + if (st.st_size > lastFileSize) { + lastFileSize = st.st_size; + } else { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + continue; + } + + // Don't read unless we can guarantee we won't catch up to the end of the file. + // Otherwise htslib will think the file has been truncated and throw errors. + // This is a touch tricky because we're reading in multi-thread mode so htslib + // will speculatively start grabbing blocks. So we're going to stay *well* behind + // This needs be made more robust. + // + // Note: It's worth noting that bgzf->block_clength might only be the length of the + // compressed *payload*, meaning if there is any other header/metadata/etc on disk + // in the actual file, our estimation of our trailing distance might be off. If + // this ever starts throwing exceptions we'll have to look more in to this... + while (lastFileSize - numBytesRead > 100 * BGZF_MAX_BLOCK_SIZE) { + // Open BAM reader if not already open. Need to make sure we don't open it + // until we've already established our trailing distance. + if (!bgzf) initBgzf(); + + auto result = bgzf_read_block(bgzf.get()); + if (result != 0) { + gziStatus_ = GziStatus::IO_ERROR; + return; + } + if (bgzf->block_length == 0) { + gziStatus_ = GziStatus::TRAIL_ERROR; + return; + } + numBytesRead += bgzf->block_clength; + } + + // Only update if thigs have appreciably fallen behind + if (lastFileSize - numBytesRead > 1.10 * maxTrailingDistance_) + maxTrailingDistance_ = lastFileSize - numBytesRead; + } + + // Try to open BAM if it wasn't opened in main loop. + if (!bgzf) initBgzf(); + + // Read any remaining data. + while (true) { + auto result = bgzf_read_block(bgzf.get()); + if (result != 0) { + gziStatus_ = GziStatus::IO_ERROR; + return; + } + if (bgzf->block_length == 0) break; + } + + // Dump GZI contents to disk. + const std::string gziFn{bamFilename_ + ".gzi"}; + ret = bgzf_index_dump(bgzf.get(), gziFn.c_str(), nullptr); + if (ret != 0) gziStatus_ = GziStatus::GZI_ERROR; + } + + void Write(const BamRecord& record) + { +// TODO: add API to auto-skip this without special compile flag +#if PBBAM_AUTOVALIDATE + Validator::Validate(record); +#endif + // add record & its to index builder. + // + // NOTE: This is the record's postiion as if it were _uncompressed_. We + // will return with GZI data later to transform it into BAM + // "virtual offset". + // + builder_->AddRecord(record, uncompressedFilePos_); + + const auto rawRecord = BamRecordMemory::GetRawData(record); + + // update bin + // min_shift=14 & n_lvls=5 are BAM "magic numbers" + rawRecord->core.bin = hts_reg2bin(rawRecord->core.pos, bam_endpos(rawRecord.get()), 14, 5); + + // write record to file + const auto ret = sam_write1(bam_.get(), header_.get(), rawRecord.get()); + if (ret <= 0) throw std::runtime_error{"IndexedBamWriter: could not write record to BAM"}; + + // update file position + auto recordLength = [](bam1_t* b) { + auto* c = &b->core; + + static constexpr size_t fixedLength = 36; + const size_t qnameLength = (c->l_qname - c->l_extranul); + + // TODO: long CIGAR handling... sigh... + + size_t remainingLength = 0; + if (c->n_cigar <= 0xffff) + remainingLength = (b->l_data - c->l_qname); + else { + const size_t cigarEnd = ((uint8_t*)bam_get_cigar(b) - b->data) + (c->n_cigar * 4); + remainingLength = 8 + (b->l_data - cigarEnd) + 4 + (4 * c->n_cigar); + } + + return fixedLength + qnameLength + remainingLength; + }; + uncompressedFilePos_ += recordLength(rawRecord.get()); + + // Need to handle any errors from the gzi thread, since it's not set + // up to throw without terminating the program + auto gstatus = gziStatus_.load(); + if (gstatus != GziStatus::GOOD) { + if (gziStatus_.load() == GziStatus::IO_ERROR) + throw std::runtime_error( + "IndexedBamWriter: error in gzi thread reading from BAM file " + bamFilename_); + if (gziStatus_.load() == GziStatus::TRAIL_ERROR) + throw std::runtime_error( + "IndexedBamWriter: gzi reader thread failed to properly trail when reading " + + bamFilename_); + if (gziStatus_.load() == GziStatus::GZI_ERROR) + throw std::runtime_error( + "IndexedBamWriter: could not dump GZI contents for indexing " + bamFilename_); + if (gziStatus_.load() == GziStatus::MISC_ERROR) + throw std::runtime_error("IndexedBamWriter: error computing index file for " + + bamFilename_); + gziStatus_.store(GziStatus::DEAD); + } + } + + size_t MaxReaderLag() const { return maxTrailingDistance_; } + +private: + std::string bamFilename_; + + std::shared_ptr header_; + std::unique_ptr bam_; + std::unique_ptr builder_; + + // used as a type of error return code for the gziThread, so + // that errors are delayed until at least the bam file is + // safely written to disk + enum class GziStatus + { + GOOD, + IO_ERROR, + TRAIL_ERROR, + GZI_ERROR, + MISC_ERROR, + // There was an error, but we've bubbled up the + // information already + DEAD + }; + std::atomic gziStatus_{GziStatus::GOOD}; + std::thread gziThread_; + + bool isOpen_ = false; + + std::atomic done_{false}; + std::atomic maxTrailingDistance_{0}; + + int64_t uncompressedFilePos_ = 0; +}; + +IndexedBamWriter::IndexedBamWriter(const std::string& outputFilename, const BamHeader& header, + const BamWriter::CompressionLevel bamCompressionLevel, + const size_t numBamThreads, + const PbiBuilder::CompressionLevel pbiCompressionLevel, + const size_t numPbiThreads, const size_t numGziThreads, + const size_t tempFileBufferSize) + : IRecordWriter(), d_{nullptr} +{ + if (tempFileBufferSize % 8 != 0) + throw std::runtime_error{"IndexedBamWriter: invalid buffer size for PBI builder (" + + std::to_string(tempFileBufferSize) + + "). Must be a multiple of 8."}; + +#if PBBAM_AUTOVALIDATE + Validator::Validate(header); +#endif + d_ = std::make_unique( + outputFilename, BamHeaderMemory::MakeRawHeader(header), bamCompressionLevel, numBamThreads, + pbiCompressionLevel, numPbiThreads, numGziThreads, tempFileBufferSize); +} + +IndexedBamWriter::IndexedBamWriter(IndexedBamWriter&&) = default; + +IndexedBamWriter& IndexedBamWriter::operator=(IndexedBamWriter&&) = default; + +IndexedBamWriter::~IndexedBamWriter() = default; + +void IndexedBamWriter::TryFlush() {} // ignore + +void IndexedBamWriter::Write(const BamRecord& record) { d_->Write(record); } + +void IndexedBamWriter::Write(const BamRecordImpl& record) { d_->Write(BamRecord{record}); } + +size_t IndexedBamWriter::MaxReaderLag() const { return d_->MaxReaderLag(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/IndexedFastaReader.cpp b/src/IndexedFastaReader.cpp new file mode 100644 index 0000000..a31c8fc --- /dev/null +++ b/src/IndexedFastaReader.cpp @@ -0,0 +1,244 @@ +// File Description +/// \file IndexedFastaReader.cpp +/// \brief Implements the IndexedFastaReader class. +// +// Author: David Alexander + +#include "PbbamInternalConfig.h" + +#include "pbbam/IndexedFastaReader.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "SequenceUtils.h" +#include "pbbam/BamRecord.h" +#include "pbbam/GenomicInterval.h" +#include "pbbam/Orientation.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +namespace { + +void ClipAndGapify(std::string& subseq, const Cigar& cigar, bool exciseSoftClips) +{ + size_t seqIndex = 0; + for (const auto& op : cigar) { + const auto type = op.Type(); + const auto opLength = op.Length(); + + // do nothing for hard clips + if (type == CigarOperationType::HARD_CLIP) continue; + + // 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; + } + } +} + +struct FreeDeleter +{ + // Need to deallocate the returned pointer from htslib using `free()`, + // as `delete`-deallocating a pointer originally allocated with `malloc` + // constitutes undefined behavior and ASAN rightfully errors out + // with a `alloc-dealloc-mismatch` message. + // See also: + // https://github.com/samtools/htslib/blob/develop/htslib/faidx.h#L195 + void operator()(char* p) const { std::free(p); } +}; + +void RequireFaidxLoaded(faidx_t* handle, const std::string& fn) +{ + // TODO(DB): Refactor to eliminate Close(), no need for repeated checking. + // Keeping for now for current API compatibility. + if (handle == nullptr) + throw std::runtime_error{"IndexedFastaReader: missing *.fai for file: " + fn}; +} + +} // anonymous + +IndexedFastaReader::IndexedFastaReader(const std::string& filename) +{ + Open(filename); + RequireFaidxLoaded(handle_, filename); +} + +IndexedFastaReader::IndexedFastaReader(const IndexedFastaReader& src) +{ + Open(src.filename_); + RequireFaidxLoaded(handle_, filename_); +} + +IndexedFastaReader::IndexedFastaReader(IndexedFastaReader&&) = default; + +IndexedFastaReader& IndexedFastaReader::operator=(const IndexedFastaReader& rhs) +{ + if (&rhs == this) return *this; + + Open(rhs.filename_); + RequireFaidxLoaded(handle_, filename_); + return *this; +} + +IndexedFastaReader& IndexedFastaReader::operator=(IndexedFastaReader&&) = default; + +IndexedFastaReader::~IndexedFastaReader() { Close(); } + +bool IndexedFastaReader::Open(std::string filename) +{ + auto* handle = fai_load(filename.c_str()); + if (handle == nullptr) + return false; + else { + filename_ = std::move(filename); + handle_ = handle; + return true; + } +} + +void IndexedFastaReader::Close() +{ + filename_.clear(); + if (handle_ != nullptr) fai_destroy(handle_); + handle_ = nullptr; +} + +std::string IndexedFastaReader::Subsequence(const std::string& id, Position begin, + Position end) const +{ + RequireFaidxLoaded(handle_, filename_); + + assert(begin <= end); + // htslib is dumb and will not consider empty intervals valid, + // that is, a call to faidx_fetch_seq will *always* return a + // sequence consisting of at least one base. + if (begin == end) return std::string{}; + + 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? + const std::unique_ptr rawSeq{ + faidx_fetch_seq(handle_, id.c_str(), begin, end - 1, &len)}; + if (rawSeq == nullptr) { + std::ostringstream s; + s << "IndexedFastaReader: could not fetch FASTA sequence from region: " << id << " [" + << begin << ", " << end << ')'; + throw std::runtime_error{s.str()}; + } + return RemoveAllWhitespace(rawSeq.get()); +} + +std::string IndexedFastaReader::Subsequence(const GenomicInterval& interval) const +{ + RequireFaidxLoaded(handle_, filename_); + return Subsequence(interval.Name(), interval.Start(), interval.Stop()); +} + +std::string IndexedFastaReader::Subsequence(const char* htslibRegion) const +{ + RequireFaidxLoaded(handle_, filename_); + + int len; + const std::unique_ptr rawSeq(fai_fetch(handle_, htslibRegion, &len)); + if (rawSeq == nullptr) { + throw std::runtime_error{ + "IndexedFastaReader: could not fetch FASTA sequence from region: " + + std::string{htslibRegion}}; + } + return RemoveAllWhitespace(rawSeq.get()); +} + +std::string IndexedFastaReader::ReferenceSubsequence(const BamRecord& bamRecord, + const Orientation orientation, + const bool gapped, + const bool exciseSoftClips) const +{ + RequireFaidxLoaded(handle_, filename_); + std::string subseq = Subsequence(bamRecord.ReferenceName(), bamRecord.ReferenceStart(), + bamRecord.ReferenceEnd()); + + if (bamRecord.Impl().IsMapped() && gapped) + ClipAndGapify(subseq, bamRecord.Impl().CigarData(), exciseSoftClips); + + const auto reverse = + (orientation != Orientation::GENOMIC) && bamRecord.Impl().IsReverseStrand(); + if (reverse) ReverseComplementCaseSens(subseq); + + return subseq; +} + +int IndexedFastaReader::NumSequences() const +{ + RequireFaidxLoaded(handle_, filename_); + return faidx_nseq(handle_); +} + +std::vector IndexedFastaReader::Names() const +{ + RequireFaidxLoaded(handle_, filename_); + std::vector names; + names.reserve(NumSequences()); + for (int i = 0; i < NumSequences(); ++i) + names.emplace_back(faidx_iseq(handle_, i)); + return names; +} + +std::string IndexedFastaReader::Name(const size_t idx) const +{ + RequireFaidxLoaded(handle_, filename_); + if (static_cast(idx) >= NumSequences()) { + std::ostringstream s; + s << "IndexedFastaReader: cannot fetch sequence name. Index (" << idx + << ") is larger than the number of sequences: (" << NumSequences() << ')'; + throw std::runtime_error{s.str()}; + } + return {faidx_iseq(handle_, idx)}; +} + +bool IndexedFastaReader::HasSequence(const std::string& name) const +{ + RequireFaidxLoaded(handle_, filename_); + return (faidx_has_seq(handle_, name.c_str()) != 0); +} + +int IndexedFastaReader::SequenceLength(const std::string& name) const +{ + RequireFaidxLoaded(handle_, filename_); + const auto len = faidx_seq_len(handle_, name.c_str()); + if (len < 0) + throw std::runtime_error{"IndexedFastaReader: could not determine sequence length of " + + name}; + else + return len; +} +} +} // PacBio::BAM diff --git a/src/MD5.cpp b/src/MD5.cpp new file mode 100644 index 0000000..6be55a2 --- /dev/null +++ b/src/MD5.cpp @@ -0,0 +1,54 @@ +// File Description +/// \file MD5.cpp +/// \brief Implements basic MD5 hash utilities +// +// Author: Brett Bowman + +#include "PbbamInternalConfig.h" + +#include "pbbam/MD5.h" + +#include + +#include + +namespace PacBio { +namespace BAM { + +class Md5ContextHelper +{ +public: + Md5ContextHelper() : data_(hts_md5_init()) + { + if (data_ == nullptr) throw std::runtime_error{"MD5: could not initialize context"}; + } + + ~Md5ContextHelper() { hts_md5_destroy(data_); } + + std::string Encoded(const std::string& str) + { + hts_md5_update(data_, reinterpret_cast(const_cast(str.c_str())), str.size()); + + unsigned char digest[16]; + hts_md5_final(digest, data_); + + char hexdigest[33]; // leave space for null-term + hts_md5_hex(hexdigest, digest); + + return std::string{hexdigest, 32}; + } + +private: + hts_md5_context* data_; +}; + +/// \brief MD5 hash of a string as a 32-digit hexadecimal string +/// +std::string MD5Hash(const std::string& str) +{ + Md5ContextHelper md5; + return md5.Encoded(str); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/MemoryUtils.cpp b/src/MemoryUtils.cpp new file mode 100644 index 0000000..9be40a8 --- /dev/null +++ b/src/MemoryUtils.cpp @@ -0,0 +1,40 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "MemoryUtils.h" + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +BamHeader BamHeaderMemory::FromRawData(bam_hdr_t* hdr) +{ + // null input - error + if (hdr == nullptr) throw std::runtime_error{"MemoryUtils: null BAM header"}; + + // empty text input - ok + if (hdr->text == nullptr || hdr->l_text == 0) return BamHeader(); + + // parse normal SAM text input + return BamHeader(std::string(hdr->text, hdr->l_text)); +} + +std::shared_ptr BamHeaderMemory::MakeRawHeader(const BamHeader& header) +{ + const std::string text = header.ToSam(); + std::shared_ptr rawData(sam_hdr_parse(text.size(), text.c_str()), + HtslibHeaderDeleter()); + rawData->ignore_sam_err = 0; + rawData->cigar_tab = nullptr; + rawData->l_text = text.size(); + rawData->text = static_cast(calloc(rawData->l_text + 1, 1)); + memcpy(rawData->text, text.c_str(), rawData->l_text); + return rawData; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/MemoryUtils.h b/src/MemoryUtils.h new file mode 100644 index 0000000..b82d8b7 --- /dev/null +++ b/src/MemoryUtils.h @@ -0,0 +1,139 @@ +// Author: Derek Barnett + +#ifndef MEMORYUTILS_H +#define MEMORYUTILS_H + +#include +#include + +#include +#include + +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/BamRecordImpl.h" +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +class BamHeader; + +// intended for use with std::shared_ptr, std::unique_ptr, etc + +struct FileDeleter +{ + void operator()(std::FILE* fp) const + { + if (fp) std::fclose(fp); + fp = nullptr; + } +}; + +struct HtslibBgzfDeleter +{ + void operator()(BGZF* bgzf) const + { + if (bgzf) bgzf_close(bgzf); + bgzf = nullptr; + } +}; + +struct HtslibFileDeleter +{ + void operator()(samFile* file) const + { + if (file) sam_close(file); + file = nullptr; + } +}; + +struct HtslibHeaderDeleter +{ + void operator()(bam_hdr_t* hdr) const + { + if (hdr) bam_hdr_destroy(hdr); + hdr = nullptr; + } +}; + +struct HtslibIndexDeleter +{ + void operator()(hts_idx_t* index) const + { + if (index) hts_idx_destroy(index); + index = nullptr; + } +}; + +struct HtslibIteratorDeleter +{ + void operator()(hts_itr_t* iter) const + { + if (iter) hts_itr_destroy(iter); + iter = nullptr; + } +}; + +struct HtslibRecordDeleter +{ + void operator()(bam1_t* b) const + { + if (b) bam_destroy1(b); + b = nullptr; + } +}; + +class BamHeaderMemory +{ +public: + static BamHeader FromRawData(bam_hdr_t* header); + static std::shared_ptr MakeRawHeader(const BamHeader& header); +}; + +class BamRecordMemory +{ +public: + static const BamRecordImpl& GetImpl(const BamRecord& r); + static const BamRecordImpl& GetImpl(const BamRecord* r); + static std::shared_ptr GetRawData(const BamRecord& r); + static std::shared_ptr GetRawData(const BamRecord* r); + static std::shared_ptr GetRawData(const BamRecordImpl& impl); + static std::shared_ptr GetRawData(const BamRecordImpl* impl); + + static void UpdateRecordTags(const BamRecord& r); + static void UpdateRecordTags(const BamRecordImpl& r); +}; + +inline const BamRecordImpl& BamRecordMemory::GetImpl(const BamRecord& r) { return r.impl_; } + +inline const BamRecordImpl& BamRecordMemory::GetImpl(const BamRecord* r) { return r->impl_; } + +inline std::shared_ptr BamRecordMemory::GetRawData(const BamRecord& r) +{ + return GetRawData(r.impl_); +} + +inline std::shared_ptr BamRecordMemory::GetRawData(const BamRecord* r) +{ + return GetRawData(r->impl_); +} + +inline std::shared_ptr BamRecordMemory::GetRawData(const BamRecordImpl& impl) +{ + return impl.d_; +} + +inline std::shared_ptr BamRecordMemory::GetRawData(const BamRecordImpl* impl) +{ + return impl->d_; +} + +inline void BamRecordMemory::UpdateRecordTags(const BamRecord& r) { UpdateRecordTags(r.impl_); } + +inline void BamRecordMemory::UpdateRecordTags(const BamRecordImpl& r) { r.UpdateTagMap(); } + +} // namespace BAM +} // namespace PacBio + +#endif // MEMORYUTILS_H diff --git a/src/PbbamInternalConfig.h b/src/PbbamInternalConfig.h new file mode 100644 index 0000000..340b97d --- /dev/null +++ b/src/PbbamInternalConfig.h @@ -0,0 +1,18 @@ +// File Description +/// \file PbbamInternalConfig.h +/// \brief Defines internal macros for symbol visibility +// +// Author: Derek Barnett + +#ifndef PBBAMINTERNALCONFIG_H +#define PBBAMINTERNALCONFIG_H + +#if defined(WIN32) +#define PBBAM_EXPORT __declspec(dllexport) +#else +#define PBBAM_EXPORT __attribute__((visibility("default"))) +#endif + +#include "pbbam/Config.h" + +#endif // PBBAMINTERNALCONFIG_H diff --git a/src/PbiBuilder.cpp b/src/PbiBuilder.cpp new file mode 100644 index 0000000..cd1abed --- /dev/null +++ b/src/PbiBuilder.cpp @@ -0,0 +1,661 @@ +// File Description +/// \file PbiBuilder.cpp +/// \brief Implements the PbiBuilder class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiBuilder.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "MemoryUtils.h" +#include "pbbam/BamRecord.h" +#include "pbbam/BamRecordImpl.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiRawData.h" +#include "pbbam/RecordType.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +template +inline void SwapEndianness(std::vector& 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{"PbiBuilder: unsupported element size (" + + std::to_string(elementSize) + ")"}; + } +} + +void bgzf_write_safe(BGZF* fp, const void* data, size_t length) +{ + const auto ret = bgzf_write(fp, data, length); + if (ret < 0L) + throw std::runtime_error{ + "PbiBuilder: non-zero returned from bgzf_write(). Out of disk space?"}; +} + +template +inline void WriteBgzfVector(BGZF* fp, std::vector& data) +{ + assert(fp); + if (fp->is_be) SwapEndianness(data); + bgzf_write_safe(fp, &data[0], data.size() * sizeof(T)); +} + +struct PbiFieldBlock +{ + int64_t pos_; // file position of block start + size_t n_; // number of entries in block +}; + +template +class PbiField +{ + constexpr static const size_t ElementSize = sizeof(T); + +public: + PbiField(size_t maxBufferSize) : maxElementCount_{maxBufferSize / ElementSize} + { + buffer_.reserve(maxElementCount_); + } + + void Add(T value) { buffer_.push_back(value); } + bool IsFull() const { return buffer_.size() == maxElementCount_; } + + size_t maxElementCount_; + std::vector buffer_; + std::vector blocks_; +}; +// -------------------------- +// PbiReferenceDataBuilder +// -------------------------- + +class PbiReferenceDataBuilder +{ +public: + using ReferenceRows = std::pair; // [startRow, endRow) + + explicit PbiReferenceDataBuilder(const size_t numReferenceSequences); + + bool AddRecord(const BamRecord& record, const int32_t rowNumber); + + PbiRawReferenceData Result() const; + + void WriteData(BGZF* bgzf); + +private: + int32_t lastRefId_ = -1; + Position lastPos_ = -1; + std::map rawReferenceEntries_; +}; + +PbiReferenceDataBuilder::PbiReferenceDataBuilder(const size_t numReferenceSequences) +{ + // initialize with number of references we expect to see + // + // we can add more later, but want to ensure known references have an entry + // even if no records are observed mapping to it + // + for (size_t i = 0; i < numReferenceSequences; ++i) + rawReferenceEntries_[i] = PbiReferenceEntry(i); + + // also create an "unmapped" entry + rawReferenceEntries_[PbiReferenceEntry::UNMAPPED_ID] = PbiReferenceEntry{}; +} + +bool PbiReferenceDataBuilder::AddRecord(const BamRecord& record, const int32_t 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_.at(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_.at(static_cast(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_.at(static_cast(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 PbiReferenceDataBuilder::Result() 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()); + for (const auto& entry : rawReferenceEntries_) + result.entries_.push_back(entry.second); + return result; +} + +void PbiReferenceDataBuilder::WriteData(BGZF* bgzf) +{ + const auto refData = Result(); + + // num_refs + uint32_t numRefs = refData.entries_.size(); + if (bgzf->is_be) numRefs = ed_swap_4(numRefs); + internal::bgzf_write_safe(bgzf, &numRefs, 4); + + // reference entries + numRefs = refData.entries_.size(); // need to reset after maybe endian-swapping + for (size_t i = 0; i < numRefs; ++i) { + auto& entry = refData.entries_[i]; + auto tId = entry.tId_; + auto beginRow = entry.beginRow_; + auto endRow = entry.endRow_; + if (bgzf->is_be) { + tId = ed_swap_4(tId); + beginRow = ed_swap_4(beginRow); + endRow = ed_swap_4(endRow); + } + internal::bgzf_write_safe(bgzf, &tId, 4); + internal::bgzf_write_safe(bgzf, &beginRow, 4); + internal::bgzf_write_safe(bgzf, &endRow, 4); + } +} + +} // namespace internal + +// -------------------------------------------- +// PbiBuilderPrivate - builder implementation +// -------------------------------------------- + +// TODO: Come back to refseqs, sorting, etc + +// TODO: We **NEED** to sync this up with the builder in IndexedBamWriter. They +// differ slightly but should be shareable. + +class PbiBuilder::PbiBuilderPrivate +{ + enum class FlushMode + { + FORCE, + NO_FORCE + }; + + // TODO: Make this tweak-able, a la IndexedBamWriter's buffers + constexpr static const size_t MaxBufferSize = 0x10000; + +public: + PbiBuilderPrivate(const std::string& pbiFilename, const size_t numReferenceSequences, + const bool isCoordinateSorted, + const PbiBuilder::CompressionLevel compressionLevel, const size_t numThreads) + : pbiFilename_{pbiFilename} + , tempFilename_{pbiFilename + ".build"} + , tempFile_{std::fopen(tempFilename_.c_str(), "w+b")} + , compressionLevel_{compressionLevel} + , numThreads_{numThreads} + , rgIdField_{MaxBufferSize} + , qStartField_{MaxBufferSize} + , qEndField_{MaxBufferSize} + , holeNumField_{MaxBufferSize} + , readQualField_{MaxBufferSize} + , ctxtField_{MaxBufferSize} + , fileOffsetField_{MaxBufferSize} + , tIdField_{MaxBufferSize} + , tStartField_{MaxBufferSize} + , tEndField_{MaxBufferSize} + , aStartField_{MaxBufferSize} + , aEndField_{MaxBufferSize} + , revStrandField_{MaxBufferSize} + , nMField_{MaxBufferSize} + , nMMField_{MaxBufferSize} + , mapQualField_{MaxBufferSize} + , bcForwardField_{MaxBufferSize} + , bcReverseField_{MaxBufferSize} + , bcQualField_{MaxBufferSize} + { + if (!tempFile_) + throw std::runtime_error{"PbiBuilder: could not open temp file: " + tempFilename_}; + + if (isCoordinateSorted && numReferenceSequences > 0) + refDataBuilder_ = + std::make_unique(numReferenceSequences); + } + + ~PbiBuilderPrivate() noexcept + { + if (!isClosed_) { + try { + Close(); + } catch (...) { + // swallow any exceptions & remain no-throw from dtor + } + } + } + + void AddRecord(const BamRecord& b, const int64_t uOffset) + { + // ensure updated data (necessary?) + PacBio::BAM::BamRecordMemory::UpdateRecordTags(b); + b.ResetCachedPositions(); + + // store record data & maybe flush to temp file + AddBasicData(b, uOffset); + AddMappedData(b); + AddBarcodeData(b); + AddReferenceData(b, currentRow_); + FlushBuffers(FlushMode::NO_FORCE); + + ++currentRow_; + } + + void AddBasicData(const BamRecord& b, const int64_t uOffset) + { + // read group ID + const auto rgId = [&b]() -> int32_t { + auto rgIdString = b.ReadGroupBaseId(); + if (rgIdString.empty()) rgIdString = MakeReadGroupId(b.MovieName(), ToString(b.Type())); + return std::stoul(rgIdString, nullptr, 16); + }(); + + // query start/end + const auto isCcsOrTranscript = (IsCcsOrTranscript(b.Type())); + const int32_t qStart = (isCcsOrTranscript ? 0 : b.QueryStart()); + const int32_t qEnd = (isCcsOrTranscript ? b.Impl().SequenceLength() : b.QueryEnd()); + + // add'l data + const int32_t holeNum = (b.HasHoleNumber() ? b.HoleNumber() : 0); + const float readAccuracy = + (b.HasReadAccuracy() ? boost::numeric_cast(b.ReadAccuracy()) : 0.0F); + const uint8_t ctxt = (b.HasLocalContextFlags() ? b.LocalContextFlags() + : LocalContextFlags::NO_LOCAL_CONTEXT); + + // store + rgIdField_.Add(rgId); + qStartField_.Add(qStart); + qEndField_.Add(qEnd); + holeNumField_.Add(holeNum); + ctxtField_.Add(ctxt); + readQualField_.Add(readAccuracy); + fileOffsetField_.Add(uOffset); + } + + void AddMappedData(const BamRecord& b) + { + // alignment position + const auto tId = b.ReferenceId(); + const auto tStart = static_cast(b.ReferenceStart()); + const auto tEnd = static_cast(b.ReferenceEnd()); + const auto aStart = static_cast(b.AlignedStart()); + const auto aEnd = static_cast(b.AlignedEnd()); + const auto isReverseStrand = [&b]() -> uint8_t { + return (b.AlignedStrand() == Strand::REVERSE ? 1 : 0); + }(); + + // alignment quality + const auto matchData = b.NumMatchesAndMismatches(); + const auto nM = static_cast(matchData.first); + const auto nMM = static_cast(matchData.second); + const auto mapQuality = b.MapQuality(); + + if (tId >= 0) hasMappedData_ = true; + + // store + tIdField_.Add(tId); + tStartField_.Add(tStart); + tEndField_.Add(tEnd); + aStartField_.Add(aStart); + aEndField_.Add(aEnd); + revStrandField_.Add(isReverseStrand); + nMField_.Add(nM); + nMMField_.Add(nMM); + mapQualField_.Add(mapQuality); + } + + void AddBarcodeData(const BamRecord& b) + { + // initialize w/ 'missing' value + int16_t bcForward = -1; + int16_t bcReverse = -1; + int8_t bcQuality = -1; + + // check for any barcode data (both required) + if (b.HasBarcodes() && b.HasBarcodeQuality()) { + // fetch data from record + std::tie(bcForward, bcReverse) = b.Barcodes(); + bcQuality = static_cast(b.BarcodeQuality()); + + // double-check & reset to 'missing' value if any less than zero + if (bcForward < 0 && bcReverse < 0 && bcQuality < 0) { + bcForward = -1; + bcReverse = -1; + bcQuality = -1; + } else + hasBarcodeData_ = true; + } + + // store + bcForwardField_.Add(bcForward); + bcReverseField_.Add(bcReverse); + bcQualField_.Add(bcQuality); + } + + void AddReferenceData(const BamRecord& b, const uint32_t currentRow) + { + // only add if coordinate-sorted hint is set + // update with info from refDataBuilder + if (refDataBuilder_) { + const auto sorted = refDataBuilder_->AddRecord(b, currentRow); + if (!sorted) refDataBuilder_.reset(); + } + } + + void Close() + { + if (isClosed_) return; + + FlushBuffers(FlushMode::FORCE); + + OpenPbiFile(); + WritePbiHeader(); + WriteFromTempFile(); + + remove(tempFilename_.c_str()); + isClosed_ = true; + } + + void OpenPbiFile() + { + // open file handle + const auto mode = std::string("wb") + std::to_string(static_cast(compressionLevel_)); + pbiFile_.reset(bgzf_open(pbiFilename_.c_str(), mode.c_str())); + if (pbiFile_ == nullptr) + throw std::runtime_error{"PbiBuilder: could not open file for writing: " + + pbiFilename_}; + + // if no explicit thread count given, attempt built-in check + size_t actualNumThreads = numThreads_; + if (actualNumThreads == 0) { + actualNumThreads = std::thread::hardware_concurrency(); + + // if still unknown, default to single-threaded + if (actualNumThreads == 0) actualNumThreads = 1; + } + + // if multithreading requested, enable it + if (actualNumThreads > 1) bgzf_mt(pbiFile_.get(), actualNumThreads, 256); + } + + template + void MaybeFlushBuffer(internal::PbiField& field, bool force) + { + // replace with lambda, in FlushBuffer(), once PPA can use C++14 ? + if (field.IsFull() || force) { + WriteToTempFile(field); + field.buffer_.clear(); + } + } + + void FlushBuffers(FlushMode mode) + { + const auto force = (mode == FlushMode::FORCE); + + MaybeFlushBuffer(rgIdField_, force); + MaybeFlushBuffer(qStartField_, force); + MaybeFlushBuffer(qEndField_, force); + MaybeFlushBuffer(holeNumField_, force); + MaybeFlushBuffer(readQualField_, force); + MaybeFlushBuffer(ctxtField_, force); + MaybeFlushBuffer(fileOffsetField_, force); + + MaybeFlushBuffer(tIdField_, force); + MaybeFlushBuffer(tStartField_, force); + MaybeFlushBuffer(tEndField_, force); + MaybeFlushBuffer(aStartField_, force); + MaybeFlushBuffer(aEndField_, force); + MaybeFlushBuffer(revStrandField_, force); + MaybeFlushBuffer(nMField_, force); + MaybeFlushBuffer(nMMField_, force); + MaybeFlushBuffer(mapQualField_, force); + + MaybeFlushBuffer(bcForwardField_, force); + MaybeFlushBuffer(bcReverseField_, force); + MaybeFlushBuffer(bcQualField_, force); + } + + template + void LoadFieldBlockFromTempFile(internal::PbiField& field, + const internal::PbiFieldBlock& block) + { + // seek to block begin + const auto ret = std::fseek(tempFile_.get(), block.pos_, SEEK_SET); + if (ret != 0) + throw std::runtime_error{"PbiBuilder: could not seek in temp file: " + tempFilename_ + + ", offset: " + std::to_string(block.pos_)}; + + // read block elements + field.buffer_.assign(block.n_, 0); + const auto numElements = + std::fread(field.buffer_.data(), sizeof(T), block.n_, tempFile_.get()); + + if (numElements != block.n_) + throw std::runtime_error{"PbiBuilder: could not read element count from temp file: " + + tempFilename_}; + } + + template + void WriteField(internal::PbiField& field) + { + for (const auto& block : field.blocks_) { + LoadFieldBlockFromTempFile(field, block); + internal::WriteBgzfVector(pbiFile_.get(), field.buffer_); + } + } + + void WriteFromTempFile() + { + // load from temp file, in PBI format order, and write to index + + WriteField(rgIdField_); + WriteField(qStartField_); + WriteField(qEndField_); + WriteField(holeNumField_); + WriteField(readQualField_); + WriteField(ctxtField_); + WriteField(fileOffsetField_); + + if (hasMappedData_) { + WriteField(tIdField_); + WriteField(tStartField_); + WriteField(tEndField_); + WriteField(aStartField_); + WriteField(aEndField_); + WriteField(revStrandField_); + WriteField(nMField_); + WriteField(nMMField_); + WriteField(mapQualField_); + } + + if (refDataBuilder_) WriteReferenceData(); + + if (hasBarcodeData_) { + WriteField(bcForwardField_); + WriteField(bcReverseField_); + WriteField(bcQualField_); + } + } + + template + void WriteToTempFile(internal::PbiField& field) + { + if (field.buffer_.empty()) return; + + const auto pos = std::ftell(tempFile_.get()); + const auto numElements = + std::fwrite(field.buffer_.data(), sizeof(T), field.buffer_.size(), tempFile_.get()); + field.blocks_.emplace_back(internal::PbiFieldBlock{pos, numElements}); + } + + void WritePbiHeader() + { + BGZF* bgzf = pbiFile_.get(); + + // 'magic' string + static constexpr const std::array magic{{'P', 'B', 'I', '\1'}}; + internal::bgzf_write_safe(bgzf, magic.data(), 4); + + PbiFile::Sections sections = PbiFile::BASIC; + if (hasMappedData_) sections |= PbiFile::MAPPED; + if (hasBarcodeData_) sections |= PbiFile::BARCODE; + if (refDataBuilder_) sections |= PbiFile::REFERENCE; + + // version, pbi_flags, & n_reads + auto version = static_cast(PbiFile::CurrentVersion); + uint16_t pbi_flags = sections; + auto numReads = currentRow_; + if (bgzf->is_be) { + version = ed_swap_4(version); + pbi_flags = ed_swap_2(pbi_flags); + numReads = ed_swap_4(numReads); + } + internal::bgzf_write_safe(bgzf, &version, 4); + internal::bgzf_write_safe(bgzf, &pbi_flags, 2); + internal::bgzf_write_safe(bgzf, &numReads, 4); + + // reserved space + char reserved[18]; + memset(reserved, 0, 18); + internal::bgzf_write_safe(bgzf, reserved, 18); + } + + void WriteReferenceData() { refDataBuilder_->WriteData(pbiFile_.get()); } + +private: + // file info + std::string bamFilename_; + std::string pbiFilename_; + std::string tempFilename_; + std::unique_ptr tempFile_; + std::unique_ptr pbiFile_; + PbiBuilder::CompressionLevel compressionLevel_; + size_t numThreads_; + + // PBI field buffers + internal::PbiField rgIdField_; + internal::PbiField qStartField_; + internal::PbiField qEndField_; + internal::PbiField holeNumField_; + internal::PbiField readQualField_; + internal::PbiField ctxtField_; + internal::PbiField fileOffsetField_; + internal::PbiField tIdField_; + internal::PbiField tStartField_; + internal::PbiField tEndField_; + internal::PbiField aStartField_; + internal::PbiField aEndField_; + internal::PbiField revStrandField_; + internal::PbiField nMField_; + internal::PbiField nMMField_; + internal::PbiField mapQualField_; + internal::PbiField bcForwardField_; + internal::PbiField bcReverseField_; + internal::PbiField bcQualField_; + + // reference data + std::unique_ptr refDataBuilder_; + + // tracking data + uint32_t currentRow_ = 0; + bool isClosed_ = false; + bool hasBarcodeData_ = false; + bool hasMappedData_ = false; +}; + +// -------------------------------------------- +// PbiBuilder - builder API +// -------------------------------------------- + +PbiBuilder::PbiBuilder(const std::string& pbiFilename, const CompressionLevel compressionLevel, + const size_t numThreads) + : PbiBuilder{pbiFilename, 0, false, compressionLevel, numThreads} +{ +} + +PbiBuilder::PbiBuilder(const std::string& pbiFilename, const size_t numReferenceSequences, + const CompressionLevel compressionLevel, const size_t numThreads) + : PbiBuilder{pbiFilename, numReferenceSequences, (numReferenceSequences > 0), compressionLevel, + numThreads} +{ +} + +PbiBuilder::PbiBuilder(const std::string& pbiFilename, const size_t numReferenceSequences, + const bool isCoordinateSorted, const CompressionLevel compressionLevel, + const size_t numThreads) + : d_{std::make_unique(pbiFilename, numReferenceSequences, isCoordinateSorted, + compressionLevel, numThreads)} +{ +} + +PbiBuilder::~PbiBuilder() noexcept = default; + +void PbiBuilder::AddRecord(const BamRecord& record, const int64_t vOffset) +{ + d_->AddRecord(record, vOffset); +} + +void PbiBuilder::Close() { d_->Close(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiFile.cpp b/src/PbiFile.cpp new file mode 100644 index 0000000..fe5fdc0 --- /dev/null +++ b/src/PbiFile.cpp @@ -0,0 +1,37 @@ +// File Description +/// \file PbiFile.cpp +/// \brief Implements the PbiFile methods. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiFile.h" + +#include +#include + +#include "pbbam/BamFile.h" +#include "pbbam/BamReader.h" +#include "pbbam/PbiBuilder.h" + +namespace PacBio { +namespace BAM { + +void PbiFile::CreateFrom(const BamFile& bamFile, + const PbiBuilder::CompressionLevel compressionLevel, + const size_t numThreads) +{ + PbiBuilder builder(bamFile.PacBioIndexFilename(), bamFile.Header().Sequences().size(), + compressionLevel, numThreads); + BamReader reader(bamFile); + BamRecord b; + int64_t offset = reader.VirtualTell(); + while (reader.GetNext(b)) { + builder.AddRecord(b, offset); + offset = reader.VirtualTell(); + } +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiFilter.cpp b/src/PbiFilter.cpp new file mode 100644 index 0000000..5364f77 --- /dev/null +++ b/src/PbiFilter.cpp @@ -0,0 +1,497 @@ +// File Description +/// \file PbiFilter.cpp +/// \brief Implements the PbiFilter class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiFilter.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "FileUtils.h" +#include "pbbam/PbiFilterTypes.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace internal { + +// clang-format off +enum class BuiltIn +{ + AlignedEndFilter + , AlignedLengthFilter + , AlignedStartFilter + , AlignedStrandFilter + , BarcodeFilter + , BarcodeForwardFilter + , BarcodeQualityFilter + , BarcodeReverseFilter + , BarcodesFilter + , IdentityFilter + , LocalContextFilter + , MovieNameFilter + , NumDeletedBasesFilter + , NumInsertedBasesFilter + , NumMatchesFilter + , NumMismatchesFilter + , QIdFilter + , QueryEndFilter + , QueryLengthFilter + , QueryNameFilter + , QueryNamesFromFileFilter + , QueryStartFilter + , ReadAccuracyFilter + , ReadGroupFilter + , ReferenceEndFilter + , ReferenceIdFilter + , ReferenceNameFilter + , ReferenceStartFilter + , ZmwFilter +}; + +static const std::unordered_map builtInLookup = +{ + // property name built-in filter + { "ae", BuiltIn::AlignedEndFilter }, + { "aend", BuiltIn::AlignedEndFilter }, + { "alignedlength", BuiltIn::AlignedLengthFilter }, + { "as", BuiltIn::AlignedStartFilter }, + { "astart", BuiltIn::AlignedStartFilter }, + { "readstart", BuiltIn::AlignedStartFilter }, + { "bc", BuiltIn::BarcodeFilter }, + { "barcode", BuiltIn::BarcodeFilter }, + { "bcf", BuiltIn::BarcodeForwardFilter }, + { "bq", BuiltIn::BarcodeQualityFilter }, + { "bcq", BuiltIn::BarcodeQualityFilter }, + { "bcr", BuiltIn::BarcodeReverseFilter }, + { "accuracy", BuiltIn::IdentityFilter }, + { "identity", BuiltIn::IdentityFilter }, + { "cx", BuiltIn::LocalContextFilter }, + { "movie", BuiltIn::MovieNameFilter }, + { "qid", BuiltIn::QIdFilter }, + { "qe", BuiltIn::QueryEndFilter }, + { "qend", BuiltIn::QueryEndFilter }, + { "length", BuiltIn::QueryLengthFilter }, + { "querylength", BuiltIn::QueryLengthFilter }, + { "qname", BuiltIn::QueryNameFilter }, + { "qname_file", BuiltIn::QueryNamesFromFileFilter }, + { "qs", BuiltIn::QueryStartFilter }, + { "qstart", BuiltIn::QueryStartFilter }, + { "rq", BuiltIn::ReadAccuracyFilter }, + { "te", BuiltIn::ReferenceEndFilter }, + { "tend", BuiltIn::ReferenceEndFilter }, + { "rname", BuiltIn::ReferenceNameFilter }, + { "ts", BuiltIn::ReferenceStartFilter }, + { "tstart", BuiltIn::ReferenceStartFilter }, + { "pos", BuiltIn::ReferenceStartFilter }, + { "zm", BuiltIn::ZmwFilter }, + { "zmw", BuiltIn::ZmwFilter } +}; + +static const std::unordered_map contextFlagNames = +{ + { "NO_LOCAL_CONTEXT", LocalContextFlags::NO_LOCAL_CONTEXT }, + { "ADAPTER_BEFORE", LocalContextFlags::ADAPTER_BEFORE }, + { "ADAPTER_AFTER", LocalContextFlags::ADAPTER_AFTER }, + { "BARCODE_BEFORE", LocalContextFlags::BARCODE_BEFORE }, + { "BARCODE_AFTER", LocalContextFlags::BARCODE_AFTER }, + { "FORWARD_PASS", LocalContextFlags::FORWARD_PASS }, + { "REVERSE_PASS", LocalContextFlags::REVERSE_PASS }, + { "ADAPTER_BEFORE_BAD", LocalContextFlags::ADAPTER_BEFORE_BAD}, + { "ADAPTER_AFTER_BAD", LocalContextFlags::ADAPTER_AFTER_BAD} +}; +// clang-format off + +// helper methods (for handling maybe-list strings)) +static inline bool isBracketed(const std::string& value) +{ + static const std::string openBrackets = "[({"; + static const std::string closeBrackets = "])}"; + return openBrackets.find(value.at(0)) != std::string::npos && + closeBrackets.find(value.at(value.length() - 1)) != std::string::npos; +} + +static inline bool isList(const std::string& value) { return value.find(',') != std::string::npos; } + +static PbiFilter CreateBarcodeFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for barcode filter property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + std::vector barcodes = Split(value, ','); + if (barcodes.size() != 2) throw std::runtime_error{"PbiFilter: only 2 barcode values expected"}; + return PbiBarcodesFilter{boost::numeric_cast(std::stoi(barcodes.at(0))), + boost::numeric_cast(std::stoi(barcodes.at(1))), + compareType}; + } else + return PbiBarcodeFilter{boost::numeric_cast(stoi(value)), compareType}; +} + +static PbiFilter CreateBarcodeForwardFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for barcode_forward filter property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + std::vector tokens = Split(value, ','); + std::vector barcodes; + barcodes.reserve(tokens.size()); + for (const auto& t : tokens) + barcodes.push_back(boost::numeric_cast(stoi(t))); + return PbiBarcodeForwardFilter{std::move(barcodes)}; + } else + return PbiBarcodeForwardFilter{boost::numeric_cast(std::stoi(value)), compareType}; +} + +static PbiFilter CreateBarcodeReverseFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for barcode_reverse filter property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + std::vector tokens = Split(value, ','); + std::vector barcodes; + barcodes.reserve(tokens.size()); + for (const auto& t : tokens) + barcodes.push_back(boost::numeric_cast(std::stoi(t))); + return PbiBarcodeReverseFilter{std::move(barcodes)}; + } else + return PbiBarcodeReverseFilter{boost::numeric_cast(stoi(value)), compareType}; +} + +static PbiFilter CreateLocalContextFilter(const std::string& value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for local context filter property"}; + + LocalContextFlags filterValue = LocalContextFlags::NO_LOCAL_CONTEXT; + + // if raw integer + if (isdigit(value.at(0))) filterValue = static_cast(stoi(value)); + + // else interpret as flag names + else { + std::vector tokens = Split(value, '|'); + for (std::string& token : tokens) { + boost::algorithm::trim(token); // trim whitespace + filterValue = (filterValue | contextFlagNames.at(token)); + } + } + + return PbiFilter{PbiLocalContextFilter{filterValue, compareType}}; +} + +static PbiFilter CreateMovieNameFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for movie property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on movie property"}; + + std::vector tokens = Split(value, ','); + return PbiMovieNameFilter{std::move(tokens), compareType}; + } else + return PbiMovieNameFilter{value, compareType}; +} + +static PbiFilter CreateQIdFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for qid property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on qid property"}; + + std::vector rgIds; + for (const auto& t : Split(value, ',')) + rgIds.push_back(static_cast(std::stoul(t))); + return PbiReadGroupFilter{rgIds, compareType}; + } else { + const auto n = static_cast(std::stoul(value)); + return PbiReadGroupFilter{n, compareType}; + } + +} + +static PbiFilter CreateQueryNamesFilterFromFile(const std::string& value, const DataSet& dataset, const Compare::Type compareType) +{ + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on query name property"}; + + // resolve file from dataset, value + const std::string resolvedFilename = dataset.ResolvePath(value); + std::vector whitelist; + std::string fn; + std::ifstream in(resolvedFilename); + while (std::getline(in, fn)) + whitelist.push_back(fn); + return PbiQueryNameFilter{whitelist, compareType}; +} + +static PbiFilter CreateQueryNameFilter(std::string value, const DataSet& dataset, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for query name property"}; + + // try possible filename first + const std::string resolvedFilename = dataset.ResolvePath(value); + if (FileUtils::Exists(value)) + return CreateQueryNamesFilterFromFile(value, dataset, compareType); + + // otherwise "normal" qname (single, or list) + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on query name property"}; + + std::vector tokens = Split(value, ','); + return PbiQueryNameFilter{std::move(tokens), compareType}; + } else + return PbiQueryNameFilter{value, compareType}; +} + +static PbiFilter CreateReadGroupFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for read group property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on read group property"}; + + std::vector tokens = Split(value, ','); + return PbiReadGroupFilter{std::move(tokens), compareType}; + } else + return PbiReadGroupFilter{value, compareType}; +} + +static PbiFilter CreateReferenceIdFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for reference ID property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on reference name ID property"}; + + std::vector tokens = Split(value, ','); + std::vector ids; + ids.reserve(tokens.size()); + for (const auto& t : tokens) + ids.push_back(boost::numeric_cast(stoi(t))); + return PbiReferenceIdFilter{std::move(ids), compareType}; + } else + return PbiReferenceIdFilter{boost::numeric_cast(stoi(value)), compareType}; +} + +static PbiFilter CreateReferenceNameFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for reference name property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + + if (compareType != Compare::EQUAL && compareType != Compare::NOT_EQUAL) + throw std::runtime_error{"PbiFilter: unsupported compare type on reference name property"}; + + std::vector tokens = Split(value, ','); + return PbiReferenceNameFilter{std::move(tokens), compareType}; + } else + return PbiReferenceNameFilter{value, compareType}; +} + +static PbiFilter CreateZmwFilter(std::string value, const Compare::Type compareType) +{ + if (value.empty()) throw std::runtime_error{"PbiFilter: empty value for ZMW filter property"}; + + if (isBracketed(value)) { + value.erase(0, 1); + value.pop_back(); + } + + if (isList(value)) { + std::vector tokens = Split(value, ','); + std::vector zmws; + zmws.reserve(tokens.size()); + for (const auto& t : tokens) + zmws.push_back(boost::numeric_cast(stoi(t))); + return PbiZmwFilter{std::move(zmws)}; + } else + return PbiZmwFilter{boost::numeric_cast(stoi(value)), compareType}; +} + +static PbiFilter CreateZmwModuloFilter(const Property& property) +{ + if (!property.HasAttribute("Modulo") || !property.HasAttribute("Hash") || + property.Name() != "zm") + { + throw std::runtime_error{"PbiFilter: modulo filter is not supported on property: " + property.Name()}; + } + + const auto hashType = property.Attribute("Hash"); + const FilterHash hash = [&hashType]() + { + if (boost::algorithm::to_lower_copy(hashType) == "uint32cast") + return FilterHash::UNSIGNED_LONG_CAST; + if (boost::algorithm::to_lower_copy(hashType) == "boosthashcombine") + return FilterHash::BOOST_HASH_COMBINE; + throw std::runtime_error{"PbiFilter: unsuppoerted hash type: " + hashType}; + }(); + + const uint32_t denom = std::stoul(property.Attribute("Modulo")); + const uint32_t value = std::stoul(property.Value()); + + return PbiZmwModuloFilter{ denom, value, hash, Compare::EQUAL }; +} + +static PbiFilter FromDataSetProperty(const Property& property, const DataSet& dataset) +{ + try { + const std::string& value = property.Value(); + + if (property.Name() == "zm" && property.HasAttribute("Modulo")) + return CreateZmwModuloFilter(property); + + const Compare::Type compareType = Compare::TypeFromOperator(property.Operator()); + const BuiltIn builtInCode = + builtInLookup.at(boost::algorithm::to_lower_copy(property.Name())); + + // clang-format off + switch (builtInCode) { + + // single-value filters + case BuiltIn::AlignedEndFilter : return PbiAlignedEndFilter{ static_cast(std::stoul(value)), compareType }; + case BuiltIn::AlignedLengthFilter : return PbiAlignedLengthFilter{ static_cast(std::stoul(value)), compareType }; + case BuiltIn::AlignedStartFilter : return PbiAlignedStartFilter{ static_cast(std::stoul(value)), compareType }; + case BuiltIn::BarcodeQualityFilter : return PbiBarcodeQualityFilter{ static_cast(std::stoul(value)), compareType }; + case BuiltIn::IdentityFilter : return PbiIdentityFilter{ std::stof(value), compareType }; + case BuiltIn::QueryEndFilter : return PbiQueryEndFilter{ std::stoi(value), compareType }; + case BuiltIn::QueryLengthFilter : return PbiQueryLengthFilter{ std::stoi(value), compareType }; + case BuiltIn::QueryStartFilter : return PbiQueryStartFilter{ std::stoi(value), compareType }; + case BuiltIn::ReadAccuracyFilter : return PbiReadAccuracyFilter{ std::stof(value), compareType }; + case BuiltIn::ReferenceEndFilter : return PbiReferenceEndFilter{ static_cast(std::stoul(value)), compareType }; + case BuiltIn::ReferenceStartFilter : return PbiReferenceStartFilter{ static_cast(std::stoul(value)), compareType }; + + // (maybe) list-value filters + case BuiltIn::BarcodeFilter : return CreateBarcodeFilter(value, compareType); + case BuiltIn::BarcodeForwardFilter : return CreateBarcodeForwardFilter(value, compareType); + case BuiltIn::BarcodeReverseFilter : return CreateBarcodeReverseFilter(value, compareType); + case BuiltIn::LocalContextFilter : return CreateLocalContextFilter(value, compareType); + case BuiltIn::MovieNameFilter : return CreateMovieNameFilter(value, compareType); + case BuiltIn::QIdFilter : return CreateQIdFilter(value, compareType); + case BuiltIn::QueryNameFilter : return CreateQueryNameFilter(value, dataset, compareType); + case BuiltIn::ReadGroupFilter : return CreateReadGroupFilter(value, compareType); + case BuiltIn::ReferenceIdFilter : return CreateReferenceIdFilter(value, compareType); + case BuiltIn::ReferenceNameFilter : return CreateReferenceNameFilter(value, compareType); + case BuiltIn::ZmwFilter : return CreateZmwFilter(value, compareType); + + // other built-ins + case BuiltIn::QueryNamesFromFileFilter : return CreateQueryNamesFilterFromFile(value, dataset, compareType); + + default : + throw std::runtime_error{"PbiFilter: invalid built-in filter requested"}; + } + // clang-format on + + // unreachable + return PbiFilter{}; + + } catch (std::exception& e) { + std::ostringstream s; + s << "PbiFilter: could not create filter from XML Property element:\n" + << " Name: " << property.Name() << '\n' + << " Value: " << property.Value() << '\n' + << " Operator: " << property.Operator() << '\n' + << " reason: " << e.what() << '\n'; + throw std::runtime_error{s.str()}; + } +} + +} // namespace internal + +PbiFilter PbiFilter::FromDataSet(const DataSet& dataset) +{ + PbiFilter datasetFilter{PbiFilter::UNION}; + for (const auto& xmlFilter : dataset.Filters()) { + PbiFilter propertiesFilter; + for (const auto& xmlProperty : xmlFilter.Properties()) + propertiesFilter.Add(internal::FromDataSetProperty(xmlProperty, dataset)); + datasetFilter.Add(propertiesFilter); + } + return datasetFilter; +} + +PbiFilter PbiFilter::Intersection(std::vector filters) +{ + auto result = PbiFilter{PbiFilter::INTERSECT}; + result.Add(std::move(filters)); + return result; +} + +PbiFilter PbiFilter::Union(std::vector filters) +{ + auto result = PbiFilter{PbiFilter::UNION}; + result.Add(std::move(filters)); + return result; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiFilterQuery.cpp b/src/PbiFilterQuery.cpp new file mode 100644 index 0000000..8218c78 --- /dev/null +++ b/src/PbiFilterQuery.cpp @@ -0,0 +1,59 @@ +// File Description +/// \file PbiFilterQuery.cpp +/// \brief Implements the PbiFilterQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiFilterQuery.h" + +#include + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class PbiFilterQuery::PbiFilterQueryPrivate +{ +public: + PbiFilterQueryPrivate(const PbiFilter& filter, const DataSet& dataset, + const PbiIndexCache& cache) + : reader_{filter, dataset, cache} + { + } + + PbiFilterCompositeBamReader reader_; // unsorted +}; + +PbiFilterQuery::PbiFilterQuery(const DataSet& dataset) + : PbiFilterQuery{PbiFilter::FromDataSet(dataset), dataset, MakePbiIndexCache(dataset)} +{ +} + +PbiFilterQuery::PbiFilterQuery(const DataSet& dataset, const PbiIndexCache& cache) + : PbiFilterQuery{PbiFilter::FromDataSet(dataset), dataset, cache} +{ +} + +PbiFilterQuery::PbiFilterQuery(const PbiFilter& filter, const DataSet& dataset) + : PbiFilterQuery{filter, dataset, MakePbiIndexCache(dataset)} +{ +} + +PbiFilterQuery::PbiFilterQuery(const PbiFilter& filter, const DataSet& dataset, + const PbiIndexCache& cache) + : internal::IQuery(), d_{std::make_unique(filter, dataset, cache)} +{ +} + +PbiFilterQuery::~PbiFilterQuery() = default; + +bool PbiFilterQuery::GetNext(BamRecord& r) { return d_->reader_.GetNext(r); } + +uint32_t PbiFilterQuery::NumReads() const { return d_->reader_.NumReads(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiFilterTypes.cpp b/src/PbiFilterTypes.cpp new file mode 100644 index 0000000..6202d40 --- /dev/null +++ b/src/PbiFilterTypes.cpp @@ -0,0 +1,496 @@ +// File Description +/// \file PbiFilterTypes.cpp +/// \brief Implements the built-in PBI filters. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiFilterTypes.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "pbbam/MakeUnique.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +template +IndexList readLengthHelper(const std::vector& start, const std::vector& end, const T& value, + const Compare::Type cmp) +{ + assert(start.size() == end.size()); + + auto result = IndexList{}; + const auto numElements = start.size(); + for (size_t i = 0; i < numElements; ++i) { + const auto readLength = end[i] - start[i]; + bool keep = false; + switch (cmp) { + case Compare::EQUAL: + keep = (readLength == value); + break; + case Compare::NOT_EQUAL: + keep = (readLength != value); + break; + case Compare::LESS_THAN: + keep = (readLength < value); + break; + case Compare::LESS_THAN_EQUAL: + keep = (readLength <= value); + break; + case Compare::GREATER_THAN: + keep = (readLength > value); + break; + case Compare::GREATER_THAN_EQUAL: + keep = (readLength >= value); + break; + default: + assert(false); + throw std::runtime_error{ + "PbiFilter: read length filter encountered unknown compare type: " + + Compare::TypeToName(cmp)}; + } + + if (keep) result.push_back(i); + } + return result; +} + +PbiFilter filterFromMovieName(const std::string& movieName, bool includeCcs) +{ + // + // All transcript-type reads (movieName == "transcript") have the same + // read group ID. Calculate once & and create filters from that ID. + // + if (movieName == "transcript") { + static const auto transcriptRgId = MakeReadGroupId("transcript", "TRANSCRIPT"); + return PbiFilter{PbiReadGroupFilter{transcriptRgId}}; + } + + // + // For all other movie names, we can't determine read type up front, so we'll match + // on any rgIds from a candidate list. + // + auto filter = PbiFilter{PbiFilter::UNION}; + filter.Add({PbiReadGroupFilter{MakeReadGroupId(movieName, "POLYMERASE")}, + PbiReadGroupFilter{MakeReadGroupId(movieName, "HQREGION")}, + PbiReadGroupFilter{MakeReadGroupId(movieName, "SUBREAD")}, + PbiReadGroupFilter{MakeReadGroupId(movieName, "SCRAP")}, + PbiReadGroupFilter{MakeReadGroupId(movieName, "UNKNOWN")}}); + if (includeCcs) filter.Add(PbiReadGroupFilter{MakeReadGroupId(movieName, "CCS")}); + + return filter; +} + +} // anonymous + +// PbiAlignedLengthFilter + +bool PbiAlignedLengthFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + const auto& mappedData = idx.MappedData(); + const auto& aEnd = mappedData.aEnd_.at(row); + const auto& aStart = mappedData.aStart_.at(row); + const auto aLength = aEnd - aStart; + return CompareHelper(aLength); +} + +// PbiIdentityFilter + +bool PbiIdentityFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + const auto& mappedData = idx.MappedData(); + const auto& nMM = mappedData.nMM_.at(row); + const auto& nIndels = mappedData.NumDeletedAndInsertedBasesAt(row); + const auto& nDel = nIndels.first; + const auto& nIns = nIndels.second; + + const auto& basicData = idx.BasicData(); + const auto& qStart = basicData.qStart_.at(row); + const auto& qEnd = basicData.qEnd_.at(row); + + const float readLength = qEnd - qStart; + const float nonMatches = nMM + nDel + nIns; + const float identity = 1.0f - (nonMatches / readLength); + + return CompareHelper(identity); +} + +// PbiMovieNameFilter + +PbiMovieNameFilter::PbiMovieNameFilter(const std::string& movieName, const Compare::Type cmp) + : compositeFilter_{filterFromMovieName(movieName, true)} // include CCS + , cmp_{cmp} +{ +} + +PbiMovieNameFilter::PbiMovieNameFilter(const std::vector& whitelist, + const Compare::Type cmp) + : compositeFilter_{PbiFilter::UNION}, cmp_{cmp} +{ + for (const auto& movieName : whitelist) + compositeFilter_.Add(filterFromMovieName(movieName, true)); // include CCS +} + +// PbiQueryLengthFilter + +bool PbiQueryLengthFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + const auto& basicData = idx.BasicData(); + const auto& qStart = basicData.qStart_.at(row); + const auto& qEnd = basicData.qEnd_.at(row); + const auto readLength = qEnd - qStart; + return CompareHelper(readLength); +} + +// PbiQueryNameFilter + +struct PbiQueryNameFilter::PbiQueryNameFilterPrivate +{ +public: + using QueryInterval = std::pair; + using QueryIntervals = std::set; + using ZmwLookup = std::unordered_map; + using ZmwLookupPtr = std::shared_ptr; // may be shared by more than one rgId + using RgIdLookup = std::unordered_map; + + PbiQueryNameFilterPrivate(const std::vector& whitelist, + const Compare::Type cmp = Compare::EQUAL) + : cmp_{cmp} + { + for (const auto& queryName : whitelist) { + + if (queryName.find("transcript/") == 0) + HandleName(queryName, RecordType::TRANSCRIPT); + else if (queryName.find("/ccs") != std::string::npos) + HandleName(queryName, RecordType::CCS); + else + HandleName(queryName, RecordType::UNKNOWN); + } + } + + PbiQueryNameFilterPrivate(const std::unique_ptr& other) + { + if (other) { + lookup_ = other->lookup_; + cmp_ = other->cmp_; + } + } + + bool Accepts(const PbiRawData& idx, const size_t row) const + { + const auto& basicData = idx.BasicData(); + + // see if row's RGID known + const auto& rgId = basicData.rgId_.at(row); + const auto rgFound = lookup_.find(rgId); + if (rgFound == lookup_.end()) return false; + + // see if row's ZMW known + const auto& zmwPtr = rgFound->second; + const auto zmw = basicData.holeNumber_.at(row); + const auto zmwFound = zmwPtr->find(zmw); + if (zmwFound == zmwPtr->end()) return false; + + // see if row's QueryStart/QueryEnd known + // CCS names already covered in lookup construction phase + const auto& queryIntervals = zmwFound->second; + const auto qStart = basicData.qStart_.at(row); + const auto qEnd = basicData.qEnd_.at(row); + const auto queryInterval = std::make_pair(qStart, qEnd); + + const bool found = queryIntervals.find(queryInterval) != queryIntervals.end(); + if (cmp_ == Compare::EQUAL) + return found; + else if (cmp_ == Compare::NOT_EQUAL) + return !found; + else + throw std::runtime_error{"PbiFilter: unsupported compare type on query name filter"}; + } + + std::vector CandidateRgIds(const std::string& movieName, const RecordType type) + { + if (type == RecordType::CCS) + return {ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "CCS"))}; + + if (type == RecordType::TRANSCRIPT) + return {ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "TRANSCRIPT"))}; + + // we can't know for sure from QNAME alone + return {ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "POLYMERASE")), + ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "HQREGION")), + ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "SUBREAD")), + ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "SCRAP")), + ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "UNKNOWN")), + ReadGroupInfo::IdToInt(MakeReadGroupId(movieName, "ZMW"))}; + } + + void HandleName(const std::string& queryName, const RecordType type) + { + // split name into main parts + const auto nameParts = Split(queryName, '/'); + + // verify syntax + if (IsCcsOrTranscript(type)) { + if (nameParts.size() != 2) { + const auto typeName = (type == RecordType::CCS) ? "CCS" : "transcript"; + throw std::runtime_error{"PbiQueryNameFilter: requested QNAME (" + queryName + + ") is not valid for PacBio " + typeName + + " reads. See spec for details."}; + } + } else { + if (nameParts.size() != 3) { + throw std::runtime_error{"PbiQueryNameFilter: requested QNAME (" + queryName + + ") is not a valid PacBio BAM QNAME. See spec for details"}; + } + } + + // generate candidate read group IDs from movie name & record type, then + // add to lookup table + const auto zmwPtr = UpdateRgLookup(CandidateRgIds(nameParts.at(0), type)); + + // add qStart/qEnd interval to zmw lookup + const auto zmw = std::stoi(nameParts.at(1)); + if (IsCcsOrTranscript(type)) + UpdateZmwQueryIntervals(zmwPtr.get(), zmw, -1, -1); + else { + const auto queryIntervalParts = Split(nameParts.at(2), '_'); + if (queryIntervalParts.size() != 2) { + throw std::runtime_error{"PbiQueryNameFilter: requested QNAME (" + queryName + + ") is not a valid PacBio BAM QNAME. See spec for details"}; + } + UpdateZmwQueryIntervals(zmwPtr.get(), zmw, std::stoi(queryIntervalParts.at(0)), + std::stoi(queryIntervalParts.at(1))); + } + } + + ZmwLookupPtr UpdateRgLookup(std::vector&& rgIds) + { + assert(!rgIds.empty()); + + ZmwLookupPtr zmwPtr; + + const auto rgFound = lookup_.find(rgIds.front()); + if (rgFound == lookup_.end()) { + zmwPtr = std::make_shared(); + for (const auto& rg : rgIds) { + assert(lookup_.find(rg) == lookup_.end()); + lookup_.emplace(rg, zmwPtr); + } + } else { +#ifndef NDEBUG + for (const auto& rg : rgIds) + assert(lookup_.find(rg) != lookup_.end()); +#endif + zmwPtr = rgFound->second; + } + return zmwPtr; + } + + // add QS/QE pair to ZMW lookup + void UpdateZmwQueryIntervals(ZmwLookup* const zmwPtr, const int32_t zmw, + const int32_t queryStart, const int32_t queryEnd) + { + const auto zmwFound = zmwPtr->find(zmw); + if (zmwFound == zmwPtr->end()) zmwPtr->emplace(zmw, QueryIntervals{}); + auto& queryIntervals = zmwPtr->at(zmw); + queryIntervals.emplace(std::make_pair(queryStart, queryEnd)); + } + +private: + RgIdLookup lookup_; + Compare::Type cmp_; +}; + +PbiQueryNameFilter::PbiQueryNameFilter(const std::string& qname, const Compare::Type cmp) + : d_{std::make_unique( + std::vector{1, qname}, cmp)} +{ +} + +PbiQueryNameFilter::PbiQueryNameFilter(const std::vector& whitelist, + const Compare::Type cmp) + : d_{std::make_unique(whitelist, cmp)} +{ +} + +PbiQueryNameFilter::PbiQueryNameFilter(const PbiQueryNameFilter& other) + : d_{std::make_unique(other.d_)} +{ +} + +PbiQueryNameFilter::~PbiQueryNameFilter() = default; + +bool PbiQueryNameFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + return d_->Accepts(idx, row); +} + +// PbiReadGroupFilter + +PbiReadGroupFilter::PbiReadGroupFilter(const std::vector& whitelist, + const Compare::Type cmp) + : cmp_{cmp} +{ + if (cmp_ != Compare::EQUAL && cmp_ != Compare::NOT_EQUAL) { + throw std::runtime_error{"PbiFilter: unsupported compare type (" + + Compare::TypeToName(cmp) + + ") for this property. " + "Read group filter can only compare EQUAL or NOT_EQUAL."}; + } + + // Add RG ID & empty filter if not present. The empty filter will work for + // non-barcoded IDs that match the expected number(s). + // + for (const auto& rgId : whitelist) { + const auto found = lookup_.find(rgId); + if (found == lookup_.cend()) lookup_.emplace(rgId, boost::none); + } +} + +PbiReadGroupFilter::PbiReadGroupFilter(const int32_t rgId, const Compare::Type cmp) + : PbiReadGroupFilter{std::vector{rgId}, cmp} +{ +} + +PbiReadGroupFilter::PbiReadGroupFilter(const std::vector& whitelist, + const Compare::Type cmp) + : cmp_{cmp} +{ + if (cmp_ != Compare::EQUAL && cmp_ != Compare::NOT_EQUAL) { + throw std::runtime_error{"PbiFilter: unsupported compare type (" + + Compare::TypeToName(cmp) + + ") for this property. " + "Read group filter can only compare EQUAL or NOT_EQUAL."}; + } + + for (const auto& rg : whitelist) { + // Add RG base ID with no filter if not present. The empty filter will + // work for non-barcoded IDs. We'll add to it if the base read group ID + // also has barcode labels,so that any barcode pair whitelisted for this + // read group filter will be a match. + // + const auto idNum = ReadGroupInfo::IdToInt(rg.BaseId()); + const auto found = lookup_.find(idNum); + if (found == lookup_.cend()) lookup_.emplace(idNum, boost::none); + + // Maybe add barcodes to base ID + const auto barcodes = rg.Barcodes(); + if (barcodes) { + const auto bcFor = static_cast(barcodes->first); + const auto bcRev = static_cast(barcodes->second); + auto& idBarcodes = lookup_.at(idNum); + if (!idBarcodes) idBarcodes = std::vector>{}; + idBarcodes->push_back(std::make_pair(bcFor, bcRev)); + } + } +} + +PbiReadGroupFilter::PbiReadGroupFilter(const ReadGroupInfo& rg, const Compare::Type cmp) + : PbiReadGroupFilter{std::vector{rg}, cmp} +{ +} + +PbiReadGroupFilter::PbiReadGroupFilter(const std::vector& whitelist, + const Compare::Type cmp) +{ + std::vector readGroups; + for (const auto rgId : whitelist) + readGroups.push_back(rgId); + *this = PbiReadGroupFilter{readGroups, cmp}; +} + +PbiReadGroupFilter::PbiReadGroupFilter(const std::string& rgId, const Compare::Type cmp) + : PbiReadGroupFilter{ReadGroupInfo{rgId}, cmp} +{ +} + +bool PbiReadGroupFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + const auto accepted = [this](const PbiRawData& index, const size_t i) { + // Check that read group base ID is found. + const auto rowRgId = index.BasicData().rgId_.at(i); + const auto foundAt = lookup_.find(rowRgId); + if (foundAt == lookup_.cend()) return false; + + // Read group's base ID is found, check for filtered barcodes. + // + // For non-barcoded read groups, the filter is empty. This is + // essentially a no-op for allowing all candidate rows. + // + const auto& barcodes = foundAt->second; + if (!barcodes) return true; + + // Return success on first match, otherwise no match found. + for (const auto bcPair : *barcodes) { + if (index.BarcodeData().bcForward_.at(i) == bcPair.first && + index.BarcodeData().bcReverse_.at(i) == bcPair.second) { + return true; + } + } + return false; + + }(idx, row); + + return (cmp_ == Compare::EQUAL ? accepted : !accepted); +} + +// PbiReferenceNameFilter + +PbiReferenceNameFilter::PbiReferenceNameFilter(std::string rname, Compare::Type cmp) + : rname_{std::move(rname)}, cmp_{cmp} +{ + if (cmp != Compare::EQUAL && cmp != Compare::NOT_EQUAL) { + throw std::runtime_error{"PbiFilter: unsupported compare type (" + + Compare::TypeToName(cmp) + + ") for this property. " + "Reference name filter can only compare EQUAL or NOT_EQUAL."}; + } +} + +PbiReferenceNameFilter::PbiReferenceNameFilter(std::vector whitelist, + const Compare::Type cmp) + : rnameWhitelist_{std::move(whitelist)}, cmp_{cmp} +{ +} + +bool PbiReferenceNameFilter::Accepts(const PbiRawData& idx, const size_t row) const +{ + if (!initialized_) Initialize(idx); + return subFilter_.Accepts(idx, row); +} + +void PbiReferenceNameFilter::Initialize(const PbiRawData& idx) const +{ + const auto pbiFilename = idx.Filename(); + const auto bamFilename = pbiFilename.substr(0, pbiFilename.length() - 4); + const BamFile bamFile{bamFilename}; + + // single-value + if (rnameWhitelist_ == boost::none) { + const auto tId = bamFile.ReferenceId(rname_); + subFilter_ = PbiReferenceIdFilter{tId, cmp_}; + } + + // multi-value whitelist + else { + std::vector ids; + for (const auto& rname : rnameWhitelist_.get()) + ids.push_back(bamFile.ReferenceId(rname)); + subFilter_ = PbiReferenceIdFilter{std::move(ids), cmp_}; + } + initialized_ = true; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiIndexIO.cpp b/src/PbiIndexIO.cpp new file mode 100644 index 0000000..80f40f4 --- /dev/null +++ b/src/PbiIndexIO.cpp @@ -0,0 +1,387 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "PbiIndexIO.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "MemoryUtils.h" +#include "pbbam/BamFile.h" +#include "pbbam/BamRecord.h" +#include "pbbam/EntireFileQuery.h" +#include "pbbam/MoveAppend.h" +#include "pbbam/PbiBuilder.h" + +namespace PacBio { +namespace BAM { +namespace { + +void CheckContainer(const std::string& container, const size_t expected, const size_t observed) +{ + if (observed != expected) { + std::ostringstream msg; + msg << "PBI index error: expected " << expected << " records in " << container + << " field, but found " << observed << " instead"; + throw std::runtime_error{msg.str()}; + } +} + +void CheckExpectedSize(const PbiRawBarcodeData& barcodeData, const size_t numReads) +{ + CheckContainer("BarcodeData.bc_forward", numReads, barcodeData.bcForward_.size()); + CheckContainer("BarcodeData.bc_reverse", numReads, barcodeData.bcReverse_.size()); + CheckContainer("BarcodeData.bc_qual", numReads, barcodeData.bcReverse_.size()); +} + +void CheckExpectedSize(const PbiRawBasicData& basicData, const size_t numReads) +{ + CheckContainer("BasicData.rgId", numReads, basicData.rgId_.size()); + CheckContainer("BasicData.qStart", numReads, basicData.qStart_.size()); + CheckContainer("BasicData.qEnd", numReads, basicData.qEnd_.size()); + CheckContainer("BasicData.holeNumber", numReads, basicData.holeNumber_.size()); + CheckContainer("BasicData.readQual", numReads, basicData.readQual_.size()); + CheckContainer("BasicData.ctxt_flag", numReads, basicData.ctxtFlag_.size()); + CheckContainer("BasicData.fileOffset", numReads, basicData.fileOffset_.size()); +} + +void CheckExpectedSize(const PbiRawMappedData& mappedData, const size_t numReads) +{ + CheckContainer("MappedData.tId", numReads, mappedData.tId_.size()); + CheckContainer("MappedData.tStart", numReads, mappedData.tStart_.size()); + CheckContainer("MappedData.tEnd", numReads, mappedData.tEnd_.size()); + CheckContainer("MappedData.aStart", numReads, mappedData.aStart_.size()); + CheckContainer("MappedData.aEnd", numReads, mappedData.aEnd_.size()); + CheckContainer("MappedData.revStrand", numReads, mappedData.revStrand_.size()); + CheckContainer("MappedData.nM", numReads, mappedData.nM_.size()); + CheckContainer("MappedData.nMM", numReads, mappedData.nMM_.size()); + CheckContainer("MappedData.mapQV", numReads, mappedData.mapQV_.size()); +} + +} // anonmyous + +PbiRawData PbiIndexIO::Load(const std::string& pbiFilename) +{ + PbiRawData rawData; + Load(rawData, pbiFilename); + return rawData; +} + +void PbiIndexIO::Load(PbiRawData& rawData, const std::string& filename) +{ + // open file for reading + if (!boost::algorithm::iends_with(filename, ".pbi")) + throw std::runtime_error{"unsupported file extension on " + filename}; + std::unique_ptr bgzf(bgzf_open(filename.c_str(), "rb")); + auto* fp = bgzf.get(); + if (fp == nullptr) + throw std::runtime_error{"could not open PBI file: " + filename + "for reading"}; + + // load data + LoadHeader(rawData, fp); + const auto numReads = rawData.NumReads(); + if (numReads > 0) { + LoadBasicData(rawData.BasicData(), numReads, fp); + if (rawData.HasMappedData()) LoadMappedData(rawData.MappedData(), numReads, fp); + if (rawData.HasReferenceData()) LoadReferenceData(rawData.ReferenceData(), fp); + if (rawData.HasBarcodeData()) LoadBarcodeData(rawData.BarcodeData(), numReads, fp); + } +} + +void PbiIndexIO::LoadFromDataSet(PbiRawData& aggregateData, const DataSet& dataset) +{ + aggregateData.NumReads(0); + aggregateData.FileSections(PbiFile::BASIC | PbiFile::MAPPED | PbiFile::BARCODE); + aggregateData.Version(PbiFile::CurrentVersion); + + const auto bamFiles = dataset.BamFiles(); + uint16_t fileNumber = 0; + for (const auto& bamFile : bamFiles) { + PbiRawData currentPbi{bamFile.PacBioIndexFilename()}; + const auto currentPbiCount = currentPbi.NumReads(); + + // read count + aggregateData.NumReads(aggregateData.NumReads() + currentPbiCount); + + // BasicData + auto& aggregateBasicData = aggregateData.BasicData(); + auto& currentBasicData = currentPbi.BasicData(); + MoveAppend(std::move(currentBasicData.rgId_), aggregateBasicData.rgId_); + MoveAppend(std::move(currentBasicData.qStart_), aggregateBasicData.qStart_); + MoveAppend(std::move(currentBasicData.qEnd_), aggregateBasicData.qEnd_); + MoveAppend(std::move(currentBasicData.holeNumber_), aggregateBasicData.holeNumber_); + MoveAppend(std::move(currentBasicData.readQual_), aggregateBasicData.readQual_); + MoveAppend(std::move(currentBasicData.ctxtFlag_), aggregateBasicData.ctxtFlag_); + MoveAppend(std::move(currentBasicData.fileOffset_), aggregateBasicData.fileOffset_); + MoveAppend(std::vector(currentPbiCount, fileNumber), + aggregateBasicData.fileNumber_); + + // BarcodeData + auto& aggregateBarcodeData = aggregateData.BarcodeData(); + if (currentPbi.HasBarcodeData()) { + auto& currentBarcodeData = currentPbi.BarcodeData(); + MoveAppend(std::move(currentBarcodeData.bcForward_), aggregateBarcodeData.bcForward_); + MoveAppend(std::move(currentBarcodeData.bcReverse_), aggregateBarcodeData.bcReverse_); + MoveAppend(std::move(currentBarcodeData.bcQual_), aggregateBarcodeData.bcQual_); + } else { + MoveAppend(std::vector(currentPbiCount, -1), aggregateBarcodeData.bcForward_); + MoveAppend(std::vector(currentPbiCount, -1), aggregateBarcodeData.bcReverse_); + MoveAppend(std::vector(currentPbiCount, -1), aggregateBarcodeData.bcQual_); + } + + // MappedData + auto& aggregateMappedData = aggregateData.MappedData(); + if (currentPbi.HasMappedData()) { + auto& currentMappedData = currentPbi.MappedData(); + MoveAppend(std::move(currentMappedData.tId_), aggregateMappedData.tId_); + MoveAppend(std::move(currentMappedData.tStart_), aggregateMappedData.tStart_); + MoveAppend(std::move(currentMappedData.tEnd_), aggregateMappedData.tEnd_); + MoveAppend(std::move(currentMappedData.aStart_), aggregateMappedData.aStart_); + MoveAppend(std::move(currentMappedData.aEnd_), aggregateMappedData.aEnd_); + MoveAppend(std::move(currentMappedData.revStrand_), aggregateMappedData.revStrand_); + MoveAppend(std::move(currentMappedData.nM_), aggregateMappedData.nM_); + MoveAppend(std::move(currentMappedData.nMM_), aggregateMappedData.nMM_); + MoveAppend(std::move(currentMappedData.mapQV_), aggregateMappedData.mapQV_); + } else { + MoveAppend(std::vector(currentPbiCount, -1), aggregateMappedData.tId_); + MoveAppend(std::vector(currentPbiCount, UnmappedPosition), + aggregateMappedData.tStart_); + MoveAppend(std::vector(currentPbiCount, UnmappedPosition), + aggregateMappedData.tEnd_); + MoveAppend(std::vector(currentPbiCount, UnmappedPosition), + aggregateMappedData.aStart_); + MoveAppend(std::vector(currentPbiCount, UnmappedPosition), + aggregateMappedData.aEnd_); + MoveAppend(std::vector(currentPbiCount, 0), aggregateMappedData.revStrand_); + MoveAppend(std::vector(currentPbiCount, 0), aggregateMappedData.nM_); + MoveAppend(std::vector(currentPbiCount, 0), aggregateMappedData.nMM_); + MoveAppend(std::vector(currentPbiCount, 255), aggregateMappedData.mapQV_); + } + + ++fileNumber; + } +} + +void PbiIndexIO::LoadBarcodeData(PbiRawBarcodeData& barcodeData, const uint32_t numReads, BGZF* fp) +{ + // read from file + LoadBgzfVector(fp, barcodeData.bcForward_, numReads); + LoadBgzfVector(fp, barcodeData.bcReverse_, numReads); + LoadBgzfVector(fp, barcodeData.bcQual_, numReads); + + // validate + CheckExpectedSize(barcodeData, numReads); +} + +void PbiIndexIO::LoadHeader(PbiRawData& index, BGZF* fp) +{ + // 'magic' string + char magic[4]; + auto 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; + bytesRead = bgzf_read(fp, &version, sizeof(version)); + bytesRead = bgzf_read(fp, §ions, sizeof(sections)); + bytesRead = 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(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) +{ + // read from file + 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); + + // validate + CheckExpectedSize(mappedData, numReads); +} + +void PbiIndexIO::LoadReferenceData(PbiRawReferenceData& referenceData, BGZF* fp) +{ + assert(sizeof(PbiReferenceEntry::ID) == 4); + assert(sizeof(PbiReferenceEntry::Row) == 4); + + // num refs + uint32_t numRefs; + auto ret = bgzf_read(fp, &numRefs, 4); + if (fp->is_be) numRefs = ed_swap_4(numRefs); + + // reference entries + referenceData.entries_.clear(); + referenceData.entries_.resize(numRefs); + for (auto& entry : referenceData.entries_) { + ret = bgzf_read(fp, &entry.tId_, 4); + ret = bgzf_read(fp, &entry.beginRow_, 4); + ret = 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_); + } + } + UNUSED(ret); +} + +void PbiIndexIO::LoadBasicData(PbiRawBasicData& basicData, const uint32_t numReads, BGZF* fp) +{ + // read from file + LoadBgzfVector(fp, basicData.rgId_, numReads); + LoadBgzfVector(fp, basicData.qStart_, numReads); + LoadBgzfVector(fp, basicData.qEnd_, numReads); + LoadBgzfVector(fp, basicData.holeNumber_, numReads); + LoadBgzfVector(fp, basicData.readQual_, numReads); + LoadBgzfVector(fp, basicData.ctxtFlag_, numReads); + LoadBgzfVector(fp, basicData.fileOffset_, numReads); + + // validate + CheckExpectedSize(basicData, numReads); +} + +void PbiIndexIO::Save(const PbiRawData& index, const std::string& filename) +{ + std::unique_ptr bgzf(bgzf_open(filename.c_str(), "wb")); + auto* fp = bgzf.get(); + if (fp == nullptr) + throw std::runtime_error{"could not open PBI file: " + filename + "for writing"}; + + WriteHeader(index, fp); + const auto numReads = index.NumReads(); + if (numReads > 0) { + WriteBasicData(index.BasicData(), 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) +{ + // validate + CheckExpectedSize(barcodeData, numReads); + + // write to file + WriteBgzfVector(fp, barcodeData.bcForward_); + WriteBgzfVector(fp, barcodeData.bcReverse_); + WriteBgzfVector(fp, barcodeData.bcQual_); +} + +void PbiIndexIO::WriteHeader(const PbiRawData& index, BGZF* fp) +{ + // 'magic' string + constexpr static const std::array magic{{'P', 'B', 'I', '\1'}}; + auto ret = bgzf_write(fp, magic.data(), 4); + + // version, pbi_flags, & n_reads + auto version = static_cast(index.Version()); + uint16_t pbi_flags = index.FileSections(); + auto numReads = static_cast(index.NumReads()); + if (fp->is_be) { + version = ed_swap_4(version); + pbi_flags = ed_swap_2(pbi_flags); + numReads = ed_swap_4(numReads); + } + ret = bgzf_write(fp, &version, 4); + ret = bgzf_write(fp, &pbi_flags, 2); + ret = bgzf_write(fp, &numReads, 4); + + // reserved space + char reserved[18]; + memset(reserved, 0, 18); + ret = bgzf_write(fp, reserved, 18); + UNUSED(ret); +} + +void PbiIndexIO::WriteMappedData(const PbiRawMappedData& mappedData, const uint32_t numReads, + BGZF* fp) +{ + // validate + CheckExpectedSize(mappedData, numReads); + + // write to file + 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 + auto numRefs = referenceData.entries_.size(); + if (fp->is_be) numRefs = ed_swap_4(numRefs); + auto ret = bgzf_write(fp, &numRefs, 4); + + // reference entries + for (const auto& entry : referenceData.entries_) { + auto tId = entry.tId_; + auto beginRow = entry.beginRow_; + auto endRow = entry.endRow_; + if (fp->is_be) { + tId = ed_swap_4(tId); + beginRow = ed_swap_4(beginRow); + endRow = ed_swap_4(endRow); + } + ret = bgzf_write(fp, &tId, 4); + ret = bgzf_write(fp, &beginRow, 4); + ret = bgzf_write(fp, &endRow, 4); + } + UNUSED(ret); +} + +void PbiIndexIO::WriteBasicData(const PbiRawBasicData& basicData, const uint32_t numReads, BGZF* fp) +{ + // validate + CheckExpectedSize(basicData, numReads); + + // write to file + WriteBgzfVector(fp, basicData.rgId_); + WriteBgzfVector(fp, basicData.qStart_); + WriteBgzfVector(fp, basicData.qEnd_); + WriteBgzfVector(fp, basicData.holeNumber_); + WriteBgzfVector(fp, basicData.readQual_); + WriteBgzfVector(fp, basicData.ctxtFlag_); + WriteBgzfVector(fp, basicData.fileOffset_); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiIndexIO.h b/src/PbiIndexIO.h new file mode 100644 index 0000000..c5aef0d --- /dev/null +++ b/src/PbiIndexIO.h @@ -0,0 +1,113 @@ +// Author: Derek Barnett + +#ifndef PBIINDEXIO_H +#define PBIINDEXIO_H + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "pbbam/BamFile.h" +#include "pbbam/DataSet.h" +#include "pbbam/PbiFile.h" +#include "pbbam/PbiRawData.h" +#include "pbbam/Unused.h" + +namespace PacBio { +namespace BAM { + +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 LoadFromDataSet(PbiRawData& aggregateData, const DataSet& dataset); + static void Save(const PbiRawData& rawData, const std::string& filename); + + // 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 LoadBasicData(PbiRawBasicData& basicData, const uint32_t numReads, BGZF* fp); + + // per-data-field load + template + static void LoadBgzfVector(BGZF* fp, std::vector& data, const uint32_t numReads); + + // 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 WriteBasicData(const PbiRawBasicData& subreadData, const uint32_t numReads, + BGZF* fp); + + // per-data-field write + template + static void WriteBgzfVector(BGZF* fp, const std::vector& data); + +private: + // helper functions + template + static void SwapEndianness(std::vector& data); +}; + +template +inline void PbiIndexIO::LoadBgzfVector(BGZF* fp, std::vector& data, const uint32_t numReads) +{ + assert(fp); + data.resize(numReads); + auto ret = bgzf_read(fp, &data[0], numReads * sizeof(T)); + if (fp->is_be) SwapEndianness(data); + UNUSED(ret); +} + +template +inline void PbiIndexIO::SwapEndianness(std::vector& data) +{ + const auto elementSize = sizeof(T); + const auto 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 +inline void PbiIndexIO::WriteBgzfVector(BGZF* fp, const std::vector& data) +{ + assert(fp); + std::vector output = data; + if (fp->is_be) SwapEndianness(output); + auto ret = bgzf_write(fp, &output[0], data.size() * sizeof(T)); + UNUSED(ret); +} + +} // namespace BAM +} // namespace PacBio + +#endif // PBIINDEXIO_H diff --git a/src/PbiIndexedBamReader.cpp b/src/PbiIndexedBamReader.cpp new file mode 100644 index 0000000..8d619da --- /dev/null +++ b/src/PbiIndexedBamReader.cpp @@ -0,0 +1,192 @@ +// File Description +/// \file PbiIndexedBamReader.cpp +/// \brief Implements the PbiIndexedBamReader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiIndexedBamReader.h" + +#include +#include +#include + +#include + +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class PbiIndexedBamReader::PbiIndexedBamReaderPrivate +{ +public: + explicit PbiIndexedBamReaderPrivate(const std::shared_ptr& index) + : index_{index}, currentBlockReadCount_{0}, numMatchingReads_{0} + { + } + + void ApplyOffsets() + { + const auto& fileOffsets = index_->BasicData().fileOffset_; + for (IndexResultBlock& block : blocks_) + block.virtualOffset_ = fileOffsets.at(block.firstIndex_); + } + + void Filter(const PbiFilter filter) + { + // store request & reset counters + filter_ = std::move(filter); + currentBlockReadCount_ = 0; + blocks_.clear(); + numMatchingReads_ = 0; + + // find blocks of reads passing filter criteria + const auto totalReads = index_->NumReads(); + if (totalReads == 0) { // empty PBI - no reads to use + return; + } else if (filter_.IsEmpty()) { // empty filter - use all reads + numMatchingReads_ = totalReads; + blocks_.emplace_back(0, totalReads); + } else { + IndexList indices; + indices.reserve(totalReads); + const auto& idx = *index_; + for (size_t i = 0; i < totalReads; ++i) { + if (filter_.Accepts(idx, i)) { + indices.push_back(i); + ++numMatchingReads_; + } + } + blocks_ = MergedIndexBlocks(std::move(indices)); + } + + // apply offsets + ApplyOffsets(); + } + + IndexResultBlocks MergedIndexBlocks(IndexList indices) const + { + if (indices.empty()) return {}; + + std::sort(indices.begin(), indices.end()); + auto newEndIter = std::unique(indices.begin(), indices.end()); + auto numIndices = std::distance(indices.begin(), newEndIter); + auto result = IndexResultBlocks{IndexResultBlock{indices.at(0), 1}}; + for (auto i = 1; i < numIndices; ++i) { + if (indices.at(i) == indices.at(i - 1) + 1) + ++result.back().numReads_; + else + result.emplace_back(indices.at(i), 1); + } + return result; + } + + int ReadRawData(BGZF* bgzf, bam1_t* b) + { + // no data to fetch, return false + if (blocks_.empty()) return -1; // "EOF" + + // if on new block, seek to its first record + if (currentBlockReadCount_ == 0) { + const auto seekResult = bgzf_seek(bgzf, blocks_.at(0).virtualOffset_, SEEK_SET); + if (seekResult == -1) + throw std::runtime_error{"PbiIndexedBamReader: could not seek in BAM file"}; + } + + // read next record + const auto result = bam_read1(bgzf, b); + + // update counters. if block finished, pop & reset + ++currentBlockReadCount_; + if (currentBlockReadCount_ == blocks_.at(0).numReads_) { + blocks_.pop_front(); + currentBlockReadCount_ = 0; + } + + return result; + } + + PbiFilter filter_; + std::shared_ptr index_; + IndexResultBlocks blocks_; + size_t currentBlockReadCount_; + uint32_t numMatchingReads_; +}; + +PbiIndexedBamReader::PbiIndexedBamReader(PbiFilter filter, const std::string& filename) + : PbiIndexedBamReader{std::move(filter), BamFile{filename}} +{ +} + +PbiIndexedBamReader::PbiIndexedBamReader(PbiFilter filter, const std::string& filename, + const std::shared_ptr& index) + : PbiIndexedBamReader{std::move(filter), BamFile{filename}, index} +{ +} + +PbiIndexedBamReader::PbiIndexedBamReader(PbiFilter filter, BamFile bamFile) + : PbiIndexedBamReader{std::move(bamFile)} +{ + Filter(std::move(filter)); +} + +PbiIndexedBamReader::PbiIndexedBamReader(PbiFilter filter, BamFile bamFile, + const std::shared_ptr& index) + : PbiIndexedBamReader{std::move(bamFile), index} +{ + Filter(std::move(filter)); +} + +PbiIndexedBamReader::PbiIndexedBamReader(const std::string& bamFilename) + : PbiIndexedBamReader{BamFile{bamFilename}} +{ +} + +PbiIndexedBamReader::PbiIndexedBamReader(const std::string& bamFilename, + const std::shared_ptr& index) + : PbiIndexedBamReader{BamFile{bamFilename}, index} +{ +} + +PbiIndexedBamReader::PbiIndexedBamReader(BamFile bamFile) : BamReader{std::move(bamFile)} +{ + auto indexCache = MakePbiIndexCache(File()); + d_ = std::make_unique(indexCache->at(0)); +} + +PbiIndexedBamReader::PbiIndexedBamReader(BamFile bamFile, const std::shared_ptr& index) + : BamReader{std::move(bamFile)}, d_{std::make_unique(index)} +{ +} + +PbiIndexedBamReader::~PbiIndexedBamReader() = default; + +int PbiIndexedBamReader::ReadRawData(BGZF* bgzf, bam1_t* b) +{ + assert(d_); + return d_->ReadRawData(bgzf, b); +} + +const PbiFilter& PbiIndexedBamReader::Filter() const +{ + assert(d_); + return d_->filter_; +} + +PbiIndexedBamReader& PbiIndexedBamReader::Filter(PbiFilter filter) +{ + assert(d_); + d_->Filter(std::move(filter)); + return *this; +} + +uint32_t PbiIndexedBamReader::NumReads() const +{ + assert(d_); + return d_->numMatchingReads_; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/PbiRawData.cpp b/src/PbiRawData.cpp new file mode 100644 index 0000000..2b8bc69 --- /dev/null +++ b/src/PbiRawData.cpp @@ -0,0 +1,359 @@ +// File Description +/// \file PbiRawData.cpp +/// \brief Implements the classes used for working with raw PBI data. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/PbiRawData.h" + +#include +#include +#include +#include +#include + +#include + +#include "PbiIndexIO.h" +#include "pbbam/BamFile.h" +#include "pbbam/BamRecord.h" +#include "pbbam/RecordType.h" + +namespace PacBio { +namespace BAM { + +// ---------------------------------- +// PbiRawBarcodeData implementation +// ---------------------------------- + +PbiRawBarcodeData::PbiRawBarcodeData(uint32_t numReads) +{ + bcForward_.reserve(numReads); + bcReverse_.reserve(numReads); + bcQual_.reserve(numReads); +} + +PbiRawBarcodeData::PbiRawBarcodeData() = default; + +PbiRawBarcodeData::PbiRawBarcodeData(const PbiRawBarcodeData&) = default; + +PbiRawBarcodeData::PbiRawBarcodeData(PbiRawBarcodeData&&) = default; + +PbiRawBarcodeData& PbiRawBarcodeData::operator=(const PbiRawBarcodeData&) = default; + +PbiRawBarcodeData& PbiRawBarcodeData::operator=(PbiRawBarcodeData&&) = default; + +PbiRawBarcodeData::~PbiRawBarcodeData() = default; + +void PbiRawBarcodeData::AddRecord(const BamRecord& b) +{ + // check for any barcode data (both required) + if (b.HasBarcodes() && b.HasBarcodeQuality()) { + + // fetch data from record + int16_t bcForward; + int16_t bcReverse; + std::tie(bcForward, bcReverse) = b.Barcodes(); + + const auto bcQuality = boost::numeric_cast(b.BarcodeQuality()); + + // only store actual data if all values >= 0 + if (bcForward >= 0 && bcReverse >= 0 && bcQuality >= 0) { + bcForward_.push_back(bcForward); + bcReverse_.push_back(bcReverse); + bcQual_.push_back(bcQuality); + return; + } + } + + // if we get here, at least one value is either missing or is -1 + bcForward_.push_back(-1); + bcReverse_.push_back(-1); + bcQual_.push_back(-1); +} + +// ---------------------------------- +// PbiRawMappedData implementation +// ---------------------------------- + +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() = default; + +PbiRawMappedData::PbiRawMappedData(const PbiRawMappedData&) = default; + +PbiRawMappedData::PbiRawMappedData(PbiRawMappedData&&) = default; + +PbiRawMappedData& PbiRawMappedData::operator=(const PbiRawMappedData&) = default; + +PbiRawMappedData& PbiRawMappedData::operator=(PbiRawMappedData&&) = default; + +PbiRawMappedData::~PbiRawMappedData() = default; + +void PbiRawMappedData::AddRecord(const BamRecord& b) +{ + 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()); + + const auto matchesAndMismatches = b.NumMatchesAndMismatches(); + nM_.push_back(matchesAndMismatches.first); + nMM_.push_back(matchesAndMismatches.second); +} + +uint32_t PbiRawMappedData::NumDeletedBasesAt(size_t recordIndex) const +{ + return NumDeletedAndInsertedBasesAt(recordIndex).first; +} + +std::pair PbiRawMappedData::NumDeletedAndInsertedBasesAt( + size_t recordIndex) const +{ + const auto aStart = aStart_.at(recordIndex); + const auto aEnd = aEnd_.at(recordIndex); + const auto tStart = tStart_.at(recordIndex); + const auto tEnd = tEnd_.at(recordIndex); + const auto nM = nM_.at(recordIndex); + const auto nMM = nMM_.at(recordIndex); + + const auto numIns = (aEnd - aStart - nM - nMM); + const auto numDel = (tEnd - tStart - nM - nMM); + return {numDel, numIns}; +} + +uint32_t PbiRawMappedData::NumInsertedBasesAt(size_t recordIndex) const +{ + return NumDeletedAndInsertedBasesAt(recordIndex).second; +} + +// ------------------------------------ +// PbiReferenceEntry implementation +// ------------------------------------ + +const PbiReferenceEntry::ID PbiReferenceEntry::UNMAPPED_ID = static_cast(-1); +const PbiReferenceEntry::Row PbiReferenceEntry::UNSET_ROW = static_cast(-1); + +PbiReferenceEntry::PbiReferenceEntry() : PbiReferenceEntry{UNMAPPED_ID, UNSET_ROW, UNSET_ROW} {} + +PbiReferenceEntry::PbiReferenceEntry(ID id) : PbiReferenceEntry{id, UNSET_ROW, UNSET_ROW} {} + +PbiReferenceEntry::PbiReferenceEntry(ID id, Row beginRow, Row endRow) + : tId_{id}, beginRow_{beginRow}, endRow_{endRow} +{ +} + +PbiReferenceEntry::PbiReferenceEntry(const PbiReferenceEntry&) = default; + +PbiReferenceEntry::PbiReferenceEntry(PbiReferenceEntry&&) = default; + +PbiReferenceEntry& PbiReferenceEntry::operator=(const PbiReferenceEntry&) = default; + +PbiReferenceEntry& PbiReferenceEntry::operator=(PbiReferenceEntry&&) = default; + +PbiReferenceEntry::~PbiReferenceEntry() = default; + +// ------------------------------------ +// PbiRawReferenceData implementation +// ------------------------------------ + +PbiRawReferenceData::PbiRawReferenceData(uint32_t numRefs) { entries_.reserve(numRefs); } + +PbiRawReferenceData::PbiRawReferenceData() = default; + +PbiRawReferenceData::PbiRawReferenceData(const PbiRawReferenceData&) = default; + +PbiRawReferenceData::PbiRawReferenceData(PbiRawReferenceData&&) = default; + +PbiRawReferenceData& PbiRawReferenceData::operator=(const PbiRawReferenceData&) = default; + +PbiRawReferenceData& PbiRawReferenceData::operator=(PbiRawReferenceData&&) = default; + +PbiRawReferenceData::~PbiRawReferenceData() = default; + +// ---------------------------------- +// PbiRawBasicData implementation +// ---------------------------------- + +PbiRawBasicData::PbiRawBasicData(uint32_t numReads) +{ + rgId_.reserve(numReads); + qStart_.reserve(numReads); + qEnd_.reserve(numReads); + holeNumber_.reserve(numReads); + readQual_.reserve(numReads); + ctxtFlag_.reserve(numReads); + fileOffset_.reserve(numReads); + fileNumber_.reserve(numReads); +} + +PbiRawBasicData::PbiRawBasicData() = default; + +PbiRawBasicData::PbiRawBasicData(const PbiRawBasicData&) = default; + +PbiRawBasicData::PbiRawBasicData(PbiRawBasicData&&) = default; + +PbiRawBasicData& PbiRawBasicData::operator=(const PbiRawBasicData&) = default; + +PbiRawBasicData& PbiRawBasicData::operator=(PbiRawBasicData&&) = default; + +PbiRawBasicData::~PbiRawBasicData() = default; + +void PbiRawBasicData::AddRecord(const BamRecord& b, int64_t offset) +{ + // read group ID + auto rgId = b.ReadGroupBaseId(); + if (rgId.empty()) rgId = MakeReadGroupId(b.MovieName(), ToString(b.Type())); + const auto rawid = std::stoul(rgId, nullptr, 16); + const auto id = static_cast(rawid); + rgId_.push_back(id); + + // query start/end + if (IsCcsOrTranscript(b.Type())) { + qStart_.push_back(0); + qEnd_.push_back(b.Impl().SequenceLength()); + } else { + qStart_.push_back(b.QueryStart()); + qEnd_.push_back(b.QueryEnd()); + } + + // add'l basic data + holeNumber_.push_back(b.HasHoleNumber() ? b.HoleNumber() : 0); + readQual_.push_back(b.HasReadAccuracy() ? static_cast(b.ReadAccuracy()) : 0.0f); + ctxtFlag_.push_back(b.HasLocalContextFlags() ? b.LocalContextFlags() + : LocalContextFlags::NO_LOCAL_CONTEXT); + + // virtual offset of record start + fileOffset_.push_back(offset); + + // default file number + fileNumber_.push_back(0); +} + +// ---------------------------------- +// PbiRawData implementation +// ---------------------------------- + +PbiRawData::PbiRawData(std::string pbiFilename) : filename_{std::move(pbiFilename)} +{ + PbiIndexIO::Load(*this, filename_); +} + +PbiRawData::PbiRawData(const DataSet& dataset) + : sections_{PbiFile::BASIC | PbiFile::MAPPED | PbiFile::BARCODE} +{ + PbiIndexIO::LoadFromDataSet(*this, dataset); +} + +PbiRawData::PbiRawData() = default; + +PbiRawData::PbiRawData(const PbiRawData&) = default; + +PbiRawData::PbiRawData(PbiRawData&&) = default; + +PbiRawData& PbiRawData::operator=(const PbiRawData&) = default; + +PbiRawData& PbiRawData::operator=(PbiRawData&&) = default; + +PbiRawData::~PbiRawData() = default; + +const PbiRawBarcodeData& PbiRawData::BarcodeData() const { return barcodeData_; } + +PbiRawBarcodeData& PbiRawData::BarcodeData() { return barcodeData_; } + +const PbiRawBasicData& PbiRawData::BasicData() const { return basicData_; } + +PbiRawBasicData& PbiRawData::BasicData() { return basicData_; } + +std::string PbiRawData::Filename() const { return filename_; } + +PbiFile::Sections PbiRawData::FileSections() const { return sections_; } + +PbiRawData& PbiRawData::FileSections(PbiFile::Sections sections) +{ + sections_ = sections; + return *this; +} + +bool PbiRawData::HasBarcodeData() const { return HasSection(PbiFile::BARCODE); } + +bool PbiRawData::HasMappedData() const { return HasSection(PbiFile::MAPPED); } + +bool PbiRawData::HasReferenceData() const { return HasSection(PbiFile::REFERENCE); } + +bool PbiRawData::HasSection(const PbiFile::Section section) const +{ + return (sections_ & section) != 0; +} + +uint32_t PbiRawData::NumReads() const { return numReads_; } + +PbiRawData& PbiRawData::NumReads(uint32_t num) +{ + numReads_ = num; + return *this; +} + +const PbiRawMappedData& PbiRawData::MappedData() const { return mappedData_; } + +PbiRawMappedData& PbiRawData::MappedData() { return mappedData_; } + +const PbiRawReferenceData& PbiRawData::ReferenceData() const { return referenceData_; } + +PbiRawReferenceData& PbiRawData::ReferenceData() { return referenceData_; } + +PbiFile::VersionEnum PbiRawData::Version() const { return version_; } + +PbiRawData& PbiRawData::Version(PbiFile::VersionEnum version) +{ + version_ = version; + return *this; +} + +bool PbiReferenceEntry::operator==(const PbiReferenceEntry& other) const +{ + return tId_ == other.tId_ && beginRow_ == other.beginRow_ && endRow_ == other.endRow_; +} + +// PBI index caching + +PbiIndexCache MakePbiIndexCache(const DataSet& dataset) +{ + return MakePbiIndexCache(dataset.BamFiles()); +} + +PbiIndexCache MakePbiIndexCache(const std::vector& bamFiles) +{ + PbiIndexCache cache = std::make_shared>>(); + auto& indices = *cache.get(); + for (const auto& bamFile : bamFiles) { + const auto& pbiFilename = bamFile.PacBioIndexFilename(); + indices.push_back(std::make_shared(pbiFilename)); + } + return cache; +} + +PbiIndexCache MakePbiIndexCache(const BamFile& bamFile) +{ + std::vector bamFiles{bamFile}; + return MakePbiIndexCache(bamFiles); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/ProgramInfo.cpp b/src/ProgramInfo.cpp new file mode 100644 index 0000000..974efb4 --- /dev/null +++ b/src/ProgramInfo.cpp @@ -0,0 +1,156 @@ +// File Description +/// \file ProgramInfo.cpp +/// \brief Implements the ProgramInfo class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/ProgramInfo.h" + +#include + +#include "pbbam/SamTagCodec.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +const std::string ProgramInfoTokenID{"ID"}; +const std::string ProgramInfoTokenCL{"CL"}; +const std::string ProgramInfoTokenDS{"DS"}; +const std::string ProgramInfoTokenPN{"PN"}; +const std::string ProgramInfoTokenPP{"PP"}; +const std::string ProgramInfoTokenVN{"VN"}; + +} // anonymous + +ProgramInfo::ProgramInfo(std::string id) : id_{std::move(id)} {} + +ProgramInfo::ProgramInfo() = default; + +ProgramInfo::ProgramInfo(const ProgramInfo&) = default; + +ProgramInfo::ProgramInfo(ProgramInfo&&) = default; + +ProgramInfo& ProgramInfo::operator=(const ProgramInfo&) = default; + +ProgramInfo& ProgramInfo::operator=(ProgramInfo&&) = default; + +ProgramInfo::~ProgramInfo() = default; + +std::string ProgramInfo::CommandLine() const { return commandLine_; } + +ProgramInfo& ProgramInfo::CommandLine(std::string cmd) +{ + commandLine_ = std::move(cmd); + return *this; +} + +std::map ProgramInfo::CustomTags() const { return custom_; } + +ProgramInfo& ProgramInfo::CustomTags(std::map custom) +{ + custom_ = std::move(custom); + return *this; +} + +std::string ProgramInfo::Description() const { return description_; } + +ProgramInfo& ProgramInfo::Description(std::string description) +{ + description_ = std::move(description); + return *this; +} + +ProgramInfo ProgramInfo::FromSam(const std::string& sam) +{ + // pop off '@PG\t', then split rest of line into tokens + const auto tokens = Split(sam.substr(4), '\t'); + if (tokens.empty()) return {}; + + ProgramInfo prog; + std::map custom; + + // iterate over tokens + for (const auto& token : tokens) { + const auto tokenTag = token.substr(0, 2); + auto tokenValue = token.substr(3); + + // set program contents + // clang-format off + if (tokenTag == ProgramInfoTokenID) prog.Id(std::move(tokenValue)); + else if (tokenTag == ProgramInfoTokenCL) prog.CommandLine(std::move(tokenValue)); + else if (tokenTag == ProgramInfoTokenDS) prog.Description(std::move(tokenValue)); + else if (tokenTag == ProgramInfoTokenPN) prog.Name(std::move(tokenValue)); + else if (tokenTag == ProgramInfoTokenPP) prog.PreviousProgramId(std::move(tokenValue)); + else if (tokenTag == ProgramInfoTokenVN) prog.Version(std::move(tokenValue)); + // clang-format on + + // otherwise, "custom" tag + else + custom[tokenTag] = std::move(tokenValue); + } + + prog.CustomTags(custom); + return prog; +} + +std::string ProgramInfo::Id() const { return id_; } + +ProgramInfo& ProgramInfo::Id(std::string id) +{ + id_ = std::move(id); + return *this; +} + +bool ProgramInfo::IsValid() const { return !id_.empty(); } + +std::string ProgramInfo::Name() const { return name_; } + +ProgramInfo& ProgramInfo::Name(std::string name) +{ + name_ = std::move(name); + return *this; +} + +std::string ProgramInfo::PreviousProgramId() const { return previousProgramId_; } + +ProgramInfo& ProgramInfo::PreviousProgramId(std::string id) +{ + previousProgramId_ = std::move(id); + return *this; +} + +std::string ProgramInfo::ToSam(const ProgramInfo& prog) { return prog.ToSam(); } + +std::string ProgramInfo::ToSam() const +{ + std::ostringstream out; + out << "@PG" << MakeSamTag(ProgramInfoTokenID, id_); + + // clang-format off + if (!name_.empty()) out << MakeSamTag(ProgramInfoTokenPN, name_); + if (!version_.empty()) out << MakeSamTag(ProgramInfoTokenVN, version_); + if (!description_.empty()) out << MakeSamTag(ProgramInfoTokenDS, description_); + if (!previousProgramId_.empty()) out << MakeSamTag(ProgramInfoTokenPP, previousProgramId_); + if (!commandLine_.empty()) out << MakeSamTag(ProgramInfoTokenCL, commandLine_); + // clang-format on + + // append any custom tags + for (const auto& attribute : custom_) + out << MakeSamTag(attribute.first, attribute.second); + return out.str(); +} + +std::string ProgramInfo::Version() const { return version_; } + +ProgramInfo& ProgramInfo::Version(std::string version) +{ + version_ = std::move(version); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Pulse2BaseCache.h b/src/Pulse2BaseCache.h new file mode 100644 index 0000000..dc519cd --- /dev/null +++ b/src/Pulse2BaseCache.h @@ -0,0 +1,108 @@ +// Author: Derek Barnett + +#ifndef PULSE2BASECACHE_H +#define PULSE2BASECACHE_H + +#include +#include +#include +#include + +#include + +#include "pbbam/Config.h" + +namespace PacBio { +namespace BAM { + +class Pulse2BaseCache +{ +public: + /// \brief Creates a Pulse2BaseCache from pulseCall data ('pc' tag) + /// + /// Computes & stores cache of basecalled vs. squashed pulse positions for + /// later masking of pulse data. + /// + /// \param pulseCalls[in] string contents of 'pc' tag + /// + explicit Pulse2BaseCache(const std::string& pulseCalls) : data_(pulseCalls.size()) + { + // basecalled pulse -> data[i] == 1 + // squashed pulse -> data[i] == 0 + // + const auto numPulses = pulseCalls.size(); + for (size_t i = 0; i < numPulses; ++i) + data_[i] = std::isupper(pulseCalls.at(i)); + } + + Pulse2BaseCache() = delete; + Pulse2BaseCache(const Pulse2BaseCache&) = default; + Pulse2BaseCache(Pulse2BaseCache&&) = default; + Pulse2BaseCache& operator=(const Pulse2BaseCache&) = default; + Pulse2BaseCache& operator=(Pulse2BaseCache&&) = default; + ~Pulse2BaseCache() = default; + + /// + /// \brief FindFirst + /// \return + /// + size_t FindFirst() const { return data_.find_first(); } + + /// + /// \brief FindNext + /// \param from + /// \return + /// + size_t FindNext(size_t from) const { return data_.find_next(from); } + + /// + /// \brief IsBasecallAt + /// \param pos + /// \return + /// + bool IsBasecallAt(const size_t pos) const { return data_[pos]; } + + /// \returns the total number of pulses (basecalled & squashed) + /// + size_t NumPulses() const { return data_.size(); } + + /// \returns the total number of basecalled pulses + /// + size_t NumBases() const { return data_.count(); } + + /// \brief Removes squashed pulse positions from input data. + /// + /// \param[in] Contents of any per-pulse tag. + /// \returns Input \p pulseData less all squashed pulses + /// + template + T RemoveSquashedPulses(const T& pulseData) const + { + const auto numPulses = pulseData.size(); + assert(numPulses == data_.size()); + + // The reserve() below overshoots the required space, but numPulses is cheap + // to compute, and by definition will be sufficient to hold the result. Thus + // we only ever need to do one allocation. + // + T result; + result.reserve(numPulses); + + // Only include data at positions that match our cached pulse data. + // + size_t inputIndex = 0; + for (size_t i = 0; i < numPulses; ++i) { + if (data_[i]) result.push_back(pulseData.at(inputIndex)); + ++inputIndex; + } + return result; + } + +private: + boost::dynamic_bitset<> data_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // PULSE2BASECACHE_H diff --git a/src/QNameQuery.cpp b/src/QNameQuery.cpp new file mode 100644 index 0000000..fef263b --- /dev/null +++ b/src/QNameQuery.cpp @@ -0,0 +1,75 @@ +// File Description +/// \file QNameQuery.cpp +/// \brief Implements the QNameQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/QNameQuery.h" + +#include + +#include + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +class QNameQuery::QNameQueryPrivate +{ +public: + QNameQueryPrivate(const DataSet& dataset) + : reader_{std::make_unique(dataset)}, nextRecord_(boost::none) + { + } + + bool GetNext(std::vector& records) + { + records.clear(); + + std::string groupRecordName; + + if (nextRecord_.is_initialized()) { + BamRecord r = nextRecord_.get(); + groupRecordName = r.FullName(); + records.push_back(std::move(r)); + nextRecord_ = boost::none; + } + + BamRecord record; + while (reader_->GetNext(record)) { + if (records.empty()) { + groupRecordName = record.FullName(); + records.push_back(record); + } else { + assert(!records.empty()); + if (record.FullName() == groupRecordName) + records.push_back(record); + else { + nextRecord_ = record; + return true; + } + } + } + return !records.empty(); + } + +private: + std::unique_ptr reader_; + boost::optional nextRecord_; +}; + +QNameQuery::QNameQuery(const DataSet& dataset) + : internal::IGroupQuery(), d_{std::make_unique(dataset)} +{ +} + +QNameQuery::~QNameQuery() = default; + +bool QNameQuery::GetNext(std::vector& records) { return d_->GetNext(records); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/QualityValue.cpp b/src/QualityValue.cpp new file mode 100644 index 0000000..b6e27d6 --- /dev/null +++ b/src/QualityValue.cpp @@ -0,0 +1,41 @@ +// File Description +/// \file QualityValue.h +/// \brief Implements the QualityValue class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/QualityValue.h" + +#include + +namespace PacBio { +namespace BAM { + +const uint8_t QualityValue::MAX = 93; + +QualityValue::QualityValue(const uint8_t value) : value_{value} +{ + // clamp QV + if (value_ > QualityValue::MAX) value_ = QualityValue::MAX; +} + +QualityValue::QualityValue(const QualityValue&) = default; + +QualityValue::QualityValue(QualityValue&&) = default; + +QualityValue& QualityValue::operator=(const QualityValue&) = default; + +QualityValue& QualityValue::operator=(QualityValue&&) = default; + +QualityValue::~QualityValue() = default; + +char QualityValue::Fastq() const { return static_cast(value_ + 33); } + +QualityValue::operator uint8_t() const { return value_; } + +QualityValue QualityValue::FromFastq(const char c) { return {static_cast(c - 33)}; } + +} // namespace BAM +} // namespace PacBio diff --git a/src/QualityValues.cpp b/src/QualityValues.cpp new file mode 100644 index 0000000..75fa173 --- /dev/null +++ b/src/QualityValues.cpp @@ -0,0 +1,119 @@ +// File Description +/// \file QNameQuery.cpp +/// \brief Implements the QNameQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/QualityValues.h" + +#include +#include + +namespace PacBio { +namespace BAM { + +QualityValues::QualityValues(const std::string& fastqString) : std::vector{} +{ + std::string fastqString_{std::move(fastqString)}; + boost::algorithm::trim(fastqString_); + resize(fastqString_.size()); + std::transform(fastqString_.cbegin(), fastqString_.cend(), begin(), QualityValue::FromFastq); +} + +QualityValues::QualityValues(std::vector quals) + : std::vector{std::move(quals)} +{ +} + +QualityValues::QualityValues(const std::vector& quals) + : std::vector(quals.size()) +{ + std::copy(quals.cbegin(), quals.cend(), begin()); +} + +QualityValues::QualityValues(const std::vector::const_iterator first, + const std::vector::const_iterator last) + : std::vector(first, last) +{ +} + +QualityValues::QualityValues(const QualityValues::const_iterator first, + const QualityValues::const_iterator last) + : std::vector{} +{ + assign(first, last); +} + +QualityValues::QualityValues() = default; + +QualityValues::QualityValues(const QualityValues&) = default; + +QualityValues::QualityValues(QualityValues&&) = default; + +QualityValues& QualityValues::operator=(const QualityValues&) = default; + +QualityValues& QualityValues::operator=(QualityValues&&) = default; + +QualityValues::~QualityValues() = default; + +QualityValues& QualityValues::operator=(std::vector quals) +{ + std::vector::operator=(std::move(quals)); + return *this; +} + +std::vector::const_iterator QualityValues::cbegin() const +{ + return std::vector::cbegin(); +} + +std::vector::const_iterator QualityValues::cend() const +{ + return std::vector::cend(); +} + +std::vector::const_iterator QualityValues::begin() const +{ + return std::vector::begin(); +} + +std::vector::const_iterator QualityValues::end() const +{ + return std::vector::end(); +} + +std::vector::iterator QualityValues::begin() +{ + return std::vector::begin(); +} + +std::vector::iterator QualityValues::end() +{ + return std::vector::end(); +} + +QualityValues QualityValues::FromFastq(const std::string& fastq) { return QualityValues{fastq}; } + +std::string QualityValues::Fastq() const +{ + std::string result; + result.reserve(size()); + for (const auto qv : *this) + result.push_back(qv.Fastq()); + return result; +} + +bool QualityValues::operator==(const std::string& fastq) const +{ + return *this == QualityValues(fastq); +} + +bool QualityValues::operator!=(const std::string& fastq) const +{ + return *this != QualityValues(fastq); +} + +} // namespace BA< +} // namespace PacBio diff --git a/src/ReadAccuracyQuery.cpp b/src/ReadAccuracyQuery.cpp new file mode 100644 index 0000000..9f6fc7a --- /dev/null +++ b/src/ReadAccuracyQuery.cpp @@ -0,0 +1,44 @@ +// File Description +/// \file ReadAccuracyQuery.cpp +/// \brief Implements the ReadAccuracyQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/ReadAccuracyQuery.h" + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFilterTypes.h" + +namespace PacBio { +namespace BAM { + +class ReadAccuracyQuery::ReadAccuracyQueryPrivate +{ +public: + ReadAccuracyQueryPrivate(const Accuracy accuracy, const Compare::Type compareType, + const DataSet& dataset) + : reader_{PbiReadAccuracyFilter{accuracy, compareType}, dataset} + { + } + + PbiFilterCompositeBamReader reader_; // unsorted +}; + +ReadAccuracyQuery::ReadAccuracyQuery(const Accuracy accuracy, const Compare::Type compareType, + const DataSet& dataset) + : internal::IQuery() + , d_{std::make_unique(accuracy, compareType, dataset)} +{ +} + +ReadAccuracyQuery::~ReadAccuracyQuery() = default; + +bool ReadAccuracyQuery::GetNext(BamRecord& r) { return d_->reader_.GetNext(r); } + +uint32_t ReadAccuracyQuery::NumReads() const { return d_->reader_.NumReads(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/ReadGroupInfo.cpp b/src/ReadGroupInfo.cpp new file mode 100644 index 0000000..bacb370 --- /dev/null +++ b/src/ReadGroupInfo.cpp @@ -0,0 +1,916 @@ +// File Description +/// \file ReadGroupInfo.cpp +/// \brief Implements the ReadGroupInfo class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/ReadGroupInfo.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "ChemistryTable.h" +#include "EnumClassHash.h" +#include "pbbam/MD5.h" +#include "pbbam/SamTagCodec.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +static const std::string sam_ID{"ID"}; +static const std::string sam_CN{"CN"}; +static const std::string sam_DS{"DS"}; +static const std::string sam_DT{"DT"}; +static const std::string sam_FO{"FO"}; +static const std::string sam_KS{"KS"}; +static const std::string sam_LB{"LB"}; +static const std::string sam_PG{"PG"}; +static const std::string sam_PI{"PI"}; +static const std::string sam_PL{"PL"}; +static const std::string sam_PM{"PM"}; +static const std::string sam_PU{"PU"}; +static const std::string sam_SM{"SM"}; +static const std::string sam_BC{"BC"}; + +static const std::string feature_DQ{"DeletionQV"}; +static const std::string feature_DT{"DeletionTag"}; +static const std::string feature_IQ{"InsertionQV"}; +static const std::string feature_MQ{"MergeQV"}; +static const std::string feature_SQ{"SubstitutionQV"}; +static const std::string feature_ST{"SubstitutionTag"}; +static const std::string feature_IP{"Ipd"}; +static const std::string feature_PW{"PulseWidth"}; +static const std::string feature_PM{"PkMid"}; +static const std::string feature_PA{"PkMean"}; +static const std::string feature_PI{"PkMid2"}; +static const std::string feature_PS{"PkMean2"}; +static const std::string feature_LT{"Label"}; +static const std::string feature_PQ{"LabelQV"}; +static const std::string feature_PT{"AltLabel"}; +static const std::string feature_PV{"AltLabelQV"}; +static const std::string feature_PG{"PulseMergeQV"}; +static const std::string feature_PC{"PulseCall"}; +static const std::string feature_PD{"PrePulseFrames"}; +static const std::string feature_PX{"PulseCallWidth"}; +static const std::string feature_SF{"StartFrame"}; +static const std::string feature_PE{"PulseExclusion"}; + +static const std::string token_RT{"READTYPE"}; +static const std::string token_BK{"BINDINGKIT"}; +static const std::string token_SK{"SEQUENCINGKIT"}; +static const std::string token_BV{"BASECALLERVERSION"}; +static const std::string token_FR{"FRAMERATEHZ"}; +static const std::string token_CT{"CONTROL"}; + +static const std::string token_BF{"BarcodeFile"}; +static const std::string token_BH{"BarcodeHash"}; +static const std::string token_BC{"BarcodeCount"}; +static const std::string token_BM{"BarcodeMode"}; +static const std::string token_BQ{"BarcodeQuality"}; + +static const std::string codec_RAW{"Frames"}; +static const std::string codec_V1{"CodecV1"}; + +static const std::string barcodemode_NONE{"None"}; +static const std::string barcodemode_SYM{"Symmetric"}; +static const std::string barcodemode_ASYM{"Asymmetric"}; +static const std::string barcodemode_TAIL{"Tailed"}; + +static const std::string barcodequal_NONE{"None"}; +static const std::string barcodequal_SCORE{"Score"}; +static const std::string barcodequal_PROB{"Probability"}; + +static const std::string platformModelType_ASTRO{"ASTRO"}; +static const std::string platformModelType_RS{"RS"}; +static const std::string platformModelType_SEQUEL{"SEQUEL"}; +static const std::string platformModelType_SEQUELII{"SEQUELII"}; + +// clang-format off +std::string BaseFeatureName(const BaseFeature& feature) +{ + static const std::unordered_map lookup{ + {BaseFeature::DELETION_QV, feature_DQ}, + {BaseFeature::DELETION_TAG, feature_DT}, + {BaseFeature::INSERTION_QV, feature_IQ}, + {BaseFeature::MERGE_QV, feature_MQ}, + {BaseFeature::SUBSTITUTION_QV, feature_SQ}, + {BaseFeature::SUBSTITUTION_TAG, feature_ST}, + {BaseFeature::IPD, feature_IP}, + {BaseFeature::PULSE_WIDTH, feature_PW}, + {BaseFeature::PKMID, feature_PM}, + {BaseFeature::PKMEAN, feature_PA}, + {BaseFeature::PKMID2, feature_PI}, + {BaseFeature::PKMEAN2, feature_PS}, + {BaseFeature::LABEL_QV, feature_PQ}, + {BaseFeature::ALT_LABEL, feature_PT}, + {BaseFeature::ALT_LABEL_QV, feature_PV}, + {BaseFeature::PULSE_MERGE_QV, feature_PG}, + {BaseFeature::PULSE_CALL, feature_PC}, + {BaseFeature::PRE_PULSE_FRAMES, feature_PD}, + {BaseFeature::PULSE_CALL_WIDTH, feature_PX}, + {BaseFeature::START_FRAME, feature_SF}, + {BaseFeature::PULSE_EXCLUSION, feature_PE} + }; + + const auto found = lookup.find(feature); + if (found != lookup.cend()) + return found->second; + throw std::runtime_error{ "ReadGroupInfo: unrecognized base feature" }; +} + +std::string FrameCodecName(const FrameCodec& codec) +{ + static const std::unordered_map lookup{ + {FrameCodec::RAW, codec_RAW}, + {FrameCodec::V1, codec_V1} + }; + + const auto found = lookup.find(codec); + if (found != lookup.cend()) + return found->second; + throw std::runtime_error{ "ReadGroupInfo: unrecognized frame codec" }; +} + +std::string BarcodeModeName(const BarcodeModeType& mode) +{ + static const std::unordered_map lookup{ + {BarcodeModeType::NONE, barcodemode_NONE}, + {BarcodeModeType::SYMMETRIC, barcodemode_SYM}, + {BarcodeModeType::ASYMMETRIC, barcodemode_ASYM}, + {BarcodeModeType::TAILED, barcodemode_TAIL} + }; + + const auto found = lookup.find(mode); + if (found != lookup.cend()) + return found->second; + throw std::runtime_error{ "ReadGroupInfo: unrecognized barcode mode type" }; +} + +std::string BarcodeQualityName(const BarcodeQualityType& type) +{ + static const std::unordered_map lookup{ + {BarcodeQualityType::NONE, barcodequal_NONE}, + {BarcodeQualityType::SCORE, barcodequal_SCORE}, + {BarcodeQualityType::PROBABILITY, barcodequal_PROB} + }; + + const auto found = lookup.find(type); + if (found != lookup.cend()) + return found->second; + throw std::runtime_error{ "ReadGroupInfo: unrecognized barcode quality type" }; +} + +std::string PlatformModelName(const PlatformModelType& type) +{ + static const std::unordered_map lookup{ + {PlatformModelType::ASTRO, platformModelType_ASTRO}, + {PlatformModelType::RS, platformModelType_RS}, + {PlatformModelType::SEQUEL, platformModelType_SEQUEL}, + {PlatformModelType::SEQUELII, platformModelType_SEQUELII} + }; + + const auto found = lookup.find(type); + if (found != lookup.cend()) + return found->second; + throw std::runtime_error{ "ReadGroupInfo: unrecognized platform model type" }; +} + +static const std::map nameToFeature +{ + { feature_DQ, BaseFeature::DELETION_QV }, + { feature_DT, BaseFeature::DELETION_TAG }, + { feature_IQ, BaseFeature::INSERTION_QV }, + { feature_MQ, BaseFeature::MERGE_QV }, + { feature_SQ, BaseFeature::SUBSTITUTION_QV }, + { feature_ST, BaseFeature::SUBSTITUTION_TAG }, + { feature_IP, BaseFeature::IPD }, + { feature_PW, BaseFeature::PULSE_WIDTH }, + { feature_PM, BaseFeature::PKMID }, + { feature_PA, BaseFeature::PKMEAN }, + { feature_PI, BaseFeature::PKMID2 }, + { feature_PS, BaseFeature::PKMEAN2 }, + { feature_PQ, BaseFeature::LABEL_QV }, + { feature_PT, BaseFeature::ALT_LABEL }, + { feature_PV, BaseFeature::ALT_LABEL_QV }, + { feature_PC, BaseFeature::PULSE_CALL }, + { feature_PG, BaseFeature::PULSE_MERGE_QV }, + { feature_PD, BaseFeature::PRE_PULSE_FRAMES }, + { feature_PX, BaseFeature::PULSE_CALL_WIDTH }, + { feature_SF, BaseFeature::START_FRAME }, + { feature_PE, BaseFeature::PULSE_EXCLUSION } +}; + +static const std::map nameToCodec +{ + { codec_RAW, FrameCodec::RAW }, + { codec_V1, FrameCodec::V1 } +}; + +static const std::map nameToBarcodeMode +{ + { barcodemode_NONE, BarcodeModeType::NONE }, + { barcodemode_SYM, BarcodeModeType::SYMMETRIC }, + { barcodemode_ASYM, BarcodeModeType::ASYMMETRIC }, + { barcodemode_TAIL, BarcodeModeType::TAILED } +}; + +static const std::map nameToBarcodeQuality +{ + { barcodequal_NONE, BarcodeQualityType::NONE }, + { barcodequal_SCORE, BarcodeQualityType::SCORE }, + { barcodequal_PROB, BarcodeQualityType::PROBABILITY } +}; + +static const std::map nameToPlatformModel +{ + { platformModelType_ASTRO, PlatformModelType::ASTRO }, + { platformModelType_RS, PlatformModelType::RS }, + { platformModelType_SEQUEL, PlatformModelType::SEQUEL }, + { platformModelType_SEQUELII, PlatformModelType::SEQUELII } +}; +// clang-format on + +bool IsLikelyBarcodeKey(const std::string& name) { return name.find("Barcode") == 0; } + +bool IsBaseFeature(const std::string& name) +{ + return nameToFeature.find(name) != nameToFeature.cend(); +} + +BaseFeature BaseFeatureFromName(const std::string& name) { return nameToFeature.at(name); } + +FrameCodec FrameCodecFromName(const std::string& name) { return nameToCodec.at(name); } + +BarcodeModeType BarcodeModeFromName(const std::string& name) { return nameToBarcodeMode.at(name); } + +BarcodeQualityType BarcodeQualityFromName(const std::string& name) +{ + return nameToBarcodeQuality.at(name); +} + +PlatformModelType PlatformModelFromName(std::string name) { return nameToPlatformModel.at(name); } + +} // anonymous + +ReadGroupInfo::ReadGroupInfo(std::string baseId, std::pair barcodes) + +{ + std::ostringstream id; + id << baseId << '/' << std::to_string(barcodes.first) << "--" + << std::to_string(barcodes.second); + id_ = id.str(); + baseId_ = std::move(baseId); + barcodes_ = std::move(barcodes); +} + +ReadGroupInfo::ReadGroupInfo() : readType_{"UNKNOWN"} {} + +ReadGroupInfo::ReadGroupInfo(std::string id) : readType_{"UNKNOWN"} { Id(std::move(id)); } + +ReadGroupInfo::ReadGroupInfo(std::string movieName, std::string readType) + : ReadGroupInfo{std::move(movieName), std::move(readType), PlatformModelType::SEQUEL} +{ +} + +ReadGroupInfo::ReadGroupInfo(std::string movieName, std::string readType, + std::pair barcodes) + : ReadGroupInfo{std::move(movieName), std::move(readType), PlatformModelType::SEQUEL, + std::move(barcodes)} +{ +} + +ReadGroupInfo::ReadGroupInfo(std::string movieName, std::string readType, + PlatformModelType platform) + : platformModel_{std::move(platform)} +{ + Id(MakeReadGroupId(movieName, readType)); + movieName_ = std::move(movieName); + readType_ = std::move(readType); +} + +ReadGroupInfo::ReadGroupInfo(std::string movieName, std::string readType, + PlatformModelType platform, std::pair barcodes) + : ReadGroupInfo{MakeReadGroupId(movieName, readType), std::move(barcodes)} +{ + platformModel_ = std::move(platform); +} + +ReadGroupInfo::ReadGroupInfo(const ReadGroupInfo&) = default; + +ReadGroupInfo::ReadGroupInfo(ReadGroupInfo&&) = default; + +ReadGroupInfo& ReadGroupInfo::operator=(const ReadGroupInfo&) = default; + +ReadGroupInfo& ReadGroupInfo::operator=(ReadGroupInfo&&) = default; + +ReadGroupInfo::~ReadGroupInfo() = default; + +bool ReadGroupInfo::operator==(const ReadGroupInfo& other) const +{ + const auto lhsFields = std::tie( + id_, sequencingCenter_, date_, flowOrder_, keySequence_, library_, programs_, + platformModel_, predictedInsertSize_, movieName_, sample_, readType_, bindingKit_, + sequencingKit_, basecallerVersion_, frameRateHz_, control_, ipdCodec_, pulseWidthCodec_, + hasBarcodeData_, barcodeFile_, barcodeHash_, barcodeCount_, barcodeMode_, barcodeQuality_); + + const auto rhsFields = std::tie( + other.id_, other.sequencingCenter_, other.date_, other.flowOrder_, other.keySequence_, + other.library_, other.programs_, other.platformModel_, other.predictedInsertSize_, + other.movieName_, other.sample_, other.readType_, other.bindingKit_, other.sequencingKit_, + other.basecallerVersion_, other.frameRateHz_, other.control_, other.ipdCodec_, + other.pulseWidthCodec_, other.hasBarcodeData_, other.barcodeFile_, other.barcodeHash_, + other.barcodeCount_, other.barcodeMode_, other.barcodeQuality_); + + return lhsFields == rhsFields && + boost::algorithm::equal(features_.cbegin(), features_.cend(), other.features_.cbegin(), + other.features_.cend()) && + boost::algorithm::equal(custom_.cbegin(), custom_.cend(), other.custom_.cbegin(), + other.custom_.cend()); +} + +size_t ReadGroupInfo::BarcodeCount() const +{ + if (!hasBarcodeData_) + throw std::runtime_error{ + "ReadGroupInfo: barcode count requested but barcode data is missing"}; + return barcodeCount_; +} + +ReadGroupInfo& ReadGroupInfo::BarcodeData(std::string barcodeFile, std::string barcodeHash, + size_t barcodeCount, BarcodeModeType barcodeMode, + BarcodeQualityType barcodeQuality) +{ + barcodeFile_ = std::move(barcodeFile); + barcodeHash_ = std::move(barcodeHash); + barcodeCount_ = barcodeCount; + barcodeMode_ = barcodeMode; + barcodeQuality_ = barcodeQuality; + hasBarcodeData_ = true; + return *this; +} + +std::string ReadGroupInfo::BarcodeFile() const +{ + if (!hasBarcodeData_) + throw std::runtime_error{ + "ReadGroupInfo: barcode file requested but barcode data is missing"}; + return barcodeFile_; +} + +std::string ReadGroupInfo::BarcodeHash() const +{ + if (!hasBarcodeData_) + throw std::runtime_error{ + "ReadGroupInfo: barcode hash requested but barcode data is missing"}; + return barcodeHash_; +} + +BarcodeModeType ReadGroupInfo::BarcodeMode() const +{ + if (!hasBarcodeData_) + throw std::runtime_error{ + "ReadGroupInfo: barcode mode requested but barcode data is missing"}; + return barcodeMode_; +} + +BarcodeQualityType ReadGroupInfo::BarcodeQuality() const +{ + if (!hasBarcodeData_) + throw std::runtime_error{ + "ReadGroupInfo: barcode quality requested but barcode data is missing"}; + return barcodeQuality_; +} + +boost::optional ReadGroupInfo::BarcodeForward() const +{ + const auto barcodes = Barcodes(); + if (barcodes) return barcodes->first; + return boost::make_optional(false, uint16_t{0}); +} + +boost::optional ReadGroupInfo::BarcodeReverse() const +{ + const auto barcodes = Barcodes(); + if (barcodes) return barcodes->second; + return boost::make_optional(false, uint16_t{0}); +} + +boost::optional> ReadGroupInfo::Barcodes() const { return barcodes_; } + +std::string ReadGroupInfo::BasecallerVersion() const { return basecallerVersion_; } + +ReadGroupInfo& ReadGroupInfo::BasecallerVersion(std::string versionNumber) +{ + if (basecallerVersion_ != versionNumber) { + basecallerVersion_ = std::move(versionNumber); + sequencingChemistry_.clear(); // reset cached chemistry name + } + return *this; +} + +std::string ReadGroupInfo::BaseFeatureTag(BaseFeature feature) const +{ + const auto iter = features_.find(feature); + if (iter == features_.end()) return {}; + return iter->second; +} + +ReadGroupInfo& ReadGroupInfo::BaseFeatureTag(BaseFeature feature, std::string tag) +{ + features_[feature] = std::move(tag); + return *this; +} + +std::string ReadGroupInfo::BaseId() const { return baseId_; } + +std::string ReadGroupInfo::BindingKit() const { return bindingKit_; } + +ReadGroupInfo& ReadGroupInfo::BindingKit(std::string kitNumber) +{ + if (bindingKit_ != kitNumber) { + bindingKit_ = std::move(kitNumber); + sequencingChemistry_.clear(); // reset cached chemistry name + } + return *this; +} + +ReadGroupInfo& ReadGroupInfo::ClearBarcodeData() +{ + barcodeFile_.clear(); + barcodeHash_.clear(); + hasBarcodeData_ = false; + return *this; +} + +ReadGroupInfo& ReadGroupInfo::ClearBaseFeatures() +{ + features_.clear(); + return *this; +} + +bool ReadGroupInfo::Control() const { return control_; } + +ReadGroupInfo& ReadGroupInfo::Control(bool ctrl) +{ + control_ = ctrl; + return *this; +} + +std::map ReadGroupInfo::CustomTags() const { return custom_; } + +ReadGroupInfo& ReadGroupInfo::CustomTags(std::map custom) +{ + custom_ = std::move(custom); + return *this; +} + +std::string ReadGroupInfo::Date() const { return date_; } + +ReadGroupInfo& ReadGroupInfo::Date(std::string date) +{ + date_ = std::move(date); + return *this; +} + +void ReadGroupInfo::DecodeBarcodeKey(const std::string& key, std::string value) +{ + if (key == token_BF) + barcodeFile_ = std::move(value); + else if (key == token_BH) + barcodeHash_ = std::move(value); + else if (key == token_BC) + barcodeCount_ = std::stoul(value); + else if (key == token_BM) + barcodeMode_ = BarcodeModeFromName(value); + else if (key == token_BQ) + barcodeQuality_ = BarcodeQualityFromName(value); +} + +void ReadGroupInfo::DecodeFrameCodecKey(const std::string& key, std::string value) +{ + const auto keyParts = Split(key, ':'); + if (keyParts.size() == 2) { + const auto& subkey = keyParts.at(0); + if (subkey == feature_IP) { + ipdCodec_ = FrameCodecFromName(keyParts.at(1)); + features_[BaseFeature::IPD] = std::move(value); + } else if (subkey == feature_PW) { + pulseWidthCodec_ = FrameCodecFromName(keyParts.at(1)); + features_[BaseFeature::PULSE_WIDTH] = std::move(value); + } + } +} + +void ReadGroupInfo::DecodeSamDescription(const std::string& description) +{ + const auto tokens = Split(description, ';'); + if (tokens.empty()) return; + + // iterate over tokens + for (const auto& token : tokens) { + + const auto foundEqual = token.find('='); + if (foundEqual == std::string::npos) continue; + + const auto key = token.substr(0, foundEqual); + auto value = token.substr(foundEqual + 1); + + // 'mandatory' items + // clang-format off + if (key == token_RT) readType_ = std::move(value); + else if (key == token_BK) bindingKit_ = std::move(value); + else if (key == token_BV) basecallerVersion_ = std::move(value); + else if (key == token_SK) sequencingKit_ = std::move(value); + else if (key == token_FR) frameRateHz_ = std::move(value); + else if (key == token_CT) control_ = (value == "TRUE"); + // clang-format on + + // base features + else if (IsBaseFeature(key)) + features_[BaseFeatureFromName(key)] = std::move(value); + + // barcode data + else if (IsLikelyBarcodeKey(key)) + DecodeBarcodeKey(key, std::move(value)); + + // frame codecs + else + DecodeFrameCodecKey(key, std::move(value)); + } + + hasBarcodeData_ = !barcodeFile_.empty(); +} + +std::string ReadGroupInfo::EncodeSamDescription() const +{ + constexpr static const char SEP = ';'; + constexpr static const char COLON = ':'; + constexpr static const char EQ = '='; + + std::string result{token_RT + EQ + readType_}; + + std::string featureName; + for (const auto& feature : features_) { + + featureName = BaseFeatureName(feature.first); + if (featureName.empty() || feature.second.empty()) + continue; + else if (featureName == feature_IP) { + featureName.push_back(COLON); + featureName.append(FrameCodecName(ipdCodec_)); + } else if (featureName == feature_PW) { + featureName.push_back(COLON); + featureName.append(FrameCodecName(pulseWidthCodec_)); + } + result.append(SEP + featureName + EQ + feature.second); + } + + // clang-format off + if (!bindingKit_.empty()) result.append(SEP + token_BK + EQ + bindingKit_); + if (!sequencingKit_.empty()) result.append(SEP + token_SK + EQ + sequencingKit_); + if (!basecallerVersion_.empty()) result.append(SEP + token_BV + EQ + basecallerVersion_); + if (!frameRateHz_.empty()) result.append(SEP + token_FR + EQ + frameRateHz_); + if (control_) result.append(SEP + token_CT + EQ + (control_ ? "TRUE" : "FALSE")); + // clang-format on + + if (hasBarcodeData_) { + const std::string barcodeData{SEP + token_BF + EQ + barcodeFile_ + SEP + token_BH + EQ + + barcodeHash_ + SEP + token_BC + EQ + + std::to_string(barcodeCount_) + SEP + token_BM + EQ + + BarcodeModeName(barcodeMode_) + SEP + token_BQ + EQ + + BarcodeQualityName(barcodeQuality_)}; + result.append(barcodeData); + } + + return result; +} + +std::string ReadGroupInfo::FlowOrder() const { return flowOrder_; } + +ReadGroupInfo& ReadGroupInfo::FlowOrder(std::string order) +{ + flowOrder_ = std::move(order); + return *this; +} + +std::string ReadGroupInfo::FrameRateHz() const { return frameRateHz_; } + +ReadGroupInfo& ReadGroupInfo::FrameRateHz(std::string frameRateHz) +{ + frameRateHz_ = std::move(frameRateHz); + return *this; +} + +ReadGroupInfo ReadGroupInfo::FromSam(const std::string& sam) +{ + // pop off '@RG\t', then split rest of line into tokens + const auto tokens = Split(sam.substr(4), '\t'); + if (tokens.empty()) return {}; + + ReadGroupInfo rg; + std::map custom; + + for (const auto& token : tokens) { + const auto tokenTag = token.substr(0, 2); + auto tokenValue = token.substr(3); + + // set read group info + // clang-format off + if (tokenTag == sam_ID) rg.Id(std::move(tokenValue)); + else if (tokenTag == sam_CN) rg.SequencingCenter(std::move(tokenValue)); + else if (tokenTag == sam_DT) rg.Date(std::move(tokenValue)); + else if (tokenTag == sam_FO) rg.FlowOrder(std::move(tokenValue)); + else if (tokenTag == sam_KS) rg.KeySequence(std::move(tokenValue)); + else if (tokenTag == sam_LB) rg.Library(std::move(tokenValue)); + else if (tokenTag == sam_PG) rg.Programs(std::move(tokenValue)); + else if (tokenTag == sam_PI) rg.PredictedInsertSize(std::move(tokenValue)); + else if (tokenTag == sam_PU) rg.MovieName(std::move(tokenValue)); + else if (tokenTag == sam_SM) rg.Sample(std::move(tokenValue)); + else if (tokenTag == sam_DS) rg.DecodeSamDescription(std::move(tokenValue)); + else if (tokenTag == sam_PM) rg.PlatformModel(PlatformModelFromName(std::move(tokenValue))); + // clang-format on + + // if not platform name (always "PACBIO" for us), store as a custom tag + else if (tokenTag != sam_PL) + custom[tokenTag] = std::move(tokenValue); + } + rg.CustomTags(std::move(custom)); + + return rg; +} + +std::string ReadGroupInfo::GetBaseId(const std::string& id) +{ + const auto slashAt = id.find('/'); + if (slashAt == std::string::npos) + return id; + else + return id.substr(0, slashAt); +} + +bool ReadGroupInfo::HasBarcodeData() const { return hasBarcodeData_; } + +bool ReadGroupInfo::HasBaseFeature(BaseFeature feature) const +{ + return features_.find(feature) != features_.end(); +} + +std::string ReadGroupInfo::Id() const { return id_; } + +ReadGroupInfo& ReadGroupInfo::Id(const std::string& movieName, const std::string& readType) +{ + return Id(MakeReadGroupId(movieName, readType)); +} + +ReadGroupInfo& ReadGroupInfo::Id(std::string id) +{ + barcodes_.reset(); + + // maybe parse for barcode labels + const auto slashAt = id.find('/'); + if (slashAt != std::string::npos) { + // looks like we do, parse & store + const auto tokens = Split(id.substr(slashAt + 1), '-'); + if (tokens.size() != 3) { + throw std::runtime_error{ + "ReadGroupInfo: could not fetch barcodes from malformatted read group ID: " + id + + " Must be in the form: {RGID_STRING}/{bcForward}--{bcReverse}"}; + } + + // catch here so we can give more informative message + try { + barcodes_ = std::pair(static_cast(std::stoul(tokens[0])), + static_cast(std::stoul(tokens[2]))); + } catch (std::exception& e) { + throw std::runtime_error{ + "ReadGroupInfo: could not fetch barcodes from malformatted read group ID: " + id + + " Must be in the form: {RGID_STRING}/{bcForward}--{bcReverse}"}; + } + } + + baseId_ = id.substr(0, slashAt); + id_ = std::move(id); + return *this; +} + +int32_t ReadGroupInfo::IdToInt(const std::string& rgId) +{ + const auto id = GetBaseId(rgId); + const uint32_t rawid = std::stoul(id, nullptr, 16); + return static_cast(rawid); +} + +std::string ReadGroupInfo::IntToId(const int32_t id) +{ + std::ostringstream s; + s << std::setfill('0') << std::setw(8) << std::hex << id; + return s.str(); +} + +FrameCodec ReadGroupInfo::IpdCodec() const { return ipdCodec_; } + +ReadGroupInfo& ReadGroupInfo::IpdCodec(FrameCodec codec, std::string tag) +{ + // store desired codec type + ipdCodec_ = std::move(codec); + + // update base features map + const std::string actualTag = (tag.empty() ? "ip" : std::move(tag)); + BaseFeatureTag(BaseFeature::IPD, actualTag); + return *this; +} + +bool ReadGroupInfo::IsValid() const { return !id_.empty(); } + +std::string ReadGroupInfo::KeySequence() const { return keySequence_; } + +ReadGroupInfo& ReadGroupInfo::KeySequence(std::string sequence) +{ + keySequence_ = std::move(sequence); + return *this; +} + +std::string ReadGroupInfo::Library() const { return library_; } + +ReadGroupInfo& ReadGroupInfo::Library(std::string library) +{ + library_ = std::move(library); + return *this; +} + +std::string ReadGroupInfo::MovieName() const { return movieName_; } + +ReadGroupInfo& ReadGroupInfo::MovieName(std::string movieName) +{ + movieName_ = std::move(movieName); + return *this; +} + +std::string ReadGroupInfo::Platform() const { return std::string("PACBIO"); } + +PlatformModelType ReadGroupInfo::PlatformModel() const { return platformModel_; } + +ReadGroupInfo& ReadGroupInfo::PlatformModel(PlatformModelType platform) +{ + platformModel_ = platform; + return *this; +} + +std::string ReadGroupInfo::PredictedInsertSize() const { return predictedInsertSize_; } + +ReadGroupInfo& ReadGroupInfo::PredictedInsertSize(std::string size) +{ + predictedInsertSize_ = std::move(size); + return *this; +} + +std::string ReadGroupInfo::Programs() const { return programs_; } + +ReadGroupInfo& ReadGroupInfo::Programs(std::string programs) +{ + programs_ = std::move(programs); + return *this; +} + +FrameCodec ReadGroupInfo::PulseWidthCodec() const { return pulseWidthCodec_; } + +ReadGroupInfo& ReadGroupInfo::PulseWidthCodec(FrameCodec codec, std::string tag) +{ + // store desired codec type + pulseWidthCodec_ = std::move(codec); + + // update base features map + const std::string actualTag = (tag.empty() ? "pw" : std::move(tag)); + BaseFeatureTag(BaseFeature::PULSE_WIDTH, actualTag); + return *this; +} + +std::string ReadGroupInfo::ReadType() const { return readType_; } + +ReadGroupInfo& ReadGroupInfo::ReadType(std::string type) +{ + readType_ = std::move(type); + return *this; +} + +ReadGroupInfo& ReadGroupInfo::RemoveBaseFeature(BaseFeature feature) +{ + const auto iter = features_.find(feature); + if (iter != features_.end()) features_.erase(iter); + return *this; +} + +std::string ReadGroupInfo::Sample() const { return sample_; } + +ReadGroupInfo& ReadGroupInfo::Sample(std::string sample) +{ + sample_ = std::move(sample); + return *this; +} + +std::string ReadGroupInfo::SequencingCenter() const { return sequencingCenter_; } + +ReadGroupInfo& ReadGroupInfo::SequencingCenter(std::string center) +{ + sequencingCenter_ = std::move(center); + return *this; +} + +std::string ReadGroupInfo::SequencingChemistry() const +{ + if (!sequencingChemistry_.empty()) return sequencingChemistry_; + return sequencingChemistry_ = + SequencingChemistryFromTriple(BindingKit(), SequencingKit(), BasecallerVersion()); +} + +std::string ReadGroupInfo::SequencingChemistryFromTriple(const std::string& bindingKit, + const std::string& sequencingKit, + const std::string& basecallerVersion) +{ + const auto verFields = Split(basecallerVersion, '.'); + if (verFields.size() < 2) + throw std::runtime_error{"ReadGroupInfo: basecaller version is too short: " + + basecallerVersion}; + const std::string version{verFields.at(0) + '.' + verFields.at(1)}; + + // check updated table first, if it exists (empty if not), overriding the built-in lookup + for (const auto& row : GetChemistryTableFromEnv()) { + if (bindingKit == row[0] && sequencingKit == row[1] && version == row[2]) return row[3]; + } + + for (const auto& row : BuiltInChemistryTable()) { + if (bindingKit == row[0] && sequencingKit == row[1] && version == row[2]) return row[3]; + } + + // not found + throw InvalidSequencingChemistryException{bindingKit, sequencingKit, basecallerVersion}; +} + +std::string ReadGroupInfo::SequencingKit() const { return sequencingKit_; } + +ReadGroupInfo& ReadGroupInfo::SequencingKit(std::string kitNumber) +{ + if (sequencingKit_ != kitNumber) { + sequencingKit_ = std::move(kitNumber); + sequencingChemistry_.clear(); // reset cached chemistry name + } + return *this; +} + +std::string ReadGroupInfo::ToSam(const ReadGroupInfo& rg) { return rg.ToSam(); } + +std::string ReadGroupInfo::ToSam() const +{ + std::ostringstream out; + out << "@RG" << MakeSamTag(sam_ID, id_) << MakeSamTag(sam_PL, Platform()); + + const auto description = EncodeSamDescription(); + if (!description.empty()) out << MakeSamTag(sam_DS, description); + + // clang-format off + if (!sequencingCenter_.empty()) out << MakeSamTag(sam_CN, sequencingCenter_); + if (!date_.empty()) out << MakeSamTag(sam_DT, date_); + if (!flowOrder_.empty()) out << MakeSamTag(sam_FO, flowOrder_); + if (!keySequence_.empty()) out << MakeSamTag(sam_KS, keySequence_); + if (!library_.empty()) out << MakeSamTag(sam_LB, library_); + if (!programs_.empty()) out << MakeSamTag(sam_PG, programs_); + if (!predictedInsertSize_.empty()) out << MakeSamTag(sam_PI, predictedInsertSize_); + if (!movieName_.empty()) out << MakeSamTag(sam_PU, movieName_); + if (!sample_.empty()) out << MakeSamTag(sam_SM, sample_); + if (barcodes_) + { + out << '\t' << sam_BC << ':' + << barcodes_->first << "--" << barcodes_->second; + } + // clang-format on + + out << MakeSamTag(sam_PM, PlatformModelName(platformModel_)); + + // append any custom tags + for (const auto& attribute : custom_) + out << MakeSamTag(attribute.first, attribute.second); + + return out.str(); +} + +std::string MakeReadGroupId(const std::string& movieName, const std::string& readType) +{ + return MD5Hash(movieName + "//" + readType).substr(0, 8); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/RecordType.cpp b/src/RecordType.cpp new file mode 100644 index 0000000..6948f29 --- /dev/null +++ b/src/RecordType.cpp @@ -0,0 +1,45 @@ +// File Description +/// \file RecordType.h +/// \brief Implements the RecordType-related methods +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/RecordType.h" + +#include +#include + +namespace PacBio { +namespace BAM { + +bool IsCcsOrTranscript(const RecordType type) +{ + return (type == RecordType::CCS) || (type == RecordType::TRANSCRIPT); +} + +std::string ToString(const RecordType type) +{ + // clang-format off + static const auto lookup = std::map + { + { RecordType::ZMW, "ZMW" }, + { RecordType::HQREGION, "HQREGION" }, + { RecordType::SUBREAD, "SUBREAD" }, + { RecordType::CCS, "CCS" }, + { RecordType::SCRAP, "SCRAP" }, + { RecordType::TRANSCRIPT, "TRANSCRIPT" }, + { RecordType::UNKNOWN, "UNKNOWN" } + }; + // clang-format on + + try { + return lookup.at(type); + } catch (std::exception&) { + throw std::runtime_error{"BamRecordType: unknown type"}; + } +} + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/SamTagCodec.cpp b/src/SamTagCodec.cpp new file mode 100644 index 0000000..7572aac --- /dev/null +++ b/src/SamTagCodec.cpp @@ -0,0 +1,336 @@ +// File Description +/// \file SamTagCodec.h +/// \brief Implements the SamTagCodec class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/SamTagCodec.h" + +#include +#include + +#include + +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +template +inline void appendSamValue(const T& value, std::string& result) +{ + result.append(boost::lexical_cast(value)); +} + +template +inline void appendSamValue_8bit(const T& value, std::string& result) +{ + result.append(boost::lexical_cast(static_cast(value))); +} + +template +void appendSamMultiValue(const T& container, std::string& result) +{ + for (const auto x : container) { + result.push_back(','); + appendSamValue(x, result); + } +} + +template +void appendSamMultiValue_8bit(const T& container, std::string& result) +{ + for (const auto x : container) { + result.push_back(','); + appendSamValue_8bit(x, result); + } +} + +std::vector readFloatSamMultiValue(const std::string& data) +{ + std::vector result; + auto* c = const_cast(data.c_str()); + const char* end = c + data.length(); + while (c + 1 < end) + result.emplace_back(strtof(c + 1, &c)); + return result; +} + +template +std::vector readSignedSamMultiValue(const std::string& data) +{ + std::vector result; + auto* c = const_cast(data.c_str()); + const char* end = c + data.length(); + while (c + 1 < end) + result.emplace_back(strtol(c + 1, &c, 0)); + return result; +} + +template +std::vector readUnsignedSamMultiValue(const std::string& data) +{ + std::vector result; + auto* c = const_cast(data.c_str()); + const char* end = c + data.length(); + while (c + 1 < end) + result.emplace_back(strtoul(c + 1, &c, 0)); + return result; +} + +} // anonymous + +TagCollection SamTagCodec::Decode(const std::string& tagString) +{ + TagCollection tags; + + const auto tokens = Split(tagString, '\t'); + for (const auto& token : tokens) { + if (token.size() < 6) // TT:t:X + continue; + + const auto name = token.substr(0, 2); + const auto type = token.at(3); + const auto remainder = token.substr(5); + if (remainder.empty()) throw std::runtime_error{"SamTagCodec: malformatted tag: " + token}; + + switch (type) { + + // technically only 'A' is allowed in SAM chars, + // but we'll be a little permissive + case 'A': + case 'a': { + tags[name] = Tag{static_cast(remainder[0], 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': { + // check out boost::numeric cast for these conversions + + // negative value (force signed int) + if (remainder[0] == '-') { + const auto x = boost::lexical_cast(remainder); + if (x >= std::numeric_limits::min()) + tags[name] = static_cast(x); + else if (x >= std::numeric_limits::min()) + tags[name] = static_cast(x); + else + tags[name] = x; + } + + // unsigned int + else { + const auto x = boost::lexical_cast(remainder); + if (x <= std::numeric_limits::max()) + tags[name] = static_cast(x); + else if (x <= std::numeric_limits::max()) + tags[name] = static_cast(x); + else + tags[name] = x; + } + break; + } + + case 'f': { + tags[name] = boost::lexical_cast(remainder); + break; + } + + case 'Z': { + tags[name] = remainder; + break; + } + + case 'H': { + tags[name] = Tag(remainder, TagModifier::HEX_STRING); + break; + } + + case 'B': { + const auto elementType = remainder[0]; + const auto arrayData = remainder.substr(1); + switch (elementType) { + case 'c': + tags[name] = readSignedSamMultiValue(arrayData); + break; + case 'C': + tags[name] = readUnsignedSamMultiValue(arrayData); + break; + case 's': + tags[name] = readSignedSamMultiValue(arrayData); + break; + case 'S': + tags[name] = readUnsignedSamMultiValue(arrayData); + break; + case 'i': + tags[name] = readSignedSamMultiValue(arrayData); + break; + case 'I': + tags[name] = readUnsignedSamMultiValue(arrayData); + break; + case 'f': + tags[name] = readFloatSamMultiValue(arrayData); + break; + default: + throw std::runtime_error{ + "SamTagCodec: unsupported array-tag-type encountered: " + + std::string{1, elementType}}; + } + break; + } + + // unsupported SAM tag type + default: + throw std::runtime_error{"SamTagCodec: unsupported tag-type encountered: " + + std::string{1, type}}; + } + } + + return tags; +} + +std::string SamTagCodec::Encode(const TagCollection& tags) +{ + std::string result; + result.reserve(1024); + + for (const auto& tagIter : tags) { + const auto& name = tagIter.first; + if (name.size() != 2) + throw std::runtime_error{"SamTagCodec: malformatted tag name: " + name}; + + const auto& tag = tagIter.second; + if (tag.IsNull()) continue; + + // tab separator + if (!result.empty()) result.push_back('\t'); + + // ":" + result.append(name); + result.push_back(':'); + + // ":" for printable, ASCII char + if (tag.HasModifier(TagModifier::ASCII_CHAR)) { + const auto c = tag.ToAscii(); + if (c != '\0') { + result.push_back('A'); + result.push_back(':'); + result.push_back(c); + continue; + } + } + + // ":" for all other data + switch (tag.Type()) { + case TagDataType::INT8: + result.push_back('i'); + result.push_back(':'); + appendSamValue_8bit(tag.ToInt8(), result); + break; + case TagDataType::UINT8: + result.push_back('i'); + result.push_back(':'); + appendSamValue_8bit(tag.ToUInt8(), result); + break; + case TagDataType::INT16: + result.push_back('i'); + result.push_back(':'); + appendSamValue(tag.ToInt16(), result); + break; + case TagDataType::UINT16: + result.push_back('i'); + result.push_back(':'); + appendSamValue(tag.ToUInt16(), result); + break; + case TagDataType::INT32: + result.push_back('i'); + result.push_back(':'); + appendSamValue(tag.ToInt32(), result); + break; + case TagDataType::UINT32: + result.push_back('i'); + result.push_back(':'); + appendSamValue(tag.ToUInt32(), result); + break; + case TagDataType::FLOAT: + result.push_back('i'); + result.push_back(':'); + appendSamValue(tag.ToFloat(), result); + break; + + case TagDataType::STRING: { + result.push_back(tag.HasModifier(TagModifier::HEX_STRING) ? 'H' : 'Z'); + result.push_back(':'); + result.append(tag.ToString()); + break; + } + + case TagDataType::INT8_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('c'); + appendSamMultiValue_8bit(tag.ToInt8Array(), result); + break; + case TagDataType::UINT8_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('C'); + appendSamMultiValue_8bit(tag.ToUInt8Array(), result); + break; + case TagDataType::INT16_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('s'); + appendSamMultiValue(tag.ToInt16Array(), result); + break; + case TagDataType::UINT16_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('S'); + appendSamMultiValue(tag.ToUInt16Array(), result); + break; + case TagDataType::INT32_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('i'); + appendSamMultiValue(tag.ToInt32Array(), result); + break; + case TagDataType::UINT32_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('I'); + appendSamMultiValue(tag.ToUInt32Array(), result); + break; + case TagDataType::FLOAT_ARRAY: + result.push_back('B'); + result.push_back(':'); + result.push_back('f'); + appendSamMultiValue(tag.ToFloatArray(), result); + break; + + default: + throw std::runtime_error{"SamTagCodec: unsupported tag-type encountered: " + + std::to_string(static_cast(tag.Type()))}; + } + } + + return result; +} + +std::string MakeSamTag(std::string tag, std::string value) +{ + return '\t' + std::move(tag) + ':' + std::move(value); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/SamWriter.cpp b/src/SamWriter.cpp new file mode 100644 index 0000000..82520eb --- /dev/null +++ b/src/SamWriter.cpp @@ -0,0 +1,110 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/SamWriter.h" + +#include +#include + +#include +#include + +#include "Autovalidate.h" +#include "FileProducer.h" +#include "MemoryUtils.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/Validator.h" + +namespace PacBio { +namespace BAM { + +class SamWriter::SamWriterPrivate : public FileProducer +{ +public: + SamWriterPrivate(std::string filename, const std::shared_ptr rawHeader) + : FileProducer{std::move(filename)}, header_{rawHeader} + { + if (!header_) throw std::runtime_error{"SamWriter: null header provided"}; + + // open file + const auto& usingFilename = TempFilename(); + const std::string mode(1, 'w'); + file_.reset(sam_open(usingFilename.c_str(), mode.c_str())); + if (!file_) + throw std::runtime_error{"SamWriter: could not open file for writing: " + + usingFilename}; + + // write header + const auto ret = sam_hdr_write(file_.get(), header_.get()); + if (ret != 0) + throw std::runtime_error{"SamWriter: could not write header to file: " + usingFilename}; + } + + void Write(BamRecord record) + { +#if PBBAM_AUTOVALIDATE + Validator::Validate(record); +#endif + + const auto rawRecord = BamRecordMemory::GetRawData(record); + + // store bin number + // min_shift=14 & n_lvls=5 are SAM/BAM "magic numbers" + rawRecord->core.bin = hts_reg2bin(rawRecord->core.pos, bam_endpos(rawRecord.get()), 14, 5); + + // Maybe adjust location of long CIGAR (>65535 ops) data, depending on the + // runtime htslib version. + // + // SAM formatting in htslib verions previous to 1.7 are unaware of the new + // long CIGAR implementation ("CG") tag. So we need to move that back to the + // "standard" field so that SAM output is correct. Versions >=1.7 properly + // display long CIGARs. + // + // This transform will become unecessary when we drop support for htslib pre-v1.7. + // + static const bool has_native_long_cigar_support = DoesHtslibSupportLongCigar(); + const auto cigar = record.CigarData(); + if (!has_native_long_cigar_support && cigar.size() > 65535) { + if (record.Impl().HasTag("CG")) record.Impl().RemoveTag("CG"); + record.Impl().SetCigarData(cigar); + } + + // write record to file + const int ret = sam_write1(file_.get(), header_.get(), rawRecord.get()); + if (ret <= 0) throw std::runtime_error{"SamWriter: could not write record"}; + } + + std::unique_ptr file_; + std::shared_ptr header_; +}; + +SamWriter::SamWriter(std::string filename, const BamHeader& header) + : IRecordWriter() + , d_{std::make_unique(std::move(filename), + BamHeaderMemory::MakeRawHeader(header))} +{ +#if PBBAM_AUTOVALIDATE + Validator::Validate(header); +#endif +} + +SamWriter::SamWriter(SamWriter&&) = default; + +SamWriter& SamWriter::operator=(SamWriter&&) = default; + +SamWriter::~SamWriter() = default; + +void SamWriter::TryFlush() +{ + const auto ret = d_->file_.get()->fp.hfile; + if (ret != nullptr) + throw std::runtime_error{"SamWriter: could not flush output buffer contents"}; +} + +void SamWriter::Write(const BamRecord& record) { d_->Write(record); } + +void SamWriter::Write(const BamRecordImpl& recordImpl) { Write(BamRecord{recordImpl}); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/SequenceInfo.cpp b/src/SequenceInfo.cpp new file mode 100644 index 0000000..55da839 --- /dev/null +++ b/src/SequenceInfo.cpp @@ -0,0 +1,178 @@ +// File Description +/// \file SequenceInfo.cpp +/// \brief Implements the SequenceInfo class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/SequenceInfo.h" + +#include +#include +#include + +#include "pbbam/SamTagCodec.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { +namespace { + +const std::string token_SN{"SN"}; +const std::string token_LN{"LN"}; +const std::string token_AS{"AS"}; +const std::string token_M5{"M5"}; +const std::string token_SP{"SP"}; +const std::string token_UR{"UR"}; + +} // anonymous + +SequenceInfo::SequenceInfo(std::string name, std::string length) + : name_(std::move(name)), length_(std::move(length)) +{ +} + +SequenceInfo::SequenceInfo() = default; + +SequenceInfo::SequenceInfo(const SequenceInfo&) = default; + +SequenceInfo::SequenceInfo(SequenceInfo&&) = default; + +SequenceInfo& SequenceInfo::operator=(const SequenceInfo&) = default; + +SequenceInfo& SequenceInfo::operator=(SequenceInfo&&) = default; + +SequenceInfo::~SequenceInfo() = default; + +bool SequenceInfo::operator==(const SequenceInfo& other) const +{ + return assemblyId_ == other.assemblyId_ && checksum_ == other.checksum_ && + length_ == other.length_ && name_ == other.name_ && species_ == other.species_ && + uri_ == other.uri_ && custom_ == other.custom_; +} + +bool SequenceInfo::operator!=(const SequenceInfo& other) const { return !(*this == other); } + +std::string SequenceInfo::AssemblyId() const { return assemblyId_; } + +SequenceInfo& SequenceInfo::AssemblyId(std::string id) +{ + assemblyId_ = std::move(id); + return *this; +} + +std::string SequenceInfo::Checksum() const { return checksum_; } + +SequenceInfo& SequenceInfo::Checksum(std::string checksum) +{ + checksum_ = std::move(checksum); + return *this; +} + +std::map SequenceInfo::CustomTags() const { return custom_; } + +SequenceInfo& SequenceInfo::CustomTags(std::map custom) +{ + custom_ = std::move(custom); + return *this; +} + +SequenceInfo SequenceInfo::FromSam(const std::string& sam) +{ + // pop off '@SQ\t', then split rest of line into tokens + const auto tokens = Split(sam.substr(4), '\t'); + if (tokens.empty()) return {}; + + SequenceInfo seq; + std::map custom; + + // iterate over tokens + for (const auto& token : tokens) { + const auto tokenTag = token.substr(0, 2); + auto tokenValue = token.substr(3); + + // set sequence info + // clang-format off + if (tokenTag == token_SN) seq.Name(std::move(tokenValue)); + else if (tokenTag == token_LN) seq.Length(std::move(tokenValue)); + else if (tokenTag == token_AS) seq.AssemblyId(std::move(tokenValue)); + else if (tokenTag == token_M5) seq.Checksum(std::move(tokenValue)); + else if (tokenTag == token_SP) seq.Species(std::move(tokenValue)); + else if (tokenTag == token_UR) seq.Uri(std::move(tokenValue)); + // clang-format on + + // otherwise, "custom" tag + else + custom[tokenTag] = std::move(tokenValue); + } + + seq.CustomTags(std::move(custom)); + return seq; +} + +bool SequenceInfo::IsValid() 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 <= std::numeric_limits::max(); +} + +std::string SequenceInfo::Length() const { return length_; } + +SequenceInfo& SequenceInfo::Length(std::string length) +{ + length_ = std::move(length); + return *this; +} + +std::string SequenceInfo::Name() const { return name_; } + +SequenceInfo& SequenceInfo::Name(std::string name) +{ + name_ = std::move(name); + return *this; +} + +std::string SequenceInfo::Species() const { return species_; } + +SequenceInfo& SequenceInfo::Species(std::string species) +{ + species_ = std::move(species); + return *this; +} + +std::string SequenceInfo::ToSam(const SequenceInfo& seq) { return seq.ToSam(); } + +std::string SequenceInfo::ToSam() const +{ + std::ostringstream out; + out << "@SQ" << MakeSamTag(token_SN, name_); + + // clang-format off + if (!length_.empty()) out << MakeSamTag(token_LN, length_); + if (!assemblyId_.empty()) out << MakeSamTag(token_AS, assemblyId_); + if (!checksum_.empty()) out << MakeSamTag(token_M5, checksum_); + if (!species_.empty()) out << MakeSamTag(token_SP, species_); + if (!uri_.empty()) out << MakeSamTag(token_UR, uri_); + // clang-format on + + // append any custom tags + for (auto&& attribute : custom_) + out << MakeSamTag(std::move(attribute.first), std::move(attribute.second)); + + return out.str(); +} + +std::string SequenceInfo::Uri() const { return uri_; } + +SequenceInfo& SequenceInfo::Uri(std::string uri) +{ + uri_ = std::move(uri); + return *this; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/SequenceUtils.h b/src/SequenceUtils.h new file mode 100644 index 0000000..1ec544f --- /dev/null +++ b/src/SequenceUtils.h @@ -0,0 +1,124 @@ +// Author: Derek Barnett + +#ifndef SEQUENCEUTILS_H +#define SEQUENCEUTILS_H + +#include +#include +#include +#include +#include + +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +inline char Complement(const char character) +{ + constexpr const std::array lookupTable{ + {/* 0 - 7: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 8 - 15: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 16 - 23: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 24 - 31: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 32 - 39: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 40 - 47: */ 0, 0, '*', 0, 0, '-', 0, 0, + /* 48 - 55: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 56 - 63: */ 0, 0, 0, 0, 0, 0, 0, 0, + + /* 64 - 71: */ 0, 'T', 'V', 'G', 'H', 0, 0, 'C', + /* 72 - 79: */ 'D', 0, 0, 'M', 0, 'K', 'N', 0, + /* 80 - 87: */ 0, 0, 'Y', 'S', 'A', 'A', 'B', 'W', + /* 88 - 95: */ 0, 'R', 0, 0, 0, 0, 0, 0, + + /* 96 - 103: */ 0, 'T', 'V', 'G', 'H', 0, 0, 'C', + /* 104 - 111: */ 'D', 0, 0, 'M', 0, 'K', 'N', 0, + /* 112 - 119: */ 0, 0, 'Y', 'S', 'A', 'A', 'B', 'W', + /* 120 - 127: */ 0, 'R', 0, 0, 0, 0, 0, 0, + + /* 128 - 135: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 136 - 143: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 144 - 151: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 152 - 159: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 160 - 167: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 168 - 175: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 176 - 183: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 184 - 191: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 192 - 199: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 200 - 207: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 208 - 215: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 216 - 223: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 224 - 231: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 232 - 239: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 240 - 247: */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 248 - 255: */ 0, 0, 0, 0, 0, 0, 0, 0}}; + + return lookupTable[static_cast(character)]; +} + +template +void Reverse(T& input) +{ + std::reverse(input.begin(), input.end()); +} + +template +T MaybeReverse(T&& input, bool reverse) +{ + if (reverse) std::reverse(input.begin(), input.end()); + return input; +} + +template +T Reversed(const T& input) +{ + T result = input; + Reverse(result); + return result; +} +inline void ReverseComplement(std::string& seq) +{ + std::transform(seq.begin(), seq.end(), seq.begin(), Complement); + Reverse(seq); +} + +inline std::string MaybeReverseComplement(std::string&& seq, bool reverse) +{ + if (reverse) ReverseComplement(seq); + return std::move(seq); +} + +/// Reverse complement a DNA sequence case-sensitive +inline void ReverseComplementCaseSens(std::string& seq) +{ + const std::string original = seq; + constexpr const static 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, 42, 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] = + static_cast(rc_table[static_cast(original[i])]); + seq = reverseCompl; +} + +inline std::string MaybeReverseComplementCaseSens(std::string&& seq, bool reverse) +{ + if (reverse) ReverseComplementCaseSens(seq); + return std::move(seq); +} + +inline std::string ReverseComplemented(const std::string& input) +{ + std::string result = input; + ReverseComplement(result); + return result; +} + +} // namespace BAM +} // namespace PacBio + +#endif // SEQUENCEUTILS_H diff --git a/src/StringUtilities.cpp b/src/StringUtilities.cpp new file mode 100644 index 0000000..168bd81 --- /dev/null +++ b/src/StringUtilities.cpp @@ -0,0 +1,48 @@ +// File Description +/// \file SequenceInfo.cpp +/// \brief Implements the SequenceInfo class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/StringUtilities.h" + +#include +#include + +namespace PacBio { +namespace BAM { + +std::string Join(const std::vector& tokens, const char delim) +{ + std::string result; + bool first = true; + for (const auto& token : tokens) { + if (!first) result += delim; + result += token; + first = false; + } + return result; +} + +std::vector Split(const std::string& line, const char delim) +{ + std::vector tokens; + std::istringstream lineStream(line); + std::string token; + while (std::getline(lineStream, token, delim)) + tokens.push_back(token); + return tokens; +} + +std::string RemoveAllWhitespace(std::string input) +{ + input.erase( + std::remove_if(input.begin(), input.end(), [](const char c) { return std::isspace(c); }), + input.end()); + return input; +} + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/SubreadLengthQuery.cpp b/src/SubreadLengthQuery.cpp new file mode 100644 index 0000000..eded8de --- /dev/null +++ b/src/SubreadLengthQuery.cpp @@ -0,0 +1,46 @@ +// File Description +/// \file SubreadLengthQuery.cpp +/// \brief Implements the SubreadLengthQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/SubreadLengthQuery.h" + +#include + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFilterTypes.h" + +namespace PacBio { +namespace BAM { + +class SubreadLengthQuery::SubreadLengthQueryPrivate +{ +public: + SubreadLengthQueryPrivate(const int32_t length, const Compare::Type compareType, + const DataSet& dataset) + : reader_(PbiQueryLengthFilter(length, compareType), dataset) + { + } + + PbiFilterCompositeBamReader reader_; // unsorted +}; + +SubreadLengthQuery::SubreadLengthQuery(const int32_t length, const Compare::Type compareType, + const DataSet& dataset) + : internal::IQuery() + , d_{std::make_unique(length, compareType, dataset)} +{ +} + +SubreadLengthQuery::~SubreadLengthQuery() = default; + +bool SubreadLengthQuery::GetNext(BamRecord& r) { return d_->reader_.GetNext(r); } + +uint32_t SubreadLengthQuery::NumReads() const { return d_->reader_.NumReads(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/Tag.cpp b/src/Tag.cpp new file mode 100644 index 0000000..6b3b4e9 --- /dev/null +++ b/src/Tag.cpp @@ -0,0 +1,403 @@ +// File Description +/// \file Tag.cpp +/// \brief Implements the Tag class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Tag.h" + +#include + +#include + +namespace PacBio { +namespace BAM { +namespace { + +template +bool InAsciiRange(const T x) +{ + return (x >= 33 && x <= 127); +} + +struct AsciiConvertVisitor : public boost::static_visitor +{ + // 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 + char operator()(const T&) const + { + throw std::runtime_error{"Tag: cannot convert to ASCII"}; + return 0; + } + +private: + template + char Helper(const T& x) const + { + if (!InAsciiRange(x)) throw std::runtime_error{"Tag: char is outside valid ASCII range"}; + return static_cast(x); + } +}; + +template +struct NumericConvertVisitor : public boost::static_visitor +{ + // only valid for integral types + DesiredType operator()(const int8_t& x) const { return boost::numeric_cast(x); } + DesiredType operator()(const uint8_t& x) const { return boost::numeric_cast(x); } + DesiredType operator()(const int16_t& x) const { return boost::numeric_cast(x); } + DesiredType operator()(const uint16_t& x) const { return boost::numeric_cast(x); } + DesiredType operator()(const int32_t& x) const { return boost::numeric_cast(x); } + DesiredType operator()(const uint32_t& x) const { return boost::numeric_cast(x); } + + // anything else always throws + template + DesiredType operator()(const T& t) const + { + const std::string from = typeid(t).name(); + const std::string to = typeid(DesiredType).name(); + const std::string msg = "Tag: cannot convert type " + from + " to " + to; + throw std::runtime_error(msg); + return 0; + } +}; + +using ToInt8ConvertVisitor = NumericConvertVisitor; +using ToUInt8ConvertVisitor = NumericConvertVisitor; +using ToInt16ConvertVisitor = NumericConvertVisitor; +using ToUInt16ConvertVisitor = NumericConvertVisitor; +using ToInt32ConvertVisitor = NumericConvertVisitor; +using ToUInt32ConvertVisitor = NumericConvertVisitor; + +struct IsEqualVisitor : public boost::static_visitor +{ + template + 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 + bool operator()(const T& lhs, const T& rhs) const + { + return lhs == rhs; + } +}; + +struct TypenameVisitor : public boost::static_visitor +{ + 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&) const { return "vector"; } + std::string operator()(const std::vector&) const { return "vector"; } + std::string operator()(const std::vector&) const { return "vector"; } + std::string operator()(const std::vector&) const { return "vector"; } + std::string operator()(const std::vector&) const { return "vector"; } + std::string operator()(const std::vector&) const { return "vector"; } + std::string operator()(const std::vector&) const { return "vector"; } +}; + +} // anonymous + +Tag::Tag() = default; + +Tag::Tag(const Tag&) = default; + +Tag::Tag(Tag&&) = default; + +Tag& Tag::operator=(const Tag&) = default; + +Tag& Tag::operator=(Tag&&) = default; + +Tag::~Tag() = default; + +Tag::Tag(int8_t value) : data_{value} {} +Tag::Tag(uint8_t value) : data_{value} {} +Tag::Tag(int16_t value) : data_{value} {} +Tag::Tag(uint16_t value) : data_{value} {} +Tag::Tag(int32_t value) : data_{value} {} +Tag::Tag(uint32_t value) : data_{value} {} +Tag::Tag(float value) : data_{value} {} +Tag::Tag(std::string value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} +Tag::Tag(std::vector value) : data_{std::move(value)} {} + +Tag::Tag(int8_t value, const TagModifier mod) : data_{value}, modifier_(mod) +{ + if (mod == TagModifier::HEX_STRING) + throw std::runtime_error{ + "Tag: HEX_STRING is not a valid tag modifier for int8_t data. " + "It is intended for string-type data only."}; +} + +Tag::Tag(std::string value, TagModifier mod) : data_{std::move(value)}, modifier_{mod} +{ + if (mod == TagModifier::ASCII_CHAR) + throw std::runtime_error{ + "Tag: ASCII_CHAR is not a valid tag modifier for string-type data. " + "To construct an ASCII char tag, use a single-quoted value (e.g. 'X' instead of " + "\"X\")"}; +} + +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=(std::string value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +Tag& Tag::operator=(std::vector value) +{ + data_ = std::move(value); + return *this; +} + +bool Tag::operator==(const Tag& other) const +{ + return boost::apply_visitor(IsEqualVisitor(), data_, other.data_) && + (modifier_ == other.modifier_); +} + +bool Tag::operator!=(const Tag& other) const { return !(*this == other); } + +bool Tag::HasModifier(const TagModifier m) const +{ + // we just allow one at a time (for now at least) + return modifier_ == m; +} + +bool Tag::IsNull() const { return Type() == TagDataType::INVALID; } + +bool Tag::IsInt8() const { return Type() == TagDataType::INT8; } + +bool Tag::IsUInt8() const { return Type() == TagDataType::UINT8; } + +bool Tag::IsInt16() const { return Type() == TagDataType::INT16; } + +bool Tag::IsUInt16() const { return Type() == TagDataType::UINT16; } + +bool Tag::IsInt32() const { return Type() == TagDataType::INT32; } + +bool Tag::IsUInt32() const { return Type() == TagDataType::UINT32; } + +bool Tag::IsFloat() const { return Type() == TagDataType::FLOAT; } + +bool Tag::IsString() const { return Type() == TagDataType::STRING; } + +bool Tag::IsHexString() const { return IsString() && modifier_ == TagModifier::HEX_STRING; } + +bool Tag::IsInt8Array() const { return Type() == TagDataType::INT8_ARRAY; } + +bool Tag::IsUInt8Array() const { return Type() == TagDataType::UINT8_ARRAY; } + +bool Tag::IsInt16Array() const { return Type() == TagDataType::INT16_ARRAY; } + +bool Tag::IsUInt16Array() const { return Type() == TagDataType::UINT16_ARRAY; } + +bool Tag::IsInt32Array() const { return Type() == TagDataType::INT32_ARRAY; } + +bool Tag::IsUInt32Array() const { return Type() == TagDataType::UINT32_ARRAY; } + +bool Tag::IsFloatArray() const { return Type() == TagDataType::FLOAT_ARRAY; } + +bool Tag::IsSignedInt() const { return IsInt8() || IsInt16() || IsInt32(); } + +bool Tag::IsUnsignedInt() const { return IsUInt8() || IsUInt16() || IsUInt32(); } + +bool Tag::IsIntegral() const { return IsSignedInt() || IsUnsignedInt(); } + +bool Tag::IsNumeric() const { return IsIntegral() || IsFloat(); } + +bool Tag::IsSignedArray() const { return IsInt8Array() || IsInt16Array() || IsInt32Array(); } + +bool Tag::IsUnsignedArray() const { return IsUInt8Array() || IsUInt16Array() || IsUInt32Array(); } + +bool Tag::IsIntegralArray() const { return IsSignedArray() || IsUnsignedArray(); } + +bool Tag::IsArray() const { return IsIntegralArray() || IsFloatArray(); } + +TagModifier Tag::Modifier() const { return modifier_; } + +Tag& Tag::Modifier(const TagModifier m) +{ + modifier_ = m; + return *this; +} + +char Tag::ToAscii() const { return boost::apply_visitor(AsciiConvertVisitor(), data_); } + +int8_t Tag::ToInt8() const +{ + if (IsInt8()) return boost::get(data_); + return boost::apply_visitor(ToInt8ConvertVisitor(), data_); +} + +uint8_t Tag::ToUInt8() const +{ + if (IsUInt8()) return boost::get(data_); + return boost::apply_visitor(ToUInt8ConvertVisitor(), data_); +} + +int16_t Tag::ToInt16() const +{ + if (IsInt16()) return boost::get(data_); + return boost::apply_visitor(ToInt16ConvertVisitor(), data_); +} + +uint16_t Tag::ToUInt16() const +{ + if (IsUInt16()) return boost::get(data_); + return boost::apply_visitor(ToUInt16ConvertVisitor(), data_); +} + +int32_t Tag::ToInt32() const +{ + if (IsInt32()) return boost::get(data_); + return boost::apply_visitor(ToInt32ConvertVisitor(), data_); +} + +uint32_t Tag::ToUInt32() const +{ + if (IsUInt32()) return boost::get(data_); + return boost::apply_visitor(ToUInt32ConvertVisitor(), data_); +} + +float Tag::ToFloat() const { return boost::get(data_); } + +std::string Tag::ToString() const { return boost::get(data_); } + +std::vector Tag::ToInt8Array() const { return boost::get >(data_); } + +std::vector Tag::ToUInt8Array() const { return boost::get >(data_); } + +std::vector Tag::ToInt16Array() const { return boost::get >(data_); } + +std::vector Tag::ToUInt16Array() const +{ + return boost::get >(data_); +} + +std::vector Tag::ToInt32Array() const { return boost::get >(data_); } + +std::vector Tag::ToUInt32Array() const +{ + return boost::get >(data_); +} + +std::vector Tag::ToFloatArray() const { return boost::get >(data_); } + +TagDataType Tag::Type() const { return TagDataType(data_.which()); } + +std::string Tag::Typename() const { return boost::apply_visitor(TypenameVisitor(), data_); } + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/TagCollection.cpp b/src/TagCollection.cpp new file mode 100644 index 0000000..9cf330c --- /dev/null +++ b/src/TagCollection.cpp @@ -0,0 +1,17 @@ +// File Description +/// \file TagCollection.cpp +/// \brief Implements the TagCollection class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/TagCollection.h" + +namespace PacBio { +namespace BAM { + +bool TagCollection::Contains(const std::string& name) const { return count(name) != 0; } + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/TimeUtils.h b/src/TimeUtils.h new file mode 100644 index 0000000..6198249 --- /dev/null +++ b/src/TimeUtils.h @@ -0,0 +1,71 @@ +// Author: Derek Barnett + +#ifndef TIMEUTILS_H +#define TIMEUTILS_H + +#include +#include +#include +#include +#include + +namespace PacBio { +namespace BAM { + +class TimeUtils +{ +public: + static 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(tp - tp_sec); + const std::tm* ttm = + gmtime(&ttime_t); // static obj, no free needed (may not be thread-safe though) + + // format output + constexpr static const 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; + } + + static std::string ToDataSetFormat(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(tp - tp_sec); + const std::tm* ttm = + gmtime(&ttime_t); // static obj, no free needed (may not be thread-safe though) + + // format output + constexpr static const char date_time_format[] = "%y%m%d_%H%M%S"; + 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(std::to_string(ms.count())); + return result; + } + + static std::chrono::system_clock::time_point CurrentTime() + { + return std::chrono::system_clock::now(); + } +}; + +} // namespace BAM +} // namespace PacBio + +#endif // TIMEUTILS_H diff --git a/src/ValidationErrors.cpp b/src/ValidationErrors.cpp new file mode 100644 index 0000000..6eaa7d3 --- /dev/null +++ b/src/ValidationErrors.cpp @@ -0,0 +1,74 @@ +// File Description +/// \file ValidationErrors.cpp +/// \brief Implements the ValidationErrors class. +// +// Author: Derek Barnett + +#include "pbbam/exception/ValidationException.h" + +#include "PbbamInternalConfig.h" + +#include +#include + +#include "ValidationErrors.h" +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +const size_t ValidationErrors::MAX; + +ValidationErrors::ValidationErrors(const size_t maxNumErrors) + : maxNumErrors_{maxNumErrors}, currentNumErrors_{0} +{ + if (maxNumErrors_ == 0) maxNumErrors_ = ValidationErrors::MAX; +} + +void ValidationErrors::AddFileError(const std::string& fn, std::string details) +{ + fileErrors_[fn].push_back(std::move(details)); + OnErrorAdded(); +} + +void ValidationErrors::AddReadGroupError(const std::string& rg, std::string details) +{ + readGroupErrors_[rg].push_back(std::move(details)); + OnErrorAdded(); +} + +void ValidationErrors::AddRecordError(const std::string& name, std::string details) +{ + recordErrors_[name].push_back(std::move(details)); + OnErrorAdded(); +} + +void ValidationErrors::AddTagLengthError(const std::string& name, const std::string& tagLabel, + const std::string& tagName, const size_t observed, + const size_t expected) +{ + // format + std::ostringstream s; + s << tagLabel << " tag (" << tagName << ") length: " << observed + << ", does not match expected length: " << expected; + AddRecordError(name, s.str()); +} + +bool ValidationErrors::IsEmpty() const { return currentNumErrors_ == 0; } + +size_t ValidationErrors::MaxNumErrors() const { return maxNumErrors_; } + +void ValidationErrors::OnErrorAdded() +{ + ++currentNumErrors_; + if (currentNumErrors_ == maxNumErrors_) ThrowErrors(); +} + +void ValidationErrors::ThrowErrors() +{ + throw ValidationException{std::move(fileErrors_), std::move(readGroupErrors_), + std::move(recordErrors_)}; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/ValidationErrors.h b/src/ValidationErrors.h new file mode 100644 index 0000000..27baf22 --- /dev/null +++ b/src/ValidationErrors.h @@ -0,0 +1,63 @@ +// File Description +/// \file ValidationErrors.h +/// \brief Defines the ValidationErrors class. +// +// Author: Derek Barnett + +#ifndef VALIDATIONERRORS_H +#define VALIDATIONERRORS_H + +#include +#include +#include +#include +#include + +namespace PacBio { +namespace BAM { + +/// The ValidationErrors class catches error messages accumulated during +/// validation (see Validator). +/// +/// Convenience methods are provided for different BAM components, to help +/// format the displayed output. +/// +/// A maximum number of errors can be provided at construction, and this class +/// will automatially throw a ValidationException whenever that count is reached. +/// Otherwise, the Validator will check IsEmpty() and call ThrowErrors() if true. +/// +class ValidationErrors +{ +public: + typedef std::vector ErrorList; + typedef std::map ErrorMap; + + static const size_t MAX = std::numeric_limits::max(); + + explicit ValidationErrors(const size_t maxNumErrors = ValidationErrors::MAX); + + void AddFileError(const std::string& fn, std::string details); + void AddReadGroupError(const std::string& rg, std::string details); + void AddRecordError(const std::string& name, std::string details); + void AddTagLengthError(const std::string& name, const std::string& tagLabel, + const std::string& tagName, const size_t observed, + const size_t expected); + + bool IsEmpty() const; + size_t MaxNumErrors() const; + void ThrowErrors(); + +private: + size_t maxNumErrors_; + size_t currentNumErrors_; + ErrorMap fileErrors_; + ErrorMap readGroupErrors_; + ErrorMap recordErrors_; + + void OnErrorAdded(); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VALIDATIONERRORS_H diff --git a/src/ValidationException.cpp b/src/ValidationException.cpp new file mode 100644 index 0000000..99bcfd1 --- /dev/null +++ b/src/ValidationException.cpp @@ -0,0 +1,74 @@ +// File Description +/// \file ValidationException.cpp +/// \brief Implements the ValidationException class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/exception/ValidationException.h" + +namespace PacBio { +namespace BAM { + +ValidationException::ValidationException(ErrorMap fileErrors, ErrorMap readGroupErrors, + ErrorMap recordErrors) + : std::runtime_error{""} + , fileErrors_{std::move(fileErrors)} + , readGroupErrors_{std::move(readGroupErrors)} + , recordErrors_{std::move(recordErrors)} +{ + FormatMessage(); +} + +const ValidationException::ErrorMap& ValidationException::FileErrors() const { return fileErrors_; } + +const ValidationException::ErrorMap& ValidationException::ReadGroupErrors() const +{ + return readGroupErrors_; +} + +const ValidationException::ErrorMap& ValidationException::RecordErrors() const +{ + return recordErrors_; +} + +const char* ValidationException::what() const noexcept { return msg_.c_str(); } + +void ValidationException::FormatMessage() +{ + std::ostringstream s; + s << "Validation failed:\n"; + + // file errors + if (!fileErrors_.empty()) { + for (const auto& fileError : fileErrors_) { + s << " In file (" << fileError.first << ") : \n"; + for (const auto& e : fileError.second) + s << " " << e << '\n'; + } + } + + // read group errors + if (!readGroupErrors_.empty()) { + for (const auto& rgError : readGroupErrors_) { + s << " In read group (" << rgError.first << ") :\n"; + for (const auto& e : rgError.second) + s << " " << e << '\n'; + } + } + + // record errors + if (!recordErrors_.empty()) { + for (const auto& recordError : readGroupErrors_) { + s << " In record (" << recordError.first << ") : \n"; + for (const auto& e : recordError.second) + s << " " << e << '\n'; + } + } + + msg_ = s.str(); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Validator.cpp b/src/Validator.cpp new file mode 100644 index 0000000..7b59a17 --- /dev/null +++ b/src/Validator.cpp @@ -0,0 +1,407 @@ +// File Description +/// \file Validator.cpp +/// \brief Implements the Validator class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/Validator.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "ValidationErrors.h" +#include "Version.h" +#include "pbbam/BamFile.h" +#include "pbbam/BamHeader.h" +#include "pbbam/BamRecord.h" +#include "pbbam/EntireFileQuery.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/ReadGroupInfo.h" + +namespace PacBio { +namespace BAM { +namespace { + +struct ilexcompare_wrapper +{ + bool operator()(const std::string& lhs, const std::string& rhs) const + { + return boost::ilexicographical_compare(lhs, rhs); + } +}; + +// clang-format off +static const std::set AcceptedSortOrders +{ + "unknown", + "unsorted", + "queryname", + "coordinate" +}; + +static const std::set AcceptedReadTypes +{ + "POLYMERASE", + "HQREGION", + "SUBREAD", + "CCS", + "SCRAP", + "UNKNOWN" +}; +// clang-format on + +static void ValidateReadGroup(const ReadGroupInfo& rg, std::unique_ptr& errors) +{ + const std::string id = rg.Id(); + + // has required fields + if (id.empty()) errors->AddReadGroupError(id, "missing ID"); + if (rg.MovieName().empty()) errors->AddReadGroupError(id, "missing movie name (PU tag)"); + // 3.0.2 adds required RG:PM - do not check for now, we'll add version-aware + // validation down the road + + // description tag has required components + if (rg.ReadType().empty()) errors->AddReadGroupError(id, "missing READTYPE in description"); + if (rg.BindingKit().empty()) errors->AddReadGroupError(id, "missing BINDINGKIT in description"); + if (rg.SequencingKit().empty()) + errors->AddReadGroupError(id, "missing SEQUENCINGKIT in description"); + if (rg.BasecallerVersion().empty()) + errors->AddReadGroupError(id, "missing BASECALLERVERSION in description"); + if (rg.FrameRateHz().empty()) + errors->AddReadGroupError(id, "missing FRAMERATEHZ in description"); + + // stored ID matches expected ID (as calculated from movie & type) + if (!id.empty()) { + const auto expectedId = MakeReadGroupId(rg.MovieName(), rg.ReadType()); + if (expectedId != id) { + const std::string msg{"stored ID: " + id + " does not match computed ID: " + + expectedId}; + errors->AddReadGroupError(id, std::move(msg)); + } + } + + // valid read type + if (!rg.ReadType().empty()) { + if (AcceptedReadTypes.find(rg.ReadType()) == AcceptedReadTypes.cend()) + errors->AddReadGroupError(id, "read type: " + rg.ReadType() + " is unknown"); + } + + // valid read chemistry (binding, sequencing, chemistry) + if (!rg.BindingKit().empty() && !rg.SequencingKit().empty() && + !rg.BasecallerVersion().empty()) { + try { + auto chem = rg.SequencingChemistry(); + boost::ignore_unused(chem); + } catch (std::exception& e) { + errors->AddReadGroupError(id, e.what()); + } + } + + // frame rate convertable to floating point + if (!rg.FrameRateHz().empty()) { + try { + const float frameRate = std::stof(rg.FrameRateHz()); + boost::ignore_unused(frameRate); + } catch (std::exception& e) { + errors->AddReadGroupError(id, e.what()); + } + } +} + +static void ValidateHeader(const BamHeader& header, const std::string& filename, + std::unique_ptr& errors) +{ + const std::string& fn = filename; + + // SAM/BAM version + try { + Version v(header.Version()); + boost::ignore_unused(v); + } catch (std::exception& e) { + errors->AddFileError(fn, std::string{"SAM version (@HD:VN) failed: "} + e.what()); + } + + // sort order + const std::string sortOrder = header.SortOrder(); + if (AcceptedSortOrders.find(sortOrder) == AcceptedSortOrders.end()) + errors->AddFileError(fn, std::string{"unknown sort order: "} + sortOrder); + + // PacBio version + try { + const Version v{header.PacBioBamVersion()}; + const Version minimum{3, 0, 1}; + if (v < minimum) { + + std::string msg{"PacBioBAM version (@HD:pb) "}; + msg += v.ToString(); + msg += " is older than the minimum supported version (" + minimum.ToString() + ")"; + errors->AddFileError(fn, std::move(msg)); + } + } catch (std::exception& e) { + errors->AddFileError( + fn, std::string{"PacBioBAM version (@HD:pb) failed to parse: "} + e.what()); + } + + // sequences? + + // read groups + for (const ReadGroupInfo& rg : header.ReadGroups()) + ValidateReadGroup(rg, errors); +} + +static void ValidateMetadata(const BamFile& file, std::unique_ptr& errors) +{ + // filename + const std::string fn{file.Filename()}; + if (fn == "-") { + errors->AddFileError(fn, + "validation not is available for streamed BAM. Please " + "write to a file and run validation on it."); + errors->ThrowErrors(); // quit early + } + if (boost::algorithm::ends_with(fn, ".bam") || boost::algorithm::ends_with(fn, ".bam.tmp")) { + errors->AddFileError(fn, "non-standard file extension"); + } + + // EOF + if (!file.HasEOF()) errors->AddFileError(fn, "missing end-of-file marker"); + + // has PBI + if (!file.PacBioIndexExists()) errors->AddFileError(fn, "missing PBI file"); + + // header + ValidateHeader(file.Header(), file.Filename(), errors); +} + +void ValidateMappedRecord(const BamRecord& b, std::unique_ptr& errors) +{ + const std::string name{b.FullName()}; + if (b.ReferenceStart() < 0) errors->AddRecordError(name, "mapped record position is invalid"); + if (b.ReferenceId() < 0) errors->AddRecordError(name, "mapped record reference ID is invalid"); + + // what else?? +} + +void ValidateRecordCore(const BamRecord& b, std::unique_ptr& errors) +{ + if (!IsCcsOrTranscript(b.Type())) { + const auto qStart = b.QueryStart(); + const auto qEnd = b.QueryEnd(); + if (qStart >= qEnd) { + errors->AddRecordError(b.FullName(), "queryStart (qs) should be < queryEnd (qe)"); + } + } +} + +void ValidateRecordReadGroup(const BamRecord& b, std::unique_ptr& errors) +{ + try { + auto rg = b.ReadGroup(); + boost::ignore_unused(rg); + } catch (std::exception& e) { + errors->AddRecordError(b.FullName(), e.what()); + } +} + +void ValidateRecordRequiredTags(const BamRecord& b, std::unique_ptr& errors) +{ + const auto name = b.FullName(); + const auto isCcsOrTranscript = IsCcsOrTranscript(b.Type()); + if (!isCcsOrTranscript) { + // qe/qs + const bool hasQueryStart = b.HasQueryStart(); + const bool hasQueryEnd = b.HasQueryEnd(); + if (hasQueryStart && hasQueryEnd) { + const auto qStart = b.QueryStart(); + const auto qEnd = b.QueryEnd(); + if (qStart >= qEnd) + errors->AddRecordError(name, "queryStart (qs) should be < queryEnd (qe)"); + } else { + if (!hasQueryStart) errors->AddRecordError(name, "missing tag: qs (queryStart)"); + if (!hasQueryEnd) errors->AddRecordError(name, "missing tag: qe (queryEnd)"); + } + } + + // zm + if (!b.HasHoleNumber()) errors->AddRecordError(name, "missing tag: zm (ZMW hole number)"); + + // np + if (!b.HasNumPasses()) + errors->AddRecordError(name, "missing tag: np (num passes)"); + else { + const auto numPasses = b.NumPasses(); + if (!isCcsOrTranscript && numPasses != 1) + errors->AddRecordError(name, "np (numPasses) tag for non-CCS records should be 1"); + } + + // rq + if (!b.HasReadAccuracy()) errors->AddRecordError(name, "missing tag: rq (read accuracy)"); + + // sn + if (!b.HasSignalToNoise()) + errors->AddRecordError(name, "missing tag: sn (signal-to-noise ratio)"); +} + +void ValidateRecordTagLengths(const BamRecord& b, std::unique_ptr& errors) +{ + const auto name = b.FullName(); + const size_t expectedLength = + (IsCcsOrTranscript(b.Type()) ? b.Sequence().size() : (b.QueryEnd() - b.QueryStart())); + + // check "per-base"-type data lengths are compatible + if (b.Sequence().size() != expectedLength) + errors->AddRecordError(name, "sequence length does not match expected length"); + + if (b.HasDeletionQV()) { + if (b.DeletionQV().size() != expectedLength) + errors->AddTagLengthError(name, "DeletionQV", "dq", b.DeletionQV().size(), + expectedLength); + } + if (b.HasDeletionTag()) { + if (b.DeletionTag().size() != expectedLength) + errors->AddTagLengthError(name, "DeletionTag", "dt", b.DeletionTag().size(), + expectedLength); + } + if (b.HasInsertionQV()) { + if (b.InsertionQV().size() != expectedLength) + errors->AddTagLengthError(name, "InsertionQV", "iq", b.InsertionQV().size(), + expectedLength); + } + if (b.HasMergeQV()) { + if (b.MergeQV().size() != expectedLength) + errors->AddTagLengthError(name, "MergeQV", "mq", b.MergeQV().size(), expectedLength); + } + if (b.HasSubstitutionQV()) { + if (b.SubstitutionQV().size() != expectedLength) + errors->AddTagLengthError(name, "SubstitutionQV", "sq", b.SubstitutionQV().size(), + expectedLength); + } + if (b.HasSubstitutionTag()) { + if (b.SubstitutionTag().size() != expectedLength) + errors->AddTagLengthError(name, "SubstitutionTag", "st", b.SubstitutionTag().size(), + expectedLength); + } + if (b.HasIPD()) { + if (b.IPD().size() != expectedLength) + errors->AddTagLengthError(name, "IPD", "ip", b.IPD().size(), expectedLength); + } + + // NOTE: disabling "internal" tag checks for now, only production tags +} + +void ValidateUnmappedRecord(const BamRecord& b, std::unique_ptr& errors) +{ + const std::string name{b.FullName()}; + if (b.ReferenceStart() != -1) errors->AddRecordError(name, "unmapped record has a position"); + if (b.ReferenceId() != -1) errors->AddRecordError(name, "unmapped record has a reference ID"); +} + +static void ValidateRecord(const BamRecord& b, std::unique_ptr& errors) +{ + ValidateRecordCore(b, errors); + ValidateRecordReadGroup(b, errors); + ValidateRecordRequiredTags(b, errors); + ValidateRecordTagLengths(b, errors); + if (b.IsMapped()) + ValidateMappedRecord(b, errors); + else + ValidateUnmappedRecord(b, errors); +} + +} // anonymous + +bool Validator::IsValid(const BamFile& file, const bool entireFile) +{ + try { + if (entireFile) + ValidateEntireFile(file, 1); + else + ValidateFileMetadata(file, 1); + return true; + } catch (std::exception&) { + return false; + } +} + +bool Validator::IsValid(const BamHeader& header) +{ + try { + Validate(header, 1); + return true; + } catch (std::exception&) { + return false; + } +} + +bool Validator::IsValid(const BamRecord& record) +{ + try { + Validate(record, 1); + return true; + } catch (std::exception&) { + return false; + } +} + +bool Validator::IsValid(const ReadGroupInfo& rg) +{ + try { + Validate(rg, 1); + return true; + } catch (std::exception&) { + return false; + } +} + +void Validator::Validate(const BamHeader& header, const size_t maxErrors) +{ + auto errors = std::make_unique(maxErrors); + ValidateHeader(header, "unknown", errors); + if (!errors->IsEmpty()) errors->ThrowErrors(); +} + +void Validator::Validate(const ReadGroupInfo& rg, const size_t maxErrors) +{ + auto errors = std::make_unique(maxErrors); + ValidateReadGroup(rg, errors); + if (!errors->IsEmpty()) errors->ThrowErrors(); +} + +void Validator::Validate(const BamRecord& b, const size_t maxErrors) +{ + auto errors = std::make_unique(maxErrors); + ValidateRecord(b, errors); + if (!errors->IsEmpty()) errors->ThrowErrors(); +} + +void Validator::ValidateEntireFile(const BamFile& file, const size_t maxErrors) +{ + auto errors = std::make_unique(maxErrors); + ValidateMetadata(file, errors); + + EntireFileQuery query(file); + for (const BamRecord& record : query) + ValidateRecord(record, errors); + + if (!errors->IsEmpty()) errors->ThrowErrors(); +} + +void Validator::ValidateFileMetadata(const BamFile& file, const size_t maxErrors) +{ + auto errors = std::make_unique(maxErrors); + ValidateMetadata(file, errors); + if (!errors->IsEmpty()) errors->ThrowErrors(); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Version.cpp b/src/Version.cpp new file mode 100644 index 0000000..c1af408 --- /dev/null +++ b/src/Version.cpp @@ -0,0 +1,51 @@ +// File Description +/// \file Version.cpp +/// \brief Implements the Version class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "Version.h" + +#include +#include + +#include "pbbam/StringUtilities.h" + +namespace PacBio { +namespace BAM { + +const Version Version::Current = Version(3, 0, 7); +const Version Version::Minimum = Version(3, 0, 1); + +// string must be ".." +Version::Version(const std::string& v) : major_{0}, minor_{0}, revision_{0} +{ + // parse string + try { + const auto fields = Split(v, '.'); + const auto numFields = fields.size(); + if (numFields == 0) throw std::runtime_error{"Version: empty string"}; + major_ = std::stoi(fields.at(0)); + if (numFields > 1) { + minor_ = std::stoi(fields.at(1)); + if (numFields > 2) revision_ = std::stoi(fields.at(2)); + } + } catch (std::exception&) { + throw std::runtime_error{"Version: could not parse: " + v}; + } + + // ensure valid numbers + Check(); +} + +std::string Version::ToString() const +{ + std::ostringstream s; + s << major_ << '.' << minor_ << '.' << revision_; + return s.str(); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/Version.h b/src/Version.h new file mode 100644 index 0000000..1b93a8d --- /dev/null +++ b/src/Version.h @@ -0,0 +1,147 @@ +// File Description +/// \file Version.h +/// \brief Defines the Version class. +// +// Author: Derek Barnett + +#ifndef PACBIOBAM_VERSION_H +#define PACBIOBAM_VERSION_H + +#include +#include +#include + +namespace PacBio { +namespace BAM { + +class Version +{ +public: + static const Version Current; + static const Version Minimum; + + constexpr Version() = default; + + Version(int major, int minor, int revision); + + // string must be ".." + explicit Version(const std::string& v); + + Version(const Version&) = default; + Version(Version&&) = default; + Version& operator=(const Version&) = default; + Version& operator=(Version&&) = default; + ~Version() = default; + + bool operator==(const Version& other) const; + bool operator!=(const Version& other) const; + bool operator<(const Version& other) const; + bool operator<=(const Version& other) const; + bool operator>(const Version& other) const; + bool operator>=(const Version& other) const; + + std::string ToString() const; + explicit operator std::string() const; + + int Major() const; + int Minor() const; + int Revision() const; + + Version& Major(int major); + Version& Minor(int minor); + Version& Revision(int revision); + +private: + void Check() const; + + int major_ = 0; + int minor_ = 0; + int revision_ = 0; +}; + +inline std::ostream& operator<<(std::ostream& out, const Version& version) +{ + out << version.ToString(); + return out; +} + +inline Version::Version(int major, int minor, int revision) + : major_{major}, minor_{minor}, revision_{revision} +{ + Check(); +} + +inline bool Version::operator==(const Version& other) const +{ + return major_ == other.major_ && minor_ == other.minor_ && revision_ == other.revision_; +} + +inline bool Version::operator!=(const Version& other) const { return !(*this == other); } + +inline bool Version::operator<(const Version& other) const +{ + // 2.* < 3.* + if (major_ < other.major_) return true; + + // 3. == 3. + else if (major_ == other.major_) { + + // 3.1.* < 3.2.* + if (minor_ < other.minor_) return true; + + // 3.2. == 3.2. + else if (minor_ == other.minor_) { + + // 3.2.1 < 3.2.2 + if (revision_ < other.revision_) return true; + } + } + + // otherwise not less-than + return false; +} +inline bool Version::operator<=(const Version& other) const { return !(*this > other); } + +inline bool Version::operator>(const Version& other) const { return other < *this; } + +inline bool Version::operator>=(const Version& other) const { return !(*this < other); } + +inline Version::operator std::string() const { return ToString(); } + +inline void Version::Check() const +{ + if (major_ < 0 || minor_ < 0 || revision_ < 0) + throw std::runtime_error{"version cannot contain negative numbers"}; +} + +inline int Version::Major() const { return major_; } + +inline Version& Version::Major(int major) +{ + major_ = major; + Check(); + return *this; +} + +inline int Version::Minor() const { return minor_; } + +inline Version& Version::Minor(int minor) +{ + minor_ = minor; + Check(); + return *this; +} + +inline int Version::Revision() const { return revision_; } + +inline Version& Version::Revision(int revision) +{ + revision_ = revision; + Check(); + return *this; +} + +} // namespace BAM +} // namespace PacBio + +#endif // PACBIOBAM_VERSION_H diff --git a/src/VirtualRegion.cpp b/src/VirtualRegion.cpp new file mode 100644 index 0000000..c3bcdaa --- /dev/null +++ b/src/VirtualRegion.cpp @@ -0,0 +1,51 @@ +// File Description +/// \file VirtualRegionTypeMap.cpp +/// \brief Implements the VirtualRegionTypeMap class. +// +// Author: Armin Töpfer + +#include "PbbamInternalConfig.h" + +#include "pbbam/virtual/VirtualRegion.h" + +namespace PacBio { +namespace BAM { + +VirtualRegion::VirtualRegion(const VirtualRegionType type_, const int beginPos_, const int endPos_, + const int score_) + : type{type_}, beginPos{beginPos_}, endPos{endPos_}, cxTag{}, score{score_} +{ +} + +VirtualRegion::VirtualRegion(const VirtualRegionType type_, const int beginPos_, const int endPos_, + const LocalContextFlags cxTag_, const int barcodeLeft_, + const int barcodeRight_, const int score_) + : type{type_} + , beginPos{beginPos_} + , endPos{endPos_} + , cxTag{cxTag_} + , barcodeLeft{barcodeLeft_} + , barcodeRight{barcodeRight_} + , score{score_} +{ +} + +VirtualRegion::VirtualRegion() = default; + +VirtualRegion::VirtualRegion(const VirtualRegion&) = default; + +VirtualRegion::VirtualRegion(VirtualRegion&&) = default; + +VirtualRegion& VirtualRegion::operator=(const VirtualRegion&) = default; + +VirtualRegion& VirtualRegion::operator=(VirtualRegion&&) = default; + +VirtualRegion::~VirtualRegion() = default; + +bool VirtualRegion::operator==(const VirtualRegion& v1) const +{ + return (v1.type == this->type && v1.beginPos == this->beginPos && v1.endPos == this->endPos); +} + +} // namespace BAM +} // namespace PacBio \ No newline at end of file diff --git a/src/VirtualRegionTypeMap.cpp b/src/VirtualRegionTypeMap.cpp new file mode 100644 index 0000000..99c99db --- /dev/null +++ b/src/VirtualRegionTypeMap.cpp @@ -0,0 +1,22 @@ +// File Description +/// \file VirtualRegionTypeMap.cpp +/// \brief Implements the VirtualRegionTypeMap class. +// +// Author: Armin Töpfer + +#include "PbbamInternalConfig.h" + +#include "pbbam/virtual/VirtualRegionTypeMap.h" + +namespace PacBio { +namespace BAM { + +std::map VirtualRegionTypeMap::ParseChar{ + {'A', VirtualRegionType::ADAPTER}, + {'B', VirtualRegionType::BARCODE}, + {'H', VirtualRegionType::HQREGION}, + {'F', VirtualRegionType::FILTERED}, + {'L', VirtualRegionType::LQREGION}}; + +} // namespace BAM +} // namespace PacBio diff --git a/src/VirtualStitching.h b/src/VirtualStitching.h new file mode 100644 index 0000000..fe749e8 --- /dev/null +++ b/src/VirtualStitching.h @@ -0,0 +1,68 @@ +// File Description +/// \file VirtualStitching.h +/// \brief Utilities for virtual ZMW stitiching. +// +// Author: Derek Barnett + +#ifndef VIRTUALSTITCHING_H +#define VIRTUALSTITCHING_H + +#include +#include +#include + +#include + +#include "pbbam/DataSet.h" + +namespace PacBio { +namespace BAM { + +using StitchingSources = std::deque>; + +inline boost::optional ScrapsFileId(const ExternalResource& resource) +{ + const auto& childResources = resource.ExternalResources(); + for (const auto& childResource : childResources) { + const auto& childMetatype = childResource.MetaType(); + if (childMetatype == "PacBio.SubreadFile.ScrapsBamFile" || + childMetatype == "PacBio.SubreadFile.HqScrapsBamFile") { + return childResource.ResourceId(); + } + } + return boost::none; +} + +inline StitchingSources SourcesFromDataset(const DataSet& dataset) +{ + StitchingSources sources; + + const ExternalResources& resources = dataset.ExternalResources(); + for (const ExternalResource& resource : resources) { + + boost::optional primaryId; + boost::optional scrapsId; + + // if resource is possible "primary" BAM, store & look for associated scraps + const auto& metatype = resource.MetaType(); + if (metatype == "PacBio.SubreadFile.SubreadBamFile" || + metatype == "PacBio.SubreadFile.HqRegionBamFile") { + primaryId = resource.ResourceId(); + scrapsId = ScrapsFileId(resource); + } + + // if found, resolve paths & store + if (primaryId && scrapsId) { + std::string primaryFn = dataset.ResolvePath(primaryId.get()); + std::string scrapsFn = dataset.ResolvePath(scrapsId.get()); + sources.emplace_back(std::make_pair(primaryFn, scrapsFn)); + } + } + + return sources; +} + +} // namespace BAM +} // namespace PacBio + +#endif // VIRTUALSTITCHING_H \ No newline at end of file diff --git a/src/VirtualZmwBamRecord.cpp b/src/VirtualZmwBamRecord.cpp new file mode 100644 index 0000000..9b4ef6e --- /dev/null +++ b/src/VirtualZmwBamRecord.cpp @@ -0,0 +1,294 @@ +// File Description +/// \file VirtualZmwBamRecord.cpp +/// \brief Implements the VirtualZmwBamRecord class. +// +// Author: Armin Töpfer + +#include "PbbamInternalConfig.h" + +#include "pbbam/virtual/VirtualZmwBamRecord.h" + +#include +#include +#include +#include +#include +#include + +#include "pbbam/MoveAppend.h" +#include "pbbam/virtual/VirtualRegionType.h" +#include "pbbam/virtual/VirtualRegionTypeMap.h" + +namespace PacBio { +namespace BAM { + +VirtualZmwBamRecord::VirtualZmwBamRecord(std::vector unorderedSources, + const BamHeader& header) + : BamRecord{header}, sources_{std::move(unorderedSources)} +{ + // Sort sources by queryStart,queryEnd + std::sort(sources_.begin(), sources_.end(), [](const BamRecord& l1, const BamRecord& l2) { + + const auto l1_qStart = l1.QueryStart(); + const auto l1_qEnd = l1.QueryEnd(); + const auto l2_qStart = l2.QueryStart(); + const auto l2_qEnd = l2.QueryEnd(); + + return std::tie(l1_qStart, l1_qEnd) < std::tie(l2_qStart, l2_qEnd); + }); + + StitchSources(); +} + +VirtualZmwBamRecord::VirtualZmwBamRecord(const VirtualZmwBamRecord&) = default; + +VirtualZmwBamRecord::VirtualZmwBamRecord(VirtualZmwBamRecord&&) = default; + +VirtualZmwBamRecord& VirtualZmwBamRecord::operator=(const VirtualZmwBamRecord&) = default; + +VirtualZmwBamRecord& VirtualZmwBamRecord::operator=(VirtualZmwBamRecord&&) = default; + +VirtualZmwBamRecord::~VirtualZmwBamRecord() = default; + +bool VirtualZmwBamRecord::HasVirtualRegionType(const VirtualRegionType regionType) const +{ + return virtualRegionsMap_.find(regionType) != virtualRegionsMap_.end(); +} + +Frames VirtualZmwBamRecord::IPDV1Frames(Orientation orientation) const +{ + const auto rawFrames = this->IPDRaw(orientation); + const std::vector rawData(rawFrames.Data().begin(), rawFrames.Data().end()); + return Frames::Decode(rawData); +} + +void VirtualZmwBamRecord::StitchSources() +{ + const auto& firstRecord = sources_[0]; + const auto& lastRecord = sources_[sources_.size() - 1]; + + 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 pa; + std::vector pm; + std::vector sf; + std::vector pe; + + // initialize capacity + const auto stitchedSize = lastRecord.QueryEnd() - firstRecord.QueryStart(); + sequence.reserve(stitchedSize); + deletionTag.reserve(stitchedSize); + substitutionTag.reserve(stitchedSize); + alternativeLabelTag.reserve(stitchedSize); + pulseCall.reserve(stitchedSize); + qualities.reserve(stitchedSize); + deletionQv.reserve(stitchedSize); + insertionQv.reserve(stitchedSize); + mergeQv.reserve(stitchedSize); + pulseMergeQv.reserve(stitchedSize); + substitutionQv.reserve(stitchedSize); + labelQv.reserve(stitchedSize); + alternativeLabelQv.reserve(stitchedSize); + ipd.DataRaw().reserve(stitchedSize); + pw.DataRaw().reserve(stitchedSize); + pd.DataRaw().reserve(stitchedSize); + px.DataRaw().reserve(stitchedSize); + pa.reserve(stitchedSize); + pm.reserve(stitchedSize); + sf.reserve(stitchedSize); + pe.reserve(stitchedSize); + + // Stitch using tmp vars + for (auto& b : sources_) { + sequence.append(b.Sequence()); + + MoveAppend(b.Qualities(), qualities); + + 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.HasPkmid2()) MoveAppend(b.Pkmid2(), pm); + + if (b.HasPkmean2()) MoveAppend(b.Pkmean2(), pa); + + if (b.HasPulseExclusion()) MoveAppend(b.PulseExclusionReason(), pe); + + if (b.HasStartFrame()) MoveAppend(b.StartFrame(), sf); + + if (b.HasScrapRegionType()) { + const VirtualRegionType regionType = b.ScrapRegionType(); + + if (!HasVirtualRegionType(regionType)) + virtualRegionsMap_[regionType] = std::vector{}; + + virtualRegionsMap_[regionType].emplace_back(regionType, b.QueryStart(), b.QueryEnd()); + } + + if (b.HasLocalContextFlags()) { + std::pair barcodes{-1, -1}; + if (b.HasBarcodes()) barcodes = b.Barcodes(); + + static constexpr const auto regionType = VirtualRegionType::SUBREAD; + if (!HasVirtualRegionType(regionType)) + virtualRegionsMap_[regionType] = std::vector{}; + + virtualRegionsMap_[regionType].emplace_back(regionType, b.QueryStart(), b.QueryEnd(), + b.LocalContextFlags(), barcodes.first, + barcodes.second); + } + + if (b.HasBarcodes() && !this->HasBarcodes()) this->Barcodes(b.Barcodes()); + + if (b.HasBarcodeQuality() && !this->HasBarcodeQuality()) + this->BarcodeQuality(b.BarcodeQuality()); + + if (b.HasReadAccuracy() && !this->HasReadAccuracy()) this->ReadAccuracy(b.ReadAccuracy()); + + if (b.HasScrapZmwType()) { + if (!this->HasScrapZmwType()) + this->ScrapZmwType(b.ScrapZmwType()); + else if (this->ScrapZmwType() != b.ScrapZmwType()) + throw std::runtime_error{"VirtualZmwBamRecord: scrap types do not match"}; + } + } + + // ReadGroup + this->ReadGroup(this->header_.ReadGroups()[0]); + + 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(); + + const 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); + + // PulseExclusionReason + if (!pe.empty()) this->PulseExclusionReason(pe); + + // 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); + + // 32 bit arrays + if (!sf.empty()) this->StartFrame(sf); + + // 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(sequence.size())) + virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back( + VirtualRegionType::HQREGION, 0, lq.beginPos); + else + throw std::runtime_error{"VirtualZmwBamRecord: 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()); + } +} + +std::map> VirtualZmwBamRecord::VirtualRegionsMap() + const +{ + return virtualRegionsMap_; +} + +std::vector VirtualZmwBamRecord::VirtualRegionsTable( + const VirtualRegionType regionType) const +{ + const auto iter = virtualRegionsMap_.find(regionType); + if (iter != virtualRegionsMap_.cend()) return iter->second; + return {}; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/VirtualZmwCompositeReader.cpp b/src/VirtualZmwCompositeReader.cpp new file mode 100644 index 0000000..a817bd4 --- /dev/null +++ b/src/VirtualZmwCompositeReader.cpp @@ -0,0 +1,75 @@ +// File Description +/// \file VirtualZmwCompositeReader.cpp +/// \brief Implements the VirtualZmwCompositeReader class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "VirtualZmwCompositeReader.h" + +#include + +#include "pbbam/MakeUnique.h" + +namespace PacBio { +namespace BAM { + +VirtualZmwCompositeReader::VirtualZmwCompositeReader(const DataSet& dataset) + : currentReader_(nullptr), filter_(PbiFilter::FromDataSet(dataset)) +{ + sources_ = SourcesFromDataset(dataset); + OpenNextReader(); +} + +bool VirtualZmwCompositeReader::HasNext() { return (currentReader_ && currentReader_->HasNext()); } + +VirtualZmwBamRecord VirtualZmwCompositeReader::Next() +{ + if (currentReader_) { + const auto result = currentReader_->Next(); + if (!currentReader_->HasNext()) OpenNextReader(); + return result; + } + + // no reader active + throw std::runtime_error{ + "VirtualZmwCompositeReader: " + "no readers active, make sure you use " + "VirtualZmwCompositeReader::HasNext before " + "requesting next record"}; +} + +std::vector VirtualZmwCompositeReader::NextRaw() +{ + if (currentReader_) { + const auto result = currentReader_->NextRaw(); + if (!currentReader_->HasNext()) OpenNextReader(); + return result; + } + + // no reader active + throw std::runtime_error{ + "VirtualZmwCompositeReader: " + "no readers active, make sure you use " + "VirtualZmwCompositeReader::HasNext before " + "requesting next group of records"}; +} + +void VirtualZmwCompositeReader::OpenNextReader() +{ + currentReader_.reset(nullptr); + + // find next source pair with data + while (!sources_.empty()) { + const auto nextSource = sources_.front(); + sources_.pop_front(); + + currentReader_ = + std::make_unique(nextSource.first, nextSource.second, filter_); + if (currentReader_->HasNext()) return; + } +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/VirtualZmwCompositeReader.h b/src/VirtualZmwCompositeReader.h new file mode 100644 index 0000000..b690f42 --- /dev/null +++ b/src/VirtualZmwCompositeReader.h @@ -0,0 +1,76 @@ +// File Description +/// \file VirtualZmwCompositeReader.h +/// \brief Defines the VirtualZmwCompositeReader class. +// +// Author: Derek Barnett + +#ifndef VIRTUALZMWCOMPOSITEREADER_H +#define VIRTUALZMWCOMPOSITEREADER_H + +#include +#include +#include +#include + +#include "VirtualStitching.h" +#include "VirtualZmwReader.h" +#include "pbbam/DataSet.h" +#include "pbbam/PbiFilter.h" + +namespace PacBio { +namespace BAM { + +/// \brief The VirtualZmwCompositeReader provides an interface for +/// re-stitching "virtual" polymerase reads from their constituent parts, +/// across multiple %BAM resources from a DataSet. +/// +/// This class is essentially a DataSet-aware wrapper around +/// VirtualZmwReader, enabling multiple resources as input. See that +/// class's documentation for more info. +/// +class PBBAM_EXPORT VirtualZmwCompositeReader +{ +public: + /// \name Constructors & Related Methods + /// \{ + + explicit VirtualZmwCompositeReader(const DataSet& dataset); + + VirtualZmwCompositeReader() = delete; + VirtualZmwCompositeReader(const VirtualZmwCompositeReader&) = delete; + VirtualZmwCompositeReader(VirtualZmwCompositeReader&&) = delete; + VirtualZmwCompositeReader& operator=(const VirtualZmwCompositeReader&) = delete; + VirtualZmwCompositeReader& operator=(VirtualZmwCompositeReader&&) = delete; + ~VirtualZmwCompositeReader() = default; + + /// \} + + /// \name Stitched Record Reading + /// \{ + + /// \returns true if more ZMWs/files are available for reading. + bool HasNext(); + + /// \returns the next stitched polymerase read + VirtualZmwBamRecord Next(); + + /// \returns the next set of reads that belong to one ZMW from one %BAM + /// resource (a primary %BAM and/or its scraps file). This enables + /// stitching records in a distinct thread. + /// + std::vector NextRaw(); + + /// \} + +private: + StitchingSources sources_; + std::unique_ptr currentReader_; + PbiFilter filter_; + + void OpenNextReader(); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VIRTUALCOMPOSITEREADER_H diff --git a/src/VirtualZmwReader.cpp b/src/VirtualZmwReader.cpp new file mode 100644 index 0000000..9dd6fa4 --- /dev/null +++ b/src/VirtualZmwReader.cpp @@ -0,0 +1,108 @@ +// File Description +/// \file VirtualZmwReader.cpp +/// \brief Implements the VirtualZmwReader class. +// +// Author: Armin Töpfer + +#include "PbbamInternalConfig.h" + +#include "VirtualZmwReader.h" + +#include + +#include "pbbam/ReadGroupInfo.h" + +namespace PacBio { +namespace BAM { + +VirtualZmwReader::VirtualZmwReader(const std::string& primaryBamFilepath, + const std::string& scrapsBamFilepath) + : VirtualZmwReader(primaryBamFilepath, scrapsBamFilepath, PbiFilter{}) +{ +} + +VirtualZmwReader::VirtualZmwReader(const std::string& primaryBamFilepath, + const std::string& scrapsBamFilepath, const PbiFilter& filter) +{ + primaryBamFile_ = std::make_unique(primaryBamFilepath); + scrapsBamFile_ = std::make_unique(scrapsBamFilepath); + + if (filter.IsEmpty()) { + primaryQuery_ = std::make_unique(*primaryBamFile_); + scrapsQuery_ = std::make_unique(*scrapsBamFile_); + } else { + primaryQuery_ = std::make_unique(filter, *primaryBamFile_); + scrapsQuery_ = std::make_unique(filter, *scrapsBamFile_); + } + + primaryIt_ = (primaryQuery_->begin()); + scrapsIt_ = (scrapsQuery_->begin()); + + stitchedHeader_ = std::make_unique(primaryBamFile_->Header().ToSam()); + + // update stitched read group in header + auto readGroups = stitchedHeader_->ReadGroups(); + if (readGroups.empty()) + throw std::runtime_error{ + "VirtualZmwReader: no read groups in header of the primary BAM file: " + + primaryBamFilepath}; + readGroups[0].ReadType("POLYMERASE"); + readGroups[0].Id(readGroups[0].MovieName(), "POLYMERASE"); + if (readGroups.size() > 1) { + std::vector singleGroup; + singleGroup.emplace_back(std::move(readGroups[0])); + readGroups = std::move(singleGroup); + stitchedHeader_->ClearReadGroups(); + } + stitchedHeader_->ReadGroups(readGroups); +} + +VirtualZmwReader::~VirtualZmwReader() = default; + +bool VirtualZmwReader::HasNext() +{ + // Return true until both iterators are at the end of the query + return primaryIt_ != primaryQuery_->end() || scrapsIt_ != scrapsQuery_->end(); +} + +// This method is not thread safe +VirtualZmwBamRecord VirtualZmwReader::Next() +{ + return VirtualZmwBamRecord{NextRaw(), *stitchedHeader_}; +} + +std::vector VirtualZmwReader::NextRaw() +{ + std::vector bamRecordVec; + + // Current hole number, the smallest of scraps and primary. + // It can be that the next ZMW is scrap only. + int currentHoleNumber; + if (primaryIt_ == primaryQuery_->end()) + currentHoleNumber = (*scrapsIt_).HoleNumber(); + else if (scrapsIt_ == scrapsQuery_->end()) + currentHoleNumber = (*primaryIt_).HoleNumber(); + else + 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; +} + +BamHeader VirtualZmwReader::PrimaryHeader() const { return primaryBamFile_->Header(); } + +BamHeader VirtualZmwReader::ScrapsHeader() const { return scrapsBamFile_->Header(); } + +BamHeader VirtualZmwReader::StitchedHeader() const { return *stitchedHeader_.get(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/VirtualZmwReader.h b/src/VirtualZmwReader.h new file mode 100644 index 0000000..af2b03b --- /dev/null +++ b/src/VirtualZmwReader.h @@ -0,0 +1,89 @@ +// File Description +/// \file VirtualZmwReader.h +/// \brief Defines the VirtualZmwReader class. +// +// Author: Armin Töpfer + +#ifndef VIRTUALZMWREADER_H +#define VIRTUALZMWREADER_H + +#include + +#include "pbbam/BamFile.h" +#include "pbbam/BamRecord.h" +#include "pbbam/Config.h" +#include "pbbam/EntireFileQuery.h" +#include "pbbam/PbiFilter.h" +#include "pbbam/PbiFilterQuery.h" +#include "pbbam/virtual/VirtualZmwBamRecord.h" + +namespace PacBio { +namespace BAM { + +class VirtualZmwReader +{ +public: + /// \brief Creates a reader that will operate on a primary %BAM file (e.g. + /// subread data) and a scraps file, consuming all reads. + /// + /// \param[in] primaryBamFilepath hqregion.bam or subreads.bam file path + /// \param[in] scrapsBamFilepath scraps.bam file path + /// + VirtualZmwReader(const std::string& primaryBamFilepath, const std::string& scrapsBamFilepath); + + /// \brief Creates a reader that will operate on a primary %BAM file (e.g. + /// subread data) and a scraps file, respecting the provided PBI + /// filter. + /// + /// \note All %BAM files must have a corresponding ".pbi" index file to use + /// the filter. You may need to call BamFile::EnsurePacBioIndexExists + /// before constructing the reader. + /// + /// \param[in] primaryBamFilepath hqregion.bam or subreads.bam file path + /// \param[in] scrapsBamFilepath scraps.bam file path + /// \param[in] filter PBI filter criteria + /// + VirtualZmwReader(const std::string& primaryBamFilepath, const std::string& scrapsBamFilepath, + const PbiFilter& filter); + + VirtualZmwReader() = delete; + VirtualZmwReader(const VirtualZmwReader&) = delete; + VirtualZmwReader(VirtualZmwReader&&) = delete; + VirtualZmwReader& operator=(const VirtualZmwReader&) = delete; + VirtualZmwReader& operator=(VirtualZmwReader&&) = delete; + ~VirtualZmwReader(); + + /// \returns the BamHeader associated with this reader's "primary" %BAM file + BamHeader PrimaryHeader() const; + + /// \returns the BamHeader associated with this reader's "scraps" %BAM file + BamHeader ScrapsHeader() const; + + /// \return the BamHeader associated with the newly stitched BAM data + BamHeader StitchedHeader() const; + + /// \returns true if more ZMWs are available for reading. + bool HasNext(); + + /// \returns the next stitched polymerase read + VirtualZmwBamRecord Next(); + + /// \returns the next set of reads that belong to one ZMW. + /// This enables stitching records in a distinct thread. + /// + std::vector NextRaw(); + +private: + std::unique_ptr primaryBamFile_; + std::unique_ptr scrapsBamFile_; + std::unique_ptr primaryQuery_; + std::unique_ptr scrapsQuery_; + internal::IQuery::iterator primaryIt_; + internal::IQuery::iterator scrapsIt_; + std::unique_ptr stitchedHeader_; +}; + +} // namespace BAM +} // namespace PacBio + +#endif // VirtualZmwREADER_H diff --git a/src/WhitelistedZmwReadStitcher.cpp b/src/WhitelistedZmwReadStitcher.cpp new file mode 100644 index 0000000..eaf501d --- /dev/null +++ b/src/WhitelistedZmwReadStitcher.cpp @@ -0,0 +1,140 @@ +// File Description +/// \file WhitelistedZmwReadStitcher.cpp +/// \brief Implements the WhitelistedZmwReadStitcher class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/virtual/WhitelistedZmwReadStitcher.h" + +#include +#include + +#include "VirtualZmwReader.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiIndexedBamReader.h" + +namespace PacBio { +namespace BAM { + +class WhitelistedZmwReadStitcher::WhitelistedZmwReadStitcherPrivate +{ +public: + WhitelistedZmwReadStitcherPrivate(const std::vector& zmwWhitelist, + const std::string& primaryBamFilePath, + const std::string& scrapsBamFilePath) + : primaryBamFile_{std::make_unique(primaryBamFilePath)} + , scrapsBamFile_{std::make_unique(scrapsBamFilePath)} + , primaryReader_{std::make_unique(*primaryBamFile_)} + , scrapsReader_{std::make_unique(*scrapsBamFile_)} + { + // setup new header for stitched data + polyHeader_ = std::make_unique(primaryBamFile_->Header().ToSam()); + auto readGroups = polyHeader_->ReadGroups(); + if (readGroups.empty()) + throw std::runtime_error{ + "WhitelistedZmwStitcher: no read groups in header of the primary BAM file: " + + primaryBamFilePath}; + readGroups[0].ReadType("POLYMERASE"); + readGroups[0].Id(readGroups[0].MovieName(), "POLYMERASE"); + if (readGroups.size() > 1) { + std::vector singleGroup; + singleGroup.emplace_back(std::move(readGroups[0])); + readGroups = std::move(singleGroup); + polyHeader_->ClearReadGroups(); + } + polyHeader_->ReadGroups(readGroups); + + // remove ZMWs up front, that are not found in either file + PreFilterZmws(zmwWhitelist); + } + + bool HasNext() const { return !zmwWhitelist_.empty(); } + + VirtualZmwBamRecord Next() + { + auto bamRecordVec = NextRaw(); + return {std::move(bamRecordVec), *polyHeader_}; + } + + std::vector NextRaw() + { + std::vector result; + if (!HasNext()) return result; + + const auto& zmw = zmwWhitelist_.front(); + primaryReader_->Filter(PbiZmwFilter{zmw}); + scrapsReader_->Filter(PbiZmwFilter{zmw}); + + BamRecord record; + while (primaryReader_->GetNext(record)) + result.push_back(record); + while (scrapsReader_->GetNext(record)) + result.push_back(record); + + zmwWhitelist_.pop_front(); + return result; + } + + BamHeader PrimaryHeader() const { return primaryBamFile_->Header(); } + + BamHeader ScrapsHeader() const { return scrapsBamFile_->Header(); } + +private: + std::unique_ptr primaryBamFile_; + std::unique_ptr scrapsBamFile_; + std::unique_ptr primaryReader_; + std::unique_ptr scrapsReader_; + std::unique_ptr polyHeader_; + std::deque zmwWhitelist_; + + void PreFilterZmws(const std::vector& zmwWhitelist) + { + // fetch input ZMWs + const PbiRawData primaryIndex{primaryBamFile_->PacBioIndexFilename()}; + const PbiRawData scrapsIndex{scrapsBamFile_->PacBioIndexFilename()}; + const auto& primaryZmws = primaryIndex.BasicData().holeNumber_; + const auto& scrapsZmws = scrapsIndex.BasicData().holeNumber_; + + // toss them all into a set (for uniqueness & lookup here soon) + std::set inputZmws; + for (const auto& zmw : primaryZmws) + inputZmws.insert(zmw); + for (const auto& zmw : scrapsZmws) + inputZmws.insert(zmw); + + // check our requested whitelist against files' ZMWs, keep if found + const auto inputEnd = inputZmws.cend(); + for (const int32_t zmw : zmwWhitelist) { + if (inputZmws.find(zmw) != inputEnd) zmwWhitelist_.push_back(zmw); + } + } +}; + +// -------------------------------- +// ZmwReadStitcher implementation +// -------------------------------- + +WhitelistedZmwReadStitcher::WhitelistedZmwReadStitcher(const std::vector& zmwWhitelist, + const std::string& primaryBamFilePath, + const std::string& scrapsBamFilePath) + : d_{std::make_unique(zmwWhitelist, primaryBamFilePath, + scrapsBamFilePath)} +{ +} + +WhitelistedZmwReadStitcher::~WhitelistedZmwReadStitcher() = default; + +bool WhitelistedZmwReadStitcher::HasNext() const { return d_->HasNext(); } + +VirtualZmwBamRecord WhitelistedZmwReadStitcher::Next() { return d_->Next(); } + +std::vector WhitelistedZmwReadStitcher::NextRaw() { return d_->NextRaw(); } + +BamHeader WhitelistedZmwReadStitcher::PrimaryHeader() const { return d_->PrimaryHeader(); } + +BamHeader WhitelistedZmwReadStitcher::ScrapsHeader() const { return d_->ScrapsHeader(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/XmlReader.cpp b/src/XmlReader.cpp new file mode 100644 index 0000000..f445748 --- /dev/null +++ b/src/XmlReader.cpp @@ -0,0 +1,229 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "XmlReader.h" + +#include +#include +#include +#include +#include +#include + +#include "pbbam/MakeUnique.h" +#include "pbbam/StringUtilities.h" +#include "pugixml/pugixml.hpp" + +using DataSetElement = PacBio::BAM::internal::DataSetElement; +using FromInputXml = PacBio::BAM::internal::FromInputXml; + +namespace PacBio { +namespace BAM { +namespace { + +std::unique_ptr MakeDataSetBase(const pugi::xml_node& xmlNode) +{ + const FromInputXml fromInputXml; + std::string name = xmlNode.name(); + const auto foundColon = name.find(':'); + if (foundColon != std::string::npos) { + name = name.substr(foundColon + 1); + } + + const auto type = ElementTypeFromName(name); + switch (type) { + case XmlElementType::ALIGNMENT_SET: + return std::make_unique(fromInputXml); + case XmlElementType::BARCODE_SET: + return std::make_unique(fromInputXml); + case XmlElementType::CONSENSUS_ALIGNMENT_SET: + return std::make_unique(fromInputXml); + case XmlElementType::CONSENSUS_READ_SET: + return std::make_unique(fromInputXml); + case XmlElementType::CONTIG_SET: + return std::make_unique(fromInputXml); + case XmlElementType::HDF_SUBREAD_SET: + return std::make_unique(fromInputXml); + case XmlElementType::REFERENCE_SET: + return std::make_unique(fromInputXml); + case XmlElementType::SUBREAD_SET: + return std::make_unique(fromInputXml); + case XmlElementType::TRANSCRIPT_SET: + return std::make_unique(fromInputXml); + case XmlElementType::TRANSCRIPT_ALIGNMENT_SET: + return std::make_unique(fromInputXml); + case XmlElementType::GENERIC_DATASET: + return std::make_unique(fromInputXml); + default: + // unreachable + throw std::runtime_error{"XmlReader: unknown data set label: " + name}; + } +} + +std::shared_ptr MakeElement(const pugi::xml_node& xmlNode) +{ + std::string name = xmlNode.name(); + const auto foundColon = name.find(':'); + if (foundColon != std::string::npos) { + name = name.substr(foundColon + 1); + } + + const FromInputXml fromInputXml; + const auto type = ElementTypeFromName(name); + switch (type) { + case XmlElementType::DATASET_METADATA: + return std::make_shared(fromInputXml); + case XmlElementType::EXTENSION: + return std::make_shared(fromInputXml); + case XmlElementType::EXTENSIONS: + return std::make_shared(fromInputXml); + case XmlElementType::EXTERNAL_RESOURCE: + return std::make_shared("", "", fromInputXml); + case XmlElementType::EXTERNAL_RESOURCES: + return std::make_shared(fromInputXml); + case XmlElementType::FILE_INDEX: + return std::make_shared("", "", fromInputXml); + case XmlElementType::FILE_INDICES: + return std::make_shared(fromInputXml); + case XmlElementType::FILTER: + return std::make_shared(fromInputXml); + case XmlElementType::FILTERS: + return std::make_shared(fromInputXml); + case XmlElementType::PARENT_TOOL: + return std::make_shared(fromInputXml); + case XmlElementType::PROPERTY: + return std::make_shared("", "", "", fromInputXml); + case XmlElementType::PROPERTIES: + return std::make_shared(fromInputXml); + case XmlElementType::PROVENANCE: + return std::make_shared(fromInputXml); + case XmlElementType::ALIGNMENT_SET: + return std::make_shared(fromInputXml); + case XmlElementType::BARCODE_SET: + return std::make_shared(fromInputXml); + case XmlElementType::CONSENSUS_ALIGNMENT_SET: + return std::make_shared(fromInputXml); + case XmlElementType::CONSENSUS_READ_SET: + return std::make_shared(fromInputXml); + case XmlElementType::CONTIG_SET: + return std::make_shared(fromInputXml); + case XmlElementType::HDF_SUBREAD_SET: + return std::make_shared(fromInputXml); + case XmlElementType::SUBREAD_SET: + return std::make_shared(fromInputXml); + case XmlElementType::REFERENCE_SET: + return std::make_shared(fromInputXml); + case XmlElementType::TRANSCRIPT_SET: + return std::make_shared(fromInputXml); + case XmlElementType::TRANSCRIPT_ALIGNMENT_SET: + return std::make_shared(fromInputXml); + case XmlElementType::SUBDATASETS: + return std::make_shared(fromInputXml); + case XmlElementType::GENERIC_DATASET: + return std::make_shared(fromInputXml); + case XmlElementType::GENERIC_ELEMENT: + return std::make_shared(name, fromInputXml); + default: + // unreachable + throw std::runtime_error{"XmlReader: unknown data element label: " + name}; + } +} + +void UpdateRegistry(const std::string& attributeName, const std::string& attributeValue, + NamespaceRegistry& registry) +{ + std::vector nameParts = Split(attributeName, ':'); + assert(!nameParts.empty()); + if (nameParts.size() > 2) + throw std::runtime_error{"XmlReader: 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 std::string& name = nameParts.at(1); + const std::string& uri = attributeValue; + NamespaceInfo namespaceInfo(name, uri); + registry.Register(xsd, namespaceInfo); + } +} + +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 std::string label = xmlNode.name(); + if (label.empty()) return; + + auto e = MakeElement(xmlNode); + e->Label(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.get()); + } + + parent.AddChild(e); +} + +} // namespace + +std::unique_ptr XmlReader::FromStream(std::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{"XmlReader: could not read XML file, error code:" + + std::to_string(loadResult.status)}; + + // parse top-level attributes + pugi::xml_node rootNode = doc.document_element(); + if (rootNode == pugi::xml_node()) + throw std::runtime_error{"XmlReader: could not fetch XML root node"}; + + // create dataset matching type strings + auto dataset = MakeDataSetBase(rootNode); + dataset->Label(rootNode.name()); + + // iterate attributes, capture namespace info + const std::string xmlnsPrefix("xmlns"); + auto attrIter = rootNode.attributes_begin(); + auto attrEnd = rootNode.attributes_end(); + for (; attrIter != attrEnd; ++attrIter) { + const std::string name = attrIter->name(); + const std::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; + FromXml(childNode, *dataset.get()); + } + + return dataset; +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/XmlReader.h b/src/XmlReader.h new file mode 100644 index 0000000..336aefc --- /dev/null +++ b/src/XmlReader.h @@ -0,0 +1,23 @@ +// Author: Derek Barnett + +#ifndef XMLREADER_H +#define XMLREADER_H + +#include +#include + +#include "pbbam/DataSet.h" + +namespace PacBio { +namespace BAM { + +class XmlReader +{ +public: + static std::unique_ptr FromStream(std::istream& in); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // XMLREADER_H diff --git a/src/XmlWriter.cpp b/src/XmlWriter.cpp new file mode 100644 index 0000000..ba63679 --- /dev/null +++ b/src/XmlWriter.cpp @@ -0,0 +1,159 @@ +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "XmlWriter.h" + +#include +#include +#include +#include + +#include "pbbam/DataSet.h" +#include "pugixml/pugixml.hpp" + +using DataSetElement = PacBio::BAM::internal::DataSetElement; + +namespace PacBio { +namespace BAM { +namespace { + +std::string Prefix(const std::string& input) +{ + const auto colonFound = input.find(':'); + if (colonFound == std::string::npos || colonFound == 0) return std::string(); + return input.substr(0, colonFound); +} + +std::string OutputName(const DataSetElement& node, const NamespaceRegistry& registry) +{ + // if from input XML, respect the namespaces given + if (node.IsVerbatimLabel()) return node.QualifiedNameLabel(); + + // otherwise, probably user-generated + else { + // if no namespace prefix, prepend the appropriate one & return + if (node.PrefixLabel().empty()) { + static const std::string colon = ":"; + auto xsdType = node.Xsd(); + if (xsdType == XsdType::NONE) + xsdType = registry.XsdForElement(node.LocalNameLabel().to_string()); + return registry.Namespace(xsdType).Name() + colon + node.LocalNameLabel().to_string(); + } + // otherwise, has prefix - return full name + else + return node.QualifiedNameLabel(); + } +} + +void ToXml(const DataSetElement& node, const NamespaceRegistry& registry, + std::map& xsdPrefixesUsed, pugi::xml_node& parentXml) +{ + // create child of parent, w/ label & text + const auto label = OutputName(node, registry); + if (label.empty()) return; // error? + auto xmlNode = parentXml.append_child(label.c_str()); + + if (!node.Text().empty()) xmlNode.text().set(node.Text().c_str()); + + // store XSD type for later + const auto prefix = Prefix(label); + if (!prefix.empty()) xsdPrefixesUsed[node.Xsd()] = prefix; + + // add attributes + for (const auto& attribute : node.Attributes()) { + const auto& name = attribute.first; + if (name.empty()) continue; + auto attr = xmlNode.append_attribute(name.c_str()); + attr.set_value(attribute.second.c_str()); + } + + // additional stuff later? (e.g. comments) + + // iterate children, recursively building up subtree + for (const auto& child : node.Children()) + ToXml(*child, registry, xsdPrefixesUsed, xmlNode); +} + +} // anonymous + +void XmlWriter::ToStream(const DataSetBase& dataset, std::ostream& out) +{ + pugi::xml_document doc; + + const auto& registry = dataset.Namespaces(); + + // create top-level dataset XML node + const auto label = OutputName(dataset, registry); + if (label.empty()) throw std::runtime_error{"XmlReader: could not convert dataset node to XML"}; + auto root = doc.append_child(label.c_str()); + + const auto& text = dataset.Text(); + if (!text.empty()) root.text().set(text.c_str()); + + // add top-level attributes + for (const auto& attribute : dataset.Attributes()) { + const auto& name = attribute.first; + const auto& value = attribute.second; + if (name.empty()) continue; + auto attr = root.append_attribute(name.c_str()); + attr.set_value(value.c_str()); + } + + std::map xsdPrefixesUsed; + xsdPrefixesUsed[dataset.Xsd()] = Prefix(label); + + // iterate children, recursively building up subtree + for (const auto& child : dataset.Children()) + ToXml(*child, registry, xsdPrefixesUsed, root); + + // write XML to stream + auto decl = doc.prepend_child(pugi::node_declaration); + decl.append_attribute("version") = "1.0"; + decl.append_attribute("encoding") = "utf-8"; + + // add XSD namespace attributes + auto xmlnsDefaultAttribute = root.attribute("xmlns"); + if (xmlnsDefaultAttribute.empty()) { + xmlnsDefaultAttribute = root.append_attribute("xmlns"); + xmlnsDefaultAttribute.set_value(registry.DefaultNamespace().Uri().c_str()); + } + auto xsiAttribute = root.attribute("xmlns:xsi"); + if (xsiAttribute.empty()) { + xsiAttribute = root.append_attribute("xmlns:xsi"); + xsiAttribute.set_value("http://www.w3.org/2001/XMLSchema-instance"); + } + auto xsiSchemaLocationAttribute = root.attribute("xsi:schemaLocation"); + if (xsiSchemaLocationAttribute.empty()) { + xsiSchemaLocationAttribute = root.append_attribute("xsi:schemaLocation"); + xsiSchemaLocationAttribute.set_value(registry.DefaultNamespace().Uri().c_str()); + } + + static const std::string xmlnsPrefix = "xmlns:"; + for (const auto prefixIter : xsdPrefixesUsed) { + const auto& xsdType = prefixIter.first; + const auto& prefix = prefixIter.second; + if (xsdType == XsdType::NONE || prefix.empty()) continue; + + const auto& nsInfo = registry.Namespace(xsdType); + assert(nsInfo.Name() == prefix); + const auto xmlnsName = xmlnsPrefix + prefix; + auto xmlnsAttribute = root.attribute(xmlnsName.c_str()); + if (xmlnsAttribute.empty()) { + xmlnsAttribute = root.append_attribute(xmlnsName.c_str()); + xmlnsAttribute.set_value(nsInfo.Uri().c_str()); + } + } + + // "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 std::unique_ptr& dataset, std::ostream& out) +{ + ToStream(*dataset.get(), out); +} + +} // namespace BAM +} // namespace PacBio diff --git a/src/XmlWriter.h b/src/XmlWriter.h new file mode 100644 index 0000000..9630c31 --- /dev/null +++ b/src/XmlWriter.h @@ -0,0 +1,24 @@ +// Author: Derek Barnett + +#ifndef XMLWRITER_H +#define XMLWRITER_H + +#include +#include + +namespace PacBio { +namespace BAM { + +class DataSetBase; + +class XmlWriter +{ +public: + static void ToStream(const DataSetBase& dataset, std::ostream& out); + static void ToStream(const std::unique_ptr& dataset, std::ostream& out); +}; + +} // namespace BAM +} // namespace PacBio + +#endif // XMLWRITER_H diff --git a/src/ZmwGroupQuery.cpp b/src/ZmwGroupQuery.cpp new file mode 100644 index 0000000..c196515 --- /dev/null +++ b/src/ZmwGroupQuery.cpp @@ -0,0 +1,79 @@ +// File Description +/// \file ZmwQuery.cpp +/// \brief Implements the ZmwQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/ZmwGroupQuery.h" + +#include +#include +#include + +#include "MemoryUtils.h" +#include "pbbam/BamRecord.h" +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFilterTypes.h" + +namespace PacBio { +namespace BAM { + +class ZmwGroupQuery::ZmwGroupQueryPrivate +{ + using ReaderType = PbiFilterCompositeBamReader; + +public: + ZmwGroupQueryPrivate(const std::vector& zmwWhitelist, const DataSet& dataset) + : whitelist_(zmwWhitelist.cbegin(), zmwWhitelist.cend()) + { + std::sort(whitelist_.begin(), whitelist_.end()); + whitelist_.erase(std::unique(whitelist_.begin(), whitelist_.end()), whitelist_.end()); + + if (!whitelist_.empty()) { + reader_ = std::make_unique(PbiZmwFilter{whitelist_.front()}, dataset); + whitelist_.pop_front(); + } + } + + bool GetNext(std::vector& records) + { + records.clear(); + if (!reader_) return false; + + // get all records matching ZMW + BamRecord r; + while (reader_->GetNext(r)) + records.push_back(r); + + // set next ZMW (if any left) + if (!whitelist_.empty()) { + reader_->Filter(PbiZmwFilter{whitelist_.front()}); + whitelist_.pop_front(); + } + + // otherwise destroy reader, next iteration will return false + else + reader_.reset(); + + return true; + } + +private: + std::deque whitelist_; + std::unique_ptr reader_; +}; + +ZmwGroupQuery::ZmwGroupQuery(const std::vector& zmwWhitelist, const DataSet& dataset) + : internal::IGroupQuery(), d_{std::make_unique(zmwWhitelist, dataset)} +{ +} + +ZmwGroupQuery::~ZmwGroupQuery() = default; + +bool ZmwGroupQuery::GetNext(std::vector& records) { return d_->GetNext(records); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/ZmwQuery.cpp b/src/ZmwQuery.cpp new file mode 100644 index 0000000..1481aef --- /dev/null +++ b/src/ZmwQuery.cpp @@ -0,0 +1,41 @@ +// File Description +/// \file ZmwQuery.cpp +/// \brief Implements the ZmwQuery class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/ZmwQuery.h" + +#include + +#include "pbbam/CompositeBamReader.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFilterTypes.h" + +namespace PacBio { +namespace BAM { + +class ZmwQuery::ZmwQueryPrivate +{ +public: + ZmwQueryPrivate(std::vector zmwWhitelist, const DataSet& dataset) + : reader_{PbiZmwFilter{std::move(zmwWhitelist)}, dataset} + { + } + + PbiFilterCompositeBamReader reader_; +}; + +ZmwQuery::ZmwQuery(std::vector zmwWhitelist, const DataSet& dataset) + : internal::IQuery(), d_{std::make_unique(zmwWhitelist, dataset)} +{ +} + +ZmwQuery::~ZmwQuery() = default; + +bool ZmwQuery::GetNext(BamRecord& r) { return d_->reader_.GetNext(r); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/ZmwReadStitcher.cpp b/src/ZmwReadStitcher.cpp new file mode 100644 index 0000000..4871f68 --- /dev/null +++ b/src/ZmwReadStitcher.cpp @@ -0,0 +1,140 @@ +// File Description +/// \file ZmwReadStitcher.cpp +/// \brief Implements the ZmwReadStitcher class. +// +// Author: Derek Barnett + +#include "PbbamInternalConfig.h" + +#include "pbbam/virtual/ZmwReadStitcher.h" + +#include +#include +#include + +#include "VirtualStitching.h" +#include "VirtualZmwReader.h" +#include "pbbam/DataSet.h" +#include "pbbam/EntireFileQuery.h" +#include "pbbam/MakeUnique.h" +#include "pbbam/PbiFilter.h" +#include "pbbam/PbiFilterQuery.h" + +namespace PacBio { +namespace BAM { + +class ZmwReadStitcher::ZmwReadStitcherPrivate +{ +public: + ZmwReadStitcherPrivate(std::string primaryBamFilePath, std::string scrapsBamFilePath, + PbiFilter filter) + : filter_{std::move(filter)} + { + sources_.push_back({std::move(primaryBamFilePath), std::move(scrapsBamFilePath)}); + OpenNextReader(); + } + + ZmwReadStitcherPrivate(const DataSet& dataset) : filter_{PbiFilter::FromDataSet(dataset)} + { + sources_ = SourcesFromDataset(dataset); + OpenNextReader(); + } + + bool HasNext() const { return (currentReader_ && currentReader_->HasNext()); } + + VirtualZmwBamRecord Next() + { + if (currentReader_) { + const auto result = currentReader_->Next(); + if (!currentReader_->HasNext()) OpenNextReader(); + return result; + } + + // no reader active + throw std::runtime_error{ + "ZmwReadStitcher: " + "no readers active, make sure you use " + "ZmwReadStitcher::HasNext before " + "requesting next record"}; + } + + std::vector NextRaw() + { + if (currentReader_) { + const auto result = currentReader_->NextRaw(); + if (!currentReader_->HasNext()) OpenNextReader(); + return result; + } + + // no reader active + throw std::runtime_error{ + "ZmwReadStitcher: " + "no readers active, make sure you use " + "ZmwReadStitcher::HasNext before " + "requesting next group of records"}; + } + + BamHeader PrimaryHeader() const { return currentReader_->PrimaryHeader(); } + + BamHeader ScrapsHeader() const { return currentReader_->ScrapsHeader(); } + + BamHeader StitchedHeader() const { return currentReader_->StitchedHeader(); } + +private: + StitchingSources sources_; + std::unique_ptr currentReader_; + PbiFilter filter_; + + void OpenNextReader() + { + currentReader_.reset(nullptr); + + // find next source pair with data + while (!sources_.empty()) { + const auto nextSource = sources_.front(); + sources_.pop_front(); + + currentReader_ = + std::make_unique(nextSource.first, nextSource.second, filter_); + if (currentReader_->HasNext()) return; + } + } +}; + +// -------------------------------- +// ZmwReadStitcher implementation +// -------------------------------- + +ZmwReadStitcher::ZmwReadStitcher(std::string primaryBamFilePath, std::string scrapsBamFilePath) + : ZmwReadStitcher{std::move(primaryBamFilePath), std::move(scrapsBamFilePath), PbiFilter{}} +{ +} + +ZmwReadStitcher::ZmwReadStitcher(std::string primaryBamFilePath, std::string scrapsBamFilePath, + PbiFilter filter) + : d_{std::make_unique(std::move(primaryBamFilePath), + std::move(scrapsBamFilePath), std::move(filter))} +{ +} + +ZmwReadStitcher::ZmwReadStitcher(const DataSet& dataset) + : d_{std::make_unique(dataset)} +{ +} + +ZmwReadStitcher::~ZmwReadStitcher() = default; + +bool ZmwReadStitcher::HasNext() { return d_->HasNext(); } + +VirtualZmwBamRecord ZmwReadStitcher::Next() { return d_->Next(); } + +std::vector ZmwReadStitcher::NextRaw() { return d_->NextRaw(); } + +BamHeader ZmwReadStitcher::PrimaryHeader() const { return d_->PrimaryHeader().DeepCopy(); } + +BamHeader ZmwReadStitcher::ScrapsHeader() const { return d_->ScrapsHeader().DeepCopy(); } + +BamHeader ZmwReadStitcher::StitchedHeader() const { return d_->StitchedHeader().DeepCopy(); } + +} // namespace BAM +} // namespace PacBio diff --git a/src/ZmwTypeMap.cpp b/src/ZmwTypeMap.cpp new file mode 100644 index 0000000..4c4b5b5 --- /dev/null +++ b/src/ZmwTypeMap.cpp @@ -0,0 +1,25 @@ +// File Description +/// \file ZmwTypeMap.cpp +/// \brief Implements the ZmwTypeMap class. +// +// Author: Armin Töpfer + +#include "PbbamInternalConfig.h" + +#include "pbbam/ZmwTypeMap.h" + +namespace PacBio { +namespace BAM { + +// clang-format off +std::map ZmwTypeMap::ParseChar +{ + { 'C' , ZmwType::CONTROL }, + { 'M' , ZmwType::MALFORMED }, + { 'N' , ZmwType::NORMAL }, + { 'S' , ZmwType::SENTINEL } +}; +// clang-format on + +} // namespace BAM +} // namespace PacBio diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..616b443 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,129 @@ +########### +# sources # +########### + +pbbam_cpp_sources = files([ + 'Accuracy.cpp', + 'AlignmentPrinter.cpp', + 'BaiIndexedBamReader.cpp', + 'BamFile.cpp', + 'BamFileMerger.cpp', + 'BamHeader.cpp', + 'BamReader.cpp', + 'BamRecord.cpp', + 'BamRecordBuilder.cpp', + 'BamRecordImpl.cpp', + 'BamRecordTags.cpp', + 'BamRecordView.cpp', + 'BamTagCodec.cpp', + 'BamWriter.cpp', + 'BarcodeQuery.cpp', + 'ChemistryTable.cpp', + 'Cigar.cpp', + 'CigarOperation.cpp', + 'Compare.cpp', + 'CompositeFastaReader.cpp', + 'Config.cpp', + 'DataSet.cpp', + 'DataSetBaseTypes.cpp', + 'DataSetElement.cpp', + 'DataSetIO.cpp', + 'DataSetTypes.cpp', + 'DataSetXsd.cpp', + 'EntireFileQuery.cpp', + 'FastaCache.cpp', + 'FastaReader.cpp', + 'FastaSequence.cpp', + 'FastaSequenceQuery.cpp', + 'FastaWriter.cpp', + 'FastqReader.cpp', + 'FastqSequence.cpp', + 'FastqWriter.cpp', + 'FileProducer.cpp', + 'FileUtils.cpp', + 'FofnReader.cpp', + 'Frames.cpp', + 'GenomicInterval.cpp', + 'GenomicIntervalQuery.cpp', + 'IndexedBamWriter.cpp', + 'IndexedFastaReader.cpp', + 'IRecordWriter.cpp', + 'MD5.cpp', + 'MemoryUtils.cpp', + 'PbiBuilder.cpp', + 'PbiFile.cpp', + 'PbiFilter.cpp', + 'PbiFilterQuery.cpp', + 'PbiFilterTypes.cpp', + 'PbiIndexedBamReader.cpp', + 'PbiIndexIO.cpp', + 'PbiRawData.cpp', + 'ProgramInfo.cpp', + 'QNameQuery.cpp', + 'QualityValue.cpp', + 'QualityValues.cpp', + 'ReadAccuracyQuery.cpp', + 'ReadGroupInfo.cpp', + 'RecordType.cpp', + 'SamTagCodec.cpp', + 'SamWriter.cpp', + 'SequenceInfo.cpp', + 'StringUtilities.cpp', + 'SubreadLengthQuery.cpp', + 'Tag.cpp', + 'TagCollection.cpp', + 'Validator.cpp', + 'ValidationErrors.cpp', + 'ValidationException.cpp', + 'Version.cpp', + 'VirtualZmwBamRecord.cpp', + 'VirtualZmwCompositeReader.cpp', + 'VirtualZmwReader.cpp', + 'VirtualRegion.cpp', + 'VirtualRegionTypeMap.cpp', + 'XmlReader.cpp', + 'XmlWriter.cpp', + 'WhitelistedZmwReadStitcher.cpp', + 'ZmwGroupQuery.cpp', + 'ZmwReadStitcher.cpp', + 'ZmwQuery.cpp', + 'ZmwTypeMap.cpp', + + # vcf + 'vcf/VcfFile.cpp', + 'vcf/VcfFormat.cpp', + 'vcf/VcfHeader.cpp', + 'vcf/VcfHeaderTypes.cpp', + 'vcf/VcfQuery.cpp', + 'vcf/VcfReader.cpp', + 'vcf/VcfSort.cpp', + 'vcf/VcfVariant.cpp', + 'vcf/VcfWriter.cpp', + + # XML I/O + 'pugixml/pugixml.cpp' +]) + +pbbam_extra_flags = [] +if get_option('auto-validate') + pbbam_extra_flags += '-DPBBAM_AUTOVALIDATE=1' +endif + +# install library if +# - either running as a proper project +# - or using shared libraries +pbbam_lib_install = (not meson.is_subproject()) or (get_option('default_library') == 'shared') + +pbbam_lib = library( + 'pbbam', + pbbam_cpp_sources, + # use boost SONAME practice: + # cause ld startup issues before + # you even have the chance of running + # into ABI issues. + soversion : meson.project_version(), + version : meson.project_version(), + install : pbbam_lib_install, + dependencies : [pbbam_thread_dep, pbbam_boost_dep, pbbam_zlib_dep, pbbam_htslib_dep], + include_directories : pbbam_include_directories, + cpp_args : [pbbam_extra_flags, pbbam_warning_flags, pbbam_macros]) 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@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@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..37bdec0 --- /dev/null +++ b/src/pugixml/pugixml.cpp @@ -0,0 +1,11539 @@ +/** + * pugixml parser - version 1.5 + * -------------------------------------------------------- + * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine@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@tima.net) + */ + +#ifndef SOURCE_PUGIXML_CPP +#define SOURCE_PUGIXML_CPP + +// disable all the warnings in this file +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdouble-promotion" + +#if __GNUC__ >= 6 +#pragma GCC diagnostic ignored "-Wnull-dereference" +#endif + +#if !defined(__clang__) and !defined(__INTEL_COMPILER) +#pragma GCC diagnostic ignored "-Wuseless-cast" +#endif + +#include "../PbbamInternalConfig.h" + +#include "pugixml.hpp" + +#include +#include +#include +#include +#include +#include + +#ifdef PUGIXML_WCHAR_MODE +# include +#endif + +#ifndef PUGIXML_NO_XPATH +# include +# include +# ifdef PUGIXML_NO_EXCEPTIONS +# include +# endif +#endif + +#ifndef PUGIXML_NO_STL +# include +# include +# include +#endif + +// For placement new +#include + +#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 +#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 + 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 allocation_function xml_memory_management_function_storage::allocate = default_allocate; + template deallocation_function xml_memory_management_function_storage::deallocate = default_deallocate; + + typedef xml_memory_management_function_storage 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(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(((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(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((reinterpret_cast(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(memory) <= 127); + page_memory[-1] = static_cast(page_memory - static_cast(memory)); + + return page; + } + + static void deallocate_page(xml_memory_page* page) + { + char* page_memory = reinterpret_cast(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(_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(page) + sizeof(xml_memory_page) && ptr < reinterpret_cast(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(allocate_memory(full_size, page)); + + if (!header) return 0; + + // setup header + ptrdiff_t page_offset = reinterpret_cast(header) - reinterpret_cast(page) - sizeof(xml_memory_page); + + assert(page_offset >= 0 && page_offset < (1 << 16)); + header->page_offset = static_cast(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(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(static_cast(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(static_cast(string)) - 1; + assert(header); + + // deallocate + size_t page_offset = sizeof(xml_memory_page) + header->page_offset; + xml_memory_page* page = reinterpret_cast(static_cast(reinterpret_cast(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(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(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(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(node->header & xml_memory_page_pointer_mask)->allocator; + } + + template inline xml_document_struct& get_document(const Object* object) + { + assert(object); + + return *static_cast(reinterpret_cast(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(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(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(((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(ch); + return result + 1; + } + // U+0080..U+07FF + else if (ch < 0x800) + { + result[0] = static_cast(0xC0 | (ch >> 6)); + result[1] = static_cast(0x80 | (ch & 0x3F)); + return result + 2; + } + // U+0800..U+FFFF + else + { + result[0] = static_cast(0xE0 | (ch >> 12)); + result[1] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + result[2] = static_cast(0x80 | (ch & 0x3F)); + return result + 3; + } + } + + static value_type high(value_type result, uint32_t ch) + { + // U+10000..U+10FFFF + result[0] = static_cast(0xF0 | (ch >> 18)); + result[1] = static_cast(0x80 | ((ch >> 12) & 0x3F)); + result[2] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + result[3] = static_cast(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(ch); + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + uint32_t msh = static_cast(ch - 0x10000) >> 10; + uint32_t lsh = static_cast(ch - 0x10000) & 0x3ff; + + result[0] = static_cast(0xD800 + msh); + result[1] = static_cast(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(ch > 255 ? '?' : ch); + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + (void)ch; + + *result = '?'; + + return result + 1; + } + }; + + template 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::counter wchar_counter; + typedef wchar_selector::writer wchar_writer; + + template 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(data) & 3) == 0) + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + while (size >= 4 && (*static_cast(static_cast(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(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(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(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(lead - 0xE000) < 0x2000) + { + result = Traits::low(result, lead); + data += 1; + } + // surrogate pair lead + else if (static_cast(lead - 0xD800) < 0x400 && data + 1 < end) + { + uint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1]; + + if (static_cast(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::type*>(data), size, result); + } + }; + + template 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(endian_swap(static_cast::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(c) < 128 ? table[static_cast(c)] : table[128]) & (ct)) +#else + #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast(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(&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 <, (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(const_cast(contents)); + out_length = length; + } + else + { + char_t* buffer = static_cast(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(contents); + size_t length = size / sizeof(char_t); + + if (is_mutable) + { + char_t* buffer = const_cast(data); + + convert_wchar_endian_swap(buffer, data, length); + + out_buffer = buffer; + out_length = length; + } + else + { + char_t* buffer = static_cast(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(contents); + size_t data_length = size; + + // first pass: get length in wchar_t units + size_t length = utf_decoder::decode_utf8_block(data, data_length, 0); + + // allocate buffer of suitable length + char_t* buffer = static_cast(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(buffer); + wchar_writer::value_type oend = utf_decoder::decode_utf8_block(data, data_length, obegin); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + template 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(contents); + size_t data_length = size / sizeof(uint16_t); + + // first pass: get length in wchar_t units + size_t length = utf_decoder::decode_utf16_block(data, data_length, 0); + + // allocate buffer of suitable length + char_t* buffer = static_cast(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(buffer); + wchar_writer::value_type oend = utf_decoder::decode_utf16_block(data, data_length, obegin); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + template 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(contents); + size_t data_length = size / sizeof(uint32_t); + + // first pass: get length in wchar_t units + size_t length = utf_decoder::decode_utf32_block(data, data_length, 0); + + // allocate buffer of suitable length + char_t* buffer = static_cast(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(buffer); + wchar_writer::value_type oend = utf_decoder::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(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(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(buffer); + wchar_writer::value_type oend = utf_decoder::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 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(contents); + size_t data_length = size / sizeof(uint16_t); + + // first pass: get length in utf8 units + size_t length = utf_decoder::decode_utf16_block(data, data_length, 0); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert utf16 input to utf8 + uint8_t* obegin = reinterpret_cast(buffer); + uint8_t* oend = utf_decoder::decode_utf16_block(data, data_length, obegin); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + template 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(contents); + size_t data_length = size / sizeof(uint32_t); + + // first pass: get length in utf8 units + size_t length = utf_decoder::decode_utf32_block(data, data_length, 0); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert utf32 input to utf8 + uint8_t* obegin = reinterpret_cast(buffer); + uint8_t* oend = utf_decoder::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(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::decode_latin1_block(postfix, postfix_length, 0); + + // allocate buffer of suitable length + char_t* buffer = static_cast(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(buffer); + uint8_t* oend = utf_decoder::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::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(buffer); + uint8_t* end = utf_decoder::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 as_wide_impl(const char* str, size_t size) + { + const uint8_t* data = reinterpret_cast(str); + + // first pass: get length in wchar_t units + size_t length = utf_decoder::decode_utf8_block(data, size, 0); + + // allocate resulting string + std::basic_string result; + result.resize(length); + + // second pass: convert to wchar_t + if (length > 0) + { + wchar_writer::value_type begin = reinterpret_cast(&result[0]); + wchar_writer::value_type end = utf_decoder::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(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(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(s) - reinterpret_cast(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(s) - reinterpret_cast(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(ch - '0') <= 9) + ucsc = 16 * ucsc + (ch - '0'); + else if (static_cast((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(static_cast(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(wchar_writer::any(reinterpret_cast(s), ucsc)); + #else + s = reinterpret_cast(utf8_writer::any(reinterpret_cast(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(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 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::parse; + case 1: return strconv_pcdata_impl::parse; + case 2: return strconv_pcdata_impl::parse; + case 3: return strconv_pcdata_impl::parse; + case 4: return strconv_pcdata_impl::parse; + case 5: return strconv_pcdata_impl::parse; + case 6: return strconv_pcdata_impl::parse; + case 7: return strconv_pcdata_impl::parse; + default: assert(false); return 0; // should not get here + } + } + + typedef char_t* (*strconv_attribute_t)(char_t*, char_t); + + template 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::parse_simple; + case 1: return strconv_attribute_impl::parse_simple; + case 2: return strconv_attribute_impl::parse_eol; + case 3: return strconv_attribute_impl::parse_eol; + case 4: return strconv_attribute_impl::parse_wconv; + case 5: return strconv_attribute_impl::parse_wconv; + case 6: return strconv_attribute_impl::parse_wconv; + case 7: return strconv_attribute_impl::parse_wconv; + case 8: return strconv_attribute_impl::parse_wnorm; + case 9: return strconv_attribute_impl::parse_wnorm; + case 10: return strconv_attribute_impl::parse_wnorm; + case 11: return strconv_attribute_impl::parse_wnorm; + case 12: return strconv_attribute_impl::parse_wnorm; + case 13: return strconv_attribute_impl::parse_wnorm; + case 14: return strconv_attribute_impl::parse_wnorm; + case 15: return strconv_attribute_impl::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 == '-') // '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 == '[') + { + // '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 == '?') // '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(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(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(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(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(static_cast(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::decode_wchar_block(data, length, dest); + + return static_cast(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::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(end - dest)); + + return static_cast(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::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(end - dest)); + + return static_cast(end - dest) * sizeof(uint32_t); + } + + // convert to latin1 + if (encoding == encoding_latin1) + { + uint8_t* dest = r_u8; + uint8_t* end = utf_decoder::decode_wchar_block(data, length, dest); + + return static_cast(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(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::decode_utf8_block(reinterpret_cast(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(end - dest)); + + return static_cast(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::decode_utf8_block(reinterpret_cast(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(end - dest)); + + return static_cast(end - dest) * sizeof(uint32_t); + } + + if (encoding == encoding_latin1) + { + uint8_t* dest = r_u8; + uint8_t* end = utf_decoder::decode_utf8_block(reinterpret_cast(data), length, dest); + + return static_cast(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(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(*s++); + assert(ch < 32); + + writer.write('&', '#', static_cast((ch / 10) + '0'), static_cast((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(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(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(wcstol(value, 0, base)); + #else + return static_cast(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(wcstoul(value, 0, base)); + #else + return static_cast(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(wcstod(value, 0)); + #else + return static_cast(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(length); + + if (static_cast(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(buffer)[length] = 0; + return (length + 1) * sizeof(char_t); + } + #else + if (encoding == encoding_utf8) + { + static_cast(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(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 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(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 PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream& stream, void** out_buffer, size_t* out_size) + { + buffer_holder chunks(0, xml_stream_chunk::destroy); + + // read file to a chunk list + size_t total = 0; + xml_stream_chunk* last = 0; + + while (!stream.eof()) + { + // allocate new chunk + xml_stream_chunk* chunk = xml_stream_chunk::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(sizeof(chunk->data) / sizeof(T))); + chunk->size = static_cast(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(xml_memory::allocate(total + max_suffix_size)); + if (!buffer) return status_out_of_memory; + + char* write = buffer; + + for (xml_stream_chunk* chunk = static_cast*>(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 PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream& stream, void** out_buffer, size_t* out_size) + { + // get length of remaining data in stream + typename std::basic_istream::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(length); + + if (static_cast(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(buffer.data), static_cast(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(stream.gcount()); + assert(actual_length <= read_length); + + *out_buffer = buffer.release(); + *out_size = actual_length * sizeof(T); + + return status_ok; + } + + template PUGI__FN xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream& 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(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(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)); + (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 >& stream): narrow_stream(&stream), wide_stream(0) + { + } + + PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream >& 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(data), static_cast(size)); + } + else + { + assert(wide_stream); + assert(size % sizeof(wchar_t) == 0); + + wide_stream->write(reinterpret_cast(data), static_cast(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(reinterpret_cast(_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::children() const + { + return xml_object_range(begin(), end()); + } + + PUGI__FN xml_object_range xml_node::children(const char_t* name_) const + { + return xml_object_range(xml_named_node_iterator(child(name_)._root, _root, name_), xml_named_node_iterator(0, _root, name_)); + } + + PUGI__FN xml_object_range xml_node::attributes() const + { + return xml_object_range(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(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(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(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(reinterpret_cast(_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 >& 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 >& 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(&_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(&_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(&_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((reinterpret_cast(_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(page) + sizeof(impl::xml_memory_page)) impl::xml_document_struct(page); + _root->prev_sibling_c = _root; + + // setup sentinel page + page->allocator = static_cast(_root); + + // verify the document allocation + assert(reinterpret_cast(_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(_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(_root->header & impl::xml_memory_page_pointer_mask); + assert(root_page && !root_page->prev); + assert(reinterpret_cast(root_page) >= _memory && reinterpret_cast(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 >& 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 >& 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(_root), _root, const_cast(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(_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(_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(bom)); + #else + buffered_writer.write('\xef', '\xbb', '\xbf'); + #endif + } + + if (!(flags & format_no_declaration) && !impl::has_declaration(_root)) + { + buffered_writer.write_string(PUGIXML_TEXT("'); + 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 >& 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 >& 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& str) + { + return impl::as_utf8_impl(str.c_str(), str.size()); + } + + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const char* str) + { + assert(str); + + return impl::as_wide_impl(str, strlen(str)); + } + + PUGI__FN std::basic_string 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 bool operator()(const T& lhs, const T& rhs) const + { + return lhs == rhs; + } + }; + + struct not_equal_to + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs != rhs; + } + }; + + struct less + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs < rhs; + } + }; + + struct less_equal + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs <= rhs; + } + }; + + template void swap(T& lhs, T& rhs) + { + T temp = lhs; + lhs = rhs; + rhs = temp; + } + + template 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 void reverse(I begin, I end) + { + while (end - begin > 1) swap(*begin++, *--end); + } + + template 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 void copy_backwards(I begin, I end, I target) + { + while (begin != end) *--target = *--end; + } + + template 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 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 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 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 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(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(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(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(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(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(alloc->reallocate(_uses_heap ? const_cast(_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(_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(ch - 'A') < 26 ? static_cast(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(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(static_cast(*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(*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(end - begin); + char_t* scratch = buffer; + + if (length >= sizeof(buffer) / sizeof(buffer[0])) + { + // need to make dummy on-heap copy + scratch = static_cast(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(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(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(*from); + unsigned int tc = static_cast(*to); + + if (fc >= 128 || tc >= 128) + return 0; + + // code=128 means "skip character" + if (!table[fc]) + table[fc] = static_cast(tc ? tc : 128); + + from++; + if (tc) to++; + } + + for (int i = 0; i < 128; ++i) + if (!table[i]) + table[i] = static_cast(i); + + void* result = alloc->allocate_nothrow(sizeof(table)); + + if (result) + { + memcpy(result, table, sizeof(table)); + } + + return static_cast(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(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(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(*str++); + result += result << 10; + result ^= result >> 6; + } + + result += result << 3; + result ^= result >> 11; + result += result << 15; + + return result; + } + + template 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(name); + + case xpath_type_number: + return new_xpath_variable(name); + + case xpath_type_string: + return new_xpath_variable(name); + + case xpath_type_boolean: + return new_xpath_variable(name); + + default: + return 0; + } + } + + template 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(var)); + break; + + case xpath_type_number: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_string: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_boolean: + delete_xpath_variable(static_cast(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(end - begin); + char_t* scratch = buffer; + + if (length >= sizeof(buffer) / sizeof(buffer[0])) + { + // need to make dummy on-heap copy + scratch = static_cast(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(_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(_end - _begin); + size_t capacity = static_cast(_eos - _begin); + size_t count = static_cast(end_ - begin_); + + if (size_ + count > capacity) + { + // reallocate the old array or allocate a new one + xpath_node* data = static_cast(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(_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(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(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 struct axis_to_type + { + static const axis_t axis; + }; + + template const axis_t axis_to_type::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 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 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(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 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 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 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 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(type)), _rettype(static_cast(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(type)), _rettype(static_cast(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(type)), _rettype(static_cast(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(type)), _rettype(static_cast(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(type)), _rettype(xpath_type_node_set), _axis(static_cast(axis)), _test(static_cast(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(type)), _rettype(xpath_type_node_set), _axis(0), _test(static_cast(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 + + 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(c.size); + + case ast_func_position: + return static_cast(c.position); + + case ast_func_count: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(_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(string_value(c.n, stack.result).length()); + } + + case ast_func_string_length_1: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(_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 + + 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(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(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(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(first); + size_t end = last >= s_length + 1 ? s_length + 1 : static_cast(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 + + 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()); + + case axis_ancestor_or_self: + return step_do(c, stack, eval, axis_to_type()); + + case axis_attribute: + return step_do(c, stack, eval, axis_to_type()); + + case axis_child: + return step_do(c, stack, eval, axis_to_type()); + + case axis_descendant: + return step_do(c, stack, eval, axis_to_type()); + + case axis_descendant_or_self: + return step_do(c, stack, eval, axis_to_type()); + + case axis_following: + return step_do(c, stack, eval, axis_to_type()); + + case axis_following_sibling: + return step_do(c, stack, eval, axis_to_type()); + + 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()); + + case axis_preceding: + return step_do(c, stack, eval, axis_to_type()); + + case axis_preceding_sibling: + return step_do(c, stack, eval, axis_to_type()); + + case axis_self: + return step_do(c, stack, eval, axis_to_type()); + + 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 + + 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(_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(value.end - value.begin); + + char_t* c = static_cast(_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(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(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(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(this)->name; + + case xpath_type_number: + return static_cast(this)->name; + + case xpath_type_string: + return static_cast(this)->name; + + case xpath_type_boolean: + return static_cast(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(this)->value : false; + } + + PUGI__FN double xpath_variable::get_number() const + { + return (_type == xpath_type_number) ? static_cast(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(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(this)->value : impl::dummy_node_set; + } + + PUGI__FN bool xpath_variable::set(bool value) + { + if (_type != xpath_type_boolean) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN bool xpath_variable::set(double value) + { + if (_type != xpath_type_number) return false; + + static_cast(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(this); + + // duplicate string + size_t size = (impl::strlength(value) + 1) * sizeof(char_t); + + char_t* copy = static_cast(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(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_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)->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)->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)->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), 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), 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)); + 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)); + 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. + */ + +#pragma GCC diagnostic pop diff --git a/src/pugixml/pugixml.hpp b/src/pugixml/pugixml.hpp new file mode 100644 index 0000000..d4d5a62 --- /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@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@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 + +// Include exception header for XPath +#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) +# include +#endif + +// Include STL headers +#ifndef PUGIXML_NO_STL +# include +# include +# include +#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, std::allocator > 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_pcdata, // Plain character data, i.e. 'text' + node_cdata, // Character data, i.e. '' + node_comment, // Comment tag, i.e. '' + node_pi, // Processing instruction, i.e. '' + node_declaration, // Document declaration, i.e. '' + node_doctype // Document type declaration, i.e. '' + }; + + // 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 < / 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 >& stream); + xml_writer_stream(std::basic_ostream >& stream); + + virtual void write(const void* data, size_t size); + + private: + std::basic_ostream >* narrow_stream; + std::basic_ostream >* 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 text 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 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 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 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 >& 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 >& 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 children() const; + xml_object_range children(const char_t* name) const; + xml_object_range 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 >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load(std::basic_istream >& 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 >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + void save(std::basic_ostream >& 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, std::allocator > PUGIXML_FUNCTION as_utf8(const wchar_t* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const std::basic_string, std::allocator >& str); + + // Convert UTF8 to wide string + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const char* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const std::basic_string, std::allocator >& 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/vcf/VcfFile.cpp b/src/vcf/VcfFile.cpp new file mode 100644 index 0000000..2acb65d --- /dev/null +++ b/src/vcf/VcfFile.cpp @@ -0,0 +1,30 @@ +#include "PbbamInternalConfig.h" + +#include "pbbam/vcf/VcfFile.h" + +#include "pbbam/vcf/VcfFormat.h" + +namespace PacBio { +namespace VCF { + +VcfFile::VcfFile(std::string fn) + : filename_{std::move(fn)}, header_{VcfFormat::HeaderFromFile(filename_)} +{ +} + +VcfFile::VcfFile(const VcfFile&) = default; + +VcfFile::VcfFile(VcfFile&&) = default; + +VcfFile& VcfFile::operator=(const VcfFile&) = default; + +VcfFile& VcfFile::operator=(VcfFile&&) = default; + +VcfFile::~VcfFile() = default; + +const std::string& VcfFile::Filename() const { return filename_; } + +const VcfHeader& VcfFile::Header() const { return header_; } + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfFormat.cpp b/src/vcf/VcfFormat.cpp new file mode 100644 index 0000000..f39c619 --- /dev/null +++ b/src/vcf/VcfFormat.cpp @@ -0,0 +1,549 @@ +// Author: Derek Barnett + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace PacBio { +namespace VCF { + +namespace { // anonymous + +// using htslib's current version for better compatibility +static constexpr const char current_version[] = "VCFv4.2"; + +namespace Tokens { + +static constexpr const char file_format[] = "fileformat"; + +static constexpr const char double_hash[] = "##"; +static constexpr const char contig_lead[] = "##contig=<"; +static constexpr const char filter_lead[] = "##FILTER=<"; +static constexpr const char format_lead[] = "##FORMAT=<"; +static constexpr const char info_lead[] = "##INFO=<"; +static constexpr const char chrom_lead[] = "#CHROM"; + +static constexpr const char id[] = "ID"; +static constexpr const char number[] = "Number"; +static constexpr const char type[] = "Type"; +static constexpr const char description[] = "Description"; +static constexpr const char source[] = "Source"; +static constexpr const char version[] = "Version"; + +} // namespace Tokens + +std::string QuotedText(const std::string& d) { return "\"" + d + "\""; } + +std::string UnquotedText(const std::string& d) +{ + if (d.size() < 2 || d.front() != '"' || d.back() != '"') + throw std::runtime_error{"VcfFormat: description text is not quoted: " + d}; + return d.substr(1, d.size() - 2); +} + +} // namespace anonymous + +const char* VcfFormat::CurrentVersion() { return current_version; } + +std::string VcfFormat::FormattedContigDefinition(const ContigDefinition& def) +{ + std::ostringstream text; + + // ID + text << Tokens::contig_lead << Tokens::id << '=' << def.Id(); + + // attributes + if (!def.Attributes().empty()) { + text << ','; + bool first = true; + for (const auto& attr : def.Attributes()) { + if (!first) text << ','; + text << attr.first << '=' << attr.second; + first = false; + } + } + text << '>'; + return text.str(); +} + +std::string VcfFormat::FormattedFilterDefinition(const FilterDefinition& def) +{ + std::ostringstream text; + text << Tokens::filter_lead << Tokens::id << '=' << def.Id() << ',' << Tokens::description + << '=' << QuotedText(def.Description()) << '>'; + return text.str(); +} + +std::string VcfFormat::FormattedFormatDefinition(const FormatDefinition& def) +{ + std::ostringstream text; + text << Tokens::format_lead << Tokens::id << '=' << def.Id() << ',' << Tokens::number << '=' + << def.Number() << ',' << Tokens::type << '=' << def.Type() << ',' << Tokens::description + << '=' << QuotedText(def.Description()) << '>'; + return text.str(); +} + +std::string VcfFormat::FormattedGeneralDefinition(const GeneralDefinition& def) +{ + std::ostringstream text; + text << Tokens::double_hash << def.Id() << '=' << def.Text(); + return text.str(); +} + +std::string VcfFormat::FormattedInfoDefinition(const InfoDefinition& def) +{ + std::ostringstream text; + text << Tokens::info_lead << Tokens::id << '=' << def.Id() << ',' << Tokens::number << '=' + << def.Number() << ',' << Tokens::type << '=' << def.Type() << ',' << Tokens::description + << '=' << QuotedText(def.Description()); + + if (def.Source().is_initialized() && !def.Source().get().empty()) + text << ',' << Tokens::source << '=' << QuotedText(def.Source().get()); + + if (def.Version().is_initialized() && !def.Version().get().empty()) + text << ',' << Tokens::version << '=' << QuotedText(def.Version().get()); + + text << '>'; + return text.str(); +} + +std::string VcfFormat::FormattedHeader(const VcfHeader& header) +{ + std::ostringstream out; + + const auto& fileformat = header.GeneralDefinition(Tokens::file_format); + out << FormattedGeneralDefinition(fileformat) << '\n'; + + // remaining general definiitions + for (const auto& def : header.GeneralDefinitions()) { + if (def.Id() != Tokens::file_format) out << FormattedGeneralDefinition(def) << '\n'; + } + + // ##contig + for (const auto& contig : header.ContigDefinitions()) + out << FormattedContigDefinition(contig) << '\n'; + + // ##FILTER + for (const auto& filter : header.FilterDefinitions()) + out << FormattedFilterDefinition(filter) << '\n'; + + // ##INFO + for (const auto& info : header.InfoDefinitions()) + out << FormattedInfoDefinition(info) << '\n'; + + // ##FORMAT + for (const auto& format : header.FormatDefinitions()) + out << FormattedFormatDefinition(format) << '\n'; + + // fixed headers + out << "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO"; + + // samples + const auto& samples = header.Samples(); + if (!samples.empty()) { + out << "\tFORMAT"; + for (const auto& sample : samples) + out << '\t' << sample; + } + + return out.str(); +} + +ContigDefinition VcfFormat::ParsedContigDefinition(std::string line) +{ + // should already be checked by "normal" code path + assert(line.find(Tokens::contig_lead) == 0); + + // substring between brackets + const auto lastBracketPos = line.find_last_of('>'); + if (lastBracketPos == std::string::npos) + throw std::runtime_error{"VcfFormat: malformed ##contig line: " + line}; + line = std::string(line.cbegin() + 10, line.cbegin() + lastBracketPos); + + std::string id; + std::vector> attributes; + + const auto fields = PacBio::BAM::Split(line, ','); + for (const auto& field : fields) { + const auto tokens = PacBio::BAM::Split(field, '='); + if (tokens.size() != 2) { + throw std::runtime_error{"VcfFormat: malformed ##contig line: " + line}; + } + if (tokens[0] == Tokens::id) + id = tokens[1]; + else + attributes.push_back(std::make_pair(tokens[0], tokens[1])); + } + + return ContigDefinition{std::move(id), std::move(attributes)}; +} + +FilterDefinition VcfFormat::ParsedFilterDefinition(std::string line) +{ + // should already be checked by "normal" code path + assert(line.find(Tokens::filter_lead) == 0); + + // substring between brackets + const auto lastBracketPos = line.find_last_of('>'); + if (lastBracketPos == std::string::npos) + throw std::runtime_error{"VcfFormat: malformed FILTER line: " + line}; + line = std::string(line.cbegin() + 10, line.cbegin() + lastBracketPos); + + std::string id; + std::string description; + + const auto fields = PacBio::BAM::Split(line, ','); + for (const auto& field : fields) { + const auto tokens = PacBio::BAM::Split(field, '='); + if (tokens.size() != 2) { + throw std::runtime_error{"VcfFormat: malformed FILTER line: " + line}; + } + if (tokens[0] == Tokens::id) + id = tokens[1]; + else if (tokens[0] == Tokens::description) { + description = UnquotedText(tokens[1]); + } else + throw std::runtime_error{"VcfFormat: unrecognized FILTER field: " + tokens[0]}; + } + + return FilterDefinition{std::move(id), std::move(description)}; +} + +FormatDefinition VcfFormat::ParsedFormatDefinition(std::string line) +{ + // should already be checked by "normal" code path + assert(line.find(Tokens::format_lead) == 0); + + // substring between brackets + const auto lastBracketPos = line.find_last_of('>'); + if (lastBracketPos == std::string::npos) + throw std::runtime_error{"VcfFormat: malformed FORMAT line: " + line}; + line = std::string(line.cbegin() + 10, line.cbegin() + lastBracketPos); + + std::string id; + std::string number; + std::string type; + std::string description; + + const auto fields = PacBio::BAM::Split(line, ','); + for (const auto& field : fields) { + const auto tokens = PacBio::BAM::Split(field, '='); + if (tokens.size() != 2) { + throw std::runtime_error{"VcfFormat: malformed FORMAT line: " + line}; + } + if (tokens[0] == Tokens::id) + id = tokens[1]; + else if (tokens[0] == Tokens::number) + number = tokens[1]; + else if (tokens[0] == Tokens::type) + type = tokens[1]; + else if (tokens[0] == Tokens::description) { + description = UnquotedText(tokens[1]); + } else + throw std::runtime_error{"VcfFormat: unrecognized FORMAT field: " + tokens[0]}; + } + + return FormatDefinition{std::move(id), std::move(number), std::move(type), + std::move(description)}; +} + +GeneralDefinition VcfFormat::ParsedGeneralDefinition(const std::string& line) +{ + const auto tokens = PacBio::BAM::Split(line, '='); + if (tokens.size() != 2 || tokens[0].find(Tokens::double_hash) != 0) { + throw std::runtime_error{"VcfFormat: malformed header line: " + line}; + } + + return GeneralDefinition{tokens[0].substr(2), tokens[1]}; +} + +InfoDefinition VcfFormat::ParsedInfoDefinition(std::string line) +{ + // should already be checked by "normal" code path + assert(line.find(Tokens::info_lead) == 0); + + // substring between brackets + const auto lastBracketPos = line.find_last_of('>'); + if (lastBracketPos == std::string::npos) + throw std::runtime_error{"VcfFormat: malformed INFO line: " + line}; + line = std::string(line.cbegin() + 8, line.cbegin() + lastBracketPos); + + std::string id; + std::string number; + std::string type; + std::string description; + std::string source; + std::string version; + + const auto fields = PacBio::BAM::Split(line, ','); + for (const auto& field : fields) { + const auto tokens = PacBio::BAM::Split(field, '='); + if (tokens.size() != 2) { + throw std::runtime_error{"VcfFormat: malformed INFO line: " + line}; + } + if (tokens[0] == Tokens::id) + id = tokens[1]; + else if (tokens[0] == Tokens::number) + number = tokens[1]; + else if (tokens[0] == Tokens::type) + type = tokens[1]; + else if (tokens[0] == Tokens::description) { + description = UnquotedText(tokens[1]); + } else if (tokens[0] == Tokens::source) { + source = UnquotedText(tokens[1]); + } else if (tokens[0] == Tokens::version) { + version = UnquotedText(tokens[1]); + } else + throw std::runtime_error{"VcfFormat: unrecognized INFO field: " + tokens[0]}; + } + + return InfoDefinition{std::move(id), std::move(number), std::move(type), + std::move(description), std::move(source), std::move(version)}; +} + +VcfHeader VcfFormat::ParsedHeader(const std::string& hdrText) +{ + VcfHeader hdr; + + std::istringstream text{hdrText}; + std::string line; + + // quick check for fileformat - should be the first line + std::getline(text, line); + { + auto genDef = ParsedGeneralDefinition(line); + if (genDef.Id() != Tokens::file_format) + throw std::runtime_error{"VcfFormat: file must begin with #fileformat line"}; + hdr.AddGeneralDefinition(std::move(genDef)); + } + + // read through rest of header + bool chromLineFound = false; + for (; std::getline(text, line);) { + if (line.empty()) continue; + + // info line + if (line.find(Tokens::info_lead) == 0) hdr.AddInfoDefinition(ParsedInfoDefinition(line)); + + // filter line + else if (line.find(Tokens::filter_lead) == 0) + hdr.AddFilterDefinition(ParsedFilterDefinition(line)); + + // format line + else if (line.find(Tokens::format_lead) == 0) + hdr.AddFormatDefinition(ParsedFormatDefinition(line)); + + // contig line + else if (line.find(Tokens::contig_lead) == 0) + hdr.AddContigDefinition(ParsedContigDefinition(line)); + + // general comment line + // + // NOTE: Check this after all other specific header line types. This + // catches all remaining lines starting with "##" + // + else if (line.find(Tokens::double_hash) == 0) + hdr.AddGeneralDefinition(ParsedGeneralDefinition(line)); + + // CHROM line (maybe w/ samples) + else if (line.find(Tokens::chrom_lead) == 0) { + std::vector samples; + + // If samples are present, skip the fixed colums & FORMAT column (9) + // and read the remaining column labels as sample names. + // + auto columns = PacBio::BAM::Split(line, '\t'); + for (size_t i = 9; i < columns.size(); ++i) + samples.push_back(std::move(columns[i])); + hdr.Samples(std::move(samples)); + + // quit header parsing after CHROM line + chromLineFound = true; + break; + } else + throw std::runtime_error{"VcfFormat: unexpected line found in header:\n" + line}; + } + + if (!chromLineFound) throw std::runtime_error{"VcfFormat: CHROM column line is missing"}; + + return hdr; +} + +VcfHeader VcfFormat::HeaderFromFile(const std::string& fn) +{ + std::ifstream in(fn); + return HeaderFromStream(in); +} + +VcfHeader VcfFormat::HeaderFromStream(std::istream& in) +{ + std::stringstream text; + + std::string line; + while (std::getline(in, line)) { + if (line.empty()) continue; + if (line.front() == '#') + text << line << '\n'; + else + break; + } + + return ParsedHeader(text.str()); +} + +InfoField VcfFormat::ParsedInfoField(const std::string& text) +{ + const auto& tokens = PacBio::BAM::Split(text, '='); + if (tokens.empty()) throw std::runtime_error{"VcfFormat: malformed INFO field: " + text}; + + // required ID + InfoField result; + result.id = tokens.at(0); + if (tokens.size() == 1) return result; + + // optional value or values + const auto& valueStr = tokens.at(1); + const auto commaFound = valueStr.find(','); + if (commaFound != std::string::npos) { + std::vector values; + for (auto&& value : PacBio::BAM::Split(valueStr, ',')) + values.push_back(std::move(value)); + result.values = std::move(values); + } else + result.value = valueStr; + + return result; +} + +std::vector VcfFormat::ParsedInfoFields(const std::string& text) +{ + std::vector result; + const auto& fields = PacBio::BAM::Split(text, ';'); + for (const auto& field : fields) + result.push_back(ParsedInfoField(field)); + return result; +} + +GenotypeField VcfFormat::ParsedGenotypeField(const std::string& field) +{ + GenotypeField result; + const auto fieldValues = PacBio::BAM::Split(field, ':'); + for (const auto& fieldValue : fieldValues) { + GenotypeData data; + const auto genotypeDataValues = PacBio::BAM::Split(fieldValue, ','); + if (genotypeDataValues.size() == 1) + data.value = genotypeDataValues.at(0); + else + data.values = genotypeDataValues; + result.data.push_back(std::move(data)); + } + return result; +} + +VcfVariant VcfFormat::ParsedVariant(const std::string& line) +{ + const auto fields = PacBio::BAM::Split(line, '\t'); + if (fields.size() < 7) + throw std::runtime_error{"VcfFormat: record is missing required fields: " + line}; + + // CHROM POS ID REF ALT REF + auto chrom = fields.at(0); + auto pos = std::stoi(fields.at(1)); + auto id = fields.at(2); + auto ref = fields.at(3); + auto alt = fields.at(4); + + VcfVariant var{std::move(id), std::move(chrom), std::move(pos), std::move(ref), std::move(alt)}; + + // QUAL + const auto& qualStr = fields.at(5); + const float qual = (qualStr == "." ? NAN : stof(qualStr)); + var.Quality(qual); + + // FILTER + auto filter = fields.at(6); + var.Filter(std::move(filter)); + + // INFO (allow empty) + if (fields.size() >= 8) var.InfoFields(ParsedInfoFields(fields.at(7))); + + // GENOTYPE (samples) + if (fields.size() > 9) { + var.GenotypeIds(PacBio::BAM::Split(fields.at(8), ':')); + + std::vector genotypes; + for (size_t i = 9; i < fields.size(); ++i) + genotypes.emplace_back(ParsedGenotypeField(fields.at(i))); + var.Genotypes(std::move(genotypes)); + } + + return var; +} + +std::string VcfFormat::FormattedInfoField(const InfoField& field) +{ + std::ostringstream out; + out << field.id; + if (field.value.is_initialized()) + out << '=' << field.value.get(); + else if (field.values.is_initialized()) + out << '=' << PacBio::BAM::Join(field.values.get(), ','); + return out.str(); +} + +std::string VcfFormat::FormattedInfoFields(const std::vector& fields) +{ + std::vector result; + for (const auto& field : fields) + result.push_back(FormattedInfoField(field)); + return PacBio::BAM::Join(result, ';'); +} + +std::string VcfFormat::FormattedGenotypeField(const GenotypeField& field) +{ + std::string result; + bool firstDataEntry = true; + for (const auto& d : field.data) { + if (!firstDataEntry) result += ':'; + if (d.value.is_initialized()) + result += d.value.get(); + else { + assert(d.values.is_initialized()); + result += PacBio::BAM::Join(d.values.get(), ','); + } + firstDataEntry = false; + } + return result; +} + +std::string VcfFormat::FormattedVariant(const VcfVariant& var) +{ + std::ostringstream out; + out << var.Chrom() << '\t' << var.Position() << '\t' << var.Id() << '\t' << var.RefAllele() + << '\t' << var.AltAllele() << '\t' + << (var.IsQualityMissing() ? "." : std::to_string(var.Quality())) << '\t' << var.Filter() + << '\t' << FormattedInfoFields(var.InfoFields()); + + const auto& genotypeIds = var.GenotypeIds(); + if (!genotypeIds.empty()) { + out << '\t' << PacBio::BAM::Join(genotypeIds, ':'); + const auto& genotypes = var.Genotypes(); + for (const auto& genotype : genotypes) + out << '\t' << FormattedGenotypeField(genotype); + } + return out.str(); +} + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfHeader.cpp b/src/vcf/VcfHeader.cpp new file mode 100644 index 0000000..bfb6d7d --- /dev/null +++ b/src/vcf/VcfHeader.cpp @@ -0,0 +1,229 @@ +// Author: Derek Barnett + +#include + +#include + +namespace PacBio { +namespace VCF { + +VcfHeader::VcfHeader() { Version(VcfFormat::CurrentVersion()); } + +VcfHeader::VcfHeader(const std::string& hdrText) { *this = VcfFormat::ParsedHeader(hdrText); } + +VcfHeader::VcfHeader(const VcfHeader&) = default; + +VcfHeader::VcfHeader(VcfHeader&&) = default; + +VcfHeader& VcfHeader::operator=(const VcfHeader&) = default; + +VcfHeader& VcfHeader::operator=(VcfHeader&&) = default; + +VcfHeader::~VcfHeader() = default; + +VcfHeader& VcfHeader::AddContigDefinition(PacBio::VCF::ContigDefinition contig) +{ + const auto found = contigLookup_.find(contig.Id()); + if (found == contigLookup_.cend()) { + contigLookup_.insert({contig.Id(), contigDefinitions_.size()}); + contigDefinitions_.push_back(std::move(contig)); + } else + contigDefinitions_.at(found->second) = std::move(contig); + return *this; +} + +VcfHeader& VcfHeader::AddFilterDefinition(PacBio::VCF::FilterDefinition filter) +{ + const auto found = filterLookup_.find(filter.Id()); + if (found == filterLookup_.cend()) { + filterLookup_.insert({filter.Id(), filterDefinitions_.size()}); + filterDefinitions_.push_back(std::move(filter)); + } else + filterDefinitions_.at(found->second) = std::move(filter); + return *this; +} + +VcfHeader& VcfHeader::AddFormatDefinition(PacBio::VCF::FormatDefinition format) +{ + const auto found = formatLookup_.find(format.Id()); + if (found == formatLookup_.cend()) { + formatLookup_.insert({format.Id(), formatDefinitions_.size()}); + formatDefinitions_.push_back(std::move(format)); + } else + formatDefinitions_.at(found->second) = std::move(format); + return *this; +} + +VcfHeader& VcfHeader::AddGeneralDefinition(PacBio::VCF::GeneralDefinition def) +{ + const auto found = generalLookup_.find(def.Id()); + if (found == generalLookup_.cend()) { + generalLookup_.insert({def.Id(), generalDefinitions_.size()}); + generalDefinitions_.push_back(std::move(def)); + } else + generalDefinitions_.at(found->second) = std::move(def); + return *this; +} + +VcfHeader& VcfHeader::AddInfoDefinition(PacBio::VCF::InfoDefinition info) +{ + const auto found = infoLookup_.find(info.Id()); + if (found == infoLookup_.cend()) { + infoLookup_.insert({info.Id(), infoDefinitions_.size()}); + infoDefinitions_.push_back(std::move(info)); + } else + infoDefinitions_.at(found->second) = std::move(info); + return *this; +} + +VcfHeader& VcfHeader::AddSample(std::string sample) +{ + const auto found = sampleLookup_.find(sample); + if (found == sampleLookup_.cend()) { + sampleLookup_.insert({sample, samples_.size()}); + samples_.push_back(std::move(sample)); + } else + samples_.at(found->second) = std::move(sample); + return *this; +} + +const std::vector& VcfHeader::ContigDefinitions() const +{ + return contigDefinitions_; +} + +const PacBio::VCF::ContigDefinition& VcfHeader::ContigDefinition(const std::string& id) const +{ + return contigDefinitions_.at(contigLookup_.at(id)); +} + +VcfHeader& VcfHeader::ContigDefinitions(std::vector defs) +{ + contigDefinitions_.clear(); + contigLookup_.clear(); + for (auto&& def : defs) + AddContigDefinition(std::move(def)); + return *this; +} + +const std::string& VcfHeader::FileDate() const +{ + return generalDefinitions_.at(generalLookup_.at("fileDate")).Text(); +} + +VcfHeader& VcfHeader::FileDate(std::string fileDate) +{ + AddGeneralDefinition({"fileDate", std::move(fileDate)}); + return *this; +} + +const std::vector& VcfHeader::FilterDefinitions() const +{ + return filterDefinitions_; +} + +const PacBio::VCF::FilterDefinition& VcfHeader::FilterDefinition(const std::string& id) const +{ + return filterDefinitions_.at(filterLookup_.at(id)); +} + +VcfHeader& VcfHeader::FilterDefinitions(std::vector defs) +{ + filterDefinitions_.clear(); + filterLookup_.clear(); + for (auto&& def : defs) + AddFilterDefinition(std::move(def)); + return *this; +} + +const std::vector& VcfHeader::FormatDefinitions() const +{ + return formatDefinitions_; +} + +const PacBio::VCF::FormatDefinition& VcfHeader::FormatDefinition(const std::string& id) const +{ + return formatDefinitions_.at(formatLookup_.at(id)); +} + +VcfHeader& VcfHeader::FormatDefinitions(std::vector defs) +{ + formatDefinitions_.clear(); + formatLookup_.clear(); + for (auto&& def : defs) + AddFormatDefinition(std::move(def)); + return *this; +} + +const std::vector& VcfHeader::GeneralDefinitions() const +{ + return generalDefinitions_; +} + +const PacBio::VCF::GeneralDefinition& VcfHeader::GeneralDefinition(const std::string& id) const +{ + return generalDefinitions_.at(generalLookup_.at(id)); +} + +VcfHeader& VcfHeader::GeneralDefinitions(std::vector defs) +{ + generalDefinitions_.clear(); + generalLookup_.clear(); + for (auto&& def : defs) + AddGeneralDefinition(std::move(def)); + return *this; +} + +const std::vector& VcfHeader::InfoDefinitions() const +{ + return infoDefinitions_; +} +const PacBio::VCF::InfoDefinition& VcfHeader::InfoDefinition(const std::string& id) const +{ + return infoDefinitions_.at(infoLookup_.at(id)); +} + +VcfHeader& VcfHeader::InfoDefinitions(std::vector defs) +{ + infoDefinitions_.clear(); + infoLookup_.clear(); + for (auto&& def : defs) + AddInfoDefinition(std::move(def)); + return *this; +} + +size_t VcfHeader::NumLines() const +{ + // +1 for #CHROM line + return generalDefinitions_.size() + contigDefinitions_.size() + infoDefinitions_.size() + + filterDefinitions_.size() + formatDefinitions_.size() + 1; +} + +const Sample& VcfHeader::SampleAt(size_t index) const { return samples_.at(index); } + +size_t VcfHeader::IndexOfSample(const Sample& sample) const { return sampleLookup_.at(sample); } + +const std::vector& VcfHeader::Samples() const { return samples_; } + +VcfHeader& VcfHeader::Samples(std::vector names) +{ + samples_.clear(); + sampleLookup_.clear(); + for (auto&& name : names) + AddSample(std::move(name)); + return *this; +} + +const std::string& VcfHeader::Version() const +{ + return generalDefinitions_.at(generalLookup_.at("fileformat")).Text(); +} + +VcfHeader& VcfHeader::Version(std::string version) +{ + AddGeneralDefinition({"fileformat", std::move(version)}); + return *this; +} + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfHeaderTypes.cpp b/src/vcf/VcfHeaderTypes.cpp new file mode 100644 index 0000000..b0402be --- /dev/null +++ b/src/vcf/VcfHeaderTypes.cpp @@ -0,0 +1,224 @@ + +#include + +#include "pbbam/vcf/VcfHeaderTypes.h" + +namespace PacBio { +namespace VCF { + +// ------------------- +// ContigDefinition +// ------------------- + +ContigDefinition::ContigDefinition(std::string id) : ContigDefinition(std::move(id), {}) {} + +ContigDefinition::ContigDefinition(std::string id, + std::vector> attributes) + : id_{std::move(id)}, attributes_{std::move(attributes)} +{ + if (id_.empty()) + throw std::runtime_error{"VcfFormat: ##contig definition in header has empty ID field"}; +} + +ContigDefinition::ContigDefinition(const ContigDefinition&) = default; + +ContigDefinition::ContigDefinition(ContigDefinition&&) = default; + +ContigDefinition& ContigDefinition::operator=(const ContigDefinition&) = default; + +ContigDefinition& ContigDefinition::operator=(ContigDefinition&&) = default; + +ContigDefinition::~ContigDefinition() = default; + +ContigDefinition& ContigDefinition::AddAttribute(std::string id, std::string value) +{ + return AddAttribute(std::make_pair(std::move(id), std::move(value))); +} + +ContigDefinition& ContigDefinition::AddAttribute(std::pair attribute) +{ + attributes_.push_back(std::move(attribute)); + return *this; +} + +const std::vector>& ContigDefinition::Attributes() const +{ + return attributes_; +} + +ContigDefinition& ContigDefinition::Attributes( + std::vector> attributes) +{ + attributes_ = std::move(attributes); + return *this; +} + +const std::string& ContigDefinition::Id() const { return id_; } + +// ------------------- +// FilterDefinition +// ------------------- + +FilterDefinition::FilterDefinition(std::string id, std::string description) + : id_{std::move(id)}, description_{std::move(description)} +{ + if (id_.empty()) + throw std::runtime_error{"VcfFormat: FILTER definition in header has empty ID field"}; + + if (description_.empty()) + throw std::runtime_error{ + "VcfFormat: FILTER definition in header has empty Description field"}; +} + +FilterDefinition::FilterDefinition(const FilterDefinition&) = default; + +FilterDefinition::FilterDefinition(FilterDefinition&&) = default; + +FilterDefinition& FilterDefinition::operator=(const FilterDefinition&) = default; + +FilterDefinition& FilterDefinition::operator=(FilterDefinition&&) = default; + +FilterDefinition::~FilterDefinition() = default; + +const std::string& FilterDefinition::Description() const { return description_; } + +const std::string& FilterDefinition::Id() const { return id_; } + +// ------------------- +// FormatDefinition +// ------------------- + +FormatDefinition::FormatDefinition(std::string id, std::string number, std::string type, + std::string description) + : id_{std::move(id)} + , number_{std::move(number)} + , type_{std::move(type)} + , description_{std::move(description)} +{ + if (id_.empty()) + throw std::runtime_error{"VcfFormat: FORMAT definition in header has empty ID field"}; + + if (number_.empty()) + throw std::runtime_error{"VcfFormat: FORMAT definition in header has empty Number field"}; + + if (type_.empty()) + throw std::runtime_error{"VcfFormat: FORMAT definition in header has empty Type field"}; + + if (description_.empty()) + throw std::runtime_error{ + "VcfFormat: FORMAT definition in header has empty Description field"}; +} + +FormatDefinition::FormatDefinition(const FormatDefinition&) = default; + +FormatDefinition::FormatDefinition(FormatDefinition&&) = default; + +FormatDefinition& FormatDefinition::operator=(const FormatDefinition&) = default; + +FormatDefinition& FormatDefinition::operator=(FormatDefinition&&) = default; + +FormatDefinition::~FormatDefinition() = default; + +const std::string& FormatDefinition::Description() const { return description_; } + +const std::string& FormatDefinition::Id() const { return id_; } + +const std::string& FormatDefinition::Number() const { return number_; } + +const std::string& FormatDefinition::Type() const { return type_; } + +// ------------------- +// GeneralDefinition +// ------------------- + +GeneralDefinition::GeneralDefinition(std::string id, std::string text) + : id_{std::move(id)}, text_{std::move(text)} +{ + if (id_.empty()) + throw std::runtime_error{ + "VcfFormat: general metadata definition in header has empty label"}; + + if (text_.empty()) + throw std::runtime_error{ + "VcfFormat: general metadata definition in header has empty value"}; +} + +GeneralDefinition::GeneralDefinition(const GeneralDefinition&) = default; + +GeneralDefinition::GeneralDefinition(GeneralDefinition&&) = default; + +GeneralDefinition& GeneralDefinition::operator=(const GeneralDefinition&) = default; + +GeneralDefinition& GeneralDefinition::operator=(GeneralDefinition&&) = default; + +GeneralDefinition::~GeneralDefinition() = default; + +const std::string& GeneralDefinition::Id() const { return id_; } + +const std::string& GeneralDefinition::Text() const { return text_; } + +// ------------------- +// InfoDefinition +// ------------------- + +InfoDefinition::InfoDefinition(std::string id, std::string number, std::string type, + std::string description, std::string source, std::string version) + : id_{std::move(id)} + , number_{std::move(number)} + , type_{std::move(type)} + , description_{std::move(description)} +{ + // verify required fields + if (id_.empty()) + throw std::runtime_error{"VcfFormat: INFO definition in header has empty ID field"}; + + if (number_.empty()) + throw std::runtime_error{"VcfFormat: INFO definition in header has empty Number field"}; + + if (type_.empty()) + throw std::runtime_error{"VcfFormat: INFO definition in header has empty Type field"}; + + if (description_.empty()) + throw std::runtime_error{ + "VcfFormat: INFO definition in header has empty Description field"}; + + if (!source.empty()) source_ = std::move(source); + if (!version.empty()) version_ = std::move(version); +} + +InfoDefinition::InfoDefinition(const InfoDefinition&) = default; + +InfoDefinition::InfoDefinition(InfoDefinition&&) = default; + +InfoDefinition& InfoDefinition::operator=(const InfoDefinition&) = default; + +InfoDefinition& InfoDefinition::operator=(InfoDefinition&&) = default; + +InfoDefinition::~InfoDefinition() = default; + +const std::string& InfoDefinition::Description() const { return description_; } + +const std::string& InfoDefinition::Id() const { return id_; } + +const std::string& InfoDefinition::Number() const { return number_; } + +const boost::optional& InfoDefinition::Source() const { return source_; } + +InfoDefinition& InfoDefinition::Source(std::string s) +{ + source_ = std::move(s); + return *this; +} + +const std::string& InfoDefinition::Type() const { return type_; } + +const boost::optional& InfoDefinition::Version() const { return version_; } + +InfoDefinition& InfoDefinition::Version(std::string v) +{ + version_ = std::move(v); + return *this; +} + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfQuery.cpp b/src/vcf/VcfQuery.cpp new file mode 100644 index 0000000..fbcd26e --- /dev/null +++ b/src/vcf/VcfQuery.cpp @@ -0,0 +1,18 @@ +#include + +namespace PacBio { +namespace VCF { + +VcfQuery::VcfQuery(std::string fn) : VcfQuery{VcfFile{std::move(fn)}} {} + +VcfQuery::VcfQuery(const VcfFile& file) + : PacBio::BAM::internal::QueryBase(), reader_{file} +{ +} + +VcfQuery::~VcfQuery() = default; + +bool VcfQuery::GetNext(VcfVariant& var) { return reader_.GetNext(var); } + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfReader.cpp b/src/vcf/VcfReader.cpp new file mode 100644 index 0000000..b415856 --- /dev/null +++ b/src/vcf/VcfReader.cpp @@ -0,0 +1,40 @@ +// Author: Derek Barnett + +#include + +namespace PacBio { +namespace VCF { + +VcfReader::VcfReader(std::string fn) : VcfReader{VcfFile{std::move(fn)}} {} + +VcfReader::VcfReader(const VcfFile& file) : in_{file.Filename()}, header_{file.Header()} +{ + // skip header lines + const auto& header = file.Header(); + std::string line; + for (size_t i = header.NumLines(); i > 0; --i) + std::getline(in_, line); + + FetchNext(); +} + +VcfReader::~VcfReader() = default; + +void VcfReader::FetchNext() +{ + line_.clear(); + std::getline(in_, line_); +} + +bool VcfReader::GetNext(VcfVariant& var) +{ + if (line_.empty()) return false; + var = VcfVariant{line_}; + FetchNext(); + return true; +} + +const VcfHeader& VcfReader::Header() const { return header_; } + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfSort.cpp b/src/vcf/VcfSort.cpp new file mode 100644 index 0000000..b1fff9d --- /dev/null +++ b/src/vcf/VcfSort.cpp @@ -0,0 +1,56 @@ +// Author: Derek Barnett + +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace PacBio { +namespace VCF { + +void SortFile(const VcfFile& file, const std::string& outputFilename) +{ + const auto& header = file.Header(); + + // configure contig sort order + std::unordered_map contigLookup; + const auto& contigDefs = header.ContigDefinitions(); + for (size_t i = 0; i < contigDefs.size(); ++i) { + const auto& contigId = contigDefs.at(i).Id(); + contigLookup.insert(std::make_pair(contigId, i)); + } + + // read & sort variants + std::vector variants; + VcfQuery query{file}; + for (const auto& v : query) + variants.push_back(v); + + std::sort(variants.begin(), variants.end(), + [&contigLookup](const VcfVariant& lhs, const VcfVariant& rhs) { + const auto lhsIdx = contigLookup.at(lhs.Chrom()); + const auto rhsIdx = contigLookup.at(rhs.Chrom()); + const auto lhsPos = lhs.Position(); + const auto rhsPos = rhs.Position(); + return std::tie(lhsIdx, lhsPos) < std::tie(rhsIdx, rhsPos); + }); + + // write results to file + VcfWriter writer{outputFilename, header}; + for (const auto& var : variants) + writer.Write(var); +} + +void SortFile(const std::string& inputFilename, const std::string& outputFilename) +{ + SortFile(VcfFile{inputFilename}, outputFilename); +} + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfVariant.cpp b/src/vcf/VcfVariant.cpp new file mode 100644 index 0000000..f9e1ed6 --- /dev/null +++ b/src/vcf/VcfVariant.cpp @@ -0,0 +1,253 @@ +// Author: Derek Barnett + +#include + +#include + +#include +#include + +namespace PacBio { +namespace VCF { + +VcfVariant::VcfVariant(const std::string& text) { *this = VcfFormat::ParsedVariant(text); } + +VcfVariant::VcfVariant() : pos_{PacBio::BAM::UnmappedPosition}, qual_{NAN}, filter_{"PASS"} {} + +VcfVariant::VcfVariant(std::string id, std::string chrom, PacBio::BAM::Position pos, + std::string refAllele, std::string altAllele) + : chrom_{std::move(chrom)} + , pos_{pos} + , id_{std::move(id)} + , refAllele_{std::move(refAllele)} + , altAllele_{std::move(altAllele)} + , qual_{NAN} + , filter_{"PASS"} +{ +} + +VcfVariant::VcfVariant(const VcfVariant&) = default; + +VcfVariant::VcfVariant(VcfVariant&&) = default; + +VcfVariant& VcfVariant::operator=(const VcfVariant&) = default; + +VcfVariant& VcfVariant::operator=(VcfVariant&&) = default; + +VcfVariant::~VcfVariant() = default; + +VcfVariant& VcfVariant::AddInfoField(InfoField field) +{ + const auto found = infoLookup_.find(field.id); + if (found == infoLookup_.cend()) { + infoLookup_.insert({field.id, infoFields_.size()}); + infoFields_.push_back(std::move(field)); + } else + infoFields_.at(found->second) = std::move(field); + return *this; +} + +const std::string& VcfVariant::AltAllele() const { return altAllele_; } + +VcfVariant& VcfVariant::AltAllele(std::string altAllele) +{ + altAllele_ = std::move(altAllele); + return *this; +} + +const std::string& VcfVariant::Chrom() const { return chrom_; } + +VcfVariant& VcfVariant::Chrom(std::string chrom) +{ + chrom_ = std::move(chrom); + return *this; +} + +const std::string& VcfVariant::Filter() const { return filter_; } + +VcfVariant& VcfVariant::Filter(std::string filter) +{ + filter_ = std::move(filter); + return *this; +} + +std::vector VcfVariant::GenotypeIds() const { return format_; } + +VcfVariant& VcfVariant::GenotypeIds(std::vector ids) +{ + genotypeDataLookup_.clear(); + + format_ = std::move(ids); + for (size_t i = 0; i < format_.size(); ++i) + genotypeDataLookup_.insert({format_.at(i), i}); + return *this; +} + +std::vector VcfVariant::Genotypes() const { return sampleGenotypes_; } + +VcfVariant& VcfVariant::Genotypes(std::vector genotypes) +{ + sampleGenotypes_ = std::move(genotypes); + return *this; +} + +const boost::optional& VcfVariant::GenotypeValue(const size_t sampleIndex, + const std::string& id) const +{ + const auto& genotypeField = sampleGenotypes_.at(sampleIndex); + const auto genotypeDataIndex = genotypeDataLookup_.at(id); + const auto& genotypeData = genotypeField.data.at(genotypeDataIndex); + return genotypeData.value; +} + +VcfVariant& VcfVariant::GenotypeValue(const size_t sampleIndex, const std::string& id, + boost::optional value) +{ + auto& genotypeField = sampleGenotypes_.at(sampleIndex); + const auto genotypeDataIndex = genotypeDataLookup_.at(id); + auto& genotypeData = genotypeField.data.at(genotypeDataIndex); + genotypeData.value = std::move(value); + return *this; +} + +const boost::optional>& VcfVariant::GenotypeValues( + const size_t sampleIndex, const std::string& id) const +{ + const auto& genotypeField = sampleGenotypes_.at(sampleIndex); + const auto genotypeDataIndex = genotypeDataLookup_.at(id); + const auto& genotypeData = genotypeField.data.at(genotypeDataIndex); + return genotypeData.values; +} + +VcfVariant& VcfVariant::GenotypeValues(const size_t sampleIndex, const std::string& id, + boost::optional> values) +{ + auto& genotypeField = sampleGenotypes_.at(sampleIndex); + const auto genotypeDataIndex = genotypeDataLookup_.at(id); + auto& genotypeData = genotypeField.data.at(genotypeDataIndex); + genotypeData.values = std::move(values); + return *this; +} + +bool VcfVariant::HasInfoField(const std::string& id) const +{ + const auto found = infoLookup_.find(id); + return found != infoLookup_.cend(); +} + +const std::string& VcfVariant::Id() const { return id_; } + +VcfVariant& VcfVariant::Id(std::string id) +{ + id_ = std::move(id); + return *this; +} + +const std::vector& VcfVariant::InfoFields() const { return infoFields_; } + +VcfVariant& VcfVariant::InfoFields(std::vector fields) +{ + infoFields_.clear(); + infoLookup_.clear(); + for (auto&& field : fields) + AddInfoField(std::move(field)); + return *this; +} + +const boost::optional VcfVariant::InfoValue(const std::string& id) const +{ + return infoFields_.at(infoLookup_.at(id)).value; +} + +VcfVariant& VcfVariant::InfoValue(const std::string& id, boost::optional value) +{ + infoFields_.at(infoLookup_.at(id)).value = std::move(value); + return *this; +} + +const boost::optional> VcfVariant::InfoValues(const std::string& id) const +{ + return infoFields_.at(infoLookup_.at(id)).values; +} + +VcfVariant& VcfVariant::InfoValues(const std::string& id, + boost::optional> values) +{ + infoFields_.at(infoLookup_.at(id)).values = std::move(values); + return *this; +} + +bool VcfVariant::IsDeletion() const { return refAllele_.size() > altAllele_.size(); } + +bool VcfVariant::IsInsertion() const { return refAllele_.size() < altAllele_.size(); } + +bool VcfVariant::IsQualityMissing() const { return std::isnan(qual_); } + +bool VcfVariant::IsSampleHeterozygous(const size_t sampleIndex) const +{ + const auto data = GenotypeValue(sampleIndex, "GT"); + auto fields = PacBio::BAM::Split(data.get(), '/'); + if (fields.size() == 1) fields = PacBio::BAM::Split(data.get(), '|'); + + if (fields.size() != 2) + throw std::runtime_error{"VcfFormat: malformatted GT field: " + data.get()}; + + return fields.at(0) != fields.at(1); +} + +bool VcfVariant::IsSamplePhased(const size_t sampleIndex) const +{ + const auto data = GenotypeValue(sampleIndex, "GT"); + const auto phaseFound = data.get().find('|') != std::string::npos; + if (phaseFound) assert(data.get().find('/') == std::string::npos); + return phaseFound; +} + +bool VcfVariant::IsSnp() const +{ + return refAllele_.size() == 1 && altAllele_.size() == 1 && refAllele_[0] != altAllele_[0]; +} + +PacBio::BAM::Position VcfVariant::Position() const { return pos_; } + +VcfVariant& VcfVariant::Position(PacBio::BAM::Position pos) +{ + pos_ = pos; + return *this; +} + +float VcfVariant::Quality() const { return qual_; } + +VcfVariant& VcfVariant::Quality(float qual) +{ + qual_ = qual; + return *this; +} + +const std::string& VcfVariant::RefAllele() const { return refAllele_; } + +VcfVariant& VcfVariant::RefAllele(std::string refAllele) +{ + refAllele_ = std::move(refAllele); + return *this; +} + +VcfVariant& VcfVariant::RemoveInfoField(const std::string& id) +{ + const auto found = infoLookup_.find(id); + if (found == infoLookup_.cend()) return *this; + + const auto currentFields = InfoFields(); + + infoFields_.clear(); + infoLookup_.clear(); + + for (auto&& field : currentFields) { + if (field.id != id) AddInfoField(std::move(field)); + } + + return *this; +} + +} // namespace VCF +} // namespace PacBio diff --git a/src/vcf/VcfWriter.cpp b/src/vcf/VcfWriter.cpp new file mode 100644 index 0000000..78d59df --- /dev/null +++ b/src/vcf/VcfWriter.cpp @@ -0,0 +1,48 @@ +// Author: Derek Barnett + +#include + +#include +#include + +#include +#include +#include +#include +#include "../FileProducer.h" + +namespace PacBio { +namespace VCF { + +struct VcfWriter::VcfWriterPrivate : public PacBio::BAM::FileProducer +{ + VcfWriterPrivate(std::string fn, const VcfHeader& header) + : PacBio::BAM::FileProducer{std::move(fn)}, out_{TempFilename()} + { + out_ << VcfFormat::FormattedHeader(header) << '\n'; + } + + bool Write(const VcfVariant& var) + { + out_ << VcfFormat::FormattedVariant(var) << '\n'; + return true; // TODO: handle errors + } + + std::ofstream out_; +}; + +VcfWriter::VcfWriter(std::string fn, const VcfHeader& header) + : d_{std::make_unique(std::move(fn), header)} +{ +} + +VcfWriter::VcfWriter(VcfWriter&&) = default; + +VcfWriter& VcfWriter::operator=(VcfWriter&&) = default; + +VcfWriter::~VcfWriter() = default; + +bool VcfWriter::Write(const VcfVariant& var) { return d_->Write(var); } + +} // namespace VCF +} // namespace PacBio diff --git a/subprojects/gtest.wrap b/subprojects/gtest.wrap new file mode 100644 index 0000000..773a713 --- /dev/null +++ b/subprojects/gtest.wrap @@ -0,0 +1,10 @@ +[wrap-file] +directory = googletest-release-1.8.0 + +source_url = https://github.com/google/googletest/archive/release-1.8.0.zip +source_filename = gtest-1.8.0.zip +source_hash = f3ed3b58511efd272eb074a3a6d6fb79d7c2e6a0e374323d1e6bcbcc1ef141bf + +patch_url = https://wrapdb.mesonbuild.com/v1/projects/gtest/1.8.0/5/get_zip +patch_filename = gtest-1.8.0-5-wrap.zip +patch_hash = 7eeaede4aa2610a403313b74e04baf91ccfbaef03203d8f56312e22df1834ec5 diff --git a/tests/data/aligned.bam b/tests/data/aligned.bam new file mode 100644 index 0000000000000000000000000000000000000000..34d81e55ac5340b4db12e5ec01ac7ce662506f26 GIT binary patch literal 786 zcmb2|=3rp}f&Xj_PR>jWj*PJrF6K2Eh_rp&bmxs|4dX1afXrS_R;ye#(Ur4u%$ITK zsC02p(yiXH_x7sYv&7Y(Kl$(f@6S)AX}x^Pr@6v8Z+LetWH$`RuG$mxYt`E?0nPoB zsstR*^Ic`r@bv!`6ZT7?@`+-Pqt;4!p9$QXIIrF~yd;xj73ar(Mm3M$zP59HJX@Kr zUoDH!Y4p%om9|vcMCys=*+`jAQx6ec3-4{~E#p_jmh65$aYE;W)8ZRr6I$kIs`a&B zi1~Q7@AQv@AA5xjk0wuBw&%uYr_QZ0GoF2Z-jup0A$nic?%L)W_w~8o>sGmzul>Dn zZ;8VB7q+Hb5C6Hh;g8YNC$*9~9Oo3={Q3pwS%%)`zpvnz|LjN1{NwcwJp4Cae01J4 zab5E^-o)1@&(xP)d)}Y=mr3fv37#fK1_pVw5Zui8^pd^zVFwY058))r9>`d46?FAGIxBq_0}PwRus*>d8MI z+^y$(SDtUk)~q4a@N?@L8)k#k1^1-g>ettb$X#1~b3?4HrEOLlXWA^z;(AM7&pUe# zO)-?+<8f$T!{5Iu4HqmwrY`!qN+BjxsWp3@Udi`G=6P?P?CG4NvCQjds_>lyi>n*i zcSpN!ek2pIGD?zZdxX9@pVrgAbA9t>_ef^m_LMAC&Sc#-c_WLlvCip;V-beD)uK_M z{abIzwH%Lov*ux_U)0vwuYdNIoyZRU(e!-z+ppVq{$N&moiCs(`M&1D>*7Vn1znyy zFN)?(VC-C0c;`=;sNpe(1+Ixq4Ubk@SD02Ec;jXhbad${*Y+JvUa{tjoQ}D=ehSrc zoj9TPRd!cEtW$_yw>RhcRmI7l|LO_U3w_L8KIOX(FzEZA`A6M2!fWl3IwK+T%k~TQ zwjZ{${X1*u^=0w@I}-oq-~9gniFfKsXN{K`F$WJlwdzgr{hq3mq4n4Kzc?#b+6y;U O%s7)~UA^kigYU|?VZVoxCk1`wNp!3jb!2r+|rUXvj5=;ACONhE-(7a{=w%##BH literal 0 HcmV?d00001 diff --git a/tests/data/aligned.bam.pbi b/tests/data/aligned.bam.pbi new file mode 100644 index 0000000000000000000000000000000000000000..f2cf20768f7ea0ce3884d9a9ffd980fb3b49fbe5 GIT binary patch literal 168 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 literal 0 HcmV?d00001 diff --git a/tests/data/aligned2.bam.pbi b/tests/data/aligned2.bam.pbi new file mode 100644 index 0000000000000000000000000000000000000000..c1e82de96ba933e6ebd44e53673dc034f8e62beb GIT binary patch literal 366 zcmb2|=3rp}f&Xj_PR>jWfsDPA_G`N)N*uR;{_oS`De>QnoUPb+P9zw5JZvlRo_q8W ze}Iujm*dF_W61)aNk{c~l9bjpcD~Elq;X22=;yw@yXK}?oUh*Z{I`v*{k?hl@1I=Q z@mS#M$|v^TJwJ{oUReFi^tj)S-1hH$FR~gBtLT^cKb;2oSK%f{k+ortsD2xmE&oCkhig;vuNGZzjdd3B~Kq+^ECW? zQR3B4MZO|o+x{s@Wbnf)-I?p1q|JULlOS!L}s`n`5y=1sw zx^!OlF7>*Aq`(>d&gD!oA6FDbK0Oq*F(pf9W@Y|;#@~#&LXl2gObiV2Xdx=izzhyx G5CH%q9;8SB literal 0 HcmV?d00001 diff --git a/tests/data/barcoded_read_groups.bam b/tests/data/barcoded_read_groups.bam new file mode 100644 index 0000000000000000000000000000000000000000..4873f7e9df1606ec0550ddc1d037628d8c6931ed GIT binary patch literal 498 zcmb2|=3rp}f&Xj_PR>jWI*d<)PG=o95b#+j{xtrLm#1g6q@zl7r|aLYCoH#SPu5s_ zaAVh7nNNrR_T6H2_Hyn$%QMs78(-g|=Em+#n@8|PnrpMS%2`6k85a&2pcOYP)J zgP-oU+ijKVdT&nWt(ji`JsA@8-qr1MW06u2d?7BF(a_~^U8Iq1MaR46A6IPEf9lRs z@Cg`9@@Rpzg5h*xLc$Mz);m0MPCPt14jlr_Mv`7Z-QHh#zwkctm5`b3z~uNYkWKTM zr<+)2Cr|6jb2_a@&+$~Up6dzSd9KH`HFI;C*DdkqmP;GYSXLi9&L?Ruls#Xu?DrSm zl2TrettOf`HD`1(GEL%|yS1aNMKI4@V$ypKw@WgKJ%6~W^g2f2mmjZ(H{T+ literal 0 HcmV?d00001 diff --git a/tests/data/barcoded_read_groups.bam.pbi b/tests/data/barcoded_read_groups.bam.pbi new file mode 100644 index 0000000000000000000000000000000000000000..368d1d5c3abd1b354f118bd10ca2fca937814435 GIT binary patch literal 126 zcmb2|=3rp}f&Xj_PR>jWi45EYpHfni64DY96H*Vb)n$f!UX+~kDx#t3#SB4>w!ZYU zQ?|Gt5BOZ-m?g<2q3|VKBlalA!~g9U|2wXdX#8M5fz|NeelYT?A&39~D{3gS literal 0 HcmV?d00001 diff --git a/tests/data/chemistry.xml b/tests/data/chemistry.xml new file mode 100644 index 0000000..c6a6521 --- /dev/null +++ b/tests/data/chemistry.xml @@ -0,0 +1,9 @@ + + + + FOUND + 1 + 2 + 3.4 + + diff --git a/tests/data/chimera_minimal.fasta b/tests/data/chimera_minimal.fasta new file mode 100644 index 0000000..f2eb86c --- /dev/null +++ b/tests/data/chimera_minimal.fasta @@ -0,0 +1,220 @@ +>Barcode0--0_Cluster1_Phase1_NumReads297 +GCAGGTGCCTTTGCAGAAACAAAGTCAGGGTTCTTCAAGTCACAAAGGGAAGGGCAGGAA +CAACTCTTGCCTCTCAGTCCCACACAAGGCAGCTGTCTCACACTATAGAAAAAAATATTC +ATGAACAAATTCGTATCTGTCACAGTGAGGGGTCACACTTTAAACAGCCCATCGCATGCT +CAATACATCCAATGGAAAGAAACCCCATAGCACAGCTGTGTCCACTGTTCCGCCCAACAC +CCAACACACATCAGGCCCTCCAGGCTCTCACCTTTACAAGCTGTGAGAGACACATCAGAG +CCCTGGGCACTGTCACTGCCTGGGGTAGAACAAAAACAGAACCTGGTCAGATCCCACAGA +AGATGTGGCTAGAGGAGGAATTGTGGGGTGGGTGAGCTCCCCCATGGGCTCCCAAACACA +ATATCCCAAGGACCTCAGGCATCAGCCTCCTTCATACTTACTTGCAGCCTGAGAGTAGCT +CCCTCCTTTTCTATCTGTGGGAAGAAAATGTCCTGTGAGATACCAGAAAGGAGTCAGGGC +CTTAAGGTCCTAGAGGAACCTCCAAGTCTTGGACCTCAGAGAAGTTTCCAGAAATGTGTG +ACTGCAGACCCAGGGCGGGATCAGGAAACATGAAGAAAGCAGGTGTGGGTCCTGGACCAA +CCGCCCTCCTGAAGGTCCTCAGGGACCTTCCCCTGTGACTTGTGACTGCTGGGATCAGGT +CCCATCACCGCTGTAATCAAGGTGATAAATCTGTCCTTCATTTTAACAGGTGCTTTACAA +AAGAGTAAGTGCTGGCACACAGGGCCCAGGCTGGGTAGGCCCATAATTGTGGGTGGTGCT +TCCCAGTAACGAGGCAGGGCACACTTCTACCTGGGTCTTGGAACCCTCAGTGAGACAAGA +AATCTCAGACCCACCCTTCACCCCTTCCCCACCTGAGCTCTTCCTCCTCCACATCACAGC +AGCGACCACAGCTCCAGTGATCACAGCTCCAAAGAGAACCAGGCCAGCAATGATGCCCAC +GATGGGGATGGTGGGCTGGGAAGACGGCTCTGGGAAAAGAGGGGAAGGTGAGGGGCCCTG +ACCCTGCTAAAGGTCAGAGAGGCTCCTGCTTTCCCTAAAAGACATGACACCCCCGTCTCC +CTCCTTACCCCATCTCAGGGTGAGGGGCTTGGGCAAACCCTCATGCTGCACATGGCAGGT +GTATCTCTGCTCCTGTCCAGAAGGCACCACCACAGCCGCCCACTTCTGGAAGGTTCCATC +CCCTGCAGGCCTGGTCTCCACGAGCTCCGTGTCCTGGGTCTGGTCCTCCCCATCCCGCTG +CCAGGTCAGTGTGATCTCCGCAGGGTAGAAGCTCAGGGCCCAGCACCTCAGGGTGGCTTC +ATGGTCAGAGACAGCGTGGTGAGTCATATGCGTTTTGGGGGCGTCTGTCAGGAAGAGTCA +GATCATTCAGGCATTTTGCATCTGTCATGGGACACTCCTCCAGCACACATGTGGCTATCT +TGAGAATGGACAGGACACCTGGGATGGGGAAGGGAGCACAGAACCCAGACACCAGCCTGG +ACACAGGCACCTGGGATAATCTCCTATTCCGTGGAAAATTCTAGTCCCTGAAGAGGGAAC +AGCGACTTCTGGTCCTGACCTGAGTGGAGGCTGAAGGACTCAGAAGTGCTGGACTCAGAC +CCCCACACACATTGAGTGTGAAGCAGAGAACAAGGCCTGAGAGGAAAAGTCACGGGCCCA +AGGCTGCTGCCTGTGTGTGTCAAAGGGAACCACTCATCAGTATTCGAGGGATCGTCTTCC +CGTCATTCCTTCAGAGATTTTATCCCTTAATTGTGTCAGAGAGCAGGGCGGAACCTCAGA +GTCACTCTCTGGTACAGGATCTGGAAACCCAGGAGGATTCCTCTCCCTCAGGACCAGAGG +GAGGGCGATATTCTAGTGTTGGTCCCAATTGTCTCCCCTCCTTGTGGGAGGCCAGCCCGG +GAGATCTACAGGCGATCAGGGAGGCGCCCCGTGGCCCCTGGTACCCGTGCGCTGCAGCGT +CTCCTTCCCGTTCTCCAGGTATCTGCGGAGCCACTCCACGCACGTGCCCTCCAGGTAGGC +TCTCAACTGCTCCGCCACATGGGCCGCCTCCCACTTGTGCTTGGTGGTCTGAGCTGCCAT +GTCCGCCGCGGTCCAAGAGCGCAGGTCCTCTTTCAGGGCGATGTAATCCTTGCCGTCGTA +GGCGTACTGGTGGTACCCGCGGAGGAAGCGCCAGTCCGACCCCACGTCGCAGCCATACAT +CCTCTGGACGGTGTGAGAACCTGGCCCGGACCCCGCGGTCAGCCCGGTCCCCCGAGCCCC +GCCCCGCCCCGACCAACCTGGGGGGATTTTTGGCCTAAACTGAAAATGAAACCGGGTAAA +GGCGCCTGGGCCTCTCCCGGGGCAAGGGTCTCGGGGTCCCGCGGCTTCGGGGCGGATCTC +GGACCCGGAGACTGTGGGCGACCTGGCCCGTCCGTGGGGGATGAGAGGTCGTGACCTGCG +CCCCGGGCCGGGGTCACTCACCGGCCTCGCTCTGGTTGTAGTAGCCGCGCAGGGTCCCCA +GGTCCACTCGGTGAGTCTGTGAGTGGGCCTTCACTTTCCGTGTCTCCCCGTCCCAATACT +CCGGACCCTCCTGCTCTATCCACGGCGCCCGCGGCTCCATCCTCTGGCTCGCGGCGTCGC +TGTCGAACCGCACGAACTGCGTGTCGTCCACGTAGCCCACTGCGATGAAGCGGGGCTCCC +CGCGGCCGGGCCGGGACACGGATGTGAAGAAATACCTCATGGAGTGAGAGCCTGGGGACG +AGGAGTGGCTGAGACCCGCCCGACCCTCCTCCCGGCGCGGCTTCCCGGGTCCTGCGCCCC +CGCCAGGCGGGCCCGTTGCTTCTCCCCACAGAGGCCGTTTCCCTCCCGACCCCGCACTCA +CCCGCCCAGGTCTGGGTCAGGGCCAGAGCCCCCGAGAGTAGCAGGACGAGGGTTCGGGGC +GCCATGACGGCCATCCTCGGCGTCTGGGGAGAATCTGAGTCCCGGTGGGTGCGTGCGGAC +TTTAGAACCGCGACCGCGACGACACTGATTGGCTTCTCTGGAAACCCGACACCCAATGGG +AGTGAGAACTGGGTCCGCGTCGTGAGTATCCA +>Barcode0--0_Cluster3_Phase1_NumReads294 +GCAGGTGCCTTTGCAGAAACAAAGTCAGGGTTCTTCAAGTCACAAAGGGAAGGGCAGGAA +CAACTCTTGCCTCTCAGTCCCACACAAGGCAGCTGTCTCACACTATAGAAAAAAATATTC +ATGAACAAATTCATATCCATCACAGTGAGGGGTCACACCTTAAACAGCCCATCGCATGCT +CAATACATCCAATGCAAAGAAACCCCATAGCACAGCTGTGTCCACTGTTCCGCCCAACAC +CCAACACACATTAGGTCCTCCAAGCTCTCACCTTTACAAGCTGTGAGGGACACATCAGAG +CCCTGGGCACTGTCACTGCCTGGGGTAGAACAAAAACAGAACCTGGTCAGATCCCACAGA +AGATGTGGCTAGAGGAGGAATTGTGAGGTGGGTGGGCTCCCCCATGGGCTCCCAAACACA +ATATCCCAAGGACCTCAGGCATCAGCCTCCTTCATACTTACTTGCAGCCTGAGTGTAACT +CCCTCCTTTTCTATCTGTGAGAAGAAAATGTCCTGTGAGATACCAGAAAGGAGCCAGGGC +CTTAAGGTCCTAGAGGAACCTCCTAGTCTTGGACCCCAGAGAAGTTTCCAGAAATGTGTG +ACTGCAGACCCAGGGCGGGATCAGGAAACATGAAGAAAGCAGGTGTGGGTCCTGGACCAA +TAGCCCTCCTGAGGTCTGTCCTCAGGGACCTTCCCCTGTGACTTGTGACTGCTGGGATCA +GGTCCCATCACCGCCGTAATCAAGGTGATAAATCTGTCCTTCATTTTAACAGGTGCTTTA +CAAAAGAGTAAGTGCTGGCACACAGGGCCCAGACTGGGTAGGCCCATGATTGTGGACGGT +GCTTCCCAGTAATGAGACAGGGCACATTTCTAGCTGGGGCTTGGAACCCTCAGTGAGACA +AGAAATCTCAGACCCCACCCTTCACCCCTTCTCCACCTGAGCTCTTCCTCCTCCACATCA +CGGCAGCGACCACAGCTCCAGTGATCACAGCTCCAAGGAGAACCAGGCCAGCAATGATGC +CCACGATGGGGATGGTGGGCTGGGAAGACAGCTCTGGGAAAAGAGGGGAAGGTGAGGGGC +CCTGACCCTGCTAAAGGTCTCCAGAGAGGCTCCTGCTTTCCCTAAGAGACATGACACCCC +CATCTCCCTCCTTACCCCATCTCAGGGTGAGGGGCTTGGGCAGACCCTCATGCTGCACAT +GGCAGGTGTATCTCTGCTCCTCTCCAGAAGGCACCACCACAGCCGCCCACTTCTGGAAGG +TTCCATCCCCTGCAGGCCTGGTCTCCACGAGCTCCGTGTCCTGGGTCTGGTCCTCCCCAT +CCCGCTGCCAGGTCAGTGTGATCTCCGCAGGGTAGAAGCCCAGGGCCCAGCACCTCAGGG +TGGCCTCATGGTCAGAGATGGGGTGGTGGGTCATATGTGTCTTGGGGGGGTCTGACGGGA +AGAGTCAGAAAATTCAGGCATTTTGCATCTGTCATGGGACACTCCACCAGCACGCATGTG +GCCATCTTGAGAATGGACAGGACACCCGGGATGGGGAAGAGAGCACAGAACCCAGACACC +AGCCTGGACACAGGCACCTGGGATAATCTTCTATTCCCTGAGAAGGGAACAGCGACTTCT +GGTCCTGACCTGAGTGGAGGCTGAGGGACTCAGAAGTGCTGGACTCAGACCCCCACACAC +ATTGAGTGTGAAGCAGAGAACAAGGCCTGAGAGGAAAAGTCACGGGCCCAAGGCTGCTGC +CGGTGTCAAAGGGAACCACTCATCAGTATTCGAGGGATCGTCTTCCCGTCACTCCTTCAG +AGATTTTATCCCTTAATTGTGTCAGAGAGCAGGGCGGAACCTCAGAGTCACTCTCTGGTA +CAGGATCTGGAACCCAGGAGGATTCCTCTCCCTCAGGACCAGAGGGAGGGTGATATTCTA +GTGTTGGTCCCAATTGTCTCCCCTCCTTGTGGGAGGCCAGCCCGGGAGATCTACAGGCGA +TCAGGGAGGCGCCCCGTGGCCCCTGGTACCCGTGCGCTGCAGCGTCTCCTTCCCGTTCTC +CAGGTATCTGCGGAGCCACTCCACGCACGTGCCATCCAGGTAGGCTCTCAACTGCTCCGC +CTCATGGGCCGCCTCCCACTTGCGCTTGGTGATCTGAGCCGCCATGTCCGCCGCGGTCCA +AGAGCGCAGGTCCTCGTTCAGGGCGATGTAATCCTTGCCGTCGTAGGCGTCCTGCCGGTA +CCCGCGGAGGAAGCGCCCGTCCGACCCCACGTCGCAGCCATACATTATCTGGATGGTGTG +AGAACCTGGCCCCGACCCCGCGGTCAGCCCAGTCCCCCGAGCCCCGCCCAGCCCCGACCA +ACCCGGGGGGATTTTTGGCCTAAACTGAAAATGAAACCGGGTAAAGGCGCCTGGGCCTCT +CCCGGGGCAAGGGTCTCGGGGTCCCGCGGCTTCGGGGTGGATCTCGGACCCGGAGACTGT +GGGCGACCTGGCCCGTCCGTGGGGGATGAGGGGTCCTGACCTGCGCCCCCGGCCGGGGTC +ACTCACCGGCCTCGCTCTGGTTGTAGTAGCCGCGCAGGGTCCCCAGGTCCACTCGGTCAG +TCTGTGACTGGGCCTTCACATTCCGTGTCTCCTGGTCCCAATACTCCGGCCCCTCCTGCT +CTATCCACGGCGCCCGCGGCTCCATCCTCTGGCTCGCGGCGTCGCTGTCGAACCGCACGA +ACTGCGTGTCGTCCACGTAGCCCACGGCGATGAAGCGGGGCTCCCCGCGGCCGGGCCGGG +ACACGGATGTGAAGAAATACCTCATGGAGTGGGAGCCTGGGGGCGAGCAGTGGCTGAGAC +CTGCCCGACCCTCGTCCCGGCGCGGCTCCCCCGGTCCTGCGCCCCCGCCAGGAGGGCCCC +TTGCTTCTCCCCGCAGAGGCGGTTTCCCTCCCGACCCCGCACTCACCCGCCCAGGTCTGG +GTCAGGGCCAGGGCCCCCGAGAGTAGCAGGAGGAGGGTTCGGGGCGCCATGACGGCCATC +CTCGGCGTCTGGGGAGAATCTGAGTCCCGGTGGGTGCGTGCGGGCTTTAGAACAGCGACC +GCGACGACACTGATTGGCTTCTCTGGAAACCCGACACCCAATGGGAGTGAGAACTGGGTC +CGCGTCGTGAGTATCCA +>Barcode0--0_Cluster0_Phase2_NumReads92 +CTGGGGAGGAAACACAGGTCAGCATGGGAACAGGGGTCACAGTGGACACGGGGGTGGGCT +GTCTCTCCACCTCCTCACATTATGCTAACAGGGACGCAGACACATTCAGGTGCCTTTGCA +GAAAGAGATGCCAGAGGCTCTTGAAGTCACAAAGGGGAGGAGTGAAGAAATCCTGCATCT +CAGTCCCTCACAAGACAGCTGTCTCAGGCTACAGAAAACAACAGTCATGAACAAATTCTG +GTTAGTCATGGTAAGTGATGACACTCTAAACAGCCCACCACACACGCGAAACATCCCAAT +CAAAGAATCTCCATTACCCAGGCCTTTCCCCTCTGCCCCCTCCCCACCCCACCCCCCCCG +CCCACTCTAGACCCCAAGAATCTCACCTTTTCAAGCTGTGAGAGACACATCAGAGCCCTG +GGCACTGTCGCTGGCTGGAGTAGAACAAAAACAGGACCTGGTCAGAGCCCGCAGGAGACG +TGGGACAGGAGGAATTATGGGGTGGGTGAGCTCCTCCACACTCCCACCCCCACCACTTAC +ACGCAGCCTGAGAGTAGCTCCCTCCTTTTCCACCTGTGGGAAGAAAATGTCCTGTGAGGG +GACTGGGAGGAAGCAGGGCCATGAGATCTTAGAGGAACCTCCTCGTCTTGGACCCAAAAG +GAATTTCCAGAAGTATGACTACAGACCCAAGGCAGGATCAGGAAACACGAGGAAAGCAAG +TGTGGGTCCTGGACCAACTGCCCTCCTAAGGTCTGTCCTTAGCAGGGACCTTCCCCTGAC +TCATGAATGCTGAAATCAGGACCCCAACACCACAACCATCAAGGTGATACATCCGTCCTT +CATTGTCACATGTGCTGCACAAAAGAGTAAGTGCTGGCACACAGGGTCCCAGGCTGCATT +AGCCCCTGTGTGGATGCTGCTTCCCAGTAATGAGGCAGGGAACACTTCTACCTGGGGCTT +GAAACCCCCAGTGGGACAAGAAAACCCAGACCCCACCCCTCACCCCTTCCCTACCTGAGC +TCTTCCTCCTACACATCACAGTAGCGACCACAGCTCCGATGACCACAACTGCTAGGACAG +CCAGGCCAGCAACAATGCCCACGATGGGGATGGTGGACTGGGAAGATGGCTCTGGGAAAG +GAGGGGAAGACGAGGGGCCCTGACCCTGCTGAAGGGCTCCAGAAGGGCTCCTGCTTTCCC +TGAGAAGAGATATGACCCCTCATCCCCCTCCTTACCCCATCTCAGGGTGAGGGGCTTCGG +CAGCCCCTCATGCTGTACATGGCATGTGTATCTCTGCTCTTCTCCAGAAGGCACCACCAC +AGCTGCCCACTTCTGGAAGGTTCTATCTCCTGCTGGTCTGGTCTCCACAAGCTCAGTGTC +CTGAGTTTGGTCCTCGCCATCCCGCTGCCAGGTCAGTGTGATCTCCGCAGGGTAGAAGCC +CAGGGCCCAGCACCTCAGGGTGGCCTCATGGTCAGAGATGGGGTGGTGGGTCACGTGTGT +CTTTGGGGGGTCTGATGGGAAGAGTCAGAAAATTCAGGCGCTTTGCATCTCTCATAGGAC +ACCCTAGGACCACCCATGTGACCAGCCTGAGAATGGACAGGACACCTGGGGTGGGGAAGG +GGCACAGAACCCAGACACCAGCCTGGACGCAGGCACCTGGGATAATCTCCTATTCATTGG +AAAGTTCGAGTCTCTGAGCGGGGAACAGGGACTTCTGCTCCTGATCTGAGTGGAGGTAAA +GTGACTCAGAAGTGCTGGAATCAGAGCCCCAAACACACTGAGTGTGAGGCAGAGAACAAG +GCCTGAGAGGAAAAGTCACGGTTCCCAAGGCTGCTGCAGGGGTCAAAGAGGACCCCTGAT +CAGTATTCTAGGGACTGTCTTCCCCTCCATTTCCTCAGAGACGTCATCCCTTAATTGTCC +TAGAGAGAAGAGGGGGCCCTCAGAGGAAACTCAGGAAAACTCATGCCATTCTCCATTCAA +GGGAGGGCGACATTCTAGCGCTGATCCCATTTTCCTCCTCTTCTCGTGGGAGGCCATCCC +CGGCGACCTATAGGAGATGGGGAAGGCTCCCCACTGCCCCTGGTACCCGCGCGCTGCAGC +GTCTCCTTCCCGTTCTCCAGGTATCTGCGGAGCCACTCCACGCACAGGCCCTCCAGGTAG +GCTCTCAGCTGCTCCGCCACACGGGCCGCCTCCCACTTGCGCTGGGTGATCTGAGCCGCG +GTGTCCGCCGCGGTCCAGGAGCTCAGGTCCTCGTTCAGGGCGATGTAATCCTTGCCGTCG +TAGGCTAACTGGTTATGCCCGCGGAGGAGGCGCCCGTCCGGCCCCAGGTCGCAGCCATAC +ATCGTCTGCCAAGTGTGAGACCCTGGCCCCGGCCCCGCGGTCAGCCCCGTCCCCCGAGCC +CCGCCCCGCCCCGACCAACCCGCGGGGATTTTGGCCTCAACTGAAAATGAAACCGGGTAA +ACGCGCCTGGGGCTCTCGCCGGTCGAGGGTCTGGGCGGGTCCCGCGGCCTCAGGGAGGCG +GATCTCGGACCCGGAGACTCGGGGCGACCCGGGCCGTACGTGGGGGATGGGGAGTCGTGA +CCTGCGCCCCGGGCCGGGGTCACTCACCGGCCTCGCTCTGGTTGTAGTAGCCGCGCAGGT +TCCGCAGGCTCTCTCGGTCAGTCTGTGCCTGGGCCTTGTAGATCTGTGTGTTCCGGTCCC +AATACTCCGGCCCCTCCTGCTCTATCCACGGCGCCCGCGGCTCCTCTCTCGGACTCGCGG +CGTCGCTGTCGAACCTCACGAACTGCGTGTCGTCCACGTAGCCCACTGCGATGAAGCGGG +GCTCCCCGCGGCCGGGCCGGGACATGGCGGTGTAGAAATACCTCATGGAGTGGGAGCCTG +GGGGCGAGGAGGGGCTGAGACCCGCCAGACCCTCCTCCCGGCGCGGCTCCCCGGGTCCTG +CGCCCCCGCCTGCGGTCCCCTCGCTCCTCCCCACAGAGGCCATTTCCCTCCCGACCCGCA +CTCACCGGCCCAGGTCTCGGTCAGGGCCAGGGCCCCCCAGAGCAGCAGGAGGAGGGTTCG +GGGTGCCGTGACCCGCATCTCGGTGTCTGAGGAGACTCTGAGTCCGGGTGGGTGCGTGGG +GACTTTAGAACTGGGACCCCGGCGACACTGATTGGCTTCTCTAGACACCCGACACCCAAT +GGGAGTGGGAAATGGGGACGCGTCACGAGTATCCTGGAAGAAGGACCCGACATAGGTTGG +GAGAAGAAGTGAAACTCGTGGGAGTGGGGAATCCCCAACGCTGCGCCTCCCCAATGCAGA +CGCGGCCCTCGGAGCCTGAGACCCTGAGAGCCCCGTCCGGGACATGGGACTTCGTCCTGA +TCCCTCTTCTCCTACACCAGCCTCTTTGTCACACTGTCTGCC +>Barcode0--0_Cluster1_Phase3_NumReads56 +GCAGGTGCCTTTGCAGAAACAAAGTCAGGGTTCTTCAAGTCACAAAGGGAAGGGCAGGAA +CAACTCTTGCCTCTCAGTCCCACACAAGGCAGCTGTCTCACACTATAGAAAAAAATATTC +ATGAACAAATTCGTATCTGTCACAGTGAGGGGTCACACTTTAAACAGCCCATCGCATGCT +CAATACATCCAATGGAAAGAAACCCCATAGCACAGCTGTGTCCACTGTTCCGCCCAACAC +CCAACACACATCAGGCCCTCCAGGCTCTCACCTTTACAAGCTGTGAGAGACACATCAGAG +CCCTGGGCACTGTCACTGCCTGGGGTAGAACAAAAACAGAACCTGGTCAGATCCCACAGA +AGATGTGGCTAGAGGAGGAATTGTGGGGTGGGTGAGCTCCCCCATGGGCTCCCAAACACA +ATATCCCAAGGACCTCAGGCATCAGCCTCCTTCATACTTACTTGCAGCCTGAGAGTAGCT +CCCTCCTTTTCTATCTGTGGGAAGAAAATGTCCTGTGAGATACCAGAAAGGAGTCAGGGC +CTTAAGGTCCTAGAGGAACCTCCAAGTCTTGGACCTCAGAGAAGTTTCCAGAAATGTGTG +ACTGCAGACCCAGGGCGGGATCAGGAAACATGAAGAAAGCAGGTGTGGGTCCTGGACCAA +CCGCCCTCCTGAAGGTCCTCAGGGACCTTCCCCTGTGACTTGTGACTGCTGGGATCAGGT +CCCATCACCGCTGTAATCAAGGTGATAAATCTGTCCTTCATTTTAACAGGTGCTTTACAA +AAGAGTAAGTGCTGGCACACAGGGCCCAGGCTGGGTAGGCCCATAATTGTGGGTGGTGCT +TCCCAGTAACGAGGCAGGGCACACTTCTACCTGGGTCTTGGAACCCTCAGTGAGACAAGA +AATCTCAGACCCACCCTTCACCCCTTCCCCACCTGAGCTCTTCCTCCTCCACATCACAGC +AGCGACCACAGCTCCAGTGATCACAGCTCCAAAGAGAACCAGGCCAGCAATGATGCCCAC +GATGGGGATGGTGGGCTGGGAAGACGGCTCTGGGAAAAGAGGGGAAGGTGAGGGGCCCTG +ACCCTGCTAAAGGTCAGAGAGGCTCCTGCTTTCCCTAAAAGACATGACACCCCCGTCTCC +CTCCTTACCCCATCTCAGGGTGAGGGGCTTGGGCAAACCCTCATGCTGCACATGGCAGGT +GTATCTCTGCTCCTGTCCAGAAGGCACCACCACAGCCGCCCACTTCTGGAAGGTTCCATC +CCCTGCAGGCCTGGTCTCCACGAGCTCCGTGTCCTGGGTCTGGTCCTCCCCATCCCGCTG +CCAGGTCAGTGTGATCTCCGCAGGGTAGAAGCTCAGGGCCCAGCACCTCAGGGTGGCTTC +ATGGTCAGAGACAGCGTGGTGAGTCATATGCGTTTTGGGGGCGTCTGTCAGGAAGAGTCA +GATCATTCAGGCATTTTGCATCTGTCATGGGACACTCCTCCAGCACACATGTGGCTATCT +TGAGAATGGACAGGACACCTGGGATGGGGAAGGGAGCACAGAACCCAGACACCAGCCTGG +ACACAGGCACCTGGGATAATCTCCTATTCCGTGGAAAATTCTAGTCCCTGAAGAGGGAAC +AGCGACTTCTGGTCCTGACCTGAGTGGAGGCTGAAGGACTCAGAAGTGCTGGACTCAGAC +CCCCACACACATTGAGTGTGAAGCAGAGAACAAGGCCTGAGAGGAAAAGTCACGGGCCCA +AGGCTGCTGCCTGTGTGTGTCAAAGGGAACCACTCATCAGTATTCGAGGGATCGTCTTCC +CGTCATTCCTTCAGAGATTTTATCCCTTAATTGTGTCAGAGAGCAGGGCGGAACCTCAGA +GTCACTCTCTGGTACAGGATCTGGAACCCAGGAGGATTCCTCTCCCTCAGGACCAGAGGG +AGGGCGATATTCTAGTGTTGGTCCCAATTGTCTCCCCTCCTTGTGGGAGGCCAGCCCGGG +AGATCTACAGGCGATCAGGGAGGCGCCCCGTGGCCCCTGGTACCCGTGCGCTGCAGCGTC +TCCTTCCCGTTCTCCAGGTATCTGCGGAGCCACTCCACGCACGTGCCATCCAGGTAGGCT +CTCAACTGCTCCGCCTCATGGGCCGCCTCCCACTTGCGCTTGGTGATCTGAGCCGCCATG +TCCGCCGCGGTCCAAGAGCGCAGGTCCTCGTTCAGGGCGATGTAATCCTTGCCGTCGTAG +GCGTCCTGCCGGTACCCGCGGAGGAAGCGCCCGTCCGACCCCACGTCGCAGCCATACATT +ATCTGGATGGTGTGAGAACCTGGCCCCGACCCCGCGGTCAGCCCAGTCCCCCGAGCCCCG +CCCAGCCCCGACCAACCCGGGGGGATTTTTGGCCTAAACTGAAAATGAAACCGGGTAAAG +GCGCCTGGGCCTCTCCCGGGGCAAGGGTCTCGGGGTCCCGCGGCTTCGGGGTGGATCTCG +GACCCGGAGACTGTGGGCGACCTGGCCCGTCCGTGGGGGATGAGGGGTCCTGACCTGCGC +CCCCGGCCGGGGTCACTCACCGGCCTCGCTCTGGTTGTAGTAGCCGCGCAGGGTCCCCAG +GTCCACTCGGTCAGTCTGTGACTGGGCCTTCACATTCCGTGTCTCCTGGTCCCAATACTC +CGGCCCCTCCTGCTCTATCCACGGCGCCCGCGGCTCCATCCTCTGGCTCGCGGCGTCGCT +GTCGAACCGCACGAACTGCGTGTCGTCCACGTAGCCCACGGCGATGAAGCGGGGCTCCCC +GCGGCCGGGCCGGGACACGGATGTGAAGAAATACCTCATGGAGTGGGAGCCTGGGGGCGA +GCAGTGGCTGAGACCTGCCCGACCCTCGTCCCGGCGCGGCTCCCCCGGTCCTGCGCCCCC +GCCAGGAGGGCCCCTTGCTTCTCCCCGCAGAGGCGGTTTCCCTCCCGACCCCGCACTCAC +CCGCCCAGGTCTGGGTCAGGGCCAGGGCCCCCGAGAGTAGCAGGAGGAGGGTTCGGGGCG +CCATGACGGCCATCCTCGGCGTCTGGGGAGAATCTGAGTCCCGGTGGGTGCGTGCGGGCT +TTAGAACAGCGACCGCGACGACACTGATTGGCTTCTCTGGAAACCCGACACCCAATGGGA +GTGAGAACTGGGTCCGCGTCGTGAGTATCCA \ No newline at end of file diff --git a/tests/data/chunking/chunking.subreadset.xml b/tests/data/chunking/chunking.subreadset.xml new file mode 100644 index 0000000..6d15ff1 --- /dev/null +++ b/tests/data/chunking/chunking.subreadset.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.1.subreads.bam b/tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.1.subreads.bam new file mode 100644 index 0000000000000000000000000000000000000000..c4ec7eaecfcfc2857af82a3926a6fa3bd592a87c GIT binary patch literal 1090276 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%0D#gB|`^1&p%Oi2Vvg0TY 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 z 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%0Dx? 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%0AGe2ujfXzM&34#P{r;W1y5#ZkvW{ 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 z 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%0AroN2RN*eMh+rh7tP3=;MWmFg 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%0DCBF@PPV**27QrjH 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%0A#SFX5N)7+!&AZpnEs1uRp+mgg*4 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 z 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 V_TxYrCL%@SWz_nWf#Wwg3$NG%< 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

U@)v+x)>l_}KjFuzt*NiY|5lYS_NU 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෉^=_ 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�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 z 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

$j_a7 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℞=QtX*mn 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 oC0Ls3XTRy8QSFg5JrY9f` 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%0AIr#MKk;<8=aZpvbe}2e}rau)cIN9#Yq?~ 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 Q02=@U000000000000_K2i~s-t literal 0 HcmV?d00001 diff --git a/tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.2.subreads.bam.pbi b/tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.2.subreads.bam.pbi new file mode 100644 index 0000000000000000000000000000000000000000..64799796028f9ea652e56e868ef59e5f9098ab88 GIT binary patch literal 3933 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 literal 0 HcmV?d00001 diff --git a/tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.3.subreads.bam b/tests/data/chunking/m150404_101626_42267_c100807920800000001823174110291514_s1_p0.3.subreads.bam new file mode 100644 index 0000000000000000000000000000000000000000..8544f6ac9b955f0ae6a4a6cd30431f9941589025 GIT binary patch literal 973029 zcmV)DK*7HsiwFb&00000{{{d;LjnNN0lksij+-zLhEw&5JOwWR*bavPLJ9<$MNJ3` zBvN~WOmKHm!y(wTcu2tv4`aLu9%>UVQcOSBkv)Ssw7mkqyWlc!;*3f)! z+MkWk71lxqGMulHjS%{lX=>yfFbu&@tt4>$>`NRt>A{<{?UOTMRogrso$~T_%kYy^ zGCOQ2>2KBQV(&=*M7XRkb~+T4RcyEw>BSDa(ptAAIUS)>b+#8qei&^&hnWKbSQy9v zz)pk5LlCY1$ZI;{dCyIQwY%L0$uUUMa348HezhP&6`3ZmKPB!iNZc%V`05y%41i|n zOCdg3HPnC#)Eok+BRy9U(vAGYUtR*kMEtx4T%rXuR0shwp$65Q!n^}QytQI??S=dK zD&7cjWEJ=qDsVkfyGaS~JH0_A_zDT$A;Ae!H?rrp5#MPR zrAk!lhAEVs+NQ+)DADSN!U$!&7b~f|kdjn+&uLwq`u5-Br9;sZTvE=tp3iu^0Hi!% z>0ko@03VA81ONa4009360763o0Q+I=y;*N7*_I}@W9BT8iX-t1dGe49GUkXK^T08J zA&HrJ?*+=0K-p=x6L59k?hAJ{DqRhuVZ$2`i?;RR5%u7H@QdLW{|>_j{3HAa`q2-D zAM7r#O`SmlrK5B2%__slm3gQb_OSK}DY(CHueJ97&LQ--@8wVa7J=~SAEQs#=#{_l zA{^rIM-O|kAO9Hoew_UH=N`r>PBI@pZ^TRez)M2U!+z#PUijl*c|ZOoc0HWoAap%1 z^V1(a9|s=V%0sPG=>J;PlZ&A|*z}5PIN!=!WvCU`rBZa^a&L3JyDqw0D75<9zZ>~C zE`P|f=pX$SCkgt8KmFi8LsVbaZl6z{DEr7g^bh~}55IYa6u-H=ynFss*@J?9_m}0G zK4F35d1llXd4{heR^m?ETunS?Y7+NWtank9VPv+>H2;ZM7hlvwREG)-&q$}}Rl9~* zRyftVNP5k&jgG)|T1{R+T>Y$j#IzZv&exEL*aqT`_}~5XLty%*Y5Re12Oj-&d_M>R z_%#W9tYbUyJ%6NP>>Gg_SiYzGz87GyEA|!DgOb?vRL%EXGYEVaN^6FXE!Fj*s%v`i zD+RxpzT=_4_~{3mL}ZrCGGke|j_r+!=DFF-4PrMBNfgg!(Ug$%{DNfjl7xPEZq1Xa z??Ufnkq6myN*qG0eEOT*O2R0?M6>dY%snH;^J%F^E?&)NS%UuAU;d5(8~*f+*}X0J8f7gyP~Rk(5hDSis7|ZXgzpe zY`23!zu$#s%Z<|8lvTOwRZ73optGy%A>7&Zm9pxWa(@T~Fi>}GUZiDMvXOH)=zL|;9ui{RJZPn{FRAcIGhGP+n z&X^kF#7+ZsMNXD&Mt&)At!|&wrUQ}dhnG`?dI%k>uel59#WA0At(x?;$O#yYB<2-U ze>HqP7$EkYB%vcDb8VhK(-;XcFPre4{IZ7LFdWox@yBnF2nV&g#G_S>YYMeDY*Ru4 z>WKA*%rTPCmm1CNG;On}b|f@voWLA$UoldvcFM_87jZJ*I_sj&3zogqQ3FL%4^0IA z&8WVR`r{*LTN-^OcGzxHI)4|n8*imQd&iHF#=?9OH5yU#%|Bg>3B$5Am`tWH6?sAD zBOJ^g_Y)O_lvei@r*rTA>DR$ajgyaRIslf}T*=}(+ZIt%6q=_p%r_hCvDj?9uAc}Z z!#7Tm{JJR}AM*_2RmAt39LFJ{g_?$pddFg|+h_>mw*0zZZ!{6ZcG|W0q~7K_d`+@7 z=GCw#G?{L#Rj)~1?S$*MBvE)Ju}G+QS(ZWdW07UwptnM+%gB9b`PB=y*XEgCS7MkK zV2x!{VBc`YNE(Xl8A5GF;86V~!~7}VX|T+x&=HZ)bj|W0ZfyEjEG?%#vYJ?b8zU&5U&i zCd8g&yU-34vo)C7S+-@4Y!{mJ@g%See+-jnPgTa2uPSr~jbZZb;J|=c9!%5?3mTvJ zrsFD(0@zU~4u@Ew@zo2I9k zbmDK)**AG%N&_4_UTQFAJv;hpj zVBpNbShFn{3_t^2pBMly0_ZQWb*zA)tN`@)058BXAP5+q>D#XAdbVeRBAC9i1B zT7V=p&9rRanP3MrG(Bp9zyPa)MJ#|Q&P1o+#j+g-PXLy<{%8VK!L}nGy7rCz190iL z>If_d_?iwF2W;zEmJVjK%rO+BI#KlFdJ3rJfI?s*jDv}S#|A|)86opHNPUtK zdqLKzA0>o%i#YbolmHa)?PXlL(`lA?MofZpCnnA&wMjT5;nG?}epV7YrNAZh$Tq5@L8H!%H&N3i$mec|3NDCBf5b zWrl`B@O+lqNf>9uB@1}`c}{DZ`7}?8B7&w!aA`$hI7_n?o-Y$GA@HZOBL3JVaYRZ2 ze@ruX>JisUqv<6f3Avc3(D&3PnTE@R=pI1F%Zp_YrrC56f9pc~p#OzO);T>6XJE(a zET7Nd2O-&vz~9QuU6Ai^Nc`$zN%He>3J;Q`3n!Z`zgZAcESw}Xmen*#rmJKV=cFLB zKqr_)zQ2efhc;E-!kE6d$C$SJ8H|~~2Z9HY;w-y;65T#gA4jF`owNLrQcucZZ9XUX zvnAq(m!dnvdPLj%2%F0EmT~+?`un{Ge^97JteeA!gU~-5gr99EdwA&<1Hip!0RD>u z48Z@%{45MW93(%|7iWg9cir7^SeEj3c(qZ6gK7&Xxg7R4eNDR_YI0dtoAP=Gcz)1T zhS%H8P8n`D+fo_s2K{oVl-C0Q(_KX?yIN6p2Up6Vua(>3t|u$k{i>@~iahLU%5XC% zhlO&bRNLLI>}{29wUw2gwi)&`xIV1<1Gy-=iZbl=w!3oIuX<&7yOW38?r?Jj7nQ+P zZ?M^E0OYG(Pg9iLMk_blZlUZnXj%h}v~pNcrm`xwgKD4+l)eVtZib+1zf`(%F(^0J zyTPt2Z_DdK`}={KzsTRO{2s*dT`_K9$iy$(e0;OkK))v==fpb1Dzah@%GhE{Kb0x87&^lhboVc?l3WM zdHdq`mv;wPJUI9$doWMGReA43Jo$B#IqP2Z-oF0k?4{pCQoGiY5i>cN2nu3{W>*?Z zUB1>rNUWWpSFh`AjpN;8hLM;t+wYxmJo8rISdQ&+?UzW{Afa(qf7wC}{g`>9bvVA; zIQ?%}uH{I>ZzM)~rPR7it<|ovFFF1tz~^C2s2@qp3B$h;I1w?;qa%*5!~eY#bk?bN zK$)YjYT^L#%Z1eM#VYwKx3}ggV{V$4$1$it4Gzqo&*eWG`_7 zE57Xgz#erNUgT=Lz%p#@WrypYwAzfwAdY(p5T9=zA0MB|e=0P7bNQbOLW6q&t)mwl z$J9{RM@^x_N~lF=!mMb&76svqMa-$hbG0Vlk;H%hC!yA48NT=R30FrPSRJuF0d;s* ze0SP?-Dm3^w$9Z>=@sfQNI2o7CbY$MWC7Jg4mHafFER2N&yNIA5PQ&e9km89*ilEU zv(Oz3q{WH#_i z@K*C&S2ZRW`&OU^j*Wc)_G1_CLBEELiRn$??igM!wmbH*>B5oY15%}x@%~kXbp!CN zq5&2LU}*!kq-ZoSv2Qp4usy05fKLkR6%1(CcRkH1}X92YLunLIRHOJ~iQ!UpR zVe9}#gxRG7m>l}>_kbP{y>07o&9MMqLlMPwM(zj@w`Y&ci3(R8Q>7(F4oo>IRp9P9 z2VVsk4km*Oly{)2*am=ofYLBD!0g7@^ej99(LUICUq6?l`LJx`yr<7`wV{*p_8dxW3A!eq2O= zc`Fh|db$GangQYiSnA}&A=v_;gRz>bp%#`HhijK)bCTnPBo#T&Y8UjkZB zV}Bil9-z>GOaX5?p%>W%P;~~+Eu9c6b>SrP4N}@+y7JZl7x6ru&h>O*INx5xnnmD| z6j9(7fQ(nTg5GU>xq@$$JsepElhkXCChU^NQgfJP@g8mG5xtq z{FPNCnih~}@oBuD`m`LC5!bio;hv$O9|ANA|bu5zijM`^iU*%%_z6BnJTbH^&bF`O(j^Bp-Nb z27o;A;{B3*|9aRRbi06@tN!rndN8a80FMDzSA|v-WmyzkK+fGBU5)Q|hk%lM-K%Q2 zEvmt;tOix370NZhx{S2AGvZl!EWxNl-K}<7A#2;J3m2emxd(Xu)6)E~1W-*^=C_qnl!IbdZu*-YGm*zpK_e=9- zuPQ4A22z&YlCI4c*Pv5(SPe_9=oUqJiH^GLI&VFT54y4#!GT<49y$azmE7qSlaKBS}Clk$C|Fkm?L4(FJKF z*sUfytu^BgH(;cCQ)ml4pBwj%x?SdMSZ4+CoJHI_w)Wk>chv86kknuY-S!Lax8fPw zka}g~i2V~JqO|a|#gGJ|jqizq8$7Bf5vs7Q#gjd7%itj<+XTmYd2m@4W zhz-H;YPGFgU!OL69O%j& zcj)@P0#MYo9NTepS9g@jL?0=J<+>BV)Q;(56OUZeu~fsd4Xha0QvgSLp6XBlZ`%NM zbzK|l_SgX6Yug%jTuU3fwqw9ggM!czpk&Pj9Ew#J;HQhnI!p<5fZo2XW7`IJj&&1| zD}Z6@7y$5h46R_Bg60XFVn;Vdo(5+&_Mvmfgs&VcfTnbVg7%Sx?XitL7m&GSjjhob zz%ZNyzHbLU^%sCneIHW_0DAHFp1gsl2QU)f^EHa+eR>m4f`Go;?I6IEF$f&Zp=;~D z0pAg>Vfg^l0oPA-ojN!K9xVr-*c-tR0vON)X0McJn~&%vozO+8MX)Guv{wu<2$-)87j8uLcW77>T)o$ z_bd72GEVJT>}QGZoksw#3qn+<%*k{;Rmb0@xFpk6nE_xm62PFgP70i^N)p6D8Yi*q z0)RD$5fFTylk``sd=rrG$SR!$F^0zCiy0wFN&tJ1n4Blj!kTOr7X|qy2lz@ZLbA$} zHQ?B2Mf?DV0l-^A!YTeXh|}4U01Teb>5@4KQ=6oIb`H8N*8$WHbdr0~YD)4b(sOLj zU6n*GNk}k@y)aw`;Vdx=GSP?RvXG_=qj%02gF9VX#RsiiMY7v@&8yd??Ken~NBOxX+JZW=Uy5Fud z8{lZ>WMFSH4OWX}N}O?S1pw8(DRv3A2=;K~=xc8}_kw^}B#hmFIOj9sO}r>cg7A`z zvW(0lutG-Q|CtLNOq{8k&r<9!p`|FEUpN_{|16#t>y-KxOyejb^LY8IV2ty84G+m9 z4sl$cdMjkvB43f^JcK8{m={&PSQTVlk-#mJAS;u3LgwBr&fssNJ!kNr27jR6_`%ic zgBL$xaqr+A?Lm!)cz!SWgOiVo_5STe>6>yCRo}+S`s^vmKH&NTtMrd8%-A{8g2iCkP6WqW2h>fW{WE2jN30e0cnc)6BWI_@LKYAg& z-O$x;*WGD!d4H&Fv~nm{+wDM8hJ!2lTGOs6TR<1&skeTQF7B6=HYl%^VKLN-emNXg z%2w_xTSY09fmU{VJ9*ISUJbj{p}*WIJ^8x3D+c8iUF5I2+j76kUtN{eX1lqT3#fj* z8Em$4@47cEdR2L~>s`r;taY{Bb}-x)0|lDi$#mtvtmw*rr4_q^x)2nlHW+GG!=W;~ z?hWMKa8qmwP0_0B;ZPe^)#j?(-CRQ>L+V#BEVWXp-bX3*`n|HRl_g#JmxsGP^-rL| zOUm^Q%+Xi=?t+wlk^g_lLGnSn!LEl_#y_Cd+jpPf6F!G}{Rf!$ZnvL`8m4-;$o}(_ zp6dIu=6ghcaKU_kf8v|BXpYHeM*6hsv@iYr&*!=I-%;x+UyDxzn7l9jSULT+YM+{% zJV&E17&{e{*7%^=Cvswa16-fR**ezUNe5|m3PYo2G z?i}opx;CuWckX?OBf$L&#rtc;Z@!G1_@K&jx+)HL{a!Bb-v9pAjb~64UlNb-oA=iG zV9q^xL1za@1`sdx_-ZmUC8loh<6<);>I<2)& zPcKebrgPM&)ezG#QNKQF)Q*OYCV#54i>aZO!ktwuJbg(v){lvFIu`AS>7hMt6T2ift0??_!^n^MR(An`NCb-sHHK|7oWQj>jz8ihe$YNc0?(Z^8J1~u8$w$` z=v9qn>a4&?EMi5(b=gzUq{nkC;@XJkn>AGLQk{^@8gvjizG8ZYVPe~*4h^1ddVr@rUsC`sQ-*`OzT3L(t5)E+ z6sc3^`ydFki9Z>8j!vT&_UrH?f8vfUn2Fjx)^ydT4hR-j)RAG)cb~V9Z}7a4<+*zv z0-B~sd}Qb}4gm*>>WvNRjbKnm3;KRFP0%3-sLy~sRDczzS;4-C$JoWD3l^|E>iZFZ`Mrrg(Z-{Rt4}6lMN?F5Y>XTgY^k_- zq>NSD)>Xq+NBYP$=(F-Q#{wik2^C-Ulp942ckiG9S}LGBrjN|@F#X>4pk-^~W5+gW z41qIwWzpMgp z?hq1rvAdc9kWQi^p2pL)7ZAGqUoLDs&5b09rU9rmPo^R9W{x|J{rNX*QzaSkh@VBq zbQ+L!Nix@&k=ZgUG7>pykcA{)kTfT8WD_e1O2Z??JO|KELf?z&!oQmk=NqyHz#gXO z&{enm({+!*7KM2mGqA{a^J<>4YEB=e!iY;nGf$aI>L#d%K1 zELj2kw}X(3vY5coNuEMa)WsoOYm0LdI!Mg5p8y^;BZK7Hl*C>Z;weezD{nqsuAsY+1ZiMp zV87{f9z~JqlhT`M^La2MOR^3;M|H7n&r;|y$^hGWvl+QqmNBv2D8yvFT+Fi7Jf}mS zlY-#5!dYw)FI)I&=vm8vtf)`L8VB~$kD=EhfoE>z>1rK1el{mz9M6eDrX&mVG+kXL z`2xCdXA7LA3o?(@WTlfVNza|=7CG{NBztn?e~vy!j%c&HJ_f<;9vHum%s=l`e@`gT zKNK-=Tc*!s9UjU<|A+?)-YSwkymV7OxmVz}-1k$s*V-Y{;|WgU3*@dc@6#K6WQrcx z^m**gBL(lWEq6UPK8)r7dGbFTAW!B$3waU-vHznNW&>v* z4Elp=?}brTgJQdp`}EFkE6YRb3Q@{?&x@_x8w_`Yfm{x#t46Wa29+WYG;Pz9`&GFa zz-hmzWa@`8=u?`aU-r8F0)=vJHS zVnvy~|?l1=S{`@|Kr$wH2gP@+Z&i#v%FXRFqXMG;Hs~C6h`H$SYr_KR+4#V;k8+G^I z&3Nt4N4z|37`QvRm-ykm+-=zY($pHy3g-AcgK*ce;trE?`HB3vd-XHTuJ1Q=bMebE zMm!xEQQW_9OSwDpn5GA5isx__&tq6V=~8^2&3f9J-`{qQxiiB1%+?puMSHe|PA9}; zjjh*?n*z(e(Gg-KnC8|+;T_wAdoPh6yhDA7V`>eKZHS`4`*of>78s_*)+D}1{Y1_# zCDh=A4u?1n^*N#bb-m3tYBfb@b4RVgHy!2}a6D7zI!97nL_J>O5m$$bEyQq5no?pf z9NU&?YK5aZApBOZ#tbEdq#9hROFWN6PQonDQkM$ENgU500X2B$Sdh5R3#Qp-Ub4{t zF`~=@r!llW9d!_5+w~!8y+WM8qNC19t%oc$cniJzrwzn4Y67&Q9@AE(8sAe9`nAY# z5?gEXTm#0_lK`ilmlZXUsv7=~X zU7d`f2TeCk#neY5Q`cRaW?*m}$23N|W9x=$jcx4OhDHNVjD2W_KC(J#DOkjx?DB=!+GoZP5{9mu6_Q9UGbm zXub(L%f_~En!aObj_=Z37#E>wjgo@;tEWX1&p`mW{co=G!LVCsZo!Q6nxpkQb0 z8rW1+P)+e%%>sMdzOC-5FBc3&<4s)bnmUHDI~pC6=~^B<8H=W}uuKewRCIgdIIixD z&9R}VhGRRPVOg#XkHK*r$F@|%G)E>3*>W6R*A&CFO;a~5V{DD#pzD4k=(cA z)OEtlCF|vRmbfJL6K|0xVL+DDFT%}?oDdI3(JCcQRFZFPOlB6zNa_Y8fVRmJ@clGT z%QQaM;MAMtOR^w-HmgE1BknZEgj9aMAldTUi{(5uO=x&_o-h4neBo5_>YEvfzl#=2 z;)Ye`sL-qBQ|~W&Ls$Wr5{i z%=09jIf>_{a}uS_bmgU<9cB6gMivqu6T={RRYp0^BT}S!JPipZc}&PW_Y)^y_yP5~ z(TP%8bHkd?0sN8kASO|;Bwl_I8D?aW#7+V8VQ&>KeP|l%paPE1%P1lV{8{9rjNO%{ z(v&4DXX+*1(uhpg*Yh>0JS(;{FNq8s+LW`%bQ4BkxT$fj<9I>HEneo&@;xu}D*e5jR_>&9@Mp%&!EM6hdF;$>ct8F4 zF?&95@yE;La9chT>vD*jxi{XAT+HP2)t{GDYbrLkB%m4zM);_&~hO z$mWU2q77e!uxcDtf?)zfGO3vJiCE|tMOVrmT$EmKbG0k>Ni3AXmgc=3DuuGG z@px+h?kj%bt9b$zlV|RQ;+y9Bg;8HW-#y!-2A;i7YCm zSIN6B^=R4k;NMkOfo_MJa@gAqm2$h=^txS|x3bt2eWklCx0`OYrHLyCgPlyNpuJ1W zRe!VDb^E(*G5E!)_l+N>Jf04e`O?&% zkCtEGyIXuz@5AlKxRX!H94=9OEO58^JEiXg)9htWiO}!vJ?;l&&9bQVHQyAGP-p65 zt*dkyRPTxcR|ibZ3S4XSPN?w`hvc^m3rL$0ShgV?adoIDqM9_JbI>ESN7GF}`5b#T zJz^WE$#q$-(-UYSO@U{6Jlp7UM@)@p5X*PlERL0OhV0?P@gEwuoupFuf}6YHRt09B7g z_E?k|)R2%Q9oIT={Y6u1z2w9$%Sgg8VqS|heC4cn`t}8lV&PAzM+Pg15@H(rxRyq( zA<}W7hFq(&94+1zIYz9}yc0~b(P&ACe}VX39koPCB{Wc@DYQ8LWh}hmsZ|)80W0w= z!!eZXKoZN>8w^+PN=>eZHvd52h1M&u;c4URPOZ+ch_54t5o&Cwi)x+DDTA0MViCjf z9DmfL**OKUZHL;s!_%k7AVK6?0-~WwlDMa8I8g+fG!ad$3D<=^#nEP&7Kiwz0OOK! zfwK@OB{q7T@TcF-VeIIHI+^&MI_AVRv2EI#tBpshX6lAzYqqT_jxiaHT-&3pglicV_Qn|cuq@9V z14wrj2Ro`tNrruJ3Mk=eppgkm04j(3?ikaTY%r#r0bHGUj!E4mY)_{FC^Xq*fL(i} zJDz4!CzpVFxxgzlp!pzO-O#AFis8{15)Vd5b3|gA>H|73Jsn$P4{Lzl-91^N(5k zHPh5R)x{20XjBpnt+8l`(@4`D&}^U8-_I7a5b(E=R9Q%D;*?n&Ocx=U&Iy^p5lLp` zJk6J}eL-evk_9U=4`%v2H|Ej#a-KMDQ2JzcxttMwI(1@#vpliG6^VWk&}7xJjuO~kagpXB86fJWps^O#c4E^ebA5%=VhSCk6F*!;X+h%oG$Ez#I_qp57uL)pakjSdbsVgsa1k!f-Gv+K z`64Enmymo)=zsGx2+tSmdEr@rc1fmD2c6uXg7t&oVi^}S;YQ?uO= zBS~ozcvNv1hRgYky0!$#W;#!%3zb06s+*E|Nz9ctC6uv&2G_XwHYSM+&!Y?$ndf@W z^4kRZBt(mn%(+EM{L9&%l=#o`=aUlmyfyZGz_a}i9ufO4BEN;avpe1nPdk&i_kP}! z=i+%fqWe)ke*~er|302B)HHvbR3L{$duE2w`?Svis=+wm5Muu82Liu&)f|?uN$VTx-K^zm%`3JIPg1?c{;H8J7K$dS`5_Le`XG0Iey#jUrcNp=`=t zq3z0Dw;Fag*UI3!yV;c0u#(^JmvO!6R#%{(B41U5lF}jaPLX%rV!M^)vU^?1G(AUI zR09}_Qpj?pY9<*QZD*hw=Ao&zg2#51o=h2 zK)#HTcnbDU9vpl)S0A}?Pwvwb&&+UPJbLm-56{UIy7wwM0PI!&01cs0Rd4sKemeO$ z=1-%s9>%=TM$``*c&NTLdEfdY!+G40&)Qr>9p603Ck*kB__%%gUaeJAKFB9r-l_jFW9dEarZ_+wd>YM1PmR0ICEtI_ z9&%Iv@i3UjNBOLXrsBQ2PZWL_Ty(qeZ5D%03mO8;pe`dKuEq5M83Q1uJ{VF>YyseI z9SinXOj|e>Si~Klv>8{Z_3U5$x4-TjF#<2K?HVhht}L)@?NvuSY6^(&OYGZjwUV}q2ViZ<5qI3bnqgLl=#C4dX4llAz<}0W)78tHc zSp@c+cY!)Hq^T z?gb}^H(@7?$kiy3APQ1fmJr_&5W{eb;H1-KhrBqh)sVzB5UPXX15QHwU>I~F_7OTp z0$WElnA_t9Q{!Z*A=Qu0BoQ&9#R)tuaE6$kP!mK+l8!0oa#WMrQeEh?b+INkgxU-C z4LmKzq((kFMJ=`?@eNe#(kY(IFzAKQ<6EdEi4B=Q;+U^R>uX68MKJKUY+n{QUf~-o zs|aIhRE?h@kH5Y(Vz|x&e);3GXkByqylHZb44(rX+wPDCZPs4tPyqku<1S;K20F% zc&bhFWdvqm2Q(>2U;+3u)X`WU!-;A7dH|D7*RdU&G6LRBwoS*g)iL(1v87o6+x?EN#jtG} zgJX=1k!epRa1mn_Ya`onTpPQZI?^?TrcQxw9LqG_iEZd3T_26qi8<12IMcA43V$y5j0of-t& z%P}E2&00!4WtwYKGdGidf+Yz_H3iroo~I=9=_VZc zx}pg^!!$P+bCO&Vk^;t?x^Zl5*vz4m4}K6Y_053lc9&j9`|K zqS$K;&mc)+IQ)+IBwUchE@PT{l(=CIl~+qYDnjCUSv>VfM66=wrG7y-XYJGeS4o_ zE1n`gJ_WLbx3Bzu`;HuvoAjqQ?cH&PIGjl32|1wCZLgR^J|Yi${UZ5t+9f?~xC3lS zaA0SVfAzEMEE0QB`lA=eVS2N(h@!ktJu)aZ8jVAtTZ?SB*W2PI^N6zTb<1IOt!#Em zsVN`#6`?*E-EFyd$>`Dirv08$cC~V=42ywwwWBT>z5dOvA_HYxZM4m1(37`{eB+LB zJ?w3}%1|k`@=jKYs(_Zt!9deK?kuuTFj8q(!`@KQde_}SQIX&4-m=9Xx=ZRKGWpURB9F@FNS}v~hO!V}nvdd9 zpn4-;m@497^`}tvhkH-J34Wzi9P!qpHzf}}sVQ@fdPAgc0=&oxy$%#d0&~*l`SI5y zB+^(E)L{7+h>;MgeA!3^#HAdsW`dLiQHF0o8_84o>dw(rqjOc@V&2C_L#zW z^a_2&(}D~u9J3;!gp+^Q(XRsK-hoi<<)IqjAR#4pia9 z6P9l?w1qYrNGAv;Ij5p13K9zj?y#uAFnm{(hSayA`vz`^jh4V8dB93<%eKUH>Mf3M zoYV!>ZHYV$3VFdEu_B`W4Ys{c%{jLAINUP;(0luRH9ebVZKiO@8PSa<1AkwL?#+P# zo~o{6j%|z$nnwdBPntzvjW$4L-Jy&2GzldjVhvC9y;Fqm*nvm!dob~#j6vU>P5{td z0VuBl@V0243N=swl{=Vji3tVp*jL8BK|?j@MkLfj0MlF_p6^h;0o1@2pl025Eoc3z&Iq8LBcKn-HyIvVMg z4v1V+bq939l-i*7pfQpjrm00SSb#=lxOD4IZ@=XU3}Y0)sK%Sb*(Vq-_`YHLmTefGwcj?yrp5wWSv3EJ38pkA4&7jdMuzB~ zL(^(_wr1)WPp}sR*fih)dd?W%ooC198Kp0rnU>;kK8B*j6R$Cq{vLySrR*%E=!EfcpU;L$Am)v zS>SktWI+zI^xPy^T`ckx(+m>66&FrG_tK1l^^(k%M()^vH=~5ibil2JGb1S}{bVv- zISE~+r$96gOA=?kUXuzY-ZPNPBy-2oG%DigZ#MzN$jaAaVV z%_=)Lm&A|aX|lA9Nlrp{Rwi`oj~ITVvgve@Oo%~3_;-<|qzEpjE0++w#8Y=^j)@g` z1&PenJWhQp3@fN-r4@|S$ye#DN)3S7PQ1XFL>Eha9^lmUW^s@N1j8fn^UVKM8m&CK zYe*P6IUyGO&aA(UF^rg;6En)zi^6xJC{LzwNP=XFlQanD=_N^KR^+Yt6 zs+(>xtaj81pis(k3kbGfD*dWbO67XHE4SBWAMopNLvu}3y&+&_8PIg8Z2>qdS|tyw zt6s0{X>!%S+H7cw&TU1#8;Y`k+U4MS*zevXo~ZVzCqS3(?wV%c+`Zosq&uw2{_d($ z6sV*Ol&<_C@5Hd&?*($R707nK6Ub&D_hcH=Q2|T`V-&x{HvA&bm8U%nJ^{zW$nPWG zQ@;$+f64Y3A9Q#u`NQWrdDf!)t$={1ExRJmuEM5*=q(&k|w?@J%>FL-PtjR%173o+`KAmtBb@AUAT(1Y&})O)<}vw|58 z=zaO|Msd?)@v-YCc#SU&ow#59^6_|-;(biV9fyafyM0QVN7;`(H9+SBVo$6gmPapm zu6Zg6Y`x9ZPeg`hcRT|~j9wlgp5tGM0?h@1P=Po=&0HOIzN%nGA)dSh0DZLK5YvXr zJOc2~^36RmrpXI9nu}B5PXC=Bj>R6=1VGF+sHcB}@oBIC`xfB5^n!)zZ$*ybPlUe~ zBzhkJaHH9UqvOk?7c>q)_zJNn%zh!AX`H@6uX!j0o$x$Y=erCGCrv?sbM~vRxY!Sk5$p9=@;^V;Q2p!w^`HEUZ|(o_FHP&1``SS0=vZV##5ZKH z){s5o+s8bQ1o4#n>Mh&gIYH(`hCh<{*T+4u9h!6)K|t?V7D-?*sf}b%3pHdUyy&s~ z0QJte8s8M#XYATL5}kK-@r-8qWL|Ypr-3?5A2G9<1g-MCCW>MW>_R!4qf@$@3n#2N zp-y*Boo4$)XN9-?NvFoX;A?DCMD-e~3CBlu zP83hYHk~fg{YL@*Iws8m85jo5#sCP{0Fa9nNA+Mv=z1pI>cbdMXru!6R6{c`wp7Cg z*sf}LpC>Z_qzv%grU3#PO#!LVMQ&4b4O6!?PjgI{re4@@C}PvplhBgkX)fKwlO}DL z&^k0_Bp_tR9@z?@eAm%Nj;=a@yDeQ;$8-&SL^mg~97VScQ^l6&+NS63m)vPcf$lmE z9viOaKs`fsG;;zvK?~MoVp;~&_B_?}Oz2O6u56cP8}(HkbkQst&Hzd}#t6h7t1hT% zjCAPRv}_yt8|%)*a23lLDGt@rbWCGxj{w?_Clggy#;OA*vB#P=ngH&{nx#54%7f-< zpqWX1Poe299AiwgLn!n+LmQ1W0RJ~Z7|H}Yo^Ot6REh})W?+s$wSWeC&|DQXcSJxv zL1?B=YERGeCY}RII)6SwGWTp8(9o-)p)N8_WCaP*1 zu16gz=sn-IJwGsMGEhpOjA%ND01RSJREx4A`pATFQF3CMt|KcC@-lMCa$#3l7UU$$ zO+dXB_QGYDBpS{)G#jR~iq zBgx!PF#(Wm=+nzAF5UBdmab-=KmS#kW=!a$Xmj?f(znSv^+=LOuIFkOg&SXxIZS)pFpT!}L`ur3ih~I;6LVT7ahf<8U9u-L zOdS)HB5^ztE|-+eC@OLRW2K}lryA2;Smi4L10T+t+OSVP5FZVn`9%Ya2 z>2tpVH%8~H#59iT_v97y+2|5@mfB*6GbFG+n5?YdWGscg&saJSv{hVqt@3*}JW zDc9OyD{m^An4zy#+pBGNsBQbZZPnMd^0w@0WzkoZ?O<3!!LsTq8XRc--mcu!Dpxn# zhQQT9xud(9c6VK^fP1APZ40Ume*H9jq)&5MMddpg?v4{?)AzY-LB-ir)Yy=Z?_p%Lz?#CW&@L}@@lZ9 zTd%;SPmTtAKZD|z?Mr@X}O8~_^bsEH+C>m;_@@3 z!+j9EKff1|@cjoU{r%ly4>9wH-~dcOv%i4H5)FK){WKBqFek#}@-ZCYFyXPjU2xyv z6D>Zt^%)n9$4BwVzOV;LohKW4M!d;kE%rPG{bIHO;R_7+f?=8r!@Omrw$HIlU8W%j zE!JovxN-*H;({a|0s3czF(B%+$x4VnW(Dy~RsiB3HE4QBK=3SeBS6gxH535&U+rTb zXwn9R-n0OUqf-`%5(mJ)K~pC5Bs4(i9Zf}f#xNa@=lUYkWa+jc%uU+M+I|MXqvlP< zMGo}fP8hM)V%sdopPVrrR6lKucxaa9NPr?Iw3`!IsIfFl#a`-1GHr_yj+hgsAxXz= z8tcJR>^8LBQXZw9ipje9&kA#y~#3oV{uPDNhg#ozt(15IxLXw;^84M*4kh-=aW zi2!j8&88bl*nshMx|gY?TDn8s2mmd+`*m|T!T`n{%P~}4GpR?sYtnp^3U%2xbkj67 z)ig|~X;M^gJMI`D{m8OS)tcCjs#_y-WK47b{1gv+0Fhm1WZRabSz~>oP3R7*mSyQ9 zK>C_7(k%_U*f42O0!<%D^`k)F&{fy5%(0@IuH%d+E_OA`b?k{@8HQ=NhHFjewy2Kn z;;~|mlrhbQX-q6jHOBCtMl&7IoCuaf0|hj5Z0fqAj^Kj^EErH=4Ej!V7#oaFHDQ#N zrs&W%{AcQ>Zc$GI+te(&U57fNJCwSh1DIBGC)iaD-5P@iCN^kjh2}YXHh`v~aLf^y z$sAjnZ5g_aeao^vu#~mW$zbU=R0qvmno^U-H0VYU7>16qVeGvv0?o(J;K;l2f`IQC zod$;l3LsWz|E&`QaA3Ri(fE5CQ$EQU(VUiar_>0F%wrd@adHj`vcf+?O9I3pqP%7qhp%be0s=Zj@V9Fq8E9@+#aPVP?4obEuHt?a4g z$BymI7jt(C2pZ3;a|-U4_L4Y&z%TO3B^M=0eT#%a5@kxhSWGPy8|lKeETY93(V#z_ zWZ~?R5UqfgExLimDhGH^GGm&;Zv@Wl7|%390ynS;S?hBgSy8bXS0wN(QiR_WzM4;S z7+c{lB6GST#HIi{_b2&2r~*E~+D=BM30dW-GfkFhM)N<~0WlZVeCCsKM(g++l4q-8 zWu*i!!`!h*zE0x=FZ?|As{%)6nv*0A_pQ$fDP|;s0h5$u%N%D5;(AenmsuJDh@UQT zdPz!RtsRmj`3figCN5JFEmLC6rqg^u%rc8}x-)7NF5>v&+$X_2UX9J~E)$|Jrm2>J z-BRdp6_$$yiL*tN*o$HnjInzON+x7^K6MwXG@g;v%m^-v%^KU;I*Y ?2*yOBPyb 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

AHxLh4v?|mF~+XR!)?xP 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ⅇ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 z z$ZSj;u_ALdq|YzUj*0L76?y*l{P%zBueUq(-?r^RWAwVHTDuB*GQ;lZ_`p<&OnGl9=#{u-`Iaa+Q` z)f}8I2S>5pA3K(d>xdW=oO7nT&QKrdCidXsggVEz2GGH@$EtbjR@Y=}=wNr}z{QzU zuC3dyij(H#fnnpUJ2=g~+q5;K{O6eXzGJ{O+a3>+#{1Lv3l z*DY)9*sh5kqqbv>-7@)UAm1*~Rj_|lGk|TF!BWOJ6v`>9IADjWstz38u`E^Z<02Mg z$JMp52@K+x>#=L#EGr#nE|tw4+qKFfDH@)>Z{q6nFzEztIC9@nZM_dYT^;0x{n*f7 zF>PFXz#iD{0Ee&O?**_>OYzvUf=9b$_;xu1JR0=DNs@hBWda)EuO|8EJL3cSa)J#4M7xqVO$_OA|X)wJ-p0T!-k zFqE~ycsMC5Lg?5ZuiCi40_aOO)UiBLN7e-Xcmp+C!#@6g!La%hYvO1)`OLs29Pn2N zz=MX}&SmWxT!Y3ib?kdC+$%H(Nh71MLUU7b&9K`T`#2R3g(yrS-4AAqrLRO83j75cPyKZ0 z`uYkXoJ14owub^Y3M_A?Ic5?YS2&+*1+7C91*tO)lergrp*7QHj)KC#i3`P5GUN=+ zneHU9E=S0iYEd%JbvJcTKMbyr?K!F*xs!D5Blx2>^^CWHKg}IKHT)FjPG$j$u4c&6 zGY7lm0<mw?gPEd@ynT_|HrX_v!XzmHFoZ}-1_Xi61JYt`H+;@GDzVoqZ z_9b_(|3QxrCG}t>n8!We8~MTa_J2DMeQ*EaSM7VVo!E@*F#H=)6!^sUrl;(3seqRo zrMoJ2;%>L;bmVPY*-ERMb@!%+{bc!eU2Hp>ZM*2MSJG~CvlY8?(arOXw3E8Mq9d(# zlCqZ87Cw8f36v}I}C-E4YFd%IP{?QYfU>|kn` zvDo!w2^d*-JF9J{yY1w=0=pr1APn(F%Eg;4EWalyij>1#Vn^(@yDRZ#vnp^pOy{r0 zAM*qKK;Mt_j^H))bTplj8G z`a$Eg#xWI=1{UC@N^xfuhCQsxhjfP`i3ZIydG;k;?~<>oC#)p24`ELD1(lQ<%tG!S z@GLhGY5KH62~|?2D)oAuW?x8ji^>mqX~k9tAxC3WF`AcHo}f>q&W~A&fGa#joYe`D z62#*MQEl{_Ek!!1)f*&7(;P`qJSz-Ij;9%+%2fv<34Km#Rf5FP(KOj;5rRxo0$C9` z9{-(3);sK>AkbBTC;Ozp@m!m19TEgvskfl-!Fin^S+m7*O`B^8%^F7t#N`Qnz*VTW zP$%hTjUBMP($rdZ)r6O)~uD_=4mP_zJ;lN9;KzG$^{! zrg)}tQXx*xKw8%wt46(q`AoXTw}=C(Lx?SwVM&2GY1D~>-)LWO4dGJYe(#iQFh?Y% z59lL?K5J1t$&zH_fMO~H!P9MqXt8ycq6QR0R9_K1LDn$-n$RHYFGNBR`Q{&z6fj5; zmt>=PK3s7Xo;W|h=7}0hwhp8URV8Tp9}*5hQf-MNhz|R@dcYFxA6@b_vca=Tr3!y( zRI79k*r3l|)H*a@qg!Aev{XMiX&PXmfFu`Dk#6jl5EKl(Wa{*ouSOfarbiv3}# zZkxDNr-N&3x|R!vv}KMk0GD;^sT<=MKv#pmKQJT_E*Cn)#YD0H48w`34i1qu9IN#F z*<}mU!MI8~_Lr4;SFTz@6Jf6k*(qgRl|Vp6S;(Hvs~;C#rROJVT`SzZ7Ygx zSQD&>vJ|$f!H5_+2ggyD&Pr!8RB=^Q2RmgQOL0|w0?fnBLCGGj9&K4V45fpLZR{_! zR7KZiS;077{XYD5FvO@>`q;$aTQY{*vSF2GA6L2^jt3Z840BT!ZyjQwp4;E7EY&Ov zRu7zkt}8ayk>(oM?JSqU;4lWpjWd+ewTnHI*);HQxv_L%PUSR-!z7zelNce>T;%cm zdX}T>)qIJZ@Vz6?!hDXSE4^4Z(ISir6r`_X*G7?>gzh{=(L6_JI!_A+g$p$IuU#*9 z7Bi=qTe!5_I(=*B&~Y_I&Q+SuLlg(g*>sBX(1~V+>o5JOh0@S}oue!==f0mU^90FJ zundyO&c2x@D1%{LKQz50v7-b<3m?7CBF96)qDW)MK)}QdB`Ea}3TAURL)ht<7)p*} z3mMC4HbIH6BIHFj(zAS=#_lXmm!|Du*dcRl`hlBzD(v6_mOahF+;JA@otv+|xpKYH zwG%nUBEYyiev%{zStfGKObyX|s%2q{uHr!u2QzE#O?@j|PV*oL-Uca3(pehYC``hs zfueMN6|OS#J-Ui=GxHXUWf;u-5sHy&p(4oqG#tk$cBVl(F%x7iGJob-QJmPB7w7Q; zg}9DuJiWp$&o~W|(02&kYrI1py|v(4!SZuKb(az%3R+tCLXdEk&dpC>ExZ3T8TGz6Z9rU zqaZG3?rNAt*Y4U6Pyup?4IRDq=5{c1vji;z_X^jk^uRKf(+ z6EBS?Xo-r&(m~nUfhN=GG)8k&EY~TPT@cN@FwK+Yo;UN~^h$5$|9bh^oB3z|=}+?J z(8=5XZj_%-+W8}qoPTM0CcN%@QhYa@@T24Ies!~bdK~fPi}bXw?(tx{4|MDO+w(|1 zHqHk}?tXCN*F=IoM~}eM7~ezuUl7)#v7Em=Jst-91vVafd9er7{_{`Og#P^cZ_fXF z_SxI{;}0HC`1S19-~o+o3r2|jh){aFt=wyGy13NN8rQ?=7F(&)k=6?KNv_(`4aUJK zI(fT$Bi(ext&;DGo8B&$ciW95cf_J2%5pDPR^5)Y>2x|9X|~$4M?%@!{8$~H3d8a7d&E^KjMecSz zQIRBZx6Wb0Zb#g-fF#%veRrY+v|dP*UR;s&m7Hlo;;+8wdo1>V*{*Jg;urYh?q?J3S@uh^wLlauhq=TwG!C-P}N@T$IH^0$xSnUfT9n(xw18 z-t@$6v0ANm+x5270R^;gdhIq0-Njy7n4pvAQa8WJZ@OKvEB6Xn7UiuhcXM0=Na=QO zau7Y}16bazV6sg|?uxz6PV5!E&91kWm0ZGCa*$SzL5qq41hJK+PFvY@*To9%x4XED z1S>Aupj1)bfSNEQ(G~{l-mJxLf#WY>W>AaRz3HxD@gRR`vjQQ(Y7}L&-K;kX2zs{y z3))GbItkR4gAsvAv^Tr%8Z#wswn|s(tl-V&2A4$wO|RObxZbU|ppD&4-V=+hxD^#J zgSE8ECD3|)vjGk_J+RH*t_xCLDFtxc?r!oO7{*Rni>n>33#H`ST-kv+?si~2?YFDQ+aBmllsh*osk_@MQhO`G;%+ve<+X$d zlBL~Bk@1C1SH|Yn%ZnQcm!=XsU{7FQlCr~|`K||8b6-1-#_CWV>jSwv9?Q4W?HAs9xbD5lbv#k|PJOcZLsCBvai?b6 zqx4(`$=h+4~Tg8FwUN1;p^!$mmlrx?w7CXLD zc63jl>Zf@>Rm}S^%)Pz#3GUBu_80KW+JW+cx6cTWpJ;rq(f-(qGVVQQiXZFa;ilT1 zUJp*Mhw`{9?WfMz@l#DSXHQ6FHql40!bh@)9;b)W+n4(2-YV3g{Au8451YFsFtw*z zj~~2oKFz4zF}Hni#HT_@_G&cVrB6M-{welwn0wmO?pdeyunDYWubSht!>f-zSDrqI zzsE^)x68-qlt)^qA8*`GB>N)J-Xy?Wf9mkJB|Y&CCCnAK?1F&G*_roGQQbc6qn_;nxJ9>@D}1=$#MroZRn3 z$b3bZ&OPS7TYhndJH;IzDKVMf7sm&H%qLg%y)AMdnDgG1yOky}J+6f(bn`3NBwwP> zH5~UYeTK|@5SFw5;S<>8zWBfU_70Ne6D#{vICXE(<#NB{$2a$t_>dkA-`ZF7$566+ z8)o^rh~{@+p5;mU?nAFf3V!ZEj^4lU?KO^xdPKn=W3BcuDfd8J@6aQqJ@0&aHm2*b zCfDEI3&i?_F#Djc=u`Ai-}_gV_h!t$`=o^DCs^LMzsFl&KX~(b;OphRmX9{RH_hWW zzX$y2vxjy0@qu+d96rByvOGQf<8gLh6H@op^hjvp;{{&7`)F}xXdeFFkqmi`ZX7iD zYPEhLPy*4Mvr_%|_-J`pi+({<_39;EJL3BUD{w-sLlX_sYt31;uhbf+LAKOOWlRSZ}lsj(?L|{)0%N z*_gjz`3sI1FdETlP((H4YA0Odf@(74X^pSaMEh7gJ`j5{!Sk=_4o94b(-&io;P@ur zqECqv;)rV3TStvrm8g+|_&+X+S8VG@ATK7=nbAC`K$jLr6SZpP6@PZjQRaJ!W%%}C z^{m<4uwpZ$2WO3gIy)j>{#349!?GwwY*bnl(X0@B=b&-Gr)TU*^4 zu_{B<7_MF+slztYCh02Ekm#dUyKzdqVA#tej_1giZ??ku3$xZ@`=etvE-EBlVGgPk z(QUA=8ZSYl$2@s(-fprLvRYx!Bj$uY;ixJ@{GPxv5@+y4OL}!GzB)fW7!xAXJ)*ex z{C}wlt#jevRppW+4jXMy&T+HKRp=w8${jaq{hCO$8U%Y(56)?_)~Ge;f6^kWB!5(6 z$ck_%Fl4L7&$ySuaf5HSN4@F+MNrlM`7^%Ryf~l^V9Y-}mq_BIc}P+RWJ{-_N?1)%WzUG_MavO+fs!~@I3=sX`#&Z$s@^zR zQp3YKM_mg4QfN17EvkLObeI}X%lwOr@rdRGhWl^7L$~Q3)nKWLOECYOs2?(X>s5te z|2;tnE>E8EhXPTYpSQ#@Um>_A-C;<+QsXLY0H)Dy3gqSSpSGwjIe5v`KtD8HZ*t_p zNv)Ih1*Txgvw$TDf<7b2<2uhtB*|1*;%9_^P`{|d+vbRq2$pDEoasDCybvzl@U<4* zIHoIYfg9U(x@y)&(og@0fW=D;pVXNX3XGlT&{eWVzc}w55T}CB)lyDuFRzb?dW|Q? ztWXoqN&b**si%x^pipdWAatrzSV8xs_L{GfM2#RO%@#vXD*Q>Er+JEc)n+)tJtEsw zwJOnhMS+desU4mSDQ(EYO;-6zdREzs%Pw&>-4IIQX?xwP@!3l7KB4mu!J_pa034$TKp!Y|M!3XKmWLP zP@x5$xzGgCt@Bo+UAG$3ra;(mOg7J(w9VF(lgksL{?m46Q2D0Au@mw~1bJO$1)&r0Y!8roJVrl6ujxk|p~iB;InUONI#FS$c7-C_H9|P-fJqbl3kmG5N*ofW z3xSZi+8OmqF#hfVb;!^MFNq_LzNk!z8hd(Cs~pRficqhr^f^6iu`Ss5EORDs7mn4c z(p;khhjLXWNRr?$TUF+OJswst(6S@2jk5!$Ly`2lbx55yxI>y*#?3Z$N%AzD+@Sc; ztM=h5pPZ46L;j^i&%`V4p#AO@aY8YdEXDHt0VPldO&lF_uQ;h$|GmxuM;-n)A=ds@ zhvSH|y3p*Mc3>SGMe{_hMIH%NhO5*XRQ>o6wA>*zrQP|1Zw3v4gLb^f*6KV(Q)j(; zg?~@fU;KPY(0_*&!od;ovsHzw5j}}NI;14J4k{w7lXDIXMLsxTJ4BPLo{``FJ(8n3 zO{(#-#Z{;lS?4O;1tWxske)CVfu(tlpoJFh4&IWIaB@hUNyh|FaKzCG zmvXJfPq-G92*25=SbU2K=sFF0IVRwNZs0F*jBYJO)n~x%uswaBx)5n8R>fC zUl8>p-n<->6`G&~5C(aANsKv?uG`eX1<%*n8dalz432VdOyRNNF zO5k4IbghZ4*qUQl7?WTk+pezNqAuV8T|A1ZJC^BKLt7t|&m!U;pxRb{Xiscw>`W|u0Q2B@Cwr(5F_OX9)Md-Un7#0$EC%Zu znq?2n{#eG9Ze4YPLymE{wre;OV02RAA=uVPH85r}hJLUOOYPgHjvL_!W=q2%$hfL3 zTr#!EXgI;cHz8uu+6Vr|N0WVfS^v5eG_YWD}`0NM?05QeS}by)#kv=Sp%*Y&YuIm6PO4$^eY z!L4`AfXjV*XuBBK!o_8iL9P~-o*`r1y1Hsvs;wHBdk~Ui;Gt~0KT&Y(y5SfmTv34& zy^QdlXmSaAaT~9WT}hT&#&EkJHxrk-E@Q6^j2r=S#MT46g2}kI!P>w(Mw*y_kTv*d zxnq#8f@?(M2_9)Rolcv zV|-<-V;pfUPjH;RW8h-d7&$_BMmX0C+r4YSD6Rr}R$-x-PZfvLW08-*ekP^G=;m!$ zzJ}}RxVL;7rGFDf1mkkRFyOO>cMTXU4$=p991|BA*0cdw4K879IUq}nyKT5I6)=Yb z(M>Ezt3*rIR2=&Ub}@#QSc@QT)3Apl6{{I{Hzt$u*v8$U$7G=CHio^xKXl+(vrAwN z%)z*X@9yiijL||YvjkVMWy_e1hYH+;(QK?&oY;U1q?b7bW;rFS2mon7mcK{XgO;$^ zOZX2ROagB`oUwqhRWRVPBkN#JAT~HobR3kAZ<*!7N*l6Dgl8OdUs@8JIs?2-ZLK^R zhHeQgf^#9PvNCwt3`2q7cldL8RN(66peGljoZA>S9JZK+-L<--Yj{|>biRUd10P@% z163JlmN}VVIVc0uoZuqdeYLOIcoaAXVZAtC!?3Jj-_Q+ZIG(`CW09FALLm0FjHSEK~!Yx12VkrC{Eup z-HE1`W)2pns{?GBx>|y$D}9{A;#vmSi#-_+Ch8d2ncz~}17|pysFpJ_uuWo-fYFs! zqW586;mr*bS|unv96&PsRCSycV+?R1c~!v)4ZueU7XzmvY#tlqvgoF)s5U->!6LAT z;duj-jxmUfsg$V{cuEs?GS2qEe$g7x1)^Q@Gw6*E(*r!w+sV+>7oMz zhNa+#hO6H`A|2Q!eY}x$d#sGG-uE4v}#SiAy z$5O$2*2Mb}_Sgh0U!CC1WMQ4-Z#qEEu+p+vISLnsadj0~MmS$glW>Y~=D;LeE|HbR zc43B|ZH1PHyjhe?k-2dF)f}O4=mfa_x3yec#|R~1?3u`PJcQx8=hju?CONKdzKmW^ zgCK~NAaR445@nGUFFf1v1B7PT3>g_p3f~KHCtTosVTOJ@n_~oMltAlXZskFU-c2(U z`&T|vV6q?>IYoec1No*Kdeb=b=I}EN(9%GT<$K!eAX>&|IA6H|#-4UjirjRr8KM0; zK~Xw|vodo~7+dyxjHi<=#|QxtlWC{_^4W?m5mo`t5c(1nU(BMRLa24+vZ40$WiO!u!RxpD6-S5u^Ps2=O#+#vv3}0AadlxFN|Rj!Qff$d2wc? z*P*K8GF|T-n)!BO6~)xa;$S*X z=JDLkiv;9ls_}d>U)Y&9c|S+fEWFCmEHYuZBnI0COIpU$xw5kS**Xh+C!d9`Z+p(% zMhOaS4Rn<*FcQ2r!6HJQyG&6rPTd$?fx5iRbC#NK&Z3!a`o5DcQ8=3=2qzFFi>q`t zyVi;Ux?aWEG6~+!)2Uy)@sR`K^yf>IeTzn@2vHhd+x{GlL0BHjGso9rWTsx4T4)aI zw#V~@e`UaEgGFR50&j+vcrzt4FqmI{kIiTVvL7beID!2kPmuY>jz@_zv(Ol}=0wNLM9RdTtN0 zd3+sAruNLSQZLctz?~-XY#lqZX#!8Lx9-e9h5@@bjN~Qqt(ohg>tvO^OOd+p=DxRD zDBq$ioo3T$;LfK>S^x)ezOZxs_1ur+G>(1eUG6Qs!g|-Ar^RAs2Z7@!G0KzFvlg== zi|p*ZwU|uRV(O2a_x@xSSeY9ygW2f))OPbM7iSMN-$deG!D|)Jod(D9zbi`PINd47PBi2Ob!E1AsyxRbe3c*6oHMJV0m6<7g@N# zg~P*eiE=oiLdUZv=ES=~nO9(xC%hY?$qJ4y%gx{je4W7Y1*2KGc0rJs3oDIuFmPPg z-ilVQmngO0*t10jhV4iC%pdqM9Bs)rg&#(SlQ>}(qHLadgE*Smk%sb>5oKm(j(y*V zA`~c5fH2%w=oiS0{goBj&J0`OG?sl6c_{MZacF?_VPU~EP(3G!!whzE5YH{QK-be` z;Y5as=5UC3%fv*3I1XS(xbf;uHk$;xjso;H4>Q zAn?*K3?pmmp)fG>bcWt0GY7pxuQ75Lnx%efsqbd~6j+Eb|={uVJ-m3R@DTb0bX$&e0=g1BxuzHYX8bns)XHzR4 zpvX0|$WJ_^d6B32HarC)cM-sO2b#j?ft&j=aFW1^a9-MK1;;Mz{5cF7&Z55QfoZ>n zvm2gc?+YiJdP@bt*^x}(iIrgUfw?U=K(kqj;^lntb{U|l_9mUW!8CFfUZ$+=`7A(Q z3J*EU3u5F)K2B)N1J^82TC5N>23;5M)LKpLMOk4TCr2U+bOn4ayxh8u7setlW(ba8 z&qgcTF5IaFkE?JQgQa6M1v{i+1kcd~o4udX$aFK*OG)2UQ_{9falZ zoXnm!zAvT>-lYdcD!xdM7}u{tCch-#U&n*?D7U|o>3%tS<|uiJ9%j#$$-7@*+bh*eHqg5vwP2`$ zg6#+QgVAWf&j#Ete)WqD_`$!%f57PS+EflPXXZUsE(1RMAR;7k@3q(Pt;INs{Py}k zX9V$AAIBg36#;`G{w@FI8ou(6{n(4V=r_LSCqeR?CY=UZhxWdG z%=Y;a-tOD&j(Sj!yS=1pJ9*pQY1wYuIc(L#v7@%zdp+Bz`TnS7lDt25By|t++PmFe zK1!-`$PU_8*-6XPd`fji2>Y>xl^R}u=d3M|>x|B&u z`zR@DE=igyNt=TPDoDq+B!jA%qO?_A-5ihGJXbpU?x>5xCgTjO13-72RT!B$}w-}yMx@`snYJ4fonjk zO-I`8cgjxQWvT=|*N*$nQId{FeWUH$okLsQ?$un=I(twj2Y>It+0sGNv%~(-$@kJu zJLbwU(~qF`_PE{bj&0aRKJ1juezymUxB2$i+36ZYTRR>!Ff<1bs>(*&9wmJPm-Jny zEw^Q5gX5_~{K2yAQP=Z4>uisjmgn0oSlQmI`bORB5OL+G=&%>KWP{_1kt1o6-09?i ztz3pL@bg~FRIRPcU?NBb!?rRWZ7JWw`%D4-_5E=#0ZdhhvZ82vh=6j~wzr$To*y8F zI$)#S$=leh{b4WR*Wfty2v;}l4B)D7A^sSXaB&B(4(-im(>{W}yUjt7G8I5`(A6!3 zO9HIvu=IFr>yj!<$ITG{bUbWw0Nh5&B?SP{*>v)Ql4~1~rURIdppLrR?Y0NV1PO9N z1$-W4IXkqoO&cPkZZs7zumdnEo&2cghb&V7f;)MywLzi`c-(j3O9JTZlw93qu)Thi zH5IZBJipU*cz*yRwT-520r5Cr4-zEhrkzWB1)?JD0g-xMYz^?!I&DR6@Ao?hR3=Fo zI2B-bIOH3Ev+`FzkDtfS46u*Zh+*t(A*@$FkP3vtD!gO8U6U+#X|>M4b9UGLq$H+WuC zBhZbzSIm1_-kbj1&>y>Kd=&NQ&09-N_^*F==VG_Vw7+fT`#6#Qmevpo3w2l+@SF{zs*HcP4!v!=U@9^lup_!}V{E-`#*bH0zmweakRDOSy;l zZz?LEch|pDna?iOZ^Z;(yz7|z@fw`I-O}=tlKSA$`u2pJ=Z5{%jYo{L?*07stv_dl z@z|W77}S&8$CP@qW`1(%w*d2ty0^FZhLyL>y06G>7d(_SxVzvqLC4~r0IAu#Gxg)R zKl$qje-N3%;^8M{?!}4tlmG13KNchV@#Dy{&oA$fdpB;Lng`>J>2?BU%{TRmmit?Li8%AQ_!Qs(B~?e%keJ?F9~?yf&xeohOlcUJs&XX4E* zeeR6xiPt}QeA(>7{R=-~qX#Q*o_Y6#J`W{*cp8H@w{B&pm+SS-7m*)6-CAci`1>Pj zeBSB9hez}{O~^iEKYo$+gfH9>u}8jgu)Kz9C`nEci4Y zhUfQJ<@WOI+o3Bl{HNFV`PPp8%^S*_*UGUKQo5!{)9u`k{ z>hpu-jy?BP{JNVTdxSkD{l_1P-~M^N#(!}nt2ODDzx)+1a0F9g%dN2@lxR|*WPu!A zR2ce_eks&hy4-ltp~zb0Wr^i^dPsJ}MvZ-05gDo~aKalxt&l8DG8FNqTp4OIFSb~k z9-LR&^_Z|K9K(=j6<)Sle3@ZuW&VvvG)oQUKbLu;EVE*%N>D`IWJ)ED63kZ#ZnQ7Ko6R)w$6F59v|)1@;`JZEL;mD_4wRo!OgoTy6G zDtE?`<+lXizL2Xg{-|!LYT0W}TP2lf5miAISfxyoj6jJJUA}Br{$7bEFW@av2Y;wc zS*+CgQk`b&bx+j6F||hdl5Z;f8AH7k2%n|6Cf}4uw%V*t>-CE|MV@nnP|L(B0aM;H zJmoc8X9CMGG(%N{9z&6gTww^2C=n%&M*lbuD-4{n*`Mmsn=zZKRcHhQK?F=FJ5yrMOVz1!V7}ExT?>|8pCk>)x}Gm zW4CpI5zc>nRrl-vv_VsYhDt*SX^JQ@G$|Sa(W4orRHndOswNVoES9PEyE0d%nNGPv zxL3@LQsWt=UM`CxxlR);iJ|C{K))u%3Q3o#l2Gju^Or0qlwH1>jLQT^H;L9>DX~(i zS;M}lpA+o#U(zBc(v(P+Y7Oem?6OY0pgF2aIs;MwcZdx8GB1%7-6zUbhSDhJjc|dd zkQ`Z!2@rGE&|gMwt#kWA$b+Y-AZP0LlX%kaDa(cx)Ui~lPOPcH~**_3j*f^u5 zGRd_>f~&D4TRwMNywE9Muw1oClLSFi>w2AF&fl?Ir&?!O;=Emj>+9-y%7`@(TmgsG z387y;JLd$JeNDc89nn<&x=g+$O9ZQ4aNGqzmnE(gu14^HEG897QdyvyL$3UnB=z^G z8qu#@uvCRqz{O3nSt450oBA0elqjM@(k+Hl=_}z4Q)_ULz%{DQK<<`#nQoqOJV{h4 zY_%p{mR|4-*J7C;hZn5e5?^)bGA&+m0@o5WV#zY)GeWpDdA`*oIEt##kWwtstTih9 zWn*0yUy@ylpc!6oobwHVmPo!#aZ;V(M4=`^^07pTl30dkhz&ssP*WNxicHs^zots0+ze=Aq<`c!CvGnkPt7x@xd=of3o!L6l)jT4V^pU`YNo+Zs?+ zhG0aFAjHlORP$o`s@3AF1X)q^QmsjZVg;&?Oj6sc>^h$hPCMxywQj=*DVyRMkA+)Y~%Vrm1C^jXJX}%=O4I!L@l&U46a>mLmQKrky z7v6Mulgl#+13Cdk)Vg zvLurga^4C70~|!Qsi>t2RTsIJ3~@$Z@t4$#5=qjTSeAuh4Rm3lymC~jT5U9Wo+5bs z%;agRvZ{)eQi-mxWSy(f>~DYfYd`RZ)}ZTo*1)xgc7Nb_PB09d!0-A&;MrynYJunb zLC+5cuIqSYG;<;Ae=$alV)AgJoT*Oz0wxf6PKYH@Cz}J1p z=)p|i4Te65!q5hrbf$O1f4t=j1g6gghm%tXsw~S%8P~Gw! zz3=H*BhL%Go}t^8Z91B#8|J_Zx*_P>$6^Bf#|<+GY{zsg-?FjFu$SfQmI+oBo++jc zLkG41c_4G(xLwUQV1GXxhHl^u!w{^+6T;Ai$)RsMzUSc`++tN=4nQyn^)=h?;}3bk zjg}RLCN==pm@o?r1mB0Y>joM)!m@&5tql$YX+y8C70URU2Ofa;@XghF10CGp`-5KB z9rnOU4i*K9VUPG-533By!#XGEfuA65HnstbgqirAulY8%FK{3>_(I@l03gpTF5sEY zVBnhFz$@$zELaX!>E;k5d3ZwDgCBlq8sX_PM$d)|Alt(T!5^LaI@lGOj)_rYTi7gE z2iH%53+>*}2cW_g^WYz7MFfu?Bq%2hZ<;qa5GC z8-oOJ4R(SCig*xe5CkTAma7d0!(QL&xwhHUY^&!0NF3KSEC4tt1EvqKG}FiWxhDSX zZRqy~kOCh+w{x5z#NPA+%?&NbcWu`O0sX!+=sAwB54)N(&^3r}AFyMFf$oFRnr;C) z@F#dS#M|ov+`E8jAKpS5da&N<8Af;L_J@W6(1+o59T%XF|LI?7+IU9?OxHbg=yV;N zYCR8o&bL4@>}SIbyOx91#+VG;E@S{oU>Z(4 z@Tdy`GeVp=zJ(EKV&sAVfUxNVrs3KKIN7yK52sfMpaS56lBSCj2KFg{1Yb~*ATpk# z7qPR$6MzlJ>v~1tajYy`GyQ(whcW;cE!e~iEJ#0GB_K0!O7>tOs1O!^0|DoTJ*Wwe z;TuL@2Xj0}8@e789`Lp2I~eZ{wg*(ixWi=()Q93>nJNPtttD9kO& z0rm!9z2}2ME^KNWQ1t>_H}Uo2k3P6&0tms6t`j&mxE^8wUmi|7kO+7;%-(QdxQ^5H z49_)nZ|Ini|AymuwlUCkh!gn2cZUwHKCbK9wg)#g7bF6JeW!4P??O^Q32`*QhkJ4k zpdRWxC=PM#7dRba5jdS4TvIH~HBHz07%>fS;Dq>b0u>^3`&M8Aj0&TD8>$N|HG@H6 zzk|JR^afxHScw6Nhiij3ZOD1EP)aYngo~x`ce_Qs^@@;zET~aBK*a{k2DYj9AWKeF z3?Q#V$%Z(1Zr2D*FuVu$cfs#PC2_hs0I=tR18f8TiABQ!hdR*1poDmy%A09G#q=>y zaEfc5)${w{pQ6~iCvAI!;)NArrC`#~@l4mzJ$PK0I@ssqngOCcDA*c2fuX<*`d}dJ zW7;;>2VfoOP(blRt*B1`7LbLL2v^k5I{lFnlm`glNC6C8?13UBt)lKg)e8*A9++C! z#+!rlY=9h01@qu>5fK0QcfbB+_!jval&oVjNv83;ML6-D*UjX4(eLlIdVMMrbx!qD8v) zX7MszCK0|niI6p$Ezo8fOhLeUx?E1?BXqNxq7fR6CO6A%ie}?!>Y*@<*YU(f;dB{- zULlkw3x7I6BgchYn}*{EWl`oQx)z)Ebc{x`AqZW}EPoA~UB@VPrYQ0J zI8EpFbTo8evv`iiIhyBa>c+zarJ3h1R^t$DP?kk0Tu5ePlr2#_Lm}ueN#l8j7HB!m zwCnU9=!v=}Gp+(VPeWZavL#%O%KoCQw4iI(wdl8yl^t3@1N`!<>k(Ki_Xag;?fe-4pe#sC^Kn#Osw1k4R* zC`#rja{T2sLg{!q9s7|VtS1Qo10~61J)Wn&(NBD|3_wo_vI>&K4O4*V!kS=AhZ%xj6TESlX6b6ZLIGqA zN&!-{X$(_m;Q7%KKwwN#cl35X3z8Z7LDL)*r8kZ@8i%vlaFn8O9)_ti3T_rTO7hjl zpS+C`{2Gv;+1w6NH%nq4APGL5U8ig0fLPCnBvgwiJu1H0=Y|+k5^M~y+Ais00m!Y)=?TxR(^`2>3lTa_-OPlasi0o;i)^y z-{;}NH=LlgkavNU~%rr|Vzp5-K4YFTe)-pT{@m^X1SZ02nyKLcSjgfXgUqu*(AxPGeG1x z`Ej|NXV+;GAOOk&^}BE5Xx2}HAdjHXzfIDyGmN@jw2S~r(P}oHq%&luNxDeF$aAdK z(45Eddz@C|`N~Ts)@Zz*X5-ZPC1i({LcUC+Nw7jUBb2_M`WjTN$d0!YKbv?#oT7AT z;9t&tG+sDR?$I3n=K%W!CH8!bW+P*mhpR<6b>_&50rR;xPTy`fn+S~}6voqeydF)) zqhOu5qj2UUNRI5S8;-&N87?U8qs20~_GSsd(jP^msXumBV>g}$Xc|HGj{&)}34$jS zhFLscjpoTHN89lnY6m==ph^HPY;A2id9oU>HxTqVOp+jkhYkR0bAu)sD2lvMI=Y_3 zaB=zr6xj@NZ0u%h-Cu;GWIBS&{wzw8WESP=!WjdcCadcnB*bcs3&Rhf`F!*?m@a~) zze+X`-M9XB`Aal%LGWa>009AL0;>1IWRygZCB|evOC0ze6oQxbCh>T=jZ;5aA_px| zy6)NNEvS=h()S3WFj@}7#L3qPd@xHFka1|T-ULv~Cdn*bLCu&Yvxz&IEa2HT+ai6r zUR}Qn(r7j{5jOVvdYP;uWK7*fv|3I#)^;{ch=20uza4bg`LI&mBPnnJv+R=7DZ0u$%OnC*L^J~A7bWv0^)wh++utSs-7A@C7r%R@X;iB zw4zR)O{mAmVD>o=o~uv~#&f_O&mONZC+CNFyDw2TzG=I=sak;byKOzC_b0UUo(SzJ zXkULad~G}>f%vcf@o)WqLlXbszgW}%>F@sZ-`xEDWq1CN%q$9j6J+Ml8;^bi*W-lH z_WE(Jb>v<9*g0&sNBwxrw(VV(9k$x$xY=m3ikYcuu4Hoi0I$^!eAkb;e#o@rey3{E zrk%-ouE~eIt*E<9QFe#TZg-IPTji)8_Pawz-))b_EhhA4`SDPYZ#QrY(^K2IDz)>C zF3W1R>vY=sPV1;z`*`SJLZ)_XA0?30fnATseMi#a-SHr|vrNXMWi9XQ6%B;#kB3}u zYpT}iNRr%9rH*vms=H$*Ns6>nR9Vv7x+JU0Mu9u+Y`@>jx{S%jZP+uHc5rdGgQcph zfI_OCZw{)Y9_9T3ULCXcPTI+B(0iLHyUsyrxA#hWBj+;c(mqJaHq&%{C#g~nH>FLk zbkx11v@-?#wApUAs+>uhl&go%R#Fa{y4SL!qUY_y0n`Blz=G{w$v`EzD9i1Rr09~K zwKs~iZ)b<>&~8g@t&?k-q+zNuX1*%9+EzD`qO>J&jlMl>VJlhbhRS00V2RVma z-T{KP9R)nK+rvF&Bkf>94mdbM*g=p2_-JDqv!cQMHjdf>mSf)hF;lmg2`>XuJ9|~q zHu^yWzsLaBW4=G?TWJI6g`geO<35*<0M6qvSM}Wie(JmYD5;vh+d)V{6;;u}7VKDc zrylcNo=Ga0n?uwzNow!gV6>8{G8nest6;FYSMv7e2zqbw<4yt`Z99_I0l0vW-40xI z)Z5v1F9E!zwytX#tZr)x*xrUj+3D@QBp-I0?ct~@AVyP<5Spz5F_Qt#?M{~K+2OF= zNm)CWrTuZI%UT;iryiwk2KYN<5IX62kYE$cqu*ohGGL<(+iYYI2syXYWB~oHtxAy0 za0|214;UrKyo0fsw^c1u0e4$Kv6M*%@ay6Dx5A|QdHg(n9zTzt$Is*E@&A$W2))_- z!h?Eh7>^RzFqdlhg*N3pwfYMy>wD?6Pf*YvQt%9Icz>@iihb7d(e0ns=`rG9-wO1* zwC&H1`^ z&jRhi_!7^1>&(wu=)rC3We|MP^;-z9PkHZ)e+=u}40}Y<1H$}$*{5;R7i;^yJkfg= z-U`y7c&qDA+KGQb8CA1G>(tGUU*M|8GwtV#EM{a3w+qn<-ds>|R?t1Jqx<4D-_OPSUe@y$iT8YX^ZCaYI`Mt}{o62@Zo+Af96p?mgkSf`x#fCls}RC zzevdL6^5I;dfq%r^!?^i|1r1Lx3v9KZk}foKR>=4aFN|REaH}4kGmp!;I-_Da{W^e z5V&h%cAp)+zQ043-M(;h!rxsZveT3L)7N9$t{+3ihYtnq8UJnajJpzLp+R#(Rv~Dj zDfbzMC1|FB*>*xr5-EzVlJpDWM@9NovqdnRP+`woGC>mDJ6V+JR#Uj5$hOLH{7P(J zP#0}ZDwP|=InQ2Id8R_qB$W{?bzb9By8dSjO$Ia#Izs!wwz?uz}xDHzjf z)9imBYwSx_Y>Ml%#=P8VUi8EY$@Um9mOGOOqFm;Pa-+m@YKtNhhHKE0NQmsqS5%EA zD-}wunM6qt#nOQJ%l~P_Rcaj5Qb5fTRoB62;)1UKz>tLalKvN0wD6iQNsD@`{C9eM zy)qz}w>_ri3QYCvlA#E`Byd+sNlYB(@1HSc^Xvulj-Vyps4!>T&}7bdrOwv4I!!m| zR|KIjoJxRZ3_%eD^^$r+lt63p&t#D}_dAsOiaQ&|?CUG?{G6`V&wDMp%7{#fCWk_e zF2Q!)gsszk_CKizEM2Xt5P$Df{T4#-4(R`V_cu}P) zVwL;5&Bhyn@jJ3uqr^JJunc*@wM3s~UY;>bU#5gV;Z;If*GQ347=e=NM5)~tq}M%~ zsWasDTLr|jJU68)U9J;1-|!q$xoDIjdZjYOzkDHr=Ub&U*(B(9Jl!O?lE|0NYj0?q zp%|_@crQ(f3z2FObe;J_u2drHY?A`u)c=^)JG8{nj9lhR7kry&)f9%l@F=y_ipn&X z2!cciwSV4#7**)2tBpy&sdUS7g{@Z`i>knBL`*d19PP3VY5KOxu!<7%Cu*8dGLl>{*GdfR`%5 z1x<@0A#>+spF3|?IvuW|)TkE_Kczwa>uTkaB;GVRwTTI^8>-Z#NUl}c)C5~KvQy&3*QChHGQlX2m@LiGXa9^Nm5YkVovFX7 zD#Q!9PLnl)E?trfnx+`AtYnkAst6UPUSiLx+}S1B6wm3B#EWX_Qeai4+@ttLnvT}`Q8hHXNZ@)Oq2+g zJJ*TfixOMsIa%;u@*<&#LaWBsF%y_I$udn6l{11ZGenIhRHDVm4VmXF^eYC|(nO8q zh=yFED`n!Etqa*}lc<3f=MCljT$X5pubmSV^XDWOFEsl_a8!>y!ApNkT;;E?$uJt5!{H`~g$pIwZ%HOJu9oEVEZ-c7qRQ zV7nwsu!A2;%zs<04_cl6kYLYbickfHU`yTwEefUDkZn{bp5R_E)Y}G2@Mk1Xk=+sv zThe^BDwQU*)x2zzym;PZ*gv4^uSlMhNvc$75-*5LzC;Ndm%C=f|Miars!WJwu4Y!q zUotN)OD+_r3S}r^t*UZNji+dV5$KmB%gRlje$CM}=0b=m@Wo5voF;o!xduj3P}Z6X ztyM_!LMT_-wNjNBmTBQisMk1yE!F>h*xQ{zZkTl5&@(NWxu{|N4xlhZNb7e3@(jfY}Bo5lWdV zL6szGT~Lre<3yUgq%VbPYYrxG0;jUfS(j&rM%pVDq zAfMNm#+eIgEb^Orn`NprDb@k8JooR(1b*t&WJ0`T8IGknrq7H2QHy=Ya#beaB!%RJ zHIzxP<3EH4Cqxerc3!)xo=MEbRh=I|u6JS2iyv!zi+Wq(>009&AXgWufQ7vLA1Q@C zF9{7H;;%+ZIVf4|wC>P7v(syGDL{^--%w1QB}JNg%~OQf`UMO4Vb2AlE-)=hVBt|E z)*8S4-LJ!*ult@o^u5rxe9Wl}L(A)jnBW`uW~lp?HFSH9Tl_J=#T-ifkwb4_I@C=UCWO<6E%{SzV93k$ySiL2OihpunAnrS*gx8Rp~j)(c2 zw(a_Qci?(myX)$v4^nJQf(|fC+6oKSSr>l_gPFX(XZT&M;1&vmg01NIfnj+rL}6fC&YKnw z^9DWJ!Y93cWMhJjLC*^@uhhm2?XYk5Jj|6dWx@U(4*Shcvme?(hnJjLb5L(y4M(O_0Ds(Ud$HQO)P{1;KU}H;QUeDBR zTN{{|18fFEM+Z;Z!?4ikM4|O{Loc|sn6Qgk=a{YPgHATS;JbbNr!atpZ}$ea?`hsC zQkYa|c*O^bw&Cc8>Df-;xHe{Z;|)$sRVOeptFz#)x<0n6NF2<_b^^}?7Zo4ed6*kn zz}RsNd;mbu#S#qgqigjX%j`M2Zge%z(y@FGb97zX0&!OHajovyy;(Y0K2Tm{0@tF`-i3*TVvOU7WQ3$ne^Ha9w)l* zYEa9%u3J!VZ9s|%X+FfCaGMx}2BvHKxU6Hoa6#=oF_a;TYKz%v}E5q{rrhWIT$!vGicZWkQZH(Ybz=|gMaga3@;=ntGxT__taq)iXXJEVYR zW5E_YHw-XD8(=zgiYAfgO~&&{=%$Nlm}HA_xIm-jY=pAJjnQ-wrz3RZP1h*ONA_s! zqv>XY^zJrFlF@v!n5QTRlUa%!XNk}>emBd}BJC|!XfX-g{u0eoJ4KiinxgAvm@H;% z6oaU66kdB{v_#=-y+QM3;N8rSKbqO;B1VuM5n9d0X`CUHxzQvDC&*7jv{=rP@gk0g z(J1kf>vbF_i(ooJ-aLxJ5z0~IEmAZKXV=kqoCMeYEOy2bLOnM@HtNOcBuqDG>ZJ2Q zJWoM!WK45}-l1$7ha-QgAxtz&*Pd?AR!i?@j%G<}%_iB+BC$r^#C5NcrhBsq=EM%- zAVJ}DG#jttx1;f9hLYtd4rB1hG=b-8j>gyTQ_OZnakzGG{6#jMUZ*!GStKhopQqCW znx${S)k(65$79>GkZr>gKQ;8+k8jW_be3=D;dqrIe*#7XGn6h6B-;oq&b>6AP4k<@ zYCc=~CR(nCXcerpv7e&lY`k8)-!3grd!J?bWaEx|>&Tf+!XUAu@jH8l-p{U`EGecfDibuAyNZ&zrkKe{%e{wy*6nr;aj8-A?QQ{z^&qnSX zfs0U-&8C>`{XXd};3*zYH01lUu@OaX=FMh{5SFHB8=>)PlAvfZLbD7)-s`8~a%m(1 zavgu_`U{i*(&r%x<7gI7(%E7eBFvVbMw2Go z7n9Kjb`EzxWR53B|9 zf>AnK|FDGeyGd`BD4#9T*%FyyJekFSDi>-F;1oIY(D9+djkCa=q7~$6n!m&6A7s~n zwbfu1r^)0OD8SDcs6$XF;g^*S#P8aR(M`07(oHy62FuYFML`b5BwJ*d?Y~Lj(UonY z%$p;Be2r7X1)1<`6N2&p#rxf6auY!%c|VR}TWz*Z1AOYjDuV|OxfM=mhuM4L)1_afDBkC}emiCI4kPvs zchb5Ws=q$^=%Yb-Jet4frq3|W|GLLFa}@8e+yCFDVLvf`D$)7wI0fq)d6j=HA$kb= z+v6#U^m7{Ch2gE>YR@csHq7Ip3n5(2u(VMU!{KIr$OuyYI`FUO`nzgD0S3a-D~QhogXo`Gna~{ z&)Z{1mfOedh`T=Tw%TsnQRR)Q?Dfs=xc%7mInU(%QImANErGCOd#AQLr=bb3Rt3XO z{hp7VPA03nZMHo~$1Fc$zO}5hi-ym;gC>3H_q;o18x`|=Gd+U^hYr?8?Z91icWU^o z;7-)Kw3T<5+^b{?D1GeU4#=3h-H{LN!%@xiqn5Wf`a$2yV6diVU}?TrU`!(rP#wv~?3#>C=}&7KdK^R8>4=zar^%5HUg-pPmUsoQf0$8NJxKev1CfYANs z%K%Sg8t(kO(IC{@T*a|cKX-mE8b2$?t+LZIIg?~f>u8#K+_V8}pBq2R$5ZEL-1r%= z)yB+s1(W8F2kF%MxxE3bLaeiV3m|KQ%)N5ZaO-Dvo9`8frPjf~+kNT$EaA@2xdPEr zb%@aMs2+E_gH&{NzT5g)!JVJ;-LVMUZok9bq4(;ozR#PY?{l_kOJG3`mg-r-`UiXW zdvGmmg&RA6>H4gKt!l0)fVPiqpAVZ|`>=yIyMw*~7%6R4>S*mulG>Pi{ki9}l)(-C zZpY{Sann)un@+xk*d9B%x>In=XP8{{d_J^QOxW%m+F;%R<9nZX+RCk_&)^aTk{Xog z;I_|=za2i-&*SIu^Z0rEJboTOkH6*dXz%Bz`Lz#jd{0->hvVxUHzTkfGH# z-&&}D+VLynIg_6tvwo)CJu3X84n^bWC+M@!jb{k7w^g<7T^K$~yuIsCJ(Ia7<@=k(KR@(BpmC47_=qR*G5^oVF+b4*A0a`W)_pPT_wP;J|6&~ec~8wdu6tD3 z!J{{yV9(zjcW?JUbwU4fL+JDq!WI1$+zD7eECss;78jEdfNB$#D9F& zHMiYzpPTpyeep@5xTEmRXCoeo`A0(N`so=@EB3YVq4>(~dFByMuOCdhyXP~#zwftg z{z(n0Z*v^i5AJ>$k1G2(>Gla8=H0Qr|L()Rb>Gxg`U_t;yS?}Gi@rV{@`ImEw3|-)DnU~cdFxY55y<^HzuMYG4q)3?q!_;A~0+1-10 z#_eejrWAB&{5Qx3=hFPk^5s>XDAj#|sh^j~tB$Ca%jXq}6IxBa!IBh95;c-xE=WlL zWPan$IvCJPSEt*Gl^7LnyV5Of@(Abp3zwLb&cm) zrh4^~BuX@;yd;^k7Yr#iMYSq%B0+*GJSD=8)H%aka>NC#R%HHCz9ea$p)P6?OH^4} zl6m2*bY<`*`Y&lwl4^CHt`K6cB)k%31-H=ULDT<|CI5gXS^`586z;#wH7SCmh_WaX zYMHBFHVKZ zDdD0-@Pa5eOT+8>xz32M^%wPejiZSM)8d&5$$Vf1fvC77Tdz?h-w*|wV=35O!_>73 z!PCN7o#Bbrd8=jp(|SvG2&F7gqA#7X#I#D)U+^L(2ouyRg5XOff+~@vTJ@r`BiRO3 z=1L4vEyrb1V5$T`)Cry=swBalbEHgF!-m1%~Vb4*H|t~7!;r|7qG4Y!3p zYc)xdEb(NY$pHT%S>^ty)F`#cOG#`jzqdL?4X988?2(C;Mq)IbTL&|-4O;GS&q@@>7 zJ9zrM)onU7Rg+)W|2xk3D}m)p+`sxGZT?qp_(qec+2sLMCsnmvde5kr)vF4W7p5jL zWrAgD0?(i4idgNFx=5W}k^;w2ub{}3g_=Ni%63Vt*p(^;$jL;OWth4^q@&-^M9E}- zJ0c`COIOG;M?ux$FGz+GnhZ$gYUE3(Um~c$mIUsC1h-TH3Ovow zU81F&f#w7SsZhQIht~;_P^hvC$3VPT&954Kg_MNy zYgVKn90Jpz*%mQ^q>Tj@3M?&4WwKh51+mOAP2n~3D~_#bgipJKNR=y0nUhO3s5}hc zWL`sA#%7a@Bv5j-Dl=R~Bx!=-ru8yi`hjN~=SpMRcs=+#XRoT~1Dc@Uu(dJ^O84VR znGr5t2qoBvXhEfCO zXc=e3iW6lQm>ywu_%d`{2BMUFIMO?L4iW6@O7DP^qZpC z75JC68YQ(}aOF#Qa&T81Jif@N!7)|pw;b0J#41&$B(^st$g2jW^Fo!b5nM)zRLM{( zEX7vJ6{7y;)sU=_HpL7f9FTJ2Ii*qymVPNHOq05RAdwYXELCU*0$gEAW%jbn1q1~- zDnbO93f&~u5($qc77$XeG8|2^WxjjH)k+-0zLbO-3*Lu4t}5jh)iZ)=kt`*Yn70$C z4$(O;QS=!Af+ZOO9@>0Efd>Rz0{6)^Qihzn98#le2JVy6E0LA>2KU?F{W{PwZ_F_q z-^V0T%+~as5Yr8dj=G^&uo5xT5fj`nJ2A9F%k}-RU(nV(*Eh`&w{^uI>)=kYaLe`w z_7Ib*G4~G>%!UOy8uPgZMZ4a>2u;l2!ke05L7l{`*1&c2?y%b*+O`uE+}qF#LuVLx zq3;welAW+%%USSZ(8Ijzz_LTz^Dv(eHy1XYZWq&_3nH8E;Z~|R1RVTRe@qz&$x z>3D|LcX6Xl-xv=4VbQ?Y_1%-PX6RzIir&Kgpx{Ge&R);*?4m7e!76nv+&B~y;e4&2 zx)wc}ecUk>lQf;8SE&h`4uig_)u{(Fz9tXOsj(^I78R@S>!d7Zw z(dM|{y*qlnu5JefCW?&2QypBIFjO_K=pzm~n{H863Ql-|A_!)n!`y*W)ECcj`h5Tc zXymz0*8tO@c-ege(z72J1$Kf^bMRpS0c1E>jak)0%*XX0ts$|3o)zHJ8gM^ytx(4a z&EbhuUZf4?rUO{}nhO@W1?{+N!yE_a;?Tz3fsJ8kIquMKz;@Rfn$|}KI@TN%#@XY$ zr__Uh1zl`;H#pIxPuy|va@WBfjsbOU(dQoDG+f6X;wHp}8X?pR6Sq$G{o!e?8+5~> zhj*xh+@9St05b!>U`AuYE++RvVpzDjxTSUbHq>%#zvUVLNXHFNCmj?(IJM+1TApKK zJHP~V$BxJCtR39w8wwOI@BR=Uq=1RyxFt6(Bf8$VKAHgrI=%*V%`yz!1-Tnw?L$n^ zHSIy)f>Hvzx*kZy5rHbDWAeHaxEQRiYuPsBd>>{F@U!7W^2U_}mqo9Osn{6CfLeI% z*r#(A3es_46>Y6U%&f+M>FEV!8$Tu7Zo%gd0P5DT?+h^~-LZAtpdKLMf!pwT1~{z? zvcBhZPaW;u;#3O<%7$BPf|<(z%07O06)bWu7yuYB>TRc}QqBO3E6(6>gW_QZiC_jj zx9gY%`x=%T4z2=)JMp8y$6cz!9-zX()f)4u;VBFW3mbcW*T6mNyYRHIy@BlvT>n&} zFuvfy=QsvFN&z2Y0tyumH;j&+YvGdzto{Ip5fh-VQFQI2ZH{KEWi*~mX5li5*E57> zA%dBCyx5Kx?qsx{xQkGaC&9*91ZX@OjnGXz9ZqIRwm{=}?cXMOqP>LJV7YR&1mB-W~mo1 zX5J)ElIy^og^?Yn{tsw09c9bqDAgT=7Cy|LCclhkX6Rfyd74BM5HLj}Cy5fr-x$bE z(PDLtg7JKet|K%@@4{%|&5}9pTMLz8?#~y?H7NIsX}k>cc`%(Pz8@oNl}v)k3@xT9 z3X>@Jqos{PPcBN$h1a^o zwZ`deIf=974D)~U9A&F$x*VZAo{Z8(nxwd4bDF#z&BrT*Ceh7xG!7=Ho<6)0!+V~f}q1Up-H`Q?xDqUbd9_)P2WyOc0QYA z#`}1jx@qXVjZyIbwD&DNj%-_6@eaSzX-7IMo%OaIw!@Bh?07$HN7z~EI_KPb)o?DL zE5SuQ0VYT-m>{7o(sZgA@txMF%CVH>Y*pY6M3-6 za_p^_7%lNfs2$EeEFAwkJJzw~Uf@}Du|TdL;EM=!?Z;_W7|BHp?VuYA9VfHP#T=*e zr2)mlVFRy73@%=|u{X<+n*9(@=5YVU0 zWf(I$DWgi87UMd zjwHo#km0aE(PH7xBR`5`n3udDgPxq^MHtxrM`)Dq$=I1^*qwwXg3)Rwv*2S&qWg8I zPvl@{5y1d(Ba{tS3n!Y&N#x8DYw4$##oYgBFF!7^9mf7l4}46(2@De?ScIgz&$Bd` zq;{HQvH!!;2f;%#_u#oYGYn%q`+yU&urUqnf_4`k8QRXmHrIAkxT7)j)I9he=B1Bb z0J8^leVF20!azTYVyEz+i+RfrppL*?V5o){`7mpy{sq=;HHtlWux1yLig97UR7|im zu$wL-7!TuF8v2%<%=~%oCV7~o9`;h-b39zka|e_Qqu&m^EJ)1@cxc2XDBp`B&4cM6 z{gB{1%b}&5)WQ*pJr5>UFSlUeIlddXNraYx8z#vNdL9lgLT~1Sk_ppuXlCIDICkmd znBW^=e1Q!&Hq#F?cm{o3r&?4-j+2=#w_z~l1vI=i4bup;QG{p?Dvok^uK7O6Xy$=Z z{5*jEU`Bq5=kPSNeDo2zL=+_nh9^|u#z~agFaaZ5C*ul}2PB4t$~T!b@k9?c>X58X6~O&Ib83bcdB=igtJkc(4B|P@x>V{_}p!7#?R9P_BYA9?w`+0Pe-5|&nh_B zm-}$u2by>utM%>lK*;kSHtvT!|4aIJ5%LTx99|CR0q(P+1ww-4QLzm^a1ZYm=! z9&=WH+-3TU#Xb`Da(Gz1DgS{hZr%QPq{#I1ms=qh`~OA<(FeC~CAM01db`#oiP~+c zM?*&$5645IewA#`|-1(Qidg z>>o8(FPRqIYn*VkSM`=yW!JUJ8FN+ewP51hy{g4n6QdCv>nn5s#_ z$@fiBWH{!S8nt+qqN$V9rf|e{sn)wHTdy}-LW{3gCqd&ib4JsB<*Zt()1zwVsMa`{ zz7gvpBTL8Z5zV|18>f#^(|_}a|KZpF`+vUJ{<|9e;vbWZex%ywXkux|Hp<;} z2boANcZ_VrT^Irwtxr`4 zjU9VfMn{$C*vODgV?34z6PsY>I!Hrg2hu>6R!#&2jGBO*TLdKC-cKLKz}at4UGKaS zY-uth7z9XrK%lAZspSw*Z5t#bjsXOlmp~=U$kYuRj!wybrfrmaAmps#*kiIAT0*9i zEp>uiOZ);HG;&mHYO4BVB3omE7!B_r1aH|iEJZKtLH1A$0&Pxw3UsuephnJEw+($T z)HQt%L`(8F4Asz8U4xlwYK|>uJe4Q1 zg&i*~F2^KWXP+F+yK2 zM*b`FdExQh^&RFA^{!j2rOxi3 z{Vv`~pG=R2#2&nd9R!9wmL7Nsy1e_^Q9k>La)l}<)LHRuhpN~4n#fW|O_3GfPbz$! z>oBjoqw3p6n|;FxEY)b&*m|WV(Ptb}72eUTc+6G#+5nzcL*j8ks3{a@MEDA9WiZv@ z|LGJSRnyUwc#o($JbZ>$=@K?^O!A;A88u4R3VlN6Sd2nH%zOm%Dt6q3wZeFACj^)k z+lv&(u8xc-jO@^Ka304l&a47v3j_PU?|5P6IfwHCsUFM=q}$xg3xEHQ-sSmk{&W%j z{+})Wv+*Yjm>0@^dovcxp=$1JGGui74-Qh}(?^+9(wG1EKbC!&fxayL^S?X)S7)F5 z?JutTa)tdJ^ksN_{x%FFs@+!B9l6(SORFonD7KyLO3q=`x>?IB0zd?->Z?w%k~^}j zKwp>p9eLaC^w#T@v@PUqXD!KB%6cR9*LgqRO1+J;+vOXA=GED*SIR~v%kP~Gd0t(? z@YuqdebrmF<*S|C-R`uVVzB&pE?AZsVzg9yLNBAQ~Ge}8rJAVM+TAd zw!H23x01Z;b&FkR)9cAace7GDU099F-79&!D|$uICBRv`?rOW~65ynjtgMPI5q$#^ zudjL?_$=g=1WWv@UAGMd<@qX?@~wQ;U9Z>Ot-LF?o87iwNV{SM>-dedk&8aa*j{b( z-d0*~R@;@*-EG?Iyxm`|K~3^zz1^&e)v671!Frvqdz)>$y~=lOd6#!~lCr+qN?U0q zb++5pYTI2Y{q1VKDP;L4m@s}$Kc~O)>5-@2=)uR@7b3Pthqrw*@%30C_KcgNz71F6 zX;6@HDcemT_d{R?$``8oC8?ex^~2X3a>YNE?yC07f%H!_#^}(}_1uvBp8^?Stb9d* zUzhX4zs99*Z>i!&+oQX39KO2U=gECW!1*m2?Qf2byYsqz}qYp2ry1>+!Hp{R_ zbzbBuZsEcyq?kY?Ey=OuZ)ZtmIRi*y4Des?i;(Re7iI z0!;~Yz}8QAnx@Vvj)jE`Q==Ue>Bd+^^bHttxN~^=B2KA+TcO#d(thG1?T{W|~~R+7|fpYQ?=^ zDW-NZ(%*4sR7E)wm`cCWt%{s9p+xE>Tzy;_QCyYgm^bWu;p7#?Qs+#y3RP}#LYt|K z8hnR?HCU%peFNF)*D(Z`u^eamEZ(v+MjT5HMu%|8SSM2c_iAEX<<~dvK zinZ1;ROux}iLAh|Or_OmoKPn{sxESDg?m$D={8$?&-`t%%hoBD?pNBvi&0IaPv{EM zIIp+H;w!OHhjT|fC%hdoUcJGeu{8Cf!_|no-tvultHrfM|AJBt;X!V6BU^YmGZq2BQ#U3*>SIZmRPCW!>Bw?vu{dkVcq^<9f? zKm#)`C}OwenrC#a+JuD}36wsjYD%?z(&EJy^+x2xO6|QsRk_Ns%hQxhH<(vUwcQ|* z*CGj5g{%XjVC*K0K-1@5(gE$#98V}WtKtzSNz9viy}~lb6va^VDGiHg)0|#2INC^-Eu<0ubK(oH5{^As z2|AjhYX%938W7j^(x2Yc%&9z5^odDKwq+=lt(Poj&JCBMrk24Qgg6pD2goFGRpbK0 zBovp{lmsdaN&~EATLj|EwgyQ!U76^vR=05K4`_Yi3qg$ACKMt@RQdmlDHT6T(5i?FYeQ^+Q?g*K@W zDPk{&VL2n{4e+8uI1|e_FKw(F$R3&{^Qpa$D=Ie=rjrRGRCfbH6KSEbvkx(J_8fh> zGJ&pWmo|GsS?Fl++nMNSfGpb{5{aSzTGoEY0?tm2iB&4rwn-S)P_rkNZYU(SrQ~=E z6R+^Ki9cJ!I2yYv7ZVCoVu8oV(=H+(PizM}+A73uW<{!-SUzOt;q~%kkOz^0txQ|Q z6PyLE8~JYW(G9JIpTv>ld7gWLP;6V+4`!)_T#O=|Uj)Y7ak3FgaN%3w+#$wt*Bf~_ zaxZ+mASQP_^4(~S>=6#*D8Nwf*33C&6T^vt>g^z<6$AtPuU;1!!p*V5k8nbwjV9$^71TP3v(~NM@Mc%+nb3d_z z(84ycxu;_sO)Se)V%M`EX9fEqMy73C!q|<53BsC5c$-39&!+P{G$N;PA}C75mYzEv zN}V{v7m4A90bv<(mniy}rpVC}J(-5NW6X^-z;mc|||zAXdt15 z%}g)yg=_oRb4fFR&}M#M%+iH}X69_EgO*}Y z!yHEuj!ZSf7=h4^>84Sdc<~Z>s*0zUsd^x`N&Ly(42Onpf*O*d7}*00TV61*18jRR zU+9E1P1o(nj*Nv91`ExD6Y;bNJwFKSM9(m?XTIkJiw~je7jq}`JS&0ju*9PxciqHD za>IefR6`TbtPK0U<&2>P<{t7>BUw5A%=KnCv}3|WmD{Ui7H2biIm2!^i~VK#5ji1b zU+s~QWRUv9zwr9{fS7lq zr^q>iYspKU$@^`ad%PjUH7(xDaAQag(WeR=xZ~XzlgBqFZ|ZZs14JYb%RCNUB3-iU za+7;`Vgx@Q-{@O0_- ztCI1({}JAHPIUKITpuhu(%ps+AClrzIx~(vFlw)t1D&QlXvZnvg_r!B1w|GDy}yDqM!GqTrS$%tG>M6 z^^|Q}>UR3Q{<ZOOQd)UH7D}w90d-tE@YHQcNMsy-l}GBbXEyYV;XZjZcoLI#&^UOqF6Bn&pq{7c@szs&%&2X;(Ow5i6{4 z#8()R`!5^|H!%VMM5D!5G<7U?m={MZrExVz5-Ey5Z!l+X>7%y5b}5FcRBG@dEl_X^ z!5(Z06~1wLD!{?xcD*C>; z#nK`O!_jTJRy(g%k1BNI^hm7Mo7{V@&L0b6v&p|_#B;I5v|99u@J3*y=3C~NYz?pi zFI2h|$4~;xv;E2|uEw5EU)1RePjI_Lsxj=cye#nS8)o>vQLDjmj$^p0P;D|$YDaoS zwW)VJMN7x8-W;FQ*tdVZ+jyf?#175Z+4}3sai!C(3N==!4_LlSQ*E9SIibSV#+_rD zZlAQobE#pTN|Y$U`I;!ef#4NieadiQ@$cL7_Qc0m{(Q$T%wMtc8e0)N3<)p`(nF#-mFjzOVd@RQ5*9PsP_F4 z$DQ_igJbq}<)cA~XG@A}GH(C?Xbd}>9?C-TjsaiQ3!4XP00?qS$ovzczP3R|d zMWjGq6)3fFEHdYBxSGK5M-<?O-)@_M~*RZbOP2i(wx$P zTGa{A&mMSY>R40T8JpyCMLo^ro=9-?oo6c zgtQ?6Rzqk&tnmc%${CF(kbz}PO6V+*d@!|b0v0zx109usTq-i4#$y82Rodvwyi6jf zGjxVi+XOKOkOgD|+R+F^*?>T~!7T(cYk=g5RzkqRCGv2plxT4dlA&f~=K;PUWSFuu z9@r(84}lCKNM58CjxvSvwE+S3BD)m?2@OOW5;L|vwk=g5z&xgd#v>@1SgCcmSXBw^ z8G#K_$B>O((rMTRxe4h8K^`KG852+i$Uro`hk8N-t2Cw$N=r4VZ3(SJfYydcC(eol zl0z-QccxQYH!Ns!g;=cjkZTUX$Fm0t*=;GYt&lz4BYuJOnmL)O)3G|zpz)#UY*Q(> zPxhc+x?zq%&|ztIha3r7m^vw);GKaARf9ikLcpu6u|Y74H0WUj;K?Go)sU(av?Ayp z%4FXlP}S*FQB=jU$vIE~i3BhSx*SOaxCwd?B6f3xXQ{iw4mKCbVv6R4mPC=MVGF)mz;%pftMfvFj3g6ES9%fJ@WLT4fO)d(ZciZQl8 zPk9=Jp=%_wOu-(M<=}*XtzZvliiWYC#3}yZ&gYS>CsyVrRvNDgj506u)7bU=FtjrS zh0c;N^}{q=1d(Sf($qAgY&OCUGF%@`@FENY&%wTnT>{#HP!cVDJ202(!o?Ul^U%Xn z&%;UK`##oj7MO)T!vRQ#V-I65TN$nnwM8DniEX(ANCfI0&jZ^F7fx!-+zc(|iBC-A z*e_<&3ASRxzVK#2j8Qss@THcR9yUU}@bMDQu$8LwaO|ZxSz)9>t^rh7)6D6@@namu zri(%0C~?d{HL!|;;(JYvBOK+JjI6NdC(vkF1#7& zF~T#*FS^KG$jNh^b%;U#G4_H56g<0#kc+$!L`Q^%k~V$Zj|BnTal%3PwQ zGsELlpC`~gAoCecU00vYeAhS8JPobD!i$uc!*LcZQ;^pSqG06WOBI^RCwM9zoSpdI zC`B?3Jo|&4x^_IkhC0^dNS#~oEsK}fwNaR_6fFwuc;a}5Y`ez9%yQ74WgD*MEJrwq zp||1y+Iksy2WIkrE0kvPf6qS0On%4YxKH+jarSUXCDH4te`CfBg1sf#Ids|A9x=a0 z-i_JW4V-K9C9zkZMRgp z5geL+?fs!c8~veTZpBY0pYJFOyc6HPH({3tty_oP{T+#VBV_vd%Jgv%g@>UkrU$b4 zpKg9u;CM_VIWXua<*_?x2oD;#J*ZK5v$b%L?rm(`DlU4+D*pcf@&XWG>hu5rABzYC z000000RIL6LPG)o!e#8eON=ASnjRMUPQEL%SXJ!mKHZ08l1wt6k&#bkk}R^=-Mm+x zxiiKYdvr&@5k@m3-^B=XHC{*-5KvJR%#}9=yf6%J4OkEi@4UCX(Z)*yhIa!Puongl z*brbC82^#1cU3>{Il6%7M0c^t$cX|KRWXSkIs1 z$PfMSd+g&lh`$emAWpvjd)W6=Kgj}kJT#mJ1ScWJevsh^hu{At{{Am~4_-%@csL>H z_d%GZsH5q-D}AXM`fAr+uhv(ZrfoOIdfDA?wD!taEmtd}x8E8@uWjtKcDKFT8TxLu zX>au2M&E7q&9b-L>D`{WUv5|3<<(}rGq;AhH1^xoZrQ$S8&}2-9=mH@Gp_dAZ1nbK-|KBUyZy4e>$TS#V+jE*x6EMIFt7AYPhWTU z#;V=v?0c(?X6*Mnqq_pLU1M{#2YXkV-d?SCFsi#Tb{liK*=(-1?e>NxrWtFP(dlSf zce7lsA%+eZ*};&`%Gj@V+x^Punmc2sx3~IsZ5TTPMlH>?zTRIMoAt_U@3-1!sq4o2 zstbd+o85N3+N?XevDqwFZF8xuHywy`xoPjOcJSI*b~igHOJ{9v&GmY_GK|0esr}Uc z#O=uiH`U;gf+cKQBs&yUnT?dScICwJ|;FLQSJ==Ji`QBA{JUexC%JsN|4^%tv4 z_PJH!TJ;Lg>!>BDy!x*Cw-&m>jd@w%jv6W_%W?(rJkK?>nx>qIVi$3!(h@7s@r@#L z60b_Nqf?a=#c!%3S#BQj@^MXCpYkuN!YSVtg%eIfRbJ49MqQRgsUb>hq23hK#(ypd zB6qGJbS(at%?3KESkkFdl@;y{YKnYC6;S65>Z+osRrxcdfDKd?`J;*~YBja?0?E86 z9U+-(3F!6NNEch&>tpB?c*zy{w)DDzcuPV9{#37`mdL-9b5&Aaz2G5sMff9OfCSYY z@m;>k|9fv6BAE%uQ3e8!q~AXmQ3J^*O05+jc~TMT2)$sLX~$swNE#fy)LeS`$vtOzfOjYn-e$t4OWMt%jid zOgO2c(b*Zt9SM>usl5EU@sh8c)TBQWnlg_#u3_`y8<}sNNrG4tWkqhBy_D*fP!VhV zHxsGq34CARI$Hg_{rXk&q}CWouj(9Zg!i4WSv!?q_l4JgQm=RtC!BWGdPV4oHTjq= zhN9{6k)Xd)l@|iyWtB%lRZ@5n*@|%1P_@QC@3vp4q5=z4S*eW{I{z7eq|_uqs7{f} zR|TH0B2ktqg2XFXgOj0XimVDRrK%_h>iLK}=Ahb5>2*hx&#DNW!MaHTCpBe(KWU>k z>dBcWz+!(}tD%j6YN#$89Z6N;TyGr9m80r8jD^cRPC%q4*9%x1h2wt(pKM09;ldAI z*doMrtx@0yWK0OWCk$MR3~_&KIkr6x2yp`9xdY4d-5?-=XPLHRkiaGI?m+^F1byP! zo<)MP53D)F9*!|F0vq};41kXYE+IC&u@Q5E344Dd@G~JeGqBID!!wTrLkmXw>?NCI z6Vk`nWp7IpFbQK=!$Y5dX~(g^o#nG$O!|EvtV0Kw#sQwNECRppc!7DC1qpz;!GsMD zScvexhaq(~+YKOV;&~G=gkio1{q6|tFdH}^Zs6KpA71n^3mPtZo{6z%57|Wz0_h)O zb6ARCiP?n|po9>P%{;;tNDISHv;=(nP)kz!?6Y7j+x4M@FcL1aKVUClRp>)11U~tA zmSYB(#RVoD2Tb(A8N}|e5)!XW92~%+lpnz?H^76yabZb3&o3QLSc!>agXOUccI<%l zTP$i1d|(4C8+bDDhrZ#DoxmSJ`tG>z`vEL~&nm&z2s0~CMA$O0pkuaB#B*He9=Q;o zY1(~%?3JtTW5=`M86MzkPdMnCFw65;cFY!RmS9An#2zan0ncnlxX=Ryh4rz6z7yb) z6?jg-l7zK{?Ga3@33euIh|j8o1G5avb3Cu_VwaRQTw>wiuziDa@1Q^b^)KJjx0Dta z|G$JX?BABjYOv9NUJ9t6BR32Z1!z{_BMdIgy z9VT&<#52fbMw2V(I8|Tq1E%1cCkES$r^3;px;jGB;caCphi;q3gD{!~nLVS+B%J0kB~g~YrL&|M zQ-A8?D1ov}J&&ez70?93Zz*|7Z)Uo3WuOPI**@RA~Q|eM`(mBPmOPf$TCh*!LRs>6*`(aArZ22~cvv+i! zM${Rsd>Sl*f~28;3AKqb9|DLdf%!=hrC#V}^E3%V8v7SfM3O8?D48e4B=%i9oV$)2 zUYH5RAru|Qi!gF1wp0JooF{}%gUDf9kopOPw$9yT8oZ^UKcvwZqMWA}u$Eadg%yYi zjgu+yvuT{sMO@@TT3Cyez<0wUU%(m#jyJ^)`UijUD-I#_>p%U~e^-Hj{_7W+@|XX^MfS&kb@8v<|Ni1HfBnk>7jbddqT*4TT>qOE#q{BoaoGvY zKD;)e$1m=NM~5qUar1Dv%DmlL${skmbKrY77qeUY4_X)0g^049SfAj0-lk@`v2M^smZ!Ed@;wCR}4Ybd?T3_ggjSJ7MFKBFfI)CB)7_-%KquoIkyw;H=otOdD1<)_uPGQH7kPK za#**$H(PIT+jEm@bakZm*~7yREV9uFUS0zS>=x8)L6+&3(JG z)3>^AY&yN3(KB?-(AVA0rf2N8`cB*Rx+~*KGq$VlZmXMHqid{t%gxfwSBh> z5t%E!WAxTt&A8g=Yh&4gSIf@I*zI(Pf30u2>rR*1(tE4js?*-WypFzJE_Kb^=td9x zt_-8s>0W7DeWk<8j@gDJyUVLCcwKh%&3}sv8^sd=4*WGPf zTX*1}H3Rcu&~AOzSsJVEhSkp8n^3mZ3X*B}R;%r5WnQs5^_E6wzuy{WcLj0mueKY# zz5l1b9enYp_EY<(HER8Jf8by4Z?7~{&eEmEU$OXCo1|O zg#D)9e2jE|9M@dlU4HuPBdFtt+Px|7m&?oLHQ@OWPkv_b=NNq49%89q5$vam^Kp}( z4>-TS_xQE3yuUT@oSpZ-d->`7Kj7d?PeH)U`>#Kycs7XZ&QGN9ArChuzbhec_PKW4 zZdR+~mMp(Kt4Qi=Q95}gN*+Q2LJbaK?$wxY$h8_0>XO{zT2)2jcwH9aMe9Tq(Xaj! zUV)z^YtldGn}R}QzJdf%7Qf+;S~+bZPGU%|iWI5BiK2AMpJ{DbQU%l!B&j8vTt$@G ze7W-K$nNM|rKz-DBjrRAI6;sV9*M6dBpg>os-hD?P(``ve_I!LPUaeo z%345@+z$ma;qX9y^&?{rSiHdox?~O z=?(N!Xb5Vn&g{ut6FzHyBOZsG`bvFKsYsHFRF$twsG=eJ_c?(BcLI_-%CT7G8ZF3G zQ?y#O%hwycSm6a!KS7*|cu^DuPSzzwtSA+}A)F{jP)eBjO%xSW%MdzJC7u(iGT*Cn zd`mvDYdxVVK+=QG$*~}uAXSEfzJtwJeIe8ljH#Wdr${`KMDh6O47HUrxuS}&FJGPU zeDxKiU#$w#0u})_g95u#Ya&=FSvZ$exe4*1aZ{0xe)a2LGJKdJ(v~%Gf{E)gXfnXi zyuoqV4ai77?#CL)c86O6H;`;E^8jQdU z3?~5@mJl@oKV%qSlR@qi68MhinSIxGY>fL3feRLcruzmn1&#+!U}I+7BBpOSR=|)< zjLQcwLk1

<5O$!o=)-u}}OG`UZbv=8{3&%)RH6z{37De(qW@zzqz~o%ESkh{q#i z7px9^=FJXDSlAd_0rp0v>A?VBL);AEc0(fweD+4_TYcOoV9yA!4{!5^9T*JQWzamq zfq}>14RZAYe*!}s-y2yh1qScKG>75ha1}FK2F4S|bzIMNJ@OwTi5}^qsb5tpv+*)BM#Vi2SK^&km|tlU>Uvg zV+~~Hj~QZ)4I4U12}wgO$K-JMFov=j6Tfe}cx1ElmPz2UI+zSBhmT8s;6i>S0`9<6 zsJ!P{5CIgE9Z8hSI%3BOeVYYf!UitS8*F!AjbN9t`VQGPVO!X@4#yv!Z)4vsLGX9s zf`nm&sr!!Pvpe z;WC-0b0?dpGfHPEO{bK`I14GgoW*NAohNiU!V&f0Dy6XD(*ia^Y=@B($D;tsgfAUR zr(@U(G{EsVo&^bwvoxJwKs?hR$Jq$#zNCIOC@{q|aj0|Ykr{)={R~5u$TZ25c}5`* zJEb!)OX!u`MK8}W8xBLb= zd=64B+dVuqVSr~=6hT-NZi-9T(VX4`EaAVERic*p2aGv~fwxHRwR5w$MaV}t0PPdN zI=BZ6-)r}<*#q`kV$&HzcUiL-7=H)KGOJkt55#=p!@3(3+y%_cB%|x|g6RRN&NUd>G0mm9g(w->TVHp!>+bSu-&+}1 zSH_+p=$#$R?J%l$=Su6YjS|GZrFwUl>%FmkO!eL@_2tgEg0vu<-ezZP!PH7;VRbiM zv$yUss&^YASzkdN^!09ScJ|w@w%%#I^+q#c(jFp&7_WM3Fw)(wc3OMMnBI`&=9cOW zMOibdcW(z_^i~(Y9Z2%0_EY;UwNKE!zY=JC9w+@0w(&=%{M%xnmu>u^D4uV_$=$4H z+UPlJAF}=fVD_Im^B&Or*=Gp9`M3w|Q4!2Xfeb(Rf(<+r-MaPskqFE(+0l)S(Q}ON zPlBD#L!{47`VzwMM+|)xZvC}w`DGrzdxYLUYUS0(sO*OZKlJ+b)ca4*ycfYo27hh@ zUlr-2NtchR^5F8r0xoajU*3-TNCcNNB-cwZvm>?15{HKL}b3KhAAB*aUqa>6wQ zcwr-+KRxD^5y$f_y`{+YnsUn3)#H;&LlF=fsk|?$0>>-7P!nJCB8LQl*SVLnB=Zt? z(&G6l&+&S#ecBX6;aF>moXA%v+>ub_nuDVZsdb)jaH@Lrp9;T&j`@F|8+A3|9PxiF zs(gH0MH7KTjRMKF+8drzIRULvwZ`jmgYmsP^KS(dNs=V+#}KK+3w$2eWVxzK9H(b0 zQUso>ynZD}Zl%t(1x*l75ieGeSm%!3DTIS0M3gmK;6s<&qR>4)=Gw0-)t@)&d~2%c z9aKdE*yU@e(U4?8<@IlPUY0si18I;MC&~(6ebIZ#aTTH26zWF}9&zX!sj5PGTD&CI zUm~GaZPiY<+|wDt{(N*qNw&I<$@EDP#s!G6=jJd5~_*Es;r(U zuMOe20`(FlN!4nCE{bBS!mIyIjT38fU9P^A6r;oG$CWDT!(zVBQA-ut+4&zzVoQA4 z;P@j=5>yrO?_^%q5vrVVO+~Dp^Yz~sL`^{28{w4iAOqZsjT#d9X-^f@DtawePV4AT ztIUZ5APN?nxH%EYX^sw#qcygpTV z4%I3(NUOD}9jSuYY)P$#(%@gNk*dLZh)DJGTymrbJ~1tZ)iT;QdrKJm4#B?XI;J&(5kulS zjDZb5)_KFe69j#aIBtn7vq#?@Gs>~uw@VJULxvV6Hp5gMkHO&BDA7lTl3E_4>Xv|S zFkl9-T{5QGQwE~jRtdQJp1}Za_8x@;b24@<2Jn`^^&}vEU}5HJ=wrqkW*5ece9kN~ z=o@~LB>sp|u)z?+b_1_uL_;k7N#OMHpictV$0cptw*8VT91L*405b5&=+0zhl^`qY z_DXKK&0>MS_896g==ZI_EC;xj<@N_=-z6mq>@$bhgdb+d*noLH#*DlTaX=T0VP7s` zkwG0@W)S{h-}bQ+_{?Dc;1_}?Caa7`+yK0>k5o|eG4a@R#(`!mdF=S6?|6)%?v5BS zeTW%JntcjzJ!`<$&?eZijPfABv&{pa-SIni>oK++i`lSY#Z8~ppdZ+<2qSDep20r8xI+&vjUWle z01sT(4v5zeEFbsTQ49NR0?%`ZXE6r3QJ$?BCC%IlCVf_bNdOB~d_b1pP{Si2@d}qSWcwiGU)H}=y9KWSum@cDiHl^Wu7EDPt zrIe&Gou@LDMvf~)fq9{oyy@=Rx3Qglt z6w+BS%j|I+6h2<-zQ5K}^5FneU^JPTCG+fLJ zN~a`AyeP3S^{4QX#sPg7d+7|vvCnwwG>^h*%xKWd=pBTA$q?NbDs_=(aTZXLPqJz1 zgs!)sX;>tbOjANaoQAU~Nuwyvz;EiWsg-6~7GH+23?#jXus6G)l=0i&(TLEPO!0IX zB^k{!8o&2otyb)J7p#=#7$S-0&WyZ^pkxuvVB=gybDa6qSwuKZvbPs`dYOjPoF?Ge zTzC*#X_B~!zgUt2hcuoCsp~>{BA?J?=8b1L zrEYeKVKX!0c|=zc$*kx;`}^OtO1xWcd=}naJO+`;!l1Ci5-2oE%Jf2mW+=V~&NyfaXIoPubB=+xXV-Au^W6 zz__d6Lk_if8+TYjy;<>OK@Y?59d`cUdVJ_`u7Tr2K0eFVF32H*8w}aLo$ws}`?eWH zSc3XD$=+-W?>^LTUz^Iqhr8h5BR_=b9Fhy~tlgeZ_}5$E#&~dlXN<28BpCV~++_O< z(*6HFgLMC2KL*kr!rR*S@XaSf#@f(&z4lsL_ZR`Z+ch`6O?S1`uJrZQwzt(cSDhYX zfG-&V9D1(#->c5hS`HD)7at@DW&KAh+=1sQ zil|f@q9AF_o^dX7qJU}~5=2E3Uns}tEu>3GMRmmUtyAGxm1+{wTB4#THKD=DHBse- z7RMwnc=U?nPera#=Nd@l1u)c6>&Ie)7uDJ+C&+x06M2z$nnE2_DqMwU(iJ=s>kE!Q z<3&mME4YZDpRdX_VWi4(U1sRK#McC+j#`L&Da(R5Wa3qR?*p<(!$DNvoAPfWxaPpSpziFXk2nhnv z#A-#VDD4K6nrW3t_1;;Puk$i8D$*%msR~U6DczGdJjWkNNKzU)2S27rN8BlYCaX0b zo=B*oi-O!ZC|>4a;dX07UIT3g}yqdHer zP*qGh<%nk#_DU1UVzntKwHKmXQ7V$k*H!U%*uD{Jj3{44DpXND(d3RSzk~r|(rhXX zwP{N{uT^Uz*Lfq=jK8ph&0+3sRR( zD??coUn7a*n`afi(l|brp&YWnvnA&tdL&h#oI;gDu(T(rRZ&jr=QWvcyyir)3j0-T zRgtJdzPv0e8ux;eB(93;b(zVXc)l4BD;Q3kAn-lkCV}BF2pW&AvF$U2*M~OcgtuF)Sb#F6o>``Gpv8@iM%VR$IRYZ>4@9@%~09Qy}}kCIFtFsT#FG&cf| z^^u_+xbD~)3_X9~VfYGs%Nnz>40UzjQ^I5%_y?_%z=dmYy>!G3+I@z6GLrDfw*0Z_ z*~XAeO4yp%FlB-nnRv*sT!z)!2YjE&wJ^jOVjsg$Z!&V7ao@xCq;Fx%a(yxm#-m9v zW(oQhlX_wAzeXPdVZs?!;Fgr)67lU5<5rvn4}$@QK~S0@o;cUqZwv#T1S7Cx*-Qf@ zu-w7WG_0{ZaSevW8{XKpz2G3PVwf&tvil4H53p@P0iEH<8I29!!UMYm`B`RAph>{s zT+hTFE{_rzK5qHo)@BkYE>lVwv#Pu7vlbx+%h(;d0U5X@=x&&Vomm6}rU=7wbYUsW zg`1S;3lj$qCr}`_#NC5~W=ud_-*f$7SW4Si2k@OS$C<)OiB$(|1>i3v#d=-GDvwGI zVlV;jkH^7*vJW5PMqb}zfV)!~g4z+b;=z!`4*Miv>N|lunGknuLm*IiTyC?mQ%aZ& zvFE}X`@@pJ&XiC_-VnQepZz9)2Qg3lz@M;BKrR$?>^X*EG2}bPlax3`L}NE_a59|F z7EB5xh~LiUq)3uQ7A2#2u?&MGb3A)B!whWolL>XgkrR8YS?n-^|8oVqE=V>gawVR1q8%u3TF9aE;dkNGZy_`>d+oMrH{ZXDyW0EnjH!J)!i;6KNbVef*#*{87S<)g+-FfCNeCpDel43Ka zv7dS_b!QWw4yHkHL5I=8ohEcd?U)8{oit@Q@5~E|cGQV^a>R`wJ`OvPofF@~9W|WX*`o17(x_lquDJ)8aFN4s7 z()k%vCGo;^79~)*1c!?xx@1Z>6snft)!b!FeVh=Q!J5<1%VtiT_=K7v_2@jymU#k> z@N~GE=X4B`2FIz1iuGIp9y|HX!q4I@*8CI(55#~ z=D@oJalKLpPo4tF?!oeX zvhhs}nSGbtHS4$pUDj02yJn zGl#kUY+`!Zu9Zsin?l{pPLi8f{d*+&k{SQZX+Y$&MBC(q#D|MfHY_y6{z;NKa+-$!v0qpOnX-O=>*_94-`!z8^+p7(0M z?X`_AQvqo+#Ah_mCC%H|b$UCUNqQeh-sXYj&G2c) z@?Le@MrX5XZ?1Oh&Q)8}+lIMbb-Js~db?}y4=nHPrng?|>$S1J+G{Xm*KQwJ-klAE zP|A55dy@%zm+bTQR__@Q)v^rr8f8Q<}9`-bUma)#~3-YP?jhi%8Xm-ymTuG?(&_uT+k8^iL|1 z_)--r0@qMrtRNp9A^w%XE3*2M<5fY1-ZS)~A-3L#s3#&tP#eu^Q&YqSYMmX|kNA2; z;Kha{a$`X~=GDflDyoaJUVYV2YN{YLl-K;<64Z14L~2!$AWP>8;@e`4J8iydzJYwi ze^x zRqcpt%6wH3HTi}32X*v9`W8tNLa$$_F9o4`dX7-@w2rs$|*@3_j;$R+sQsp?Q!3_kSN4zPZZyFFAD z-x1$(ZNzg8Uj3&?j-(FXI<7Ybr0@*^!D0$X<=b^$Jcg~(Qz|^Ka81Nl#v(7t)s`ek zGS63Pb*LaxQmM=7l`1DyYD(+qs3GuYOced(7^>a*&v*@;^HsSnNp;wvB03YqV?lw; zUvVv75no8Ks+v?qQsu116iobqU1Gzf3`k&kjCXuMihaj-h-*8BVUC<&5Cqt>9WN*~ zm_0inB@H?78MckR0NccL#|-c$OhtoW>@g0l2Zl!QQ=Cok#37|{y)m&2XF#lBSu!T3&1A6|726=L%LF^H?|Bo5-?lIrGfH~k zvl9r2cQ_b8DVh5B2nVp3u4B85Y%#VS-vc`nYvAL+$9U|43D@>*$25IN&-Z-Sh8!*1 zVwxean2c*pe2c9zh8Ij^j}g_qKGT$8GA@ijju{q?8MV8N!SO7J!|_Vl?x2+Yn?P0I zXLq;!$V2)ATtenP6CPn(%_?c+Y`v|rGQj{=!gI!+%Sh&qTf*Kp(?cHzHY`aWAE0-P z!BR<$7+6lpeK(o9Iqa8_52aHBFuOW4X@M1dDmvzYotf@gspMsXZ6>g;A5 zhSUxRUWlD3Q)*6eHV@t0&!;)QwEc8!o3S0vJZEM3ZW`x{d}e#WGNoBk_yJRDrg{86 zP2w<(ZOkOK-8iE(q?FFn1e1I=%4nM8G*|{xIuC<|PfZ$+FjJjKFNtf=%i%0@shcEu zV$ujF(Z8FHCz{)}=qBD<1z88ls_1rXz<9Ui>CMr^leCoRk z5|Y@bVR{jT(PC;xSwt^sauGm!p_e2ucL9mv)XQn+K|*16IlTbi&Mb}vF|yNH6M}rio*Zqg2EOf1&L@nonbdj8JB$EF_JWi=8Hv60y>9pg2gP0 zVmks;(;%e9B(sZrgbSKY2`u_Nu^^>o5W})udI@w9Qmn~E9Qbbuq_uPlH>OcGO(zMZ zq`#WdY2fBzcEJugW(ma+)YEb2@RWpJm?c3>7Sn(x3?28zZg@$2nx^9nr#ZctF2iwB zM2qMiaBZKK!1d+v$ARldsN@X>dxxAxxD|u!6y`hXJoIJ)_53_FCAif6{gVozt_X>UZ$9Nt%E`eFMtW=h>NWwde_!`%b z?(v|npZX8-yACmA7oiybEzr+M;LaWJ|7=OFRafpHb^ih7-8p3NP%I@sj5ydGM>od~ z_s%7*w-70}!r?_(+33;l0;Jd8Z$rC1JYdGs+m#7#s{RaGEj}aH{eS-$XmykX{`Ya1 zB&gH_>2=r3cCXXbd#i(9_tol(v9-+`vUYd5)3?2nzkQ?C&2&jNTYbO0;cDv}{h-!; zL)A8})w&r|yK8izSG($!a^1Uqmx)=IdflCea^1^Pty|MdwQgh8?y(y_?mOLHrxfeH zVQL@5x|w{5wlg+seRaiDQ;cnU2_ZAGHjL};u5?B^UxLluRms)vt-9NewgvCHv1d%} z{kGlFy0=7aaN6B4neHu9Nx8aK>Au?TR&8yowU@hPuh(1kScB;s$f+cDLoIetlWi&3 z4Uw-6L(}f@wRhXzvdiSUd)v0L-CXrH`sOFK?w{JUInZWBo z2|178aWD>?51df^7-uKXE&iC5;ByJvA8I9V`2ORn$d@0ueEAvh=vU#|4=4T5;wDc* zy4P{Y=lye|K4tK$GJPhu@19_}k2@Yw-|t=i4emzz{4vGBD*Jl?%fDkTEzkf>dptun)wjfkXwJR2-#JYc!5HUOD?k^QtggR;sRS_>ErGCsI{zN<$Dx8S4y2?~AB&GFAsWlC)t@1TqI9B+Ibi}aoBe{ch zPN>!^iqJ;rh!@|y7TPsgQR>=os#K}+_PLB+aH23g7C9wWVD1r*RE0Ym$aY;2A!fw&gfoW|c~#)G8ah!| z>T&a>$mz29k|~ilBvCk%j~d)boooGE;h~5SlEA-wBh-bnN>xO>pf%cSkp+rSO*m4x zHivWpRYdt!?VJgQD;!cJS(BExSV{VYF!1gZBW-W3m|xd9@in zJeU}h0|~qDG5zi!==c2+Eo68r9x@6vL#!E(crqEf6N6EXOYvngE~TMyfPHf?DYd!} zTwm84vl|;?b{9m;oiN30+jAV7p|1YWHv`v(7;L6yjXmO(_d|3@dEd#Pl;|dodw`Nz zV1Y4YV%#M-?=qhR`~9&Wj17Vfx0Kl~HN%G_C=u)O#+5eikK9t=Il#_@DWCX(Hy$!@ zyA-;%ydlN|2zP)>NpfP_mW6GPLDAlT;nqyFqlC`EPvF2sJjPzhNiGT8;L<9O4cIH= zKr;uc3|wZQw&k*-_`w7_1Aqp8$mZu~ZaXoM{Di1Nn5TH|jR$;#mz%YHb!t92a0Xtw| z$1CNp50tmJgdM}k{H2(;S&D+&Lvu7_yKHngOkw-OFUPVY8FSQk7~UPz)hu+V6)Xm` zVx7%HFHNRP>bsOu_kt!inKRsU7JDhBOM1c7Bc>S{(0CbHbRMPD^Dk)}IScIBG{}mS zCZXk%MV$CinqrzR%s5@liEU03OxGL7rNbi3Qe!f+Xyh{*?}h6Q{RNHb%%=9l$~LiS zuhUC6@>74B%v_hI%O#=XFuhhAi|MPV?SYZ>dYf~ngk@ai7 zNobnmjT;%%$QG31>Ea?MLrUj_I^!6wM#Z~%3R^GtrtpF?wP`nx@`zrH!vtbp#MFus z8WnR2yN8l!%)ov;bG?L7(o>uGSu`QJ%kJ`+W0KiqI`y+vM%|={eHxHy;KU*EV#jet zB+q89pL+?OF};{1V)x<97lfwf49AT69SrEeC+pM+EsHt<#d!c}Pjf4Rs(HB^&qy35 z>09bR$=~BNNiG)DO<5JwoW^;QrAa=+8M`NCu*%|SHVu<#mPYevmXVd8x<#4>5%D1= zniM`1+`vf)KS0uann9)xjlu*Tg4E9~mjUl_=)FzSIe}G(XRz?aVlfTpL6j7i7a`=y z&Py(65WBdb(`f>0dl^l$zP}2>ne7Hc>Nr+{N2$Ngus`$i@S<@1Nrs~^_dMUDL(g%c z=%o}5tiIzAbBPm@SXmapf9foo#zXiv;#e6??_uA+^PlWm^*Ph-?@)k)o8R8m0xw~c&GXUGT zwtbC@4jx+e1AJpED+9lWU_X14!@HJTGn%jexr2nK#j^l$Xx!Q>>D||H9I}|+!oc^U z8yq0=`?&cN4E;fSEDsYNe3i3qHPe~N=^YQ>c`*7x^ZgD}Ibzv>vhcBj4DtoC5b*l)MXjn+1^vx zX0_gR_RHOFRqAsy*0$c>Z1(r$x!2qE8iHJI!Q@t7?U~xQzV7agRj1uCw?=Qn?luVn zSGyfNtlFhS_g-5bB)V6fuCd6J8<$BldtTx(ix4Sy9x3~M< z%IKOqgQ478eaq5aYwO(-LTi`o?H*%qYfz8g`l<_)wwvAdR-&7cw^!|T=c>G~Wv`Uz z-so$cNt>^C*BagB4K#l{P~=bTr}o=!UkHbP3?u#29TvZ;J!ABTfl3dV{6>u9$zeLg zV?K##65Iy**%*GF36h-1RaHeCUsZd&cvO|36Dgtu&nnu>)=Rm@p^hZ;a!qK| zsu!}*6I5B0tABLz$Caj_q9c{7N@7Ek5K;uBava~}|4>kCZSj>PRM0X1`Wy+IC?j1z z5>Aj%g3V2VJ0_RH1pG0K)ecMR6DMUyjtUlz`v^UTn#~{ObA1%w*^iDvwy69gLLUs{+E&}%2y}+n}m~^ zKdV$-6NVtNH>jX6%-oh(B&}5?`&0%DH$x3KULmN&G9Rss0|~ ze!(jpWgu&+3JI$fsc|lfZzNGYtswqfIIVC^RnU%`e}5=Sx*!POyhN3T%o_?PF|F@P zMg3jYOTdr29hkC^OfpGS2!UUsKY9! zHm7Z+t11e?q zpbERiB`jc#AJzoeDBKCheOpB@btD~$Ov=4>0>uzcI^QBz`qu!JQAb| zI@eVsRXFu;zfjd$MdH>FM-8?34$n(^y~9!sycA%_9U#PzrB*j^z=5jJs8{R`w1I+a=bdlneKKEAa4usit`2L*U@v_OL@rESTNQ zlh|%Q7>o#U7*pN#OTmx64HqX+@{&tVT+=QAa9F5GiRLq?nB8KM36A^TK`Y%Ro;L=^ z9=l^E6B#LQ^$0C6z~TTi%%6ePUa4qK4s7$1OYef=vB{1r0^4yc(=!Z{en~t)ZY}!M{ zp2rw2_g&&RU~j~(vx5YdTX`o+%MX}3I}S>99Cm6_68Jr)rBar#kFQTDn0gC@cn}$f zu*eve-<=GZtO{fWV;DppWYm8flHh`-CER-9(QK40akONV+aSwkG#bX=)Ri4rh#vojA}L`jf&>GCz8k=k5ew5HAnOEJ?G=e6^xDDX^Da zMl_!ntISzm%%jM(r#MfoaODviCF@H+ScI#9(ztLpaYiGb4%cxug;F_r63^aJ9As7#lK8_o@aJYsoM9Lx-jL?hNoI>ESdcIy zF|~6)!3^B>qoqr2e`FCec2Wj*Q!AZ97_%^$ge1o#bjU?~5mTC^Q8=f|3B@!B7g?IG z<`;qC#Ux15oZ_5`efxMdiahGmXts=I1x+ZOTu?f70#f8_x|lk&pb?IzDM{iYN!aPi z5|YUi*QC?92=WmnOymTL5|b=Qa5AOzZ9=nmWDvm|uWJfSn14_EUT3^U32>|z;_WI@SAPD9FWQ5un{8H9-sh4H52F{X<= zv+cP%q2PXK!{+sj;gpUE&epDN4Tq-d#xzYFI+&+X`GZmJO`*8+c_};|C3G1E6hoOI z^CW@)wRyHoXhddHpB90AF}p}+Br1HGErMW99h!R4jKZQ7!IUIkMlb#OzAAC@fAr$hIJsX~MSKS@K0$o%ZUD(JN8ftT!`h%kF7x|%Xmp2B z-a|q0JuQ#?IZT?7#Iq!4CW%?x=wbM`aoxeC3>o#}^l^X>Tb$i+m>KQ41YfOU%I;oy zFOaBwHF<=uGUjyY_fDnbt}p|99oYl2{4)mw%>6ZqdUC+m$)Oyj^0(*vPbb{9Nii%Y zrL4-GhyL}m!^8(bw|^KBmKmA1x!opIKHl)L4M)QaHkKn*spCK z;*Jh(@2%?L>ERp!m$_fp`g#jJ1D5xnkvRFEehjcYf$yl_r+yToQdwl%(->=9)Ai1# zXLMKF4!hYTBaEB-Zf9wByGE(*eM1=E=-1-jSF4_GTxsyt>ukC`rl7sp3(G#DPOuS%x)p0T-&RcB*f%X;_BjlSA$_QuLEdK#nzK^R@|Xm&UH zfh^wLLJHl@Zfn9Ay{+$VWW85yW7+QZbVe6nZo1mKV{Ciy)!u2F_WJ5Z(tB6lTXVHq zGm3a`+w1MGx^2d*UzQAUv%6yK@Q!hH#qON>6HEN3_W#HBJn;Qg|G|2IKtH(t195i0 z4$1uZth>-YE;aHsk{?WXaTH8GJM0f*?4OIi--TvA?)XIeLa_O3)L(u`oP6@+#qa|Q z{fP=(Z`$!aRQoApxO~v{;KdI_pZ+?S^5f2z&pdms-Dfy|f#=K1=Ow&95z9xsf6C*- zXFq`NA7c3LGL-m-B+)3oimFoKnn*s*c%=4`P;JT8zpL_X zWgOL7uiLf8>xO#7%QaP!WVunVNz%Vkbtb$a)M`pYLY#CaqKft{s))Rxw7HrjG&_wN zI_G%C5wA9QB=Nj}m>zc>@u+g5NF4<_gsLFPqQs%vDbF=qnu^YNQBaOhRp9Ef#`7JB zPeV#W`~TWIm*z&cY_IQpXX;@+EZZu(PSuf>l2ZBHJKrx!PFYo@?!FCu;lSVy?j10I zo0oV_g-u5 zlr8`Be|~G)XjwA*8?z@|pmW8SMCc=^YGO+hns$TdG2dcSb=qp{f-ltLp*&D!%%7Qp zEb|Q{o+Cw(C0@ zR%h35%ACdx-yzggE)a4$rySSrb>w%dC=2M{4UYt&-DNf6-$*9{LXDQFsbc3;61ajB zj?eln)NP@6JyGR2;T=IHNg~yIh#&xT~TI|$8Bs8F}q79uLr)FS+u1jh*^i;1cv8HM3*zm!}%yt6c z!`ey3(8{ouO-)=gPJGMpvF-cg`Be8!95`%ntM0RC1HJ>a#Tm987kWYN#BDaQZwH1C z0Oc77o4YoSCP<>zPJ6A@RB_`YmARheQodb5m zuI2O@0kkz+Fg65s0=XQ*enU%@@HP% z4sr*IVQ2V2Bd<-_EKyeTx_9S}j*e?&JDIpMRuWI2v!b%4weZ}w91GXww`v!*4Px`0 zxRz=7w&$?gfcKtN83&$Yn~rC&KlEp=JsZPc@>3tgX5zb3x5Om3Y2wDz3%wZoG^WKo zpM8kJaB5S(@IZHE*IJn_47y0YYZ@haMgRqpO-UJrd02(^d=*f7J&hOPb%<$6gCe|+ z%WOp#p`Bdi*YVoN%QRVr7+4+|`;w*c6Bgo@`XN|`k>?uDlBFGC8s^zNNm*>g2e&Y2m{A;mSOvL{*OV?6Zk(Dv z8)fB`6nof6L(g88NtMx(tYUvj6K5V+Mdon!zy?2|L6nU{wK z9n)|g={Ud6V>|cglCZZ}?r*3$-%vVUE&QCA%f%d;T(Vb7Vig6==TQ=0$Hfwu(uEhq zMdT!AO1G>A)T%I zFGAgAL_U(l^V8h$%e0JLTzTwD3f*;_hneSvv6ClPF`2G0_E!_SOjv%a6qi(wp^a!s zSaon-EQn+07FjGjoM%B)mUJDh78Z_I#@vYl>XLYt&(k?etqj;zx}bqEnc=H6px%L! z{IA~EO7ees`%1^PUB2M%-3yK8lMeS_UG*llG*~mP$%E=>M_(Q3Ni>ei&sEJw5Afu( zBhu${*0I38FWt?DT<^VfT|D0b)Re3iOP#Nsw-ZEn?C7T{(gRmBi!9Bao%Tdnc~UX6 zT~1FmctD5{^SN{QbKfv*-g6T*)ZsxteT*r22!`dDer{LJ_Yck#1lXiBNg2*}Lp|56 z!-sYC_e76!FK|B$lbYY`XBj^V+0(}uo*$k-eUgVX9!`5qBi`Bdo&8EZk-+z^{?9HV z_Wr|A_=6JeI#q^cnzC2jrvqP*iT}e3GV%ZZQ^>?A&a%Hr(-5OkuYW(NN!UH`R3DJA zH#d7vHK4F{y|z@3Hg_P4Zb#d`4s9N{qswijkM4IU>F!yyW6|L-Q7JK6HwT_&3X%7Y8FhjVYBbN z)Yb6ra(k!W-rrrW`}Zu*o9)QB++4CcfRlQ3xBU!+{kfI8Ut6i~4Wrs|uxq~BD) z!9K830|C8I{2wvGV>5;N)-V#NQGd4_`B1-o1bR4Z-*|Jna4H zuh*TwzWtF4Gylrd+06d}gk5i65BbGN4i2|pn0@xrf%_fiO9B4j=^ots_?AEVXY@XQ ztHIyTGt;+((AU0p@crizefnmQuTf$5r&m9N1^JIG*Qc*M{Q)G}>KhFpUm3|a@F9Qi z8KdNjvwygLY5yNyv4b;fT^T-@_O(=-@B>K`dF`^R4v!mxc*HlFZ;v=>(v?wD6;Xpj zLmr)poFH*6_8Q`3bi}`DHhI*L8i+eO=QLhbq@E~BO8-n$cuDGuNE)l%Q%w?1!~t)M zg2qXW8mFA2MuY42#qMu4NkX0fqjn@Qk`>`hQky)_{{yi#(4Yw+ugOx2O{KAUPkH`a z6IQZ@Jy(lObd_(NDw5ln|BHxgD=q+mV z0ymH^WLB3JI@g*Chh(XvP0`@Zn7>w~Q$*0Hyl7Pj4`flrjs4i znPAt%vwCz3JgzenS`5}83eWKMS>QWP-Dz;gtYH5@Durf_#1D3@2J1lWV2pP|*nq9J zeN(Ru)&cwVH}-wcADiqX45|MI13F3OKi_eHz_f`ycUhg_hAI!P|b_n!<1c4g-$$>L9T?=G(XmvlG>%;(=-Uhq2?*Tpp!$4pZw%JKz76f(zuU6qb%xYien-X zsoFMmwlV?8;HDeQ3HD4I`hBu%h=AriDU6sdNa-#YSK)FIr!zqOw7n% z;Ud6gKypl?HJ#D;+Q`;k7$ivu@EANGQMmIsA}c@fXl&=y_cMpaQ50lZOygxn z2#LZg%Eotd?}{e=s-g+;3g9?UTF@&>!-z(~GE8&7OhR`P1eB)1(w~w11Dk=p$HGXr zGB25j)GFN~bkc~1&csY9on~$sMW!E95}N^C#AGs0f~zZwrnc!sghd-&`Kex6m7l}^ z43I3=A>d@PLT6!8hkjb5(|8q!Sxzl;mIqF}hys^pp>HQaaupX>pkY^j@{xugvz3|>(ciV8Ug&8I%eXtDZ)68*C~7OQsQ2RkzECtT22u! zisYKT9>gw=ak_BIh+RlwiHihy-O=3ib4trqToHQZWFD&tb`qLdQ5eOnB6ZWrIR`5*DZEms-PL4r?l0A%zJ6|kz;epRkBoQ4rDsyJUntE{xCpG3r_Nm<3= zRYl`GU@Mv@e!ik%>1H8`^TKB9l`JBM6=Y@OI9hrU{7Cguol=sTX+~3W6<6NJoQ1kb z7c^WXal+QYgZfi5VoCZA2;2qBD85?I)CsTILt2I(@{AV#!mRLe&7v`F7Tb5?!^5~(9NU~oU$WgleUZ2D-Kt|Q+op+*4d!JafDMLj}T7B9)FKHK>vdgA$( zJV2^#R;hgQsF;7YJyoYJ!`^6ZJ-(Da9uPnkyxnnr@r20UdxMkOUHt_$dgo8xWe%lh zwGB-6nCf+UkLz$i%c%PoK1tizE|7ikCcF9Ad;4J3vxgzf{p9X}rl0O-h8@mhxGy-< zA(m${JFv{X`dGFvik}5q2T_l0rR>X7EKk?vXA2kalRCJNo|9vCvA>{4|MM60=>PR6 z(WBFp{7n{<6zRI&GuD@bO>aHA9b8`a`*+*RZS7pvx6lmnzIVH4UHAL?c6g~@Rz1C^ zuY246<>t13*X!L}jz&O+-Z_^qcc|;ZUC-E#20PgG<<7ml84dgW{t)cTw|(QXe+QI} z-dexE-0Zx|{k?PfzPh^{t=GmDtjm|9oBrKsbZcxzIuN+^n_jOP4)65d-Q{*$>4%i- zTfkiF?8xn?-@DN_gWl-!?&flR%U)U6oa^Ce=UwjI_8!d3w^e_;y}W~Nl7kx^oXcyr zXS4@h_wUwKjk(?e+*;oP412Q%xV3&cxVt>STUWh-u3xS%*T&80Zf{;@Pj3hMO<%vi zx!v||e<57|vi-SlpDWQnK^)!NOP{vcw}svSYCx60Y5k({bv4ucQfZw2xG?>a^!rM| z@_DphO?`LR{6|Ci%B(NcWW1a1kCBmId+xUu^eeBu=4Qb3RUy3AX8ng1;`6g!jQeS4 zeWBDU^iNPVcijjNcKq;dQS{S8Z@{lvU#l?a-fmHA&I^b~o99qv8f zY;?ZoB&mDe#Jt!Z3WhjF>idqGzw32so3hRG(BzPBv5#TzIbK%&FVDA8_f$DL{=IC9 zjnSBklHHG%i8yE zRIb@Zwt6X;iXx+Gl!EH?#}KSrE*(N@&1$jhSC(o}MM0^Qxok65<85(dK3ne}wwd1w>x4{6U*+c7d%n#b zvGjzY-0g6kMne{w??vgPAu1hSeA*X* zNL`Z~KqH(0b(;OvWP=_EBIwwxKR?*uf`uRdGw3Ghj3>|_5iHNxnXm`q65I7`;6(td z7%a{@sEm$hj2+K2tchpW*o(lQfTrt%nrrG#FeN+Bt2;G)>^peo6B842g2x2Uf|@+x z&jK7cH4WOuI@ob1Cia3!&9Vrl{uuOSXatA@AB1!EE&Rp`EXVb2mXudBFxca?7IQ&O z#*S}W0k%A1v1vWe1$s2gcMf)BkcGkK3`_}U0*{)~*tcs4gJf(^$d-gG{}p!-|%v2Bm>*qWO)+;NJM2j9pk^19Jz-h6a{fndO_-?fl=clt}w0EEQBJ-=)wt7cAQOv z6{dciu4!_;2(cH^GMI<1>vxP;$@hR3~!lcgnC)*=gGp?mwsW!X_}NCrJIPF zBuT5eo6%ww6;T9ak8Jvp<`ggJVgaiY`EleHo>O=vp3}0h(<>*=aT15ctP1Ix;@qb} zl6?sB#EkuPVTBppe9SXS{V>kGAgWR)S%yGmD5@fw`$^$_V8azO!wWz5i#Xh*Sz59b z+|-O`sk3xfS7ovas)&|W=4I|;S%e$B3B&8a2-1Skc%27kM$&MZCX~HM*Hdd7t;3Yk zt8}rzH7_HGCQeZ-S7nkf**VwF#*S%dM67(tM=OldBu>KhRanNpU8M#MBQ{nURX$z# z{#8(B5uLM24z$}qa?@(t8}pa=vhU% zDho<-kHx_T^$VJK?D}F?23vNM1`FcOBiHdRt;`KG?9b>b&~qnCrdfOy&oL$V3f@<% zgaBT8;gl>(;!unFksD<+aQ#IQe9#jcmqh`h7|q#_NAoedXs-3O)lK`$(x4O^xUA}Tx9+Tk7!bZMtd zibweHbG3Cxa4>eU!QA#?ZP*#TCvio-C(2ldV8q!wzuBs z10C$oheT<8t>4~2XGQQe8`WiX*B{*(_jfy>w6VDZ&H1jsz1Q_&Zw=V#!R=G$+| z9lX!$&CdG_jS2N_H3aYTozC{^BOprmHh1@iaj9>I_cc>m-`wk)9{8X2{`R&%FmCkQ zo?hMS>)vn(_Gf5|cy~EqW3LC`f3EI()u{GAk4CqHtx>T7pTVSuH#fchU~^Nk$@dQE zJND(y*c$i1l3v#+=^+@P@APW0g;Mml;D0uT_qT()VPAi4e`Y&?Bn_tSo%?wYlCJb> zwB2qtcfGsy{iU(l-fk|}zu2FD+5UXDZ`qz-Cp>>iGkB$7y*q5D7|y2q&+I>bn(?4v zJ{&vWTXes2^0%eaL&0)7-9=@;q+dS`^CRhfO*nlRz zwqJ?&+e03n^TV!p-^-Hn)4m^x@oS>#!vNPm)wBD;eAQ>)J~*(eXD|N|Zt9&QMe0nk^(Yv?(WZyxQxul!m~`B0Evz5wzpu zMR}|h65{_68i^{``yb-5i2hEvMshbi=??#)cBD2mNt7DAtO=anR#aI<=k2!4|L(iS z0Ch!<@3v16-%vpgZ4D(!5T=8+!U>x2*F2BdQ=ubNEv@~%&T(T6x;$$7_aAxbxXrcS z2x6z(5~VJGq8v%QjNXYzYFuKT>z=M9+i(&v94b5HZPzKOQbkbH0h{=`htLt znkvsrjq0u1X?J=e*Zhtji`=}UXqwhV64Ln5k<$Llcb%w*F5WfR8DJbf5k%!TDz6EZ z%AdA1^IvQ4cuqtzH$tx$QXm6b3aw;vUD8_K0Lnooz61H1 z*z?DjxNHP#8dyX(Jb)mBBs#9!HjY`AW5WhGgm2Fco9(Ze7yy}Y$DT8BT+ga)&4G=_ zfp40w1;Z0SUW`5Ln-(~zJx9lLORt^e6B~HQEbN*~Of1W_0Zt4OIIAL=ksWdxG~&QA z0#}Frel^3{bFl%v5m{Wj-}V@mCxDM~*r~x3fo0j?N4M+#i)0dDzS24vcAJn4W((~ZE@sP2pmd~ea9Ce|4*0TtT;rt) z-25Oe_?FrFfNXEgflvY$8%uU<*NrOSs_}?5)_ryf8=mFYd~FNFWq@KtY<1(c8q%nY^3q8@QiqmHY6oc;O|NFu4YD#`t!NNLQyP=&RpI4%;m0H{qhy(e1#v$4 zNt&*~q8XHnJoJm@bxiRlx34H!)le5V{*?TBQDh;psK218X~%TB%4u0der{!CwMc`U zP!ETAov&y_vbexxnPh3^d6pTaY3*~3i-^*Y9e5SvjFvPn<8`%glQP*C#Oo@x3`+R?{q@bm>tV z1=e*$(=?!Q8n05HEd6;LRXAKMGUz;LR*QnBY<7|dRaWFxO49{9D-NTWT@cY#K(ERw zV3!KXRxzQ4pAe^{Sx8q!5GO%wgs~f@vF9h{n#2Kh5|TR~7eSuUe33;#Mv^e1nYS)h zX<&Y!)J-E+NcPjjh^lg(8eYb(xQUfaqeW4AG5g_RnyZaZRso%vF}tF$N0WfMv{+J{ zu~LO@v5eWZ6NlG%n&qEJPGigxFY}TOpZeuu6;rlqAC^H(v)~iWNK7K5^gJ2^MWqbG zX%^$_BFRXBGcyTS&b%a1yj+?|krc)zS+G*qO(}7~LQV3Rf&BU zJwR1Feg~qfi4Qbr`!n5eR!?j^5*&74cAn-#GizC^#}7dohq`7I?T_CN96o`g4~V{p zbY-))*Bb1|9cLmh!=wm7W__IU8Jd|rs{_j;;7hZo`NL=lRD>m&%<6a_q}jc2TfEdZ zv8YAwq%QjWvjfas8u32U^fB@0bq6)pd@5t8Z)VJx4mM=_>$91cx;GB_Slv&~ClyjduO*sy`YGN2B4;-0Y0qaJ?J!jIDk%-0lXWn_YjfGKa&_ z=6W|;8`nd9WvqMq>(O?n->iCr{z%{U^wn^`)6JbR9B$Ub?aJH^N5-(fho1e_a68o3 zz3buVMju@7cGo*Nx!dXco9pZAp1uY{qfH;;*k9|qzU%8l!x*fG>$SPQF|P;1;kCZj z2Zp&B>f3=15nu1j^{Q{|_bc$c-uEEl%>Yi`j7F;w?+5;R*9O=ej?AsTUhlSsVGMUV z7&DC__#3SI*XGS|&>IeSE9iQ&9qmW!z23hz%xlQP=;_-bcv|a2bFg2phLFX6J2ZAZ zqw2KPuSc6ve>a2>clvt2hQ9p~I07r?^>DC-NQ}YFjWIHZ>#e?pl=c42&2N5cKefNG z?f2jPBFmyb{3Dzs=K{Fq{JdEIT7C)97KW=?&5c+%n z$}fKY^Pj)_`IGJY`^}H^;O**RzfZK)7xns-r_Y{!a>VyP|4e{S1@@6(-`xdp^@Z-g zwBHX&?Z>#gEyKNfdos5h2ELm6JBeY zcq%p;J#~l#MUvDvEA^G$=+s1{wrfp65EP+N6WTNBT&OFkp}rhQHL;w14o%QhWVZ$3`8PD=FrX>G(BOV#@Su5hl_R8bc7nj|4b6;9=*h9vdu zL{!9q)U6qc)|E8%rEVq=V zB1)%7Hk;iVdM*jwo+fK22#VEf2@p#i){Z<7U$&wADpFt-w2{(~U=fJ*Hc~GHReB*v zl2nsw-AN7o>es)Z6ua290*8zV@$s0#g@+pi1U@><@f^NT&B)j!fd&2MG=M+Q9Dbe# zWb9fdaXi>{r?w48OgI@3lVYEGeh}b*S|0ycA`{P_^K;a<$Q*100UYMW2-o7&WWEzGNW?Cd$%198EW#Hh)FofxB3u&YFczm- zkVZw2q?x;1I(U)b%ZtT#3|gAS_ID}t@#12^{4&1;8|fm-7)h6LzKjyWBFq+6?&n3i z^!#+4Vu~*kKP*E+tYkX(GR6oqZ6`Gr$$~J;^74!Y^EkbVu^XmtSh#s?8CiK{mz$y> z^K6l_EQ8uyv9L&OJB*ocC$5>pev*V1%R}a;7Y>V)c)6Gui5*R_U0~|?Y!zpe=1G(k z0gl6kJBzY}t;)3Uk}`?&h!R$&=G0rV@FL0d2&hF zq6{LICkf6nn{ASec^+kiBPk9GSvL3cJSqr@LVHPbFtA`Vx(1K76~;kHS;Qu3#vE9a zVH`V*hMP-=1$mKVu^$Ct8pH{K{zc}edFVS{7GJ;^KYq*HJY{(tvZS245se}igQL`A z3AP~QV9BBYsuARDkuwWlmULYtEMqZq=mpCH*kEbAVtKwHS0so0vf#2TQ+AnTQIf`y zf0^ZJ0^!D4W)|VkveJyxB@`$~EoK#T>Cf>MO}uEGMr+2hi?Vm1r6HjybHj@)O+&AQ_ZYV5(p`ou zU{RE0bWzYe$TL!|@+e^uwJzZO7_s?98m3O@)5vE2EDr<5qCC1xVpb$E`bU5KEBGiv zzy8Bt{YN&u{K>EW)I{h{{?Yo6WH|cw|Fbu%)i3_r%k1y`pO^oQ_otVC^6Ouecg-x| z$E19}*`;&bh>u5#k{(C!ADLDCxotSRbARY&RjCDsJ>zjTs+eZS z{VYF5ncsFV?mHiRCl3m0-zO8?h4^&yu>HZY%7gXbz+G9Qu>e-w!bk}z20tXtcLsR-o`NchOxdGt=Gf#cGX|^_xqK(8EuD~ z>yg3n;q7X)+Uvued9&KBhpX%Dc5m(sb7kCc%=&u0(f7N)vF@*iJ>&Xjx7zP-2Ii`_ z)mQtTvE6J}H~j&4S+Dff#@On^&3?Coj@!N7+mHIjX1Cd_dd7Y*+Uwh)VO|@%(Qq@o z*=_oR!Jfn1*TxNW1iKK@W^D7Qy}h}<8T5Mn z>(vGV7_7Iw{eFLa16|Fvd9yZ#=HA$HB-|WrM#kP)^|u>+umLaE#@-y>XLD`t zM_c0t!dq`P106Ei?|5FD)eS`3+m1FjgVlPkZ*-^_WVv7OMw`uUefj4D`Tf*>YQN+5 zA*%d2RPQO+c=ia8{3x3FQMm7^_Eo^@mv#PfRQI=P?HJtrbHnbEu#Y92eU+OB?ZX*( z&x-Xq%=z;LHJ{x4So<)Gr;a>cb<@E9SeUaSLv_Z#2ecl{yQ@`rHjdsbFI9;|;*@-GPS!_t2^ zWmoSRdiU`#S05g}%lYoq_YZtjSTeuhY>TzpnJ6i;ijmwE+Wm&2h!P@V=b60bz@4Nv zkX}DWuqAawwXLE?U2C47zfzE@Xnh6AlGs(x6r`MJ4MCDlG~v9VJd@PABD9;0UbA&B zNLszqYM&~i?zL;k)>ZLTu0_v8T@)R)-xS1-C_n3;oJ%#-ZXvDKQWU+Xi0VtEA!Mqe zfV!e65aFbKChD@>J)ia_T><r6hw?RMnk4nL*R^jU#-`Nl$YQ;& z$gO8e?WH94MMXnU$l;_bB25yyqK4+p5t7B$yGBz)FVGYTlAUNrmY zL_)QC=S0>-ML0zeoF<69h6qPsUL*~@6IudlI69J5ttO_D&=BfMO>QVicrHPJ5QKOd zpl6EMuA?r}g*U=8Sx^S3HP#^PnkLC_^!l@J&S3I-r!}P3Yf`&;F3&qCsH0Y+rYUVh z5PD6qCZ6?WSv}WfX)8)|^-cdoYKwh@R6$gs60Me26KcI~?^nP6h41pSD=gaj3C%CS1w;;5@1H~|i3l(^V~O%4fS-{d$X#ZF+_bRKvf z@eS-xJPST?2*)@LbM6wKZ%#Q}2sT|BICRP}<%u1*Gt5u=-T?+Afp5-wn@!;i zvEUyEFKOW6z;OtNl?lg7;RwMH@oWZh1ct+*QVx3018W8`yYPvJT}+4_j3GeFF@5gc z#yk(#ns|oqQhK-qb14T$=VP8TA#UK1z@QxTcEOoNZEIeI=3+{H$C|tI83$p>Ea0dz zoq~DH5p*9DFPP1zm?udM_!qz-n>s!jyA|fmbAe240wutZfM5OP*y_~aX;K(7hRES3 z2Vs3Yp&To=_yIp~C!|8*At(&x2;e)e50O<49Eiscro?kN4jasT&$OW9oFlk%m}6Q& zx&gJO^bka4g!&$zdZ@AG@#*1f!s8bJytXESh5iBb0+;zI zp{@?BxiP<2;n8X_&H~>ijy1+m90Jxn)2Ghdg^@m`96>HF-?9*6cad+HUo2R{SP&#J zWnSioHY>b>MX;{(4Ci*31Q!9xBNjp(m(Dz3vBmu8GMPD6jO~!ky@eZ3aLndwc8S3~ zOW(1H$4VAP^ul8-@h|Ks^$3gOggDDETRJRdvHvz=Md%Pb4`FG!5PN#z2Vo43vdngA zdCP3KEzoKc{hqmuZ~NBX~E20lj2w6XqEsEVYY>f{&1~G)Quq1P;z@ z%mPNQmW+_x_ZE5X#xzPI$cN2mUYG}juk509Vm>UT6EGH8Gn++WW-miG&kD+zpGR>T zFE)4)<079e*5A>jC|L&cv!rYpChM&9OZFC$4`~?F^6hfLq9{v>WWh+V3>f%?A<-iJ zS$uKvb{VCC&)l5FG%nW3WqQR}m}F5(w;a`91qE}`JdAvX3y%AykQ9bY?6n`0+*;r` z%wT<&8C11k?qv`=S?uA2k&pmozW))V91h^zhOTvix%6L7yxSFY{u_ zvIJ)yckR0yW*ku6J-S z=b+=11Dx-H+vy?J0{U}La6T=4^ER%ue4-r#tDsl^9!EX~dJmxnB^}>xdhQO0mojZ4tSEHh78O3hu8Y%+T0F}o8In@l5A`T#>g0P z47jgvhJ&p>+T0AyRquK|G_HHbHK*u~cE-@yj5hr}m>TLwR`Pn?GdL%CIK0uf!`*hL zo958m-cgcA#>zNSl85GSHPYASiUY^cWdtEWY`S@5CHIV*fxaN9+B1aLY>8bxum&an|!_Fud;F3`hHllsw$(keNOJ^8@3^N;b?D9A4k( zH=`pfdDS0|^ucbw+4Xvx!Da_l7*^1-zS-*L%7C18PD}2a8^c)j`fI~5jnUfN^`Mga z>IULDu#zEc<9fLLCx1S;-cRkP_Rpn#03g2y2Hx)8Lvc?5nqP$s|8r@xFO2Dj5^A4l zABRz`CpUj2_xLmX?@!~-voCf3bf+(keENQQKR$4F8}j?m@TU?vn7^y(1MBV+ROee5 z`9r+%F-Z3$uJ>D^(f(H3>I;$OAIhkGqJ12sUOl<_BYl5n^yg9HFLM91nco3{`Rdl{ z`w;l2u>aNL5f8dPz?mNytiWV`6)H3(5!FRxOL8Z!BL$5S(x%$U9Y zIYb(Cd!Y$p8?}{x`~U7}&jsaN)mvj(Ed&)wvLFajuk~D#&_+}hx%+M7Wee4jCe%d< zsj@hG@%&7dRI#P1NO^-q81TBOHCoP@(rR@D=|!UhVRXe)O@p|klaAOzjWgxs8@VM3 zjasuVbl#u_YHBi4)n}-Qn$4{uRv>qyp&;$N-IRNxAd0edRvRg54LuW3Q#|D);z0+s z1f*)s7qwomE()r6B1-Kxs%c7BLDHLAM{1~oczRwF{aQ^pLru4U!97jUa&}%3i!4b8d+&npxpritlT4En+QbUsJL$-o^CJ9JX zHKipsTZ;5d5NiVtys90cLc}TNlpNjwE(ORT4EtR)q7GA~)og z+C{>PH?3iPCJySac)n+CS#GF!A+);)acsAzYA~q{8P)oFTWP5;f3L2ds7gx_HL_hDe$uoxDVHqb=%^tSPl-v#Y}ViOs$sKn?rPRsB?` zNvBBcj?e0i=SUFIL={j^c-9inYSNo$YEMQzNF23J1au~fhOBhzA_UQIaBjNRsA=u4 zRzs~fvZO<@s3o@>-H9r98@GKPM#BnM|m?8zs6 zrS8GfY{K#w!jh8II)X(BrALi(Rc>@^t;VUOpuVheW-_LPgQT|Q1Y~a8?!?C)nNJ+g z_Z?1JwTZ*gS;7%vn6pSe-t zt1#NZ6|m_-#Nz|V$pb!zsHMyKeRQOURs5DD9LJ zc(G%TJv<=}lx7k*l!MrTXL8yu#(}{HyA|$U4FzLH6(;2$%ofZ9huz)dCp0yn`liJZ zU;Z)812m}%S2K7T%stNfJw)hR+zhel#2<5iewF(i&dl7ZNRu&)!kl`}bDToLrsct@ zIX$w_316azw?5IVPEngS!R=@gE`&|ngH#CCkXAWWOgP1E;?=M(BVgv?wImPTL_ z%O-rXp*qt^1uEN)>3N1{y5Mo_OpIWTU7Oz|nQ>tG(ptuIjMI3TCb^j<8H*{&FPO6| zb9R|woMh?Jk4O~8jID|yNv26iF74Q37okmATE;00oS3r6WeXOtHOp33=GtDIXRFIJ zw3n+e%)-KTS$T=^GG&ovgoz7NlEiW76?nFe!#E>hHVr+tj>3G#f{=w6{w@;NjT4ra z0mE5@^Wrk`qKrYRDG6=nFUpdI;i5<>^GSF?ldCvRahyg4gmOWWD2{@XxglE=ERXUi zTe3KhI02k4-hLM><8r}Lcpt=Gv`85Blkzg7A-y7T;v^T}G0MCP{+|KLoaV`D%`hW& zc8SyIB95lZ(udTsHw&@_OY%z`M`V$Peq0tT$}ITZ5yatgNh20<1EtMKz%s^)w-DPh zv&`6^f%mJJq%OlW%2{TGGv?0HD8f)~y3Fup>d(svFUyRTDPv)lPolS%A%nSLtPC$w zeEBxZd>=Bzsh@@{4O3e3%9i08Z!Y4DWmi`zb66OsJ}p9cL$RwkV%W{f7;LcOJBP7F zT6iU4A&VFz4zr4jWjRZsjxa-vz`>9u%wKtnBq_rpTw&jZ_gom$Gzk+HPZQ{pz#0lX zR&cOsR=~cSuZr}-jBJ(>HX%lu#S=42AwDNblQBy#vlYZ0viKrqfghQK*Bj3XGn2@Q z+4?QB$ugi;NW*z?;j_es_h`YwITR!;qJsKXITo=aT!>_|F4rnIp7!;OsqiO2U%! ze_@Sy&d4;x5vs+u{U3T}=?;h<>!A4p>wJ@qEXLqGNH0z!> z?((7)4=P;+LvMF^q_863w^s)Bc#i?i?G^daM;KNmxP#k0|3kccX2pC=RZuJVa|M~< z*AkeZVV0p@Z&;C&M=QfzZPuG!Z(wjv@L+%4TW=2R~GAGalHqV>;A~t8k?1_Z&$n3cGov|+u_hy4|bbTe=yh?JcupFqX%H>X27lW zR=wfI*l&j5b-(5G}1GA z-|W}dH#fsR4}Pl;_MD!*zGWwao8fNX>#wdM&|`h*)MNA$Kl!Kj z7rK3nrTklOA3<|Jgi4I!Xb@~YNUPbB5ECn_BF6;Bi-$PGmpDh=6^YbOm^L$6fi zC<Ig|xz_E}Wpplglnb>k3#i-GU}XEn%kFdSZ#E@KMC~(aEOcAKU#|;Y2>4sMrApnG zYNIZ7NS;b z+xj_DRn+|(L$TM_T1ZvYrrv2Zx^+cvpG;n(mL!U&0#aV9<0g{o=v1f)qO56}T0SRHdG9$XRZ2-ZIxf2)JGX7jbYXhl44HhKb8T!MX1_7M%9H zxns@EIY)g1--j1UJW4nO%s(n-vl)R;quGpOkQKD+*|=g32bLdzU8h1q;j0*(Oia!I z9*>F31r*G=YmTQbg<-JI@ng8upbqgZ&f_&HeDYR=U~X&<$1BK}RM;$aO)D_$0KOIm zn0pB(97lF2=Bf`6!2wgHTu7r5cyKu0d;pEh`dF`maHh-nxEkrk~1Ka4MFo)(ra{hV z7+zfQ|3b}zGW8)kmU3EczACn0%q`een#D<36cNk(kX;6;Uj}JH@{6cQ@e+G1PxH%k zo@E7Cju=VT8#l_9A@hm_qb%_mUs$k(NomE4FiN2UD{|pqMscvX^s~UmT=nC^rfC`w z#^T~FBNLisK1uORTk&o5X~CWKviQIMJmcHH!WnV7ms5qp$g zY-YCn5|02WQl!a_zXYXjj zrAOA~2Bx2RG=uD>p0iwJu<#QX-eTWTy9}YGA)$FjLl%`jjiKBb%bg7?(mYHSiFcX) zY?%=9Zn`7^R5H0_Wg1;^SbI*(i=5<_i>tCA%fwq;Iq}B3Vl44eRz`6N3xHGHAArpN zby$JS{|osdkeSn$Ihufm0I$*ztQJgP*i_Fd*%01jsv!UY=Zatu*2Yh>SR}`@0e58KdwdLfG7{1)u zLyeL0Uj8C4KOi*wkf@dMDXY>T_n{pS>y)2}IB-0_tzHCw!b7a&Sh+iY-fbGmZR|0( z7FEMwRLU{v152IX*yCZ}&21H7a+DppOa0hx(R+Sm@^~WO@A?pWzdaf~(r&pIAbA30 zes%sK$o&8QPC#ZFh2)n6J}w9{45P=H%tv))b357&*9Ru^XxQuNyI#+@8E&ujk$E#* z?e(3m8{-XC%f zv_2eO8~23f>+1nH85uVtLtp8;eQ!7%^*Eh*KUk0Yqy5c|$!+!yWaf2`ODx}VnR{!l zv20xTja5ZF-i@|5M}_76t_Q9*s}pvG5@Tc}u`*UueL!$3xai5SVxNXLKYK$hc>C7Gl6WE&A!|AQs z!~Liyu*nKy{UWsUQKwsI*?w?j{@YP5e%wBQiI2+5p9}d%VXL1Se8}8A^%iifTIlB3)?i>4zfVcmB*uar?b!KGLQifvE4`!|&gH z97%k)T77?2weNpky{z6{9r>rXOE_En0f7*HuNqf7M1~Yl!5A zAPxm2)y@Z^TYoNe(QC0@S1S}4y+YCn{p+X(rgY`3(`vL->ABdiiFH9z2a?>9`}pKU zv>Od6Z)=JwN$Y@l&}(Q(Lqc*#eI_8eEy#V;XuWR9 z3Kw2J=cx5u5}Mk{3-J{?RZgY0&{WkIJy8{FojU3&P!~mNB2|?-P3`ooJ(OmZCUH{` zRL)qI#Jwq~?bWsyZQt%#bUq}CJ^K(&Rs+^*HYl-z-pAhl~q74%aDHEZoR9n^SPfAz-g zzpUvmNZa{?np9UBirg5<{g?}6D@f>w?Lrdkvc%Om#!cx&Y)TCzD5?fCgS6grS%Qf? z;Zv_cd6B58s-X)~Q0;tIJBgrs|3W8OwFK!+G2tDEY zj=)-hF`IeBb3G5coUBW1ufm?8IrG3X$PwAZ#3tBr#uH;a9>dqR@v#|W*Tr+kn7Fg? z#P=tJj$O_io=+-<@pNu;MP|#lv1tc5AWi^RP9C1Q#@KhquHl;w@f>Gj`N7zC0@s~m zGZ=GG2;Xrh4&jF8zGq?La^m%5Ot5J{yn#=_u;%Pu#!*Ymgdgk2cFe}HHok}Ev1ct@6uBj1B0>dG6 z#&syDZ*ef3Q_d}KW?`3moNx@6U|Oj;!`EEudDOLdUAedhnFkXtzdI#D~a;YjI!PV8H38PzT$EiLt<2g`;x_0Q~xu z%*TPD%{4_P98TxL)g1cvNWeA59a`mFDLq3WrjrS*KOg!+{U9idqx8Nz9lH~6>Q{EB zw&#!O9Hzi_Jgy*OxWt}gf9!ab5V`G5T+7BbN4ptIqKGai%Sjeod0uM7F`E~8w2srH zgbae5eTSJJI`N9q<;G^0xwUW;+e|EDvK%rJm_{^Y%%lYi7)dNrq@|a-%%U^qGnTI7 zMaD+3Sj(tPChq!j9#Ss~?Jz4~T1%EB&`R8oF#jygZG3mNR1=Uyj{m#Z`|P zg=xQ9EaRAvm@y|FnRG%|E+%PYn-*qk=Ehmc6^`8kOcF+;B&Xj+8IG@(BrKEVvPi73 zutExp!A&w!WD#XQ3z?NznazS_&O%l$11?uWyu`NC@G315mu8$g&GJhq#fniDPcx`T zm?z9j{AdBi@i5K<+wzLEV2s3Wp5$qg#EG4m1$M$BW+sN;B&*z-Q|6X<;jyxCE3`gl z6FbK^z?P3A93{(X8W*&TFXQzRDv-jkIk<7mlq`chTP1M@UZO?0eCzvJiI;wvmvmu9 zVX}x|>K3+}6+xNKY377(wBmSl#=LwLUtXmwx}*+-n`bz4mjTR64AqB{t(TW9&H~8A znWivlYzcXWd7gzf*JH^yaRw!yk2mmj4{~s=d<$QCx1?>3*gBPW^VWfVKu2S84Dkq!r+kmz8J^vz za1VH?FX3|G}^a2|D*)trX_&u0s`< zRmK%~K0ju6pKErf8WQ9WXWT0Ith{$8!iI^d?o?#A-rnOqN4LYn`2&wXh@vO(apwsV_CNid;Nu|; z=`X=jLQszjMECT~wPEfLB(g> z$2=Nwa<$I2q$`Q&>zy&`U2oP0f#`~U4IQ?_HP?sMw}U%*=#{y;zScKfikY*o_xA$P z{q6n+%ntT9tKn|A-f;GH&sgou)q1DzO?^Ak_090cSabUIdV5fZHumfO_Il67rh9sS z%|$+j>+NQ@?}I;`BiY;0cGELAM|o%+@^~x{ZQQK)yPN%c`q10;s=wYtcH7a-^=7la z=Ao^6ko90~?6!NZ4!vGok2d>#{~!-N-~{X*f6^cvxs`|B><1fOzwK^q7=JEc-7F`Oh91Js$j>>%q()uf~s2uD=*3{?Y0lPskxZmYx105o+E( z4=6vTF@H_yU)uK*{cdBgO8c0&z51}=U#qJ9JJAdI0S|XPynO%2=(|rk`R%p$Zf{h0 zHNV(w{DL$(&j#WvMfj%HJ*ja`k6+eg5lQGpO{leMNKoXuBFY`LCTk5@Yn>=^t^Ef= z?dGK3fUkb%A_owg=VA>hJyVn9`b#vFr3ON(4g=-7BufO%RjX`drekp)|m z8?vISb$QejPQ{*}*PE}zj?mTQP7SrydQDIpEzy#dm#z9UvGFrOi2lX@7zLX6t$NCF zU^JA3mvXBq$ig?Pxu)ny)t*7b4O!4mlxF8o(79IormHk|ittQ6l@v8@C}LMGrCzJk z*OX_1tc_JcI<0A4RqZrorH<57NfpgENIXH!Z)I6-i?t3CwO8V(q5Z8o4_gwW_L)%c zsQ)=cDz?-{Q&44Dt*eU4#hSGu%zR!>1MPBl#z6{+2+gY!f=6QowF z9Ed_gYYCF{*VHrgx+B-*H}XK1CJNHDQs9~{zy1f%s>Z;sV#LC6$zUB%Hp>sUaHy)?WNd$(Q4LS zAVIZWA-UEP1Vz+({ArG|EVPj<7~+UC&tINNVxy(>{*9ACTj}Vv7n;wdUBvYC9XwW*l=x+1QXw#;!5mz z;t_03XB7xZDd*Kvmup!B99E_?JD4~&SNI_Q+;#mixN$l67=sJX^DVwjCh$dW?Ai{V zc|P_zAObH%A)2R_GM=bWg`gNB1X#83geB*2y028VJ3I+>H|A&4^{ zSFkbV8X}muoG#6o>6`@(HXYA3$e1f_y99zIz6;}VrM~TeYtORay1*qKWb0sSOt|{7 z<@gx;uIq9>G7jbh8<=31D{64nWS>lkHJ;(0&~c3b8w|^+i@$(^u(IG zzT0k!2apbDx!=mwKrk<211_ zvw!9!iOon6CviY+H}=z48Cq$luQ1+z|;hEV#mRLN3b-MoQ1;$wf4Tp+<7G2^?BpWI^ntkjNEI zU~F38Wx2r9@FLzqY=q;yG-2~RNEaa#lPyUa<0$i3!no`QTNI=W61enb?5)3zV-^NM zo|f4%C;29i8Ko>t-_mJREZxgBixy!BCB{LzigOCJ<>DAncR#(1@_@!so}>$sT`r>l zqKuX#2$z0LQxB#M3PagA3ala-5v~Ev>&5VVI`PAcCEH{~3zDXJ9AOVqF5GaL8xyj~-s$&bnlx9ryg*cg|O=-Y0QMhEaTzZJ2_52zuxbcZgI1Ve<`2f`K*rt4SU z+)4$y3hv124WgO#Uhjzaw95B5+f@m;s)kX<{xPt*Rff>XFCOHmzW#*+@0k4&AMp61lz%x4($~2C!v2%RX;RB|%d0VUpjqg!lvidN5`zUZ6ub})30i(50duj9i8IK=b;uf8ag zLqhi??JCZcgU-n<^juU@)0OZG9E=Wit2EZD)3ELjLHb8K?qhOxRT8(V9WJ@1xmQI$ z;cWcl`6uw=|KsdKy!g+4CwOs0;1G#Y8dS>A`l!D;@TqmqryljqAs43D>D%kwJ&Srf z80sTK?-}}LxWCay+g(MWUJpmxp1#$GgRL#`eLl1ka;kpN-I4gRm zuLs7>aJ1X$`WbYK0T@=p$GSp(AVb5SP!?uwZ1nY9WFT1>mTXUJ*a{{;DXR5gnvDP3a)$o zpQzJ6wZBO1lK}A-@mC+T*)2Htl~`Uy1NqYSl-lnH_CC|THnBtdF#!1Eu^&Lb^H1#_ z68%)n*6n~#W6Abs^fJD{#GS|Y_P=D#zZ$rH&&iPoKKp_Q4_!Wlg})XGJR)&liTQo8 z^zeJuKL%HSfvq0~VE-5_bM=Y64-Y)m`%^IZyW505O%Gmu8sT3(9or}RetiF__SIE? z&*=AuDZl!H`xFOP6&TE~B$c+JDRohjPDam9h1RLuKUKN{s!fEyhLG42<<9U065DD| zXs8XPDa%MjYOf~$1J0sF%`0J0Q_!0l>NS+cH;N={HJLwbuGRid=t$p)5?sJ`L{aVv zb<~t}0m#N%vMW~$4Kcko9IMR>s;GG6;F|>NL*^6^ODOyi0u=ML`A6~Sru#R zhWZT>+DH%txjBX_;o2Xgb4f#59Rh3VQbW+b9kgl^1o})@2I!goqH!X>w&eCeXg$+T zHCfTbDVMlVg?0qpT3xx`6qJ*9Q=!xPwto_yOHHBC{zjHx)%30)PL0>L^0(_^uP%$< zpfhxG(gfGaH?0m5Nk7mzb6Vp z1N9_Hyc9c{*ppss>Iq~e35v=kBH&+7s7vxQMNw7lRSnCE`TATCB_t1_%)+Tu7i35u z3F@h+e4{+CBdzmIbD(@{ot-voNYIchDE;Rm9G6cTwYIGE>Zy1^yJ8J#LSI9YDA(%E zhNkqynxb{JPEUIILRN)S^;xYgG=-NnX$YmQwQ8^BdRGx_B-MN8hc={ zO<5G{N?k&VHhaOfsJqG=tIf(ck6XQY@(MkR&?Q4zy8G(yIhB2f^9D#zA-1h=TeXB4b0})F#?S3z$eoK zbJVjqTeL#{;Mcr2cB$=n2YAuLmGT5fc5&baV>)xV>VoTWL18XaY*j+ZIB+J|u|3yw z-M};XM;{lU;4r0cSBe%Mol`Dufqi2Z_`!T;PAdIq4|90f8rzk`1t-9|aM-4}l4Wql zw9qBrJG z0Q3(6%3Sn<%V}^N8k-&=uIZSzZ+RA}bgBJd#!1SiWzH;uJ$vq2B=F}x#g^yHxcu=H z#!V*0>hI>e3Y*ms=upj$a2ZbT;sWvwFGa zwFL#R0d3`5P z6ay2-cYO@5%u1ZZB{R$mZ`y}PIvPHl;sPE4e=?zOam5qxYY}Hm43G1SJ?uLKVsx?1 z)8ojmW12qr=JF^W4aOF6ITf9c9FO@8h$)#?L}QOpJB^v;*o&O9I9e1eN)l(0l4)$R zwHd<{myDzv9GB5$`d#edB3-dXz6@BII%z>7H!ecP!n|~{vWTc3vXq74G%aH;!JL&D zWquYf{!)~#ARiX9841H>nTFrFNnEURt|F17K}OAj7UA3FoUxQF2$(G0`Gm0Lq6Ftb zQjm!U2Wc1+d%2AMQfhiWe^_4V7L>hpqi_M;(p7-tD08#La#m)u3zj5_%UEW{NqS{p z!MioODkGl@NyLQFgt0u27vH&2Oj!}*Fj@z1J^#{=iWJiDFLGu>_TNQ#Nfu?ma<(YL z1;=H}GKw?k6R}m9U6LaF*@OiPLT4$XKFb3y!CA!8!m&#jM8icGE%K`%Sranzqr{5r z(D&iuF{h3_Dz<8M9(ukdUtO_#%DF z$>bNw%;V2?T(S}qoDv2V3d$@C=jKLJZQp&5C*2tAmZfE76_ zJfHas1~ZhCB!k+q6oWy}SzTQCxqp$-Ac18O6?5vPUQFQqR-^^aiWwLRn8SiBT{#xD z(!vF=aYQCglzI4~h*qA@|4&0$Iw7pms3^zrGz${U7>UBvA?yL%`%f1Y+}kKV3HLsF zOx*3Oc|bG$(kB%NcfimdJfx3utPRiS@love0N>t`IMaK<;m7SEA2faB_(2Pg81Ml> z#P`@K1dy9YkoSSKh5z3Eq0!1dB~^T!&+G*$Hvq}x)k6>SLjZRmaDFG)yLl{RB9@lMMA7SP2i?B3~z%M>L zH8DJRIl#fynb5s2)Z~6-)p)M=^ZF3Bw|Mrq%Y@HR;vI^VCGg2`>k*n+b#l16b7}C3 zk-3kb0D1rSCrH8n&+i80O_TVSB#wg=^>lNiuLeE+pv=5FC^N5yH``u+z2bj1=FJ@` zm_KZ9zc%|@z2XG-M%&eBbzlXrcF<|i-|WrZdarMH>rIb8mJfQZ)|*}5&<78x!ToD< z#U+k6oEv<-A8d@xEjhTq-R?%~?VwU-K5&EAx(R-an<0l`A5eo2!pt}8As1#gw%42e z!0fFmZtzi<+2qR1*TdCju-lF{EAYap!Pi`xd9}GdN;7Z4*=V~r_d9bxS`XHnn~EB2 ztSf3Tmu9{`sAy~;-oeeavEP`3n_++7>y0>nn#*Bq_r^h`dB5H4_(KsltLvVzhXXgg z^?tN6w{Ui|z8RUDp9sP~wg2C>_i*74!N+Ov5d`)#=-m6KzXTLKjCthk^L*8NN4LR0 zf)l?4%>CiQ#E(4x)|EOQ*6eYNvmfC1gKnQ^?^-_$K)?5RCwjsEgROmV_=VMepKBaE z82p5Z>7y}sou|Q5OJI7NI!BH_L>>=93m*mNKHAcgI&S4z0=e%tp+F^w-X z@dMk(1e$+j`}k7@R}cMuA)@^`xcZ6q?#HF{?tb;WNGmBv&V8KKXF+l(;7HkjL;Rw7UV8O6r&yEcrV!i+bp8(jy z9?p}JZQ13ja(B-g@20b(eaSqR=RD`wmjC|O?@>iflNyrTk!4X4jb>9+)%Qp_``Bvh ze^=+DiV5HuTJ3)&_cYn~`%s`z=?L<;A*fJhuA}RnsVJDIy4KaTRa^YIWg4P57AGG& zvNkz1O-Ysd2kM_`svwGz(r?Iu@=@ZUbVd1J3aTuC1^RtUR)r%~(i+Xq;N(CM#GyFx zyW-me^@Gy*d8iHsA`eA7aQ4{~v zIFZi8mfF1(o0C>6ADqbAnQ$nIvZ3`wO>PF<3M^&V5N4f$}uqdjs+}Fet9#TWm zWaZsZ71bl%{L}V_zNj`E{eLGbedSQ-NvishC(F&->{=DJN=! zhpTs_mi*^x+ddKAj9OY-ZiI&M)-<%vDag0_JK2yF@txcgl=k5GU8}2@`czbm6Jzs_ zl4GOUXvnSBKafO2?Hmbe$1RD}q~=84`inu^?L^*V|S#UsT-;iGOy z`f2L`49K31{4t6qc#Owk^8tWg zfe?)l5F3E{K+#s)hMIqT0Kcx=wvsxbI3M2uPzJF`#Jhu<%Rh2lp0Rp`GlFe@ zhP`Q2!==akH39@CXzcUYW+?Q5t}!N|?I5&8QSbyh;kZsXnqUn4ZExb& zRRN=!V}}8Bx3L#ZEX$frrqi)yjjf3d1^xJICVN`LHUd;15;)^MI)d-dnoj558EL)sX;9VN4EvgkeL&~HiX`6jQp7sB8#VQ2J~;fj}bDY6_AgcHa1X24>ly7Z8ZC0QRFE@*Mf|7Zavoy`fGGlp> zFlSB9$)_-7IjI<3u#7RE7VI*t%CaIWRJjBvQ!h*}i!4~u@=JkM^P=?9A`Eiy=eZG$lYCC% zt8$erFL)?f$XJqx3B&Pc<}9)mWBH2l$1!4rk`*LAtZc_QHjDL-W2|8yiu*({bL8>H+Eo&OA zY}<*fIOZuqr56y8YS{%w%L&QO?Zs-5$FZN!=P1s7#+D(O#4HK3^C$_IC0hq1%PtWA zVp+I6%LucQ=dcWmj3*~sz`ynfOf*^fS>Vuk&OQgE4A*%AigTP^M)ZoLd0L&5V8t%c z1zD29uNYkgIZfgSqM4^9A1O*m5l0(_7X?pGvB|4tn&4FezT@Ik%2HX^m#+QBLR4k&y4sd>hMy^juWc(|UcyE=cFu z@^*@8`k=LY`Bnvf1P?z3l{~DL?pC+=j(?Cm%z9q}kwD1gG2h#a<>7XeY4wBw4e#Zpr|>hUP-c3C&eo%=~*ry}td;(fnW&c1&9 zEEq;!$D1hw$E;F&Ti}*urWX2pa-|sW;p2gYZ`RF zKiuJ<@6N2d>+2yOX~aJrUG~?bo7?NrgNJ!D8d&z`>dx-*2zuB3+cVzn@~mfFgK~a- zb30lOAArzM=t&e$2f!_I;?Mv&XSG$-;4>sn(*2X*>^+q)Xnzylb6liM)fd(J*Xmc~LY8&$v z5ABbmD*k@`e*NuUU-_5!B*1S7iZ5xGlgDS@E=TvWWc&k_bx%zFMM#U6qI}xsMdf!d zqTj-a_^rzK>}gh}FDGeF%AI|6Z~wBtdNO^X!LPjTxAj+oKb&8LaGpMC_|34l&gE~> zb)PAH-?#@jhHvVNFYBE@@S*N?`mPxI8Y}J70WQAvZ2j#KUVHskV8b)v_ZvBVXms)T z;fqOHfA!?zg$BR!x_I{fwe26LzIc7_FHer&H#^n3^54`Y0O?Q^#6zv!Foctq*wAHu zv!$r|v0@5BTh~?PSUZr9g~q^;bWv_K1zkRr{-4|vG@;)*?*Ekna;P9Rg+}X0IMHRP zX*Alh^yZ+etD2(7ve;;eZLm8Zwso`H{0muV$+{_+4Ov$tsVOy^eW7bAhS}^ZokmY@ zfREZ}n7#M@iKy|bt;)dA&{R>D1XGhmT{xEB$qh}C-*z?GJUrF~?IXZ3L__TTq;&=L zq@fIi4iy^Of%H)o6j2h#f2N+QqTUvi#^l8KNW`Y0$;w+()Xol?qNw+}Vna0A@46qf zLsfZmCd)_tjwu{AK~w%D@N|exNf&gh*}O0Z9YHXZep79=`dVu|oTxwbG(+rak=W3V zRaI=8UFEoA2)d#Rl4`zbOAY%Y)l)-~L=%!O8me?4@E-3Z#Sj!lQ<@47SI}DW zj4!F%6%Pi=;7B-b$r^4SNZp2@b$mnQ2ah)sC6ylsqt832EzubEWJ%PUx~9UWi3jSD zDyW@fwcpi5i66;^s;CW7R(U$~&Y>m@dWO`}KrgQG$iC8o3B=Qs2ixjpRTS*{xCP8er^`S`bEK zungCD1Sl*A@MS)?8-X5Ji-y{M;2x%vEgzUKZWIUN= zthHK-$Du_+K2#Legn1M$ ze`cR>PUD4({Q`$yte6&gjEfAf3znlYbl4}BA-qI+lBW($Fq@=d4Ac#8O0qnpVMR81 zMHoHLs?yC_G-o)q-E6+`tH@zN5<=;@at)9Z%$GiPi;y1+7LXQQLl~=J#5~Tz&6vfFLSEz__ zzTykW3ltDm#&KS<99MZdM^!+R@jUjU@;s+_hQL3KlVX;EhMmkATQEj0C`p%DM#FGU zvv|E&Uo11iavoX506Dy5>vA407^!d>W$`?XS2X5REIks(CC~R}!LzW8S@JoFaa_ga zBFA~o`(+HD^JplWuyW4gcy6bx%!~N*y!c!&3?z;epRZ9#vM?(G=0}^J) zmu_9cFypI9GUlLofpd1w`)78NmPN@Z&X-AvFMZfW4aZWZRvPi|O6#ms9iogqv zeHY_wndj>nORA7&d?lDg(G;Z-0`A8m=DAD5Y?A=BI3l0dh^0J5G%c(2JZ3(d6!S6# z{>SHlFMw}|AG^e>>nAu<|3u=F$0T%8#K>%Q8;#`X4N$X~Oc#nI~~^ zUai@N^7MXAS7}x(_VnHVeNpSXKdoO0IDT23+mZmvor)JdYdqV2bg!KH)pYxy{8}Kc z9z;H{)W#02?BY?`bwO^er9%?#fWJ;vO>1TG(d`U_KIolZymxmOSh1%zlY1%Gn}TM% zwb;5l$$2;Cq}s7KcAd8--$zFB182CtYUw%SfdR!~zAcCcLDTBKfS$J}Ad}rVC7&7> z`5Ybub$T8|@94>AuriPCv6UfN$==iX&P5!i_Y>lK@bG@R%lh-gin9B4WH1(~dC3sP zxO#e_>QSTRz2~){8}GMxDl$)ZBUbkzS&vR;KHdC5010 zcHU(B_O92v99>!i%eu7hpcEcp7S67&*7l`!eR(~);vLVd^=LC(kA|bW+hJ`@zP+`# z$YM}fZ?F5?R!^YCwJ-U)f4RB59bP{r7T@04qyCmyeEUEwzP_>7S2z7j``WrW<6{l2 zv-R~IxR?8PJgTd!dtz~K-8;Lq?8~Rf;=!GDJGxx=fml4ezV7i^27{}0ZA-qo;sagX zT3|`$gI(VChqWbnbOp}p+LYYCvip~{7x|`l)w||V_U;~t#o$He8M)eek?;Dqo2$X- zYPjYJsBy(t>)XwpZC_sAYkSV;Kql`l=Y4aWIZNqtJAnAPEZTUP(ZwX5YfdmQNNYeszX z^7B^{h<}Zfd9TkmBKvy!*?q^CS;fCdPyL10v+mEPdO^4QUNEnY8;QZ1yvLcqan1Q%w0p#H2ug>--v>IcqmD2{qUVEH`J!wHgxY$lZB@A zRubf&{zs>wbOoi|(msIe_dlD$`*)fkikhS=#&NFc2gbWd68=q39z*@Orlv~m6QkeI z6jM2D9BZ*=`mT7~78Gmgm0nOF$}(%Gehg>s$stQC;wK`&3?0`98Wc=ttlsx zt~XUd1B0`sb~=5&_>OQO$)+p6ahgZtfWLxonnp`ebp2G8CAHD`J4b6x(D}#a@L1}! z#?7ADiHAz72UrQet(ixP+B77=&=j@RP!vTooJQ;5ZNJx&8?E-S*fEq3qM#g!T|peQ zMV{nl^W>24jP%bN&6zCq<+a;XTkl1^BMa|zRX9~eNmPuXthQw7Krnm-c-w+Rb-dpXBDKw;ppng1T%I`Hrl6j{K>G!W zn!<6ftu{~lYUiY-|COvsKS{DEiw#R@wDe=?ROM?iyGF0sm0P-~{YTJ)O``+AX+_or zp5SiZG==8JQ$yASr8AL^hNgTfHpPRse9)D(mO2Rj1qnXWrzJ@cX;RXg+M8NThZ5)6O>ws1aCC^9=jhNKNVG>f8-8Fwe9Y%SU;zaIG6dC>&oK=mpab)Hz~kx9cw^w?0#0~_tcc*+ z2aACp5db#>)X6D;jS;AaA)bU@#Q*a^aU)hhECBlQJ`f^}0-uLA9s~9O>a|VyiyVY) zKxJUG4H^>%Tl}-g4SC#!`Qf~rEDg{O|tsT9f zPxEnj4hV!yCOnrB^7t|WkAh(v1YFCh9of(WPb~}u{s0G36Dt6r4D#s=W4>&Hr_mHc zVZ;bb)wT0D8uMddMF=C`u^bP;(3qbQ>L37>Oz}8$9SW*CtRRZ~AmE7#Bbx^g3qj+E z0OlC;(=vv2;aWWBd98^ZH4=lT82%W*UrV5R!$Q{!_}V<=^Suc8>o`2-$BzF#&zE7< znl(QRe4L4I@lyjJXc9uA5g!f(_ zUw9-;A>_uz;e9176mZmg5_ma@#Uz{kZaGv=^mIgVAW0nwdQ5Ce{r!k2VzGu+{@kxsX z^A~oJ^V7(0eU1ZuCir3Dsbww;Fz-!^i;9IFUnI|16lU|>VPsDd{$HPKNw|0UV@ViQ zImn(~{ox!H_Yxr}f5lcF+#wCZsG2=<-EJ@ZAPPS5(LM^UV7i>wy6p2BXp`OG=}zDC z9_7ObjK0pJY#5aHhFrHI^BwZ`$%M5!n&ug(t-w)s-K~by|l;8!CRpjZ4*Wx-rPebd{oQT@YkZP zmJe^BTwr`J0zYtt=g8T0f8yw_amM#(Yp>|d^XXQSKRXtT5Sp4|+2vrT``+IzOM_VP7vZu^7l{^r`gu`E8|z*-N^ zMtwfhW_{BeKxw`QLh)7KUR!4X(YW2*Jx3JR=H5|%eFyGdoA(0D^VQ(&>h53vaRj{I zuivjf;Pr}XcCWbXC+~hB$36eD`{FMZh0T`@;25m+#NNlaUu5t-ts1n|HteqP>r_(wP!3eRn&B`)$9u0fzTD3svyd;O#fL!l?|!SKMzj;cq~ca z16CTEa3Kk*&^YUe{EjR%m4?)QFSJEXQ%%8W2_5;gC5vK9m-rpABWhw(Xb2iqDO0+F zCh7-*BsWM$H4RxgkOakR%5u+?3Rw|4>aq4wTS|k&s($%)nY%0qmRn{frz?2MKRl25bD)R6^S0<_~n{BZxG$rkgsH%$UXcCX*KQ(l* z(@?+-eJVFW`<4YkI{qjqKY{mE6n+wvUSD|6bE6xb_k!H%3Q0?9GzC>umhEGs(G%oG zr=>zwx;HJ!REA)z)tiFeZ{@%?a3eP5MK_259{D=|(Q>X-beVRT#lLqpRQS(D7Rblg<=Ms$@fPqZngy7Go6|5)o9 zT0?6|g25N3_XcKLXf;n%ZLA8tGfj~BDH^DvDm7%DR9P|rx*T*xDM!Y|* z3BJM1bwP}s_|a@aA{$D@5hnmkEfj#`O@V$45+Dk8KPy4$1g)654k)h3qm#hq(|QC0 z2_pikz!(ua4y+I?$Us!^XZ$z5aE#EHj6nYh=L@A^e})M>GA4e25D$s}3JFkVkkrGFM-zl}7V=>O zZ%n|`>xNP2@O*e7#!)zpq6o^^Vd5Y@9)H4DKc0?xULeJm>ji*|;5&r)5H_t1#hy3C z4gs_T?}^5dQ5r}hOC8ybT@Ie;R4m`?d7_;glR@}qPDyah<22WD%4O4s5s4j~uQ z@zxj|@|9V&IoF1T5o|;AEh5^F{Q7SPAa##z(0hR&L2WoMW6-K61XOHf*MtfJ)Q>1~ zF!r~^3V1sOnVnkvG+`eQ9f)Gju>!<*#IFneVKSpAnDXrKNTSHYR^U5h1b-CZNt-%A z(Fkg5aBX9*X(g~KP~$zvwLlwAqBNS~G%9fEKnCZfMrn} zr)kWURhGRd&>>`>kLodkkXt_!= zpb0x=>Bj66i}(bYPd+n$4j2lS$1BEIQYzUi_B*=u9s}s7v9(X4BBeU3LZ1d3p|gLa*?j9WQCV;Oeo9BXb}Wi#1gzg=fK%W zE_1d@gSGFjXiQ?qb3T(Ka&zWZG2t_(DbM1XFFQgm@=0EJ;XDqDSso`#%og!FMJ!C& zf`!a4DM@k4mgljT@|}sJoVZ@OpmTo_7bBKuX*MsaAkHq>7n1PIh6!GUDCSGek{~Ql zlw@JTW)UAa4?W6O5n7<2V2sW$vy@_nSEU=JvlM5mIQMwcJ)luLaU3DASF><^;m53E zL0(#nW@WIh%6J}Si?rnbB}H7OJkupf@}gq=nBtQ1vFRnlPJ)V%%~Efj7Zmvm#FK?H zMAvajtSn0w$vIudY=UUazk4`dxQ+_`sh`51YW%=oxdB5#%*HHpQ-9_0HB~te@cau) zH?-h~A>v;OQB@Y_EBH!Fe4J%fL?f2viFbkadB*?q=dCpS<&|#X{cGPjjH+S=5Fxf=979d)hGBNsqPiSL`ghU+JAsdipy! zL3}S423u@{TUF((aCb|o#niOE8v&5P-&T*CKOh2jlILU>aJ;)YFvYCqoF&0GZqSb^^y!)2Yq z2R$9e4buBQDS1(fE}~jw-&5_&-PrE#efr>*ez;=ieyCkhx&Tu9kSw~(z@Q*$?;g*+u3Ha zpY3#OZ}05!W@n8pqn;VF)6uYI6Jv7RZBDaYJ>H#Wo2|Z^SbOU**-q=}cxN2y zru816Tl>TAw4F^XW4GDvkF{Rw)6M3%ogOCEac9>%;A%429d@&AJ>G7u)Bd#I>wtKB z)Ggy^?Ty{8-XCYXqivn+qcuJOm($(!U~OgqQQw}nV`ICwPN(tqxV4SbL5Kd4G?4v!r7jTdSZ>YV-Of;acduD$L;R0v8>Hs{@8wO|AM!l zz4}E_B)|G2oMplve)bDW>5|^JHx9qr;G%c#@^#%7Z+@|xzs|cL-UD{OjOaTz_nW)C ziD>cV6F+48BJ@T+?;{@j8?HOw2*`aeJnxV5n<)C$=-wE%c*o^;T)S)cl$|L!OI-NF zfB1_}KKZ2nAIrT<+}+nP96 z1VxfY!Y{O8Ybi>lmI?zPqWfpEC?UPoYm0zgFh)S+1L*;f@;jQ`HPm*$Cn*C-m9z_4 z7zkQVdweB|a<4mlCd*fn&=p5l+K2saTTuGKpsh=a^r-#NP+OwhlH2M)8V}{x3q^j~ z`596-!V^K7OUm#rzJ@El6saf9!Q(9D{HDC^}8TorKM{h3(7zS zIrhB%BU_X&2i=X(Tee0Q6R9tbZp>ElM7tV3&;+F;&Oi%_^s`Ruh0tlWq?XzlElnW- zwM%mQ@gwz#Bu@s~;AvMDwYDIFus*qxU$*7;Ls5Prh|;54doX$~NYc3bNV*!iBUOH= z3`OmUpr{v}2fd-(d(jic&NCti;z*X-QeRUCV@YTMXnWj}F2D$dffRqLsj4Op6%n;t zMq3`q9eE@PkGd^&q;z_MEIjCFW4V1L127J{z32?P?ZKy?{UQiWOy)Eo7NvpbQfwlO z7beX3BtT0K1!3p~E)63}5ef;R*rt(3Xt*HFV?souB?>TFxO7e;Cy4m(Mg*V&0+*sF zz?eeM(4jcOkxMybb4dw221S%$lcG6>4?+XzOhb$SWB{Zzqj5MV@TNylglPyk34r&h z3q6S&na~~ia~z=tG^Zp&h&ULIkOzG*yb;1BV8};H4n2rMKjH`?Lj45|P~f`DWf;O} zf+HUVaN3VB@P!c$C}%bVa$PvL;EZt)$R%7h)N4jyc-{1aFyPEULvxC7NJ1L9^N_j- z&SD$nNk|w5AYkkh;u9QThY&L7r!mmrc#cOg0icdc;6wung$s%T55^+?HN^1Ph%HJ$ z8bA|i&{5I~I-5(xJpR3AU}!q9L#ogg9DyQAo|8VFBa? z%pem}46@-b)}R||0tu+$9^S$^PLBp0vmJueO&{b9;wB3pu6fvVP!!n!jH_f0DgX@x zKB6v&7i8{nsli~-AHksspb4_53A#amzzc#1c_CRw4Lu=)~p1qq9b6vav#3THOEQ#Hb-rfTtIaAXL5mT~lInvZWVfO3UtcGg%@)D!irwZghy^hz zuUUzr4N0%dHCeGFF4hc}6?Nl?vY5G1!kC-hviifg1YkK^MHS1+dWXv-S!FdsyAp&F zM|oi*mTs;|73aC1lC(@{Fi#wsl}?%wmV>D0L7Dhr;`l|DR>?YxRz;G9@wx_!B{yLj zdL@J2X^646mYi891aaZ$1K3xAVeZ`D@Fgo?U(b0xbOxE0hqH zMAs}T<1DK~x?&p?y%C(M?pYs-ood zh8`=6$X&%gzDWtoqIDSETqkkmkm{z|`Z;4&<=(EnT}D4D*-z4H?V~jgiga}we@JW) z-#QM{gp#tXi-NcrW1zYX{7qOLvsKQn!=%b7Dp|G;LV}VFE7J{JEocd1j2s{=$!_6) zn)~HVkw9M{q_l6VgreLgTtnA89J+I>Krn%<9R`-c0!B0D#YxI)w_tI3>(VU8ptg)< zX$Gc4lUL-LT~{SaKS(N05(Ra~B>72{MXbQ^8n%hyWCq_n7KBA*-`qxioFpYdfWSr- z%%W?=%8aJlo(L6+i^P3)UaS z7PvQS~`|HnsQB_`5;mU{qpp~GM3Uui4ql#aEmQ--6s)DRJm89^exVv=U z3NVx8?ijs!VRa9t=~hwxH@m~N0&LCopn6N=y~zDHfJ*payZJ^|Ra`Z|8e-nsR#ggp zDhE0QfB>!VYp|~=E~qURaSB#HHRqYpY$Hb=SRFnS;KEinhWtA z|EuKluCxj{m^%P`K!d;js|d)$ZuxqA{900F^~IK+8C~8{l{F_~`1@Ku7{Go>h^uN2 zOwSu`ll)Bm-6hj`-N^?S)W6f&syX4nU08lDpR+`~J5_v67>F^7&RpN2_JWA(qMYWW0cY?n&6fSn*&;Iz+|LVUG zg+KT=K9K*xXMZ&Q^S^uZPsFc!q7C7P@I)6`9C1%{nhBO=>9gs!9vjoy`}>vN+V0-P z-`bk@7tYL3QU~3RCU!fL0Iwa2))&MVEunel?m1G-uwy7n^%*duSuE!p2_=9U+K;~VCdx2yFHeTaAZ_+Q7L%l_j#ef;YCj|>zD z|1u?!u-A{L{b@Sej>ogjWTMxnnYG{Uc3U{FAGSw*x1SodH8~iE&FolDk7HwR=*HwU zHjLUhO~(hr*q!v_ad(1`)5+GyhHe>$qczb_Q++Z$Z0r4GrW^H9*N^s?d-li2t-YNc zPsV<_HFi7Qvi7I(aeUDAsXp6oCez(yI_3WT{dBrFPWEAUI@ZQ(l12J)MkGZEsHdRP z)Vqzbw zlD`Sv+pfR*r2a1M_jiq{?>}F?`Teir<^Mk0ofN*o_xxsi?M`o=%lJc$EDJ5^iD<}T zTkJnjl1QeV|as?h3*@~Ay{s7e<}DGt>KWIT8@P}CPMJIa%Z zLWUntKFMQS^PzVhKiO&JX| zaXHgfQGY6Em-5Jw_2K2^m8@#&qpqNhq{~$9LE;{nekO#8!_xpX}f%LFBN@Ug0*yoXUgN}@?%$f zCSSlqzQ3G@mc@OVIHV|C!ozWh9quV3aL%QHiKy*|@MLTS+@*=IgD4Fm4>}-hQ5!~c zCn1g~Sr8mX*rXQ0t`ksf5@LETcUeXYFAD6CdX~R514Ll@bult2aYCQ^XbvE-M?7K$ zrjJ7x2k_eA!S9IU5E8oZFduq8=I&0yUCG4qtdRH%+qQf_N5T-^L_BP{fp23<$lO}m zHfdaw6j9Se2m`I*a&Cthc|qgu1-K?M0dn9I+jY$a_n%rg;=d858HJ8#6C60$r_REm z@Wxl z1Vj1D8D0e5+(Q_&WphXAf_tV-KE{PNGio`21(e50#fZZKhD}hrX@|%UJnZ}25emeT zh%V+K4t)^Qk|2vy<&e1ztc94Gu8XjVmbQzK&t1RV>l%U5eJ<^gD+u{Z6k5xGn8XT~ zHg4V+<2YjMqbhSVhCZS!rW?NuO4p52mcp|fV_Sm!9fhxDu%hdPt_l)HQMrmeA2EC# zGnT}066H2#x0t38LoA6(C!sN;0b?u(6YusW&EngNhHTB)^&GL=G$a|jrf3ycIAqMb zDQ~lQ#Zu7TBPO>auA@i;y8rncTyXA(DKFlJ9eXj&# zCXC%i1SuAuSQg|sF6kmKk~G9=xsHlB2F`9+Mkr%GV<3Xek8Bo&ET^}Op@3c| z;Tn`|hsz+R2`yNe_^hbtd{wMd#Jrq^D@ICMCajLqMUGt-#F?`w0Ggc;hN4x*;I2)< z>Q)uVfu@0&1t z4}n8mcTppkOpJD|w8T%a3&o>CA=iCGlIA92z6n`q5HxkZFGoRw>~VhJU;#Lc22 z%n+st3s6#~tLi355h)m`g8=r7eZ=B7U7P$z^s`@o%AEqQ-4FltzyD8e|A+rJyZz7q z-v4s@Z~oW+jJqFV>eI#9%T!kW*@YKWtFrNCad)4|y;xE8xd$<{EADX0xYNj~XyJ0V zSQOklliX^aRi#V#)yk%4SJ&LG@*rwFa1m|%dlgJ@-1B5ZH`lv^ZNY!9TjLas?{ESH z#C=?6FUc~G&)zuh8a$sXGvWeG9MH-&y~Wv`mQ_gw)87|8E7{$roh@EF4edokfp>Pp zS#W*@7t**mUoMNPTqIS2s{nJn9tlf7uEL0a$-d~`EEoB`$8~X!(ylN+K`PpC-H56@ z^JlxSop*j&m1za`<%0Am$y7O(?z;4huOgZDtkRs=}9A{ZY5v?M0@9qUi^9bL$F&C?QVRDxzu2xRo z2=jB_ryp>AE~+qSd|Cg^*_S2#gU|kG82s#}J^kEo^~s$t>tp2y@MWbb{w2whLfF

>$=|B^}#SUx;~y9x7&JRS(C}+Xq@z2eV80Kr}{YAZcm%({#YM3x;>p7rzc}q zZ**fk9&a|My*=G*CwqObAE$eLcY^cQWNO&@X2x@5Hk+}2 zJRNtn0hmre$8k0__O)(Jxc6%Z|4uWwyxAY^&GvLW8OQNtzn|E2F4wx|7OyC3iNr;TwkX8Lw! z9j8ZqJJDxbID4GH_1#vlf%e^GU!UyS*c=WMK&1m+#&`=|_J#ptcLxw4P_qXO9JacC zI2`TMWI8cUr`d6T0?E{%fWzT5;hsa=F!o#E&Ne3c(K-Ud#|g-}o}P5w2LAQkjHmFP z^r^Mm?GL-dUI$@p4dZaKciYX;;K~6i>e@OU$1r|!0O9CUFo2z{13jDZsXkaBnZs$X z>&JS!IZi+<+kg9?k4xvr_GA08{R`H<$xr(Z7uQ!?RK3~1XPy6$) zc+9_o=Ue)l?{Rz=KlQg7{K5NUc{8i|eS3f3p7ysu`-(o^JnVrIv@b8Rcx(G>OZ|OoVlMpUyDf>TE~=_L7(E}=7d^?62hsykh=pFu z6XmB8Iccc-qR>%9v_=nb{@KNfzfT(vcIBz3jtEkSMxUHO4@p^P6& zKh^EtbEOlsr+9oTslBK3^x;$-sq()vmWQUMy}DB5_TZ<6_D>Z-?a8{N^~YnaJ?EwQgCJ*C~fXxp0HZS}RGIv9!Ccy&kp443a%DXddK2k|(&@?Ka6A#j(dc&v zwK~ur8p6wm9l0Z`V`VUwJ6&Zg_j`bQ}No~mumIr`Yz3N;KB`gY{8bOQ1$)((W5z1Ptb18s+r1nJ9dqQ6v z^sd@^3lM7ZSP=pc*vINt?rJSX9<+x;sWbkq_RoLzlRi(ZmmZ3;+LmNZN(4ombtSnq zkR&jsQMV5W)t=;ZKX|Nnx~ihda#woX$4_&~kuJorC6E*(?do!_IPG4qJk+ z`nJ)RW^VgJ7#Obb(p3#fm6nCHWm7XVc$E}VA8ehB=ROxEbA9kJvv%v%LVOx4c zUtGQz_1pbnTj++;aM15r{YTLZ zhvfPX!B)EpC`l1DquVUhkkmGkl(IW)E90jfVEgvDOvcZj4wS)Dt<%2{a@tasN?Yl- zussm7M>3--Ir2dZjU-`Nx52FJ(Wd68Mam7VlCM(x-Ag^ zbSJ9vOfVme1Wh&+aU?8NSryf>DLiUV-1!SZ?#p9Qc_^y#6G@i(#uLeU(Cv-|)scHG z@rf?CFFNCiq6;$IbS*)9*i{~N6jh%;QQI$GTnr|i{&S(*n&2*wr@9060zO2sEnZ4P zS?zSS;lss&=f^hIs>@9mt&q^tEKK<+$VQ5lJ7d|nuZHL4sgkVgtP5g)lUwFPcwE}PH`<{hed(Oi?_T1wk zu+TSs51HP=vz@?1%fJkL6Pp26`3pkBx#{r57Mu~_fWVV$ zKpcb-wg5f!axnogJbH!a77k6vF##Qy3=DEDMBRwLreL3%z!@jR1j$g&YqMenP+-qp z%tPNn!F&!XuogbZ#)e*GiK%OO#HV(^<>?^+MvT-U@|U_Y>Iv!2qF{^ z3vs#~9^;I_kbN5z04*qr0I&tbdl3l8ZLAx} z4SYJMFs6xBQx9>p(9<$O<2)eiTW07G&Ne0<++uviiDNH`Gbdmcc#h1-GeLTshLGDI zrd9+40e|R$YAj%O5r$my*1`gF2bLFS|Lknhs=p9xY-h#L{Y>TtCH|0kFUK1ZCQ>mfFng7$7K{|n-a5v zh0X^_vqXy}jCj?}3MH&4Grw>c!^N7>Y-RKHAB<9#-sG#)MIizZj0M^4GAGPk!yl(0 ztcVz9u1(pBW42fj`EKD_DPDObXE!O?d=O?UuuzLOaatajM8);o&(b2xR&<#X7G>@t zO{xVjSL9(5$A#-NwsCJLS;tAViV>s9D)!u@+%m!!VX%c&u%ti$tjv>jlBBG}WqHkf zyQ=CHjv0-B(Uh%#Tjcm9Ck|aRx?&$(C&e`nbFLVBRl3MYSpjr0mL_2oxXh)+Z9pBI zg=t#egf~^lSe^hfOfsKAKfV&C4A*G|x``QBby_7Bwxck_c|ohB;Pe$0T`(TdUVCYd ztR&8}Ri4A(_%>SSYlnhpc`!U7QBK!{#Kp1^O<6Uu(Qvs)QUHX3Y?p>{5~O@4A**bK zbLOwsKnTpqAp#|o>mbfpobVM}IJpi(R?wWmq~roms9@AVt04E6jIV(`E6(ec7!Pm^m zP+_mw&8rBNY!$QeCW}G$EKGug;WD8tXNm8|VCkzWFX0lZVz3(9OVX&!7FiL~q9kmy z$r6;MBrC0?Xb0M!929w|JUr+h6GOs_6L_6gWec+imj40CE2`G04d7j=nms5*Dg-dJP< zpFm|ml4f1f-Kld3JM-_xH|O1kzR$72{F;Vdg%>=sUxhiQMRRnQ4nUXZKW7mYeiIS* zflb%v$pG%1R`}e`KqEZw-ASqTV+1aaL57C;@r(kIEp27aL>|R(XcoxbpdS5U$0E! z>)mh_C162!CUs{ZPD87I&pNIMmxSZqk-=>xe4PTqrTlu;(<;h2YS6)a9&@uW-w+^P z^3_y#H=~_7ba7sV7rsV<&w^apuhSiPZb@#zJ4f>^Y&d`s%Q)b<5h0gLX;*g{E9aDp z{GKMbX?=fDRz*b4r`@QeTsb*u1Tk-HZIP#Eg6M0c0oPlUhV$TjpT3a`A>ZXf{BN_* z^B(@@T`t5w`XO>52pIh@!R(2^SMKa4yW`9_o%D&$7wlO2Zfi})6JviIACLN>NiMK! zLqF^e`fM_;560Bk@As$ie!So8$CI(XKiP+|ZJmx&eN*qJ``K={-|Lgw-s}4IwAt&& z{oXk7wccQ9<-o}9+J+MXS^#-SdM_tWuIAD?CudjhoA{#aGPoQz##Yxk3%YL9 z_V{o(Z0+&U;;WpRWkp;4c-(9zI)E_7#}jnpGTKcxV-O^ap4u~edID*j4t%B4c3Rgp zU$wNej+17oQ@sVX)c_p2=)l>AXH^_({kStWM{9T5Z%=l;+fOziz3~CMPAuzq+=F@y z{j@Ra<7RrO_W*d(taUn$560f8LC(i5h;KYO?M_^1p#IGUs6S4&N8Qkk*~LGfsOpdH z$M$3UvE8?~r&+u^x#COhYdU}B^tXs>f9oLf@;i?E7VW!+<-bNe?+=dm{BpfD=NpDE zzl7m!g0bI&jOF4!=zst5btU7zS@>@q`I||1c!x#Xi|>}+@+E$q<=0$z6a71w{mP}~ z+m=4QOIqKofW>b-JL4UaeaEFYQZ(M4M$xpd#)iKpTKtt@{kNzF_pJlazk$Vs-xc=P z$nyQc@t&_f`J(*3X?5nSFJX9_?CbX+1D@Q!B-^hqBKXZ5y|u@0CfVQ}#`p90%8B?! zkgx8)zXjUsYws#+_?9v6eY1VzwL6eMY-P*0w0Ea?eO+tPJGehV5Px+kipfNgUJlxV z+80NPpe9dysx3<`O?@_XR+=ozozavpVSOM7Qb+r3SsY%;t?r=5Yb`3e{`Wdc_jiMN z%kIcap({!kLs@t#Jnmm~G&vfn%B3Pn!wW&u9!Z_vXs8NpXP{^^>8IVc+*WwIY7N_0 zhR_?l6b75C)>_sy`Kr^B9{U~jvDUkgWyMGa;=kPPw55@v$`5ZllgrV?#C`nOkOxw` zBPoNnWIk^ty>a(K7drECzby?qT1%9L;d5DQwfoX#cVNw07yX`W$ckWe#CR}RKWU3E zhN`@h7E*U8c7=yxhgX_xEBz3yA)b;LDn8i#!q5Z6IDqbN}4Eix{_{eU^FzVB?xV<{%36q zhC=UdDaqaWQ#({1_ns&NK`}2bhh3t1f-)LCY^fbdR+Q1DFpxp@7ngEdC2}RUq<%{h z`n{IY7nKWLvjnj{>|OPYmZS|Xo@;_|DLhq#ktlrJ`&evE`j5xGZbxZ%4Ox5Mb6Vm< zr6Y)POEKG0`(hyIU9tTah0=bas3S#d4Kqm`gkN8opxVqNur=@t?rcu zRypdoo`YO9LF-(Bw7Rm~8(tct!O-aIx`f2OFlfE#$OmMsUwIyA2 zM5*%0`&A%m4+rXasXb{aLTmKURiv(LC~a zl4W5ae$XFXbhCt|M5#j>PwQ8Xqq-w;1<Ms#>Tul7{djUnJYr%O3 z`L2z45vI9o@)f8UQ>%&S!x^6t#MfEVC7~vE5D(@Dre}tHy|PIIb50zdkwFnLZESjh zZ-&?-*s@9BW7BjHL30{n3x-)fBG?VdJXkL0e8F+xS~m7fZ1J_vyzD0lafp|6>3UAc z5z~1Px*nyzNgW`WdJF0WRui;#P(;i*iX0k+G(s7f$G#%K%x9 zMR6E5r5)iv4`?Mk1t7oI1Dfu&9Z`VCkAmCk(AQf=6_|EZp(z`4Ty% z)hwv?d7=fL+X0=!XqN;eB)osF4-3t-v^VZJauL^cXT z-)=H(sEa~850FDBjC8pW0g;KY2Xs4V0Sp7jAS2=umwL|J!aQ$bjzZ8wzzb>eVx@>$ za1Ng65zhqiXy_t}{V4Fr93*A&W$I>NSs;RF9&);U3-k*IbA)IJ^zp^^Ho}2#gV+(z za4`d(!U9k&JM`V1U>}YpW92zMQG{4y#xm8ML2>xje6jt)OzMF;BSe;P(=37|GJUtHNN{fa2nTQ@d7zM{ssZKMR^0f` z)muFe<_N3F_qpd<514=uDpN1={f!A?EjhcZOnF7Mu;6 z+P9z*2Pj^;I5J%nfxVpzxdj1c3&s+kv5e)}EefKP70cUs$mr^}V1BSodFVb4^TI2f z*mVlz@wM5}`ZmUt5n?lz6Bd^7+G8|EB}!Pr;+px0R{*thzS`Z50lc%m&Ha*I^8%e| z@doFeseJ2xs54f zF-t0(#avQ1C0pfTdJUYUAY?DfZ;~hp7-cj80fh1D3@eUa?hL^186a66DF( z$fvpOqib^!qA1AG8d1d381ej-Gz+hTl-G#Zq%3S!&cl7rB9gL-5A|d0P`@fz94&9) zWX$swmbY8b0ZeVHS(qY{gy||!jim*^PI9U ziTpTN#S~^>umgX-N^p{pGz0N4k{9cYVHVR6M7$&{_Q9;v73C=-E^~qU)hcBG2KdUd zk`x}x5=vtlUxN@roC5KzWF+-`R>m%JGgRRclZ=IMAtl!dBVZsNh$|;K29@7pwgQcZ zH@=6LDM=&D0+>3pgx$uVAh44>AxXwFe3m}T${U6;i`H-fr2vAKNecS9rs#v)u z(n`RRXMhE8t%J14L&h^%q8!CA4J4o6pYKYv>B#2P}h++P98L>fJ&WhbQ z%p)nxwIoiH1V;=3Cozzc+@v5Rljp+(^g1iSPzd5?oZ$@Q?*>kQ3Yc%gtYmPS=gHiH z0^rvZtuhwyJg={h4JOcyu0ivEXJ!OuCpcEdeEU@c13am)(pbDi9_Uh5p^qGtb%1EXL*`|D&I&+ z`44(cN=mo&&Xg2_D!#Pd;$iC5eY~2dk`zr?eNL-r!OJV$1=ihVx=eT2uxqiW?=>8kRpyuz`?quJGb6>t*zOvTF};iZzRc?p=JB@e*IcX$}2KIbt=v)eGeBmY zQ-2ocdaeb@mP;V`^Wqo|!RI2wO$q}%KxFU*o)l11Qv?3@A z0F$1_cxT=MUSZftJSQ#Ym4zC-fY0Lk1D3P=oOTg$sm+m7rd*fST@D7dxmLZHg9m#` z;PXxyxfkBo-+(^LvltUUCQ-FK-x5prY-nl7OB7oG^PG@#mO{=Y2VybH2EU(H^YE?~ z#){mDf!jI0*jV)J{eIv3?lqinT=C#UAZ>ntW=$|P?j3VCqHRd(`5MPOIv#85zb$>Mj{U$EIjoy;Z@?XCA zYC6laA0nM4f)~MG#_+={Y`6Mxe>#or3AD}8n4WlbkEva6C*z5}GxWVtZ;b84;3+S* zVHsOq*5hFC!V{CJp^rCP`(Rl-*=5i7b{hi}0J69AJum06J)L%^(?mB;hod#yO!d=g zYxC{rcBjM1-b{_dL?71^<7jNpwLFfzmWQ!9ZmiSscslCSy>1_0E)aoX!s;DhIm)F+;B!i&!ud-!)e8N2Crx2cbO zr#=JNpIN-B$NqTGH+F4pYvXV@ZYReB92t9{?>Ob#>KPMjx1U<|$>2pzw$t%uWAR*= ztzPTa2Cmm90I}QZ6XV1abxzh%KOAeE!Wjp=?n0Z|$Hi5K(Wl}X0%PoJGm``YH!Nq`g1(0)9wcbwb< zFDPP64Baqv5NKUnyVLfx-!)}C>dk37-GNXJr$cQ+e_jzpH@5ohIGOH$EaLHF`?3Al zzOH?j^2y&<(0TD4H>-Q!_HBz|e24a}s(QRhs=ZufMNQ@K>rde9!HD!T%M=xEICuSYYB^{=-pA z?Fp99$B+G6=>>Guq|44kx%ipfd#tucVrL>tq9$sRBq@gYs1*(#3qatc-|h?3N0K&r za;3>r>E%^N(q{Ul@?!Lpo+7JVResS@hpnMF?q7-W2mNmAu{2nlYR~Qnp#!=}Mgrod{jUpR^o7QiZM{U6dW|v8p{4TQ4sL9i{KLlq+E*Yh7Jcd-6~gTXIY9 zUa6`enHLHGABvr}aM78xw9X)sWbE~I!IB?ny;esSuk`LkPs6;@Lq}+99YJ{bSegtU zT#8G>e<)u{y4UMpD$gZR>~-aq*L@~;_$HkfLaQrxMk84fl)lpHf}A>PSGp85v3GeP zf;}kG6hhEK85WLFe!na$l6R;cw40`Lf;9TMv3;aR_p451t9KtWL)gul3LqMM>#i zs-n=JOh1`RJhS1^I2eI(v@c$0Lq$>_%mks3dTO_?Ty}&(Z>)?bLa7c1i_t(7%;!OG z&^N&FM>BocZMB~p+9UPivZrn2-mtF?K)GO}sBN~4D@E#Q(?002C4z|6r;ppRpk67e z)RqU5+U`8+tralXOQE|JE=55DE+@uA;h7{q>!`|H7u88$y6g$kq@z4iH0weC;Y4wV zf+Q+kbs)b`iQI3i(x`1c>hLs}2Tv|FwcGA$VBwwC6G63~!reHKy27vp1Wzu3ohMhL z(S_1|dMUNFt~L>$_jzdxb;z@PB(X=wJsGqmiH{^f*5Lno*z3c`g(S`7ZcBWq%I)4` zYp9OH0V@dEo-$n|!BF5?GiQi{N`)Mp3jR z)*O4t_vbv4Jf{TP$XobNr#YaC!?`U|It@neEQbLlJ`bhnQt z3HfPv374_sM}dn&3z-2%)Ct1{3V{Z%sqf$s8kr>WsBiK_3hGA@rMy@Nb@9?9p~s`C zj)$=aM}h6lF*bSP0Z+h)C?^>R30y>x&-Vi5E#lSXDfWPorm%yzutFYvjeK4QVh$KB z;+oXv1>$K0#5&lf#H5ICQA#|^LdXd{7x7Z{#5R!&lpsLJ1=bWtz@*te6a$(Nh&3&q zEWt~$^FkB69L9VZnx@5zJYZy5E*$cr{>W-@coDUI9)HH+(hsl|@`CXIwUIBc8Xxge z1s-TCux%Il4v)i=An+VyVIP^qL?G3`qlnk_cQA1YFWG_2W_MLQ=Y;eUIf9FqK^05R6t8LGIT-QsCcH?0 zxR?W7a2+Jbw~6%t4xHs#34FH$kl&JTjv59aKk5>&JpgRa`R)Z2taIs^7{Kz41nAO% zp{DJ+oLlU2?``NKpZHe5&j2-?3IJ^J91Aq(St}H*GVmKoal7#dH+a6uDwhG`l}{G- z0%5>v@nRW#zXFd~VZ?=Q%^S;KdL9VNr8HlLC0BSsm%!%Rr1EqW0&2G~FQ$U96Cw@=^Y;-H**FZH zV2&1?#V{mGzW1)#?7`qhJST&1w(Ev8@SUZLeSfjE?GU;A-k|=Rc+{GQz;cs^koj56 z){N5IHA9{g7KE*{G7FPcmXRc9F)yBv^MK`1?lVv&D-srC+wmz|uqsV`nk1QnT^`$Y zLpNT9e20LTg)0=U<|X456llRir$riKwkEeca?G-uoaJ?%r7U1pNRl9QnV%)BF5@sv ze45jWxiR7?0=%3;=!dyasxnM{%vhR7*D;F|e~Uhd$ui&GvOH$QOAAJCLEX%Cf;7uX zjN>dXGmNt+iEuHeDBo0(Lvuf*ZotYM0OF#EqaX@yuMq>#byj4!qy0ild@Pak+LWT>ES6fK340zbGIPih|W*-7p ztfCL{rlJU2yG}+@zBfUg1TLV6vTMFatDE`ENfX8kf5c8)!n~a^Fs198Wo0tHu|Z6o zO+nn$CwW}4j6^J9Rl+Ds*P)lvW#}`OaM?$gMfv7KRsa%m?X%l>l`yXkE5PRm z1(+F#1E;a$2N6(}*fb7(pf|iuh|l00UelN^Swg%b1=}tue7F@C2ruVwvsgfv8aPir zh!Omp&=_tCn5_^mV*=BeRWO{cFRllm4ufwDHb4dHzw?+1fk4Xc8h`iFe!;mLl%=XVlN@oWf%rQ zmBL|C1BwbQ8aVUwNT=DLVA+7W-!y>-Vau{`Dr;Va@yc(? zJjB3Ae&46r5h6TCYw!0w_2Towe|X3O;^z0;I=s>4u3|(}%;GNCOV0t)CVpF%l@+hf z0qOGGamBAT5o6E22hzmovuc?op5vu957^?ecpXQ@%e%T1sM+zA=Nqi+S4=VIRK?Z80%XY>d&8pYjlD!Y7?eVX+4<|a zN<~l=8F^jyV%d=KdEmDR*{2jlmEIL>0EslYAaLjxgu_Vl#O3uZ7G&8}A+f7CjDz`# zp(f3l3}3T zzGqbFjU5=j{_3~#RxjSX)T{$Ncd?sG_PadTKYynW?7Nhl7L zW~H_)@}Y5j1$8myEg48fk;MK7jXc#T>|j_&^@3YWJZtxO`}cyj<$# zrJ%KbM`#JXmh|YVBX$HygV+0!rfFR{kyJxz2coRKT0H7F%fEU1c3XcZ{kwmz{bTVWg*S71;aeWOvf1#QMfpz8X24&w0)K%`c#Xo;obw`! z5xhz8ym5HfK#0uYT^EHsFQ1oQB*f-*2C=uC&v|Zs1P?>JS|GgDnY<7m_ADRG?O++& zmJ9Ff3wHr;37+FR-U5!z<hO+0wCi;KKkdkj?$yP?++;Twff2cGo`c$q^q@}oIC(*_BH7o2N&T65qj zBV56=5M7Wmg*P#VP#$>Z+Dm-m!MhT@e&dPb&o7!Mj{kS`?v11(!mCrkdq|l!KQux0 zIvdJuGS!;0J0bk8&CkD2Fd=4+>sP2)@{&wV+M>TW=d?v$QNcXS=fs>>X$oEb1VS8` zz7{3TLU$2{%O+`#`YW_*o-5#$38vf-zcIUsceC67clp(gv;X3I-#9zU`Nr8vEbug+ zoqe#6%MtZ6-+@x85&HQ$NmWWn@xm{^C+>0sywn^$(3%{J4+#6F&OaAGsr)Tgly z1M0(ev$Zz0u5b4{qn=pfjSXKm6MaA3%_ep|+3jrTVOWPrJsD39d{d*NeK^{+y*W&v zpFP`-H^+LSZ;Xw__b;kz-I#8sn~626>(lXg)VEe$@2022&f44me|z8Z<4Tj|mG4YD z{it-gs(h>N%XZq%_xtViBePsp{=TpK8w8hT7!chE4Xu%85VHZHmO?7a3$NH9jl_Z_ z3j_-`vl?lJ4IBOn)=2EoNUWMTS?}k)x4&*c@Ws_Fr!yl?oH%iucE&G$=d8K~?r+=g ztYx`hZg*v;3n6;2PTR8V;Tv;N$jYj>?noUhV~cAlTYP6;?RxU%<*JLDN^)0O4SIuB zAIsfIy$u%8FC}@^mpUulroStCctGW9g>@{TTEFP5if&&nu>N>>-J;X$;UP)87qh?r zSbi-3`^$@8@cLJLMc)?V^WXHZ%lz8%I1a-Tt-qo?zd=EH)QtjX?z(wy=ZpHx#Rsxq z`9btphcC0xJ%P%XL=U+y`I)rmU)|}GV!SHosdmrn`|wxZlOPFCpwVZr(yxV2e=r99 zSild#n2TrQLR1n@@4r92-|h3Mx}RRWc(%eTZLiBKaX+4~ReWhe^P4KyZSPy|%XS^S z*2lfv-OrS#gL=MV^-~{yV@+FBy(iRp;X|W28O~a?z!L&blkG;U)#2*(CS51n^m~yx z=9u$ZugwU9K0}j4t4myPeDPLj5=SB@G97{!1Llxv|LVQKwhs=wLXA0Pv}TVTk}ZxA%eF}UqDBgDJ_^kyCz32h z^ypf%&Y6dT+$N<4ProJVghG(DBm7wNjuJV}5$nYsE!1jFj_r1O%m@7Im7!&UI}(IF zil_D|sdbD6iG+yzZ?jFF*uxbVa*vU?Zuc$00**oLHyH zCUx9wk_06PZL%fNO>%#)BmUhQK@$yfT5qwU$ow(GOnmYk?xV(Xf=G;;gmAJ))tYRR zY*CESrfX7zdrymp6k9($p;(${y6qF5BHs26*}Xr0``16~Nfaf}1XrVJk?hfe%~Erb zfpiiiLE<43tR&R&gm3~!vm{40Ydk@8$u`OI2kc>!YSkoyq)(1pA1I0^It`j&7=~NWtw^X4+}s5e2!Kad zkpaWgEC4Cteu^LN{3=d9z()EQ7~ZljE3OV~W<^u4NV@>C>J^Jg%ylW)+CNN|X)kL=$M|__R85J=L|Ya+u=^ z`p^Y7ZI#GeaV%2sAGZ>^v7`q161hVG2cy1L#1q!umI;!D0 zaMCgGX-6Ib6&erT0&sMMCkMcA9TI?hkOkc}wUKKYCL~=L8OFqwJ%E>G$HL#g7FgfV zO#@~ZnBkV?U}arMDXp2FX<2F&8^FPx!g2!Sb9Wrv)|LVO#8trsAm+WLSCQ@WB+Sp( zD2(GQas#bE(Kk6TgfkmOdK9BY>@Q}E*j*%PrlH8R3WOHc90m9oDUpX#H*(d`QKz|S zOwr0jPI*>NOE=0;kOAv6jMI5EyRb5Jo+c#%wr5&J!Jo!nkuJ=1W_s}wBCPv~H=mwO zfxSCLPOz{Rw*Au*SB#)VhQ5jX^B_QHD0Y|Ae2LI9nIbPkXf|E@X^^57n&lD7f+9+j zxtHcCLUCZv%Osn96D*K6Majjyun>S}J_2YhUe4z8^8}%F<}Ttz7Nhyp$Wh=Te~Lom z8?yvsEF%a6Z=OZ2X-`q6<>%fEtujdIonSK*({i+PsiD9Ym~aS*b-Gc)p+$g?3o_h|x&%z-9)I-j8o;-90?M_!mlGe4Z4 zj`Se)rtvC{V_R{~!x#@gy6_eu9#tATo>)!MpH zHoj!t4O_ieW1PQQ)YmUR>ITXU$MGI)^pz5mmtDYl>B4P!W^(TpSpNGjce%#@`CtBg z@&5Q}uJNDKzk}t!C{2IvhLK0CdY79L!Z{CiO1CR3>)k-!t(4xN*lxD{L9bkGx|{Bx z9ITYxw!e|KTe%#pd%IHJmE~?-7QJ0}(=VlJ;jLem>)obXmK&wmb&9n#*ltQ`U3Ldu zWhL*nm&%|kZ?jD|eMZxma(ugRNAq`&Ih!E`-tE>;~ITu_*^wcroZ*_GM)StD16A zEoyF+UH`H-P2iSe$7(6nvgWp2mn&J4xvgR81f^E@R->zyF%IdP{!m4H=ZM#wr_k>4Y;`h7lw&<3ysJY&h zD_GQAhh=oSC>z(_xqAItxH<%=nIFRjKsPn%QmZ|H{$ zXRoj3Xg|hm zBl2FEyg-$FkwN)&>bxrbdfd0ee=RQZXQe+gBg*|cmGChj_s@)Aa=*uyrvJL3dZpg0 zkpIietk17jUOWj=`}*?a#g|n2P0E9H&F95GJ^S)n@5R&OPmh<2AC%(sR)yc{;9g%( z{-IsnEf7DK<@zPE;fuX~-4gw)(jPm@t=+$rHuua7KDqoLQ1GWu-+y{e`h)1tFAn|F z_2ny3)#^4pLeMnHGPPQ_0c4$@y<<2@q}na2P7z0Rho*>HZ`C=cD0(pcQvWK2zZ{97@@OI;66_du% z-0#=LezcmOA7`lBTHM?+Fw(!yeTdcCo+G zPn5M;#E{kd#!KqKRXk6BxEmV6~cW4optK^FvT#lZ6Pc9MvG| zdpyC?2WL{3>ymVx;11btQ+Pv=JX1D4wTOSqkeu9P>Fn(Z*=%0U22HUy}$aSKm7v-vZi`IWb>`UMB2vC z(_C+C+H$r0>${q#nw~c_ouOw9J=OMPol`iB$1> z{1$#lz#m^XVL9K29y|vqNDx)i0HO-m$$`YhLsg!PEZ~7nOjEZ<=1_*D!+Mn-8OSPQ z$XyHJU|m~*P_9_W$gENgn~=oU@GIg9uy9<5er>3@zh+0L7@V5qCU-Urm}~ z%Cc&YEyGrUV+M2~Tup}XsICQ&hwWiKd_2pL1=#egD-MpVR!je|mCwSnGLf-ifF5KT zildvl1z}C`701Pf@_>hD;(6B{-Ek&{syRa!f)QimIhs41$Ts8!b|-el7=sye#*Suq zmNTw0K|?-c>{z2=710$E;=-h3_jDa)WJS?OL%<)LEQ^E0DLg9}FP$O?Vg1{%&`$!S zJBu_hgD?vGAVzVB0u$v$jjE)2VOy*-Tyd zDT?!CW}z8m{+yyDRf3CRp_&RpX)%iznO`6cUvkDMS|HqwmZvUCkQ-g33oSF_82NsH zA`hJ>WM?SXPJw_GpCbPP8U8$BsvQuz~6wSgIk0A_mEM#t{ z=sN>Nt2H`{g22qu3^(=>GV-7ZN(W^*nx~5e3eONK668lN`W6*PSz`ChLL*13ERM@G z&dWGBO|hnF{4HAMD-*Y~gBcceX1ihNtnhedi}`FCp_z{dJ_0x-DT8R0&JgZ7%h2=; zOY_kJ+hpcDDYk?gFOZ2Y60A~+9R#Z|4e}^246K#6S^*}9KPSs*I>*BT<05nqP&vNJ zHv1RU7XT{vONAzQH}U=MErfe_$ug@m{<9dtmzM|Fih0E(@gLO*o;Cw$CHq=br@~`k zWYf=7yeXRe`8rp{$=z4#UMo6%0lxSxm+*1c+pDCt`h!ZZVN?0TInJw)spcz}pTUl- zn~Kk2GxtqZ#e+?ssgysS_a4eAx4-Re z2i;;@O8v`?TuR$sZ`%Q|M7rEvc8cA$vyo(o1i2|U>+SZkyY2Q0EVNv$WaU!nYa7M-NCkh*_GEjdDYwPE-!aw zN5Yr7Shr$5D0Y`Ud5aa6%c4|PyVamq?x1g_=;2n<<)G*n9l7Xr`n|2Z>2%9=e^ZtK zV)Y@Hsoa;8qLeSo&UUli;6|I?mIJS8eI0b@)|I=Vz+{8 z8);MG*Ai00%EcP{z!v}ML7v;rT3X4wzFb^xmGw&A;{PkDS72cu|Ie)3|5$!3KbHS5 z%43LbJjTz)%2@M8YK1F6m&!zr!+lJO0mafM{4o^c0csOtDJs$o2VUbG1$ zupCduBXu~@0qT0t=4GJli%ZpTf;;*Qg!5{6PUXqLmx-CYa11LYqX#t~3Lf7=N6L#m zs-v%ukNF%>hNpG%kk>J}*5P3r8CQJ>Ln$``CRg?3m;2Plk52rq0$ol(E9FZ%_<xOj}~JPna}CHA&_dXd-h8}m>uu5h9!q92!6 zJGj00S?KTKkc$_NALlN8+U};Kix>GS7sc1(kk7UFRL$GPgERN*-nTh_xE3a3n27MsOjB!iU$Xu>GHPO{o$T|zTM}` z%l12c*&G1tRxm9*#}gkq6vgoGIN_WTc!6ix);`VuL_DbxZyQH7iVl94p`yc+3;_UB}$-pMto1xt(wTx zb!qSTkbKu*4i3dX?6j73k`ri(BAK^@(4_?;IuuBPY2yEBQ(_7BgvMRdOubFj-s@Zq zD|bA}JTCs_`}zk)NXRC~zF8*qn$n=@8v9XrFVK*NlRs-V@u*IYxpw`S<~X9m)(;L_ zY*Xiny^j}Sooxs$o~CJ*;8}{K_8NiBGjxOSMdIX;6zGXiYqklIVSmaKRJU8>2ULrZ zSVpSXXu3h}iEK?`x;)Wl-U!_LCR2YW(QkVUJ?RyMxHsq=@E`Vm#*!aci#U4oGmbfC z|JC6?A(#WM^*-wn6i3t>)P=${o1F$WBPm`S98h$d>hj+jJk$O-WIM;a&EkQ-WvG@( z9kGPmRCR$NIt0^ga0GF}lO!Y3F2U@Pw7?3iI-=-fVZd_ieyhnH@?3OCwRu{g$pcOm zYCOd>+7uNKWP>IeBMKeSM|7=C2qWT%5gPk#vAtJoe_$B;B<7fH=% z9h!M|TB3R2Px*u(66_nQ(V@BnnkLBl-{NNN)`waR z&u*Qek9z%Xt@e&)8x(;h(1+MTxLS*@6K_8@>ez)o(&Oe{cSwuF{1>c1@N~{60?-jaHo^u|aDrC-NM`t0Wkbm*&)Iz1Lv=jMVoDilVspl)!Q==FM;**0=+X zY`X3{hO8f)7?TA_LcCI8XXxZZr zI>e;bz)-l+FCNFpTnsdi)1;F=-ZFq!v6UHHf!9ucQ)jvLh=o9`g4 z3p~}}4#>9+X7BKHME}vB{((H2sH!^A#*^W2JerteZD<%1*)(L`)Kpt_hOXl}wrm5A z4EaVK%dp3$ZJOo~q5=Yk!*?wJ>@3UkApa>~(vGWGs%)q(kfIuE<)x ze$7Y*$ks9O&qLdVV2Orl4 z_({PwM~)B3u&VpAUm>RW`A~y;I>_*J-E&8_YdT|NJOa!ZU{22+0%q&^hFRgRrfp9Q zYzW2DG)M7lP<7-Um*aT|^=~?li4BR~% ztLB-W<`3~GeMs^N0|MCqUgOKE?Ybkwl!sU8TQwh#-O#HI0KocE4NX_8kd~I|PArI` z3R@MbD5ws$ie+Hi>$;(jE!#B4mN}{@YeTS+t$KiAL)1~z(QMc7AvUOH`$ItS@spn| zyCc)GELXJ+NLA}x?RK#IF=z)7HZ2)<=xXB%q4!-M&!|4E6vK{!)%1b$W;%E{jt3!T zeNVUiY9obj*oIz_AAMUN!Y+of3A+d&z^LOJBh~V(p$boXDsE7jbf~EYb|1rl46DFe zw1?Pte8(_VU8|lWfT9Tay=(a+8O)C-VCdq$z#lAI^Rc_A)m{Q0004pOJjcK)ScYNXcM}JD zmW@@HVYVk~rLYaA1shvq3tPwn_km=kpr`L@rVAeq8Jb{)N6?Gm8y5JQJH-CyT`@sj z+XaRpZ0ndfmZ@4*b39!TKo+3-Gzw?ID)Z3-p>v4;SfX#zC5qjA9Q7UiU_d%toG?CCW6)QKE;)Pc$F71wxs# zIz^G5=vg?4eZZuH@Z2|&=mI-qGEFZ+d{&E8eEUE#^3Rc*rBf6xWAAK&5~>u#7<_-bTkDZZbu|Y>Hwl zHqabbwX9R8h+_z+iDDy3eU#7LWsIgngidEGG;`H7vyrc%#PuUT3l?6O*bd5UKXv9+ z1~>Ntf3Oh3K5iluL#RnF4E!KT$DWa!UhHP39nb8UlT7n0#K(D#<`>h&8l`y}F6a3y zwWA=?l^C5S-Z}Ch@8ukMNj&#LG|ne^uuS|SnkC3dHDse?u|()BNLN$OI>!=G8lDCV zY%6?}#D%l;0?!Yp=$j199p6b%=qK6vEb}uv$gLmUxz@FGaCU!|dfb@rlUX4~P?AEAXB#R$zklor?(z1jTK1}F{h)C2*o*B@j}?5oU5|qlH%MkagwVAT%6eu~*H4%9$4^ifjwT0mApX z2qj4ndv2y8BM4(NHb%&@)^Qd%el~@j6!>0-Z3uBj@mF$|Ws!+&;IiWv6b72VNbsGh z418qei^R2&?dAyI<5DB?onWO0(Y?(I@Zj`_{W<+_|7Q8qe|)z5*MIUqmjB_u{!fVe zbqzje*n8|dZ1#Gi0#FZw=eT~4_Y^$9oUaLs_LFK?;WI1Xc@hJTZ^N5sH$2>6zT<1< zs27NH6jwuW)~jfuPL!)gCEvV;{jZfy zK=i#02M?zxzKMx?QyiH5>YRB`$o(2uTOaf*QPW#3(g$91FZZc`wR7UmOjv+1!Hus3 z-Q$lwuq1StUY$yA)k$yP-WU-Ee`~M|WM1vPx!s_l-0LCCZ^sXZhI)N?!??AtwRpJK z;~C{{6}o3m`&xyELwHi0>-{X_J3qMFOj3=nx_tZ5yxFTE-wfw*FX=6LIjAHC*VnZh z;S;!Qrw@6>X?!F4sXH3Co!)0fKlEQD+Zdt+zKE2 zXwRRb$PfMSd*q`yh`$emAWpvjL*)CZpJW02JT#OB7$qS>evqLEh2Q@<`u@*+53Z9W zgO51GE1v<@I2om8zjGOL?~% zD4M=s>DyA<7`y#`w~_V1ayeLUG|eb=U0&^}1WV;=DX+BM)w0~eu&e!ksRO0ma&@Js z>j6wOjMZSfAMCb!I&?3uR@#2K-S4%{O5UhzUE3%-O_c}QmAc&MyZvq}Z&hu--mc55 zm8LC~)lycMYPs64cdD*mZH=X(Z}(fJr1aNoSzdu)YuVUqTB&W-QdQJlxmg+de!bc+ zfuONk=~}5@?KV_^-MZZB>+R0iuC=Xh$a`HGT&?7CsSb9_4G3ZASEXTWL9lIU40eX0 z80+0`Q0_HZmUl`igAI0Ir0qrlBZ4b5W4&LM`%>G(sH^REceT^C)qVvYQ1E z?+jVp?G$xCkhS%03yi?9#((@*KeeCQPwl7n!`t8f@QW;q{^*b4-yY`g|LPaPmz(jW zo0A|If93vfzD-{E{?gFt7e;+i`fq5D=6{Q>pN@IBeq!ZkP5wpl zH@!^SI0!ub;>2(A%s4QAvGrz4dfB!%D#m~Ro$}ipg?ko2{e1-TAYTtc3gYq!`yB7z%eCONRBkjM1)ThS! z?z1nnJ*(8${6I%MO#GVNKOy#8anqqaXO-^`9KUR^Z}Lo8{rBVB!G0gg7de0Idzl@* z^WhuDJvZ;A_TfiI=x3Jx@Kny1+qZLOe)(t1TlyQe@OpaMRJdcFZJza(O|JW2X=e-) zl;idXe#&xxlWjDvj@dUohv&5BZA0Lh6Lu(YZ6q=EORm*v^ye&l#rJDgf35tCYw!Zs z{Yyzb<5_&!V|BLC;-va{o#CY88pBF&jn~X;#u1xu8&b2`5ZPh3F*>RlLQ@sa-!gCN zzf*f%Z?gPRP38P^TkHw79w&Cxv$I~mHT@Y^7g^Cf?zef-6uI(*m-tNK7b5efqrY8n zCr2j}zAm&Abi^z!es0a>v{s4(zW#>mDC{NAHJpjS9vyf3r$?M{#2`hOFp|WwT)SUu z$!|nW;Eo#2`QQ~JA1m|rBzoIWrG|=`=4skq)rFS8AD`B^t8<278KL{SdnU0*f+ULL z>so{1U)Ne(m+f)faYt`3+A+s;Wj^gI^=5~wgVDG~eH04aqvPJlsP#`<$FKOh)DXlT z`$m!)V}_AsNo_JhU#r!6HJQ~^p>`@Uwc6lZ6pjXcmK9EGQmfVJ)|(P9ORnklZnkSv zhN<-#p>xdEdFhB1&bTAC#vBVA!=H#OqlmBT%DK$&gXUYlcQP;rr(LGiZd}&5Zi}xm z9LESvg*mBl&8FHF1xr&JvLKxHUJDFo9JT8;>HMfJavVgH(vn`kkvKMDj)eB#KL4}& z+wM6qXmdjIx+O}dA}7>ErF+_|_j$4Q%B?HhKxsGmi(2EN-I0Y>gYWcP1FO;H+b4h7 zlX-^c1+lh#`-*LAvcfh5roptE1D4}kBaS_j#YYjq~m{-1M=w#an&COd33B~YW)ZuL1qY1JeMXi;<&j%S$; z+dt;}gMJ4>jAiQ5ZM&{BmnWRmtiO`#%n>8XNAMxn)k~I zf6?T`w#ahz!L)wCa0SE*MA1k#Jre9;4Ek68bV@@^e{W{;e=9>dSX8X+^<_5R?`6b(K zi+ryubQ(Og*B9+!r_OcxW3~nhl|N}*GN!>br4A#UFUCW+%XGnLT}?XSYqgpvwj^F* zg>Ji5`z8Ehg9B{9-(e8AZeWh5w(WZkLK9>ogn|Hj!(bR76HVd5#3K(rY~*5WIYS3t zelW5FJ#cUUU4b2-0F52X$8LaJ&o>crCpz|m>K$ziZ+pl#;LQr#Kqc^oF3`o$0{Sr<3BMVfbR9$~Ev491F*+3B^*KvnbW3U=_ zJUpg0pyryo-Uv;Bz2%#fT>yW5kjk#q18FTxRRr_EAF!53znUP2Yl79BVC*6TjeO5E zEkD4zg(~9)4iyW8r;>~jRUUjhF)dfOOyoJf?*S>_M}cP!eMGG@rLVRwi~`q!7B-y{ zQ15^RDI*`5BMVvXffRI)eA}5~&<_;$sXLJ~4t&=KO{o8X76^04ai+TIBiA<_!wnoTF^C2vj1l+{yAWbvOwYB3)b5xPv#h|dC|46~ zKSfh>JTWXEqIhgl4^T;MJVw}?R?7#|U;&#|u{5Pds^SmESs*m%D(a5zVWV$9K{6GxLq#%_(PuNMLfGsF-ekniZhbs3sMkFNRIHrA#s`#vRH;`f+Avh z#K#4GN8DoJKaj)=B0>TLB3u(cOe5mOD7LaiK2N+P zoGplFgDx2f)0;4gv#7W&NJPTeCZQSQ$!$LK2#IXZcgSLPlNRM|bd!=aMktBOAPF$R zXco=Ly!68xf@ar63Ra#4D39K`I4$gmq|tS@DB_!0ltnW?^$Rz&bDRdz2#DHAkR`c8 z%7i!th^;ROfdLlr%Ig^4AZLE#;XKF*4&8{jvtSV?7|b6A@4zw#f(ItKXFIzbAl}5TCQh>d5}_DXT%{BczP^i6Ben=4U{NR>kmWPudDuUa>rw@2Hj=>69?8Cp92$oG4=Q*0^iMveap+9%R zsW~U3a1184$S@touBpQc$+DdIaXOyrsXLCq4)AEpJn(oz^&JmWKbiy(d}wAO2#^`d zy%f*qmUrW3L7c^~*ltKLv5nlFg2Si8aYir&?2c?$tn+l`ky%z0-VB02jp1QVui6hT-=dOnM>|1M%RqUI736A1?nGKA746@n7Ej?jOIq`DcInf8PAd|NZ~D`SV}>qJWkb zSuxIw>T6IGGx&^?qDZP9Z+iEoz=czo@OcWJ zd&PYBpp|()Xk7Ro?FAO6uDNq2s78s84i_J#D{y!>^$V?yqXsB#= zr=wZC(C%+g;{K;M{d?kZaTkEbA?{3ng6~woW>j&a8awztcJ6N8kxz=pEh@6~NyqdM zdN9{MFq}TRsiQ~Y9EKIBc--tKE5ZHfR{axoDtk{V31^^2d{8Vp+?b5+hdFe_%l*Y?~t8iB@)j_GO zw1FaPtIc4gZZ-XCIatc@M;XXQsc)7rXSXl4t)^}?ZL{3z%l%%FL9P9Ey&5c6yK<$j z^`#+S4V0^^?RvkvS}!#XtWhfRhH9_KYml+r@Aif^pcVrq4S6qb%B8$DHhX=w+Ng?F zs@iT)$})UY_Pdp?ZMUmZUde-%rmsrP*ny5qkW=3n+a;J|vw`pHg)j zy~!8p8+SgQJj{Pe{^{(mV*X#k>wm~@hr2n?*w%QY;kU)jbNnAE^s@g9`oF@SAN8_M z9|w*eUp^=50}<<`5uZ_=JkR*CbT4lX`0%ap;A3?5%aG$&0m)CX*{2iW>cg*zm3|2Z zeY&sVOS1iVfc9IsJZewT;)hA!B*ljp7?n@Ezx(;;hJFd8zJ>c`HU7gx&*$Ra&;F{E zAD;R4l+>@+$`_}8_pz`1HWxm}|HGGW-?94n?Mpi|UgrGC!ugT~%O@khsLTVI=cDa$ zZw2bp-!l2{d9HPF)DX2A(`vEIdA%ld&i}_ZHAa!yS2gZZ;QQQBr_M`VZqV!W#FIv? z%Lpgzas8jvtj_P%re_USWcfyGc*Oesy2!P~+OcqAyb$2kiUHvkueY9sWpZGW{CIpNbscWW~1hYE{ozhVQnUT!WFia;^QU zS?ku@(%Y863UB2F+hzr+Cp4LQhp{zLXt^v`Yqz=zTdT1Wb9C0`+nP|*hL=sIRtq_% z3%xQ^<3#VK&7O6->A%tFaq?M{;dzc>#{Bfn8~$}iVmYy2Z!%q`$Mw(J!X?WvHSr&@ z=RM!2T!T9qzGb_-EVQMLC<`Y&{)}Z=rQKsY7sC0gjug}! zkyo@H(@-YBo8O`$7Y=qLT3aokPqyv;MRC^5!mxA$-M*w+Hv?s46Y$TGj{ zjcSQ;JgooM|M%-l{@rUP5nCqHdEMa8FKb-y?EK_(&ekQV?6(=9&izSK7vD$%!}r^L zSC9r`LlOn?4X;Z2Nl&_X+Z=4z6Q6x`)Re9oGIJC*RQ(MCBd~4$)x}h0OsUtZODZF^ zdc78RB1;@t>q6kPVMmbGf_f~Tb*bBjFuY*+UiVel72BtsBd)_YFVBzvZB~<%;h(X8`IoJW8pNq6 zHW;CH(q#>$#fw~zyJUU=0dU;u#X^_k)T0&yadmveYvQ1%{!D?@)>QxM==5iAf(~Ct z@n!G75#|2TX+L^jA2#~6wy5;w?lR_B))Z>}-@kxRYwJDfh&z^~uGpiiQ>sbrt4`h2 z>-BfdVgI$%Y`pIVZ+|{)oL(&Jvzov(SyQ>1Go4p$qX*%^pVqb775mFy{lc~oww=HZ z@Yti^E5d<0bZmDro(7gf@zVeY))3x7C{}FP$g?oqM#%D!WB7pu-5&BW+;lt#S5Tuj z46q;gK+AH0nma;)>rqtG^f1L_fyaabtI+8=!>Mn<%ZiVJA;p#*`qiU!yeZ5=E(I!m z+jh+1&^BGe@rP*Wdc&z}Q1}z*ITMPE1%c=JXgG1OV;~CdBG+?ALu+jKz{a&G6m5Ds z##29-IQqz&A{(R$Jf!=6fK3|)j1X;8M3F|*1r6L$;JV27JR4gc^jgpfGWmfG>iR<* z=yZ1gNIi5h7zs>y803>1e9MJ0LK%sHc3_z`AcyJ7D@+=s_R69HJ2w3XdJ1 z;<#Y%so}YnGc~E;)Wt5{W`V$`;8;DdfqpQYS}1VfoA0^EbximYfOoyAF_}8!i9Q@o zMh+-41SO_G7|fs>PJpUS0ao=+>LFZ#_EQXUQfPdNE0`Vx08QNrpa!qn9@r!RJ9)l2 zriQ1kqMHv8^Z;Arj$CUx^}rd>59YE*c&t~1Yzk95)VU@Y&UJkc%uY8MI27r2EMVmi zUCJ85X6OedIFecqewq-eL%KD@0flY4jl&xO@v-B9By`h(OZPdz(1~q>Dy~U4N{lR2 z1r_}z0IXyoA6#r%K;IqHy&Hi&q%Y(MjZEA1Mn15IShML45%{eUykSBB!QyaT3e8X4 zVCaE~5%TP*X^-fR3Ap7>ZQV4dt_@!;*MWP!>)1A(?f}7xhzUz=G%@TU-85lSvzrvw zr&zq>T0Y$rP(_gi%h(Jo4>^HL!zc(U)AZcGBP7LPQ4_?5%C=2c?C+t)W&|8M`@C| zNuravJ4a4}-9=_0f=LwrP8^~+4V_sOVLQ$ovv97l6JkQboRHXbqL7drV-n7$IGKlw z$i=g?n1%3!nFI;(5h1fMb3>OD#C%66)asS76(%+b%n1pMxWFzUDVq8#$MK4Zou&qv z6YRf3De>~sGp7#8qG@ipQ{aklG!G&Jo22k&M}BnfFUyoGDOle1T~^O&^@?7spW+}CNt10j7uECb2&!o+>cVw4Gch% zq{P@K*oy;mytu`Q873YH-HD}7L8aS%^P65Ws(JWK!e@E379y)n|8 z)N%+|cn&L|2!e?2tH3ew!e~AtWHC$9)tuNkvcQ~SG9FDs6TL$uB*{GU=+=t}9uEP@ zasn(15>HUg-Ogi)H33}QbnX7jNRJVNhXaE)f+l>XnBBJr;SP$?zX z;W9$+!=jumX76Bh;t~(#vsr+W%)d?}&@lkD&~*^Ps*f!UjtH?=Of#JODf}CQym#}( zwPk>%o%j*>{r|Qr@cXaoUj)B13W}K&GP45;jZx5hIztaISOs{66I3CIp*^h-#~`Ut zvkLtTqY5}f(CL{;K3-5G+#|8xJzQH2f4bqIxC43*b1DV>1HPXD zi3nG2zuOcLdv`Rf`)w0mR!!FF=;33cdGa90*aWI+Udb?fs`3HH28)kVN_bK!=-zLC zsNx$v0>|S69vmDvKE{3HA|E|WLdD${1uMVXG(i`GPwg>#wDrKJ;T>fUu|)Y`|K3cG z_KP_5%Dtac90N)yAGZ3tIpD&F7$X|F@Bak8vD* zABKL!Y}cF3dTU&jSISZyXqr;4WZl@&9Q@6`+;2C7jq#9zPc!hBa7Wb@P2a55jjpZL zt8ya`bVJ{3n!GCa%dJ82<-62-UEaxtx?IbyitMGPBXN4vf2YR14&uBgZM%3uq_xAJ~-C2RZ5egGx`Zyr+ZH@iIr)>i|#Hr6!L z9uyeJyZzb#Z*G+B-q`>3AZI_dpW09DU&r+roR!QzH8IxyMI{L^UE0X_?Z!( z@;KnLFVB72z7hDYn*ABI$)ihSdQasE_ovD{7GgpNf5|r0mToXU^PN`Kj6 zpAeqBeCsI<^S7Gj|6DU(`2OQ|I#`b{9%=Mg`Ii`c(E!hui5R~?>KXr-6zKk;DbU}D zTYomXd~wWgfOYxF=W{$hyukN)s^5KWzzY=0r#(RC_Mz(q%Y1tE;psMl&s+H-CM}G&;hPS(NF|S zY??>v_y-&-@w%mRE&p7rv#kcFBavhH7SpYX-K(~G zbftv5`h$?#&c z->xZj>CG#KZMS>eG1IEqyezSOmYJRYjkld{_jlPNUgz1yn@&%yzhqc6hOW{)S7kP)>=)eF10QsuKTw8y54Vb?*ld2 z@(kCZ78XG|^O*0PG8}(-S>yiIX`d!a1DOufs4-l>DK=X5HZQb$byn%K%7kfgqLeXp zL6rDt!ZdoU$q5rteB(dI573ob!ddrG+t1s|ktM;1h);X3_h2vVY*XW-y9rsueoId|b7LLyu zk?Zv9QjKMqw!m@%!(QE=<--~WLOKwOtaMzqzeH8R!~}Oug>(< zCEX$-y>79Mlc99gW_V7ddmw6}Qg1R%nQzq^HBGE>r^=|N={%!y4d!hNg7B<4XbWnm z$xAhb;XwL2%W>`I`-a%!yGOj#W0blm2wm|HTdh9F^~L%tPLnzYxP%qJFn_mxtnpI& zs8fF! z%r1qt>H9VE9Ypip;oA3fnpkYCA_v~0xof4jo0vDqy zITuDaG!xnNe44lHVhZ-c1YLj#=2utMAUT+=z{@)>HFhpWo&x_R`Td(090YU6@U(WoDs5y z69YVfOqy#l(1PDB9I)h}7y>wm0`hoj2d+7Fbax0* zHt`XSnkqJdfl2XU$EJHahIHSQ1}64kdQj!!L$uIc2p-)I zGDQ^Mhc!eub-)m6O9bI))7*OG+gPW7f8e94r~pm#_Q8hEnC=kpsKO8-5MwT~Mszm= zc!xR#`<0cziInaz7{dGi)WoijeT!})0MVxSkZkX`uoOo$Mh$SB>pBx7uwZe~tqF(b z(v1450syTsfPL&(u%@Y_;5+RAOW3-DJnCKBr8s#Qq6~eQh2z2virjI4-Xeg`BqU@( z@HMfDd`@uar^C!A0m^b>p^OCOjTL424BvoPLgLS&>(sPYmYdDz6bR02l+IF;*#rzT z4M9#PASpz5PC}1>1IjpvfHrXmDT*80_DOmZ#i^foC@LZ#NTMXZaXo$EpjDQdvnUIL zYZ!0OZ|SnP2#mf>^C>C9S$s=evhdwykml(k_7-H8&ZcGD+yZYv2dL;}Me1HBDNa2vLr$KRv6ow31P-!3z(XXmW_WD5A@Q#LIk}De82i^2 zvcl+^P@BS&hb*qWyv(u%u?QhXMsha|-p#@=aO04mWFDn)k`offb2oX1N-~cLo~Cv} zNFLy2I>%X>USpDGC{5l)scn;BOQRzr{B`)20e%x;3jyD6~?{DWDF=LWS!9uzm&oVodXk`+1eEds6uPpx9FKr!*B zQ3ASBL_0%ca^w36=(ou1&`3#|&-~CrH!+Em+YusZ_0JXVO>}R7b9pd12w@D7gsxvq(QGBq=|xJ?~!$utfZ`638H8`+kHEqSgV(xk*^>O-P>Ei@e!XnP;COu@s1WNMn6K z0-Y)Th}pV8(YYf+vA_%lj_&SM$;#s*ejq_d7~w}8aFpGlmmfz|Ff@fn!zyF?af43V z9Y1`Ze1vfC70ipsrlgQfk!JK!YO}hax1QtxALbN~M7Re*okvN|R*dr}Z0?5~?tZF3 z@*rVlSnC8#H zBnKhxz32dhKzqMsAKm*j_5Nu}_M`0+_i50n^>hTK1Ge*Me9eGo_^>YlRl6r>s`6nI z#DVj@2vstAbhiQGL4gO`(9zkQzrmhK78b}V#>pX!^YI-G=gu!lrA{(>;9TiW#rs4d zCn-KDi4Y$YICwOy6uR4@@yI>Hdl~OTFnmmAQf=R`Li=uih3jP)eGEObn&jqpx#ORv zpC96-65YEuQ~JQ@^O^`i*qu?ivrm?mzR`ODn^>Q-+`Jrbs z*e>;@IvBto`ASxH(6!Wd+uhbE_k+E<*{nBPkaIaWWP=+(Twbo$hiq`&kOvgz-|trs z$>6fQ-Dw*`RupxkU+q@=-F~~-s+(c=a;a^% z%ayz;2cXe*MMv)R{cdnb2wx4>n!H=mbnw9dIB2@Eln?pfo9$8s4xsV2q#FaOba2hk zfstG;*HjNf(R57%miyIyx!05`AAD!X^3_V+sOoN0%3FD}mBBL0`(*ItdbQVArLqHh zJ%!lrb59G5o(OOeOF)6q0|b{XlT_1uXBoFJ69)+IP+36tQry_ofmCH}QR^U1P z&6E*diFJnSGg7-F_9gM;ieW`jVCv^wtM&GX5nD%GgW=nCMr?N^p6zwHOO9p#DW`P= zUFY5kyd?3>Zd>WsS+3c5%XI#r)?Elk3a8YMg?jC%#MYOoI}9iE`*r?xr`yeyCf{TvNoLQ~hSXvi z=2GjjOt*U$X_|H^bEj6l(dJmG#$60Jz99=urdQ{L277uY)&+hnwS)%O><^`;Bnw)D z6*x)eTKz_c?_3@&x?Dq0I!wQ<@#lg@fnA0dOIc{V;@`;Zm}BbvTL!c2-?^1so|oqQ zq<_k@O@{X*zQyY;rY|*kPGlPYSU8o$n)JHHv>B<)XF{VUb!!cA#rODnBRJ!m+&RNbqS9b_ZCGawiS3>A-x@}< z*;2IHzx@3_>NA~Q`{>_QlzNS4TJ`^;=AWZpTWAM7-=H!#S-H`ecEod@Yjs6YJZjbl zYo&W+sg3jVdP`}V9ljPby*Hhn#MN6&Z3v$0HBP$Ce*pffOT7libz5@1&a*tva$Uv~ zq$a1GUb2nuiOeyG?J~1Y{YvW18f%cC-F?;Jg^nt=Rr$Q$KH(XWOCVO5H+=JgD*h~lXbIyP57x^4;aB`1wKuWNjr)3|QE&c2eH9qB|= zd8xykaQuXCcg1dF*y)7o?{t)gBzO7O{}}^)^-g`l3#U4x{Ckmb!CWy)w>ekZJg17> z5I$P1i^~Qd3ANg*GhTT6`r?QaYHyqE?xZ70b^e4Eninl*#T@@{Tz8osH`(LfWvkoj z_Bwob!89-He~ah%uE?K`M7`EK`xorR*;}U3eS5LKy*)bATdh`4Rt4pkzxoAoEnFo=W7EaM zAuVr>JbUB}17xG2g^Zz1Q)#j1(wtT6fR+0cNA(Zoy!`-M4o!|m4x+WAeVPtl)q}>i zjyziTysFkt0aa`0dyeJNs_Dq8>T7$n_PTBcZiV3?A7cs-qmgf$L%8s0W;89$?I6Fx zlml;w1Fs^Fknh>n$cK-rz_l5SM%ckR3S8Im#xxZk85LfLX-2ST(fZvM%`TpdDW+-< zY5KBBsZn$}nCcYF52knspA?kELu&-T-+-h(z2jLn&3hhEwTD%)cH28_3aDV@DaDsZ zf#=ZT^&kfwpa(ShmsXay^{S{hO$@e7T1nsYtJHD&ixEv;rlsJK3(6Q~00T#;Dhv)n zIyyz3v1!u0Zwi(ARqb(?0?7e&SAa}!==cuJm8Z$%xGF17;a#wEV2&x;46`V_T-n&i zXo@VyGd<5X{2|RN2U&&zt(NbBx)W@fGzKVG?a|E*6!#s`AA#%X23UQJXtK0pTE0p1 z(h;qzUlr4*wbaM9S(W|9)D3~<4&A9=`EY1b=NbMO2u^WTEr3GU)Rhz~w!yd_Tq3N~ z6m$q8x}74h9iR_^HP&qtq6qt5RVE#LJlpJ(5LyNNC#07T>|#dazIR)@gC3; z0*8jc@Kt$zuL@iWO#4HMjC-&qTp$5_flIaZ0ODih(vk@Q9b0AHQ$?x*3pRaq_mER< z&w#b%xxV9o2tLj2r)MQ#-8XHWZd9ns(!0nRS)-{>fqlBPoN=`^#hy~=xRT7GCNO9i zy47|Vz3LrR*g3`%Gy;=4uxb(fS^+U&>z+TQfVr0@kv~iQG`yLogv3@_1e1iAq(I?} zkSQU=#>BDGbVeo%lEhw#{RMVNI13Xmjmg+F$#OBz!k8o^Ny15ByJR+tQ5@%FL84il zP9{-=vm^`>f}*fokRYBXCIs6upcU9@GI<_{krTv47Dawa0ei@-WEiAN% zNSM(2)7M6lTgy0~FXm_!lOndSNp5)#$q7j!hdAkM{yw8rGfXUFmIbpYyAJ0ldS8N! z$xRgJnTMh|aYJ~HMMXYKz)?6N*vaMz2}$U}W6bjs64C7AIl{RW!c%h=n8XW7o_a2c za##-}Cg!z|-o+N0`H4SEfIK#m84i61#R&zy2|ee)y2&RriyHYcb{FvyB`&c-lE&At zVnW}e)UcNrHt|!3Bzfe=mSd90&fIJTYNgnxwaRD2pIJd+&v8L)G^bV17ua{hB&4uC zcxF0D6W=7RpP(}HY3Xy6l425E2T4kNoZVa(N#aBWNy*HGbp?(jQH0_m4GBC4-^DSl z0^ryyKaax9E@}4rEJ7CD<=~iZ6uTtDp-X60c;c^yp&gn5!6|Ts2Si4KFr=479)^)e zEgMIO_{5C$WeA~z=CpPInZLtxKS?|^pDo|HDM};cM-(we{=x~-jAXtap~Z}Z0rIkm z8-U{%gp?$AiqJN$XF=?(KoIavMBcfERb;c+4OcmMU><`e*Xb;?6O@C}Ad=^k3?j-S z1eqm7p}Y2`Vgz}O4oM1F3D35n+cOv9L@X-XF%p|udmt#4c5jc+Gm z9C)+HcM_jgO|VFmc%^SmjPTldAHo78BrWK939&_%Gg>fxLCkp?2aa>?g?UCrPT+YH zT{|?)6F&<`be+r`?D_62f+v0E#f!l4$#tB$Gcq;(_jJlMO6-KD>LcSi)dQd0PD4@@ z#L6ERS^tyc3M&75@|U4gS4MO5K(6lJ~#J>z>!*vN{2VsjK;yT9pF zgTqg%g40azJ52d7d0bsa@NS;ti>{P-gaR24^`RB&RB?htC4b6w${_C36*7w%o5`Fq6gEAY4Ik`|rU%kVWwC=PlSj$l{@w5~9pO<{Ndf;_6`!;_ zonphupTPZh?C-j0inn=Rq8@w-28B2}m^W~v$7+XEeDo+@KElfewH#Hl+FS7i@;|V_ z2TM&T(CuVS@w84l#g*?jGR&$8W=5S+RUjz*`>N@8bgPl0hy5LC#W|UnhmbxX$k-@i zlg_)Z9Pn`;0HPgHVLj;KKiu=~w7>_Nv?qV0P5Ma&{w%pSL2%$SdAOC$sCfFvtp?tM zG2+J?T;M7Bgrsw4hLBnp-D!6aAwPHpQ~yuKmGzxxK=QwM1|&cEZGhxa6r|tBQ4&^% zzpHygSCr*oHQ4NRwN#dSbx#YUYkNZ};qR7K7N@Xzsp|KKzHjx1L*F$SCe!rwjjF4M zBj5GqN?s32b$z9jT1gY8HF>u><2nXy4!7Km8!RqHxvrr(ZkV~^r-h`m3zL~uhzTeZci(X zFUy^>G}g*e+pl)o)oO1n_xf7i>w`VaI;5YMONE~HzFHo#&vk8EZq-BT`F>gDo^MN8 z-|Xly?}NRv)8);2udlS-U=R179P&OW%Z3emv+wZQltMzIC)?03r$C>BrWx1y^?tjWW|Ec}derlhz zXJPYkg`FA39ftPJxwVhay8a4OcaMdSbp0dGPvE;pJ*|+O`vIu< z*9d%V(iiVfpHTfVQTtWveLc{g4F96oA0hM))!*COJ3Q^13yeQ5k^YrQ_lVzj-`x%T z?voo&seX8TaXwuih}a!i&t&>Aw@!UR^VS*@@XV zjm~R$qF*92Z@N71-`M$1-e9WSgBO+fpbr-_sbq z-4Zmm(G&&wToqcEHBD&s89{vAI5~5~S2Evk$({Cz*6a&?p)EB9M(BnT^IAGSZ;KKy zwi?Y=S7^8FmQ?Qumn?Th`Gd*08ZWFhy;kc}!2G<+a9NM9v7D&zLihIshSM2=d!ul5 zMY9>M#xVR*8?1C9P1<6wFAD9ps@57JCyJbY&U1BJzUawy?ySwV1t6xj#0IM$i#4uQ z=e^{N6}v6Ob8mUE)8zS1Lv7V-e2r-dyuh}={tT6t;~BQjvRw1H-Z(y1rk2Rm+w{D5 zsnypUk0FZBc#cUmVb+i&o_nILisBc1Wb{HV^H3XJ&b zh!u`GmOH-cHfkM4WO-H*_~Y08;a?bZj|X4tpEOxk{&o?=SV|a$+Gwzn@H2< zt!WQVZ_-?F_JonTeMtq{?N+<_o?+S6mDuD?ItnYEa8t?VL{665tp+QdoM{|*t|5u% z?a5n7WZT@J-joo-i6?xEWttt}+7Y-W+m||gTj>8xr1k%$Uz}btQjZtgZw0mAZi16} zt~*GDMz2xhz-(-zuBn}Fzay$mz9IG`N#J?zkH&)95oM#pysn*fo4lyZ7h)Geu2$<^bQ)b+m4Fd=w%L=x-nCkd z>oBKc{k+424veI>Pr<-lhGwKww6!|j+4YA$&CCrvignVgRSMA2M03BYq)qF!`__;` zk2GQ1vI5_xXF+>jRT!JriuRG?*e1OEQ1F$4ei*wZ#dF8>@NdI+5OVaPHSryqdtAZS zfj6~qHI5#>9C*mWz#I(&ip0{F8#|yCvCV)UZB0+4b}S09njjpIH)v8W#k5UYW;>vV zOFPrRrN!Ncm>w=obDe2%THo`4rf*vlnl?-if1c3vUPR9=ug;;yh#o~vlfeVWr_jIe zS7pZOZUPTar>-+HOn>UYJ0eY*1|bcK+ETclit78G>5Kx$raeQ;HLdByvs~K-b9gj^ zp6)D|I_@Muy60M!k1WIW5j~b3G`DC@cV#idrkj<0!$K8o9?<-0Wcq<$RjhZ0^l*5P z+tsUb_vo1PHwIb-BaX=c9XyA{rls*Gxyop0J;=pn*GGzqGz z=gy(J04+A)(9~#(M$_bL4_rU??V+y+Hdu7%QY;)aKvh;Zm=;DNTHPPhciy4rIbKlZ zzGDo=0y$ilB1v?XKSs{D0*?_rK9@rxY4#msq8#tyiPFQWct$(@dAq*unR3`MzF&Isv9ulAi#-oEV&!59HZYh!Qd4lOV`-4-$Q z1F(td!$94|o=sN?_C}uN&|M7^JgSaSF#U;6O=FLI6ReIM>egz<16^1&=ifqlRh5Bm zQlWbf0>`8|>GVrgIRM6honZ-hraK;1hoHM|o|*yi^Qa_CVh5R-;_1ztTw_EM_a?NH z6q#|F;4B!IHX-JXPh#SvBu_(<(AwR~^jX^0Vyk~F=w z!X&mMW0nz{EU=f|xQV+6W`Uh1$Oyw|g>meK(`(D~Q<9KTn$80pyS8f+FDOWw#0ZgV zl*GPAJRC+IJ&ZYzJ-8hjw^5F4-=F$fM3RKy#KQ#Ji)lzqZ0hvU06am|#e&RM!Ni{j zhd zCZX%wS(bwViR%%%g@BOd?<6U?$%0_!&BLrnaE=R{;ZYv>0g1z;EN%%2)6jNjKr=}f zKB6aGyD`OL%^)JSOVDj%UB{ywrC|Y=wqs`C5r>32E%c7Ud6wdkpp+nTi_$7YiFj=>lvWM@4Rg3mlOJaWgZX1(AiFAWI27vt#Ck z>AQp=h#~?31NVaT-L)UjBJfgpjnfF15y`Jzu*2M)lUsV!JS}h@lliPfWa$$p32y9b z*Nvbr2AeuX;CY~X6xqIG`NcAgvg_Q(F$M!gsC1$!A_Xy=JWpd_3rod^C?#bc;vg~o zC{5k5RfK8ol?cu3)FrqKizFveILk?JJ)=ia+x&lL)xa!syyB&6yn< z(;QR>ug)Mu0^7o&9s8L(3+-?X`os>H&@S*i^3e?;(ewtMGijP47!xOf3%1ILORnMH z4I_6@9)@#*rX-AM^cEz9Sj`|XVw#7^7<9C$N};&1^p39Sn;cRYg7JcOrJG)es%ups=Kow-?XLsBPo?09B`H@O!& z7{q#h{vzhOUnO_lzss&VRt_6l$od&HR4!!{mzl&K?l{%)OU@&-S2x^||am zdyZK{&%p2EGw{3eyMW*6zje{CbNX*KX8`g0cDcE?D!(<>n`M8n*zwbi9Y1||HyGUY zw#MDSFa~$vRKDtMOy*R+d7!8d7RF+=GOf+#0vPJ+yY;ZQHG8Yg?dsNA8N*v3Y%{m= z?b4uqErFqa*Iy5SM!h^R)EC?Bc3^A)$KEi8`ucXU*)i1V$t9STU#!>G-NCKgSS|)V z(^&Qw7hqRD94yzp{*u|1n?rLrGz@FeTla_7+FD=S(dc#*b+9Y9wwvMYU~zG`0)qN# zxa!}TK<&OYFPK^RVq=1E{gCm~2gcBP)~tL$XKCDCY-wUv8)jC%?Dd&hIU}cA+dFfy z=`Z?=+ZAxrx63sR|IXZ8Y?rGcP4C@ub!XC<7(h;6nBY~ux`4cH*K~yS!rEA7Z+p8m z7nZT^8@Dji+OG-_o9p_pGZsQ@ghx zfi@vYwm3NK!G_mkRhozVWZ_LD&Gr?dMS z(7*VW_4?NFpQ)Lj)Lt+H`2KKk@pQN^c-l|f%a--ej`U;Nr_a;-mF*hO3JrXEv^Y-@ z`6q4h`933*ls2t1Wgbzeap!W^;nkj4n4;SqB_w-wIQ8$xKl+sJ(opE zk-B0_inzu=XuRbFP5L;#P~OREHxiB=d;aN_)Y5dG&XpWlz=#56Ym`6#rcA zHQu}tdIG1)dN+BcrCfvKWJS_?y1>1A(^7R_oGYDIx~&skl?R=k*66gv8;9f0X$mC%4c9!?j5nvM zu6AEZUA>HQz4d`ZrzbdVy?v`Hr-q_&fmolPo()d;Mh9}*Qo5qprR&FcL{I$nK>nyI zuX;yLr__i%_ZIK`RwcO_PRw8gZCy6JT(Udz}Bsb)iYKRT(L!6F^_V-B|JZ1WZd;Z+!%pAedWIv&QOQ2+hT@*7+Yp z`J|&ad9J079qE|+?w@hGAc)2)Bd>eQKS!y_`cQY%Hn(OxbwdE2Jy|lp`2^~ zTl&Kxt;Mk0l8*lQY4@nrYP`GXHCueI-{qy8mQnLx9!c7N)Ei=3;7$J3Kl#HGU22{U zhFw}=Z)H(5BJRB|oX9HouQ-9Hk<+^6&d=Nahrd<-R6A=Pcerz{@$Yp}7;;Aj*BBXp z`=3|nH-GgPRutQeRvrKecm#Z56eEOf7st$<8byK4Kx+)BA(%sBaM_*$M?0K^I}W=~ zy8%sL@JJ5;APjLdoq!~}=fT$!?1un-$2RhP>@hgl4?-|vj?C$Z(bwrU7$8t4*=_@r zXTujEaIFS!a8TBEtQd&Q4CxQu2t&_|?i^0XOq)B3eWs)xx4wp0KHo%pkJ?D z*m!`joyJLDYtaE6GD5T}&`kv*F0(fJAp}c9?G%+K4ItoW2 z@Z;&x$i=P=Y;REP#{nSo5LoO?=&FurBsOeY09Sd?akos+QegCMhb=gLJq=B|)NnuJ zt^Tf*M2F7Zbm+wFK!le$hWSBXzZcy&SLD)5vfw(H%^X6eSq^ZiUpiM;MMM%e4l5GJNfkOpOlJ9fmPc{s<1oqc zVwJ}v3A1F5X~*deDduSz25DHvWNs&9h9W|MHlBxGRQj{)IGvR>%9A9{QdHB3vV56F z063E?KPTbU$Bbqq3u|zlCO1`DnY6S@Lb9Bo64jZXg;ka0gan{LkWLZFX9-RA{IU$( zfS^&G_@PrqB(P&d5OOWoOHx|pJL-9yfvQ0kU{d61;4PD&s3#FB3slAd2|eP@;DeMNU5gX}_uMRdtm| zHA(XbFitm(E1Zz|G$VOE4+TEl?19g0oVG%3hHTs z;%RCZeoU@OS`>6eY1G*)sjg9y#pKee9kNJ^svu5P;7gjwvT{jDyZJaH{^f#%ph!Rq z*G~yZocou=wd1m?6O0%B3|T0-1jas~`^9WlR^i9Qso;WYj#DzTsszL?NKjTWed=NBKv;A~{`xIJv%w=W#KO@*uKu^Xe12ib@wHGy3@Xxs%c-w}K5IHLU`B z7SSav=uLA!O+L{A#B)N6rz~f|rI$sS?^q#-<7cp)A@Hp$QegV@T@exmNfgkhwaTxv znm)yWI}1sXK8D5r*INdQ|Ib%1!s2dSPhtS@f;y`w2Ze3KutvbP>6x_1XL}HDwucr0 zy91goPIuQ-_5&=<5V^faGrcmrM=ECzK=3`nnMVP;?vcc_%l^Q%<2~n@>34gx+W$;R zeHzRTLuL#GpirFm(%f5Mq%H-jh|4U4}|Z!gvo)Q zIenCONF)yS+-#S|47h(l-{tomyE`ZJ8T<8+qrJ)cAqmNT02@r@YmdR9#eUR~rKWrg zwll;!a%eBn9;HRB2e|Tpv@#$UXZJDAcIgN|1FWqmbRcPk7e2bV-YxS30?axoqlb0c zVbu&mcHpj*ej+ki^VzPO%$@{?K=<7wK?uSEPr2m`EH`Ov2~AbR2=|l6r%Om-iucL( z>5G7V>bmu#ZlQh;TNWz#33Ckg66Yw(9y^7nyDD(+Z3d8A7b%J%9vYUtT&tC`u5`Xb}<~9!{uPW?9Xr4cZ0zOIOxVLBcd-D5q-g!=+*)R z(uc;a*}v^?E`W=^*no;TSfKCN=z}|}x9#7W^!nQc(9szieF=i(i{Tw3qu<_b*W0zx zTY~L5SfH;=W3@2{+Xax(2g}9X#ddwWy}MX~1NsU~!PndE?cH*)9p2q;d&A8=5q+~V zc0_awpx@zOxU#@u9URd2Ec9*PWcKI7ReudEbhCGB(Se!&`R(1^#^|qx%k>7_&sX4n zJ_Pr3tIyoeS9e?b`_5X?84ec9ySw4`ZoRnO^UnvSwKqTCk&`|U`u@7oKW)IY5~gQtI6`&>yJ+T>w=KZa=gGMfJ7Ab;PQ_1T=B zkNxXT==)AsyYJ~|FYV9Bll^4}(?@?leqr5P)&C?8|8oikKe7E5c1}E_fB)^bfSbUV z9sCTP^)ErOABnAfrTt`z@^gghPd^5oeBk@VhI@!7pU z8=U?b9qg*?2^ss-(>@>I;KkwkpFz(5li$Xw{ub)u%MgAri4PZi|E!fggRSBJj*{Ay z+NZ~yHn2~RomoqHKWR03Vne^^{0$#>Px`!Rs{Mx2Q&rWFj@tZMQoehuN~xxcZR@)u zQQ{j-Noq=o-r{=8NDy0d&QQhSE53UwHw{tjwl&GurB8~|YT1nwMH5At8}J|WrvCoC z)zQp%T}9LM6Sc{Ss_1oji90&(pDXTb^q$xFwxFusJMCOuydO2hvoonB(=NKkv1pu3 zMb70k{$%L4FOJ^!HF^5x^|2;MT0`t`&9lL=)a>fYvEGs_j%%F$xvA-c_p&TX(zz&c z6ME&_MtgGpM`Nke_+v$uI-J_kWJ`K8c%yN=NJke>MYVbEtDIyvmYmQ!5v0!X*@eUz z5~p+osiB>msKRSsRk-E{UT+Jc)IM&@s-_)@y_2TFwU1?xD(CfPN94PLXo{SuHO13o zfo~{@ps2dS(;zrq(z#EnCMTMx84X#Wr~i^W(&eep<|TzYlh0-0&4(jdRe751BY~H@ znjkBR7t4Yu4jQWZT2wnS-+RZu@7^@qf@~;KL+a}i%@$o|UT6;5gVvw(qS6eTO-(%S z{|(=U9ROORJsxVtS@XiyMDw5}`glA&+|QRwNSe5@(j*-+8EzT!%vta37^Df)2G zpncMwMd3*2k2(IGz;OcYz1?c)W4Y;e8#JA|I^@;fF{cU_wA46>>-PkDK-P_uPS5De z?|MhPDk^q^lLmq$pLLWrcgD%`2ktfPo7WnW#PO=uYH^Lf7S&@>5EM=k6r-b_>)lRA z)i_}w3Gxa5hUYc0ar!}(I8Hf#`?^sz=!N<~kVQk(4UTV#N{4G4X=?9GQH3r~i;#QW zrP-vHG`nI)k#wUoX>y9r$w!JUHaJn|!9`tqBlf!Iz9cG~c>YRmUdS}#Qm5H%bZt(S zU_E4^?#Qp2x_s2MXn-6o9(mB@q^7PYs?oUMF=d8 zRcdL+iY5teS9mW=9|WIMk2!@VMVz-4sVhiyz*FvDw=hTRSdm+8nwMrvX{c>p)J0yD z`t5TXkRY^mNp3c1c)~(#Ha@;mUWrGX$~T3+%&DsU?l<(yeQbv@@P*9)n5mW*Mm|7o z!3bd=<9G!8*BD?j53p+-nlT25&cepW0q>Tc2%RvBgV+l|ESz5M#Ly#i zymm2m!il#N>;`Y_FfuWtdD~HlP2WZF1VHte@q3wna~$umU>}F!h^dwbE@J{?W&_PI zMCM^_gS0k16ww@vZ67qtkrmsZ9garGiX0mddptt4tH{F)OmykBUg&w)#Rzcvk!^bb zBSvF1+0$p4=J(i(zzrNYz5$N>DROb-IzUQCp3P+G!9Lp!K~p;byw(kT2k5*pT?0Uu z>6IQ`nwYVv!x;4Dr!hE^12-S})6hk}?~X(4ha)QprUCHV**87}yx?hwL(fNOi~%DZ zffhKNrf>X_Gn#mAFa`N_rj8#*mLH)o45vV1Mqm#PU@Fk)5wdCjAfO*u76Q^dNXUnF z07~zHNyi0dGeE8uLP3ZEhlad^cEP6|+|rQ~P8|l6PO$^Iq9;QuGSL(v*9V<@Z{$q_ z=4B34buaY2Fa)V{Cj=fez`Hnfn4CUnw$m#--*%^AFba`lx})8aqF`4(5zNxxF~37P zl8b`?c|fkG#pcqJ*fEji2C#p?fr1I?Z^%Iy?KV-kCUcgL*ye>19hj!b!q^2BbYQPL zKA`s446!q%=b4&2*rtQI{S?vC0lWGTdyzW=R&^92lYR*wJ76;(PoZ!kP=g{sSI%1IXEl!Rq=Nk~4cGKcsMCiJx%q!lgRgjBvWuL*Hb9#4rAT&)NWuf6Oh4rjA# z=ei(yipt=-agto+N#c_-Aap8tLda?!U&U7iPUz!U5+9SG%G0W@a2XaZNxdM5%Ihcz z?a7+NWQ^RhPSK3m(>Nyp?&oP~hqE}Jx;P05j)f{iM-1snPrQLB;VmYbb`vS zb_U`}?4yXz3QuXVUX^9Kzy%4%WK3_2(ysjAv0mXbQ@h z6tg6XZ^|UUoL8vKD&j{|(noc$(0v;%y1eM#PUP308)LPE>k)&bY0VBE;3St@iI#j8eBxOAYRb> z6DvpYcUMUUoaus;cAa~~k1z8&E*D9jVmyy5B{)R+DY(~OWbqotITRgPnm zI5f<{&*CH}7EL%JMVz9jOp|n++jOwx29>mCXtzO16Ak3(5Y*if$&$>EgX_SL7ez&) ziY{tWCq=ZJg(%H030lxqz9}5Li0E6`{7_cYYIZdxIW61}kpMvoT~fdn85-l*^K<&_ zjY&nrr(T$?)#Mv9~fi*i}7#{-!GdNm3 z6*hO+^$F8z&UTnrJw*=y9P2*v6woMj^dRBP4Qq%Q8& zr|Z0|4*+p7+kPbEEt&P&~EmSTzU`pKHz=3Q`J2fx5M_L&n>TO2J7trUx&F= zPhhMlsp|t!neFk){2&Y-#{dGx_xPj7Zr|rCb`GE+0}7pl-Bj!_(r_1aexSvoXy>Lq zO<1`8;rI+-!}tJw+BAl^j)Sn?)13iHWF7j4nbqtFdpq7kxVxA}b&(%(kO%u!zuy$# z?5>&tfg0A&tsl$O&ki==`^z8GpFcCIF25lD?(ZuZD!ZE?Xt1XV{edbbDi1~W08u-z zX32iw^oh>C_wW+qI?L)YO`|>lKYa#T{y)D9Xc;tNeqH8C${BrQu^!$o z7Q?~zZm?W!dO)xq4i}1K41i$0Hue_ai|uA$TA-4B;8&X~ zYh(4y!R@-g1p{!iw;q_ccZ=SwF}$VyE*7iX+r9sHufH{iYd~8UD{Hwi%=LC>06tg@ z>G8#Ou{H;T9kY6QaYyGhTrY38J7zVr{~q-E3)*LI)q_6Qy}o(dTbdVrF#aAIJL~Tq zubNqZ4;Zg{z1<9lcfIX;G3=XbkXBzTH@#u+_Tp~4U7B~p4e+WBgAUDHzt??>PHVlV zRWGc~_F^;G7@NfcXw}=*>Ta_b((spkAXU>&Ru{|R)-o5y%IGf#tCcaZR_2z*3O?UG z>vp*`7Ml${v0QI^G<;)V8q1yK_jYr;*sO22Chd>@ec)BE=*0KTYB2uZ4$S3dc)Qx% zEi7|zw}umjVctO!jXr?ubZHjGaA45YH0anDfb_2}){Iq6*K+j>tNNGrOZ)$({WxIx z37YqWQu=j_>vN;wmz%}@SYLGc94z*7v!8kOv)X5I*!SAu&euoz;@~$%ak%gK+rgBKdAEKo18r-`731VA6oD)dHm09MELpbvw2LWpGW=x zcfXjDXRYbK;lBI!yz>9I;L1;ssZU>h^Yoq{1?lZj+{G7N{&?B$7wx%!O8deT`Jf5@ z>9g@3wJ*~0jZqxNdS1%C-PY*6Wy^yZ&Kl}NU+t229fBM3L{mBJC zwBU;`rttm4ncrgj+=%{#<#{nBFPNx*+gf}@L!H6O@c%~cov7-9)Z`nQBn>pM%@)1a zGIu2QG*E}`9-nKxq{xysX^sV*Z*py^F}zlKM;$>r>Km7GVtt(K&#N4(bJrT*ww ziY`n2mLhP{K>8>it192r6_H=cbf|`G9gWqu%`@&q5*6XQ=!8?hI~#~yNjjB{u4Wjj zDstNKNY37!>e}ljFUXCiAR_TMB0m(ga}Kn)1!W-dN{`bNsUyFlQ&O8!8_2HmKN1>8 zbi}^YYp8-K%TiCi2*+w$`~z*E$hxRX z{K;FTDX4~ggt<2tO@UWJU6dsL)dxj+%^m3tsVSZE?Xy4NxN}JtIaiYA2)urJCW2OYtH&*cj;gnH>9nUwy#20P(qWJL zoNP9ZuX(94`LBX_(pb1%X()%1q?`-lE0Mb~x-_Zp8j^e=zV+THc~?0;YV{;VUv%fP z*g9?=wKb>7f0(@CbWQ1Nue`R+^Qziv(ez82stU67jww>Bv7xtyGT-`3UEx)!(G=Bo zS5|S0f8UnYN@F95_8WbW=;~Qp62+GKq1P6SNvCD3q)t;6X!=i;7O!)hruR8P=n2P) z+~^CcVrZ7wJZX#AYN@S;*p1(-Z`x||R^d*}-aw`$(lPseNi;qRQrhZst>&*pPE=6e zIG5VGES_@WQKQ%5<+rC7!g1q2G&+9;oOI#rLbR3qU5C?}uT);lJ8I`lR8*sRag?3( z`3tV~itCF*RZ;m#qd5_};_Gq0Dd}e#T`O)Ry+4|reN>P1Ij6n)Pn>?Fi=&gYt&3-x zd4#*V{=pXCOZ~pr)1~vKFI@5T`Qne;XT6KQE_SYtKJbD>b0i*FN<$H2)!}>MSu-89 zM6sa@qTb}sf+M#hE4;vckkn33XlJK_%=eFcfj*J+QIK?g@v4hOMHva@F{ie;Gv!R@ z4L#B%y=C;@i2^s5mG*I?^@&rOr?S&-~Q&W{$dL3X2xE{%;FblzCJ*v@DAj@ z!!Z+91~xOY>06*S1I8EO07S*(7@3%9N(Z1V&6JO04gcba1%Y!3d44DYiV@iG7$dC{g2>88KrZ){gAZi+tM~p}+;x zZU&56$cdSsv+IC2I2r*A9s8KRgs8_6aA#>OzK3lv1gD{coHxz#h;g=Q7hpLJ2k4j5 zz>59YrrlX!Y;JlkLM{s)kl7Jtn6GV59q=IsmN&M2cS1X$VLD@|4BKM{>j;?up}VdP z65L~Y9w2YvddEJk1QYD6ZJ<8~IB-MX^?>DzVGWoy`xGq3gQ*=ba2Doh(Q*8#=|>g~ z$_ImOFPsFfivwB^v`aJ^nQjEa>=8W&868_tJ~Zukw3CYu02PPjqEXqd3ur#}0u%2aZEt6Q&b;KOG5xL{gAq1ZnIp!cAC1^v2beCNA`{VdhOGro6pk_Tb9Z;n z@4%*~B?Uz5m_g1!um@XukEN96kKTpY1_8jF*@gp}BGa=%us&y|?P1{flM$n~!}DXq z<_R1HJ`_WYzzm+gbwDKF4I>A(8Nf~iy4C?3gHC7?;OPi3WtuFSWdN1Sln#Cw#z{dd zDatO1AC*B`UZp8Yk)P4KNmN#Gd>MNmud5&@b)BYlHV?0}f?l4YBqsHDvm9_dlo2=k zIGd$K7LqW#w9*)nt0W}zVi{dVwH+ncsR}!Dr#SNxVu$&aM`BWvIG(wem-b~;T}}uI zQRT*Ei2^6hoVlM{NrD4E@JSJe3*YtQfCSf<1xYRXG$BH2RK_H$W`SSMNf42gM8qrt zf?`qteb_@q9Ap4JlFUa{c}a>e31(4U2Do&Kyd;-F9?cWtx`aL(w8z+8@OZ4RK|Yd0bW`n^g4UH?2~COscsD4C4yfL6SzK zSX%SIr|HWI`mu{9DP2e>%aZwQautwj<`X2;k17NH3VmS6`^)LC8@8LcxX zbJ94->paM2L5sAA^|v3SfQO3 z2`!+ET!Gp|nI<{GD9qzLy2-*a3{a6GpaT0=Qo}xnD45Kz{(+wa*~c`W6CmnONraQD z%Q*9Ml6s_ct7$Q#4+wHVSQg4HDC+=ac{rnKL;(qBBwK;acvjVEmLXaRb&*B0Y&Hks z`RlT(vf0NXuCgQy(wiLD(9g5Pi_@~G5;UIyhdV9ZZ05wPIJ$PyW$KgI zi?iHEkw+?vuI3GWoJo)en8foupW-@46c#Kn4iOGNfXF!<0!l(!V zX=L~?{aS&N(4v<+fE)sSKaHHjXfeGu0>5iJ4;UDivpGc|O1&ei?jlXm7vj@OMdByyBe@IrFVfcd4;zJTB`;2GR^bv}?0209k}fgSs-u_r1(u0l=6#nLc#N(z(Ov z{jkO^yqo5G6trSpKH%TrUcH+d!;;;)e(G*sFd&Qvo6x9@`ERV67R+<$M6RMr=t`yamIxW75HKl~dGn#BFz;`?*#%wOUZ zB`Em;Bb>$A4@n$n`44}F5h_q##_+mtxQGeP6O2(@;uI%8{5AgJuTTWXd0s|kUJ#Iw z7bUk^?S`w(#u{8&!-Z*DMm<>AYin2U*6?q$G3~W&UoLmMoncw}Vzt}a`l7znH}z_` z8d%%)VrdQs#%8tN!TEZ(SextBrLm}uO{xVar{^sQ}g2li?U2AR69Z!F!~>E;6LT-&?B)-qQ+YYCpOciSNd zw-@!+*e#9Sr7@^iU`jn4fYJ4KWvq?C!m@Xek)f>*EyL1xgTZQRY;QUte4=;`av!{XM#g83zNj5E zOzvNPwAmjRHM!Fa=ed9UPrv_zzl-)A{CoGA>-EDA^=CT%Mw&l+`g3MIYM(UgBMFan zzWq|09;kXO^2-DAanE<}EvWCb*Y!gM_1Ee6Y{!o;{+Qe!jm0P1dlw!j^KtCH`&+1} zKVy9Tp%I^GkCp!hrCmRG`?BHn2M&LCHx&MHzxu1iTlS0Ni_U3V(v>csY0tX-i_YivzdM1h$}_P);M)q%oi2@@a^7o6C#rDLl8%LO zXVN`;F7{HcEsQ|(xf=0;BpkK=SUEdZ)b64+IO%m2o~Uh65=H4u*8ceQ4JS)VD4wY5 ztF|bb|HwHy??@NVJJQ)nhii}c?u$3AW1VYXbi2|E{e(LcPDEEzUiHLtsjWV53z~8~ z>K}J`p4SzxqsVQamw8!{CGAY<$*y?X7dpeK&Yem9o+!2klJZ>iB?)4rYLcvVgiiZe zhm)iuQR2H?PaF0|!trTKYiXL);x+C_W*2%b;k-M{WkJk^lcB;L>w@sQZ43oPHEXG( z@)Fm&q1My7gJBHTDz&iDHFVieRlsL(JA@(|xV|lD} zUbIdG(Kza;=W4feu3rcpNmz6)WK9!Q>G=`&2E=o%ms;zjBMQPxS$NgwFLaKf>0r1k_!yHGW50J)N1LGUH1d(xMl9dSLr z(-L@1Qnj8Ubk9V&&ks5HWx6#}Pvp+2BD6Z4lVbr=Wr$Fy!ZCj=E6-b!%yoMLcXT93 z97I~}XgtJPxM*`quQND4ky~AG>_}Bw9ZrBE??Im)Z}RH!bg4kxPgJqfk-N%3egQ=Z zT_AuGC%$++5W8pHQ+TzwA;-UzWtbAC(EAgI*Io+{3|`R%Uex+6x2^Xi3F6TkaIIEL z67~L(&Vdti<>=x}J%L$f%Ifj4C~ICz{nf9(Cxl=xCYVHCL_9=7&z+(e*%%@06Zlqu zu}5(1VMIoRIEWC>iN;Y(P#i=NhT#z+4kn0rIL3Am1U`<(V-ypg#2|O%hp``d>^m14 zArBKfM(jL^5h!HZo39-t@Fr301?&pK>#v|xNh(9IR0eK)Z#$zXp8f6iNAp}o6%Z_5O5PSX@2XKMe4m}%%;Rs&h$v7Aj z=t3MP#)MrUByOAm%Odz{3{H6%I%06rje}qm2QdPDpp>A<9l2fuql zVi)@(0z;!QbU;34zeF%G5J(gt9O5wWK~@m6j83NZIEs)xK^|hm!FYnF*tP5cG69Z( zJP*8tbdRAD*pUSx3t{lM$xsC134&Ab8oG`bVh8L8Q)BkOgpgZrWaBVw;y%F+#y)gL zp%(^I803=xDhYvmaR^buBgg<~0~KK$5XgyzLmzS-K<+RKA~0$UzlDq-Kmlffgm9B6 zVuzp<{@`d#;s7dR3^4|udTcgq)BG3kVB5a-cFI zsDH>A(*sek5ZE2zFv7kEIbvxg?g)nofTkjyIz!foo(d7L^lLW^%{bXzW>`MW%eN;kQ3ugMK{P#Q&a8dDmedZ1_0oiT1xky=y+wIK z>v>#;i)uE{Qx9bht!b4PG)rtRpwr;W$&xAy%6U4Q`w6JKwyrZuJsMDmXI8_+OX@W7 zudwU8q|BW3YC6y2gi^;zy!kXFz7M{^L?T&OWg$+(xS;sfow^VS8qc75XEa9inud4| zCgOK6O=eMrQIXFgLd#?}pZg`HxB$nq3PDh(ELc$7)iTd8O+t$2=~Y2|V)uGhrL&CsDas)qkOZioDu$#M zC9S@paeV!I^Kc%|NE(u`x}iP=o3c2bQ!ha`8AUX>fm<33FG-MrnsQmxbndPwfs~_J zeB%dD6?4cF6hazAIhd8_n7ZR4A$1(lNgOyc7PnPQ$Eb$sQPGOhoAicy@q#3%$XNE! zbumlJFdL_KOkG6h$&z{`i=!%vrgl}%lX-aM&u2kCe;Y#@XI@HCPVIM9PDw$oE0X)f zD-&GcEKSqAA~#9k1#mZ`c?kCWq5@SFP2guqUbxfbm;<~~iRmmD8ZgDBK5ws45tClF}4n;z9)S zw2aeh>LYUN`nH#N)?0*=gl1$yapYTJjuNM$;XGNyQx^wsV~XQ+5f!mRF(tP!+vxON z1^4v$29YwU;Lb(E%niwWPU2Y}m39zc!nAbqA}td%&D=b>O0JXZl+ub&_azeH)v6o^3#>2Ic zeTKnVm4cW?z+TP=ZM4@P#fPiuUNae02e$(hH`+dEFe+d^f|9gC`|GnZVXCag%>7{Y z;vPJhJD3e563_sUGms z3J$NNF#+WIO<1ibqJaFY$@^YC6IsFypt|>gSum{#e(%`>{rgN+2UnZcSd!S)ow&Q^ zK05MPw5xp-?8dPw^O&NlYy#I@_TiQtK9DnORPQ@LXNS4wH}S#j#9hTPd2G-)tM0-A zmX|C}7|y2wX7vHFB9F7nlHnf4K)HJlEQn*7OT!R3*eiM!+$n!=3Gq6#E?&aJykUVZO0d;aeXMArT;Isfg;CnPm z?t(@RIvTayfBKid`rrN+p8Kxn3D&y*7-+(z17Yy}n!-yX9uEvj(f}#$M_heXudD;Zm>b<#woVhvs0Z z!?oecT&?TcUYPn|x!Wumdd+a=!N6Dz>V?TLXnnJ)4P&#kjLYqMFl#uhp&Hmn?8EK zx9SUoPacnW;^pE zpsRQ9K05XJ0iWyrF*JC8{O)NOuYMrylVaaKxboe1?^S$qz;{0e<2^tfKV{Zu+IOE- z{#ETx(YwdCd;wto_R;vKhkcAdKkWbR-Ma@D+2_4a4?L?sW5{>)LFz}5_^!#)`%8O# z_`APF#6BwJ4`m&!|L$>_J#zQ{v4=!Xn_AGc4JA-nRyOX1`!6 zigGNU^4vfj2|Onrt5VleM1Cp>-JaSNd0rE4J3YSJ?VlL3$e%nH|DL3@WTC4)(=LRL zES<}`De3I@)4r^9`2OIeCGoPxA9eaBg9YWI7pB(j$U^Jvg>WP&vc_pg$8F&a7l8V% z*0MNt&^u~zt)8rPRJC;?&6O@M^iH*Nk(c_4EORYQGRH*x{j*bn3yikr2+}uwUOIax zwtRsTUPQy!XOb>T^3lJPIpvHKqz=+FRqV9*Q%T|ankSy{uUeg!D2weQdlq$-)_~(X z8aM2BdYxBYy(^x|N=xMxPLx|>Pn0B0=39cmb^nE!^jnX*;!XsOQ@Of#q6(a$sK>1ihNjSM0ZV`K8!D(s}iw+wRG&wk#+{N0Fs7iR-i>qLpfbJIX6b6gu1=fV(O~ zB||}UIjPO_-50Vbp7cabK6`eOYHeNNIQJFT8=n5&Ij3}9KjU>y5c;Qe??`Od$`UfW z_;)zrx!BbV?&Q_UKvO%s%*nbU3?ML|e{p*9ijz3!;=fh}2r$=go1EO01(8>~J*n0EGfwUPLFc)d>YX=MN91@>w8WNv ztcu(-K{Q(OOq97(S-7}>oQtny6{NK+qu145NZhOA`H^t(>bb1+cY6w ziwSDK{#FzI-QQE*UaH`f)-u33_mwPmj(AO%|4Qg=`uHD?X}z*^pBO7gQE*h z6Z-?D7J6qwN7XI`eeujVZFj{JQ9bE%X9HDL+kB5VT4z03YDqt|q_bM}$%U(PZDGK5 z72&xsmD(@+PW&=${ZEpwNGRlw&Hs{r{iofYH|iftuP3gdO5sah?ETSE`)DLWFi$yM z(xA{4jZ-e#x}jY3pSASPw5JR5QR_d9TAFUOg_ARx=Uc_|&atiu!uUey9d!q-zC0FQ z2yc$KBaZjfH$v-~1e2QMzL%6={rY>ycjEvf&yI+X5d+Lz%+S*YQX9t+d<*kQ6yumg zIA-{9j3b7GO@d&;z%lq7dIX^fL#;>AD2hQ`h)9gcl!Q?nxX5Oh9`T)+A(sq^Yv5Ab zMZp+PK$#a?1Ys1huPN}=hvB0n8Zm?s4pA6lkV1U+9cJV+JQ6I3;yqxB*%<7`WP-6D zO{bPSvOH%LF;p->QRH9-(Ax0oh0qJM#>9i8(2Kwe7cuCLIn5w#G8!@Oh#Oc8%JXm> zjvWx<`@sbJQ^Md;AF~!S&=l{nR*V>`iAG?vOPmG<98Fvlk0u^Ns%m!@Nz$3!&`Pd5_7J3MQg-3qCgs`uK5z9twGYe5Lbw<9!U{vhK z#C1^f&6T0;K7$__)*UfKG9WJKh6FL#8=?(X#SQ~LM?QQa5XFGSJ9H!H;)d+e12krs zw;znWsgG@oFi}B(rjQ7qJ(29;0x?P*U7r{E*ZDk%%dq7}JLfgi%-#7mwgi7>^)^U{Q!dWPyVW$&SE4s0%2b5K6#j4tt2; zk;NV>@GyH$0_0c>5({~cq7kcV8v`(pq@GQQG zvLeItd4}nnVw&B~D7l&iX}O?LS%Ne!we-JPJ$#ZX+g_0xn_lkU`!dMPz*H9qb$B9H&>BINI}DEn=xlmj6&?x#P#Ms0Mv|-Bn$l#3C=F&Y z$+I*_=XFAG4zrYmHCUQslH!Ww5Wl&T6me2a$vCzvimK@h+4+qXU0oOPoIpJ3H?uM> zzKQ)bn)>vrEGnoWi+{(mlSRkfqzY-e4d0f&n9Vg1p{p7mX>h;!C7*3 zHP10FA!Bor&>SUIb_I^cG%TT}mql1bVLEpzH>uduKv_8Ri!!2gRVVIM5T!IuDNI~? zQ)bb1P`P25&TlF&MNVa*0&Y(8Fr^to>(ckn@m6-xei-ig2SM%F-|mLMusq>c(&w zQ!>9LbC5wPOj-LnjjudXc!Yw;2r35ZD4A0SWkK#nUV-O1wGc&RfF^VTanG*fD7>b` z&aR>Q;@pNGy%Z)z{S8!l7SIGT12=LS%!}}*s7ng>CNHG4M6)#gh9pH;KmU*LOyt? z;ojN?=r8t3Wi4#XYWx~kSpcp%(LRWWECrAl>>ui?WSH~8otT9(W)hlfQ+6Q$Q@wjw zmo*o}Fz7p}7`8jD?u#P4*8pSKJh1kW3!nhf2Lfh37@ytY*_dgcpk`)xRgpe^z+v3X zsO%7#403Wn?u+IW3tb+~*uLhYMr4-Ws)Wxf`qw+~@UR zxZ4fZ)`G#u3*)jjtlies*NYl1?CHoahvU)0c~&Ll)1eGA@+7>?-ol#-!7KJ0f=D)XnSdI z_7rHwfL@vn1$u3+mv96|54NT;(AUfLV7uKlu=IAvh`;7yuw3X%!(asH#d5H*>mef& z8=%u%E!VoSSQsnaUhlw2eP`9f+S;xg2J{mCZW#r7yIj<}da>OOOgOVyZFWl=RBRSI zeYYJB2MmL^wkv&DFD%QnH-ma-TK3RffU)Lk2X3u(-5k`qwPWPx9phVXEgb@}1aFy) z`jW+=-mbRwYGVxQwPix+hPJU->WuxoSX!5x-Fjo%i}j^GSX#Qd9t<|CtzqiB^`*IG z{AY8xUN0E^dABexSIZ$IL)(MZYO&gYt6NZDZhtr6*w5|f_H+BYZGUI9=dZ+JKLXr7 zKwb|=pN9p%kRkk4ru_&I`Sm#EXS6>p?6Y2dIUSqH`Em;NZ%!Bf5vg}b>}O4x#t(z> z8_zh4KK{gL_GjBC%=zt7p1+t(yl)>tWlwQ&>mQN&g(%@yA)G%V z^Xq}h&tbJ+arVdbKgoao3eUeXe_z;G2J0V}|Csy!(}2H^5NG!C-B0A=r_KAC2L*nz z_6c(u$eI1Fs2Tcs%k1&bxSnA0VqX_}eCxc;w*`sU`1T8Jz^l5TN)mTEXr1tasPLV> zrnOpvB#3e6wRXCB*?q?={Zpwcbo+g-dvs*9Wu>q6R9Wco9Z{9I)-(J}5k095zoDML z<|g71cUp2nYs|^*?-(Fz3uf0;=DH|N#LoGf=g(FC{8)a*_oGW*69lo_Kapf!QT~mN z+x`2$==H@B*B-`Zi|1av>>2&KBWmL4*|~D0^_7?18%Y_+!fkMF^13W3uk}8EB&j+l zDVnPDXS{fF)Z!$$)qABp?{Q;AJX1Q-iPU<2`bJVkLEscw;LeXHCmrij?#;Nq7`#$A zZ76DE`86lj65p2kVn?EvX#ObLz9cWXilG@^YV3zyVF` z7{Y01)s-fSXmPxJ))qy11QvJNtxnr=j`V)JE6cJeK=vT_?RH=3_BBHg&*av!)%ImU zK0A5d=esge_{-Lr@=WN9s%m!m_L-{n_)h1PlSNsRS_AHw4~HVpoq(gqg3~*Gb^fX& zwO)!cd$d96RFeE$;;fU?p~P`#T}$IMQR#`TNx#z)+k)KZ+dWm_W0gPcb^D6Ye0A(0zW1!%5qjKIJ~0(#pl1D-d|TxW3Dk1~MHGdusY?>Ci;giFaB|B=1NlPW zOkNRHS?za?R@X4(6R{_mT8n?C3!*G_BssLW{*loP6GTaRy1fY@T=k zdru7E8UI34`N12$&C3^}s+>IUot~ecN@7nxR&=Swg{mMa7aI3VLDbZ)a3P2-rTwd4 zfA0}&F=i!WTw<3*jL3@PAdUit;}ZBnf*tluUWj9cVUdY9#*FwIjTn|jqA^CHM`BE- zD0Y41xIy4Ij85!C#Pb;RIc4Nt&uyrtZtS6Wgi(YrB36Tu;y8>EwiwP9dW@@z7@HZx zC2wj)2#rQ0Vl= zK|^?siN_eo2=q2kCkDS@a4=ygIgTd56h#e44`Bpj-6)z)$T)Tb=x>kWJrc{tPT(45 zz;nC@E(!8HLcn0gPmbd4a>5hGmVz#~E2@Wsh^#313A1i=(fe1^M&zh2Z}*aV^&GHNa&vCRx6V@7WW ztD=xh8LG>0K#ZWd7bJu55A=t;*k$u>Jg()j~LbronkBY0y1*h z`T(}i9?O7P(SX=CM1inpA3QYjSjkPBii8M3)S%pgkQK8Zf&>E5o`QYgf9y6j1d;U^ zdppD-l)8tI>+BI`VuPdxRHg~0H%WM#`^9y=#7W`>d0^9UL^CG|NmfuloiQlVbut{3 zKAqFI8AWwYQ4$s;q)x{0{4Ao5n?_{`k;aPz0-EI^no*RYWCp27bISg&K8%XF8_=sL zOrn`bA^nxN2r0^aN+DV?$c+8c32<1%UIQ%0i~yV9nV-%Rnm}>U7;K2(&cayFSzYGg zO&AhN;}M)rgBy2A(jZ7PFC}>y4@e+`NMKtfJ8AY8FD&Dd?cNTU3OU z^9;{pKTYzG=6O|SZ*dfiOPFd2cro{E5{gnguF5#53NSh>XDOQIK}v6` zjN(~c&uL8A>?R3K%VY{JgcSq%=A=yM4b2#IPAP4u{&0T_-=*Lld@92{OCUVO6-g>; zXQYTxj?)_o=F{7fjH9$lX;C1n$ciGn#?%G3+^G+}DZ;cst2lHfVeVaB7j%~9Rgt3^ z%vQI^Qhb#WkGfTURi&}(h90g;h+~TA6)LZ@>yp0xcA7=GU!o+g-ug+6Xozm+PyiL7 zSJy!fr7?R;ayWr+>BN7RMK{H}C}&S0q&Ugb7*Y7ifRe&1F*q2fF4RClbGV6@agkR^ zn4>7ACGu(I(lD9Px3(3eGn_5)HM)+k!#NG=Dv4c|@cES91XTc8hd}2uny2|PFK`0I zS_Cwi;4BWxS(e^7B=J1zCoWV~FhkX}KsQx6cPWjW6xYGjCsmn5b3B8fJJBql?=l)k zP}=?eEkcw~GWT6tM0sA)Ynqku6-`_U z*|u}IVFkB#!varG6yj`_y0bKh!z{tYG>CCl5qz6b_c~<{eMAxb0Dy{4!Vu-|6?GFh zSq0Ri@DqS0;T4{dg$HGHGk$;~|D(7;k^gDr@8P;?yoV5jDo(+ez3`dE zY{HWR4mOJpYS7-|!oTO+W@J)TkAT4gkU5XvgTV%2X$l_?lE;9USx;O^X*av;4H zd*E*BKR}Y%`TSrkd9NkCbA68lrVUbhhh6XcO$ugN$pnn&`w{4l-JLO;_e|HI3=SSJ zfIHuVuLl4ygJUm&8og(`KE`+Vz3d#tap$-DUjE$!2KSuZhmAQB7LRDaml=aGj&QJIw%} z$)7iM;W4`NgWxo6&bsDzF+m6}xiHXYN&-#Hw*oS-rpe9cOJZd#sbXC_NL!w;|bXK?aPm0qWh`YQxYkm*&7+tc=BK zxV^M4hx%~19_m};a<#BmHX}Bh=7HI~w3ox(Znz!T+f{8Ww{=}FH_PFAaJkuDu6Emo z*Ss0jy1q5nYY?2~&3dVuJ9E2S4z{Mgt+(cCxv+*i+gc9wrEcrX z;dZ&u*Y<9;Tj<;6+TJWJ)4bd+SBuqdJ<#>x%CwB(fN_~GO-5!mcJ^j9*fA>eVmVkF zYqoYdTfW@d?snUyJ>0_8x*;)d?e#{t>YZgTbX{LC60^~en0LAfIRW)|Eav5QwKTw< zdOcVUem9WS&+X^-bNgxA6EN^J{*Z$F8^czg9Cwia6)>dzkcs?71E1!;9@+<%eMa7o zfW(j4(VuX5`q78Sa_>)n+K#8tJo_uL*-uITY&0K6@N11Y@Vp<0us^D%2g9e2Vr_p~ z=OYPEBN}YCjy-zc zzWa^Iv7dyq?$=fRa#4>+z+Zxsz5QIr55TXl##%oXRDVX!yGNZqR#`uF^2g2iaMj`; zYhM_QPY-%ZK>hJz-S_RgkE-eIdrIy5KKCCVU3rRm`v*^)d%~zE#(ekD^-l%w-J`cp z@$R3h;O|&Q>WArkGB#fcQ-7}e6FwYR;0=t+es`0P`2I6d7GLyVn4HRs!s%JR+miZc zoW{N31X<-SS_*&3kD{Jv@M5p8oxbM&$97-85VVdeNix@ZeR`sbs=`Z}!2kU}ZR`E6 zd@6Q0PSXb6W266)*F;WytsTo!Z*bZYc)^qeNtB)m|Lgy*i-IV3+a1n;6TGax zBwlRyxEFtU+|%GUN`*TWRsEkG$tSAJpNf3j2zmbXDPPHIPvSUU5jvgzR1rksbyqkO zC9!*^^u8Ac`Ha-BRWDkszqg z`TnTe8MaLx1oU{0zdTi>{+kzP(uF2yjN<#>E5ec1=lTPQ(|DyTau>29YprAHr79XC z*XM*TC!b#ktzJt#Zv6vE?y4=0KNo}^-y0}=w>=dEzAs4qbG6$#dUYgo1L;KOg;#y4 zqiURXA@`LNUgeKov}I8-y0LH~i@npXcrFY~P3_4%gL2z`&ybWC8mD*lH~bl_y2?FwmssH zcU3oN_*+5ePPNyL{Lee;|J72sO95tw)M~4}7fMIt&s(=b>qt5kqhFaK2VoMG z;XhQS-?ZKywO)v)x+*UcwvctR*048b+|FPeAeRA!j2b%%m}rJ0#E5Y# z**d#8#9o6l5fqRx@?G1(k;@j+#SGf>82*bVq31zowk|P35km_jMo-2J(;fLS!nV&C zq;S=W8$_6ak?<)Z!ITgm!B>(ICIMT(I%168X2BIaCbs9;48?1foc0*3X}hB!gcb#i z6%B#$P#D-?p@$e76C{ry25|#9GO8tU8KIXj9FgJ446+@2AaFwB22Y$YhAToonC}K7 zMwZ2lMap2v$c@}F@|aL!F$j(=mmP&{t!Z$<^DXRnk>`dC*d9frsc*3~F;EojLaZ-n zwJ}>68;ly;gdu@Jgr>0{#ep9OUN~|C4?(m7mpK=JV!OfMUDt!~ju2ZP+eQ;e>;%61 zMr?WO7`k4*ZdWT}JT*XB{gJ8NA3S&@8WD&~!R-e6}PsTb9~};vo|U zk3D2F9M^^9c#$23?!!tls5i?2-=?0$DuAKTaTHE`?79$X5A=F$k?q*> z9WNM7uy2RRanAPaS_mz-6`;cQ9@@%~Fc!)CC{AlfKkQGysx$9^!zPD3kaTw{icGZ?m**6}K#C5@L;`!>EUa7sfs zj)DS5-7~fnu^CW|h$yHg>B)uw} zIL#kt>Q%}B7cs*0kFvm#Gu9_M~V0zU~UNl1L1`8X)31)20%iQio14obiu zu;_{s8ipjpv)qnw0AuGfC#r6OIpd(FRazn%rZ~>>F}1^ltx=9i68S03@U?qIXY+7E zog{Uy;@qKmW)r#?JA^VQlqN+?3ZJC-stn4Rk7*PY(UfG@kQN#x)OFHenqwNLD7~#v zMx!veDly5(9FdzMBS`_q-IlHcF(C{JyUsDDX`0Ni8_4 zWM27kVG%N;A@S1Er&l;iqAZ@r(X61;Jn@TZNpbis4JZldJeUSS;AL|?nJ-f(0$xGkZV#PrQ<7&j#2H$66I5iz z_}CLtrjSc}9EJWAh12=i52x|GoZxg!LyuCQl7ik=V=y(Stt6*8G>G2pZRpZGeH-L% znHJeRkCzzdG)1vZ-CK%%wqEu;p4nbn1lN8sqt}quS?EKTprSC8qBM)??1r+ntLe;v zn9-yh)3@O?NeN?6qIn!AHwZG2$CTWpNgTT01Z1AD^7L-fs9<+y@HI?PHV=w~Qb_a- zDqsl3a7dPA(iB@+UC*;TtHO$6JOOFcvvc^FlqQwOmI?=DILpfn`;n_wL2m9=`VD5)0gk%EXOiYGTR@jVOb5!~fxKuj zSl0Is09V<7Px*c*9Av?sA~^!F2RO~2-f;+B_VoMP*uij&BcW5LFLFnvFaw?w@a~pnivWM!zc=iC(iy21i zjX^R&RRQlfsK(<1MA|^M33&jrWh^0S$f5@|1m@TbIA^FX(>iCI=xBC8~)6y$6SdnyYCJLrGlVJ9IsS{!{QTo6f5PoLtPtMZm(rR`)L1Ime#O_e5Cu z%!E$jeNZ!y8IIk(A@>06U8W9o2QKFa+;qN2mlO{;Rh$}(elU-SBrXO8OCxmU`r9(cdT2}+AX*B z&R*@dE8Q9ntRalC7uIFXRGPIhH0t%X*>rfb+g{eSxm++fb-UYb*cQ4QbG5$I_2tss zGLGzexi(gox!IbAZd#yswb~hLlkMKSv$g}qw`I7dRW}&3B4z1Ho^+Jc~Mj0L#6-qwR%!?oS*>e}88w-y6CcN@d7%)zRz zSM{LTXxLnC*T!OD+q>azXb*;lVdy*ka?1$M=5BDgX8R0-ez1QFTDH5zaAR$26O=F3 zt5v;)VLIDqxZc$pknx}YZZMyp+t2Oi_7k@cfYc{|nJXYqlSI$YfNUSP?;d=*8&Q8LY4IZ!&51oo`}ysFKPmsC^^HHgR=<7swP@St z+C7%}vC4O!PR_gc_B^%A?2}raZg>6PeR$&2?I$arkCX5rko&i7pR(_x=MlbE#^=@* z|B}`~sqFW+Gp>Cq8f{Hg&YnxBvcRdzvolpa6?tuNEODwJDs4p&<*?1Q9a)@m$Enoq zs_KH9v{jeCkU80C>Hk1I*ZYd1W4WVfy+ zyRD;BrQaLMx2DwMxYMCH5PQp@|-AeuM9y%nta;T#F26~==V8Z<%YV}=9TB*)*FG>H2&ZJ z1L3H5p|l3FKw2;Pj(U779my@3Q>FgN3sqI8{S!qK+OJw%+wAsU%3pUG5o- z8ga+GC|%fHRp7gQzHhu33=xp3>A1ec{qiQ0*PkHA^6FXf=j(9<6_m8@~!U+Q8 z?NaCo9gR1@?@pWV>73l@_Ehm#zy2OY76W`D%VD^f6(cWp12kdlAV(-*TZW9VNhjYk9`|O@d!=ah;5)caXsI2ku_!u^D-_g8U=_EXx(7M7TEOI;>QuA>NSKx z#`Ou}&}P(FJ3{eY^lz!qXkJx1(g(5QvO3B!`ue!c`V?j~Y%P4*u_ zZj3|Z$6iDx4Z)HG0k%;X#F6VWg6$NIeAgK}AzK=mg!@Hu;VZI(K$ge&sy^E)6)psB zv&!-)o-l9=k3zP3Z-jglhKxJvML`$^v4atWiZHOz4cI=s2t+qK*Ro}PK@bX^2@2R! zxoE=Hj7H&j#GutEVzfyw0Q*VAHn>HRGlJfBxL@@)a*-dwhY48ifheD0fDDO7qY&&F z;m8HyuJ1E~X%zW*8nIn;8|*kn;91O8I0l0v^qkdV*~83c*O3=o_$G&EpPZx}K%EQ?MYg)v+2*}`KN;({Z4;vyH)Mp!(ZVB*;f zH)Lp=(`@TJWh`Lm9J^@ZZ1LyV4OwI%i4)($W5V|EWw<>H z?TGCeO&EI@TOr2b9^FNZ9nIFWc4Ld}|Lj9rCTwY9w#M-^jv_|Qwism37}K@`;zL$O zY$51|kcyh!aGRZq5yS7Jc*YT_*~s5Tg+LUf_UdjA!f;Y==9F2#!fnpdx0^4aC&Bse+iMIU)($Dwj+nI`&}_)lp81GW31MEv3Y# zVVt!JjyaZyv}GslROJ?TvFtPH$gcq z)7x^A(d#s)SApf+rs;xaw4_m0xLLiJ6cn;l#B&$3jdDr604rSR5eD@NFI48oCJsZHtJ7bxy)M$`BkTG=$lRZ-SX!T&FZ}XE8%)(KTZ^CVrAz z*C0JE2}VU!j3M6;?sxN?2BatvL%HLa=}ME5tzw;)@yy3%kri1q^F4Z7Tt(z&nN^U8 znB-Gj_;ePrjcOr4!K@soZWX7*E8X-enwG^J-;NnE_$pW?i5Eq4OkFpM@;Ranj*HXT zJWu>7O0Ni}z8^AllSC896Q*TOU6@S~TfR4?Aiiq$`0czX>r(6M8$#{fwqz!Kk?9Xv((KrFmKgw^d4JbewosH1$dV zY(SI0kCq6NMHc4xTN*pF;ws6#Bp_i-7XiiDe1<$UPx7l2GU>r>kzUPhMDv)ig_hx` z0j0MtPEmw2oZY~Wurh-?UI}+|DC5wNohKJ?O0qFZ)9a$ZNgiFYvzssnX3t-`c) z*`Ndb7&A3-Bc1G#vO8RIFR94l#;Vk-!kmc+;V3QloubOVgD)SGCrdCDr)*JVCdCh? zdmsuOWY3#rk(n&QV6CK@GHu!Y8o>wQ)xol=Stj>A`ia=8(QH@LJFs}}gK-B?HQh%d zJYZqg-u>u)QE42o6?Y#(%VFbea8E*PfWD9=!aJaWc8d2M@37i~UPihs7+W)Rrp-pi z$zE&b7fus|hzU#5gB>jO4%@%@09o(mVIdJrxrS7)N_dkC3WC01sB| zHzH=mkyi&Wd{i|AQhWzd;%YKy1k8rOSrtx06rNWoJ8)Q&$HOcir6D=QD$gvu zk1>cmWa7S5W_O{!2i6}!_i6b4M0%*{dBM`n_WOkxHE1?T^F|~-VB)j=s=|=_1FibN z=T67_ETKjQl-RyfV}_zK%cm85w|c+Ovt8}sRMdd{*8R%WFzXmId5^9)&8zNaU+x@y z$-M@Ko*%B{1=yRg^!-j*sR`T{e}JDZBXc+tu3KKH#LX4R_fJy_faQy4* zt1ZY}n3wfnwPA|~Z+Ch_Nj)%9clN?y8_;fzA!yw1wp*{3OMAH;GUn!X3zq4NdQ%S= z7j-z)x2pkTqiz<9#lRTox>+x*^v@2P=k~9%!kM07KvCYf~Sr7%8>h zn&x7=+^(#8sc%hvIWT`GxX;h+=k{~^iQ5NY>c`N~o}+p=|Mg_jL;Fzf$AH%KgD%sr z0KGoV+xryo^c8f@4>nHyNa9nX+}LsV18ueu>wZ(#kIi{v=qHh~-_GK|A2j>^<({1E zyg&Nnh)3-y2JVjxxo`ewt#dvj^#5z`+jbjSvh4Dn$*Y(YrJ^o%p_nA|7LgHoPcn5O zOLaxpU9vB8r;&h2*Mn>$|dnZNp;#%wZC7)aBqcPu*)n~(Z%>%IJZ+POf67GFBPH; zP9#~A|5oY_&9-D~vNVv!d+2pLYDuQwlmEmX40=}2+LL9iwQK(4zfm+-m zXiH;NF%_6gHV2AnSf*+0{fXQol42N|WawRe$Fk&hsCSi?a?tPVlH8RQt!<9Xo-tD2 z{3l(N)P1w1wq8tnk~M(9Wp$?`hngvMv`$-52c{(}9aWY}*--v49%*gOl)FlM(l(8a z)b2_<{iE)1r`0uN%k0VO8&k1HgNf!ViX!d4mi4OFHruVv+%j8TU02&L`lj8|`UCBF zJkx*uu6I0aX)?+R?B>K)Pq>sy_O}*o%W8>-?I(nD0Vxh(p@M}Dr3iPnZpa|MW-D|ol#%a`ljBu46S|GQS@%- zWJlfqHzR4)l6vUgda9W(xxFJv%2@fc7sk=?sM|6WsbzHf!;#+Wwk3#q@9#9VEm<$M zH@e-|`&~)1dWv>%q$tLKj!f-$_Dg#vsqNNYPwlq%FJ;Lz70K-mcI5qoL*kxY|J;UJbeP%d8;i+*n|5Rq*6tkJk|kM_-ncb3Wovh&%RO1z(Sp~# zqw-L(l=1G`Kde**I_g*YzOmQ;!L;R+Ez5 zw>N(I%5b}{J1=%mwC;NZfdBAUzg>h#nGAR`iwPQF#y*)laS%np)&LZBerZgdAflXw zTS4K7@WA)rQzh~y9p31-dI?7xS)TYbh{=@s3&ve93>G1wjQVIAnl#kaI6-JG2$1lH z5K@#lsM6a=! z{T7RWZLv#y)j?xY-}fn>p=9i|F`s3D%V~n@tMLL+Vw!|7RXBHjLIO&B-slyxDVaJA z4`^u80AEW1x214piL@6>ay3M+>!5k@eDRZL)aX0fJq$qFbp!}p=vRL z!Hao-s?VInkmi{W6Zw!7;`wA6BVx@Keni5M!iVr_fBlLYOT<9O;v$Oy%&y)c2THxACpl)#oaw8fNf zMU7!jc!1C-OiG|RqJRXRN1SNJ*wl++59E6jo1w%q3e867Cp?8kQFJ*D z-Kb$>Cn#1NxY*3dhDL?yq!9-uZ~18zESU%s!9$jbB+3~JNK&5Vj6~6rT~tLb0^$@Y zCp5e8^Hp5C`2`bICgws^d0Jmk!Rk~b$to{+P9srNXmUC8R-Bb7^yxCGXij3teVvvm zIWNmqbxK!Bn4Z-l3{ThfMMcEf#oM@ui!>EH%bB=17koogL5mglXmTpNPzaIaSQtH9YhTjJeX;Ra(I)Xc0ocZJ;fwOfXQko~;Im{5UI6J>cs*+vMsEBj8`N(PM zX70SqPD8d40s~$r34-1PN?SmOtfXN{;_-M$9}9^ zdDgn#vh+SM^zsIBdU%0suZ!o1Y4JMtlBmvB7#L>_gjD5Q6s%4V4rH|UwjnNIqUdo- zI2H4XK=Ty$lkx^o#3Q zf3{?G5LPAP)iq*aZo?aeN8vq4U6hE)`875QEbs{W@%w;^`ks{71hl%3&})#mIu2H} zehfajN066Ev0_`Y^3R&>gXQRjS-E_K6u-b5>8V1C)w7oTtt|!tXV8=79foy zYlE+b4ap*QzeqEJ|xT;gw zYSp0L$WP4)+d`Ev19^Z|X~MSwaGbe#$UyXfS#ArPKeQj>jWmAvTEMF2_oBkpHnsT& zQEQkArKj^Wg;yFp7nQ8%h_622^Il4~@M@Dj{!lUJp@W_WCztNs-Du?4o2xr#Y;V>>dwn%opR8}MH_ihq z6<)r&8sFYrI`)+_vKv;a?T$9$_X`=I-tq=DxfgqXn#Ok4IOx4JXwZ-(B5Z ztw;9F5aGm!rGM+8JMuZq}pQwcXgh-k|O4W`tZ+$o$FB zc1AE_ICk#VSN8bYnT(N)dVOPGUvE%Y`RaCZbG5N=M()OiYz#-pMZLYdLf6+JBMzGH$NzuF7kyma#e>{x@Uz&XpQTl=^M-L-%p)*U`E!<>rrw)IL@0{jLkYO67dA0srHt&zIm^oBC^E zKJ4g^%V_Dw1;unr@x#-6)5k8+&N&U>E--x4r&ptj2N_`ub^eYps zKMMI7#Pt2MTCCr*?r$F8)c2pR@XYb05r0G*(e<+rzv1}tYghb)n)>7Or#>9tx~Z>) zx&Fz|Khp8-z1o1F_?OpVyJff4rERt4_Dki5f#kjJtFKJ`KksVl-hS&?+c(U%XWF|j zjP5^SlBrA5YgN`&TT}LQdvr9A+PhuT&?~E@+R9to7)p|f&Y-WmrZPG>8npHnQcF78 zx3uo0<;(N#p3-{VvHrAwqL{Y&dqcK|NBWMT+WM~9S6li-?n#Pi^j<4F1GV#NuQm7$ z%;(ZqLAP_T*R^8XG*wgS*aJCiS?!%ca6FLPJ)_m#?On7xvaKKQ%Me3*Bn66PNe8VR zwWsXrFVx;l+kd0CJOIG zGkSx*HF~9u+Yra)VM~?=`({t-%PnnaXqMS&NwVxJM?+nb?Us3|tG$jnv?RNwDhK;2 z?8zsP5vsQP#*wVQkgS(GuMgC>$H%I*CwGQQ-$L@QandtPYftamnx$B#Dx0b#o5!}Q z4iERFq5KBPpGIHaHH|}gN41T1SJ7>?(^8G$sPjfv6-n;3|F_+dEM-^j9JN(NQ!RMV zJ2JH${a8_36Rk}<#sM^l7AlIg)1MedTas+a>RGz+PS@Z?TWTZrrw*lIOM2Pq7k&S1 ze;{erQNO*|)yF+kwK|e%%CfOLhB+l2Re2A4eZ`RbR!2bt+m&p>3}aM!HWXdgI$gPY zpi7Em>HU4vk|ouAp?0-ba!Zw^*D{Pg*wc1l0IuIv_K>y-0Zm6bG>bHrb=Qx%5e?X!q3dZt zVkh)xffqTHHlCvJtDX4Bctf5gP3F$jN2gC7hiu`Z{%f+Oe!9_=AdL^Xql@W0_DS>6 z2Ax|;!{LNL+_=Gfk`SIEY|7{~LHEwa8X8B8W&|AdXQ3|JDhNj z@rYm$h;zXsingdxJVQt!W|5l^!lEd0SOifdQyR{_X}Ew1NrbMckq^PU(=hNte}T%y z%$@rYgUt92pYt$TAOcEVH$*fjnh_czN7juz<`4(6;=yDwaac@I2{=j;1h#@8Kvb0> z%Pyi`Oybaooy-$H_u{~Xy}~7srG(F>jQHM+MQEtW!mZjXg*2ldD~-Hp8qMZpF{PMe zNS6=u#H0a5VZEu}0Lx9;5|)H>6puxTT_{cxQK%n`rV(P$9!fG}0UKjdOtViL;v|~N zHk?Jy=3#`8ZX9}1NM~_8^O_u?Q7-cmXcZ1&Q$A%L>Hsqy&ON$7eknn86S1RwiuYa5F# z3XQ^o5Ie2uIQYYmq9QL};MW0SAHi~pB+_V#Ttgc83^~%sMoVZ6eaHRKLr3A*;n2iT ze$NkBqjSs=V+uG@P~!-Nq*0L>dAdmcg_lAf3hTin907jhGE)bx@ZA{U&E+~PSml#t z?qveHZ%NLCsA!&gKCf1b)!Atji3Jq}&oU@Qj@0aVkynDlmcz2n197%?!ZVjGk;R$T z2&iXd%HA$>l4M+v3?&;G7eXxfSr+E}{FE%kiWihuaDj*Rnh9Of{M`!qZsFUNprpL; z%2Oi9Iu_aaGEbwcWxU98R*5AkcpA*ad2~TnP@cTtXK5iwS|`;i$f%!*nvfv%;+*B# zG^z4zA%aaMe56~?g2j7pEl3Hi6J4gn%gPlO8Qee-L|x9ks7R?G=YATO$i{O8gqjz5 zkwBM}bhe6?B8}Z36--o@b>e4nk{9e;l%ilnFj{zdmP8S(7YVfVjhBfivn5UwRm??V zm8f8wX?<3fu81$*pU%&dY?&58eBo#3o8>C;%M21nQvr(*H-o!KxMaD^g?Q_cR4k#; z=_bfyNH$Mc7&EsDLumP0WGVM@Q6z~o56Xm+ReE|Mit~y_XRsYotUUg%TGRYA3Fe}J ztOc{QE@@SxC##54I!mjnJQZgYLEq{uK6O!On5XL$O3%-#GA+)7w^^2kB9Cbrl1f0M zIijjW=rT90t2C=zNUVt1CK6EK(B)MsVpvRYcU|XHP!DPq5tgQI3^{`5&>9u1SX_ox zv?|lHJf&zZo5QoZSi&2NDAP!IdG4)q5uBZeXK_JzR&bFBQZMN;j7hAbV#SONt12%jtp>3VRV=QSpMKLu{11%f*VYl?&~fq*Gd;p(^!i zF^^Xyhqn&x&{A2~K7A0j?2WJudt`dG#k}L?q6(QAW5@#ZzkvOO6 zO0YV=sDme1=E0`HGJk*e6;5b!B+~~VbH0W5qPk2zp)A%7dDDAjuVKF= zTTrG#P$++xB5A0dbxmgV7LAK)pSukhS=LTo^V(@Z83bn*l-88i>4&AZWW^}Cf502) zr>bM8UTit64f@1!UIw!xind(VKOq3p`+2f0rgcxXgzHEHX1QDDXSRZY$gm3$jf0(hU(}O54FSbgw%~M{( z8)LoQTtb@HDBLc%_ab-#JwI}IXAc3c?m3G0OYp4Bo3s3pmRewfi#V&(1;b0|vLg2d zi04fUr1uCgLc*x~8$t6fVFm;y^O$WzT##)TDZJ>S_2;tKM(*Bw(cY7emk%1W^(@aD zfc?I@%^GxB&+{i{q%o@KZbOakapG08A-C{JzG|9b3t2yqd(j6K*GN+AES4uRUblk4 zwG)=@$i1-??Zy5@FkWFdE*xl83ZEYD711 zCR7o7=NaJgZ=V4!|LZ>pa0&04#qW4gF(%pT(dfp$*^D>#9kLajtI6!f%{&Yt$XyV?iuf|vIdU!J#Z$|6M zdVP62v2Ta#(Va88vahdhhqsgK;pN@s=I-upJZ}6%(T()(@@9QK9^H<{&St&dx{=-d#=Z?p;VXw>bHDd~=0bz_$>_ z<;~^r+IAfWElAxl>~=k|Z$9=Qz1tu>2phg}$Jh4t<>c<Rs%F>2m6x!Y{5 zNS(E7U!fJL3t_C0@OkH4Pav_^P=?#9TNf7H+(EpyZQq`(uSWLz7XBGe#t@EkJ-)m< zft203m#EHrxkfnm;{Ofi^2_nd@yqcuj!(eK??$D54nni|1b1?u%=3{s<%i>Y@zRe1 z`-1GM_nkCPcmAdEpPu?8Zr7WC64V2#xLACBpEz{>lXbkOmo1(TQ{m(Vc$0xs#iH|4v9?bi` zcEsPOTfhHU--DC**Oiuz)E9eQRaT|lMZeoK?5^C|HT53iG^!-)vO17@JCd!+iq+Tm zq?W8IE!vf|7Eu&a@2GovOWp6{NL}VeSL>^)WY|NwBkf!5U9B&5r9Elv?Chv}imJAT z>OTBoXS7CUWSYmaEKB-m(3|9v(NEN2_t5G}T}3^3sdYMU|k(wIdlLxie_JG1`-tt=3L!S5+0c ztBo|p?rY3wnKF8G%GzYm(c67V>MLzYZpl4WQB6gAA?-+emTHd9|BG7m6n)U`$gqg| zQr7fiS?y|4|4_BsNDl4y6;Y>y*mUlI?)n4cWX<+F+)j%=V+5Vo|KJ4{|%0}0rK9WAzJ6H?{$~$5YWY~h< zv3@W+u2M<=t7W!3s*-Bj{>zQ@O8RqiPnuYeGpo;E=%%V1o}k*Swm&dU`PJT78+W_y zmeDhg+KOtJlD4OYeU zN3s91+aU+iKznWIN>{PF9ZfksmW?BGtR88$c_`~0ZD<*NO?%Vb(O$K>#S3{iXjv_- zJ&jG-P`l>vb?;ExUmuzOx;0d^zSSFa;UZHrT*H>+m)b$cc-NA24Qau84?4uQ`{uuu zk9A1&QBU(a{n78B{4tF%&?CEO1)5;{RZ}e=l-5MQO?So$TRMDiK zwli!6JI2Y2kwzp{`kk_DA6!UGQY!bzTD}dm)?m<6w8JB>uj^J%9(8OTa@p0bf29v4 zW2N^s-Dv%0>t=e?lX|<>zx#vIe{JsTk}?_XO26?8Y1iJD^c|@!`zo|&pazDq`{Vha z_xq5{zR|~am0tZ*N#1Yub`8T;RL$-ie?2+u=|4`o2ddI*zc*D0`ti5Qr72I_ecjkM z4_mKQsoj%p>-hEL4}bOB`81w!j;N78r6EOYP~t|^cc-W{OBWo?DAAdah0!8JZ^Fps zjE98r$nhJO(Ab9;{3uKsC0Y;pi$UBF14DQc5QDwOg$S$N?V zW{eq4rWAoQgk=I6^LR?gjHBOY6ocMgz1Nbk_HSVE`iBuOp%-y&>-~ODP_Jp^J3}- z+@pTz2M`*PR4F=7&iE82KqXv;&a2erAq0kwq3~jYHl|@RkE44}*C0q3(mFXL+k-lV zs3IGqsxIsyF4 zo`Qsj90BrKg8O!mF^r{K%qe<(BJPeOkU7jkl=Vf6SY!!LQ4cpl95fDt8EiX2e_iP3 zAR>O?F$ZyX2LB}idWb@fTt)&H?g4m(#tua)rOQwl8kz|qT~4QnNd^@8olq~I@LAOG zTm#M!jEqGcM>Q8wmWTyk#jZeHl`q4{&mccy2{p}wsED$%5;L*POD3|UOy?Oz{$3SD z#p&vDnW6$PNl6u^X_1{LMTRz%u!Ec@t9X%}dzDCw^E~6?BEGzc>Wx^1r7tQWs<2G5 zXjK&%5u_lwUxz%;SAN39EE6GJmT+HHIU~y|N|R_Q>J(BWc#tOOxJU~DZz5deZoH`q zk;Um^kt}JPByV$Cu*!o?Bt^-+3cc~xr{ZFnl!OO46Ij0#1TQ6LmMJ&Pf!agx>|DoE);<%wXMG)|Yrc?~HINOZxG zfh*z~RaZq6LS7=YBn{HqI~DIvH}R#&y|bhuOSbZBez8nFk-6nrkt~Iuu1<^ig60`v zB8>tl>FKG+MUpPlMDXGi#k3cKvmh0DRN>poIwtcZ5a;mQq~NJw=V?~J{V7PgiIy?1 z#6qkpF6y(a^v`l=Q630S)ZVfv&aRNS3zK_iV#!%1^0;ETDB|-xDQI3)XRrdhtWH;N z&q|RmbDF@aF+E+x$V$!QJUQn{!7q|*734XKGgrXvbSiv=R=qk*-inHnlA}{<^R6Ek z+=ZLxg0Urv{3c0Q=d7UVhA-zKkDxlNfL~h)TpoxlgIYj23l6`R!YnS&p>pYIv5ON;X@v=dy$h&E)YFw z%qUkLj@l~4(yBp5W{5V{Y#E_CsGn|;n;Bw*h_lUUTt1>%-u9pD1I?^K;mUCND0+(v ztsbRVy#}M$O<%?T-}3#&OL(WhmCG2hEg~P zbv1Zmoi4UfG>DeB1=Y6fKA$IbTs4qV`UuBGHNoX@^#@`mL`A~px&`bE9z+dHmTo6P zmC+_<41*V_ySmysY8KnT;wJtkA5p&a&`NWL%BQm>4`G603sv0%R&mu}j_g5$HGND= zvsGM>!)ku^a1nn{tgRbIQNO`8Kd?Uo*ummq2GqOVB4`AKY?FrDnQh6Z1>er+HKbX# zdeqY;^^B%jKp*3X9w(1OgiQ+sHftCWLQmj~_Z(Z)%jFN*rZdd2+eFl`B(rUU|uDtlZRL%ZM{5QBqcYUmE1MzO*$iqXLZLtSiP z(G|v5U~ktcgVP>N5;Ok^Y@P%&T;M2CiwFb&00000 z{{{d;LjnMGW$eA%kK9U{Cl0)S)v^5MUm++w`tP{+b+qP>aTcd>`U@Q6 zoaDbq3CW9J{2q?uNnA_`d>#s(kOUVg#xa@V45z>NGyID`jU(7EifM$4X)^rvRf|g?P|X)w?KBi-))rDXtUkgD`m9- zZskxdSK4k=ZujdwbXIn&5{~SE>uRL!hr9h|G}M&UN?UIB+NOlfownU+163QYY-I<> z*UARi?~NT*VQ8#|im@E5*1P>+S&p{$(%uh;$dkXqd@_eQz3we4~+RH6A&-K~|ua=SFt?WWwTr9ITv_6GXy z3{6uM(0jev4c4~0QFn&A+iyW|ZND6-dwadoR{PapKN@J|#xRt1Ia2Jwa;0q7VA$o_ z-fy;>O*v3k+Gq#@4YtaDGt~ClR?!9gb!8me1ux!VkOJJlHORb{td@5+5? z+uQwr{8!(X@5}e)-|X`D-u!$z&HmsI;ew2Q|5raJhhmZMRO~|+^E-8=olIg`?{+>d z)+1Z*_8;%^6~#Y%)zUh|F+Y*&-PXGui?;lPqxG5XBkf1pepGLM(%`Y;*8d+P`dMyY zDBsO=)^`jC^VebW*D0S7&whX83krPRk?(@QtPfB>IL8`@T=!AB*0JNK;(S5kdp}yv zw+ZVK^!xwh=ieMk`OSAKZx3DSUUy&H=}q0SEZ^;XTFOVZ-tB)!8Q+(;hp)TCcKIRe z_u@Zf@uu$e_Os%BEX}8~m5LP^t0T)P#(AT=Uacb_D69(uh8Fg`HcP# z9QXwbJruS4_{iI1b@|PGpdZZf_U@bVQ60;VNq)-YaogOpe*3NVe)|pj<)1F^=+LQ^ z@B>!Ro{IwWq_^GsxxD#`*b~*p~)8%ZhBH+h_`{4lAB56#YkhPhh#{T!-xk z4gTqw#POGG*F0gx+q+idzd&M}Q#Aeror(<4oUv`;x1S2EJ(;ktpGML%ttDue-Sgbz zdK?nbi$NQ8+x`9-jQnKooass|dSN1|^&<%(rghP2G@dnIvn&!j(r;b&`pvieSY9ja z)mc|U&k*;-Y${KmqDD*B7-Av2Ev{a?MyKPp*pRu#PlYR>!uY+eEHzM%?V!e)&=Xnd zf@}SODj6(y)@0g@)M>QkcDHA>gjS1Zd5&ddsf#X}3{n`C?Fi69e0I_j`vS|J0%4(f zA+P&V8}-9jv_yxwb(bjAn;wN!nz*@9*Hq_ynv9z$JoQ6j$M+3IJTiV z!I;FJ?zss`3>RadLNJMROhV$vejGz@AZ>euKrez}KX3_UhW(g8vxtOt7&#=2#}RR( z7<(l24aakI&yNGo5A=ux5zq*O(1@UV90rzc1*UDgj_=!J-ws13aDyleV;e}tl4)mB9aTsDp51}S@jR*t?{ZNm5&kH~>;zeL)oPhPA z1uzPHCyt`Pz(J&kK|pLAk}!+{2Mz>42%O;%Hyp$5QcNPSF%Bc&cgC^jLpPui``GXU zd#pPS#xBT|fB{^OfZMEyvM{3v==h;!gD`POT|zqrJ_+40fgJ);CLnbHu>ka=AV~Ds zbpsM49(bHk(?tmlCc`%%jzXW{$n(uGqV$2QKXwVk42C%KLBa$Y>)_#lcyz+dk7C_` z9zld72&DkWy6;3j$l($2OdL@r*pEUTZY|x|_HYDZKqLSK2rFm=hePP*da)OPkppl` z2*Di07=}F<3~x}CuO}U8k@T7>JS;Or5oV%IQCt`bOYBI zLo^s;O9u=19*)5`jvrfz9q9!80j$7DG}6H}UK@AWQ-E&9+K?Pz5m>3oqB80OtfWGLDfA#ZQ9OW;slOQW5`Ep9K1u5o1Slk8k z%J$9VI(71ySLIbSb7%3*VnS9GnHH0I6v4?GfmJM$xRbo9@;SkiB%M?QJ4FHURXLS6 zO=dSFj)N*7lSzc9m7kI= zo)pEk6TC{uG|RlCNQzmOMCsJIt{@IcJfC{6!MzEvx(%08JoVDhPaON@tV;9g%r6!Yf(4v7>2(es ztRN0j61P|<+7qGO#BRlO5-G{rqOLhDmdq(3{GWG^tQC;VfE5W62Bsuo6qCxWqF%;z|Dy*$|GfOOU;TWsNEgRqW+r^*ZnT)#^TjNgEEeO%!iG9)k&KUxtlX)qlKWnZ zIsMQN+tbB@cyLMt?~X2V=nemY3qICBL@r!>q!KUEysnKvfQ7qo7KBoHSi)of0%+0y z@dxb5yYE1^4trBdt=@9(kH&=qpCB426;6Q|UK`GFU$-RZB zKJ)jQIKex$@d79GSW2~{4U)PmIW!GwYIdH_4#cOvGo{R(#pFmk0onYNT0A+Lt(MDQ z;ArC3l0+cl{9rxrpms*3pSaGV0FyYig#+mEpu~3MQO;>Wbx0TRb7#8#1nOq7Su2?N zi-YRG7k-56UbCZh{Y73JI0dvzEf5&PrVdyfDr)mB?(I~|3B;z0IK2<7xfRSJstugB zwU-wOq5ltMevF(cwGdVRo*u--lq~ESbjt3%GQ0Qmcu`DZYKm!buc>{YU0Wq94i*Qp zvx7|8(WTHUq!x^h!lkve&iqKkqpi~D5VJsWo@JmqIK#wv;f$$NaO-CuxYSmNfKdiv zJExuJ`C@ERA~6kB_vlzZbr*-Ar37bs9r$T<@8iY2#{zt>3=o5#nfG3tqyO-afB8TE z4-ERfzqsT6{a^jz|84)y?SJ_QV)#G)tssVzDJH+b(@8c(%0MaCL(LeLLsi?C+HyTq z2m8TrsV(>AN?Q$;&0aCeokmf_oucel(0X6mLql8b_l9lk*Q?!5fg>wrWvq<-RxS6V zSG4{Kaw%P9#RoM&%!+p6n zG-bOk2ZQZO8SX%w^>Vw1R(7dvmZi2*%2Hh`%FfV+tF^XVjudFCLU(mHFgDBedbv~f z8buP<8^ais`@O1Zl%TQN4S~90D?@c_FV~y>a=9)y+of6#mGw^BY?Ps~8|}*ddT%S* zaIG1t4Hnodn{ug)zyzz+W}xmAZCNU+R*pb&L)mRt#&A%shP%~L+3uI?{Zd=O$5PQW zWw%;`RTPEVVlY(8^>R7fgTXiJ?Rs6RU@S1Sx*2Si3MjY%YYdFtezRQJsX_T_vQQYefc%Z z<1pfTyyH_u<8gTCD?p=f!*ad~s5&&V?7tpDb>I1Gu`%1N0iN%S)qPYx0}Xu&FIta^ z_DPlX7{x~n^C$@Tos{{svH3nQ9wMzDHh$c`--?iZ%*?&tu)oq-51Kt-WIo#9k*?Om zoyUUg%XX_J{Yc5j!_|GX_JIHo_r9g^15oi@dGje8^El%16%f+5Av<4%Kpi-jZ-0F} z@u3)B3wlxHsQeCK>1WDk*nJ8%mXEgmMCJ0aR*!ak#9`kFCH&OdZ@+nmr@j5C)!T=S z9w}eq{N~Y}$I-iQ?fqc0e01}p^7i4;djRp{^5r0S^8uZ2WBRQsz5QtKTN>98BOPnC zT0IU8L=lEsExvIfbelY4tk5oDz+_f+H0Id<4U z94oYW=yuvsQ1?O_AYNsV$Uf!Ig`KtNBsoY0j}uYcMU*~SmL zJS$zXJa;Lfvz9tw`!W)=Q?}K3B0K|y8ZtVOh7`?WyXr}6&=uPP;`nxpZ3;;0E}Q%r z+vK0gyx0aM`)yT_TM|NAuhA4c^79_o1L06#>#;0{p0P+`WRANMIqnPz|D076B(_;j z0aBdU=rDX!5ZG21@jMb0i9cyITNIo-XBxduQ)Q(WT0XU zxN)mFK+?cQ!Vg8n>O7M9OBVg1G+;rlrqE(Uj%~B5hx#3%-QZ>MQf_x!vM98kNdGI- zI+2>_Qs|)%#}E3p1ojtqAVk% z@;nFp*i(6UCY^G;IN+X~OBW5EYjWa+0`l`+gkCWJwZvSg6C^en{#3ePpEh~%YCIAd z{u$E|L?lp5jdvJcL;z9BJV(EJR#_7)&RpMTCYI-mV?pflgQnQK>iqIoKaU(UcDyJG z?btO!9C;L;2|~C*@PgQOaU2AGEw765T8~h#KsYEY|k|<$JTA#(}S@IgpJT0V~S(N6#fCZlf?6( zCQ3k0%g0_E8KF)=Gf)aANf-q>=o=H;hCV?8<^;ZeVv{7Y#t!zd1LTMwP;d!HW8wp? z$dAD~q3Oj&lsGYkn?lznIB-K8#Bm&vAhy5@nCL!OUpL|qCvk+`z;~bl_9No!cB}^! zT#GE-k7`&A44j0tC5GJqM1BMK2;Nwz_%UHDoTtH zOaj&jEFT1LT%Ym;&l;d@;DrhFiYU10xF9_A^}xk$d4=0Fk7F|=7<7&y3c%cs zOATa@z;%7k1BZanmTOsFM8h!(V+z?u;AawG?1P3eC`w|TngN^>!jV7^oxqN$eLZj- z_{IYt!ci+BK?v?89`T(ph$G*pps|N-oy1lI{-Vk|z8?aih=S6A2aJFn7|7RwA+(?o z3R+lj?gSJ-jVJ&Mu>o9S2yiL6-nkU!^$!!@;CODp_3Aw{K!_{Qr z5Zf~ngks-Kq-0;(C(Lqr@+8k!8@rt)`@!&XYI|NtGvf`Z6MB z>Ze7X71^XHJp%ryFfRSd3l>qHk(6ZN4D37udxym|#}&xu%%;&4V<*KGwMTxPSCfes z7C6ql%&)MWR)kEdn>58y377Y2oTRy1MM+d8lf0N@)8r+-NpGf!ox3-9QM}Bj;bdun zV@c@amvOSFLVr@FWbQ7~S?m?pB%PFg_;M0gcU6Fcg_DGtZxe_!5U|R!6g;2YCSd?N zf(C_S=n~l05O4U+(gl{krJjpiSKbcIQQ!BqbsRU zvsz2*9Z*cU9s$A>4#u@Gn0hh{!RWP=);$f1yH0C+L1a^fXY+$YlI$J_r)YHDy)GcD z4-zK#SY94d6{m&mQBA?$HT`Lp9<5tTVN&eSKK8GBImJOy=N{J1YpKHUr~*ZqZHj4U zN8mX)fQ;sZ?vreB09|S2y=fLlXtt=MWmb4c?0P-}6H+Eg{S_ZAmmg%Qtrj2DbQUCE zd~j+U56x-RJpxVs?jz9Tzx-Q)Ca2Sw`~q611g-78HeByVwxJrMfxR1)ieYbzeYx4M z_ZyncI9e_D`{jVpl)|V!`{yTnmHmFT-mlj*mvOl=cItAs8}3&W;9Kvt<=$9pI~&^5 zWX8e3UT&1((l$mbbqjR&nn4o_w|i~9+YU5M(MF{*T5q)FV7=LFY(ufvdt;>m#r<%( z1s2+RHP{;i4Q!{Z%VRd`)Bl#XJ&Zm?=LUg_=SC6J@J_146kD+QGk#io0uB=a6ey(`L{#xAiQ*j>S@h}O` z`l!+U=8@xv!n+@n`+WZDCk-F5)B{g^mwd?&LehRG#>eIBZ1zRQpVjXD0sFhj|LX}t zk3T@eAFBKih;dHSF@Ey7BOf>W3_SHI?sMPp>(bR8CMdrBxW(5&r{$wC z-XoPCN%RPUd*A9SVbph-pI_7T3(_1~eGJGw0?<9o{Cq(EBYi)UzxT~2j=X!U)o0`7 z+spfI_ilYOYQB!-7m?UUP5&W2`S!1oVf*cT9+WqSHjl-9jX=^Nl`4s6C!*6jeq=+n+36{2 z$~~t26G?QsdYJz~+)3fd~;ap?}h&ks)p>xh~mtq43 z5dtGWd7&u3dCp3bKw;AscOqY%41^{^C;hfGI}uSA$xMThMNML5No3ojX5)G1>XkI4 zDS0jQlOM^9(UO}d4WZBdj2D_hSL9k9k!zmFO(b?v6GfuTHbgKScdm%gMQo$q3+`mV zcAxco4dyxDl=~7d$|s0zbh<6^M3gzT(`=byR|Y2Rr6!7vR)>Ak=Uam8c6g>EN*u?q zve;oy6<%Q4ohy-L&n`|xzKeJ+VTA^d#sbq2_@3NlPn){LJ>?pMj(qtKTS8Cx>1l`W z$V1fZUNrf^c}LVhy@AjkApTbjCwGzZ1j*_X<{znw&{WWgXsIG%UNb7sFkH7G3Ov(4 z8OR+4_2ibow^6GtH&yvL)9N!U!$^$OmV`#*xp;yYsoO?PiBTjTJ$)95NNS$4Jm`g* zO~lA-k9po#8f}G>#O|;svscIl@*I!2=2f?K{(@=$Lq-xLnQI|dZNng*ZHv$Ne!Ibf zC;66G@I2o>=OhPlJi|WYM8q;}S7m#)B3_`jcs4_bZ#M)+5SvQ3amp~~=Uo-?65>Rm zch-QT9Z}$T-fyt2w!k3%ghxnZr5^X>Ip0orx!Gxf@py)3P9&!BjO(z1$2K?!trlXK zZVS|4)q!xu@@?sa<5cBb7`M2tAT#`vf!3A82K$U<8|RXAe$~7{mk<&BDbKQOyWf6;cwN{VsaZNZVba|m6f`1u_ zf8IeXA}?C4Zck{p5ICYK2%MnwICTC?dQa>VH;ED*>(Mwe9osNs$BKv-g=Rs zvoXdA1qg$LL^uj?x5=@c^{u0xT66|{}POxspQ4-pL zL30)3C{Faya{~|Clm`wB=o#6%Zy2Egtpb<0VO@`FEGmwS*o3w?(tSIE3Jl_!?${0~ ztV2S>jRQX#8>SWOK{N)IJ_ZT~p;?p|he_nw;W!NJI)^e&B2X|UPUJ+c9RLA8v=bae zo=1@*J;pTUETO5Du}xeLJCWtPVT5aZHT1?Lj3XR|H2EkFeb=x9+XyV(_Gtno&3VId z404BKgTkCqOrbCW5;+t^3&Ai1)BI2Z_VM(9B7oR*L(2p)sZjd4Us{w(AB#UII#WL1rt-0$sR|J?YjYXO+Su(3``v_@;wVj;~Mq?TM$YbJ0Kh|h;==Ruse>O zB=!Olg%o!Su@AiGDgp;%4+j+MwJd{TtpV{Yh#W7{gTV2z>m^|M$V|XyI7t#e z0>6Nok?+!6MC>`(vYjz_bga7$g(<0{K=jb?!-&qlf<0UuBsg}$PhbHvm8kh#xgX2l$dS>8)T5u8=I!F@P zpoC3zvayd%gW{KPF2n=`1Cxc|0tk5rybut>iwzstMq!{kfv;o7cVb_+BX^8V>|n>C zDW!Ers$PqG$l7&dZwxBvwiQ9QI5LgU3n7^8h+>Y@Aj}rQJg9;yuiT76Ph{f8>BKWD zaE@tsewh0qR3&aSdzmkaEDxgF8yr_)tZI_yRetN6*LFJ1%WRCTJe;{CS$LV31f>xb zfp-nmqN?)3!p@7z#o_gg&VqR6LTg7p8H=jqVo9R5eHlt}Y@xrRg;r#M5dr2l?e1|8=Bnv7x znM@~BoL6y`r?~QQ4yLZ+G%k|cYIX}Dl%#l>L$4}~DvFlk*)`}g!C9K;ArO!jawWSE>q)I2VS(Ta~xSh=tuekOd zP^nr(^Mc$}X_19in%m~JUtBLKH0Ea}UZg=4jq}nCZ(=e{CTUz17#A)ns;VH9stS!+ zgkMG&3{zy;O;M2~zws*^WqF=Q6p1apJk2Ixr98=_CWd6q4l z_*D_bL2A#!X#pk(r_;QekZd}yV$eFt;+dB@)A_`n%@R`OB=`K+({Pcb>2(snyqhFo zM*n4{hqzcRlkn~)xSo(zoR_{gi*fGG2^>$s@5=-PkK^k(rU~;eV}Io=C^9~dk^s~s zxnI!~^dx$jxE1lz!Yy9jf~xT}i09YivZ#`fUREoJWKb73qQdjC3c(EUTarSU&!%n`dPQ1*oN=6ZuVz&d6_rmW z)3CznZ4pf4-~rh9N55HvjsM$^zmWMjt1+i>jb^0NS!OL#zlLgRR3@wcqW3sTIGY?G z8M2t#K3*iDo4?Nuq+9si_AEZYIz^pS20NBxAKFlOW=fmR>gG{Mk(Fo$ErWbvg%nAv z5m1K$K3Psb4>@sBI6uHL!D60J^0OI5f@%cFTO0sS3Om)vk5ep;Se`er^8Yrm;zh#=srts0YBN3gU#zsA(i5orDrYjvGXp`?;zCy zfrM5u{N*&a(YZfL?jf*RrhEY>56&0Hm^Sx7^BKq-*SU67!$oS|C#%lhgJw12TO4t) zBRop#fT1{O5X7~~{F=`(D{)~>94gLi;S=aFPm+V93t(f?UIl35LC5LAo!$(3=5uRd zA8}D?RvII-U{Mr{WbQ4zG@9fDB!r);qfkI~k!1v^)}|_s@Mcnb1=t$oK8-a!7-4#E zv4nP+(!|5*(Kf{*oFAa+MM8~zkb_#osr8>YIdqx9?Mi&e%>_4t90@)qSAzI89SBB> z5Y|E*bqi`_l3E5%`QtehOvqy9P>PHBJ(>tVwMP)$u4690$LMFYuM<#AllFcDWlX!D zqKy9s^S6L9Lc2-)3j#MxIimTG%62(WRc*i1maFa1*q2MK+%JuCSE`z}QOljC?d;9I zq}hCHMJw&$K%>B$y$2P_%3!cuE%)li*cx3MYgwcbHXb!ZG%!?Ij$-sL{7 zx69RLv!{5SrmXhcRk`19Hrt)53|Ghe$H6iGaR-f7H2-nE->zw@;a*vmnrf8Gfnt;! zplEE2~u@V9RsTb%IMDc^0Cy)T!ypX?lGw(nQ8`}NAFVt$xh z^r5BS)bqIXN9(r~o>K*uJK?wngIJbj^TyisOJLz zgy&J8Lkuspm_ExXMUmIo9->RiNfO`XBY zc<$;+A9NKv!hib9U;P}@N2p`hGwYcdH@4j{q-$~cFqraOJqV4!_2ENzb;HM@=R2X} zg&_{S(2q>|cy?@K6Z#%zctYEE^*D+>7^v!w7t{5m%s4P&-wkX#q`l}9)=?B-(}w`hn{(h(Z!YZk+gjLLUS7y@)g!ap>U0^RVIhlnn`hji2C%1aAG*wx7hF<@cc-mQveQ=G>%OiFcw{rEOMNHPDh5= z13fIdsu&0nS=fl_L?H0PFN;3_{<0v$B9Kuz591}PMQpYyfUJrer zu8(FUbm_3zN~k4ps0Y4J=YL?JJ;}UkhT}Z-eczo$;Us`ck~nb^S00Q{Uj=Wf6`h)K zuXBGM<&$V?h82ul<0=fR&`Ds-A5=k(^OsXMd^xQGFOToYyn3~Q(TKB1vuPCt)pWc} zFfqXxlXyXgx>ZExWQNme8qLxvDY7t&@+!|JlQ8pNJ6?6`RbEc&CDU%<)-=c_;e;-H zvE}RS^c2A6Jufmd75>^6I9FCa%8--Du%Wizv@wES($Ig$Lq< zNqD!){5+^^QUup z6Q54-Oz2zzSR^fG*oC1HiE&22I5|X`rZs;1Xoo`osSW4AIZe3utNm{hAI@ab|}=}j6% zX*I#&gSmmf|6BFkz<>6e-#RxiIX3A)sjRIVc0qYLHYYGw`ALR9D_3U1cwfe96BbBmU?(Zv3a{Z+P4|N%AQE1;zy`_jKen+G@+?T2W!>r3`l)6^3Jb7`bhC znyL)o7>vXW)gG?)%gtu9+i3%1WxV(|VboCHfZA|FIwtUgWQ~tEzK&(N#IP;rFj#Qm z%4OLBw6tt83LG*XTV(9{7V%xW;2^z)b$rYApamsmP-68;@Rn(rjz!$Daespwynh^} zEbBCI3i{tai&Ea*LB(BJ-luWXit?K~sH&Tn^$s+Lzq`ZTXZhytZCO82@#eTvG0?oD z{b<{}_bJauT%87k#3C(d_Yt~)TMSM$7$gbwKCIW4&;C)^|5YQrtaFdX*jkH#jtg-l|Hsjk1h;p=$3Apre&M@*s=}BbZyfzpjx+F z*Mgf1*M>byhdSDLY&j0>z^*+u$Clwhookqm=hllmzRaqZ)vMWLQn=n?TBg;s_~EsE zoxi$?lZ*s+(|JNBlhw_26)b*K>aVNU)0ah6O>*bjgLtV{H#b!^&;9YNn!fT1GGDk+ zZl=|^iWlYdb%OnTp508%qHHNb z|KC3f%6iK7zWDCD&G>%9q*oH_Fi&P04-R~$c!z6IhVR!hJFLBSe8NAxf0mzKL;m&Q z8p6Ug#QB|{-2R`F_t%SWj@OX?K>Ay_hCtU}khma78}5d?)poZocf+kV)JkPEpifoP z#k5wcwky?5xm@j(EnHoOyU}vJSBJ)6wAO}O6)rQQwY?f>o8@vpCvE}-8=$&1%AHClvWDB`aHs9HHPG4a=$cr@P_uXHW>9Xl-2ghQ3|m_p znz|dR@K>tq;S%VT19hpYioIOZb*41Bkd;A6*-N|JE=Rj^Q>xmkw3XdJ-7A~@dT86) zW;84}`{5d5)=;)dNl+=;VQf_49zIF!;MOr+5-YxCXN?GqWhOG>S_G(1mSu|X$D+TzC2Fl2; zXVcXEXl1NRZN0HeZ8R#k>UOl*E=z+h?X_GR_Hw%&(Phy#yWzStmWr{ocSE~WG;qac zv>nl;0j(SW8Qa*c_n@u@KNZ`74gOt@2J7WuvsAV93b=vApqstgfPjjvl_SI0Yz78I z#%MPL|Jmgpd<8Kx*bG--xIJ_ksN2=fSPk~WZ3(?siZK8iEq98xqwi_juU3PhW-KAV zmYO{@)QzT%Rx}r4wA&lojSWH$%K>!SuhyGAh&$SEH+z~huvK?pnBj6|uk3O)P{A#l zq8fvhy#`%}$`A-{cl&a^87SLw4dJ1IU$nt!zuW?M8jkz@a;QKo4oYfNrBwG@O5Sw0!Z zev%$xTKW-EsiB5P!su)WBi}J)X3$SBFo;fH#^&he*f5WS->`n+l}Vh?BS6FT zZ5<9dHu0cxTrZ*sLuj9lrD+cx$R9`He&7Nt7)jG1H;6KZu_JsyCv!|k@a_S#GU%62 zpF};H#D}3g95!`gjA5t`<3ryJY>N)^?fYT5L;QQ-@T2snckt8^9y4jKkq;V-4^}!_ zD;VFe1bBQG9DUmd-S!=4?7Fr~U$^0#L^r__psia^5dd-52rM6r?D!UZTXYK7F(@t1 zCAJ-aUFoWlwF_*^bztyp9@1P~hfY?&(ZGVCv3*EBaxA(skK@<)8qM4S#~gGQyAI%Ob5&Q;9Bus zn+NSbwTS=G{yWJ&mzVW%hYySMLEq1-c5k>(GyLAu|InoFfi8r~*CE#L30v<)dqk;6 zWVAmy@cGwEejA-nTeu(XKivFEAm08^4C|PacQlr3f6(kZ%lK${tebxyO7>^z9z}5K zxUAiJkoxH1hwgRW5%I|bhcJbFMU zUf;vzpX9oghgsVCt1QdI-0xwQ_Z~z)Oz4)!iC+3iH{Kj)fDiM$uzg2)9ckPXJ$&9B zCzt85`v)A3hk$s^>YjD^&6~I7{Umff_k7Uk?!e=q(B0v9Ex@5`P2!*`owNR?W>z!0 zd#Cb2)AGJYc`V<&ld9JC?%sf(TjlcpL5;Fbk2`j~`{rJ@ceL)Oy6^6eeCeTj>inC- zw0U_n`q3V59tic#18=-J%$px;-y9m2)c%LexVxjrj(xwmcgMZekG4A;zB|t5zpJ>< z@+;ro9Yy@+&HY0t?;_`+8SZLKpr%S^_V3>1>ea;SO8P~ebVo_mjcLU<2j|p&I-$NskClG&$;KDNdF<#t(a&4-em&r~-{Q^kllr@F z4i|>6Deqf7cogf)3CQoO9v*nqm|vvxX^Zls{fC=h89@h8-oD>GoUupE-n{vs*>{%l z(eh|k^g|ziK53hZR9}K?x!ydif7t2p%HI3hcSr6%dAROd4fSEtdCm1vGrX&O^8vN; zzP?5>DI|s1E=8k|%(5a~t(HNk(fDVQz}`t>UtoG%>$gNfkQ;DRYBdH(=>B$y1jHcr z1hI(kL}JXa9QRZH6g}-j%XY8DFs+u-e8)$ z#y<`i#PNu|Xru0_&{05*oa1?@xE zBndChJG^kkifF-)x?-z))lmiIf??Z8M?d3RAR0Rqco_`EclrL+vp>I(k%e@L<0J{$ zd>_OFh#uv&#Mqm=u}7$uZrh5rPs37AGWlTn*t)hFpWYI$viy+RiabRt4@py%>=+?Aek z{8@XDFWC{4D*P(@k(8R}~NMz1xHQKS7+U6yE$HLEz{>624l z4<)Ikc4UjLgUyalQSV>O#Ws>;2yjMt`s$QF1Fb<7(5uI{E}AENgTIhLh%QnjSpzpP z3DYi!BK;}9s`&?+s zyxfo_)L=P{(VK8G$tO*jLk?0J>_u1P8k*p6tf-)l$aI<3DK9j-Ot;PV6xDCh_wmBX z%OaH%(V(?Hmn`A@CD#YvpLNg^gs#w!d&q4|qwb2+o~Rv3Ibp7P{G|(*kj7bm)M~xb z&iVGUX7}<^5heTVXQkq|*6NAC_H(v<1s3l`=$dDrs*Ef*xZinVGA@sMGxg~=X+J(8 zmq=!Qd@6A=Cn+5`0bX$O^DCv_;9E*_BywH$*|f(zC#}J0yKVJ+>-m_wc(!aK_2m3g zV2c+gmwLpKf!}%3SgFD=>oinG4P~jvUpYTR=K{~XxGc|~oizH0e|6GqKb2qh#W&CU z_YZ$dvKP@U0(Tj2ke>LWLWrhk~+efz{$M8JY^lB$;thO z#y`J)!k(X8^ciWPt3sFUMmoxc2K!8W(i;oiX5*R2nWBvUDO^J&wCK0w|3ze%FZicS zOk1kZQGzV zWBSC<7yz zPZ!b0ia-$P4tyP_W@y?rhzN?*RK_+vZdi_M+KvuKYq2c)tP&8fpF(m>8|Z@Yx^Mfg z=Y!(oAPneg>vj}IQ5d^1kO!s4o(Tt_CZvXOUE6ZUzGu21i$x!Ka=;Q6eH2O`Q*Kcd zIk6K(rteeB=-wDw(#NZ)IIc-G8H4h+3;waGLSqmgn1eAu%CYI$9vp;SUw1vnaD7+T zfvKZY4Ri;Dri2`7So^v)3PJ}2aC93C1?;JLpg1nIi|$&c zIj-l4>!Z{v*0^?o<3R-+0e&7`CL;2Kz;QjD)>wvP0%MQ`1UC(LOa+Blu)(=w>Nfhk zn0t6ejA~33f*Ql7Pwv&vk(pFo1KQI54mE~ZJJU8PO^6O)YSqt;(I?oQ(DzM`?wA2s z+_wYpHw`sl>bq9GxC9Oy(sd-*o<8q!|6a5qPJ^Iq+X{1(^qlB zS&$@=>xBe-ABA+u37YthBbWH&gudq(8hD9klOVx%khqCW7f7J%%##qBC5f3N^fltp z38;c&aqMGSq0`0e{Q%Py`*G+Ih$2$INt(V1n=X+M2f7=9L~vGm9sxQbP$Gmb835nV zBebzj3`_#UimcGId`uUr$HX;~`s_^-gRYUE_#uIo1}Flm(3ge-eN2f(fkkW`_6Vt$ zou{jJg!QxU&<{km=~DclvKL~Lrc6f|XoaB*1cD^NbbjBBW2!V2Iw3Bt!Lg3%S|0=_ zfkOf_bR*C!p|AI*0(cl(pm3bHaLJ%^ef4!l_X*Y2aKX4{3>Gw!(57O5gm?90(6UP<~ z$23F1#hwQ?@UU;jgucp``T?Y>-%1`PFVhi;gEyrOr&Rd^gZ%Hou?27)a5{VY#4Om3qPUnK~KN{A&C+zA`m8o zE+SD24-PehhYZW0pMqmpX>7&tXyg0%XK)0Kbq9UD^gb z?v6n?IJx0;@qKLQhEHP(PDkKwVNXxuIz+*XV@zLZK@9pVt63FJHSun8d{b4EIi60c z>qT58>*A$(omSUnxtc|b{1(rvES_Z3)DH40n^a{)7P!L2>&Z*As-{^suBv5rJ)7Q= z*I6-{uV!R6pL_G=Y*7_t99m%5+0?JRS#>kNTP%_vRd29A%`1q`>ZO+@Rpn$(=1u3- z{8f?ORrAuoMUdUZRh7+VubkXYuY=dKNuC*tYFt$5%ubyuBRAFm*WQ;jIj&{rfdDv< zAd#7@%$i7oBuLEj3=kkPlU3DvuO&Sz+^<{e?r3j1yiq&CUdh)^nhS=*4lA_q!U}I> zFTAuj+Ic7c0xKNeIK1*taD;d5b5T_}GHZB)V?7akp^3>xY+i9)5u%Rw3+{AJx89BYnCZ35km6DPxJ*64Z%fL;P8?Iw(tyF z^`b?nASaxeCN3ia@}Y2vc-MtJEDVDe5jge zomtu{dxhN8_cTwpP$7E)7Cs> zg{$Z?4h`D|R|<94R-?6cA$dZIfi9-{23#yg)+$MZcouq`9ScC@l@>#)bd_+U&ciX0t& za8a0f3)xSCAY7XPGDFQy0x+jzJ1Z@=EI&}-7+S%6l&*bS(;VAKLlddCj*7R#BZO46 zjI}KA)<}$9*S}QEfR|mzL^x6c+gO8$7DVM5yu-3QJ4^V`y|5%mpc;ZWMxGX-%LqIV z#Dj2#wJOpBJ&ZvnpHF-@LCHD>O=OuNudL96lgh>13LO(<2B}@^+{$eqA|Clp?%L=g zb6q1so(H?f9x`0)jaHmQkpc&-+_zVm7s=;n?Oq_?4m2m0?I3xbto+Q6eG7pSl8uGS z)o5meG^GexY1NloD~YDWgGU&^gOT}Fn1Zc zrtPg`T>J(ESVg|J4qhXZ2N##UFa~uSD998K$lI=?y;6NhlgM;k%MLvwM<}*+#kF)t z0H?J*A50R+;Au+}WLMz(=6hy|p{u^d}S zHN&-GK#DUg-`apGW5Y@U$i1SUTsUwsScP&J1(xl*S?r_{TvXEp34y1l0_053gDVC? z5MID)AUmEK#Xc?`1fn9ym*5hv9*7r^%7E?jzyXJhQgiLvmk?nH;sP=|m_YMgi-*gG zo~|Lu%rB#OWdN_h7cv)mwD9mOTg$Q(dEqM?oZj~0%TQ0=K&-n_Xlf>;1MpqhQo$nO z{Ng?OLeZ(=4G08}<-Mug;T>-8@}3RvE#-HGRSFE8 zem&!w}OjAbcWS@dJAmJk8&h+j%gQ zgGWDQnBjXh7PXGtd#AN`kj1wWsKx`?_;>9!-i_roRPpVYh3`uW6|!AhAAj@KMAFS< zJA7=+-WS{X7UPhIe^=wZ5a!|2{^7&-hHzJPpSAYgc%Z?@Rr-nJTdDkAsuAw}e0O}Z zT^5H9KBDn&LFVK0@8`7#WB$l->EWRRA%Ax~o;y7L(No2^j^%qc{1~L~dl(S&Znzue{1t;yRJ$Fs9b@npGurGqZjn#yyMdxR_vG&3p;MOj2&IE7$!JmHYtk%TH_%G+U>dB z2Ilp5n?0ZLqwS7|zk6=nAHm|yc9iY+yA5ob?l_*|u3!zYwBccPf1h9N^Q_N|cf;*y zxKA@C=ZD#DJmfZ9iqUZ!{;I!aMkxzqcDvElC>wLT?dEDf++S_C{D>X1<7~eHdZSI= z-*59FOlI3rs%VZ;F#PorIE$jye zHlyu+zfE^6!}qzY4|{Dn4D=lBuK4|Sv>j(xLm-2j`egjJpMmgMz8PI@b{WH7!4@M> zE0=9X8N-|R3}vyU4rZDA_E#hAS;&-Xii$oDtkQ~Z`s zSq@|Pa$p;*xZh+WP#-7*LmB%l=wZkW$5{@(mSJe?W{kZj+l}~rw#~rPcKfTG*^XES z9HPI=fsOGF$nA06w%urqJ0o!z5qP!Tr3?_um@9UhZ-?X24!bN1GUKXlo6XgbAMf%J z_|}lygBxF*wJPPTn)kHxNJY#^1uo^>~o_GH)H}4Q}Fc>pAJX6 z4D8XzMFqy2T|UfG9^}F}-u-sF8$$%K+x?CKT3MElfQ{{F&uuVV5_~P)_wy|eYGIfy z1}cK;hak{q%x7B$w`v*>|8~j`{4jnPKa3y7595dN|HpV(Q0E#ubPIp+Va&>Vh}Q=o zL*l#LzI`95oAF2ktOF$G2M|&G{TXZvH{mK6N}MaeBSq0gF72zj}mz`qiCT4;u$U*6j2E}Zl|F71%E?nAxaO}&5c@?eM1152;BEQnry zq>}sN?NC2Hefm9)Ewa*U$=$T{vi#!oA6+(kO`3X2 zk;BG|(-!PeYu5TtX!>7N&F7ud3dzpRUc2_9MrCB{DfQw-@AnzHJ!q8AN{!0+ti!Z> zb+U3)s~mO1%X-DC_vjHpcaNLhO0(afi8fz97Rl1{UUNovl@a@lsP+uv2~j!e;5w?! zXCz%A`@gJIX_hPxpDepES!?&a7wi{w>m}7VJ~}D2D7tMo$uV;g^=H;;0s+9tn?N4ees#_vn z9#!cETOM#N`m|Qks26n%lOk%w>S?PcJ}ZSJO_vCdO1Wz5h&^hbo@T^J>A1$yeL-SR zI{h=Uaa3}nI#F$uD__#J2HmIoFL>@(qY_)P|5>G8ZdRy{VpF}wQNLfJ=YvtTb4n6v z!)lX9)C-zC`b*NF2x3^GNQxtR*eyG+ALkNRjN-{X}VTr&Km8fWQDHK)mo)KU`UE3 z8dQ&bK~~zwHL=PxyDyn)|Ku4}Klz7ebcf`~5jh|$jgvY}v-KL)Almd<`w25RChKj# zbzE-H?Rsm_D-9PE^{ib!J~}(2i56A6G>D^CtI1v*vBb;fwAQGdaK6|)t@KYjUAjK# zcgj>}(Jl|mWVzp=|88wi{omC}gB-BT&nU9`ygfdyg36wBYo}M$!I1iztn)NsR8_W2 z^p42VQ?mJd+$eX;V6oPq23|vubZz>yP8^kRL(m%0ZL-zU$)rihBvY_XLOf&LAJWJA#qwIPKQK|8nTQ^^z+25W`n46Plz@#r~zf-bbeH;frArtqcQH+N3aV)HCq%}>5wlw zotGGwTc=L?$3nGvArUW5&N?KWu^l$Awc8Eq6pTjeWr}<;psOiC)Y#7O=i;SByzG>k zZuxn7M)WD7JR+;aGW=QAtVWIFC(N|f;=0pHl_aU@?3AEN$G>L3825v6t=uiuIzOe_ zMDSyRbBT7Tw5CgcPRxmFzjR8Tl%_t}>+n^)}x1b+4F@=yBxGDYGvCxE^*dVDw8reZIvSF=5Ogve{o#x z4*niXcF5;#vQ=T`lNwngsUCa8c#X!qT<$!l)J652sdvuU4l%w21G3{v@S34%x?3YU zZSueM8KV631xc1p%m0gLPR@wVS(gx-$K_J_^r${)Qay$ckD8TMH_8u^m?x3$U_7)VQy<$v7hb|U>56E}!Twc4nCT^S4;?I+VpQYRZ# zhCb>MY`OouLXk($XqeJVUX04@i|QY>YeYcM!{_9tMAgqv%iw()1!2x~$(~Hn1WlX_ z)cHwNF~DrSuLeV9(jiW}ki0tdEN!*MM2DduXz2!InvwtG71^ECNxqvk8`IN2=+=H& z-o&K~;u3tOU2PmYm6z&jK@DnUru+q68~l$3v+k2+ntWm%lTl^-YEqV{`hYn40y0JC zDbxC$LA4||TmO`=5UUbF9v?TYGFv66LAg13`UeydP^A-xB3nuMY3YQTKB0S++E5mc zQo8x;ClmH5cUDWAC+u`^^0YyZ|3UL*(5&~{;+Kt5z^_i|E??;_C%?+8!}iSJyX(J0 z&IaAul1Qsom8R-Zt*z6YI(T`zc1#?f42iJQ=6+l$J@xuszTBan@=}fMwK`P2&s3gH z<95qg(>1Eq>>al&atuwPcR8!dMO(M@Pd&TI)>Ir#R&;x zb_#$B2E2%v6He3k*$f0iw5e`#blw* zrUE!9Y=`kroIc0W7x$i(BHM_fD$BeeObTP-IK{59Fp99n-G0Dl3xxvTh2-E8dV%Kx z)oC+%x}4&EIV$*+D9q)>Oj0JI1gQi5DUycs6j0~zj_?mh*jtz+s2FQrD{g(u5S_3A zC|sQtPPkaid5m4dt;zA7Jq3r2fR{o(nqptm3%Dh03VCUXa|_-N`wu=UzD*jSJDjPC zfLf?J?trZ=!K;AMVmaYdU>bW3_}&61OdWCsm{(MbD1hXG{S|{fwMB8Kds1|3>XEes5mF#c%Kw`1DCcGmkXS|bphve zLw%owRiGwA0B=B$zv{z#VMo&or7d-7F3S*%dSScSb*(jQ&*GkEk?0o%7E{LXR=GH= zsc%!LiUE7zH7dRs6o6ICuq+i92}ymMra>3rcHo6_QGoL;08n^aFccyf^0EriYZSL( zB^>bLloxQ2FNB4PQRz#yzyjhx0NE8#JGhsiYBQ~9@{Jp0%RG3nf~}+A7NIyX6(`q$U|19hsZ`#$8`eL zv^6*I({Q=6<%_`ft;EYBd3C<>BIG0Q(sE)Uw&T!8uZ%GAJ>GMXy+WE6=y9a^kq=)2 zG`BS_R*`KWCrL0#EkfrBGN%qoZO;v&U~Wzv*|aPr0kbbWAMpq&VPa`X;KZuzO;O-n z#=&`L24)zeAa|Td(oy8Z7!)HQ&k9#=q{kjw%b3E_LcuD;XdWlf(Q7+FYUpRku|X*& za?B))BIL>{S|rALjkH{Iy%0r~5r=qIPh&nw=6M3b2B(cD$>lA2lCr_9!5!Q0$)*V+BwpNwc?1L z6>W-^<96&LKzAJZ!Z)T9(1vZhC{B=ejzCCv?nlVL0LFzI+3O|7G8r~P z*@dgQxKq0G#zpEPuwC2rO?U3BBX1=mu(jf#SbL?-6VtWr45b*J34vvWrlUo!Y*;+Nsi+9+=J7>Omlo>tXv8Cj-&^X z5d{wNY~+BoIB4OrO$O&z< zK^V>ojv_f~4A%D?$K|ncA^u}oQ_wQ?O|+5|ABCX`L{o?_#W5UTUwQW0$sF5{!9sF| zFrZNN0&H8w@huCy(9_K~NI-Kf@}giZC17TEWeMWM4PDVSb6HFLg=s~ixS4J_hK6Dzc7dt2 zyH4ylS|!+#kQ+jx@;%oNTswQ6=6-x0#F`u zT?bNuqJfodDZ+94dS$By3KTogPyitlqqYA!bA7}0btkqX8CkgJb-ec7*qv#S0~b@2 zm`MN(pu`2+U@Re0?AStzr8vTLVdg<9i{4^_6ePGS)v;0J&m<#I9Nh!4z)0sPPG7;! zu^FOQD7OP7qcGCk^(#AdKxeDixNy?~- z^dmF0*YfqDFC|Da6IBueU{**X56ONmDYkNM89r{O~1naSyq z;7C@ob}eMBa>zY!owQsN*-Ix6G4s(vx2ML10T(#a_I=3GzUv`hb6xZr^2-V`nHe|` z?TPJx>3uMJpe2^+<^d$!^=h5K6~lT1E4bVTN1Q^I$YPWyGY7I$w%W|ITj;!h*)7m{ z7qw4pwe&dNAowVnb6&--6qf-ofqmoreub z|GMLI!e$M1OKHG4xIAz&Q z&T)H&oVCgs!JsK5K$dB6LI@qLa1 z?Pzbm3W)FeN{_rRdHvGi?bju7ADCNjBhK%9D_p}1QA+b$bC&OBiZ|!(_x2F( zExM+5ul>h+TC?|iz3=vW`@IzWqRL}M;t!U0|LXG2&$pI-b@M{!gEx@w6!2ePPkHn; zr^6gQ_L9-fHtAPieRcB+<-vE0)vij!)tC3a-i+&4&JK*rNBK=}&3Rvo{MK7o zH$2>)etXf)+*{mVAHROdsCcgkU)WANC8kN8l*v}PT56Pk_eGC9>P||P<3VXki=$Sh zO;V*wdDg8E-5=5QR<%}lYrV7Dpv5p`y&@6y{){-Q&{L{cJ^CH3#j4d_ld9E8n&^$G zTKB9>cNn@<{w4E*=%_@aG^&@Ve)$DK9TO5c?UXA&{^BQWi6BoZbcL!6sN;TnRQl&&RNRqCU`}Jqt<9?~!DpkvaTEDuaTNR$67?P%1eX?1tPl#7hxm4~RQ?1^Q zYUFXXRTgILKmN~u`P*^ zU8dPG)22EVYCup=tBndn5M_saLRQ*DwOgi}C&W+5d9O~-%IUx>|Ds-F^ipN@A6Tlw zP*l}#mfN*HL9pEh{{)CIHTuu!Dt%IF(ACOuz3dQAmz|$Jp=#w)X;7(6)+<6;%*qMVYAhiME1E5Gwdtn<3+8 zo(6u}EEjbeHG!Mrx}S=M3x+QB;sLR2D60PU@g~fh@VH*5rgAuIDT=7bs=}$oV)afXg*=z3B9vv^vf77v+J z{LHv``htsg;tGklT;USeaGg#j3rU!Bs$ys=50mi&N*xQL$g-+R(rl*TXRi1$u|83X zM<>dJhdI(xR5@HF6c-1T4Q;X1f%ZhuRdqgH$|9UwDhqw8XbW*F7LRN+T~YCaR8>}Z ziB}fNQc*aGlNEI-15YaaS!h!YegJ-*UJp2N=#I-tgjT1C1wyxqQE}D)+POzuAc$w`W-$*3I^>Y*; zS3m)N{-DIJ=-4PRG*fq6KDPB}zRDF5;XBWPZXw0wP1!+OEbErxEs$#YE5op1f{Sz| zkdR=R$W$%I*HvU`9>V3iL^rUsz*)KoA;E}3&u|@CPc_wFx@N36=Nc>m3tF;?5;wQj zf~BF5H@(0(_nlaUuUamdmzokHpE^g#<=>{zL3 z`5})>B4!aoxHBACu^lV1>_}5CI1u_A z*{P|90&oyHf$t`_ZvWwoe6Q2`)$A<&KmX*=w&|9$pHJ?r52#l3*r zHxCa~tohI#f^R;G&%zIiTwRYlpDgWLHE-VE)|)-P^#d7PEW!sh_BkKp58NjDw0mOL zAJy?^(ZBjn*NyD|{U85f@_zxOka{Y3<^TX6iwFb&00000{{{d;LjnN!TkO4Cj4R!q z*tP0jzPrlqZujoq7u#jm{a)oN-@Dx2yZxQ>o$t(<*)x+lWcWstnNbeOOwO4}LITPP zZ8^abFeFHki1GpwAqXJ>LP7!wA*6tq7sLY(NFW}Oc;c0}!+(|gVt2du-e+JGfxgvy zx9hUjfBkQ3b(iaM9Ao=z$ z_@0+~$uNNLyXL1s=qHiyd%@6;{pj02^1uD5=lXCVirm=uzx9WM1hrS2_PV*2rR73V zAW=~kt3|e1Ei*}0*0Q!xvTfFuH(PllE4Nxl zZnf8o&8@uXEVu17++43W%}%?sT5aTZM^-i<x7OmS>TW&YyrM%dHF4C>GYJtx3x+5>z+h+52)mkX+?Lu3xI@+SSS+!T% zcHL^p9dPBQrES3>+uJqhCxHpzCUA_rR+hK78z}>)wHKRCbJ>)dn}xJd7R_7ezgjAr zY_({vZg1sg1{!ph?Zv9I(l*=dcDvZNl;+|Vu0cO}vsm708EDp#*Q@Pv38A{ZZMW8& z)@`%Xgh|`rw^r6(bg~RQw%x9l%Z+rq0k275eS6tlYfGsK^R$-`kCoh%xo#OQ6iEi21x0a|Uh8pN!XDd5`WMr$f7WxdVhO>4E?WKz}y0~JUFFnzgM$YhF5 z8{!X>~Q}dwnE?*8?ZciI-8^+_f zdjr*b5oEY-?z`xj4|4JQC;Gko`>WPtC!-Hvfv!Gudz{$VP4`7vr@eS`CqR3C+aQMQ zHS1uM@z_0A>E3U9T^?L*?p=DiuAcdsbT;mNd3?DZszLnHKk)Lt+UkL_pPKkl+zxnvh$D3~++TP*rG~0i@ zf$!wt<2T3J_06+O&pJNu^0Z~2?eX%^?E2|UN9N1Ec`$0fT^~&T@tY%Eo@w{-@Ycs~ zu0KAtID0CbbRd4*6Melu;Bd;1&*mf-NI0^mx;~D*+0B++f4n>W_;~Z?o9pAzyVoT< z62^z&yL&eeQ+_uxF z=KGjE2+AI$-lg*wW!;ha4o`2M-@Z9mUdO_FcW}LTzTfFV(Bs9A&)o6M&$$Qhefe4A z?!0yw`RwWOF)=T$=j=eICqqdvb_dzf+j|2^s^{tcT($kQ$zyz`{r_s>f6Glb*&=7?Lgln@{)RhYYDg#-FBO_E z*G88bUuMtQQ>H4){CT}b)6Gl7QfEaKoe3OAAqHI{MySD!dW9*_1@YBsLk@U~IuQiK zONjA>!3U8RD1qlh#L)seW%!CvJEd6~F%{LO=yt743k{xTTdh)yE+N!sMYi533KGN5 z|Jv`00>z4_6qOCz+^fqn^IL*gV7S*pfkQlc(-7zeE1#nC;<>=rOQk};Lb28J3PUZL zmlt;BS5o%$f~vkowO5XORy#o#QJLXco~m(t`Q+_;I?P0tDk70)q+(SRJ`@;H_!jY$ zCjN89ax>xI4*vWZ%hXOKbW*!SJogq|`ll@Y8?06@Qq`97nx=b}aNa7F_%~%>B$iX8if<50g^Eg+hfcuKqw!5K8NP^oxYxR&Wc@0>X=Ed-`e?ogb_ zzCm|QGFh=em*@*lXq^>$udN|PRVuQl{O7|GCCH)#p=!&1gD#0BsSDGIP1K;20!OnI zjw`-GJk$F6AN|sQTS1ktr6$-YG^#&l3iY~BLUggfRoL@0wuZVFpbf(^NJPJC$nCgT zDbj@!)9lDbS#Jnpul-7ADz&1({jL(#(3`Hwvu~)<>$equ*@G^!(Sw0x#Q5s(Dfrimw?~Eudsy#jRsxfZty?`ZC{LN%%jT%hZ>Q*kYY01B+)!X7(vvFE= z1x}C~t%m+a(u{V!(yYB|6$QG$@TkejeC4E!TDB{a!6LC)Vyf%Tm?eLOD(ESvuu}<=o20l zU-5##3h&OiB1=II#rY08Bq-0n2F0@I*S?S$281-f67(FJ`{t6qF7 zzokXGSVM1Xs8VH+Y*Mtuo!6TMmTFe0jG?6O(~Y!cluHFc?243lbH*aE40%l!GRxhR z&v=pTv2QP#mR&BiUbDO)QH7pRY@L?6fAE&$i;Z+%k}o=G=__6sIL)HKKw2VHhiEfz zOXX5cst9ydEM3Y@qe?SZfAc^1`EN07lVw`;8|tLcVa_SGh+Y-w$q$&bZuvEm+UJaO zd0H=1=r0Pe<;jh<5Q5Ks{nv|a^r})WH~(ZIGGBeKRE0EDPaX=)$`ajW~f}OU%i?TtMX- zqR$0Xc#D{y{OrfR=Q;5A{$U%QsT|ib0w0b;U4vV`AHuN*-~7-GJTGuU-wu4oHv``d z0}pO@L$4e9Uf1{i!0o~_kFR_1nBjS0=mm-w_@)>7j-|Ms(sjuw_;ue2LKq#oI&_EE z(1W4A-}Ow}H>~`b!za_|nj1Qf(F-g;@a?b*eFIhRS{BhH)Oti5j1EEJ(AOOgM!KG7 zKzGFm9C8tEhMpQI2ABnxh%J_@1fJ>IzSi@>GLt;AsN~VTc_5C-3fS9+G`gFc|Hru1Np6$UzSglB`DerSdvOq%x95141J_N(u?@d(nu_PSx@%i@0IHd8p!QV51(#X5DG;W4zkC~je`X2ff+^@5=iSh@W}3muxuQn9?4Y*RlbzMP_tlO z-vN^p*EZdr-!+Ll!4SyTz*8XWZFq==sfl24kZ##t&v!jjvyHyd13wtx3LSblnhE|P zNeyO@WY|4w=iYR|t+o!)u^rvF4a02!m_* z8srG<_}PLX3MuFCOYRoKB{YZ`co4 zIF5|e^ivCCHy&g|a~y`(W1LJP=zg8LF$@SiJ&m!6Qy)io>JOG5ym*#ioLDJbpW|>j z#RI(XCQ0n#VHnNQs}ThMrnT&9d&EomO z!1gudhck<2$p{h)r{E`y7%f&2wv+K98fxGm zJT!*j$VJoxKV;chNyAP$7|-I-5{ILnaWw?<2F~Eh_3$uQeh89iZotOkUt)5uz!k&>DBdk9!B0Adl2Lh57H0gnf_r+ z)(yUKzl!@9f|I6@yvy`@6x!d*@Hp`koJ0^PcjS3EorXh48{;Us!q+n^NCpW60o;R? z)d*jCiwFl{GMTyQb*lN{mFLD;>U!yH3@dH`ivwfFj4`Zv{bn`~gW(k(C1cnZV4Y`i zHW-Wt!4l%&UqwkW!%IK=5JAX(5XT?hV;F{!$C5^^9&RUvtVS62G)E$HB%P{7;jMTqlxQI7O;2Da2PkztLmZu}sdL%y1QP$?a` z?-MI>vExVBGN5mO@rT&}ToR1Qu47H(^vauJcQT6OWRzOb00&*@mqoCc1H72xWq>t% z@s)?8e(X#lUBPKGH?QVNI7%UbM^o4ef@xxT&df~vkm&pj>w7vn20#8+-IxgI%_c$NhN9~+@QatG)Se)3(bd28KYz&nr_-NhfAq5-PY&C7|70}z zbc49YyEgA2iDG}>>`!IY%g4@Y}a$CFPr|M5`$@~M9j zHNU8(pYL+ehUA-bck&pCLw{Is{v=AtT}1bqy?1QrPj2>)Pp>__kUTp$*1X9>E*)#; z?nODg`c$RIb}R}55>RkM?}htc&(e@XQ0bth?kJ9FBUn?>uee&n)?uns?`n7jpi1 zJGN;M4b9zBICR3{+2PK2-_XDG`#<@o|0#w3!r!=N{_tnN_wW7mH|PJo^$6Sk@D9NJ zU;iusTzJ@sz763rS}i-9=DN9EwA!n7d%0L-aNb^QS_^rzXephgmTlKth47J`l`O9} zn~vPhNnH2~$8ZBKY<4KFq-af9Yb%T8vb}BJLAkP&NiD6_UaZy~avWDyHiWHhgQO+gU#~QnX)SN0 z&1%uyYAb?&c0k9?db@6BT4w`OZ{BEN)xv zY{%s)9Z4aq>3VgmG?$&`dePQ4(7ma(Z=3B_t1U~4yv!7hptdb(y}7;ZY(QnD)7G-( z?WU7$7xH$!>L}VuS+5C~+gUa@Es(gqRhGB1a+}FZsnymxJ0iE)Y|3qIv28EGF&lZg z*|xMcgl4tlaa(dz+JZidrb3k3Y+%-ncDv1%AYik|w576xaoccnxdM;1q^*{%ZWnEs zOm2d>Ol~d}C6g6pxm_-{+wBrMX06t8kH^iLa1@OapV_dbVt3o6dTXgSiXBo z*|GKvdE1BgjC(jVXY%gBNnIyssIe1k8b_f(^={aqvf7?5edFL(@N7Wv6#v?#5lOL;Ups=FGn(=Yg{!XJWU}uee ze-Q@qL5R@_`f7g%;#z@fm}by9O7`B%d6+ra$=m~PpDEJcRiax(UAj_ZtohIfeS z$K!zA9yGhB$Ue1uogLhIdbHo}iO(Z5eLP~s9{zXzNIXAWJp^D6$lY(AfSwPa@g9=; zac`2`raekEmv(?A?tsjX-#op3gt)y&J|B%agdC4DpxINO-RYI0w^ZMhS z_a9Nr>;0fS)8Trj>}Pq(1EoIRX>)%Ej`NJk|A4I@cSle4Je+&a<$InyLZ;{Hf6O4} z**)-n{qdg6Js9vQD{h_#=P>+tAn(V+G53PA!{q-`8vYZ@=;<6!jvuu>3a&nM*k{YX zq#eQ2zo`3>tH&1GQ`G!W#9^>s(qM1%d0EL%5dV9(KOS_s-!_k~y2CB+p3#1O@ssW5 zSg)K7CU1NS3daj9O(7Jpbd4#96vZ%1sVGuS;e62dF{XjEJy@n9Q-spe#zb+SF24;vK_O={{Rz&zBrkpqSKu zeTgVhqDyUb-UX$EQn|%ci+o)w{nBZr$`$LB`1&j=v)`@M=NzGglk1ai68Vww44 zmU&%LHKELlKdMo+Y3a3~{VLTv`{irnb&ZC8{NG2YM57`|uS|5%0 zt6}Hc(!1i{LJM|SL?=wQSPCi*!^kB@C~~jsCw~d?r_2bw1B;p;R^0|-FInpPoRtKw z(5Fx9P4?Z#(;p&=*OdMRdr~-kKNV{4s&(qzs5L66RiSJ2zuh>yK2xb8O_~40uQV!W zAFf4;uIerNdt7)X7C5fSbt!sK{`0@bm#U{6;+WUGSfqFs{fbBze#91=KT>&~qh9kx z)Mpui73(x7el49|)?4*o`E!G+a3+b34S|L#{m|9ud2TB0j*BP)o1 z9iiX62t=(TT(*j6K5SCbMLi2VkzT$lUYxd0!&MoTmTsX&rGJq>Vb9L}LWP-998>NH z-!{>iV6kY%^TNL(T)yVt{6i#uzk4EIXzZKIS`!V#Uqx?JL1gPEm%mZ};V(55#GTaG zCarPR%G)Qa?Zy+buCXQMao zDs-b-FG*6hRPFTOW?gQbnjU z^#)?9xx@s7N=Dg+{BAt z7um5w7pS*fmH8!6EV2bAq|f+9hpRKxdDU%*wK@YXD8BtISbx%@BAi~T#TXs7UcGus z*AQC}x!0#`6*XIYbs(aPV(FA>AwhsGilQi5M5P~6RQ;?E@u;J>O+<@K6A5CafS8j4 z$e~MBDIx+ym1Af~jJNDRFJFoc)}v3nGoIp|3NsLEGOBY0hJMFU6eoZe*b2i|IJW(! zSAug?6lwIPZxls^ro?jyEsq3nCsQoGD;BG-3hZUIWzdxVioZB9u3$%bh4>m(FCeNc zi%jk8`|dYpWRE&jtuVf9oW8APG7{blAcMd6n{JV9y}mw^1*%6jA)0N;*&ibIgkdVM zFVRe;Bygo^seuxN*jF4S)_4RlmxZ!aY@e~5h>%`kDa7|G4O$?yd=;^xP;PR}o43>% z`6NaG@t5Utkw)i)BMv;J@B8lVW4na^3tTJk1K;m^madwn;;Opt`kqUWVnX`)K@M2< z2&e~7Mp{mrn!e)(JwNnq*LVCbJa=eTmwe3D3PN8a#HM2^jtf#8+wN+P?e>+v>Dsz! zTDs-hj%~tF$MZmBsFNoy0^kOrs`|d!^L>Sonoi$@(|!Pon7-~2s?ztnmeX|&-7_tX z5SfJa^h{qhdZuf6Uve6yOq-T(Ij&}Swx_y1%L9jjiD19yc%kdsrrEa%cuAfgZLQbu zs;Xj}eMfbOjcE*zGoQ$d6R(X*mWJ7FujJS z5%Sd!9Lod;dlvZ42jjcoepPc_&vG2Cr<;yun_XMC48`*di$uut6&US1JxL7>4rTBfkSXr!f=u(5Q^H@A%LD? zI0U352r2}`usyG9L4aJhZy1`^Qw*cu>zjt!Gj+=}Rn@VbpzlH=LZl#6F4*JS#C+HC zP1kX|R^PByLvbBwecdr2V#Ljmpn**eNNnJe)l*EfYmvD14BPB=`(4NCcVRNm(}`&C zm94l0$t423-P;7AVt_*f0vKDlJrE?zhAto(TmWITAUB|M*Ce2^W2v_0_=dLgc&v{297r>5+5}x?m2W-U+Gh=k#*uJB0b|g#_*=m@7CCy7fXw zcU{f0jli?PLylz=$Gf&~5GGwGZV#+J%tPR9FP~nAyPo2?p6V0g8nVT7gT8JN#lcpR z0|s#uq^L$1W81KEUC5^mT%!w%GWSMK36noT&%8sX!Fm@0ZfUwS-&L4fHFTA% zo83Af4uwqtmY?5q1ITBWTviG44gP>WhV2k0-h=$_dyZ{cCj7M^v3;)x@v&hQ*oNZg z`US9i^!!|PP)#u`v+JvnXpUhyUag70AP1bSAg95} z?0J6Xyfe&ao0e_fS*JOmtW7*e49|1fgO#L!IXdX(kh}_vo(ALGz6zSUp3!p%`5q{~ zM!f3VrV87F&DOBNbzpLRZ5KtO2AApZCBRYE>60U`qODU3Y5ywC_0vXU*5L4-NJ z3UBbhou$)}I}G110>h0ljs|l-#z8a)V-<&yi_PI|oKCKy;b>rb_5_dP5gyFO{cs4q z=dR%nXI~`|9;Pv#&7zQSf`kFZa}9^-*mdG?TEM+tUT!`K@vT#S2Wga<=BFb9E)r$#cucIplX100RgYdad?D;v9M5KNOv zJek70UZfKg)^(?G5@N%fr|Do64B*EH9^v-{@FTZLORqe%BT)(18o ze3b?s)<;7;nnr#&i*0bpb!3i%p%;&%4C6^MGY1Pi$C>X%&Txnq6U+BNOaJDpY!YBU zO(&yxirpv~yYt~>6s9KV2_p=g4UJ?L&TZd{h!)W_#65762iw4CoQ+jyJQ?5*u{%l$ zmAneC2iKN^!{Iy{<7_-i2 zckYk%xf_oCnK=QMjl&*6XYmk6K{OqD$s}~5i8e^ap&6%UfOX$+$j`@gG>BB}M-h%4 zE$t2L$n^R{oK9_Q!ZwK^-=~QZTZsh*SR-)1WnOu6Jeov993;LEnq0#@8xL(CA{)a} zH4`^Ut@-%MaUgl8coEoh_)R1BlXQsj^%Q?Ka3SMJ3)#A4-zm0aD)?M7zN0s-o8f3Y zaVMEEnn2*fY5ZY47+XW^+k@1aTo0mDoli^;PsVY!7$(?Vg)TO53hQ%tHHlzhT=|i0 zM3W@IQ#|ml-4Ra6rU0q(6%N$?$j7tk?0pRDKOLA_Y=ZZ(9ed+3#)B~Y8uBOWg;5x4 zUTVcjHUL`&kYC`e5Ib(Ft->lZk6jJ)B%e$sl&TG|^*g?D^OYElfTS=J%(LGYEBT!=?Z~g0B6mU>L-` zC>oAE99#|EFc}Ucf1sO? zM%asSnx?}fhJ3-P2cC^a0mRKtdQmv^0TVE+>p< zMDd=Ns8?6XG#$oQc$g#s*@K1yXEX);On7zeJ$H z`qOZ>&%_Kq-RpVVC#!d1Jf7cQh>|}<&og$f?n^y)?P=t`aGGBTrajv3CL#ekwi=G; zaTMg=@At*N|0K=+QaiGmAM$n=vSIuMXgL}73n$604L{f6PVT)=a?E`HQv_egogcP) zBOjN?5tjK6j%6A$B3mz-?ao?RD9d)M{a9Q$leTheEw4K5<#w}?G}2!o zwSd>1rLs|4%S~QeSXyX{X10+fZ6)6lY#Qciby}pjFsUxw*{)lPl5I6m?ha@sl@2zb z{uY#4Y}<=XbF<0I3u|}vg;(0Py_89b;T_N10yWxgNdm2v2b8%bwYAmiwzFNX3Ck=I z@HXqTl~&dw)qN#Jy1ga!h}#=!0RjlaEH5@%XW6=KX{*+42i(-TRXR<1n^Vk9QeSwh ztQC#a{9Ug!Py$3M1ZCb5@>^c6q`bIrMv5nQmdo2)Edw_x%??-yt=(2MrL8HQg$(-M zX1B}LGA}UPY;L7n!ZUYP%67HGnK#l>%c~1-mhvXAE-bCKAc#~KUT!6Mt7ThKTNv7+ z*-;3D4$gu=EFr2(Y1Njp?OIwk*BhxRFEv@p)4U+XhBIm1TrU=oyQ@V@*=+90 z3$MSUn7?b^weQ+@?f)tlNm z+*co@>G$G}Rq=c(^y!5oSmfiShXS?1BLMq(C@}BU-xs9jqP}e8F=2N~7&{fLoI5^J z-_<-ug&uLrfz9_+W`E~F<4G6mL4zmlKH~b}1lo=>zmuUKbFkJwBGNoU0tdvPL=9dusN*Yt*CY^D~b7Wf0YPc>NSa{lw}AZ8U9P|3@PE3)A;#C;fi17ocGEK2_Ac zxnBZ^Uo!lK>)P{s`x+kJc`oDLiN@1`#|lwD%0EgH?|lHl_#_&>D_ZRkwtQD7i(IqG zaPsf4Amf)0V%zfwf*;z=Gw*!d$@omY>KEYZXJ+5uJx*PJeA4R+;M3<7e?Kw(BO04M zWny=)hl}PD?N}u4Cwn2mvU{}s<6e)KCVMGKUy}V?*2_hPpUcP|7S}T|*(WqSdTX!d z_R&ukJhpsexgkV(z8mc(zu#?c?sq8i`grnO%Khgbz7W4Y*bolyJSg#``!C#{Bgmhu zN}X$;6UyZ6Og5~tA|+A;q2%duq1Y)Q#FySu2%Xnz6@mGPP_2#%Rk+MlCcnKxOqDOu z&XQpxfuggM%SJ^g%9Ml(C1f(?3XM3YTbNTcqSzTz6)Q#5Llv7|^HR(wyh#q#ATDpTmRKyd|_nq%oA%Tg5rcT#1R zn-mKS-Jp?(7>>}16;z@*l+j#)WB6AbcT#2$Ly0s~siPV?JEfZf-{Gi|93aM|%fE$+ zEWFB3p|W@?7Mv1QVFd<>4Vn`Qj3nr1LXk!iGkI6}ra+N-3dIIX|0RQATZ|Yi zPI#U_Q7Km8DpVCTDKoElf#NCotc7Sn=oM-Oo}s9ash7?tP3mvbmt4#@*#Amq#b2&c z!yAz;B8jyq=KX2?AD`6=CvU_8Cl{NXSt9si(G-djO9{dWQ$PPev2=@3C>tRkQK;1~ zo>L`}v1C^MHM%XJw@jHT)zEp7p+7Jv;wryPqvDF5SH+^xqDp+7Zg4bcMKK~pOCl0|G_SWzh$lt9S%UyHM4Cb}Dxvf4{|Wv>G=B<7Q)LlDLu^p} zjH>>c#&tjoX22pA)jBLfBHek*(M{%<$_VK_Mn${DY2-}N1{HoIMw-MgC1uq@fdw-U#E@EXAD*)srSKUTPJtSgflB^s34gC|ax)PV}k? z#&G|TJ`*arII& zz9FBSC=}~Vm#1aE%9N!R%SfbXbCYRufB9{n&iExS)fr!=S#fY)DbiO`;nceM&!ktC zN`sT$U0h5X;O1X}by6?05Dg?l(ic&wM4yUm#X)q7u1X@sa7EN&&Q1lUEie>pY1L}O zm{Br99M3jjE29uygp^Uv%GI`rD5v_0XGPdLO4NDzlIAPaM5xd$UIxcBs@-yp;^?o- zG*zHqv!xTB)KM3i3d`}}swQGjie<45^YAP$&_%c>im1XCMN}@ZJbTJ9h)dyifriD) zBbMPx5Kh7uh6JS8YT()yAy-XbaSWAISoO)jRFQhIzLBGI(Al*DyYDK!ZnsM+ zfs&HP1Ygc6O2Vl+1l_bf-|<2{$2)ty9J@1AH&DI6wnM`*{VqWRLsQqRyrOKV+93fg z31_OCs!0IWFehVGJy3kBuM#lO)Ve#!IP4iAse^3lq)N=osDj_-GK{EuLhZqJ6>yQd(RAkINvc^5_--Mq-L@3~6X)bpaPps*i0;m!fj z*Z0ZeA2F3+mx^l}R-cfq#93ZfHM_2p*M`n3J%_GmT9!+yKkwL1l@xh337)L`W?lx` zHf$rfLs$*y2v!s9+OUWVGy+4Kgd+}oU$M-dswU zv;_kkL-8C}^?Z1?hFDmJ=a~e0wN=knG{Rc?yN_}cCJI_N=(!-g-&ZvPnChkuY8#rP z>#6~QT@B15c(3Ic1V8Wh9NTtnPjLtY>)ND@uSfnkzV7uL*KvFYf=&o{QnZ#Ni3VDN zGy8#`SM`NNBNqtn>Da^&Qr*e2cb+h9NL$-83A+l9w)nG#4|7L?S*8KKx$ZqNxn?a(~O)m_JV#N9OJ@* zacs*ALW|TCCWQc85(J+VX$FH~N$7rFe4F?+Hz5b*$%g@q9J_W1gA67ZWN8??Hv&j5 zSj5@8n%gRbo+OCt_w!=HzHOPhw_5_BCn^3MxMTr^4guobyV(NUQAssp(9F*f=1_;B zw%hIbI|7exy?AmR8VYn;2uK8Wqr$|t9RGIL_q-?iO{wKY#tHU|TbGK{f zj5DmYz*32&dR~i}>=$OxBU=@$OxH6^LbnDsgxSgk<~0pMLT>kM$5RN2JdUR6*cguo z!_-Vt1IN*9fbl3v23Nz>ANs){iYJp%=*_WC*kUKf&TugdW>Z+$ldG{a&8+JfM?()s z35IW}7feFu8JuT{>yL4kCTTPrxmRg2_MB*(#_xSESq1)dNiv0L!}sxQ>SJtO z`@t+6`>CIfA&kRd9OHTH4PlC;7k9%EHq*gk5(o2;)Y45BAkF8$1&&#Z6)YY-=s z$+U-kFLPITf(LPIdO`9bBx(%?HyDq{(FhMB{58IUxp9z=a57cq2@c}vjhl|u;Dha8 zf1W0!6mXI*Cga#2CpfYOb8KMW=wlrxuz#6p8U_B$!R{m(WB5LW*bS@<!Q+MhQt~?ul6ksPD%u^>F4+g$B!9&Y^KTYw(`4HioYkx4qgDE7{VwlFs$P1F}ALP_x_yJh=#;kMmWP>8YW3Nn~nXOxjnuL5PnZu z3`W`zkMVsA2BcW8tLs6Eao2?IgCq{dQ)52!)5Od?>@GB|1I`SGF=TxJ>vuTCb_m+V zL2_-UA=bdrb3D||Nj4e;sgc6(I15s)Hwxejeu~T;hm=YlPp7&)P24ed=3W{H-sC+* za*&P#41NluiQ`6Qka%G17>1KY?>eI-7}?ffVy5HNO7N7F3eSSCyzz1bR*j4)7>!MT zvPx(3IKY`{hga?utjEL|`ZH|0Dkf#GXIRBbFc^i=((Xa9todLbkG&6ZoV-sHxIexb zj+c|gXc5d8!%6lYV`DYI=D^Qz>Oo{i2{sbK_NQ=!XM;4s;Vc|t({z_w8o-vNn#p)R zhU5rBtZLpk!*P;^=_GcNVbu3WBWrXGKLHZcy9oy)NOZ`7D~Q}Ef?t^CQ)?KJ%?P#@ z9I79J`7lb|C`$EN;NfXRKF2Xgk~q5ZVfr|jjK;~(PRL>pUELkSrj$hU3^q6oR(^sf zh6TYTKb`Y1599vz06W1|cpXp1+0@q)yhk7Z7mb`g{y!?eNOfdV3s?QqRS*4a8y~A= z`{Ys%?hSVpc@K%ymzmS&+~y-&=-k)RweG;*ocN2M;eE-&x4ULMhX~Ed(@yv8f$<#a zFLn7;5$Mmh&-Bl&`4lN>f8t&~{IexxpJLO){e%8p2=;K?y=V>hG4ry+{@-Z5Bd&dFO!`^q{b@^HJUQAvgM|M-YI#mP8u0nz z>!0-RAj-4CKSCV;H%Ex$|K-nuIEG(uqi+ZCFeJorbKPt$TJ7bII9|$HwrsC5Qa<^P zIBspV^lFFQ?m9#-gcIq<)S5Powc%VE!%`Qme#FxQ(1SK z%~lKkxHEEr-Zf|8p?npA|p>2|x=w#d+&I9@EEYg5bQ?Dlrs$xA4& z@(Rk^TT&mn-ClvE8@bt0I!mcTiXZ3L@j?CM+ZDl#7jlyz;48T)OWH!}vC!9Y;G zO$sQlRxpedP~OqU%U0G@mdfUql-wrpv9?lfVY7A%&VS2pk8xbqJokAx+CRtEJRzu9gd;$f|S48pAk6USxzd)|BOa@#KvL z`Mg+dI;42=9d_Jozx!uH$9>nnYu~l++IQ{Gu)SD3dDjlP!oBLUPieTP%;~|Mr$nUj z2sfI~CVA41mNmYU@}i=jl((nYeS5@v4`IOrR8ZfaP~X!)-|xFuhxnkZ?4Br7HTruq z8NpL<^-0a+C&x$l(l6wndq=Jr$0gni)}PL+-`DRwob?aL)KwI_0b^K5>`^D%y+{oqM6*pF&Pk4|n·sy&-g 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

dA&_d>>8hSaedwQxZFZGV+4hdz=x} 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 z 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


1Az5rmk0xOk{Fh(Ko*+t4QZ`B@pik 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
  • oW#n)cq$!_F?N$ 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