Raw content of Bio::EnsEMBL::MiscFeature =head1 LICENSE Copyright (c) 1999-2009 The European Bioinformatics Institute and Genome Research Limited. All rights reserved. This software is distributed under a modified Apache license. For license details, please see /info/about/code_licence.html =head1 CONTACT Please email comments or questions to the public Ensembl developers list at <ensembl-dev@ebi.ac.uk>. Questions may also be sent to the Ensembl help desk at <helpdesk@ensembl.org>. =cut =head1 NAME Bio::EnsEMBL::MiscFeature - A miscelaneous feature with arbitrary features and associations. =head1 SYNOPSIS use Bio::EnsEMBL::MiscFeature; use Bio::EnsEMBL::MiscSet; use Bio::EnsEMBL::Attribute; my $mfeat = Bio::EnsEMBL::MiscFeature->new( -START => 1200, -END => 100_000, -STRAND => 1, -SLICE => $slice ); # Can add attributes to the misc feature and associate with various # sets my $clone_set = Bio::EnsEMBL::MiscSet->new( -CODE => 'clone', -NAME => '1MB clone set', -DESCRIPTION => '1MB CloneSet' ); my $tiling_path_set = Bio::EnsEMBL::MiscSet->new( -CODE => 'tilingpath', -NAME => 'tiling path set' ); my $attrib1 = Bio::EnsEMBL::Attribute->new( -VALUE => 'RLX12451', -CODE => 'name', -NAME => 'name' ); my $attrib2 = Bio::EnsEMBL::Attribute->new( -VALUE => '4', -CODE => 'version', -NAME => 'version' ); my $attrib3 = Bio::EnsEMBL::Attribute->new( -VALUE => 'AL42131.4', -CODE => 'synonym', -NAME => 'synonym' ); # can associate a misc feature with any number of sets $mfeat->add_MiscSet($clone_set); $mfeat->add_MiscSet($tiling_path_set); # can add arbitrary attributes to a misc feature $mfeat->add_Attribute($attrib1); $mfeat->add_Attribute($attrib2); $mfeat->add_Attribute($attrib3); my ($name_attrib) = @{ $mfeat->get_all_Attributes('name') }; my @all_attribs = @{ $mfeat->get_all_Attributes() }; my @all_sets = @{ $mfeat->get_all_MiscSets() }; my ($clone_set) = @{ $mfeat->get_all_CloneSets('clone') }; # Can do normal feature operations as well $mfeat = $mfeat->transform('supercontig'); print $mfeat->slice->seq_region_name, ' ', $mfeat->start, '-', $mfeat->end; =head1 DESCRIPTION MiscFeatures are extremely general features with a location, and an arbitrary group of attributes. They are grouped with other features of the same 'type' through the use of MiscSets (see Bio::EnsEMBL::MiscSet). Attributes are attached in the fom of Bio::EnsEMBL::Attribute objects. See Bio::EnsEMBL::DBSQL::MiscFeatureAdaptor for ways to fetch or store MiscFeatures. =cut package Bio::EnsEMBL::MiscFeature; use strict; use warnings; use Bio::EnsEMBL::Feature; use Bio::EnsEMBL::Utils::Exception qw(throw); use vars qw(@ISA); @ISA = qw(Bio::EnsEMBL::Feature); =head2 new Arg [-SLICE]: Bio::EnsEMBL::SLice - Represents the sequence that this feature is on. The coordinates of the created feature are relative to the start of the slice. Arg [-START]: The start coordinate of this feature relative to the start of the slice it is sitting on. Coordinates start at 1 and are inclusive. Arg [-END] : The end coordinate of this feature relative to the start of the slice it is sitting on. Coordinates start at 1 and are inclusive. Arg [-STRAND]: The orientation of this feature. Valid values are 1,-1,0. Arg [-SEQNAME] : A seqname to be used instead of the default name of the of the slice. Useful for features that do not have an attached slice such as protein features. Arg [-dbID] : (optional) internal database id Arg [-ADAPTOR]: (optional) Bio::EnsEMBL::DBSQL::BaseAdaptor Example : $feature = Bio::EnsEMBL::MiscFeature->new(-start => 1, -end => 100, -strand => 1, -slice => $slice, -analysis => $analysis); Description: Constructs a new Bio::EnsEMBL::Feature. Generally subclasses of this method are instantiated, rather than this class itself. Returntype : Bio::EnsEMBL::MiscFeature Exceptions : Thrown on invalid -SLICE, -ANALYSIS, -STRAND ,-ADAPTOR arguments Caller : general, subclass constructors Status : Stable =cut sub new { my $class = shift; my $self = $class->SUPER::new(@_); $self->{'attributes'} = []; return $self; } =head2 new_fast Arg [...] : hashref to bless as new MiscFeature Example : $miscfeature = Bio::EnsEMBL::MiscFeature->new_fast(); Description: Creates a new Miscfeature. Returntype : Bio::EnsEMBL::MiscFeature Exceptions : none Caller : general Status : Stable =cut sub new_fast { my $class = shift; my $hashref = shift; $hashref->{'attributes'} ||= []; return bless($hashref, $class); } =head2 add_Attribute Arg [1] : Bio::EnsEMBL::Attribute $attribute Example : $misc_feature->add_attribute($attribute); Description: Adds an attribute to this misc. feature Returntype : none Exceptions : throw on wrong argument type Caller : general Status : Stable =cut sub add_Attribute { my ($self, $attrib) = @_; if( ! defined $attrib || ! $attrib->isa( "Bio::EnsEMBL::Attribute" )) { throw( "You have to provide a Bio::EnsEMBL::Attribute, not a [$attrib]" ); } $self->{'attributes'} ||= []; push @{$self->{'attributes'}}, $attrib } =head2 add_MiscSet Arg [1] : Bio::EnsEMBL::MiscSet $set The set to add Example : $misc_feature->add_MiscSet(Bio::EnsEMBL::MiscSet->new(...)); Description: Associates this MiscFeature with a given Set. Returntype : none Exceptions : throw if the set arg is not provided, throw if the set to be added does not have a code Caller : general Status : Stable =cut sub add_MiscSet { my $self = shift; my $miscSet = shift; if(!$miscSet || !ref($miscSet) || !$miscSet->isa('Bio::EnsEMBL::MiscSet')) { throw('Set argument must be a Bio::EnsEMBL::MiscSet'); } $self->{'miscSets'} ||= []; push( @{$self->{'miscSets'}}, $miscSet ); } =head2 get_all_MiscSets Arg [1] : optional string $code The code of the set to retrieve Example : $set = $misc_feature->get_all_MiscSets($code); Description: Retrieves a set that this feature is associated with via its code. Can return empty lists. Usually returns about one elements lists. Returntype : listref of Bio::EnsEMBL::MiscSet Exceptions : throw if the code arg is not provided Caller : general Status : Stable =cut sub get_all_MiscSets { my $self = shift; my $code = shift; $self->{'miscSets'} ||= []; if( defined $code ) { my @results = grep { uc($_->code())eq uc( $code ) } @{$self->{'miscSets'}}; return \@results; } else { return $self->{'miscSets'}; } } =head2 get_all_Attributes Arg [1] : optional string $code The code of the Attribute objects to retrieve Example : @attributes = $misc_feature->get_all_Attributes('name'); Description: Retrieves a list of Attribute objects for given code or all of the associated Attributes. Returntype : listref of Bio::EnsEMBL::Attribute Exceptions : Caller : general Status : Stable =cut sub get_all_Attributes { my $self = shift; my $code = shift; my @results; my $result; if( defined $code ) { @results = grep { uc( $_->code() ) eq uc( $code )} @{$self->{'attributes'}}; return \@results; } else { return $self->{'attributes'}; } } =head2 get_all_attribute_values Arg [1] : string $code The code of the Attribute object values to retrieve Example : @attributes_vals = @{$misc_feature->get_all_attribute_values('name')}; Description: Retrieves a list of Attribute object values for given code or all of the associated Attributes. Returntype : listref of values Exceptions : Caller : general Status : Stable =cut sub get_all_attribute_values { my $self = shift; my $code = shift; my @results = map { uc( $_->code() ) eq uc( $code ) ? $_->value : () } @{$self->{'attributes'}}; return \@results; } =head2 get_scalar_attribute Arg [1] : string $code The code of the Attribute object values to retrieve Example : $vals = $misc_feature->get_scalar_attribute('name'); Description: Retrieves a value for given code or all of the associated Attributes. Returntype : scalar value Exceptions : Caller : general Status : Stable =cut sub get_scalar_attribute { my $self = shift; my $code = shift; my @results = grep { uc( $_->code() ) eq uc( $code )} @{$self->{'attributes'}}; return @results ? $results[0]->value() : ''; } sub get_first_scalar_attribute { my $self = shift; foreach my $code ( @_ ) { my @results = grep { uc( $_->code() ) eq uc( $code )} @{$self->{'attributes'}}; return $results[0]->value() if @results; } return ''; } =head2 display_id Arg [1] : none Example : print $kb->display_id(); Description: This method returns a string that is considered to be the 'display' identifier. For misc_features this is the first name or synonym attribute or '' if neither are defined. Returntype : string Exceptions : none Caller : web drawing code Status : Stable =cut sub display_id { my $self = shift; my ($attrib) = @{$self->get_all_Attributes('name')}; ($attrib) = @{$self->get_all_Attributes('synonym')} if(!$attrib); if( defined $attrib ) { return $attrib->value(); } else { return ''; } } 1;