Bio-Gonzales
view release on metacpan or search on metacpan
lib/Bio/Gonzales/Domain/Identification/HMMER/SeqMarks.pm view on Meta::CPAN
my @imarks;
push @imarks, shift @marks;
#merge intervals
for my $m (@marks) {
if ( $imarks[-1]->{to} > $m->{from} ) {
$imarks[-1]->{to} = $m->{to}
if ( $m->{to} > $imarks[-1]->{to} );
} else {
push @imarks, $m;
}
}
#invert
my $start = $self->boundaries->[0] - 1;
my @iimarks;
for my $m (@imarks) {
next if($start == $m->{from});
push @iimarks, { from => $start + 1, to => $m->{from} - 1, hit => 1 }
unless ( $m->{from} == $start + 1 );
$start = $m->{to};
}
push @iimarks, { from => $start + 1, to => $self->boundaries->[1], hit => 1 }
unless ( $start == $self->boundaries->[1] );
return \@iimarks;
}
sub _to_boundaries {
my ( $self, $from, $to ) = @_;
$to = $self->boundaries->[1]
if ( $to > $self->boundaries->[1] || $from > $to );
$from = $self->boundaries->[0]
if ( $from < $self->boundaries->[0] || $from > $to );
return ( $from, $to );
}
around 'mark_names' => sub {
my $orig = shift;
my $self = shift;
if ( @_ > 0 ) {
my ($names) = @_;
croak 'mark names not equal to number of marks'
if ( @{$names} != $self->num_marks );
my %names;
for ( my $i = 0; $i < @{$names}; $i++ ) {
$names{ $names->[$i] } = $i;
}
return $self->$orig( \%names );
} else {
return $self->$orig;
}
};
sub update_mark {
my ( $self, $mark, $from, $to ) = @_;
$mark = $self->mark_from_name($mark)
unless ( $mark =~ /^\d+$/ );
$self->marks->[$mark]->{from} = $from
if ( $self->marks->[$mark] > $from );
$self->marks->[$mark]->{to} = $to
if ( $self->marks->[$mark]->{to} < $to );
$self->marks->[$mark]->{hit} = 1;
}
sub num_marks_hit {
my ($self) = @_;
return scalar grep { exists $_->{hit} } @{ $self->marks };
}
sub hit_in_every_mark {
my ($self) = @_;
return $self->num_marks_hit == $self->num_marks;
}
sub clear_extend {
my ($self) = @_;
$self->_clear_extension;
}
sub extend {
my ( $self, $left, $right ) = @_;
croak 'you have to supply parameters'
unless ($left);
$right = $left
unless ($right);
$self->_extension( [ $left, $right ] );
return $self;
}
sub reset_extend {
my ($self) = @_;
$self->_clearer_extension;
return $self;
}
sub spanning_region {
my ($self) = @_;
my ( $min, $max ) = ( INT_MAX, INT_MIN );
for my $m ( @{ $self->marks } ) {
$min = $m->{from}
if ( $m->{from} < $min );
$max = $m->{to}
( run in 0.924 second using v1.01-cache-2.11-cpan-364913b4093 )