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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
// Copyright 2010, 2013 Martin C. Frith
#include "gaplessXdrop.hh"
#include <stdexcept>
static void err(const char *s) { throw std::overflow_error(s); }
namespace cbrc {
int forwardGaplessXdropScore(const uchar *seq1,
const uchar *seq2,
const ScoreMatrixRow *scorer,
int maxScoreDrop) {
int score = 0;
int s = 0;
while (true) {
s += scorer[*seq1++][*seq2++]; // overflow risk
if (s < score - maxScoreDrop) break;
if (s > score) score = s;
}
if (score - s < 0)
err("score overflow in forward gapless extension");
return score;
}
int reverseGaplessXdropScore(const uchar *seq1,
const uchar *seq2,
const ScoreMatrixRow *scorer,
int maxScoreDrop) {
int score = 0;
int s = 0;
while (true) {
s += scorer[*--seq1][*--seq2]; // overflow risk
if (s < score - maxScoreDrop) break;
if (s > score) score = s;
}
if (score - s < 0)
err("score overflow in reverse gapless extension");
return score;
}
const uchar *forwardGaplessXdropEnd(const uchar *seq1,
const uchar *seq2,
const ScoreMatrixRow *scorer,
int score) {
int s = 0;
while (s < score) s += scorer[*seq1++][*seq2++];
return seq1;
}
const uchar *reverseGaplessXdropEnd(const uchar *seq1,
const uchar *seq2,
const ScoreMatrixRow *scorer,
int score) {
int s = 0;
while (s < score) s += scorer[*--seq1][*--seq2];
return seq1;
}
bool isOptimalGaplessXdrop(const uchar *seq1,
const uchar *seq1end,
const uchar *seq2,
const ScoreMatrixRow *scorer,
int maxScoreDrop) {
int score = 0;
int maxScore = 0;
while (seq1 < seq1end) {
score += scorer[*seq1++][*seq2++];
if (score > maxScore) maxScore = score;
else if (score <= 0 || // non-optimal prefix
seq1 == seq1end || // non-optimal suffix
score < maxScore - maxScoreDrop) { // excessive score drop
return false;
}
}
return true;
}
int gaplessXdropOverlap(const uchar *seq1,
const uchar *seq2,
const ScoreMatrixRow *scorer,
int maxScoreDrop,
size_t &reverseLength,
size_t &forwardLength) {
int minScore = 0;
int maxScore = 0;
int score = 0;
const uchar *r1 = seq1;
const uchar *r2 = seq2;
while (true) {
--r1; --r2;
int s = scorer[*r1][*r2];
if (s <= -INF) break;
score += s;
if (score > maxScore) maxScore = score;
else if (score < maxScore - maxScoreDrop) return -INF;
else if (score < minScore) minScore = score;
}
maxScore = score - minScore;
const uchar *f1 = seq1;
const uchar *f2 = seq2;
while (true) {
int s = scorer[*f1][*f2];
if (s <= -INF) break;
score += s;
if (score > maxScore) maxScore = score;
else if (score < maxScore - maxScoreDrop) return -INF;
++f1; ++f2;
}
reverseLength = seq1 - (r1 + 1);
forwardLength = f1 - seq1;
return score;
}
int gaplessAlignmentScore(const uchar *seq1,
const uchar *seq1end,
const uchar *seq2,
const ScoreMatrixRow *scorer) {
int score = 0;
while (seq1 < seq1end) score += scorer[*seq1++][*seq2++];
return score;
}
}
|