From d84f6c6e6d421085bb508a1cb381476d197833b0 Mon Sep 17 00:00:00 2001 From: Ted Wong Date: Tue, 21 Nov 2017 21:05:12 +1100 Subject: [PATCH 1/2] Added a function and constant for checking supplementary BAM alignments. --- src/api/BamAlignment.cpp | 8 ++++++++ src/api/BamAlignment.h | 1 + src/api/BamConstants.h | 1 + 3 files changed, 10 insertions(+) diff --git a/src/api/BamAlignment.cpp b/src/api/BamAlignment.cpp index 8173dcf3..ce76e201 100644 --- a/src/api/BamAlignment.cpp +++ b/src/api/BamAlignment.cpp @@ -734,6 +734,14 @@ bool BamAlignment::HasTag(const std::string& tag) const return FindTag(tag, pTagData, tagDataLength, numBytesParsed); } +/*! \fn bool BamAlignment::IsSupplementary() const + \return \c true if this read is supplementary +*/ +bool BamAlignment::IsSupplementary() const +{ + return ((AlignmentFlag & Constants::BAM_ALIGNMENT_SUPPLEMENTARY) != 0); +} + /*! \fn bool BamAlignment::IsDuplicate() const \return \c true if this read is a PCR duplicate */ diff --git a/src/api/BamAlignment.h b/src/api/BamAlignment.h index 6491807f..9a12be7b 100644 --- a/src/api/BamAlignment.h +++ b/src/api/BamAlignment.h @@ -48,6 +48,7 @@ class API_EXPORT BamAlignment bool IsMateMapped() const; // returns true if alignment's mate is mapped bool IsMateReverseStrand() const; // returns true if alignment's mate mapped to reverse strand bool IsPaired() const; // returns true if alignment part of paired-end read + bool IsSupplementary() const; // returns true if this read is supplementary bool IsPrimaryAlignment() const; // returns true if reported position is primary alignment bool IsProperPair() const; // returns true if alignment is part of read that satisfied paired-end resolution diff --git a/src/api/BamConstants.h b/src/api/BamConstants.h index 973c13b1..3cea09f5 100644 --- a/src/api/BamConstants.h +++ b/src/api/BamConstants.h @@ -43,6 +43,7 @@ const int BAM_ALIGNMENT_READ_2 = 0x0080; const int BAM_ALIGNMENT_SECONDARY = 0x0100; const int BAM_ALIGNMENT_QC_FAILED = 0x0200; const int BAM_ALIGNMENT_DUPLICATE = 0x0400; +const int BAM_ALIGNMENT_SUPPLEMENTARY = 0x0800; // CIGAR constants const char* const BAM_CIGAR_LOOKUP = "MIDNSHP=X"; From adeac92ba179a960b18979cbf85b41c4ffd3be64 Mon Sep 17 00:00:00 2001 From: Ted Wong Date: Tue, 21 Nov 2017 21:17:34 +1100 Subject: [PATCH 2/2] Added functions for randomly access BAM files by pointers. --- src/api/BamReader.cpp | 20 ++++++++++++++++++++ src/api/BamReader.h | 6 ++++++ src/api/internal/bam/BamReader_p.cpp | 10 ++++++++++ src/api/internal/bam/BamReader_p.h | 3 +++ 4 files changed, 39 insertions(+) diff --git a/src/api/BamReader.cpp b/src/api/BamReader.cpp index 56e6c395..c1ce0917 100644 --- a/src/api/BamReader.cpp +++ b/src/api/BamReader.cpp @@ -306,6 +306,26 @@ bool BamReader::OpenIndex(const std::string& indexFilename) return d->OpenIndex(indexFilename); } +/*! \fn bool BamReader::GetPointer() + \brief Returns the current file pointer. + + Useful for going back to previous alignments with SetPointer(). + + \returns \c file pointer + \sa SetPointer() +*/ + +int64_t BamReader::GetPointer() const +{ + return d->GetPointer(); +} + +// set the current file pointer +void BamReader::SetPointer(int64_t i) +{ + d->SetPointer(i); +} + /*! \fn bool BamReader::Rewind() \brief Returns the internal file pointer to the first alignment record. diff --git a/src/api/BamReader.h b/src/api/BamReader.h index 1991a67f..91053e70 100644 --- a/src/api/BamReader.h +++ b/src/api/BamReader.h @@ -54,6 +54,12 @@ class API_EXPORT BamReader bool SetRegion(const int& leftRefID, const int& leftPosition, const int& rightRefID, const int& rightPosition); + // returns current file pointer + int64_t GetPointer() const; + + // set the current file pointer + void SetPointer(int64_t); + // ---------------------- // access alignment data // ---------------------- diff --git a/src/api/internal/bam/BamReader_p.cpp b/src/api/internal/bam/BamReader_p.cpp index 25ca1844..254ec1cf 100644 --- a/src/api/internal/bam/BamReader_p.cpp +++ b/src/api/internal/bam/BamReader_p.cpp @@ -423,6 +423,16 @@ bool BamReaderPrivate::OpenIndex(const std::string& indexFilename) } } +int64_t BamReaderPrivate::GetPointer() const +{ + return m_stream.Tell(); +} + +void BamReaderPrivate::SetPointer(int64_t position) +{ + m_stream.Seek(position); +} + // returns BAM file pointer to beginning of alignment data bool BamReaderPrivate::Rewind() { diff --git a/src/api/internal/bam/BamReader_p.h b/src/api/internal/bam/BamReader_p.h index fdcd8f8c..5b0e8468 100644 --- a/src/api/internal/bam/BamReader_p.h +++ b/src/api/internal/bam/BamReader_p.h @@ -54,6 +54,9 @@ class BamReaderPrivate bool GetNextAlignment(BamAlignment& alignment); bool GetNextAlignmentCore(BamAlignment& alignment); + int64_t GetPointer() const; + void SetPointer(int64_t); + // access auxiliary data std::string GetHeaderText() const; const SamHeader& GetConstSamHeader() const;