+
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ADAPTOR LOCATING <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+
+sub find_adaptor
+{
+ # Martin A. Hansen & Selene Fernandez, August 2008
+
+ # Locates an adaptor sequence in a given sequence
+ # starting from a given offset position allowing a given
+ # number of mismatches (no indels).
+
+ my ( $adaptor, # list of chars
+ $tag, # list of chars
+ $adaptor_len, # length of adaptor sequence
+ $tag_len, # length of tag sequence
+ $tag_offset, # offset position
+ $max_match, # number of matches indicating success
+ $max_mismatch, # number of mismatches
+ ) = @_;
+
+ # Returns an integer.
+
+ my ( $i, $j, $match, $mismatch );
+
+ $i = $tag_offset;
+
+ while ( $i < $tag_len - ( $max_match + $max_mismatch ) + 1 )
+ {
+ $j = 0;
+
+ while ( $j < $adaptor_len - ( $max_match + $max_mismatch ) + 1 )
+ {
+ return $i if check_diag( $adaptor, $tag, $adaptor_len, $tag_len, $j, $i, $max_match, $max_mismatch );
+
+ $j++
+ }
+
+ $i++;
+ }
+
+ return -1;
+}
+
+
+sub check_diag
+{
+ # Martin A. Hansen & Selene Fernandez, August 2008
+
+ # Checks the diagonal starting at a given coordinate
+ # of a search space constituted by an adaptor and a tag sequence.
+ # Residues in the diagonal are compared between the sequences allowing
+ # for a given number of mismatches. We terminate when search spaca is
+ # exhausted or if max matches or mismatches is reached.
+
+ my ( $adaptor,
+ $tag,
+ $adaptor_len,
+ $tag_len,
+ $adaptor_beg,
+ $tag_beg,
+ $max_match,
+ $max_mismatch,
+ ) = @_;
+
+ # Returns boolean.
+
+ my ( $match, $mismatch );
+
+ $match = 0;
+ $mismatch = 0;
+
+ while ( $adaptor_beg <= $adaptor_len and $tag_beg <= $tag_len )
+ {
+ if ( $adaptor->[ $adaptor_beg ] eq $tag->[ $tag_beg ] )
+ {
+ $match++;
+
+ return 1 if $match >= $max_match;
+ }
+ else
+ {
+ $mismatch++;
+
+ return 0 if $mismatch > $max_mismatch;
+ }
+
+ $adaptor_beg++;
+ $tag_beg++;
+ }
+
+ return 0;
+}