X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Ftoolkit%2Fbamtools_sort.cpp;h=f4950588d95f72431906be62f96f4c682812962d;hb=2e1822c9ed231b25fd474117a01a1492d4209fa4;hp=fb181a8b7566abd8b47b0574c78a0b332a84319c;hpb=72f5b82ad353b4cc9d6f8153f1ad19cc387b9597;p=bamtools.git diff --git a/src/toolkit/bamtools_sort.cpp b/src/toolkit/bamtools_sort.cpp index fb181a8..f495058 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: 3 October 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 @@ -160,7 +166,7 @@ bool SortTool::SortToolPrivate::GenerateSortedRuns(void) { vector buffer; buffer.reserve( (size_t)(m_settings->MaxBufferCount*1.1) ); bool bufferFull = false; - + // if sorting by name, we need to generate full char data // so can't use GetNextAlignmentCore() if ( m_settings->IsSortingByName ) { @@ -267,12 +273,6 @@ bool SortTool::SortToolPrivate::MergeSortedRuns(void) { return false; } - // set sort order for merge - if ( m_settings->IsSortingByName ) - multiReader.SetSortOrder(BamMultiReader::SortedByReadName); - else - multiReader.SetSortOrder(BamMultiReader::SortedByPosition); - // open writer for our completely sorted output BAM file BamWriter mergedWriter; if ( !mergedWriter.Open(m_settings->OutputBamFilename, m_headerText, m_references) ) { @@ -287,7 +287,7 @@ bool SortTool::SortToolPrivate::MergeSortedRuns(void) { while ( multiReader.GetNextAlignmentCore(al) ) mergedWriter.SaveAlignment(al); - // close readers + // close files multiReader.Close(); mergedWriter.Close(); @@ -299,6 +299,7 @@ bool SortTool::SortToolPrivate::MergeSortedRuns(void) { remove(tempFilename.c_str()); } + // return success return true; }