示例#1
0
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;
}