Bio::Graphics::Browser2::Plugin(3pm) | User Contributed Perl Documentation | Bio::Graphics::Browser2::Plugin(3pm) |
Bio::Graphics::Browser2::Plugin -- Base class for gbrowse plugins.
package Bio::Graphics::Browser2::Plugin::MyPlugin; use Bio::Graphics::Browser2::Plugin; use CGI ':standard'; @ISA = 'Bio::Graphics::Browser2::Plugin'; # called by gbrowse to return name of plugin for popup menu sub name { 'Example Plugin' } # called by gbrowse to return the descriptive verb for popup menu sub verb { 'Demonstrate' } # called by gbrowse to return description of plugin sub description { 'This is an example plugin' } # called by gbrowse to return type of plugin sub type { 'annotator' } # called by gbrowse to configure default settings for plugin sub config_defaults { my $self = shift; return {foo => $value1, bar => $value2} } # called by gbrowse to reconfigure plugin settings based on CGI parameters sub reconfigure { my $self = shift; my $current = $self->configuration; $current->{foo} = $self->config_param('foo'); $current->{bar} = $self->config_param('bar'); } # called by gbrowse to create a <form> fragment for changing settings sub configure_form { my $self = shift; my $current = $self->configuration; my $form = textfield(-name => $self->config_name('foo'), -value => $current->{foo}) . textfield(-name => $self->config_name('bar'), -value => $current->{bar}); return $form; } # called by gbrowse to annotate the DNA, returning features sub annotate { my $self = shift; my ($segment,$coordinate_mapper) = @_; my $config = $self->configuration; my $feature_list = $self->new_feature_list; $feature_list->add_type('my_type' => {glyph => 'generic', key => 'my type', bgcolor => 'green', link => 'http://www.google.com/search?q=$name' } ); # do something with the sequence segment my @features = do_something(); $feature_list->add_feature($_ => 'my_type') foreach @features; return $feature_list; }
This is the base class for Generic Genome Browser plugins. Plugins are perl .pm files that are stored in the gbrowse.conf/plugins directory. Plugins are activated in the gbrowse.conf/ configuration file by including them on the list indicated by the "plugins" setting:
plugins = BatchDumper FastaDumper GFFDumper OligoFinder RestrictionAnnotator
Site-specific plugins may be placed in one or more site-specific directories and added to the plugin search path using the plugin_path setting:
plugin_path = /usr/local/gbrowse_plugins
GBrowse currently recognizes five distinct types of plugins:
All plug-ins inherit from Bio::Graphics::Browser2::Plugin, which defines reasonable (but uninteresting) defaults for each of the methods. Specific behavior is then implemented by selectively overriding certain methods.
The best way to understand how this works is to look at the source code for some working plugins. Examples provided with the gbrowse distribution include:
The remainder of this document describes the methods available to the programmer.
The initialization methods establish the human-readable name, description, and basic operating parameters of the plugin. They should be overridden in each plugin you write.
Dump <name> Find <name> Annotate <name> plugin_defined_verb <name>
The following methods give the plugin access to the environment, including the gbrowse page settings, the sequence features database, and the plugin's own configuration settings.
These methods do not generally need to be overridden.
See CONFIGURATION METHODS for instructions on how to create and maintain the plugin's persistent configuration information.
[GOSearch:plugin] traverse_isa = 1 use_server = http://amigo.geneontology.org
"GOSearch" is the package name of the plugin, and the ":plugin" part of the stanza name tells gbrowse that this is a plugin-private configuration section.
You can now access these settings from within the plugin by using the following idiom:
my $traverse_isa = $self->setting('traverse_isa'); my $server = $self->setting('use_server');
This facility is intended to be used for any settings that should not be changed by the end user. Persistent user preferences should be stored in the hash returned by configuration().
If your plugin inherits from another one, then the inheritance path will be searched for settings. For example, if the GOSearch plugin inherits from the OntologySearch plugin, then setting() will search first for a stanza named "GOSearch:plugin" and then for "OntologySearch:plugin".
$features = $search->search_features(\%args);
where \%args are the various arguments (e.g. -type, -seq_id, -name) passed to the dbadaptors' search_features() method. Alternatively:
$features = $search->search_features('keyword string')
which implements GBrowse's heuristic search.
The result is an array reference of features found.
The search object also has a get_seq_stream() method that accepts the same arguments as search_features() but returns an iterator. The iterator implements a next_seq() method.
print $self->language->tr('WELCOME');
$plugin->segments(\@segments);
The active segments can then be retrieved from within the plugin. This is useful in cases where segment-specific information is required by plugin methods that are not passed a segment object.
This method is equivalent to calling Bio::Graphics::FeatureFile->new(-smart_features=>1), where the -smart_features argument allows features to be turned into imagemap links.
All plugins that act as feature dumpers should override one or more of the methods described in this section.
As described in Bio::Das::SegmentI, the segment object represents the region of the genome currently on display in the gbrowse "detail" panel. You may call its seq() method to return the sequence as a string, or its features() method to return a list of all features that have been annotated onto this segment of the genome.
At the time that dump() is called, gbrowse will already have set up the HTTP header and performed other initialization. The dump() method merely needs to begin printing output using the appropriate MIME type. By default, the MIME type is text/plain, but this can be changed with the mime_type() method described next.
The following trivial example shows a dump() method that prints the name and length of the segment:
sub dump { my $self = shift; my $segment = shift; print "name = ",$segment->seq_id,"\n"; print "length = ",$segment->length,"\n"; }
All finder plugins will need to override one or more of the methods described in this section.
Depending on the type of find you are performing, you might search the preexisting features on the segment for matches, or create your own features from scratch in the way that the annotator plugins do. You may choose to ignore the passed segment and perform the search on the entire database, which you can obtain using the database() method call.
To create features from scratch I suggest you use either Bio::Graphics::Feature, or Bio::SeqFeature::Generic to generate the features. See their respective manual pages for details, and the OligoFinder.pm plugin for an example of how to do this.
If the plugin requires user input before it can perform its task, find() should return undef. Gbrowse will invoke configure_form() followed by reconfigure() in order to prompt the user for input. If nothing is found, the plugin should return an empty list. The following is an example of how to prompt the user for input -- in this case, a gene ontology term:
sub find { my $self = shift; my $segment = shift; # we ignore this! my $config = $self->configuration; my $query = $config->{query} or return undef; # PROMPT FOR INPUT my $search = $self->db_search; my @features = $search->features(-attributes=>{GO_Term => $query}); return (\@features,$query); } sub configure_form { my $self = shift; return "Enter a GO Term: " . textfield(-name=>$self->config_name('query')); } sub reconfigure { my $self = shift; my $config = $self->configuration; $config->{query} = $self->config_param('query'); }
See the sections below for more description of the configure_form() and reconfigure() methods.
NOTE: If you need to use auxiliary files like BLAST files, you can store the location of those files in the gbrowse .conf file under the stanza [YourPlugin:plugin]:
[YourPlugin:plugin] blast_path = /usr/local/blast/databases sub find { my $self = shift; my $segment = shift; # ignored my $blast_path = $self->browser_config->plugin_setting('blast_path'); # etc etc etc }
Return an arrayref containing the features found. Return an empty arrayref to indicate that no features were found. Return undef to indicate that the plugin declines to perform the search, in which case GBrowse will default to its own search algorithm.
You may also choose to merge your search results with GBrowse's. To do this, you can initiate the default search by calling:
$default_features = $self->db_search->search_features({-search_term => 'searchterm'})
Then do what you need to do to merge your customized search with the default terms.
All annotator plugins will need to override the method described in this section.
The reason that annotate() returns a Bio::Graphics::FeatureFile rather than an array of features the way that find() does is because Bio::Graphics::FeatureFile also allows you to set up how the features will be rendered; you can define tracks, assign different feature types to different tracks, and assign each feature type a glyph, color, and other options.
The annotate() function will also be passed a coordinate_mapper variable. This is a code ref to a function that will transform coordinates from relative to absolute coordinates. The function takes a reference sequence name and a list of [$start,$end] coordinate pairs, and returns a similar function result, except that the sequence name and coordinates are all in absolute coordinate space. Currently there are no plugins that make use of this facility.
See Bio::Graphics::FeatureFile for details, and the RestrictionAnnotator.pm plugin for an example.
To make the form interactive, you may wish to pepper the plugin's configuration form methods with calls to the javascript routine doPluginUpdate(). This causes GBrowse to update the plugin's configuration and refresh the tracks table as a side effect.
sub { my $feature = shift; return do_something() ? 1 : 0; }
The filter() method should return an updated string for the track key to indicate that the track is being filtered. This is to inform the user that the track is not showing all possible features.
The filter() method should return an empty list if it does not wish to install or filter, or to remove a filter that was previously installed.
The following methods can be called to retrieve data about the environment in which the plugin is running. These methods are also used by gbrowse to change the plugin state.
You will wish to implement this method if the plugin has user-modifiable settings.
NOTE ON FILEHANDLES: You are not allowed to permanently store a filehandle in the persistent configuration data structure because the session-handling code will try to serialize and store the filehandle, which is not allowed by the default serializer. If you must store a filehandle in the configuration data structure, be sure to delete it within the annotate(), find() or dump() methods once you are finished using it.
It is highly recommended that you use the CGI module to generate the fill-out form. In order to avoid clashing with other parts of gbrowse, plugin fill-out forms must respect a namespacing convention in which the name of each form field is preceded by the plugin package name and a dot. The package name is the last component of the plugin's package; for example "GoSearch" is the package name for Bio::Graphics::Browser2::Plugin::GoSearch. To represent the "query" field of the plugin named "GOSearch", the text field must be named "GOSearch.query".
To make this easier to do right, the Plugin module provides a method named config_name() which will add the prefix for you. Here is how to use it with the "query" example:
$html .= textfield(-name => $self->config_name('query'));
Remember that the form fields are namespaced. You may recover them using the CGI param() method by preceding them with the proper prefix. To make this easier to manage, this module provides a config_param() method that manages the namespaces transparently.
Here is a working example:
sub reconfigure { my $self = shift; my $current_configuration = $self->configuration; $current_configuration->{query} = $self->config_param('query'); }
All this does is to retrieve the current configuration by calling the configuration() method. The value of the "query" key is then replaced by a fill-out form parameter named "query", using config_param() instead of the more familiar CGI module's param() function.
Bio::Graphics::Browser
Lincoln Stein <lstein@cshl.org>.
Copyright (c) 2003 Cold Spring Harbor Laboratory
This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty.
2022-09-30 | perl v5.34.0 |