File: CompareSequencesPrinterImpl.hpp

package info (click to toggle)
pbseqlib 5.3.5%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 7,020 kB
  • sloc: cpp: 77,250; python: 331; sh: 103; makefile: 41
file content (80 lines) | stat: -rw-r--r-- 3,155 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifndef _BLASR_COMPARE_SEQUENCES_PRINTER_IMPL_HPP_
#define _BLASR_COMPARE_SEQUENCES_PRINTER_IMPL_HPP_

template <typename T_Alignment, typename T_QuerySequence, typename T_TargetSequence>
void CompareSequencesOutput::Print(T_Alignment &alignment, T_QuerySequence &qseq,
                                   T_TargetSequence &tseq, std::ostream &out, bool refForward)
{

    std::string queryStr, alignStr, textStr;
    CreateAlignmentStrings(alignment, qseq, tseq, textStr, alignStr, queryStr);

    if (refForward == false) {
        if (alignment.qStrand == 1 and alignment.tStrand == 0) {
            DNALength alignedSeqToEnd = 0;
            //			DNALength alignedTSeqToEnd = 0;
            if (alignment.blocks.size() > 0) {
                // First compute the offset of the reverse of the substring that was aligned.

                alignedSeqToEnd =
                    alignment.qLength - (alignment.qAlignedSeqPos + alignment.qAlignedSeq.length);
                DNALength alignEndToSubstrEnd =
                    alignment.qAlignedSeq.length -
                    (alignment.qPos + alignment.blocks[alignment.blocks.size() - 1].qPos +
                     alignment.blocks[alignment.blocks.size() - 1].length);
                alignment.qPos = alignEndToSubstrEnd;
            }
            alignment.qAlignedSeqPos = alignedSeqToEnd;
            alignment.qStrand = 0;
            alignment.tStrand = 1;
        }
    }

    PrintCompareSequencesAlignmentStats(alignment, out);
    // change the spaces in the align string to *s for easy parsing of alignment
    VectorIndex i;
    for (i = 0; i < alignStr.size(); i++) {
        if (alignStr[i] == ' ') alignStr[i] = '*';
    }

    if (refForward == false and alignment.tStrand == 1) {
        //
        // Build reverse complement strings.
        //
        std::string queryStrRC, alignStrRC, textStrRC;
        queryStrRC.resize(queryStr.size());
        alignStrRC.resize(alignStr.size());
        textStrRC.resize(alignStr.size());

        DNALength pos;
        DNALength alignStringLength = alignStr.size();
        for (pos = 0; pos < alignStringLength; pos++) {
            if (queryStr[pos] != '-') {
                queryStrRC[alignStringLength - pos - 1] =
                    ReverseComplementNuc[static_cast<int>(queryStr[pos])];
            } else {
                queryStrRC[alignStringLength - pos - 1] = '-';
            }
            alignStrRC[alignStringLength - pos - 1] = alignStr[pos];

            if (textStr[pos] != '-') {
                textStrRC[alignStringLength - pos - 1] =
                    ReverseComplementNuc[static_cast<int>(textStr[pos])];
            } else {
                textStrRC[alignStringLength - pos - 1] = '-';
            }
        }
        queryStr = queryStrRC;
        alignStr = alignStrRC;
        textStr = textStrRC;
    }

    // Headers of m5 format are:
    // qName qSeqLength qStart qEnd qStrand
    // tName tSeqLength tStart tEnd tStrand
    // score numMatch numMismatch numIns numDel
    // mapQV qAlignedSeq matchPattern tAlignedSeq
    out << queryStr << " " << alignStr << " " << textStr << std::endl;
}

#endif