package EnsEMBL::Web::Object::Marker; use strict; use warnings; no warnings "uninitialized"; use EnsEMBL::Web::Object; our @ISA = qw(EnsEMBL::Web::Object); sub marker { my $self = shift; return $self->Obj; } sub markerSynonym { my $self = shift; my $obj = $self->Obj; if( $obj ) { my $dms = $self->Obj->display_MarkerSynonym; return $dms if $dms; } my $temp = $self->markerSynonyms; return $temp->{'main'}[0] if @{$temp->{'main'}}; return $temp->{'other'}[0] if @{$temp->{'other'}}; return undef; } sub name{ my $self = shift; my $dms = $self->markerSynonym; return $dms ? $dms->name : ''; } sub source{ my $self = shift; my $dms = $self->markerSynonym; return $dms ? $dms->source : ''; } sub dbID { my $self = shift; return $self->Obj->dbID; } sub markerFeatures { my $self = shift; unless ($self->__data->{'_markerFeatures'}){ my $db = $self->database('core'); my $feats = $self->Obj->get_all_MarkerFeatures; my $count = scalar(@$feats); my $MAX_MAP_WEIGHT = 4; if($count <= $MAX_MAP_WEIGHT) { $self->__data->{'_markerFeatures'} = [ map { $_->transform('toplevel')||() } @$feats ]; } } return $self->__data->{'_markerFeatures'} ; } sub markerSynonyms { my $self = shift; my @synonyms; my $return = { 'main' => [], 'other' => [] }; my %IS_IMPORTANT = map { $_, 1 } qw( rgd oxford unists mgi:markersymbol ); unless( $self->__data->{'_markerSynonyms'} ){ #pick out the important synonyms foreach my $ms ( @{ $self->Obj->get_all_MarkerSynonyms } ) { push @{ $return->{ $IS_IMPORTANT{ lc($ms->source) } ? 'main' : 'other' } }, $ms; } $self->__data->{'_markerSynonyms'} = $return; } return $self->__data->{'_markerSynonyms'} ; } sub markerMapLocations { my $self = shift; unless( $self->__data->{'_markerLocations'} ) { my $marker_obj = $self->Obj; my @mlocs = @{$marker_obj->get_all_MapLocations}; $self->__data->{'_markerLocations'} = \@mlocs } return $self->__data->{'_markerLocations'}; } sub _seq_region_ { my $self = shift; unless( $self->{'_region_array_'} ) { my $ML = $self->markerFeatures; if( $ML && @$ML ) { $self->{'_region_array_'} = [ $ML->[0]->slice->coord_system->name, $ML->[0]->seq_region_name, $ML->[0]->start, $ML->[0]->end, $ML->[0]->strand ]; } else { $self->{'_region_array_'} = []; } } return @{$self->{'_region_array_'}}; } sub location_string { my( $type, $sr,$st,$en) = $_[0]->_seq_region_; if( $type ) { return "$sr:@{[$st-1000]}-@{[$en+1000]}"; } else { return undef; } } sub seq_region_type { return [$_[0]->_seq_region_]->[0]; } sub seq_region_name { return [$_[0]->_seq_region_]->[1]; } sub seq_region_start { return [$_[0]->_seq_region_]->[2]; } sub seq_region_end { return [$_[0]->_seq_region_]->[3]; } sub seq_region_strand { return [$_[0]->_seq_region_]->[4]; } sub chromosome { my $self = shift; my $ML = $self->markerFeatures; return undef unless @$ML; return undef if $ML->[0]->slice->coord_system->name ne 'chromosome'; return $ML->[0]->seq_region_name; } sub spreadsheet_markerMapLocations{ my $self = shift; my $mlocs = $self->markerMapLocations( $self ); my @map_locs; foreach my $ml (@$mlocs) { push @map_locs, { 'map' => $ml->map_name, 'syn' => $ml->name || '-', 'chr' => $ml->chromosome_name || ' ' , 'pos' => $ml->position || '-', 'lod' => $ml->lod_score || '-', } } return \@map_locs; } 1;