]> git.donarmstrong.com Git - bamtools.git/blobdiff - src/api/internal/bam/BamMultiReader_p.cpp
Minor version bump - 2.3.0
[bamtools.git] / src / api / internal / bam / BamMultiReader_p.cpp
index e20e3e39de4dab17480c2e108f9a21db539e4462..310d8371241f4650fcb95c66e1977bcc2625ef25 100644 (file)
@@ -2,7 +2,7 @@
 // BamMultiReader_p.cpp (c) 2010 Derek Barnett, Erik Garrison
 // Marth Lab, Department of Biology, Boston College
 // ---------------------------------------------------------------------------
-// Last modified: 14 January 2013 (DB)
+// Last modified: 24 July 2013 (DB)
 // ---------------------------------------------------------------------------
 // Functionality for simultaneously reading multiple BAM files
 // *************************************************************************
@@ -184,7 +184,7 @@ IMultiMerger* BamMultiReaderPrivate::CreateAlignmentCache(void) {
             m_mergeOrder = BamMultiReader::MergeByCoordinate;
 
         // if BAM files are sorted by read name
-        if ( header.SortOrder == Constants::SAM_HD_SORTORDER_QUERYNAME )
+        else if ( header.SortOrder == Constants::SAM_HD_SORTORDER_QUERYNAME )
             m_mergeOrder = BamMultiReader::MergeByName;
 
         // otherwise, sorting is either "unknown" or marked as "unsorted"
@@ -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 {