diff --git a/modules/EnsEMBL/Web/ConfigPacker.pm b/modules/EnsEMBL/Web/ConfigPacker.pm index e1c2b28ca6..ce7901f6a9 100644 --- a/modules/EnsEMBL/Web/ConfigPacker.pm +++ b/modules/EnsEMBL/Web/ConfigPacker.pm @@ -1207,6 +1207,69 @@ sub _build_compara_mlss { $dest->{'MLSS_IDS'} = \%mlss; } +sub _build_gene_tree_stats_mlss { + my ($self,$dbh,$dest) = @_; + + # Take the default gene-tree collection, if available. + # Otherwise, take the largest gene-tree collection. + my $sql = q( + select method_link_species_set_id + from method_link_species_set mlss + join method_link ml + using (method_link_id) + join species_set_header ssh + using (species_set_id) + where ml.type = ? + order by field(ssh.name, "collection-default", "default") desc, ssh.size desc + limit 1 + ); + + my %gene_tree_stats_mlss_ids; + foreach my $method_type ('PROTEIN_TREES', 'NC_TREES') { + my ($row) = $dbh->selectrow_arrayref($sql, undef, $method_type); + if ($row) { + $gene_tree_stats_mlss_ids{$method_type} = $row->[0]; + } + } + + $dest->{'GENE_TREE_STATS_MLSS_IDS'} = \%gene_tree_stats_mlss_ids; +} + +sub _build_homology_mlss_tags { + my ($self,$dbh,$dest) = @_; + + # Homology MLSS tags may be stored in the method_link_species_set_attr + # or method_link_species_set_tag tables. It just so happens that all + # the tags we are currently interested in are to be found in the + # method_link_species_set_attr table. + my $sth = $dbh->prepare(q( + select method_link_species_set_id, + goc_quality_threshold, + wga_quality_threshold + from method_link_species_set + join method_link + using (method_link_id) + join method_link_species_set_attr + using (method_link_species_set_id) + where goc_quality_threshold is not null + or wga_quality_threshold is not null + )); + $sth->execute; + my %hom_mlss_tags; + while (my ($mlss_id, $goc_threshold, $wga_threshold) = $sth->fetchrow_array) { + $hom_mlss_tags{$mlss_id} = {}; + + if (defined $goc_threshold) { + $hom_mlss_tags{$mlss_id}{goc_quality_threshold} = $goc_threshold; + } + + if (defined $wga_threshold) { + $hom_mlss_tags{$mlss_id}{wga_quality_threshold} = $wga_threshold; + } + } + $dest->{'HOMOLOGY_MLSS_TAGS'} = \%hom_mlss_tags; +} + sub _summarise_compara_db { my ($self, $code, $db_name) = @_; @@ -1412,6 +1475,8 @@ sub _summarise_compara_db { $self->_build_compara_default_aligns($dbh,$self->db_tree->{$db_name}); $self->_build_compara_mlss($dbh,$self->db_tree->{$db_name}); + $self->_build_gene_tree_stats_mlss($dbh,$self->db_tree->{$db_name}); + $self->_build_homology_mlss_tags($dbh,$self->db_tree->{$db_name}); ## ################################################################### diff --git a/modules/EnsEMBL/Web/Document/HTML/Compara/GeneTrees.pm b/modules/EnsEMBL/Web/Document/HTML/Compara/GeneTrees.pm index 1facfa9953..df99049cfe 100644 --- a/modules/EnsEMBL/Web/Document/HTML/Compara/GeneTrees.pm +++ b/modules/EnsEMBL/Web/Document/HTML/Compara/GeneTrees.pm @@ -49,17 +49,29 @@ sub format_gene_tree_stats { my $page = $self->hub->param('page'); return unless $compara_db; - my $mlss_adaptor = $compara_db->get_adaptor('MethodLinkSpeciesSet'); - my $all_mlsss = $mlss_adaptor->fetch_all_by_method_link_type($method); - # Give preference to default gene-tree collection(s), if available. - my @default_mlsss = grep { $_->species_set->name =~ /^(collection-)?default$/ } @$all_mlsss; - $all_mlsss = \@default_mlsss if (@default_mlsss); - # Take the largest relevant gene-tree collection. - my ($mlss) = sort {$b->species_set->size <=> $a->species_set->size} @$all_mlsss; - return unless $mlss; - - my $species_tree_adaptor = $compara_db->get_adaptor('SpeciesTree'); - my $species_tree = $mlss->species_tree; + my $species_tree; + my $mlss_ids_by_method_type = $self->hub->species_defs->multi_hash->{'DATABASE_COMPARA'}{'GENE_TREE_STATS_MLSS_IDS'} || {}; + if (exists $mlss_ids_by_method_type->{$method} && $mlss_ids_by_method_type->{$method}) { + # If a pre-selected gene-tree collection is available, + # we get that gene-tree collection's species tree. + my $mlss_id = $mlss_ids_by_method_type->{$method}; + my $species_tree_adaptor = $compara_db->get_adaptor('SpeciesTree'); + # We fetch the 'default' species tree of the gene-tree collection, as + # opposed to other kinds of gene tree (e.g. 'cafe', 'full_species_tree'). + $species_tree = $species_tree_adaptor->fetch_by_method_link_species_set_id_label($mlss_id, 'default'); + } else { + # If a gene-tree collection has not been pre-selected, select it now. + my $mlss_adaptor = $compara_db->get_adaptor('MethodLinkSpeciesSet'); + my $all_mlsss = $mlss_adaptor->fetch_all_by_method_link_type($method); + # Give preference to default gene-tree collection(s), if available. + my @default_mlsss = grep { $_->species_set->name =~ /^(collection-)?default$/ } @$all_mlsss; + $all_mlsss = \@default_mlsss if (@default_mlsss); + # Take the largest relevant gene-tree collection. + my ($mlss) = sort {$b->species_set->size <=> $a->species_set->size} @$all_mlsss; + $species_tree = $mlss->species_tree if $mlss; + } + + return unless $species_tree; # Reads the species set that are defined in the database (if any) my $ordered_species = $hub->order_species_by_clade($species_tree->root->get_all_leaves); diff --git a/modules/EnsEMBL/Web/Object/Gene.pm b/modules/EnsEMBL/Web/Object/Gene.pm index 8cd77c8f24..a73cb126b4 100644 --- a/modules/EnsEMBL/Web/Object/Gene.pm +++ b/modules/EnsEMBL/Web/Object/Gene.pm @@ -821,15 +821,21 @@ sub fetch_homology_species_hash { my $homology_description = shift; my $compara_db = shift || 'compara'; my $name_lookup = {}; + my $db_key; if ($compara_db =~ /pan/) { my $pan_info = $self->hub->species_defs->multi_val('PAN_COMPARA_LOOKUP'); foreach (keys %$pan_info) { $name_lookup->{$_} = $pan_info->{$_}{'species_url'}; } + $db_key = 'DATABASE_COMPARA_PAN_ENSEMBL'; } else { $name_lookup = $self->hub->species_defs->prodnames_to_urls_lookup; + $db_key = 'DATABASE_COMPARA'; } + + my $hom_mlss_tags = $self->hub->species_defs->multi_hash->{$db_key}->{'HOMOLOGY_MLSS_TAGS'} // {}; + my ($homologies, $classification, $query_member) = $self->get_homologies($homology_source, $homology_description, $compara_db); my %homologues; @@ -847,9 +853,18 @@ sub fetch_homology_species_hash { $target_member = $gene_member; $dnds_ratio = $homology->dnds_ratio; $goc_score = $homology->goc_score; - $goc_threshold = $homology->method_link_species_set->get_value_for_tag('goc_quality_threshold'); + + my $mlss_id = $homology->method_link_species_set_id; + if (exists $hom_mlss_tags->{$mlss_id} && exists $hom_mlss_tags->{$mlss_id}{'goc_quality_threshold'}) { + $goc_threshold = $hom_mlss_tags->{$mlss_id}{'goc_quality_threshold'}; + } + $wgac = $homology->wga_coverage; - $wga_threshold = $homology->method_link_species_set->get_value_for_tag('wga_quality_threshold'); + + if (exists $hom_mlss_tags->{$mlss_id} && exists $hom_mlss_tags->{$mlss_id}{'wga_quality_threshold'}) { + $wga_threshold = $hom_mlss_tags->{$mlss_id}{'wga_quality_threshold'}; + } + $highconfidence = $homology->is_high_confidence; } }