Skip to content

Commit

Permalink
AmpliconSearch now finds multiple amplicons
Browse files Browse the repository at this point in the history
  • Loading branch information
fangly committed Mar 4, 2012
1 parent 882db99 commit 6ff387d
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 82 deletions.
28 changes: 9 additions & 19 deletions Bio/Tools/AmpliconSearch.pm
Expand Up @@ -16,6 +16,8 @@ use Bio::SeqFeature::Amplicon;

use base qw(Bio::Root::Root);

my $template_str;


=head1 NAME
Expand Down Expand Up @@ -148,6 +150,7 @@ sub _set_template {
$template->primary_seq($primary_seq);
}
$self->{template} = $template;
$template_str = $self->template->seq;
return $self->template;
}

Expand Down Expand Up @@ -280,7 +283,6 @@ sub next_amplicon {

my $amplicon;

my $seqstr = $self->template->seq;
my $fwd_regexp = $self->forward_regexp;
my $rev_regexp = $self->reverse_regexp;

Expand All @@ -289,31 +291,19 @@ sub next_amplicon {

if ( defined($fwd_regexp) && not(defined $rev_regexp) ) {
# From forward primer to end of template
if ($seqstr =~ m/($fwd_regexp)/g) {
my $start = pos($seqstr) - length($1) + 1;
my $end = length($seqstr);
if ($template_str =~ m/($fwd_regexp)/g) {
my $start = pos($template_str) - length($1) + 1;
my $end = length($template_str);
$amplicon = $self->_create_amplicon($start, $end, $strand);
}

} elsif ( defined($fwd_regexp) && defined($rev_regexp) ) {
# From forward to reverse primer
# while ( $seqstr =~ m/($fwd_regexp.*?$rev_regexp)/g ) {
# if ($seqstr =~ m/($fwd_regexp.*?$rev_regexp)/g) {
if ($seqstr =~ m/\G.*?($fwd_regexp.*?$rev_regexp)/g) {

#####
print "match: '$1'\n";
#####

my $end = pos($seqstr);
if ($template_str =~ m/($fwd_regexp.*?$rev_regexp)/g) {
my $end = pos($template_str);
my $start = $end - length($1) + 1;

####
pos($seqstr) = $start + 2;
####

# Now trim the left end to obtain the shortest amplicon
my $ampliconstr = substr $seqstr, $start - 1, $end - $start + 1;
my $ampliconstr = substr $template_str, $start - 1, $end - $start + 1;
if ($ampliconstr =~ m/$fwd_regexp.*($fwd_regexp)/g) {
$start += pos($ampliconstr) - length($1);
}
Expand Down
126 changes: 63 additions & 63 deletions t/Tools/AmpliconSearch.t
Expand Up @@ -2,7 +2,7 @@ BEGIN {
use lib '.';
use Bio::Root::Test;

test_begin(-tests => 29);
test_begin(-tests => 44);

use_ok 'Bio::Tools::AmpliconSearch';
use_ok 'Bio::PrimarySeq';
Expand All @@ -13,68 +13,68 @@ BEGIN {
my ($search, $amplicon, $seq, $forward, $reverse);


## Basic object

#ok $search = Bio::Tools::AmpliconSearch->new(), 'Basic';
#isa_ok $search, 'Bio::Tools::AmpliconSearch';


## Forward primer only

#$seq = Bio::PrimarySeq->new(
# -seq => 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT',
#);
#$forward = Bio::PrimarySeq->new(
# -seq => 'AAACTTAAAGGAATTGACGG',
#);
#ok $search = Bio::Tools::AmpliconSearch->new(
# -template => $seq,
# -forward_primer => $forward,
#), 'Forward primer only';
#is $search->forward_primer->seq, 'AAACTTAAAGGAATTGACGG';
#is $search->reverse_primer, undef;
#is $search->template->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
#ok $amplicon = $search->next_amplicon;
#isa_ok $amplicon, 'Bio::SeqFeature::Amplicon';
#is $amplicon->start, 1;
#is $amplicon->end, 67;
#is $amplicon->strand, 1;
#is $amplicon->seq->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
#is $amplicon = $search->next_amplicon, undef;


## Forward and reverse primers, no amplicon

#$reverse = Bio::PrimarySeq->new(
# -seq => 'GTACACACCGCCCGT',
#);
#ok $search = Bio::Tools::AmpliconSearch->new(
# -template => $seq,
# -forward_primer => $forward,
# -reverse_primer => $reverse,
#), 'Two primers, no match';
#is $search->forward_primer->seq, 'AAACTTAAAGGAATTGACGG';
#is $search->reverse_primer->seq, 'GTACACACCGCCCGT';
#is $search->template->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
#is $amplicon = $search->next_amplicon, undef;


## Degenerate forward and reverse primers from file, single amplicon

#ok $search = Bio::Tools::AmpliconSearch->new(
# -template => $seq,
# -primer_file => test_input_file('forward_reverse_primers.fa'),
#), 'Two degenerate primers from a file';
#is $search->forward_primer->seq, 'AAACTYAAAKGAATTGRCGG';
#is $search->reverse_primer->seq, 'ACGGGCGGTGTGTRC';
#is $search->template->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
#ok $amplicon = $search->next_amplicon;
#isa_ok $amplicon, 'Bio::SeqFeature::Amplicon';
#is $amplicon->start, 1;
#is $amplicon->end, 67;
#is $amplicon->strand, 1;
#is $amplicon->seq->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
#is $amplicon = $search->next_amplicon, undef;
# Basic object

ok $search = Bio::Tools::AmpliconSearch->new(), 'Basic';
isa_ok $search, 'Bio::Tools::AmpliconSearch';


# Forward primer only

$seq = Bio::PrimarySeq->new(
-seq => 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT',
);
$forward = Bio::PrimarySeq->new(
-seq => 'AAACTTAAAGGAATTGACGG',
);
ok $search = Bio::Tools::AmpliconSearch->new(
-template => $seq,
-forward_primer => $forward,
), 'Forward primer only';
is $search->forward_primer->seq, 'AAACTTAAAGGAATTGACGG';
is $search->reverse_primer, undef;
is $search->template->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
ok $amplicon = $search->next_amplicon;
isa_ok $amplicon, 'Bio::SeqFeature::Amplicon';
is $amplicon->start, 1;
is $amplicon->end, 67;
is $amplicon->strand, 1;
is $amplicon->seq->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
is $amplicon = $search->next_amplicon, undef;


# Forward and reverse primers, no amplicon

$reverse = Bio::PrimarySeq->new(
-seq => 'GTACACACCGCCCGT',
);
ok $search = Bio::Tools::AmpliconSearch->new(
-template => $seq,
-forward_primer => $forward,
-reverse_primer => $reverse,
), 'Two primers, no match';
is $search->forward_primer->seq, 'AAACTTAAAGGAATTGACGG';
is $search->reverse_primer->seq, 'GTACACACCGCCCGT';
is $search->template->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
is $amplicon = $search->next_amplicon, undef;


# Degenerate forward and reverse primers from file, single amplicon

ok $search = Bio::Tools::AmpliconSearch->new(
-template => $seq,
-primer_file => test_input_file('forward_reverse_primers.fa'),
), 'Two degenerate primers from a file';
is $search->forward_primer->seq, 'AAACTYAAAKGAATTGRCGG';
is $search->reverse_primer->seq, 'ACGGGCGGTGTGTRC';
is $search->template->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
ok $amplicon = $search->next_amplicon;
isa_ok $amplicon, 'Bio::SeqFeature::Amplicon';
is $amplicon->start, 1;
is $amplicon->end, 67;
is $amplicon->strand, 1;
is $amplicon->seq->seq, 'AAACTTAAAGGAATTGACGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGTACACACCGCCCGT';
is $amplicon = $search->next_amplicon, undef;


# Multiple amplicons
Expand Down

0 comments on commit 6ff387d

Please sign in to comment.