Bio-ToolBox

 view release on metacpan or  search on metacpan

lib/Bio/ToolBox/db_helper/alignment_callbacks.pm  view on Meta::CPAN


#### Callback subroutines
# the following are all of the callback subroutines

# we explicitly check that alignment start and/or stop overlap the search coordinates
# to avoid e.g. weird alignments with massive splice junctions that would nevertheless
# be pulled out by the bam index search

sub _all_count_indexed {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	my $s = $a->pos + 1;
	my $e = $a->calend;
	return
		unless ( ( $s >= $data->{start} and $s <= $data->{stop} )
			or ( $e >= $data->{start} and $e <= $data->{stop} ) );

	if ( $flag & 0x10 ) {

		# reversed
		$data->{'index'}{$e}++;
	}
	else {
		$data->{'index'}{$s}++;
	}
}

sub _all_precise_count_indexed {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	my $s = $a->pos + 1;
	return unless ( $s >= $data->{start} and $a->calend <= $data->{stop} );
	if ( $flag & 0x10 ) {

		# reversed
		$data->{'index'}{$s}++;
	}
	else {
		$data->{'index'}{ $a->calend }++;
	}
}

sub _all_name_indexed {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	my $s = $a->pos + 1;
	my $e = $a->calend;
	return
		unless ( ( $s >= $data->{start} and $s <= $data->{stop} )
			or ( $e >= $data->{start} and $e <= $data->{stop} ) );

	if ( $flag & 0x10 ) {

		# reversed
		# since we're working with names, only record the 5' end of fragment
		return if ( ( $flag & 0x1 ) and ( $flag & 0x2 ) );

		# paired and proper
		# not the end we're looking for
		$data->{'index'}{$e} ||= [];
		push @{ $data->{'index'}{$e} }, $a->qname;
	}
	else {
		$data->{'index'}{$s} ||= [];
		push @{ $data->{'index'}{$s} }, $a->qname;
	}
}

sub _all_count_array {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	my $s = $a->pos + 1;
	my $e = $a->calend;
	return
		unless ( ( $s >= $data->{start} and $s <= $data->{stop} )
			or ( $e >= $data->{start} and $e <= $data->{stop} ) );
	push @{ $data->{scores} }, 1;
}

sub _all_precise_count_array {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	return unless ( $a->pos + 1 >= $data->{start} and $a->calend <= $data->{stop} );
	push @{ $data->{scores} }, 1;
}

sub _all_name_array {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	my $s = $a->pos + 1;
	my $e = $a->calend;
	return
		unless ( ( $s >= $data->{start} and $s <= $data->{stop} )
			or ( $e >= $data->{start} and $e <= $data->{stop} ) );
	push @{ $data->{scores} }, $a->qname;
}

sub _forward_count_indexed {
	my ( $a, $data ) = @_;
	my $flag = $a->flag;
	return if $flag & $UNWANTED_FLAGS;
	return if $a->qual < $MAPQ;
	my $reversed = $flag & 0x10;    # reversed
	if ( $flag & 0x1 ) {

		# paired
		my $first = $flag & 0x40;    # true if FIRST_MATE
		return if ( $first     and $reversed );
		return if ( not $first and not $reversed );



( run in 2.067 seconds using v1.01-cache-2.11-cpan-364913b4093 )