From: derek Date: Fri, 9 Sep 2011 22:49:44 +0000 (-0400) Subject: Removed unnecessary peek-and-rewind behavior in BamMultiReader X-Git-Url: https://git.donarmstrong.com/?p=bamtools.git;a=commitdiff_plain;h=00cf2def91345c706120ab69056d3d41860ff5c5 Removed unnecessary peek-and-rewind behavior in BamMultiReader * Fixes some piping issues --- 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 diff --git a/src/api/internal/BamMultiReader_p.h b/src/api/internal/BamMultiReader_p.h index 85c5b85..70c0edb 100644 --- a/src/api/internal/BamMultiReader_p.h +++ b/src/api/internal/BamMultiReader_p.h @@ -33,6 +33,10 @@ class IBamMultiMerger; class BamMultiReaderPrivate { + // typedefs + public: + typedef std::pair ReaderAlignment; + // constructor / destructor public: BamMultiReaderPrivate(void); @@ -79,7 +83,7 @@ class BamMultiReaderPrivate { const std::string ExtractReadGroup(const std::string& headerLine) const; bool HasAlignmentData(void) const; bool LoadNextAlignment(BamReader* reader, BamAlignment* alignment); - BamReader* OpenReader(const std::string& filename); + ReaderAlignment OpenReader(const std::string& filename, bool* ok); bool PopNextCachedAlignment(BamAlignment& al, const bool needCharData); bool RewindReaders(void); void SaveNextAlignment(BamReader* reader, BamAlignment* alignment); @@ -88,10 +92,8 @@ class BamMultiReaderPrivate { void ValidateReaders(void) const; // data members - public: - typedef std::pair ReaderAlignment; + public: std::vector m_readers; - IBamMultiMerger* m_alignments; BamMultiReader::SortOrder m_sortOrder; };