return alignments.size() > 0;
}
-// get next alignment among all files (from specified region, if given)
+// get next alignment among all files
bool BamMultiReader::GetNextAlignment(BamAlignment& nextAlignment) {
// bail out if we are at EOF in all files, means no more alignments to process
UpdateReferenceID();
// our lowest alignment and reader will be at the front of our alignment index
- BamAlignment* lowestAlignment = alignments.begin()->second.second;
- BamReader* lowestReader = alignments.begin()->second.first;
+ BamAlignment* alignment = alignments.begin()->second.second;
+ BamReader* reader = alignments.begin()->second.first;
// now that we have the lowest alignment in the set, save it by copy to our argument
- nextAlignment = BamAlignment(*lowestAlignment);
+ nextAlignment = BamAlignment(*alignment);
// remove this alignment index entry from our alignment index
alignments.erase(alignments.begin());
// and add another entry if we can get another alignment from the reader
- if (lowestReader->GetNextAlignment(*lowestAlignment)) {
- alignments.insert(make_pair(make_pair(lowestAlignment->RefID, lowestAlignment->Position),
- make_pair(lowestReader, lowestAlignment)));
+ if (reader->GetNextAlignment(*alignment)) {
+ alignments.insert(make_pair(make_pair(alignment->RefID, alignment->Position),
+ make_pair(reader, alignment)));
} else { // do nothing
//cerr << "reached end of file " << lowestReader->GetFilename() << endl;
}
return true;
+
+}
+
+// get next alignment among all files without parsing character data from alignments
+bool BamMultiReader::GetNextAlignmentCore(BamAlignment& nextAlignment) {
+
+ // bail out if we are at EOF in all files, means no more alignments to process
+ if (!HasOpenReaders())
+ return false;
+
+ // when all alignments have stepped into a new target sequence, update our
+ // current reference sequence id
+ UpdateReferenceID();
+
+ // our lowest alignment and reader will be at the front of our alignment index
+ BamAlignment* alignment = alignments.begin()->second.second;
+ BamReader* reader = alignments.begin()->second.first;
+
+ // now that we have the lowest alignment in the set, save it by copy to our argument
+ nextAlignment = BamAlignment(*alignment);
+ //memcpy(&nextAlignment, alignment, sizeof(BamAlignment));
+
+ // remove this alignment index entry from our alignment index
+ alignments.erase(alignments.begin());
+
+ // and add another entry if we can get another alignment from the reader
+ if (reader->GetNextAlignmentCore(*alignment)) {
+ alignments.insert(make_pair(make_pair(alignment->RefID, alignment->Position),
+ make_pair(reader, alignment)));
+ } else { // do nothing
+ //cerr << "reached end of file " << lowestReader->GetFilename() << endl;
+ }
+
+ return true;
+
}
// jumps to specified region(refID, leftBound) in BAM files, returns success/fail
}
// opens BAM files
-void BamMultiReader::Open(const vector<string> filenames, bool openIndexes) {
+void BamMultiReader::Open(const vector<string> filenames, bool openIndexes, bool coreMode) {
// for filename in filenames
fileNames = filenames; // save filenames in our multireader
for (vector<string>::const_iterator it = filenames.begin(); it != filenames.end(); ++it) {
reader->Open(filename); // for merging, jumping is disallowed
}
BamAlignment* alignment = new BamAlignment;
- reader->GetNextAlignment(*alignment);
+ if (coreMode) {
+ reader->GetNextAlignmentCore(*alignment);
+ } else {
+ reader->GetNextAlignment(*alignment);
+ }
readers.push_back(make_pair(reader, alignment)); // store pointers to our readers for cleanup
alignments.insert(make_pair(make_pair(alignment->RefID, alignment->Position),
make_pair(reader, alignment)));
\r
// close BAM files\r
void Close(void);\r
+\r
+ // opens BAM files (and optional BAM index files, if provided)\r
+ // @openIndexes - triggers index opening, useful for suppressing\r
+ // error messages during merging of files in which we may not have\r
+ // indexes.\r
+ // @coreMode - setup our first alignments using GetNextAlignmentCore();\r
+ // also useful for merging\r
+ void Open(const vector<string> filenames, bool openIndexes = true, bool coreMode = false);\r
+\r
// performs random-access jump to reference, position\r
bool Jump(int refID, int position = 0);\r
- // opens BAM files (and optional BAM index files, if provided)\r
- //void Open(const vector<std::string&> filenames, const vector<std::string&> indexFilenames);\r
- void Open(const vector<string> filenames, bool openIndexes = true);\r
+\r
// returns file pointers to beginning of alignments\r
bool Rewind(void);\r
\r
\r
// retrieves next available alignment (returns success/fail) from all files\r
bool GetNextAlignment(BamAlignment&);\r
+ // retrieves next available alignment (returns success/fail) from all files\r
+ // and populates the support data with information about the alignment\r
+ // *** BUT DOES NOT PARSE CHARACTER DATA FROM THE ALIGNMENT\r
+ bool GetNextAlignmentCore(BamAlignment&);\r
// ... should this be private?\r
bool HasOpenReaders(void);\r
\r
if ( !m_settings->HasInputBamFilename ) m_settings->InputFiles.push_back(Options::StandardIn());
// opens the BAM files without checking for indexes
-// BamMultiReader reader;
-// reader.Open(m_settings->InputFiles, false);
-
- BamReader reader;
- reader.Open(m_settings->InputFiles.at(0));
+ BamMultiReader reader;
+ reader.Open(m_settings->InputFiles, false, true);
// retrieve header & reference dictionary info
std::string mergedHeader = reader.GetHeaderText();
writer.Open(m_settings->OutputFilename, mergedHeader, references);
// store alignments to output file
-// BamAlignment bAlignment;
-// while (reader.GetNextAlignment(bAlignment)) {
-// writer.SaveAlignment(bAlignment);
-// }
-
BamAlignment bAlignment;
- while (reader.GetNextAlignment(bAlignment)) {
+ while (reader.GetNextAlignmentCore(bAlignment)) {
writer.SaveAlignment(bAlignment);
}
-
+
// clean & exit
reader.Close();
writer.Close();