From: Erik Garrison Date: Mon, 21 Jun 2010 15:56:39 +0000 (-0400) Subject: Gracefully handle empty files with the BamMultiReader X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=0108fd0bf864c11355a3c7e39d33dcf6d7a149d2;p=bamtools.git Gracefully handle empty files with the BamMultiReader This commit handles the case where an empty BAM file is passed in the list of filenames given to BamMultiReader::Open(...). Now a warning is emitted if the file contains no alignments (or cannot be opened) and the file is ignored. --- diff --git a/BamMultiReader.cpp b/BamMultiReader.cpp index 733087e..6d80323 100644 --- a/BamMultiReader.cpp +++ b/BamMultiReader.cpp @@ -217,20 +217,29 @@ void BamMultiReader::Open(const vector filenames, bool openIndexes, bool for (vector::const_iterator it = filenames.begin(); it != filenames.end(); ++it) { string filename = *it; BamReader* reader = new BamReader; + + // TODO; change Open to return success/failure so we can report errors here if (openIndexes) { reader->Open(filename, filename + ".bai"); } else { reader->Open(filename); // for merging, jumping is disallowed } + + bool fileOK = true; BamAlignment* alignment = new BamAlignment; if (coreMode) { - reader->GetNextAlignmentCore(*alignment); + fileOK &= reader->GetNextAlignmentCore(*alignment); } else { - reader->GetNextAlignment(*alignment); + fileOK &= 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))); + if (fileOK) { + 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))); + } else { + cerr << "WARNING: could not read first alignment in " << filename << ", ignoring file" << endl; + } + } ValidateReaders(); }