/// the reference sequence is assumed to be a clip starting at the query alignment start position:
///
static
void
semiAlignTestCase(
    const pos_t alignPos,
    const char* querySeq,
    const char* refSeq,
    unsigned& leadingLength,
    pos_t& leadingRefPos,
    unsigned& trailingLength,
    pos_t& trailingRefPos)
{
    leadingLength=0;
    leadingRefPos=0;
    trailingLength=0;
    trailingRefPos=0;

    const unsigned querySize(strlen(querySeq));

    ALIGNPATH::path_t inputPath;
    inputPath.push_back(ALIGNPATH::path_segment(ALIGNPATH::MATCH,querySize));

    bam_record bamRead;
    bam1_t* bamDataPtr(bamRead.get_data());
    edit_bam_cigar(inputPath,*bamDataPtr);

    reference_contig_segment testRefSeg;
    testRefSeg.seq() = refSeq;
    testRefSeg.set_offset(alignPos);

    // initialize test qual array to all Q30's:
    boost::scoped_array<uint8_t> qual(new uint8_t[querySize]);
    for (unsigned i(0); i<querySize; ++i)
    {
        qual[i] = 30;
    }

    edit_bam_read_and_quality(querySeq, qual.get(), *bamDataPtr);

    SimpleAlignment align(bamRead);
    align.pos = alignPos;

    edgeMismatchLength(align, bamRead.get_bam_read(), testRefSeg, 5,
                       leadingLength, leadingRefPos, trailingLength, trailingRefPos);
}
Example #2
0
void
buildTestBamRecord(
    bam_record& bamRead,
    int targetID,
    int pos,
    int mateTargetID,
    int matePos,
    int fragmentSize,
    int mapQ,
    std::string cigarString,
    std::string querySeq)
{
    bam1_t& bamData(*(bamRead.get_data()));

    // set qname
    {
        edit_bam_qname("buildTestBamRecord", bamData);
    }

    // set CIGAR
    {
        if (cigarString.empty())
        {
            cigarString = std::to_string(fragmentSize) + "M";
        }

        ALIGNPATH::path_t inputPath;
        cigar_to_apath(cigarString.c_str(), inputPath);
        edit_bam_cigar(inputPath, bamData);
    }

    // set read and qual
    {
        if ( querySeq.empty() )
        {
            querySeq = std::string(fragmentSize,'A');
        }
        const unsigned querySize(querySeq.length());
        // initialize test qual array to all Q30's:
        std::unique_ptr<uint8_t[]> qual(new uint8_t[querySize]);
        for (unsigned i(0); i<querySize; ++i)
        {
            qual[i] = 30;
        }
        edit_bam_read_and_quality(querySeq.c_str(), qual.get(), bamData);
    }

    // Set some defaults for the read
    bamRead.toggle_is_paired();
    bamRead.toggle_is_mate_fwd_strand();
    bamData.core.pos = pos;
    bamData.core.isize = fragmentSize;
    bamData.core.qual = mapQ;
    bamRead.set_target_id(targetID);

    // Set mate info
    bamData.core.mtid = mateTargetID;
    bamData.core.mpos = matePos;

    static const char nhTag[] = {'N','H'};
    static const char nmTag[] = {'N','M'};
    static const char rgTag[] = {'R','G'};
    bam_aux_append_unsigned(bamData, nhTag, 1);
    bam_aux_append_unsigned(bamData, nmTag, 1);
    bam_aux_append_unsigned(bamData, rgTag, 1);
}