Bio-BPWrapper

 view release on metacpan or  search on metacpan

lib/Bio/BPWrapper/SeqManipulations.pm  view on Meta::CPAN

		foreach (@{$ref->{$mono}}) { push @pos, $_} 
	    }
#	    print STDERR join "\t", sort {$a <=> $b} @pos;
#	    print STDERR "\n"; 
	}
    }
    exit;
}

sub _count_gap {
    my ($str, $type) = @_;
    my @mono = split('', $str);
    my %seen_gaps;
    my $num_gaps = 0;
    my $ct = 0;
    foreach my $mon (@mono) {
	$ct++;
	next if ($type eq 'dna' && $mon =~ /[atcg]/i) or ($type eq 'protein' && $mon =~ /[ACDEFGHIKLMNPQRSTVWY]/i) or ($type eq 'protein' && $mon =~ /\*\s*$/);
	$num_gaps ++;
	if ($seen_gaps{$mon}) {
	    push @{$seen_gaps{$mon}}, $ct;
	} else {
	    $seen_gaps{$mon} = [$ct]
	}
    }
#    print Dumper(\%seen_gaps) if $num_gaps;
    return ($num_gaps, \%seen_gaps);
}

sub rename_id {
    my $optStr = $opts{rename};
    my %names;

    if ($optStr =~  /^id:(\S+);(\S+)$/) {
	$names{$1} = $2;
    } else {
	open NAME, "<", $optStr || die "a file with old-tab-new needed\n";
	while(<NAME>) {
	    chomp;
	    my ($oldN, $newN) = split;
	    $names{$oldN} = $newN;
	}
	close NAME;
    }

    while( my $seqobj  = $in->next_seq() ) {
	my $id = $seqobj->display_id();
	if ($names{$id}) {
#	    $seqobj->id($id . "|" . $names{$id});
#	    warn "$id appended by $names{$id}\n";
	    $seqobj->id($names{$id});
	    warn "$id replaced by $names{$id}\n";
	} else {
	    warn "$id not changed\n";
	}
	$out->write_seq($seqobj);
    }
}


sub update_longest_orf {
    while( my $seqobj  = $in->next_seq() ) {
	my $pep_string = $seqobj->translate( undef, undef, 0 )->seq();
	unless ($pep_string =~ /\*[A-Z]/) { # no internal stop; don't proceed
	    my $id = $seqobj->id();
	    $seqobj->id($id . "|+1");
	    $seqobj = &_trim_end_to_frame($seqobj);
	    $out->write_seq($seqobj);
#	    warn $seqobj->id, ": +1 ok\n";
	    next;
	}

	unless ($opts{"no-revcom"}) { # do not search in revcom
	    my $pep_rev = $seqobj->revcom()->translate( undef, undef, 0 )->seq();
	    unless ($pep_rev =~ /\*[A-Z]/) { # no internal stop for revcom
		my $id = $seqobj->id();
		$seqobj->id($id . "|-1");
		my $rev = $seqobj->revcom();
		$rev = &_trim_end_to_frame($rev);
		$out->write_seq($rev);
#	    warn $seqobj->id(), ": -1 ok\n";
		next;
	    }
	}

	my $longest = {
	    'aa_start'  => 1,
	    'aa_end'    => 1,
	    'aa_length' => 1,
	    'nt_start'  => 1,
	    'nt_end'    => 1,
	    'nt_seq'    => $seqobj->seq(),
	    'frame'     => 1,
	};

	foreach my $fm (1, 2, 3, -1, -2, -3 ) {
#	    warn "checking frame $fm ...\n";
	    next if $opts{"no-revcom"} && $fm < 0; # do not search in revcom
	    my $new_seqobj = Bio::Seq->new(
		-id  => $seqobj->id() . "|$fm",
		-seq => $fm > 0 ? $seqobj->subseq( $fm, $seqobj->length() ) : $seqobj->revcom()->subseq( abs($fm), $seqobj->length() )
		);    # chop seq to frame first
	    
	    &_get_longest($new_seqobj, $longest, $fm);
#	    warn "longest ORF:", $longest->{aa_length}, "\n";

	}
#	warn "start codon not M/V/L:", $seqobj->id() unless substr( $longest->{nt_seq}, 0, 3 ) =~ /[atg|gt[atcg]|ct[atcg]|tt[ag]/i;
#	print ">", $seqobj->id, "|f", $longest->{frame}, "|longest-orf\n", $longest->{nt_seq}, "\n";
	my $fid = $longest->{frame} > 0 ? "+" . $longest->{frame} : $longest->{frame};
	my $longest_seq = Bio::Seq->new(-id => $seqobj->id . "|" . $fid, -seq => $longest->{nt_seq} );
	$longest_seq = &_trim_end_to_frame($longest_seq);
	$out->write_seq($longest_seq);
    }
}

sub _trim_end_to_frame {
    my $seqobj = shift;
    my $seq_len = $seqobj->length();
    my $remainder = $seq_len % 3;
    my $seqstr = $seqobj->subseq(1, $seq_len - $remainder);



( run in 0.927 second using v1.01-cache-2.11-cpan-9581c071862 )