Skip to content

Commit 4cb39ee

Browse files
authored
Merge pull request #1095 from twalsh-ebi/tweak/contrib_tree_config
Facilitate config of contributing gene trees
2 parents 58a4b97 + 6e6fceb commit 4cb39ee

File tree

6 files changed

+89
-18
lines changed

6 files changed

+89
-18
lines changed

modules/EnsEMBL/Draw/GlyphSet/genetree.pm

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,22 @@ sub features {
840840

841841
if ($show_exons) {
842842
my $ref_genetree = $tree->tree;
843-
$ref_genetree = $ref_genetree->alternative_trees->{default} if $ref_genetree->ref_root_id;
843+
844+
if ($ref_genetree->ref_root_id) {
845+
846+
# If $ref_genetree is a contributing tree, we need to fetch the
847+
# corresponding reference tree in order to get exon boundary data.
848+
my @matching_ref_genetrees = grep {
849+
!$_->ref_root_id && $_->root_id == $ref_genetree->ref_root_id
850+
} values %{$ref_genetree->alternative_trees};
851+
852+
# Gene trees are uniquely identified by their root_id, so there can be at
853+
# most one gene tree with a root_id matching $ref_genetree->ref_root_id
854+
if (scalar(@matching_ref_genetrees) > 0) {
855+
$ref_genetree = $matching_ref_genetrees[0];
856+
}
857+
}
858+
844859
unless ($ref_genetree->{_exon_boundaries_hash}) {
845860
my $gtos_adaptor = $tree->adaptor->db->get_GeneTreeObjectStoreAdaptor;
846861
my $json_string = $gtos_adaptor->fetch_by_GeneTree_and_label($ref_genetree, 'exon_boundaries');

modules/EnsEMBL/Web/Command/DataExport/Output.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ sub process {
157157
$url_params->{'__clear'} = 1;
158158
## Pass parameters needed for Back button to work
159159
my @core_params = keys %{$hub->core_object('parameters')};
160-
push @core_params, qw(export_action data_type data_action component align g1 node strain hom_id);
160+
push @core_params, qw(export_action data_type data_action component align align_type clusterset_id g1 hom_id node strain);
161161
push @core_params, $self->config_params;
162162
foreach (@core_params) {
163163
my @values = $component->param($_);

modules/EnsEMBL/Web/Component/DataExport/GeneTree.pm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ sub content {
4141
my $view_config = $self->view_config;
4242

4343
my $settings = $view_config->form_fields('export');
44-
$settings->{'Hidden'} = [qw(align align_type node strain)];
44+
$settings->{'Hidden'} = [qw(align align_type clusterset_id node strain)];
4545

4646
## Add export-specific settings
4747
my $fields_by_format;
@@ -87,9 +87,9 @@ sub content {
8787

8888
## Options per format
8989
$fields_by_format = [{'Tree formats' => {
90-
'Newick' => [qw(newick_mode clusterset_id)],
91-
'NHX' => [qw(nhx_mode clusterset_id)],
92-
'Text' => [qw(scale clusterset_id)],
90+
'Newick' => [qw(newick_mode)],
91+
'NHX' => [qw(nhx_mode)],
92+
'Text' => [qw(scale)],
9393
'OrthoXML' => [],
9494
'PhyloXML' => $self->phyloxml_fields,
9595
}}];

modules/EnsEMBL/Web/Component/Gene/ComparaTree.pm

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,20 +164,36 @@ sub content {
164164
}
165165

166166
if ($hub->type eq 'Gene') {
167-
if ($tree->tree->clusterset_id ne $clusterset_id) {
168-
$html .= $self->_info('Phylogenetic model selection',
169-
sprintf(
170-
'The phylogenetic model <i>%s</i> is not available for this tree. Showing the <i>%s</i> tree instead.', $clusterset_id, $tree->tree->clusterset_id,
171-
)
172-
);
167+
my $tree_clusterset_id = $tree->tree->clusterset_id;
168+
if ($tree_clusterset_id ne $clusterset_id) {
169+
my $strain_clusterset_id = $hub->species_defs->get_config($self->hub->species, 'RELATED_TAXON');
170+
# When switching between the respective consensus trees of the default and strain gene-tree view
171+
# (e.g. 'default' to 'murinae'), each clusterset_id represents the consensus clusterset for its
172+
# respective view, so we skip the model selection info box in such cases.
173+
unless ( $strain_clusterset_id
174+
&&
175+
(
176+
($clusterset_id eq 'default' && $tree_clusterset_id eq $strain_clusterset_id)
177+
||
178+
($clusterset_id eq $strain_clusterset_id && $tree_clusterset_id eq 'default')
179+
)
180+
) {
181+
$html .= $self->_info('Phylogenetic model selection',
182+
sprintf(
183+
'The phylogenetic model <i>%s</i> is not available for this tree. Showing the <i>%s</i> tree instead.',
184+
$clusterset_id,
185+
$tree_clusterset_id,
186+
)
187+
);
188+
}
173189
} elsif ($tree->tree->ref_root_id) {
174190

175191
my $text = sprintf(
176192
'The tree displayed here has been built with the phylogenetic model <I>%s</I>. It has then been merged with trees built with other models to give the final tree and homologies. Data shown here may be inconsistent with the rest of the comparative analyses, especially homologies.', $clusterset_id
177193
);
178194
my $rank = $tree->tree->get_tagvalue('k_score_rank');
179195
my $score = $tree->tree->get_tagvalue('k_score');
180-
$text .= sprintf('<br/>This tree is the <b>n&deg;%d</b> closest to the final tree, with a K-distance of <b>%f</b>, as computed by <a href="http://molevol.cmima.csic.es/castresana/Ktreedist.html">Ktreedist</a>.', $rank, $score) if $rank;
196+
$text .= sprintf('<br/>This tree is the <b>n&deg;%d</b> closest to the final tree, with a K-distance of <b>%f</b>, as computed by <a href="https://www.biologiaevolutiva.org/jcastresana/Ktreedist.html">Ktreedist</a>.', $rank, $score) if $rank;
181197
$html .= $self->_info('Phylogenetic model selection', $text);
182198
}
183199
}

modules/EnsEMBL/Web/Object/Gene.pm

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -932,23 +932,46 @@ sub get_homologue_alignments {
932932
}
933933

934934

935+
sub _resolve_clusterset_ids {
936+
my ($self, $strain_tree) = @_;
937+
938+
my $consensus_clusterset_id = $strain_tree || 'default';
939+
my $clusterset_id = $self->hub->param('clusterset_id');
940+
return [$consensus_clusterset_id, $clusterset_id];
941+
}
942+
943+
935944
sub get_GeneTree {
936945
my $self = shift;
937946
my $compara_db = shift || 'compara';
938947
my $whole_tree = shift;
939948
my $strain_tree = shift;
940-
my $clusterset_id = $strain_tree || $self->hub->param('clusterset_id') || 'default';
941-
my $cache_key = sprintf('_protein_tree_%s_%s_%s', $compara_db, $clusterset_id, $strain_tree);
949+
my ($consensus_clusterset_id, $clusterset_id) = @{$self->_resolve_clusterset_ids($strain_tree)};
950+
951+
my $cache_key = sprintf('_protein_tree_%s_%s_%s', $compara_db, $clusterset_id, $consensus_clusterset_id);
942952

943953
if (!$self->{$cache_key}) {
944954
my $args = {'stable_id' => $self->stable_id, 'cdb' => $compara_db};
945955
my $member = $self->get_compara_Member($args) || return;
946956
my $adaptor = $member->adaptor->db->get_adaptor('GeneTree') || return;
947-
my $tree = $adaptor->fetch_all_by_Member($member, -clusterset_id => $clusterset_id)->[0];
957+
958+
# We fetch the consensus tree in the first instance. This is typically
959+
# the 'default' tree for the current gene-tree view, which is either
960+
# the tree we want, or the reference tree of the tree we want.
961+
my $tree = $adaptor->fetch_default_for_Member($member, $consensus_clusterset_id);
962+
948963
unless ($tree) {
949964
$tree = $adaptor->fetch_default_for_Member($member);
950965
}
951966
return unless $tree;
967+
968+
# If an alternative clusterset_id has been specified that
969+
# is appropriate to the current gene-tree view, it should
970+
# be one of the alternative trees of the consensus tree.
971+
if ($clusterset_id && exists $tree->alternative_trees->{$clusterset_id}) {
972+
$tree = $tree->alternative_trees->{$clusterset_id};
973+
}
974+
952975
return $tree if $whole_tree;
953976

954977
$tree->preload;

modules/EnsEMBL/Web/ViewConfig/Gene/ComparaTree.pm

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,27 @@ sub init_form_non_cacheable {
155155
my $form = $self->SUPER::init_form_non_cacheable(@_);
156156
my %other_clustersets;
157157

158+
my $page_action = $hub->referer->{'ENSEMBL_ACTION'};
159+
my $consensus_clusterset_id = $hub->param('strain') || $page_action =~ /^Strain_/
160+
? $hub->species_defs->get_config($hub->species, 'RELATED_TAXON')
161+
: 'default'
162+
;
163+
158164
if($hub->param('g')) {
159165
my $database = $hub->database($cdb);
160166
my $genome_db = $database->get_GenomeDBAdaptor->fetch_by_name_assembly($hub->species_defs->SPECIES_PRODUCTION_NAME);
161167

162168
my $member = $database->get_GeneMemberAdaptor->fetch_by_stable_id_GenomeDB($hub->core_params->{'g'}, $genome_db);
163169
my $adaptor = $database->get_GeneTreeAdaptor;
164-
my $gene_tree = $adaptor->fetch_default_for_Member($member);
170+
my $gene_tree = $adaptor->fetch_default_for_Member($member, $consensus_clusterset_id);
171+
$consensus_clusterset_id = $gene_tree->clusterset_id if $gene_tree->clusterset_id ne $consensus_clusterset_id;
165172
%other_clustersets = map { $_->clusterset_id => 1 } @{$adaptor->fetch_all_linked_trees($gene_tree)};
166173

167-
delete $other_clustersets{'default'};
174+
delete $other_clustersets{$consensus_clusterset_id};
168175
}
169176

170177
if (my $dropdown = $form->get_elements_by_name('clusterset_id')->[0]) {
178+
$self->_replace_default_clusterset_id_option($dropdown, $consensus_clusterset_id) if $consensus_clusterset_id ne 'default';
171179
$dropdown->add_option({ 'value' => $_, 'caption' => $_ }) for sort keys %other_clustersets;
172180
}
173181

@@ -179,4 +187,13 @@ sub _groups {
179187
return (@{ $_[0]->species_defs->TAXON_ORDER });
180188
}
181189

190+
sub _replace_default_clusterset_id_option {
191+
my ($self, $cset_id_dropdown, $clusterset_id) = @_;
192+
193+
my $default_option = $cset_id_dropdown->get_elements_by_attribute({'value' => 'default'})->[0];
194+
my $cset_id_option = $cset_id_dropdown->dom->create_element('option', {'value' => $clusterset_id, 'inner_HTML' => 'Final (merged) tree'});
195+
$default_option->after($cset_id_option);
196+
$default_option->remove();
197+
}
198+
182199
1;

0 commit comments

Comments
 (0)