X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fapi%2Finternal%2FBamMultiReader_p.cpp;h=c39ab8f5f52fbc81af17849c17bd9c1702d76fce;hb=00cf2def91345c706120ab69056d3d41860ff5c5;hp=9776f884e0fbcece6411f706903742b7736ae175;hpb=c0da76176fbb6771e02d532246e5a464a957c382;p=bamtools.git diff --git a/src/api/internal/BamMultiReader_p.cpp b/src/api/internal/BamMultiReader_p.cpp index 9776f88..c39ab8f 100644 --- a/src/api/internal/BamMultiReader_p.cpp +++ b/src/api/internal/BamMultiReader_p.cpp @@ -438,6 +438,9 @@ bool BamMultiReaderPrivate::Open(const vector& filenames) { if ( m_alignments == 0 ) return false; } + // put all current readers back at beginning (refreshes alignment cache) + Rewind(); + // iterate over filenames vector::const_iterator filenameIter = filenames.begin(); vector::const_iterator filenameEnd = filenames.end(); @@ -446,18 +449,17 @@ bool BamMultiReaderPrivate::Open(const vector& filenames) { if ( filename.empty() ) continue; // attempt to open BamReader on filename - BamReader* reader = OpenReader(filename); - if ( reader == 0 ) continue; - - // store reader with new alignment - m_readers.push_back( make_pair(reader, new BamAlignment) ); + bool openedOk = false; + ReaderAlignment ra = OpenReader(filename, &openedOk); + if ( openedOk ) { + m_readers.push_back(ra); // store reader/alignment in local list + m_alignments->Add(ra); // add reader/alignment to sorting cache + } } - // validate & rewind any opened readers, also refreshes alignment cache - if ( !m_readers.empty() ) { + // if more than one reader open, check for reference consistency + if ( m_readers.size() > 1 ) ValidateReaders(); - Rewind(); - } // return success return true; @@ -506,19 +508,23 @@ bool BamMultiReaderPrivate::OpenIndexes(const vector& indexFilenames) { return result; } -BamReader* BamMultiReaderPrivate::OpenReader(const std::string& filename) { +ReaderAlignment BamMultiReaderPrivate::OpenReader(const string& filename, bool* ok) { + + // clear status flag + *ok = false; - // create new BamReader + // create new BamReader & BamAlignment BamReader* reader = new BamReader; + BamAlignment* alignment = new BamAlignment; // if reader opens OK if ( reader->Open(filename) ) { - // attempt to read first alignment (sanity check) - // if ok, then return BamReader pointer - BamAlignment al; - if ( reader->GetNextAlignmentCore(al) ) - return reader; + // if first alignment reads OK + if ( LoadNextAlignment(reader, alignment) ) { + *ok = true; + return make_pair(reader, alignment); + } // could not read alignment else { @@ -536,7 +542,8 @@ BamReader* BamMultiReaderPrivate::OpenReader(const std::string& filename) { // if we get here, there was a problem with this BAM file (opening or reading) // clean up memory allocation & return null pointer delete reader; - return 0; + delete alignment; + return ReaderAlignment(); } // print associated filenames to stdout @@ -554,9 +561,9 @@ bool BamMultiReaderPrivate::PopNextCachedAlignment(BamAlignment& al, const bool if ( !HasAlignmentData() ) return false; - // "pop" next alignment and reader + // pop next reader/alignment pair ReaderAlignment nextReaderAlignment = m_alignments->TakeFirst(); - BamReader* reader = nextReaderAlignment.first; + BamReader* reader = nextReaderAlignment.first; BamAlignment* alignment = nextReaderAlignment.second; // store cached alignment into destination parameter (by copy) @@ -568,7 +575,7 @@ bool BamMultiReaderPrivate::PopNextCachedAlignment(BamAlignment& al, const bool al.Filename = reader->GetFilename(); } - // peek to next alignment & store in cache + // load next alignment from reader & store in cache SaveNextAlignment(reader, alignment); // return success