]> git.donarmstrong.com Git - bamtools.git/commitdiff
Fixed: bug where first alignments were dropped after setting explicit merge order
authorDerek Barnett <derekwbarnett@gmail.com>
Tue, 15 Jan 2013 02:08:01 +0000 (21:08 -0500)
committerDerek Barnett <derekwbarnett@gmail.com>
Tue, 15 Jan 2013 02:08:01 +0000 (21:08 -0500)
src/api/BamMultiReader.cpp
src/api/BamMultiReader.h
src/api/internal/bam/BamMultiReader_p.cpp
src/api/internal/bam/BamMultiReader_p.h

index 9e8920acdc5c4f683f045b52bbbdc481497e0b57..5c2a0657a71a8530cb59ae238718afaa688c684d 100644 (file)
@@ -368,10 +368,11 @@ bool BamMultiReader::Rewind(void) {
     nothing in the API to prevent you from doing so, but the results may be
     unexpected.
 
     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()
 */
     \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)
 }
 
 /*! \fn bool BamMultiReader::SetRegion(const BamRegion& region)
index 27745628cb0f0dabf3c819d2eb659b15aca5a33b..4f8c133fca2bf32cdc3551c7724dc554c43ed510 100644 (file)
@@ -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
         // 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
         // sets the target region of interest
         bool SetRegion(const BamRegion& region);
         // sets the target region of interest
index e20e3e39de4dab17480c2e108f9a21db539e4462..08d445d0986aedfa06d4b5939383df0fdebc739f 100644 (file)
@@ -661,21 +661,38 @@ void BamMultiReaderPrivate::SaveNextAlignment(BamReader* reader, BamAlignment* a
         m_alignmentCache->Add( MergeItem(reader, alignment) );
 }
 
         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;
 
 
     // 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<MergeItem> currentCacheData;
+    if ( m_alignmentCache ) {        
+        while ( !m_alignmentCache->IsEmpty() )
+            currentCacheData.push_back( m_alignmentCache->TakeFirst() );
         delete m_alignmentCache;
         m_alignmentCache = 0;
     }
 
         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<MergeItem>::const_iterator readerIter = currentCacheData.begin();
+    vector<MergeItem>::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 {
 }
 
 void BamMultiReaderPrivate::SetErrorString(const string& where, const string& what) const {
index c84a8cff16bb7cb81caf11d8659396cefadb3f29..3a7a0b232f4c4c69ded9c3c45426e2ff2500dd94 100644 (file)
@@ -58,7 +58,7 @@ class BamMultiReaderPrivate {
         bool GetNextAlignment(BamAlignment& al);
         bool GetNextAlignmentCore(BamAlignment& al);
         bool HasOpenReaders(void);
         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;
 
         // access auxiliary data
         SamHeader GetHeader(void) const;