// ValidateReaders checks that all the readers point to BAM files representing // alignments against the same set of reference sequences, and that the // sequences are identically ordered. If these checks fail the operation of // the multireader is undefined, so we force program exit. void BamMultiReader::ValidateReaders(void) const { int firstRefCount = readers.front().first->GetReferenceCount(); BamTools::RefVector firstRefData = readers.front().first->GetReferenceData(); for (vector<pair<BamReader*, BamAlignment*> >::const_iterator it = readers.begin(); it != readers.end(); ++it) { BamReader* reader = it->first; BamTools::RefVector currentRefData = reader->GetReferenceData(); BamTools::RefVector::const_iterator f = firstRefData.begin(); BamTools::RefVector::const_iterator c = currentRefData.begin(); if (reader->GetReferenceCount() != firstRefCount || firstRefData.size() != currentRefData.size()) { cerr << "ERROR: mismatched number of references in " << reader->GetFilename() << " expected " << firstRefCount << " reference sequences but only found " << reader->GetReferenceCount() << endl; exit(1); } // this will be ok; we just checked above that we have identically-sized sets of references // here we simply check if they are all, in fact, equal in content while (f != firstRefData.end()) { if (f->RefName != c->RefName || f->RefLength != c->RefLength) { cerr << "ERROR: mismatched references found in " << reader->GetFilename() << " expected: " << endl; for (BamTools::RefVector::const_iterator a = firstRefData.begin(); a != firstRefData.end(); ++a) cerr << a->RefName << " " << a->RefLength << endl; cerr << "but found: " << endl; for (BamTools::RefVector::const_iterator a = currentRefData.begin(); a != currentRefData.end(); ++a) cerr << a->RefName << " " << a->RefLength << endl; exit(1); } ++f; ++c; } } }
NewGenomeFile::NewGenomeFile(const BamTools::RefVector &refVector) : _maxId(-1) { for (size_t i = 0; i < refVector.size(); ++i) { QuickString chrom = refVector[i].RefName; CHRPOS length = refVector[i].RefLength; _maxId++; _chromSizeIds[chrom] = pair<CHRPOS, CHRPOS>(length, _maxId); } }
NewGenomeFile::NewGenomeFile(const BamTools::RefVector &refVector) : _maxId(-1) { size_t i = 0; for (; i < refVector.size(); ++i) { string chrom = refVector[i].RefName; CHRPOS length = refVector[i].RefLength; _maxId++; _chromSizeIds[chrom] = pair<CHRPOS, CHRPOS>(length, _maxId); _chromList.push_back(chrom); } // Special: BAM files can have unmapped reads, which show as no chromosome, or an empty chrom string. // Add in an empty chrom so these don't error. _maxId++; _chromSizeIds[""] = pair<CHRPOS, int>(0, _maxId); _chromList.push_back(""); }
RegionCoverage::RegionCoverage( const BamTools::RefVector& references ) : m_contigList(NULL) , m_bcovRegion(NULL) , m_rcovRegion(NULL) , m_lastRegionAssigned(NULL) , m_numAuxFields(0) , m_ncovDepths(0) { m_numRefContigs = references.size(); if( m_numRefContigs ) { m_contigList = new TargetContig*[m_numRefContigs]; for( size_t i = 0; i < m_numRefContigs; ++i ) { m_contigList[i] = new TargetContig( references[i].RefName, references[i].RefLength ); m_contigIdx[ references[i].RefName ] = i; } } // initial values force set up on first call to 'iterator' m_bcovContigIdx = m_rcovContigIdx = m_numRefContigs; m_bcovRegionPos = 0; }