BioPerl code optimization
These are BioPerl modules which could use some help with code optimization. This may be range from something as simple as speeding up regular expression searches to refactoring code. Some of these are avoidable by following Bioperl Best Practices.
Contents |
Undesirable Perl artifacts
Use of the regular expression special variables ($`,$&,$',$+)
According to Perl documentation and Jeffrey Friedl (author of Mastering Regular Expressions), the following regular expression special variables are generally considered 'naughty,' in that they incur a significant performance hit:
$`(prematch)$&(match)$'(postmatch)$+(last bracket matched)$-(first bracket matched)
Use of any of these special variables should be avoided if at all possible. This performance hit occurs when using the code directly (via use or require) or indirectly ('isa' and 'has-a' relationships within a class). These can generally be replaced with capture variables, i.e. $1, $2, etc.
Modules which use one or more of these:
| Module | Variable used | Status |
|---|---|---|
$` |
Fixed in CVS | |
| Bio::Map::CytoPosition | $& |
Not fixed yet |
$& |
Fixed in CVS | |
$& |
Fixed in CVS |
Don't use 'return undef', use 'return'
Using 'return undef' will not always get you the results you expect.
From Perl.com: "Use return; instead of return undef; if you want to return nothing. If someone assigns the return value to an array, the latter creates an array of one value (undef), which evaluates to true. The former will correctly handle all contexts."
| Module | Line | Status |
|---|---|---|
| Bio::DB::Biblio::pdf | return undef; |
Fixed in CVS |
| Bio::DB::Biblio::pdf | return undef unless $link; |
Fixed in CVS |
| Bio::DB::Biblio::pdf | return undef; |
Fixed in CVS |
| Bio::DB::Biblio::eutils | return undef; |
Fixed in CVS |
| Bio::DB::WebDBSeqI | return undef if ( !defined $self->ua || !defin |
Fixed in CVS |
| Bio::Tools::Run::RemoteBlast | return undef if ( !defined $self->ua |
Fixed in CVS |
| Bio::FeatureIO::gff | return undef if $self->fasta_mode(); |
Fixed in CVS |
| Bio::Root::IOManager | return undef unless -e $file; |
Fixed in CVS |
| Bio::Root::Object | return undef unless defined $self->{'_err'}; |
Fixed in CVS |
Always use BioPerl exception handling
BioPerl has a built-in error-handling system, detailed in Advanced BioPerl, which greatly enhances BioPerl debugging. There are several advantages to using this system: it provides a full trace stack when an error is thrown, the level of verbosity and strictness can be varied for any BioPerl object by using $obj->verbose(), and it provides more flexible error handling framework when working with classes. Additionally, you have the option of propogating the level of verbosity to internal objects by passing the parameter 'verbose => $self->verbose()'.
In short, use the following replacements:
| Perlish | BioPerlish |
|---|---|
die 'Arghhh!'; |
$self->throw('Arghhh!');
|
warn 'Watch out!'; |
$self->warn('Watch out!');
|
print STDERR "Foobar : $foobar"; |
$self->debug("Foobar : $foobar");
|
The following modules violate these rules to some degree!
| Module | Line |
|---|---|
| Bio::Graphics::Glyph | my $feature = $arg{-feature} or die "No featur
|
| Bio::Graphics::Glyph::image | open F,$path or die "Can't open $path
|
| Bio::Graphics::Panel | open (F,">$imagefile") || die("Can't open imag
|
| Bio::Phenotype::OMIM::OMIMparser | if ( ! defined( $description ) )
|
| Bio::Phenotype::OMIM::OMIMparser | if ( ! defined( $mutation ) ) {
|
| Bio::LiveSeq::Chain | die "_praepostinsert_array: Something went ve
|
Don't use the Carp module - use BioPerl exception handling
Instead of the following Carp:: functions, $self->throw an appropriate Bio::Root::Exception or use $self->warn.
carp - warn of errors (from perspective of caller) cluck - warn of errors with stack backtrace croak - die of errors (from perspective of caller) confess - die of errors with stack backtrace shortmess - return the message that carp and croak produce longmess - return the message that cluck and confess produce
Here are the current violaters -- Torsten 17:26, 22 September 2006 (EDT) :
Various code inconsistencies
These are sort of a catch-all. Thanks Torsten!
"FIXME"
| Bio::AlignIO::po | not fixed yet |
| |
FIXED |
| Bio::FeatureIO::gff | not fixed yet |
| Bio::Ontology::RelationshipType | not fixed yet |
| Bio::SeqIO::kegg | not fixed yet |
| Bio::SeqIO::swiss | not fixed yet |
| Bio::Tools::ESTScan | not fixed yet |
| Bio::Tools::Est2Genome | not fixed yet |
| Bio::Tools::GuessSeqFormat | not fixed yet |
| Bio::Tools::HMMER::Results | not fixed yet |
"???"
| Module | Line | Status |
|---|---|---|
| Bio::Variation::VariantI | $self->allele_mut($value); #???? |
not fixed yet |
| Bio::DB::Biblio::soap | use Bio::Biblio; # TBD:?? WHY SHOULD I DO THIS |
FIXED |
| Bio::DB::GFF::Adaptor::dbi::oracleace | # then generate a bogus Homolo |
not fixed yet |
| Bio::DB::GFF::Adaptor::dbi::mysqlace | # then generate a bogus Homolog |
not fixed yet |
| Bio::SeqFeature::Annotated | Args :??? |
not fixed yet |
| Bio::SeqFeature::Tools::Unflattener | # what should w |
not fixed yet |
| Bio::SeqFeature::Tools::IDHandler | # warn?? |
not fixed yet |
| Bio::Root::IO | $ROOTDIR = ""; # what is reasonable?? |
not fixed yet |
| Bio::LiveSeq::Chain | # *??* create hash2dchain ???? (m:# **????** how |
not fixed yet |
"TODO"
| Module | Line | Status |
|---|---|---|
| Bio::Root::Root | # TODO: Fix the MSG: line of the re-thrown err |
not fixed yet |
| Bio::Root::Storable | # TODO: add cleanup and unlink methods. For n |
not fixed yet |
| Bio::Seq::EncodedSeq | #TODO: finish all this |
not fixed yet |
| Bio::SeqFeature::Tools::Unflattener | # TODO - we ignore this |
not fixed yet |
| Bio::SeqFeature::Tools::Unflattener | # TODO - allow more |
not fixed yet |
| Bio::SeqFeature::Tools::Unflattener | ## features. TODO: P |
not fixed yet |
| Bio::SeqIO::game::gameWriter | #TODO: can't sequences also have database |
not fixed yet |
| Bio::SeqIO::chaos | # TODO |
not fixed yet |
| Bio::SeqIO::pir | # TODO - not processing SFS data |
not fixed yet |
| Bio::SeqIO::strider | # TODO: determine 'DNA Degenerate |
not fixed yet |
| Bio::Search::BlastUtils | # TODO: Account for strand/frame issue! |
not fixed yet |
"***"
| Module | Line | Status |
|---|---|---|
| Bio::Map::Physical | #*** why doesn't it call Bio::Map::Clone->new |
not fixed yet |
| Bio::Map::Physical | #*** why doesn't it call Bio::Map::FPCMarker-> |
not fixed yet |
| Bio::Map::Physical | #*** why doesn't it call Bio::Map::Contig->new |
not fixed yet |
| Bio::Map::PositionI | #*** should this be overridden from RangeI? |
not fixed yet |
| Bio::Matrix::PSM::SiteMatrix | #*** IUPACp values not actually u |
not fixed yet |
| Bio::Tree::TreeFunctionsI | #*** the algorithm here hasn't really b |
not fixed yet |
| Bio::SeqIO::agave | ***NOTE*** At the moment, not all of the tags are Bio/LiveSeq/Chain.pm |
not fixed yet |
| Bio::SeqIO::agave | # **** performance concerns |
not fixed yet |
| Bio::Map::LinkageMap | #*** what is this? what calls it? note that it s |
not fixed yet |
| Bio::Map::Marker | *** does not actually add this marker to the |
not fixed yet |
| Bio::Map::SimpleMap | *** does not actually add the element to th |
not fixed yet |
| Bio::Map::FPCMarker | *** This has nothing to do with an actual |
not fixed yet |
| Bio::Map::PositionI | #*** should this be overridden from RangeI? |
not fixed yet |
"Why?"
| Module | Line | Status |
|---|---|---|
| Bio::Search::Hit::PullHitI | # why does this method even exist?! |
not fixed yet |
| Bio::Search::Hit::PullHitI | # why does this method even exist?! |
not fixed yet |
| Bio::DB::Biblio::soap | use Bio::Biblio; # TBD: ?? WHY SHOULD I DO THIS |
not fixed yet |
| Bio::Graphics::Glyph::dot | # The can() method fails with GD::SVG. Why |
not fixed yet |
| Bio::SeqIO::bsml | # Need to kill object for following code to work... |
not fixed yet |
| Bio::SeqIO::tinyseq | foreach my $subatt(@$seqatt) { # why are there t |
not fixed yet |
| Bio::SeqIO::tinyseq | # NCBI puts refseq ids in TSeq_sid, others in |
not fixed yet |
| Bio::SeqIO::game::featHandler | # Why is CDS coordinate info saved a |
not fixed yet |
| Bio::SeqIO::swiss | # Um, why would this be anything else but PRT? |
not fixed yet |
| Bio::Taxonomy | # taxonomy - why would you be doing things this |
not fixed yet |
| Bio::Seq | # I can't remember why not delegating was ever deemed |
not fixed yet |
| Bio::Cluster::UniGene | # why does NCBI prepend a 'g' to its own |
not fixed yet |
| Bio::LiveSeq::IO::BioPerl | # why array from each_tag_value($qual) ? Whe |
not fixed yet |
| Bio::SearchIO::Writer::HSPTableWriter | # Don't know why this |
not fixed yet |
| Bio::SearchIO::Writer::ResultTableWriter | # Don't know why t |
not fixed yet |
| Bio::Tools::Alignment::Consed | Why was this developed like this? I was |
not fixed yet |
| Bio::Tools::Alignment::Consed | # if there is a member array (why woul |
not fixed yet |
| Bio::Map::Physical | #*** why doesn't it call Bio::Map::Clone->new ? |
not fixed yet |
| Bio::Map::Physical | #*** why doesn't it call Bio::Map::FPCMarker |
not fixed yet |
| Bio::Map::Physical | #*** why doesn't it call Bio::Map::Contig->new |
not fixed yet |
| Bio::SeqFeature::Primer | off from those of the idtdna web |
not fixed yet |
| Bio::SeqFeature::Primer | as primer3 does. Don't ask why, I never f |
not fixed yet |
| Bio::Seq::PrimaryQual | Returns: 1 for a valid sequence (WHY? Shouldn |
not fixed yet |
| Bio::Seq::PrimaryQual | Args : a scalar (any scalar, why PrimarySeq< |
not fixed yet |
"hack"
| Module | Line | Status |
|---|---|---|
| Bio::DB::Flat::BinarySearch | # is an awful hack - in reality Michele's Bio/DB/WebDBSeqI.pm |
not fixed yet |
| Bio::DB::Flat::BinarySearch | # sorry, but this is hacked in because of BioFetch |
not fixed yet |
| Bio::DB::SeqFeature::Store::GFF3Loader | # TEMPORARY HACKS TO SIMPLIFY |
not fixed yet |
| Bio::AlignIO::phylip | #if you use a version of phylip (hacked) tha |
not fixed yet |
| Bio::SearchIO::blast | # bl2seq hackiness... Not sure I lik |
not fixed yet |
| Bio::Tools::Sigcleave | ## a quick hack to make sure that we get the sc |
not fixed yet |
| Bio::Tools::Blast::HTML | # This is fine for yeast but not worm. This |
not fixed yet |
| Bio::Tools::Geneid | # then need to perform the hack of extract |
not fixed yet |
| Bio::Root::Utilities | # this is a quick hack to check for availabili Bio/Root/Err.pm: |
not fixed yet |
Various POD inconsistencies
Found using scripts and grep by Torsten.
"Complain to author"
Found by grep -ir 'complain to author' /cvs/bioperl-live/Bio
"#documentation needed"
- Bio/LiveSeq/ChainI.pm: #documentation needed
- Bio/LiveSeq/Repeat_Unit.pm: # documentation needed
- Bio/LiveSeq/Prim_Transcript.pm: # documentation needed
- Bio/LiveSeq/Chain.pm: #documentation needed
- Bio/LiveSeq/SeqI.pm: # documentation needed
- Bio/LiveSeq/Translation.pm: #documentation needed
- Bio/LiveSeq/Transcript.pm: # documentation needed
- Bio/LiveSeq/IO/Loader.pm: #documentation needed
- Bio/LiveSeq/Range.pm: # documentation needed
- Bio/LiveSeq/Repeat_Region.pm: # documentation needed
- Bio/LiveSeq/Gene.pm: # documentation needed
- Bio/LiveSeq/DNA.pm: # documentation needed
- Bio/LiveSeq/AARange.pm: #documentation needed
- Bio/LiveSeq/Exon.pm: # documentation needed
- Bio/LiveSeq/Intron.pm: # documentation needed
- Bio/SeqFeature/Gene/GeneStructureI.pm: #documentation needed
- Bio/SeqFeature/Gene/TranscriptI.pm: #documentation needed
POD NAME doesn't match .pm file
The output of the script maintenance/check_NAME.pl can be used to
check which modules don't have the correct NAME section in their POD.
Verified that all fixed in CVS. Torsten 18:26, 21 September 2006 (EDT)
- Bio::IdCollectionI
- Bio::Location::SplitLocationI
- Bio::Search::Result::PullResultI
- Bio::Search::HSP::HmmpfamHSP
- Bio::Search::Hit::HmmpfamHit
- Bio::Expression::FeatureGroup::FeatureGroupMas50
- Bio::Expression::FeatureSet::FeatureSetMas50
- Bio::DB::EUtilities::Cookie
- Bio::DB::GFF::Adaptor::berkeleydb
- Bio::DB::GFF::Adaptor::biofetch_oracle
- Bio::DB::GFF::Adaptor::dbi::pg_fts
- Bio::DB::GFF::Adaptor::memory::feature_serializer
- Bio::DB::SeqFeature::Store::bdb
- Bio::DB::SeqFeature::Store::DBI::Iterator
- Bio::Matrix::PSM::SiteMatrixI
- Bio::Matrix::PSM::ProtPsm
- Bio::Matrix::PSM::IO::psiblast
- Bio::Matrix::PSM::IO::transfac
- Bio::Matrix::PSM::IO::meme
- Bio::Graphics::Util
- Bio::Graphics::Glyph::ex
- Bio::Graphics::Glyph::three_letters
- Bio::Graphics::Glyph::arrow
- Bio::Graphics::Glyph::ruler_arrow
- Bio::Graphics::Glyph::flag
- Bio::Phenotype::Measure
- Bio::Phenotype::PhenotypeI
- Bio::Phenotype::Phenotype
- Bio::Phenotype::Correlate
- Bio::Phenotype::OMIM::MiniMIMentry
- Bio::Phenotype::OMIM::OMIMparser
- Bio::Phenotype::OMIM::OMIMentry
- Bio::Phenotype::OMIM::OMIMentryAllelicVariant
- Bio::SeqIO::qual
- Bio::SeqIO::genbank
- Bio::OntologyIO::simplehierarchy
- Bio::OntologyIO::InterProParser
- Bio::OntologyIO::soflat
- Bio::OntologyIO::dagflat
- Bio::OntologyIO::obo
- Bio::OntologyIO::goflat
- Bio::OntologyIO::Handlers::InterProHandler
- Bio::Tools::pICalculator
- Bio::Tools::ECnumber
- Bio::SeqFeature::Gene::GeneStructureI
- Bio::SeqFeature::Gene::Poly_A_site
- Bio::Seq::SeqFastaSpeedFactory
- Bio::Ontology::RelationshipI
- Bio::Ontology::TermI
- Bio::Ontology::InterProTerm
- Bio::Ontology::RelationshipType
- Bio::Ontology::OBOterm
- Bio::Ontology::OBOEngine
- Bio::Ontology::PathI
- Bio::Ontology::OntologyEngineI
- Bio::Ontology::Path
- Bio::Ontology::GOterm
- Bio::Ontology::Term
- Bio::Ontology::SimpleGOEngine
- Bio::Ontology::Relationship
- Bio::Ontology::SimpleGOEngine::GraphAdaptor
- Bio::Ontology::SimpleGOEngine::GraphAdaptor02
Still have "DESCRIPTION of Object" as "NAME" in POD
I've fixed all of these Torsten 19:43, 20 September 2006 (EDT)
- Bio::Annotation::DBLink
- Bio::DB::Expression
- Bio::Expression::Contact
- Bio::Expression::DataSet
- Bio::Expression::Platform
- Bio::Expression::Sample
- Bio::FeatureIO::bed
- Bio::FeatureIO::gff
- Bio::FeatureIO::interpro
- Bio::Search::Processor
- Bio::SearchIO::Writer::BSMLResultWriter
- Bio::SeqFeature::Gene::NC_Feature
- Bio::SeqFeature::Gene::Poly_A_site
- Bio::SeqIO::interpro
- Bio::SeqIO::locuslink
- Bio::Symbol::Alphabet
- Bio::Tools::FootPrinter
- Bio::Tools::Phylo::Molphy::Result
- Bio::Tools::Phylo::Molphy
- Bio::Tools::Phylo::Phylip::ProtDist
- Bio::Tools::Promoterwise
podchecker warnings and errors
Perl comes with a script called podchecker. Here is the output of the following command:
find /cvs/bioperl-live/Bio -name \*.pm -exec podchecker {} \;
- WARNING: multiple occurrence of link target 'a' at line - in file Bio/DB/GFF.pm
- WARNING: multiple occurrence of link target 'multi_id' at line - in file Bio/DB/EUtilities/elink.pm
- WARNING: multiple occurrence of link target 'method' at line - in file Bio/DB/GFF/Aggregator.pm
- WARNING: multiple occurrence of link target 'No' at line - in file Bio/DB/SeqFeature/Store.pm
- WARNING: multiple occurrence of link target 'NAME' at line - in file Bio/Graphics/Glyph/ex.pm
- WARNING: multiple occurrence of link target 'NAME' at line - in file Bio/Graphics/Glyph/three_letters.pm
- WARNING: multiple occurrence of link target 'NAME' at line - in file Bio/Graphics/Glyph/arrow.pm
- WARNING: multiple occurrence of link target 'NAME' at line - in file Bio/Graphics/Glyph/ruler_arrow.pm
- WARNING: multiple occurrence of link target 'NAME' at line - in file Bio/Graphics/Glyph/flag.pm
- WARNING: multiple occurrence of link target 'D_s' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_JukesCantor' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_n' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_s_var' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_n_var' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_Kimura' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_Tamura' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'D_TajimaNei' at line - in file Bio/Align/DNAStatistics.pm
- WARNING: multiple occurrence of link target 'run' at line - in file Bio/AnalysisI.pm
- WARNING: multiple occurrence of link target 'wait_for' at line - in file Bio/AnalysisI.pm
pod2html warnings and errors
Here is the output of the following command:
find /cvs/bioperl-live/Bio -name \*pm -exec pod2html {} 1> /dev/null \;
- Bio/Align/DNAStatistics.pm: cannot resolve L<aa_to_dna_aln> in paragraph 28.
- Bio/AlignIO.pm: cannot resolve L<perltie> in paragraph 66.
- Bio/Assembly/Contig.pm: cannot resolve L<Coordinate_Systems> in paragraph 114.
- Bio/ClusterIO.pm: cannot resolve L<perltie> in paragraph 29.
- Bio/DB/Biblio/pdf.pm: unknown pod directive in paragraph 29. ignoring.
- Bio/DB/DBFetch.pm: cannot resolve L<http:E<sol>E<sol>www.ebi.ac.ukE<sol>cgi-binE<sol>dbfetch> in paragraph 8.
- Bio/DB/Fasta.pm: cannot resolve L<bioperl> in paragraph 122.
- Bio/DB/GFF.pm: cannot resolve L<bioperl> in paragraph 844.
- Bio/DB/GFF/Adaptor/ace.pm: cannot resolve L<bioperl> in paragraph 8.
- Bio/DB/GFF/Adaptor/berkeleydb.pm: cannot resolve L<bioperl> in paragraph 34.
- Bio/DB/GFF/Adaptor/dbi.pm: cannot resolve L<bioperl> in paragraph 437.
- Bio/DB/GFF/Adaptor/dbi/caching_handle.pm: cannot resolve L<DBI> in paragraph 53.
- Bio/DB/GFF/Adaptor/dbi/caching_handle.pm: cannot resolve L<bioperl> in paragraph 53.
- Bio/DB/GFF/Adaptor/dbi/mysql.pm: cannot resolve L<bioperl> in paragraph 161.
- Bio/DB/GFF/Adaptor/dbi/mysqlace.pm: cannot resolve L<bioperl> in paragraph 8.
- Bio/DB/GFF/Adaptor/dbi/mysqlcmap.pm: cannot resolve L<bioperl> in paragraph 182.
- Bio/DB/GFF/Adaptor/dbi/mysqlopt.pm: cannot resolve L<bioperl> in paragraph 8.
- Bio/DB/GFF/Adaptor/dbi/oracleace.pm: cannot resolve L<bioperl> in paragraph 8.
- Bio/DB/GFF/Adaptor/dbi/pg_fts.pm: cannot resolve L<mailto:bioperl-l@lists.open-bio.org> in paragraph 45.
- Bio/DB/GFF/Adaptor/dbi/pg_fts.pm: cannot resolve L<mailto:gmod-gbrowse@lists.sourceforge.net> in paragraph 45.
- Bio/DB/GFF/Adaptor/memory.pm: cannot resolve L<bioperl> in paragraph 19.
- Bio/DB/GFF/Featname.pm: cannot resolve L<bioperl> in paragraph 44.
- Bio/DB/GFF/Feature.pm: cannot resolve L<bioperl> in paragraph 295.
- Bio/DB/GFF/Homol.pm: cannot resolve L<bioperl> in paragraph 28.
- Bio/DB/GFF/RelSegment.pm: cannot resolve L<bioperl> in paragraph 248.
- Bio/DB/GFF/Segment.pm: cannot resolve L<bioperl> in paragraph 229.
- Bio/DB/GFF/Typename.pm: cannot resolve L<bioperl> in paragraph 48.
- Bio/DB/RefSeq.pm: cannot resolve L<http:E<sol>E<sol>www.ebi.ac.ukE<sol>cgi-binE<sol>dbfetch> in paragraph 14.
- Bio/DB/SeqFeature.pm: cannot resolve L<bioperl> in paragraph 104.
- Bio/DB/SeqFeature/NormalizedFeature.pm: cannot resolve L<bioperl> in paragraph 147.
- Bio/DB/SeqFeature/NormalizedFeatureI.pm: cannot resolve L<bioperl> in paragraph 13.
- Bio/DB/SeqFeature/NormalizedTableFeatureI.pm: cannot resolve L<bioperl> in paragraph 13.
- Bio/DB/SeqFeature/Segment.pm: cannot resolve L<bioperl> in paragraph 117.
- Bio/DB/SeqFeature/Store.pm: cannot resolve L<bioperl> in paragraph 536.
- Bio/DB/SeqFeature/Store/GFF3Loader.pm: cannot resolve L<bioperl> in paragraph 230.
- Bio/DB/SeqFeature/Store/berkeleydb.pm: cannot resolve L<bioperl> in paragraph 214.
- Bio/DB/SeqFeature/Store/memory.pm: cannot resolve L<bioperl> in paragraph 114.
- Bio/FeatureIO.pm: cannot resolve L<perltie> in paragraph 55.
- Bio/FeatureIO/ptt.pm: unexpected =item directive in paragraph 10. ignoring.
- Bio/FeatureIO/ptt.pm: unknown pod directive '=back' in paragraph 20. ignoring.
- Bio/FeatureIO/ptt.pm: unknown pod directive '=over' in paragraph 9. ignoring.
- Bio/FeatureIO/ptt.pm: unterminated list at =head in paragraph 21. ignoring.
- Bio/Graphics.pm: cannot resolve L<GD> in paragraph 21.
- Bio/Graphics/Feature.pm: cannot resolve L<GD> in paragraph 90.
- Bio/Graphics/FeatureBase.pm: cannot resolve L<GD> in paragraph 87.
- Bio/Graphics/Glyph.pm: cannot resolve L<OPTIONS> in paragraph 214.
- Bio/Graphics/Glyph/alignment.pm: cannot resolve L<GD> in paragraph 36.
- Bio/Graphics/Glyph/anchored_arrow.pm: cannot resolve L<GD> in paragraph 44.
- Bio/Graphics/Glyph/arrow.pm: cannot resolve L<GD> in paragraph 111.
- Bio/Graphics/Glyph/box.pm: cannot resolve L<GD> in paragraph 32.
- Bio/Graphics/Glyph/broken_line.pm: cannot resolve L<GD> in paragraph 38.
- Bio/Graphics/Glyph/cds.pm: cannot resolve L<GD> in paragraph 96.
- Bio/Graphics/Glyph/christmas_arrow.pm: cannot resolve L<GD> in paragraph 31.
- Bio/Graphics/Glyph/crossbox.pm: cannot resolve L<GD> in paragraph 32.
- Bio/Graphics/Glyph/dashed_line.pm: cannot resolve L<GD> in paragraph 27.
- Bio/Graphics/Glyph/diamond.pm: cannot resolve L<GD> in paragraph 37.
- Bio/Graphics/Glyph/dna.pm: cannot resolve L<GD> in paragraph 74.
- Bio/Graphics/Glyph/dot.pm: cannot resolve L<GD> in paragraph 39.
- Bio/Graphics/Glyph/dumbbell.pm: cannot resolve L<GD> in paragraph 69.
- Bio/Graphics/Glyph/ellipse.pm: cannot resolve L<GD> in paragraph 31.
- Bio/Graphics/Glyph/ex.pm: cannot resolve L<GD> in paragraph 35.
- Bio/Graphics/Glyph/extending_arrow.pm: cannot resolve L<GD> in paragraph 15.
- Bio/Graphics/Glyph/flag.pm: cannot resolve L<GD> in paragraph 29.
- Bio/Graphics/Glyph/gene.pm: cannot resolve L<GD> in paragraph 56.
- Bio/Graphics/Glyph/generic.pm: cannot resolve L<GD> in paragraph 129.
- Bio/Graphics/Glyph/graded_segments.pm: cannot resolve L<GD> in paragraph 56.
- Bio/Graphics/Glyph/heterogeneous_segments.pm: cannot resolve L<GD> in paragraph 43.
- Bio/Graphics/Glyph/image.pm: cannot resolve L<GD> in paragraph 83.
- Bio/Graphics/Glyph/lightning.pm: cannot resolve L<GD> in paragraph 39.
- Bio/Graphics/Glyph/line.pm: cannot resolve L<GD> in paragraph 35.
- Bio/Graphics/Glyph/merged_alignment.pm: cannot resolve L<GD> in paragraph 77.
- Bio/Graphics/Glyph/oval.pm: cannot resolve L<GD> in paragraph 29.
- Bio/Graphics/Glyph/pentagram.pm: cannot resolve L<GD> in paragraph 36.
- Bio/Graphics/Glyph/pinsertion.pm: cannot resolve L<GD> in paragraph 26.
- Bio/Graphics/Glyph/primers.pm: cannot resolve L<GD> in paragraph 30.
- Bio/Graphics/Glyph/processed_transcript.pm: cannot resolve L<GD> in paragraph 72.
- Bio/Graphics/Glyph/protein.pm: cannot resolve L<GD> in paragraph 66.
- Bio/Graphics/Glyph/ragged_ends.pm: cannot resolve L<GD> in paragraph 41.
- Bio/Graphics/Glyph/redgreen_box.pm: cannot resolve L<GD> in paragraph 40.
- Bio/Graphics/Glyph/redgreen_segment.pm: cannot resolve L<GD> in paragraph 33.
- Bio/Graphics/Glyph/repeating_shape.pm: cannot resolve L<GD> in paragraph 25.
- Bio/Graphics/Glyph/rndrect.pm: cannot resolve L<GD> in paragraph 21.
- Bio/Graphics/Glyph/ruler_arrow.pm: cannot resolve L<GD> in paragraph 67.
- Bio/Graphics/Glyph/saw_teeth.pm: cannot resolve L<GD> in paragraph 21.
- Bio/Graphics/Glyph/segmented_keyglyph.pm: cannot resolve L<GD> in paragraph 16.
- Bio/Graphics/Glyph/segments.pm: cannot resolve L<GD> in paragraph 117.
- Bio/Graphics/Glyph/so_transcript.pm: cannot resolve L<GD> in paragraph 16.
- Bio/Graphics/Glyph/span.pm: cannot resolve L<GD> in paragraph 21.
- Bio/Graphics/Glyph/splice_site.pm: cannot resolve L<GD> in paragraph 21.
- Bio/Graphics/Glyph/text_in_box.pm: cannot resolve L<GD> in paragraph 31.
- Bio/Graphics/Glyph/three_letters.pm: cannot resolve L<GD> in paragraph 32.
- Bio/Graphics/Glyph/tic_tac_toe.pm: cannot resolve L<GD> in paragraph 25.
- Bio/Graphics/Glyph/toomany.pm: cannot resolve L<GD> in paragraph 21.
- Bio/Graphics/Glyph/track.pm: cannot resolve L<GD> in paragraph 20.
- Bio/Graphics/Glyph/transcript.pm: cannot resolve L<GD> in paragraph 45.
- Bio/Graphics/Glyph/transcript2.pm: cannot resolve L<GD> in paragraph 50.
- Bio/Graphics/Glyph/translation.pm: cannot resolve L<GD> in paragraph 103.
- Bio/Graphics/Glyph/triangle.pm: cannot resolve L<GD> in paragraph 28.
- Bio/Graphics/Glyph/two_bolts.pm: cannot resolve L<GD> in paragraph 33.
- Bio/Graphics/Glyph/wave.pm: cannot resolve L<GD> in paragraph 27.
- Bio/Graphics/Glyph/weighted_arrow.pm: cannot resolve L<GD> in paragraph 32.
- Bio/Graphics/Panel.pm: cannot resolve L<GD> in paragraph 470.
- Bio/Restriction/Enzyme.pm: cannot resolve L<non_ambiguous_length> in paragraph 188.
- Bio/Search/Hit/GenericHit.pm: cannot resolve L<expect()|expect> in paragraph 130.
- Bio/Search/Hit/GenericHit.pm: cannot resolve L<signif()|signif> in paragraph 130.
- Bio/Search/Hit/HMMERHit.pm: cannot resolve L<hsp()|hsp> in paragraph 75.
- Bio/Search/Hit/HMMERHit.pm: cannot resolve L<score()|score> in paragraph 67.
- Bio/Search/Hit/HitI.pm: cannot resolve L<expect()|expect> in paragraph 123.
- Bio/Search/Hit/HitI.pm: cannot resolve L<frac_aligned_hit()|frac_aligned_hit> in paragraph 133.
- Bio/Search/Hit/HitI.pm: cannot resolve L<frac_aligned_query()|frac_aligned_query> in paragraph 133.
- Bio/Search/Hit/HitI.pm: cannot resolve L<signif()|signif> in paragraph 123.
- Bio/Search/Hit/HmmpfamHit.pm: cannot resolve L<num_hsps> in paragraph 74.
- Bio/Search/Hit/PullHitI.pm: cannot resolve L<expect()|expect> in paragraph 139.
- Bio/Search/Hit/PullHitI.pm: cannot resolve L<signif()|signif> in paragraph 139.
- Bio/Search/Result/HMMERResult.pm: cannot resolve L<next_models> in paragraph 9.
- Bio/Search/SearchUtils.pm: cannot resolve L<_adjust_contigs> in paragraph 16.
- Bio/SearchIO/Writer/HTMLResultWriter.pm: cannot resolve L<remote_database> in paragraph 75.
- Bio/SearchIO/Writer/HTMLResultWriter.pm: cannot resolve L<remote_database> in paragraph 84.
- Bio/Seq/MetaI.pm: cannot resolve L<names_submeta> in paragraph 14.
- Bio/Seq/Quality.pm: cannot resolve L<force_flush> in paragraph 26.
- Bio/SeqFeature/SiRNA/Oligo.pm: cannot resolve L< perl> in paragraph 14.
- Bio/SeqFeature/SiRNA/Pair.pm: cannot resolve L< perl> in paragraph 14.
- Bio/SeqIO.pm: cannot resolve L<perltie> in paragraph 75.
- Bio/SeqIO/embl.pm: cannot resolve L<annotation()|annotation> in paragraph 23.
- Bio/SeqIO/genbank.pm: cannot resolve L<annotation()|annotation> in paragraph 22.
- Bio/SeqIO/swiss.pm: cannot resolve L<annotation()|annotation> in paragraph 23.
- Bio/SeqIO/tinyseq.pm: cannot resolve L< perl> in paragraph 22.
- Bio/SeqIO/tinyseq/tinyseqHandler.pm: cannot resolve L< perl> in paragraph 22.
- Bio/Structure/IO.pm: cannot resolve L<perltie> in paragraph 56.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<get_contigs()|get_contigs> in paragraph 102.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<get_contigs()|get_contigs> in paragraph 107.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<get_contigs()|get_contigs> in paragraph 92.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<get_contigs()|get_contigs> in paragraph 97.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<get_quality_array()|get_quality_array> in paragraph 81.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<get_quality_scalar()|get_quality_scalar> in paragraph 75.
- Bio/Tools/Alignment/Consed.pm: cannot resolve L<sum_lets()|sum_lets> in paragraph 214.
- Bio/Tools/Blast/HSP.pm: cannot resolve L<Links:> in paragraph 22.
- Bio/Tools/CodonTable.pm: cannot resolve L<translate> in paragraph 23.
- Bio/Tools/RestrictionEnzyme.pm: cannot resolve L<_make_custom()|_make_custom> in paragraph 85.
- Bio/Tools/RestrictionEnzyme.pm: cannot resolve L<_make_custom> in paragraph 69.
- Bio/Tools/RestrictionEnzyme.pm: cannot resolve L<_make_standard()|_make_standard> in paragraph 85.
- Bio/Tools/RestrictionEnzyme.pm: cannot resolve L<_make_standard> in paragraph 69.
- Bio/Tools/Run/RemoteBlast.pm: cannot resolve L<FEEDBACK> in paragraph 32.
- Bio/Tools/SiRNA.pm: cannot resolve L< perl> in paragraph 27.
- Bio/Tools/SiRNA/Ruleset/saigo.pm: cannot resolve L< perl> in paragraph 29.
- Bio/Tools/SiRNA/Ruleset/tuschl.pm: cannot resolve L< perl> in paragraph 19.
- Bio/Variation/IO.pm: cannot resolve L<perltie> in paragraph 66.
- Bio/Variation/IO/xml.pm: cannot resolve L<http:E<sol>E<sol>www.ebi.ac.ukE<sol>mutationsE<sol>DTDE<sol>seqDiff.dtd> in paragraph 9.
- no title for Bio/DB/EUtilities/ElinkData.pm.
- no title for Bio/DB/GFF/Adaptor/memory/feature_serializer.pm.
- no title for Bio/DB/SeqFeature/Store/DBI/Iterator.pm.
- no title for Bio/Expression/FeatureGroup/FeatureGroupMas50.pm.
- no title for Bio/Expression/FeatureSet/FeatureSetMas50.pm.
- no title for Bio/Index/Hmmer.pm.
- no title for Bio/Matrix/PSM/PsmHeaderI.pm.
- no title for Bio/OntologyIO/Handlers/BaseSAXHandler.pm.
- no title for Bio/PopGen/HtSNP.pm.
- no title for Bio/Search/HSP/HmmpfamHSP.pm.