static boolean checkSeqSimilar(struct dnaSeq *a, struct dnaSeq *b, int minScore) /* Check that two sequences are similar. Assumes sequences are same size. */ { int size = a->size; int size1 = size-1; return dnaScoreMatch(a->dna, b->dna, size) >= minScore || dnaScoreMatch(a->dna+1, b->dna, size1) >= minScore || dnaScoreMatch(a->dna, b->dna+1, size1) >= minScore; }
int rangeScore(struct gfRange *range, struct dnaSeq *qSeq) /* Return score associated with range. */ { struct gfRange *comp; struct dnaSeq *tSeq; int score = 0; for (comp = range->components; comp != NULL; comp = comp->next) { tSeq = comp->tSeq; score += dnaScoreMatch(tSeq->dna + range->tStart, qSeq->dna + range->qStart, range->tEnd - range->tStart); if (comp->next != NULL) score -= 4; } return score; }
int ffScoreSomeAlis(struct ffAli *ali, int count, enum ffStringency stringency) /* Figure out score of count alis. */ { int score = 0; int oneScore; while (--count >= 0) { int len = ali->hEnd - ali->hStart; struct ffAli *right = ali->right; oneScore = dnaScoreMatch(ali->hStart, ali->nStart, len); score += oneScore; if (count > 0) /* Calculate gap penalty */ score -= ffGapPenalty(ali, right,stringency); ali = right; } return score; }
static int findCrossover(struct ffAli *left, struct ffAli *right, int overlap, boolean isProt) /* Find ideal crossover point of overlapping blocks. That is * the point where we should start using the right block rather * than the left block. This point is an offset from the start * of the overlapping region (which is the same as the start of the * right block). */ { int bestPos = 0; char *nStart = right->nStart; char *lhStart = left->hEnd - overlap; char *rhStart = right->hStart; int i; int (*scoreMatch)(char a, char b); int score, bestScore; if (isProt) { scoreMatch = aaScore2; score = bestScore = aaScoreMatch(nStart, rhStart, overlap); } else { scoreMatch = dnaScore2; score = bestScore = dnaScoreMatch(nStart, rhStart, overlap); } for (i=0; i<overlap; ++i) { char n = nStart[i]; score += scoreMatch(lhStart[i], n); score -= scoreMatch(rhStart[i], n); if (score > bestScore) { bestScore = score; bestPos = i+1; } } return bestPos; }