Batch::RunStatus PairedEndBatch::parseAlignmentFile(void) { // open reader on new BAM alignment file BamTools::BamReader reader; if ( !reader.Open(m_generatedBam) ) { m_errorString = "could not open generated BAM file: "; m_errorString.append(m_generatedBam); m_errorString.append(" to parse alignments"); return Batch::Error; } // set up data containers m_result.ReadLengths.reserve(2 * m_settings->BatchSize); m_result.FragmentLengths.reserve(m_settings->BatchSize); // plow through alignments BamTools::BamAlignment mate1; BamTools::BamAlignment mate2; while ( reader.GetNextAlignmentCore(mate1) ) { // store mate1 read length, regardless of aligned state m_result.ReadLengths.push_back(mate1.Length); // read mate2 if ( reader.GetNextAlignmentCore(mate2) ) { // store mate2 read length, regardless of aligned state m_result.ReadLengths.push_back(mate2.Length); // if both mates mapped to same reference if ( mate1.IsMapped() && mate2.IsMapped() && (mate1.RefID == mate2.RefID) ) { // calculate & store fragment length m_result.FragmentLengths.push_back( calculateFragmentLength(mate1, mate2) ); } } } reader.Close(); // remove extreme outliers removeOutliers(m_result.FragmentLengths); removeOutliers(m_result.ReadLengths); // if we get here, all should be OK return Batch::Normal; }