Raw content of Bio::EnsEMBL::Analysis::RunnableDB::Pseudogene_DB # You may distribute this module under the same terms as perl itself # # POD documentation - main docs before the code =pod =head1 NAME Bio::EnsEMBL::Analysis::RunnableDB::Pseudogene_DB.pm =head1 SYNOPSIS my $runnabledb = Bio::EnsEMBL::Analysis::RunnableDB::Pseudogene_DB->new( -db => $db_adaptor, -input_id => $slice_id, -analysis => $analysis, ); $runnabledb->fetch_input(); $runnabledb->run(); my @array = @{$runnabledb->output}; $runnabledb->write_output(); =head1 DESCRIPTION This object wraps Bio::EnsEMBL::Analysis::Runnable::Pseudogene.pm Opens connections to 2 dbs: 1 for repeat sequences (GB_DB) 1 for fetching genes from (GB_FINAL) fetches all the genes on the slice, all the repeats associtaed with each gene and collects alignment feature evidence for single exon genes and passes them to the runnable. This module forms the base class of the pseudogene analysis for the gene build, it will identify obvious pseudogenes but will also flag genes that look interesting for analysis by either: Bio::EnsEMBL::Analysis::RunnableDB::Spliced_elsewhere or Bio::EnsEMBL::Analysis::RunnableDB::PSILC PSILC will work on any gene with a PFAM domain and will attempt to predict if it is a pseudogene - it underpredicts pseudogenes but is useful for sequences that look dodgy but have no overt evidence of being pseudogenes. Spliced_elsewhere tests for retrotransposition and tends to be run over single exon genes. Configuration for all three of these modules is here: zBio::EnsEMBL::Analysis::Config::Pseudogene =head1 CONTACT Post questions to the Ensembl development list: ensembl-dev@ebi.ac.uk =head1 APPENDIX =cut package Bio::EnsEMBL::Analysis::RunnableDB::Pseudogene_DB; use strict; use Bio::EnsEMBL::Analysis::Runnable::Pseudogene; use Bio::EnsEMBL::DBSQL::DBConnection; use Bio::EnsEMBL::Pipeline::DBSQL::FlagAdaptor; use Bio::EnsEMBL::Pipeline::Flag; use Bio::EnsEMBL::Analysis::Config::Databases qw(DATABASES DNA_DBNAME); use Bio::EnsEMBL::Analysis::Config::Pseudogene; use Bio::EnsEMBL::Analysis::RunnableDB::BaseGeneBuild; use Bio::EnsEMBL::Utils::Exception qw(verbose throw warning stack_trace); use Bio::EnsEMBL::Utils::Argument qw( rearrange ); use vars qw(@ISA); @ISA = qw(Bio::EnsEMBL::Analysis::RunnableDB::BaseGeneBuild); sub new { my ($class,@args) = @_; my $self = $class->SUPER::new(@args); $self->read_and_check_config($PSEUDOGENE_CONFIG_BY_LOGIC); return $self; } =head2 fetch_input Title : fetch_input Usage : $self->fetch_input Function: Fetches input data for Pseudogene.pm from the database Returns : none Args : none =cut sub fetch_input { my( $self) = @_; throw("No input id") unless defined($self->input_id); my $results = []; # array ref to store the output my %repeat_blocks; my %homolog_hash; my @transferred_genes; print "Loading reference database : REFERENCE_DB.\n"; my $rep_db = $self->get_dbadaptor("REFERENCE_DB") ; #store repeat db internally $self->rep_db($rep_db); my $rsa = $rep_db->get_SliceAdaptor; print "Loading genes database : PS_INPUT_DATABASE => ". $self->PS_INPUT_DATABASE." ( defined in Databases.pm ) \n"; my $genes_db = $self->get_dbadaptor($self->PS_INPUT_DATABASE) ; $self->gene_db($genes_db); #genes are written to the pseudogene database # genes_slice holds all genes on input id slice my $genedb_sa = $self->gene_db->get_SliceAdaptor; print "DB NAME: ".$self->db->dbc->dbname."\n"; my $genes_slice = $genedb_sa->fetch_by_name($self->input_id); $self->query($genes_slice); my $genes = $genes_slice->get_all_Genes; print $genes_slice->name."\t". $genes_slice->start."\n"; GENE: foreach my $gene (@{$genes}) { # Ignore all other biotypes of genes that are not protein_coding # these genes will still be written to PS_OUTPUT_DATABASE - unless you set # PS_DO_NOT_WRITE_IGNORED_GENES = 0 # unless ( $gene->biotype eq $self->PS_BIOTYPE ) { $self->ignored_genes($gene); next GENE; } ############################################################################ # transfer gene coordinates to entire chromosome to prevent problems arising # due to offset with repeat features my $chromosome_slice = $rsa->fetch_by_region( 'toplevel', $genes_slice->chr_name, ); my $transferred_gene = $gene->transfer($chromosome_slice); $self->lazy_load($transferred_gene); push @transferred_genes,$transferred_gene; # repeats come from core database # repeat slice only covers gene to avoid sorting repeats unnecessarily my $rep_gene_slice = $rsa->fetch_by_region( 'toplevel', $genes_slice->chr_name, $transferred_gene->start, $transferred_gene->end, ); # get repeat blocks my @feats = @{$rep_gene_slice->get_all_RepeatFeatures}; @feats = map { $_->transfer($chromosome_slice) } @feats; my $blocks = $self->get_all_repeat_blocks(\@feats); # make hash of repeat blocks using the gene as the key $repeat_blocks{$transferred_gene} = $blocks; } $self->genes(\@transferred_genes); $self->repeat_blocks(\%repeat_blocks); $self->make_runnable; return 1; } sub make_runnable { my ($self) = @_; my $runnable = Bio::EnsEMBL::Analysis::Runnable::Pseudogene->new ( -analysis => $self->analysis, -genes => $self->genes, -repeat_features => $self->repeat_blocks, -PS_REPEAT_TYPES => $self->PS_REPEAT_TYPES, -PS_FRAMESHIFT_INTRON_LENGTH => $self->PS_FRAMESHIFT_INTRON_LENGTH, -PS_MAX_INTRON_LENGTH => $self->PS_MAX_INTRON_LENGTH, -PS_MAX_INTRON_COVERAGE => $self->PS_MAX_INTRON_COVERAGE, -PS_MAX_EXON_COVERAGE => $self->PS_MAX_EXON_COVERAGE, -PS_NUM_FRAMESHIFT_INTRONS => $self->PS_NUM_FRAMESHIFT_INTRONS, -PS_NUM_REAL_INTRONS => $self->PS_NUM_REAL_INTRONS, -SINGLE_EXON => $self->SINGLE_EXON, -INDETERMINATE => $self->INDETERMINATE, -PS_MIN_EXONS => $self->PS_MIN_EXONS, -PS_MULTI_EXON_DIR => $self->PS_MULTI_EXON_DIR, -BLESSED_BIOTYPES => $self->BLESSED_BIOTYPES, -PS_PSEUDO_TYPE => $self->PS_PSEUDO_TYPE, -PS_BIOTYPE => $self->PS_BIOTYPE, -PS_REPEAT_TYPE => $self->PS_REPEAT_TYPE, -DEBUG => $self->DEBUG, ); $self->runnable($runnable); } =head2 get_all_repeat_blocks Args : none Description: merges repeats into blocks for each gene Returntype : array of Seq_Feature blocks; =cut sub get_all_repeat_blocks { my ($self,$repeat_ref) = @_; my @repeat_blocks; my @repeats = @{$repeat_ref}; @repeats = sort {$a->start <=> $b->start} @repeats; my $curblock = undef; REPLOOP: foreach my $repeat (@repeats) { my $rc = $repeat->repeat_consensus; my $use = 0; foreach my $type (@{$self->PS_REPEAT_TYPES}){ if ($rc->repeat_class =~ /$type/) { $use = 1; last; } } next REPLOOP unless $use; if ($repeat->start <= 0) { $repeat->start(1); } if (defined($curblock) && $curblock->end >= $repeat->start) { if ($repeat->end > $curblock->end) { $curblock->end($repeat->end); } } else { $curblock = Bio::EnsEMBL::Feature->new( -START => $repeat->start, -END => $repeat->end, -STRAND => $repeat->strand ); push (@repeat_blocks,$curblock); } } @repeat_blocks = sort {$a->start <=> $b->start} @repeat_blocks; return\@repeat_blocks; } =head2 write_output Args : none description: writes gene array into db specified in Bio::EnsEMBL::Config::GeneBuild::Databases.pm exception : warns if it cannot write gene Returntype : none =cut sub write_output { my($self) = @_; my $genes = $self->output; if ( $self->PS_WRITE_IGNORED_GENES == 1 ) { print "writing ignored genes\n" ; push @{$genes},@{$self->ignored_genes} if $self->ignored_genes; } my %feature_hash; # empty_Analysis_cache(); # write genes out to a different database from the one we read genes from. my $db = $self->get_dbadaptor($self->PS_OUTPUT_DATABASE) ; #now using Analysis:Databases print "Writing to database PS_OUTPUT_DATABASE : " . $self->PS_OUTPUT_DATABASE . "\n"; # sort out analysis my $analysis = $self->analysis; unless ($analysis){ throw("an analysis logic name must be defined in the command line"); } my $gene_adaptor = $db->get_GeneAdaptor; foreach my $gene (@{$genes}) { # store gene eval { $gene_adaptor->store($self->lazy_load($gene)); }; if ( $@ ) { warning("UNABLE TO WRITE GENE:\n$@"); } } return 1; } =head2 run Args : none Description: overrides runnableDb run method to allow gene objects to be validated before runnning the runnable Returntype : scalar =cut sub run { my ($self) = @_; foreach my $runnable (@{$self->runnable}) { throw("Runnable module not set") unless ($runnable->isa("Bio::EnsEMBL::Analysis::Runnable")); $runnable->run(); $self->output($runnable->output); if ($self->SINGLE_EXON){ $self->store_ids($runnable->single_exon_genes,$self->SPLICED_ELSEWHERE_LOGIC_NAME); } if ($self->INDETERMINATE){ $self->store_ids($runnable->indeterminate_genes,$self->PSILC_LOGIC_NAME); } } return 0; } =head2 store_ids Arg [none] : Description: stores gene dbIDS of genes being held back for further analyses Returntype : scalar Exceptions : throws if it cannot open the file Caller : general =cut sub store_ids { my ($self, $id_list,$analysis_name) = @_; my $flag_adaptor = Bio::EnsEMBL::Pipeline::DBSQL::FlagAdaptor->new($self->db); my $analysis_adaptor = $self->db->get_AnalysisAdaptor; my $analysis = $analysis_adaptor->fetch_by_logic_name($analysis_name); unless ($analysis) { throw( "analysis " . $analysis_name . " can't be found in " . $self->db->dbname ." @ " . $self->db->host. "\n") ; } # What do you do if the analysis thing isnt found? return 0 unless (scalar(@{$id_list} >0)); foreach my $id(@{$id_list}){ my $flag = Bio::EnsEMBL::Pipeline::Flag->new( '-type' => 'gene', '-ensembl_id' => $id, '-goalAnalysis' => $analysis, ); $flag_adaptor->store($flag); } return; } =head2 lazy_load Arg [1] : Bio::EnsEMBL::Gene Description: forces lazy loading of transcripts etc.s Returntype : Bio::EnsEMBL::Gene Exceptions : none Caller : general =cut sub lazy_load { my ($self, $gene) = @_; if ($gene){ unless ($gene->isa("Bio::EnsEMBL::Gene")){ throw("gene is not a Bio::EnsEMBL::Gene, it is a $gene"); } foreach my $trans(@{$gene->get_all_Transcripts}){ my $transl = $trans->translation; $trans->get_all_supporting_features() ; if ($transl){ $transl->get_all_ProteinFeatures; } } } return $gene; } =head2 remove_transcript_from_gene Args : Bio::EnsEMBL::Gene object , Bio::EnsEMBL::Transcript object Description: steves method for removing unwanted transcripts from genes Returntype : scalar =cut sub _remove_transcript_from_gene { my ($self, $gene, $trans_to_del) = @_; # check to see if it is a blessed transcript first return 'BLESSED' if $self->BLESSED_BIOTYPES->{$trans_to_del->biotype}; my @newtrans; foreach my $trans (@{$gene->get_all_Transcripts}) { if ($trans != $trans_to_del) { push @newtrans,$trans; } } # The naughty bit! $gene->{_transcript_array} = []; foreach my $trans (@newtrans) { $gene->add_Transcript($trans); } return; } =head2 transcript_to_keep Args : Bio::EnsEMBL::Transcript object Description: removes the translation provided it is not a blessed transcript Returntype : scalar =cut sub transcript_to_keep { my ($self, $trans_to_keep) = @_; return if $self->BLESSED_BIOTYPES->{$trans_to_keep->biotype}; $trans_to_keep->translation(undef); return; } ############################################################################ # container methods =head2 gene_db Arg [1] : Bio::EnsEMBL::DBSQL::DBAdaptor Description: get/set gene db adaptor Returntype : Bio::EnsEMBL::DBSQL::DBAdaptor Exceptions : none Caller : general =cut sub gene_db { my ($self, $gene_db) = @_; if ($gene_db){ unless ($gene_db->isa("Bio::EnsEMBL::DBSQL::DBAdaptor")){ throw("gene db is not a Bio::EnsEMBL::DBSQL::DBAdaptor, it is a $gene_db"); } $self->{'_gene_db'} = $gene_db; } return $self->{'_gene_db'}; } =head2 rep_db Arg [1] : Bio::EnsEMBL::DBSQL::DBAdaptor Description: get/set gene db adaptor Returntype : Bio::EnsEMBL::DBSQL::DBAdaptor Exceptions : none Caller : general =cut sub rep_db { my ($self, $rep_db) = @_; if ($rep_db){ unless ($rep_db->isa("Bio::EnsEMBL::DBSQL::DBAdaptor")){ throw("gene db is not a Bio::EnsEMBL::DBSQL::DBAdaptor, it is a $rep_db"); } $self->{'_rep_db'} = $rep_db; } return $self->{'_rep_db'}; } =head2 genes Arg [1] : array ref Description: get/set genescript set to run over Returntype : array ref to Bio::EnsEMBL::Gene objects Exceptions : throws if not a Bio::EnsEMBL::Gene Caller : general =cut sub genes { my ($self, $genes) = @_; if ($genes) { foreach my $gene (@{$genes}) { unless ($gene->isa("Bio::EnsEMBL::Gene")){ throw("Input isn't a Bio::EnsEMBL::Gene, it is a $gene\n$@"); } } $self->{'_genes'} = $genes; } return $self->{'_genes'}; } =head2 repeat_blocks Arg [1] : array ref Description: get/set genescript set to run over =cut sub repeat_blocks { my ($self, $val) = @_; if (defined $val) { $self->{_repeat_blocks} = $val; } return $self->{_repeat_blocks}; } =head2 pseudo_genes Arg [1] : Bio::EnsEMBL::Gene Description: get/set for pseudogenes Returntype : Bio::EnsEMBL::Gene Exceptions : none Caller : general =cut sub pseudo_genes { my ($self, $pseudo_gene) = @_; if ($pseudo_gene) { unless ($pseudo_gene->isa("Bio::EnsEMBL::Gene")){ throw("pseudo gene is not a Bio::EnsEMBL::Gene, it is a $pseudo_gene"); } push @{$self->{'_pseudo_gene'}},$self->lazy_load($pseudo_gene); } return $self->{'_pseudo_gene'}; } =head2 real_genes Arg [1] : Bio::EnsEMBL::Gene Description: get/set for 'functional' genes Returntype : Bio::EnsEMBL::Gene Exceptions : none Caller : general =cut sub real_genes { my ($self, $real_gene) = @_; if ($real_gene) { unless ($real_gene->isa("Bio::EnsEMBL::Gene")){ throw("real gene is not a Bio::EnsEMBL::Gene, it is a $real_gene"); } push @{$self->{'_real_gene'}},$self->lazy_load($real_gene); } return $self->{'_real_gene'}; } =head2 ignored_genes Arg [1] : Bio::EnsEMBL::Gene Description: get/set for genes that pseudogene does not check Returntype : Bio::EnsEMBL::Gene Exceptions : none Caller : general =cut sub ignored_genes { my ($self, $ignored_gene) = @_; if ($ignored_gene) { unless ($ignored_gene->isa("Bio::EnsEMBL::Gene")){ throw("ignored gene is not a Bio::EnsEMBL::Gene, it is a $ignored_gene"); } push @{$self->{'_ignored_gene'}},$self->lazy_load($ignored_gene); } return $self->{'_ignored_gene'}; } #================================================================== sub PS_INPUT_DATABASE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_INPUT_DATABASE'} = $arg; } return $self->{'PS_INPUT_DATABASE'}; } sub PS_OUTPUT_DATABASE { my ($self, $arg) = @_; if($arg){ $self->{'PS_OUTPUT_DATABASE'} = $arg; } return $self->{'PS_OUTPUT_DATABASE'}; } sub PS_FRAMESHIFT_INTRON_LENGTH{ my ($self, $arg) = @_; if($arg){ $self->{'PS_FRAMESHIFT_INTRON_LENGTH'} = $arg; } return $self->{'PS_FRAMESHIFT_INTRON_LENGTH'}; } sub PS_MAX_INTRON_LENGTH{ my ($self, $arg) = @_; if($arg){ $self->{'PS_MAX_INTRON_LENGTH'} = $arg; } return $self->{'PS_MAX_INTRON_LENGTH'}; } sub PS_REPEAT_TYPES{ my ($self, $arg) = @_; if($arg){ $self->{'PS_REPEAT_TYPES'} = $arg; } return $self->{'PS_REPEAT_TYPES'}; } sub PS_MAX_INTRON_COVERAGE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_MAX_INTRON_COVERAGE'} = $arg; } return $self->{'PS_MAX_INTRON_COVERAGE'}; } sub PS_MAX_EXON_COVERAGE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_MAX_EXON_COVERAGE'} = $arg; } return $self->{'PS_MAX_EXON_COVERAGE'}; } sub PS_NUM_FRAMESHIFT_INTRONS { my ($self, $arg) = @_; if($arg){ $self->{'PS_NUM_FRAMESHIFT_INTRONS'} = $arg; } return $self->{'PS_NUM_FRAMESHIFT_INTRONS'}; } sub PS_NUM_REAL_INTRONS{ my ($self, $arg) = @_; if($arg){ $self->{'PS_NUM_REAL_INTRONS'} = $arg; } return $self->{'PS_NUM_REAL_INTRONS'}; } sub PS_BIOTYPE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_BIOTYPE'} = $arg; } return $self->{'PS_BIOTYPE'}; } sub PS_WRITE_IGNORED_GENES{ my ($self, $arg) = @_; if($arg){ $self->{'PS_WRITE_IGNORED_GENES'} = $arg; } return $self->{'PS_WRITE_IGNORED_GENES'}; } sub PS_PERCENT_ID_CUTOFF{ my ($self, $arg) = @_; if($arg){ $self->{'PS_PERCENT_ID_CUTOFF'} = $arg; } return $self->{'PS_PERCENT_ID_CUTOFF'}; } sub PS_P_VALUE_CUTOFF{ my ($self, $arg) = @_; if($arg){ $self->{'PS_P_VALUE_CUTOFF'} = $arg; } return $self->{'PS_P_VALUE_CUTOFF'}; } sub PS_RETOTRANSPOSED_COVERAGE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_RETOTRANSPOSED_COVERAGE'} = $arg; } return $self->{'PS_RETOTRANSPOSED_COVERAGE'}; } sub PS_ALIGNED_GENOMIC{ my ($self, $arg) = @_; if($arg){ $self->{'PS_ALIGNED_GENOMIC'} = $arg; } return $self->{'PS_ALIGNED_GENOMIC'}; } sub PS_PSEUDO_TYPE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_PSEUDO_TYPE'} = $arg; } return $self->{'PS_PSEUDO_TYPE'}; } sub PS_REPEAT_TYPE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_REPEAT_TYPE'} = $arg; } return $self->{'PS_REPEAT_TYPE'}; } sub SINGLE_EXON{ my ($self, $arg) = @_; if($arg){ $self->{'SINGLE_EXON'} = $arg; } return $self->{'SINGLE_EXON'}; } sub INDETERMINATE{ my ($self, $arg) = @_; if($arg){ $self->{'INDETERMINATE'} = $arg; } return $self->{'INDETERMINATE'}; } sub RETROTRANSPOSED{ my ($self, $arg) = @_; if($arg){ $self->{'RETROTRANSPOSED'} = $arg; } return $self->{'RETROTRANSPOSED'}; } sub RETRO_TYPE{ my ($self, $arg) = @_; if($arg){ $self->{'RETRO_TYPE'} = $arg; } return $self->{'RETRO_TYPE'}; } sub SPLICED_ELSEWHERE_LOGIC_NAME{ my ($self, $arg) = @_; if($arg){ $self->{'SPLICED_ELSEWHERE_LOGIC_NAME'} = $arg; } return $self->{'SPLICED_ELSEWHERE_LOGIC_NAME'}; } sub PSILC_LOGIC_NAME{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_LOGIC_NAME'} = $arg; } return $self->{'PSILC_LOGIC_NAME'}; } sub PS_SPAN_RATIO{ my ($self, $arg) = @_; if($arg){ $self->{'PS_SPAN_RATIO'} = $arg; } return $self->{'PS_SPAN_RATIO'}; } sub PS_MIN_EXONS{ my ($self, $arg) = @_; if($arg){ $self->{'PS_MIN_EXONS'} = $arg; } return $self->{'PS_MIN_EXONS'}; } sub PS_MULTI_EXON_DIR{ my ($self, $arg) = @_; if($arg){ $self->{'PS_MULTI_EXON_DIR'} = $arg; } return $self->{'PS_MULTI_EXON_DIR'}; } sub PS_CHUNK{ my ($self, $arg) = @_; if($arg){ $self->{'PS_CHUNK'} = $arg; } return $self->{'PS_CHUNK'}; } sub DEBUG{ my ($self, $arg) = @_; if($arg){ $self->{'DEBUG'} = $arg; } return $self->{'DEBUG'}; } sub SUBJECT{ my ($self, $arg) = @_; if($arg){ $self->{'SUBJECT'} = $arg; } return $self->{'SUBJECT'}; } sub PSILC_SUBJECT_DBNAME{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_SUBJECT_DBNAME'} = $arg; } return $self->{'PSILC_SUBJECT_DBNAME'}; } sub PSILC_SUBJECT_DBHOST{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_SUBJECT_DBHOST'} = $arg; } return $self->{'PSILC_SUBJECT_DBHOST'}; } sub PSILC_SUBJECT_DBPORT{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_SUBJECT_DBPORT'} = $arg; } return $self->{'PSILC_SUBJECT_DBPORT'}; } sub ORTH1{ my ($self, $arg) = @_; if($arg){ $self->{'ORTH1'} = $arg; } return $self->{'ORTH1'}; } sub PSILC_ORTH1_DBNAME{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_ORTH1_DBNAME'} = $arg; } return $self->{'PSILC_ORTH1_DBNAME'}; } sub PSILC_ORTH1_DBHOST{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_ORTH1_DBHOST'} = $arg; } return $self->{'PSILC_ORTH1_DBHOST'}; } sub PSILC_ORTH1_DBPORT{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_ORTH1_DBPORT'} = $arg; } return $self->{'PSILC_ORTH1_DBPORT'}; } sub ORTH2{ my ($self, $arg) = @_; if($arg){ $self->{'ORTH2'} = $arg; } return $self->{'ORTH2'}; } sub PSILC_ORTH2_DBNAME{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_ORTH2_DBNAME'} = $arg; } return $self->{'PSILC_ORTH2_DBNAME'}; } sub PSILC_ORTH2_DBHOST{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_ORTH2_DBHOST'} = $arg; } return $self->{'PSILC_ORTH2_DBHOST'}; } sub PSILC_ORTH2_DBPORT{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_ORTH2_DBPORT'} = $arg; } return $self->{'PSILC_ORTH2_DBPORT'}; } sub PSILC_WORK_DIR{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_WORK_DIR'} = $arg; } return $self->{'PSILC_WORK_DIR'}; } sub PS_SPECIES_LIMIT{ my ($self, $arg) = @_; if($arg){ $self->{'PS_SPECIES_LIMIT'} = $arg; } return $self->{'PS_SPECIES_LIMIT'}; } sub PSILC_BLAST_DB{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_BLAST_DB'} = $arg; } return $self->{'PSILC_BLAST_DB'}; } sub PSILC_CHUNK{ my ($self, $arg) = @_; if($arg){ $self->{'PSILC_CHUNK'} = $arg; } return $self->{'PSILC_CHUNK'}; } sub REP_TRANSCRIPT{ my ($self, $arg) = @_; if($arg){ $self->{'REP_TRANSCRIPT'} = $arg; } return $self->{'REP_TRANSCRIPT'}; } sub PS_REPEAT_TYPE{ my ($self, $arg) = @_; if($arg){ $self->{'PS_REPEAT_TYPE'} = $arg; } return $self->{'PS_REPEAT_TYPE'}; } sub BLESSED_BIOTYPES{ my ($self, $arg) = @_; if($arg){ $self->{'BLESSED_BIOTYPES'} = $arg; } return $self->{'BLESSED_BIOTYPES'}; } 1;