From 3fe66b92028b60629826d827ee9058405fa7e4be Mon Sep 17 00:00:00 2001 From: Derek Barnett Date: Mon, 14 Jan 2013 21:08:01 -0500 Subject: [PATCH] Fixed: bug where first alignments were dropped after setting explicit merge order --- src/api/BamMultiReader.cpp | 5 ++-- src/api/BamMultiReader.h | 2 +- src/api/internal/bam/BamMultiReader_p.cpp | 29 ++++++++++++++++++----- src/api/internal/bam/BamMultiReader_p.h | 2 +- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/api/BamMultiReader.cpp b/src/api/BamMultiReader.cpp index 9e8920a..5c2a065 100644 --- a/src/api/BamMultiReader.cpp +++ b/src/api/BamMultiReader.cpp @@ -368,10 +368,11 @@ bool BamMultiReader::Rewind(void) { nothing in the API to prevent you from doing so, but the results may be unexpected. + \returns \c true if merge order could be successfully applied \sa BamMultiReader::MergeOrder, GetMergeOrder(), GetNextAlignment(), GetNextAlignmentCore() */ -void BamMultiReader::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) { - d->SetExplicitMergeOrder(order); +bool BamMultiReader::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) { + return d->SetExplicitMergeOrder(order); } /*! \fn bool BamMultiReader::SetRegion(const BamRegion& region) diff --git a/src/api/BamMultiReader.h b/src/api/BamMultiReader.h index 2774562..4f8c133 100644 --- a/src/api/BamMultiReader.h +++ b/src/api/BamMultiReader.h @@ -64,7 +64,7 @@ class API_EXPORT BamMultiReader { // returns file pointers to beginning of alignments bool Rewind(void); // sets an explicit merge order, regardless of the BAM files' SO header tag - void SetExplicitMergeOrder(BamMultiReader::MergeOrder order); + bool SetExplicitMergeOrder(BamMultiReader::MergeOrder order); // sets the target region of interest bool SetRegion(const BamRegion& region); // sets the target region of interest diff --git a/src/api/internal/bam/BamMultiReader_p.cpp b/src/api/internal/bam/BamMultiReader_p.cpp index e20e3e3..08d445d 100644 --- a/src/api/internal/bam/BamMultiReader_p.cpp +++ b/src/api/internal/bam/BamMultiReader_p.cpp @@ -661,21 +661,38 @@ void BamMultiReaderPrivate::SaveNextAlignment(BamReader* reader, BamAlignment* a m_alignmentCache->Add( MergeItem(reader, alignment) ); } -void BamMultiReaderPrivate::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) { +bool BamMultiReaderPrivate::SetExplicitMergeOrder(BamMultiReader::MergeOrder order) { // set new merge flags m_hasUserMergeOrder = true; m_mergeOrder = order; - // remove any existing merger - if ( m_alignmentCache ) { - m_alignmentCache->Clear(); + // remove any existing merger (storing any existing data sitting in the cache) + vector currentCacheData; + if ( m_alignmentCache ) { + while ( !m_alignmentCache->IsEmpty() ) + currentCacheData.push_back( m_alignmentCache->TakeFirst() ); delete m_alignmentCache; m_alignmentCache = 0; } - // update cache with new strategy - UpdateAlignmentCache(); + // create new cache using the new merge flags + m_alignmentCache = CreateAlignmentCache(); + if ( m_alignmentCache == 0 ) { + SetErrorString("BamMultiReader::SetExplicitMergeOrder", "requested order is unrecognized"); + return false; + } + + // push current data onto new cache + vector::const_iterator readerIter = currentCacheData.begin(); + vector::const_iterator readerEnd = currentCacheData.end(); + for ( ; readerIter != readerEnd; ++readerIter ) { + const MergeItem& item = (*readerIter); + m_alignmentCache->Add(item); + } + + // return success + return true; } void BamMultiReaderPrivate::SetErrorString(const string& where, const string& what) const { diff --git a/src/api/internal/bam/BamMultiReader_p.h b/src/api/internal/bam/BamMultiReader_p.h index c84a8cf..3a7a0b2 100644 --- a/src/api/internal/bam/BamMultiReader_p.h +++ b/src/api/internal/bam/BamMultiReader_p.h @@ -58,7 +58,7 @@ class BamMultiReaderPrivate { bool GetNextAlignment(BamAlignment& al); bool GetNextAlignmentCore(BamAlignment& al); bool HasOpenReaders(void); - void SetExplicitMergeOrder(BamMultiReader::MergeOrder order); + bool SetExplicitMergeOrder(BamMultiReader::MergeOrder order); // access auxiliary data SamHeader GetHeader(void) const; -- 2.39.2