GBrowse

 view release on metacpan or  search on metacpan

conf/plugins/AlignTwoSequences.pm  view on Meta::CPAN

  p("This plugin was written by Mark Wilkinson.");
}

sub type { 'annotator' }
sub init {
    my $self = shift;
    my $conf = $self->browser_config;
    $blast_executable = $conf->plugin_setting('bl2seq_executable');
}

sub config_defaults {
  my $self = shift;
  return {sequence_to_blast => '',
          p => 'blastn',
          g => 'T',
          G => -1,
          E => -1,
          X => 0,
          W => 0,
          M => 'BLOSUM62',
          q => -3,
          r => 1,
          F => 'T',
          e => 10,
          S => 3,
          'm' => 'F',
          Y => 0,
          t => 0,
          U => 'F',
          };
}

sub reconfigure {
  my $self = shift;
  my $current = $self->configuration;
  $current->{'sequence_to_blast'} = $self->config_param('sequence_to_blast');
  $current->{'p'} = $self->config_param('p');
  $current->{'g'} = $self->config_param('g');
  $current->{'G'} = $self->config_param('G');
  $current->{'E'} = $self->config_param('E');
  $current->{'X'} = $self->config_param('X');
  $current->{'W'} = $self->config_param('W');
  $current->{'M'} = $self->config_param('M');
  $current->{'q'} = $self->config_param('q');
  $current->{'r'} = $self->config_param('r');
  $current->{'F'} = $self->config_param('F');
  $current->{'e'} = $self->config_param('e');
  $current->{'S'} = $self->config_param('S');
  $current->{'m'} = $self->config_param('m');
  $current->{'Y'} = $self->config_param('Y');
  $current->{'t'} = $self->config_param('t');
  $current->{'U'} = $self->config_param('U');
}
sub configure_form {
  my $self = shift;
  my $current_config = $self->configuration;

  my $form = h3("Default bl2seq values have been selected for you").
      table({-border => 0},TR([
      td([b("Sequence To Align"),   textfield(-name => $self->config_name('sequence_to_blast'),-size => 100, -value=>$current_config->{'sequence_to_blast'})]),
      td(["Blast Program: ",   popup_menu($self->config_name('p'),['blastn','tblastx'], $current_config->{'p'})]),
      td("Gapped: ").td(radio_group( -name=>$self->config_name('g'), -values=>['T','F'],-default=>$current_config->{'g'})),
      td(["Gap Penalty: ",   textfield(-name=>$self->config_name('G'),-default=>$current_config->{'G'},-size=>3,-maxlength=>3)]),
      td(["Extend Penalty: ",   textfield(-name=>$self->config_name('E'),-default=>$current_config->{'E'},-size=>3,-maxlength=>3)]),
      td(["Dropoff value: ",   textfield(-name=>$self->config_name('X'),-default=>$current_config->{'X'},-size=>3,-maxlength=>3)]),
      td(["Word size: " ,    textfield(-name=>$self->config_name('W'),-default=>$current_config->{'W'},-size=>3,-maxlength=>3)]),
      td(["Matrix: ",   popup_menu($self->config_name('M'), ['BLOSUM62'],$current_config->{'M'})]),
      td(["Mismatch Penalty: ",   textfield(-name=>$self->config_name('q'),-default=>$current_config->{'q'},-size=>3,-maxlength=>3)]),
      td(["Match Reward: ",    textfield(-name=>$self->config_name('r'),-default=>$current_config->{'r'},-size=>3,-maxlength=>3)]),
      td("Filter query: ").td(radio_group(-name=>$self->config_name('F'), -values=>['T','F'],-default=>$current_config->{'F'})),
      td(["Expect: ",   textfield(-name=>$self->config_name('e'),-default=>$current_config->{'e'},-size=>10,-maxlength=>10)]),
      td(["Strands to search: ",    textfield(-name=>$self->config_name('S'),-default=>$current_config->{'S'},-size=>1,-maxlength=>1)]),
      td(["Search Space: ",    textfield(-name=>$self->config_name('Y'),-default=>$current_config->{'Y'},-size=>3,-maxlength=>3)]),
      td(["Length of largest intron: ",    textfield(-name=>$self->config_name('t'),-default=>$current_config->{'t'},-size=>3,-maxlength=>3)]),
      td("Filter Lower Case: ").td(radio_group(-name=>$self->config_name('U'), -values=>['T','F'],-default=>$current_config->{'U'}))
                              ]));
    return $form;
}
  

sub annotate {
    my $self = shift;
    my $segment = shift;
    my $ref        = $segment->ref;
    my $abs_start  = $segment->start;
    my $dna        = $segment->seq;
    my $conf = $self->configuration;
    my $feature_list   = Bio::Graphics::FeatureFile->new(-smart_features => 1);
    $feature_list->add_type(bl2seq=>{glyph   => 'alignment',
                    key     => "BLAST alignment",
                    fgcolor => 'brown',
                    bgcolor => 'brown',
                    point   => 0,
                    'link' => 'AUTO',
                    orient  => 'N',
                   });
    #  I should add a "link" section to the feature
    #  with the configuration set to open up an alignment window
    #  of some kind via an [AlignTwoSequences:plugin]section...

    my $file = $self->do_blast($dna);
    use Bio::SearchIO;
    my $searchio = new Bio::SearchIO(-format => 'blast',
                                    -file   => $file);
    while( my $result = $searchio->next_result ) {
       while( my $hit = $result->next_hit ) {
           while( my $hsp = $hit->next_hsp ) {
                my $start = $abs_start + $hsp->start;
                my $stop = $abs_start + $hsp->end;
                my $feature = Bio::Graphics::Feature->new(
                    -start=>$start,
                    -type => "bl2seq",
                    -subtype => "similarity",
                    -desc => "Blast alignment",
                    -source => "NCBI_Blast",
                    -strand => "0",
                    -stop=>$stop,
                    -ref=>$ref,
                    -name=>'bl2seq');
                $feature_list->add_feature($feature,'bl2seq');
           }
       }
    }
    unlink $file;
    return $feature_list;
}



( run in 0.585 second using v1.01-cache-2.11-cpan-364913b4093 )