]> 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.
 
+    \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)
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
-        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
index e20e3e39de4dab17480c2e108f9a21db539e4462..08d445d0986aedfa06d4b5939383df0fdebc739f 100644 (file)
@@ -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<MergeItem> 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<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 {
index c84a8cff16bb7cb81caf11d8659396cefadb3f29..3a7a0b232f4c4c69ded9c3c45426e2ff2500dd94 100644 (file)
@@ -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;