package EnsEMBL::Web::Factory::Alignment;
use strict;
use warnings;
no warnings "uninitialized";
use EnsEMBL::Web::ExtIndex;
use EnsEMBL::Web::Factory;
use EnsEMBL::Web::Proxy::Object;
use EnsEMBL::Web::Document::SpreadSheet;
our @ISA = qw( EnsEMBL::Web::Factory );
=head2 _createObjects
Arg[1] : none
Example : $self->_createObjects()
Description : Always called from the parent module,
Creates and checks ensembl object(s)
Return type : Nothing
=cut
sub _createObjects {
my( $self, $objects, $class ) = @_;
my $obj = EnsEMBL::Web::Proxy::Object->new( 'Alignment', $objects, $self->__data );
$obj->class( $class );
$self->DataObjects( $obj );
}
sub _prob {
my( $self, $caption, $error ) = @_;
$self->problem( 'fatal', $caption, $self->web_usage.$error );
}
sub web_usage {
my $self = shift;
my $ss = EnsEMBL::Web::Document::SpreadSheet->new(
[ { 'title' => 'Class' }, {'title' => 'Description'}, { 'title' => 'Required' },
{ 'title' => 'Optional' } ],
[]
);
foreach my $method (sort keys %EnsEMBL::Web::Factory::Alignment::) {
next unless $method =~ /(usage_(\w+))$/;
my $class = $2;
my( $desc, $req, $opt ) = $self->$1();
$ss->add_row([ $class, $desc,
@$req ? qq(<dl><dt>@{[join ";</dt>\n<dt>", map {qq(<strong>$_->[0]</strong>: $_->[1])} @$req ]}.</dt></dl>) : ' ',
@$opt ? qq(<dl><dt>@{[join ";</dt>\n<dt>", map {qq(<strong>$_->[0]</strong>: $_->[1])} @$opt ]}.</dt></dl>) : ' '
]);
}
return '
<p>
The following classes of alignment can be rendered.
A list of required and optional parameters are
listed:</p>'.
$ss->render;
}
sub createObjects {
my $self = shift;
my $class = $self->param('class');
unless( $class ) {
$class = 'External' if $self->param('sequence');
$class = 'Supporting' if $self->param('sequence') && ($self->param('exon') || $self->param('trans'));
$class = 'Family' if $self->param('family_stable_id');
}
if( $class ) {
my $method = "createObjects_$class";
if( $self->can( $method ) ) {
$self->$method;
} else {
$self->_prob( 'Unknown alignment class' );
}
} else {
$self->_prob( 'Unspecified alignment class' );
}
}
#---------
sub usage_AlignSlice {
return
'AlignSlice Comparative',
[ ['chr' => 'Name of the region' ]],
[ ['bp_start' => 'Start of AlignSlice' ]],
[ ['bp_end' => 'End of AlignSlice' ]],
[ ['region' => 'Type of the region (scaffold etc, default - chromosome)']],
[ ['method' => 'Compara method to get AlignSlice' ]],
[ ['s' => 'Secondary species'],
['format' => 'SimpleAlign renderer name'] ]
}
sub createObjects_AlignSlice {
my $self = shift;
my $databases = $self->DBConnection->get_databases( 'core', 'compara' ); #, 'compara_multiple' );
my ($seq_region_name, $start, $end) = ($self->param('chr'), $self->param('bp_start'), $self->param('bp_end'));
my $species = $ENV{ENSEMBL_SPECIES};
my $query_slice_adaptor = Bio::EnsEMBL::Registry->get_adaptor($species, "core", "Slice");
my $cs = $self->param('region') || 'chromosome';
my $query_slice= $query_slice_adaptor->fetch_by_region($cs, $seq_region_name, $start, $end);
my $id = $self->param('method') or return $self->_prob( 'Alignment ID is not provided');
my $comparadb = $databases->{'compara'};
my $mlss_adaptor = $comparadb->get_adaptor("MethodLinkSpeciesSet");
my $method_link_species_set = $mlss_adaptor->fetch_by_dbID($id);
return $self->_prob( "Unable to get Method Link Species Set $id" ) unless $method_link_species_set;
eval {
my $asa = $comparadb->get_adaptor("AlignSlice" );
my $align_slice = $asa->fetch_by_Slice_MethodLinkSpeciesSet($query_slice, $method_link_species_set, "expanded", "restrict" );
$self->_createObjects( $align_slice, 'AlignSlice' );
};
return $self->_prob( 'Unable to get AlignSlice', "<pre>$@</pre>" ) if $@;
}
sub usage_Homology {
return
'Comparative gene homologies',
[ ['gene' => 'Name of gene' ]],
[ ['g1' => 'Secondary gene'],
['format' => 'SimpleAlign renderer name'] ]
}
sub usage_Family {
return
'Comparative family alignments',
[ ['family_stable_id' => 'Ensembl family identifier'] ],
[ ['format' => 'SimpleAlign renderer name'] ];
}
sub createObjects_Family {
my $self = shift;
my $databases = $self->DBConnection->get_databases( 'core', 'compara' );
my $compara_db = $databases->{'compara'};
my $family;
eval { $family = $compara_db->get_FamilyAdaptor()->fetch_by_stable_id( $self->param( 'family_stable_id' ) ); };
return $self->_prob( "unable to create Protein family" ) if $@ || !defined $family;
$self->_createObjects( [$family], 'Family' );
}
sub usage_DnaDnaAlignFeature {
return
'Comparative DNA-DNA alignment',
[ ['l = location in primary species'],
['s1 = secondary species'],
['l1 = location in secondary species'],
['type = type of match (TBLAT, BLASTZ...)'] ],
[];
}
sub createObjects_DnaDnaAlignFeature {
my $self = shift;
my $databases = $self->DBConnection->get_databases( 'core', 'compara' );
(my $p_species = $self->species ) =~ s/_/ /;
(my $s_species = $self->param('s1') ) =~ s/_/ /;
my( $p_chr, $p_start, $p_end ) = $self->param('l')=~/^(.+):(\d+)-(\d+)$/;
my( $s_chr, $s_start, $s_end ) = $self->param('l1')=~/^(.+):(\d+)-(\d+)$/;
my $type = $self->param( 'type' );
my $compara_db = $databases->{'compara'};
my $dafa = $compara_db->get_DnaAlignFeatureAdaptor;
my $features;
eval {
$features = $dafa->fetch_all_by_species_region(
$p_species, undef, $s_species, undef, $p_chr, $p_start, $p_end, $type
);
};
warn $@;
return $self->_prob( 'Unable to find Dna Dna alignment' ) if $@;
my $objects = [];
foreach my $f ( @$features ) {
warn $f->seqname;
if( $f->seqname eq $p_chr && $f->start == $p_start && $f->end == $p_end && $f->hseqname eq $s_chr && $f->hstart == $s_start && $f->hend == $s_end ) {
push @$objects, $f; ## This IS the aligmnent of which we speak
}
}
return $self->_prob( 'Unable to find Dna Dna alignment' ) unless @$objects;
$self->_createObjects( $objects, 'DnaDnaAlignFeature' );
}
sub usage_External {
return
'Alignment with external sequence',
[ ['sequence', 'Identifier of external sequence'],
['ext_db', 'source of external sequence'],
['gene/transcript/exon', 'Identifier of internal sequence'] ],
[];
}
sub usage_GeneTree {
return
'Comparative gene homologies',
[ ['gene' => 'Name of gene' ]],
[ ['format' => 'SimpleAlign renderer name'] ]
}
sub createObjects_GeneTree {
my $self = shift;
my $databases = $self->DBConnection->get_databases( 'core', 'compara' );
my $compara_db = $databases->{'compara'};
my $ma = $compara_db->get_MemberAdaptor;
my $member = $ma->fetch_by_source_stable_id("ENSEMBLGENE",$self->param('gene'));
return $self->_prob( 'Unable to find gene' ) unless $member;
eval {
my $clusterset_id = 0;
my $treeDBA = $compara_db->get_ProteinTreeAdaptor;
my $aligned_member = $treeDBA->fetch_AlignedMember_by_member_id_root_id(
$member->get_longest_peptide_Member->member_id,
$clusterset_id);
my $node = $aligned_member->subroot;
my $tree = $treeDBA->fetch_node_by_node_id($node->node_id);
$node->release_tree;
$self->_createObjects( $tree, 'GeneTree' );
};
return $self->_prob( 'Unable to get homologies', "<pre>$@</pre>" ) if $@;
}
1;