1 // ----------------------------------------
2 // ---------- flp_seqcomp.cc -----------
3 // ----------------------------------------
7 // Note one recording RC matches. This version of 'seqcomp' records RC matches
8 // as index of the window start in its nonRC form. However, past versions of
9 // the analysis recorded it as the index of the rear of the window, as the
10 // following legacy comment indicates. FR still uses this method
12 // Titus thinks the start of an RC window should be its "rear" in the
13 // normal version of the sequence. He's wrong, of course, and in the
14 // future my followers will annihilate his in the Final Battle, but for
15 // now I'll let him have his way.
17 // note seq2_i is actually the index of the leaving bp, so need to +1
20 FLPs::add(int seq1_i, int seq2_i, int a_score, int i2_offset)
25 if (a_score >= hard_threshold)
27 a_match.index = seq2_i + i2_offset;
28 a_match.score = a_score;
30 all_matches[seq1_i].push_back(a_match);
36 FLPs::seqcomp(string sseq1, string sseq2, bool is_RC)
38 int start_i, seq1_i, seq2_i, win_i; // loop variables
39 int matches; // number of matches in to a window
44 seq1 = (char *) sseq1.c_str();
45 seq2 = (char *) sseq2.c_str();
49 i2_offset = window_size - seq2_length;
54 // this does the "upper diagonals" of the search
56 // loop thru the start positions for sequence 1
57 for(start_i = 0; start_i < seq1_win_num; start_i++)
60 // compare initial window
61 for(win_i = 0; win_i < window_size; win_i++)
62 if ((seq1[start_i+win_i] == seq2[win_i]) &&
63 (seq1[start_i+win_i] != 'N')) // N's match nothing **
66 //seq2_i is always 0 for initial win
69 // call inlined function that adds match if it is above threshold
70 add(start_i, seq2_i, matches, i2_offset);
72 // run through rest of seq1 and seq2 with current seq1 offset (ie start_i)
73 // compare the bps leaving and entering the window and modify matches count
75 while( (seq1_i < seq1_win_num-1) && (seq2_i < seq2_win_num-1) )
77 // copmpare the bp leaving the window
78 if ((seq1[seq1_i] == seq2[seq2_i]) &&
79 (seq1[seq1_i] != 'N')) // N's match nothing
82 // compare the bp entering the window
83 if ((seq1[seq1_i+window_size] == seq2[seq2_i+window_size]) &&
84 (seq1[seq1_i+window_size] != 'N')) // N's match nothing
85 matches = matches + 1;
87 add(seq1_i + 1, seq2_i + 1, matches, i2_offset);
89 seq1_i = seq1_i + 1; // increment seq1_i to next window
90 seq2_i = seq2_i + 1; // increment seq2_i to next window
91 } // end of loop thru the current offset sequence
92 } // end of loop thru the start positions of seq1 sequence
95 // this does the "lower diagonals" of the search
97 // loop thru the start positions for sequence 1
98 for(start_i = 1; start_i < seq2_win_num; start_i++)
102 // compare initial window
103 for(win_i = 0; win_i < window_size; win_i++)
104 if ((seq2[start_i+win_i] == seq1[win_i]) &&
105 (seq2[start_i+win_i] != 'N')) // N's match nothing
108 //seq2_i is always start_i for initial window
111 add(0, seq2_i, matches, i2_offset);
113 // run through rest of seq1 and seq2 with current seq1 offset (ie start_i)
114 // compare the bps leaving and entering the window and modify matches count
116 while( (seq1_i < seq1_win_num-1) && (seq2_i < seq2_win_num-1) )
118 // copmpare the bp leaving the window
119 if ((seq1[seq1_i] == seq2[seq2_i]) &&
120 (seq1[seq1_i] != 'N')) // N's match nothing
121 matches = matches - 1;
123 // compare the bp entering the window
124 if ((seq1[seq1_i+window_size] == seq2[seq2_i+window_size]) &&
125 (seq1[seq1_i+window_size] != 'N')) // N's match nothing
126 matches = matches + 1;
128 add(seq1_i + 1, seq2_i + 1, matches, i2_offset);
130 seq1_i = seq1_i + 1; // increment seq1_i to next window
131 seq2_i = seq2_i + 1; // increment seq2_i to next window
132 } // end of loop thru the current offset sequence
133 } // end of loop thru the start positions of seq2 sequence