// ***************************************************************************
// bamtools_pileup_engine.cpp (c) 2010 Derek Barnett, Erik Garrison
// Marth Lab, Department of Biology, Boston College
-// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 16 September 2010
+// Last modified: 9 March 2012 (DB)
// ---------------------------------------------------------------------------
// Provides pileup at position functionality for various tools.
// ***************************************************************************
+#include "utils/bamtools_pileup_engine.h"
+using namespace BamTools;
+
#include <iostream>
-#include "bamtools_pileup_engine.h"
using namespace std;
-using namespace BamTools;
// ---------------------------------------------
// PileupEnginePrivate implementation
void PileupEngine::PileupEnginePrivate::ClearOldData(void) {
- // remove any data that ends before CurrentPosition
+ // remove any alignments that end before our CurrentPosition
+ // N.B. - BAM positions are 0-based, half-open. GetEndPosition() returns a 1-based position,
+ // while our CurrentPosition is 0-based. For example, an alignment with 'endPosition' of
+ // 100 does not overlap a 'CurrentPosition' of 100, and should be discarded.
+
size_t i = 0;
- while ( i < CurrentAlignments.size() ) {
-
- // remove alignment if it ends before CurrentPosition
+ size_t j = 0;
+ const size_t numAlignments = CurrentAlignments.size();
+ while ( i < numAlignments ) {
+
+ // skip over alignment if its (1-based) endPosition is <= to (0-based) CurrentPosition
+ // i.e. this entry will not be saved upon vector resize
const int endPosition = CurrentAlignments[i].GetEndPosition();
- if ( endPosition < CurrentPosition )
- CurrentAlignments.erase(CurrentAlignments.begin() + i);
- else
+ if ( endPosition <= CurrentPosition ) {
++i;
+ continue;
+ }
+
+ // otherwise alignment ends after CurrentPosition
+ // move it towards vector beginning, at index j
+ if ( i != j )
+ CurrentAlignments[j] = CurrentAlignments[i];
+
+ // increment our indices
+ ++i;
+ ++j;
}
+
+ // 'squeeze' vector to size j, discarding all remaining alignments in the container
+ CurrentAlignments.resize(j);
}
void PileupEngine::PileupEnginePrivate::CreatePileupData(void) {