+ // TODO: This needs to be cleaner - should not assume same order.
+ // And either way, shouldn't start at first reader. Should start at
+ // first reader without an index?
+
+ // make sure same number of index filenames as readers
+ if ( m_readers.size() != indexFilenames.size() || !indexFilenames.empty() )
+ return false;
+
+ // init result flag
+ bool result = true;
+
+ // iterate over BamReaders
+ vector<string>::const_iterator indexFilenameIter = indexFilenames.begin();
+ vector<string>::const_iterator indexFilenameEnd = indexFilenames.end();
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
+ for ( ; readerIter != readerEnd; ++readerIter ) {
+ BamReader* reader = (*readerIter).first;
+
+ // open index filename on reader
+ if ( reader ) {
+ const string& indexFilename = (*indexFilenameIter);
+ result &= reader->OpenIndex(indexFilename);
+ }
+
+ // increment filename iterator, skip if no more index files to open
+ if ( ++indexFilenameIter == indexFilenameEnd )
+ break;
+ }
+
+ // TODO: validation ??
+
+ // return success/fail
+ return result;
+}
+
+BamReader* BamMultiReaderPrivate::OpenReader(const std::string& filename) {
+
+ // create new BamReader
+ BamReader* reader = new BamReader;
+
+ // 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;
+
+ // could not read alignment
+ else {
+ cerr << "BamMultiReader WARNING: Could not read first alignment from "
+ << filename << ", ignoring file" << endl;