// Marth Lab, Department of Biology, Boston College\r
// All rights reserved.\r
// ---------------------------------------------------------------------------\r
-// Last modified: 23 December 2010 (DB)\r
+// Last modified: 17 January 2011 (DB)\r
// ---------------------------------------------------------------------------\r
// Functionality for simultaneously reading multiple BAM files\r
// ***************************************************************************\r
bool HasOpenReaders(void);\r
// set sort order for merging BAM files (i.e. which alignment from the files is 'next'?)\r
// default behavior is to sort by position, use this method to handle BAMs sorted by read name\r
- enum SortOrder { SortedByPosition = 0, SortedByReadName};\r
+ enum SortOrder { SortedByPosition = 0\r
+ , SortedByReadName\r
+ , Unsorted\r
+ };\r
void SetSortOrder(const SortOrder& order);\r
\r
// ----------------------\r
// Marth Lab, Department of Biology, Boston College
// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 19 November 2010 (DB)
+// Last modified: 17 January 2011 (DB)
// ---------------------------------------------------------------------------
// Provides merging functionality for BamMultiReader. At this point, supports
// sorting results by (refId, position) or by read name.
#include <api/BamAlignment.h>
#include <api/BamReader.h>
#include <map>
+#include <queue>
#include <string>
#include <utility>
IndexType m_data;
};
+// IBamMultiMerger implementation - unsorted BAM file(s)
+class UnsortedMultiMerger : public IBamMultiMerger {
+
+ public:
+ UnsortedMultiMerger(void) : IBamMultiMerger() { }
+ ~UnsortedMultiMerger(void) { }
+
+ public:
+ void Add(const ReaderAlignment& value);
+ void Clear(void);
+ const ReaderAlignment& First(void) const;
+ const int Size(void) const;
+ ReaderAlignment TakeFirst(void);
+
+ private:
+ typedef std::queue<ReaderAlignment> IndexType;
+ IndexType m_data;
+};
+
// ------------------------------------------
// PositionMultiMerger implementation
return next;
}
+// ------------------------------------------
+// UnsortedMultiMerger implementation
+
+inline void UnsortedMultiMerger::Add(const ReaderAlignment& value) {
+ m_data.push(value);
+}
+
+inline void UnsortedMultiMerger::Clear(void) {
+ m_data.clear();
+}
+
+inline const ReaderAlignment& UnsortedMultiMerger::First(void) const {
+ return m_data.front();
+}
+
+inline const int UnsortedMultiMerger::Size(void) const {
+ return m_data.size();
+}
+
+inline ReaderAlignment UnsortedMultiMerger::TakeFirst(void) {
+ ReaderAlignment first = m_data.front();
+ m_data.pop();
+ return first;
+}
+
} // namespace Internal
} // namespace BamTools
// Marth Lab, Department of Biology, Boston College
// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 23 December 2010 (DB)
+// Last modified: 17 January 2011 (DB)
// ---------------------------------------------------------------------------
// Functionality for simultaneously reading multiple BAM files
// *************************************************************************
BamMultiReaderPrivate::BamMultiReaderPrivate(void)
: m_alignments(0)
, m_isCoreMode(false)
- , m_isSortedByPosition(true)
+ , m_sortOrder(BamMultiReader::SortedByPosition)
{ }
// dtor
// clear out readers
m_readers.clear();
- // reset flags
+ // reset default flags
m_isCoreMode = false;
- m_isSortedByPosition = true;
+ m_sortOrder = BamMultiReader::SortedByPosition;
}
// saves index data to BAM index files (".bai"/".bti") where necessary, returns success/fail
return result;
}
+IBamMultiMerger* BamMultiReaderPrivate::CreateMergerForCurrentSortOrder(void) const {
+ switch ( m_sortOrder ) {
+ case ( BamMultiReader::SortedByPosition ) : return new PositionMultiMerger;
+ case ( BamMultiReader::SortedByReadName ) : return new ReadNameMultiMerger;
+ case ( BamMultiReader::Unsorted ) : return new UnsortedMultiMerger;
+ default : //print error
+ return 0;
+ }
+}
+
const string BamMultiReaderPrivate::ExtractReadGroup(const string& headerLine) const {
string readGroup("");
}
// create alignment cache based on sorting mode
- if ( m_isSortedByPosition )
- m_alignments = new PositionMultiMerger;
- else
- m_alignments = new ReadNameMultiMerger;
+ m_alignments = CreateMergerForCurrentSortOrder();
+ if ( m_alignments == 0 ) return false;
// iterate over filenames
vector<string>::const_iterator filenameIter = filenames.begin();
void BamMultiReaderPrivate::SaveNextAlignment(BamReader* reader, BamAlignment* alignment) {
- // must be in core mode && sorting by position to call GNACore()
- if ( m_isCoreMode && m_isSortedByPosition ) {
+ // must be in core mode && NOT sorting by read name to call GNACore()
+ if ( m_isCoreMode && m_sortOrder != BamMultiReader::SortedByReadName ) {
if ( reader->GetNextAlignmentCore(*alignment) )
m_alignments->Add( make_pair(reader, alignment) );
}
void BamMultiReaderPrivate::SetSortOrder(const BamMultiReader::SortOrder& order) {
- const BamMultiReader::SortOrder oldSortOrder = ( m_isSortedByPosition ? BamMultiReader::SortedByPosition
- : BamMultiReader::SortedByReadName ) ;
// skip if no change needed
- if ( oldSortOrder == order ) return;
+ if ( m_sortOrder == order ) return;
- // create new alignment cache
- IBamMultiMerger* newAlignmentCache(0);
- if ( order == BamMultiReader::SortedByPosition ) {
- newAlignmentCache = new PositionMultiMerger;
- m_isSortedByPosition = true;
- }
- else {
- newAlignmentCache = new ReadNameMultiMerger;
- m_isSortedByPosition = false;
- }
+ // set new sort order
+ m_sortOrder = order;
+
+ // create new alignment cache based on sort order
+ IBamMultiMerger* newAlignmentCache = CreateMergerForCurrentSortOrder();
+ if ( newAlignmentCache == 0 ) return; // print error?
// copy old cache contents to new cache
while ( m_alignments->Size() > 0 ) {
// Marth Lab, Department of Biology, Boston College
// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 23 December 2010 (DB)
+// Last modified: 17 January 2011 (DB)
// ---------------------------------------------------------------------------
// Functionality for simultaneously reading multiple BAM files
// *************************************************************************
// internal methods
private:
+ IBamMultiMerger* CreateMergerForCurrentSortOrder(void) const;
const std::string ExtractReadGroup(const std::string& headerLine) const;
bool LoadNextAlignment(BamAlignment& al, bool coreMode);
void SaveNextAlignment(BamTools::BamReader* reader, BamTools::BamAlignment* alignment);
IBamMultiMerger* m_alignments;
bool m_isCoreMode;
- bool m_isSortedByPosition;
+ BamMultiReader::SortOrder m_sortOrder;
};
-} // namesapce Internal
+} // namespace Internal
} // namespace BamTools
#endif // BAMMULTIREADER_P_H