From: derek Date: Wed, 28 Sep 2011 16:26:25 +0000 (-0400) Subject: Fix: unmapped reads now pushed to end of coordinate-sorted BAM X-Git-Url: https://git.donarmstrong.com/?p=bamtools.git;a=commitdiff_plain;h=a194fa05d2c9000eec969861f9b92dd2a7d31095 Fix: unmapped reads now pushed to end of coordinate-sorted BAM --- diff --git a/src/api/internal/BamMultiMerger_p.h b/src/api/internal/BamMultiMerger_p.h index 15ae437..b279611 100644 --- a/src/api/internal/BamMultiMerger_p.h +++ b/src/api/internal/BamMultiMerger_p.h @@ -2,7 +2,7 @@ // BamMultiMerger_p.h (c) 2010 Derek Barnett // Marth Lab, Department of Biology, Boston College // --------------------------------------------------------------------------- -// Last modified: 9 September 2011 (DB) +// Last modified: 28 September 2011 (DB) // --------------------------------------------------------------------------- // Provides merging functionality for BamMultiReader. At this point, supports // sorting results by (refId, position) or by read name. @@ -71,7 +71,24 @@ class PositionMultiMerger : public IBamMultiMerger { typedef ReaderAlignment ValueType; typedef std::pair ElementType; - typedef std::multimap ContainerType; + struct SortLessThanPosition { + bool operator() (const KeyType& lhs, const KeyType& rhs) { + + // force unmapped alignments to end + if ( lhs.first == -1 ) return false; + if ( rhs.first == -1 ) return true; + + // sort first on RefID, then by Position + if ( lhs.first != rhs.first ) + return lhs.first < rhs.first; + else + return lhs.second < rhs.second; + } + }; + + typedef SortLessThanPosition Compare; + + typedef std::multimap ContainerType; typedef ContainerType::iterator DataIterator; typedef ContainerType::const_iterator DataConstIterator; diff --git a/src/toolkit/bamtools_sort.cpp b/src/toolkit/bamtools_sort.cpp index fb181a8..ad0e4f0 100644 --- a/src/toolkit/bamtools_sort.cpp +++ b/src/toolkit/bamtools_sort.cpp @@ -2,7 +2,7 @@ // bamtools_sort.cpp (c) 2010 Derek Barnett, Erik Garrison // Marth Lab, Department of Biology, Boston College // --------------------------------------------------------------------------- -// Last modified: 14 June 2011 (DB) +// Last modified: 28 September 2011 (DB) // --------------------------------------------------------------------------- // Sorts an input BAM file // *************************************************************************** @@ -40,6 +40,12 @@ const unsigned int SORT_DEFAULT_MAX_BUFFER_MEMORY = 1024; // Mb struct SortLessThanPosition { bool operator() (const BamAlignment& lhs, const BamAlignment& rhs) { + + // force unmapped alignments to end + if ( lhs.RefID == -1 ) return false; + if ( rhs.RefID == -1 ) return true; + + // sort first on RefID, then by Position if ( lhs.RefID != rhs.RefID ) return lhs.RefID < rhs.RefID; else