package EnsEMBL::Web::Component::Gene::GeneSNPTable; use strict; use warnings; no warnings "uninitialized"; use base qw(EnsEMBL::Web::Component::Gene); sub _init { my $self = shift; $self->cacheable( 1 ); $self->ajaxable( 1 ); } sub caption { return; } sub content { my $self = shift; my $object = $self->object; my $gene = configure_gene($object); my %var_tables; my @transcripts = sort{ $a->stable_id cmp $b->stable_id } @{ $gene->get_all_transcripts }; my $I = 0; foreach my $transcript ( @transcripts ) { my $tsid = $transcript->stable_id; my $table_rows = variationTable($transcript); my $table = new EnsEMBL::Web::Document::SpreadSheet( [], [], {'margin' => '1em 0px' } ); $table->add_columns ( { 'key' => 'ID', }, { 'key' => 'snptype', 'title' => 'Type', }, { 'key' => 'chr' , 'title' => 'Chr: bp', }, { 'key' => 'Alleles', 'align' => 'center' }, { 'key' => 'Ambiguity', 'align' => 'center', }, { 'key' => 'aachange', 'title' => 'Amino Acid', 'align' => 'center' }, { 'key' => 'aacoord', 'title' => 'AA co-ordinate', 'align' => 'center' }, { 'key' => 'class', 'title' => 'Class', 'align' => 'center' }, { 'key' => 'Source', }, { 'key' => 'status', 'title' => 'Validation', 'align' => 'center' }, ); if ($table_rows){ foreach my $row (@$table_rows){ $table->add_row($row); } $var_tables{$tsid} = $table->render; } } my $html; foreach (keys %var_tables){ $html .= "<p><h2>Variations in $_: </h2><p> $var_tables{$_}"; } return $html; } sub variationTable { my( $object ) = @_; my %snps = %{$object->__data->{'transformed'}{'snps'}||[]}; my @gene_snps = @{$object->__data->{'transformed'}{'gene_snps'}||[]}; my $tr_start = $object->__data->{'transformed'}{'start'}; my $tr_end = $object->__data->{'transformed'}{'end'}; my $extent = $object->__data->{'transformed'}{'extent'}; my $cdna_coding_start = $object->Obj->cdna_coding_start; return unless %snps; my @rows; foreach my $gs ( @gene_snps ) { my $raw_id = $gs->[2]->dbID; my $transcript_variation = $snps{$raw_id}; my @validation = @{ $gs->[2]->get_all_validation_states || [] }; if( $transcript_variation && $gs->[5] >= $tr_start-$extent && $gs->[4] <= $tr_end+$extent ) { my $url = $object->_url({'type' => 'Variation', 'action' =>'Summary', 'v' => @{[$gs->[2]->variation_name]}, 'vf' => @{[$gs->[2]->dbID]}, 'source' => @{[$gs->[2]->source]} }); my $row = { 'ID' => qq(<a href="$url">@{[$gs->[2]->variation_name]}</a>), 'class' => $gs->[2]->var_class() eq 'in-del' ? ( $gs->[4] > $gs->[5] ? 'insertion' : 'deletion' ) : $gs->[2]->var_class(), 'Alleles' => $gs->[2]->allele_string(), 'Ambiguity' => $gs->[2]->ambig_code(), 'status' => (join( ', ', @validation ) || "-"), 'chr' => $gs->[3].": ". ($gs->[4]==$gs->[5] ? $gs->[4] : "$gs->[4]-$gs->[5]"), 'snptype' => (join ", ", @{ $transcript_variation->consequence_type || []}), $transcript_variation->translation_start ? ( 'aachange' => $transcript_variation->pep_allele_string, 'aacoord' => $transcript_variation->translation_start.' ('.(($transcript_variation->cdna_start - $cdna_coding_start )%3+1).')' ) : ( 'aachange' => '-', 'aacoord' => '-' ), 'Source' => (join ", ", @{$gs->[2]->get_all_sources ||[] } )|| "-", }; push (@rows, $row); } } return \@rows; } sub configure_gene{ my $object = shift; my $context = $object->param( 'context' ) || 100; my $extent = $context eq 'FULL' ? 1000 : $context; my $master_config = $object->get_imageconfig( "genesnpview_transcript" ); $master_config->set_parameters( { 'image_width' => 800, 'container_width' => 100, 'slice_number' => '1|1', 'context' => $context, }); $object->get_gene_slices( ## Written... $master_config, [ 'context', 'normal', '100%' ], [ 'gene', 'normal', '33%' ], [ 'transcripts', 'munged', $extent ] ); my $transcript_slice = $object->__data->{'slices'}{'transcripts'}[1]; my $sub_slices = $object->__data->{'slices'}{'transcripts'}[2]; my ($count_snps, $snps, $context_count) = $object->getVariationsOnSlice( $transcript_slice, $sub_slices ); $object->store_TransformedTranscripts(); ## Stores in $transcript_object->__data->{'transformed'}{'exons'|'coding_start'|'coding_end' $object->store_TransformedSNPS(); ## Stores in $transcript_object->__data->{'transformed'}{'snps' ## -- Map SNPs for the last SNP display --------------------------------- ## my $SNP_REL = 5; ## relative length of snp to gap in bottom display... my $fake_length = -1; ## end of last drawn snp on bottom display... my $slice_trans = $transcript_slice; my @snps2; @snps2 = map { $fake_length+=$SNP_REL+1; [ $fake_length-$SNP_REL+1 ,$fake_length,$_->[2], $slice_trans->seq_region_name, $slice_trans->strand > 0 ? ( $slice_trans->start + $_->[2]->start - 1, $slice_trans->start + $_->[2]->end - 1 ) : ( $slice_trans->end - $_->[2]->end + 1, $slice_trans->end - $_->[2]->start + 1 ) ] } sort { $a->[0] <=> $b->[0] } @{ $snps }; foreach my $trans_obj ( @{$object->get_all_transcripts} ) { $trans_obj->__data->{'transformed'}{'extent'} = $extent; $trans_obj->__data->{'transformed'}{'gene_snps'} = \@snps2; } return $object; } 1;