// ***************************************************************************
// bamtools_sort.cpp (c) 2010 Derek Barnett, Erik Garrison
// Marth Lab, Department of Biology, Boston College
-// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 14 June 2011 (DB)
+// Last modified: 3 October 2011 (DB)
// ---------------------------------------------------------------------------
// Sorts an input BAM file
// ***************************************************************************
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
vector<BamAlignment> 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 ) {
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) ) {
while ( multiReader.GetNextAlignmentCore(al) )
mergedWriter.SaveAlignment(al);
- // close readers
+ // close files
multiReader.Close();
mergedWriter.Close();
remove(tempFilename.c_str());
}
+ // return success
return true;
}