my ($self, $hsp) = @_;
$self->throw("a defined object needed") unless($hsp && defined($hsp));
unless(ref($hsp) && $hsp->isa('Bio::Search::HSP::GenericHSP')){
$self->throw("a HSP object needed");
}
my ($qtype, $htype) = $self->_findTypes($hsp);
my ($qstrand, $hstrand) = $self->_findStrands($hsp);
my ($qinc, $hinc) = $self->_findIncrements($qstrand,$hstrand,$qtype,$htype);
my @gaps = ();
my @qchars = split(
my @hchars = split(
my $qstart;
if($qstrand == 1){
$qstart = $hsp->query->start;
}elsif($qstart == -1){
$qstart = $hsp->query->end;
}else{
$self->warn("[$qstart], invalid strand value on query");
$qstart = $hsp->query->start;
# Is this a SearchIO's bug???
}
my $hstart;
if($hstrand == 1){
$hstart = $hsp->subject->start;
}elsif($hstrand != -1){
$hstart = $hsp->subject->end;
}else{
$self->throw("[$hstart], invalid strand value on subject");
}
my $qend = $qstart;
my $hend = $hstart;
my $count = 0;
my $found = 0;
my @align_coordinates = ();
while($count <= $#qchars){
if($qchars[$count] ne '-' && $hchars[$count] ne '-') {
$qend += $qinc;
$hend += $hinc;
$found = 1;
}else{ # gapped region
push(@align_coordinates, [$qstart, $hstart]) if($found == 1);
$qstart = $qend;
$qstart += $qinc if($qchars[$count] ne '-');
$hstart = $hend;
$hstart += $hinc if($hchars[$count] ne '-');
$qend = $qstart;
$hend = $hstart;
$found = 0;
}
$count++;
}
if($found){
push(@align_coordinates, [$qstart, $hstart]);
}
my $cigar_string = "";
my $last = $#align_coordinates;
if($last >= 0){
for(my $i=0; $i<$last; $i++){
my $q_this_start = $align_coordinates[$i]->[0];
my $q_next_start = $align_coordinates[$i+1]->[0];
my $q_length = ($q_next_start-$q_this_start-1)*$qinc;
$q_length = abs($q_length);
my $h_this_start = $align_coordinates[$i]->[1];
my $h_next_start = $align_coordinates[$i+1]->[1];
my $h_length = ($h_next_start-$h_this_start-1)*$hinc;
$h_length = abs($h_length);
my $diff = $q_length - $h_length;
if($diff > 0){ # Insertion
$cigar_string .= $diff unless($diff == 1);
$cigar_string .= 'I';
}elsif($diff < 0){ # Deletion
$cigar_string .= -$diff unless($diff == -1);
$cigar_string .= 'D';
}else{ # e.g $diff == 0, Match
$cigar_string .= $q_length unless($q_length == 1);
$cigar_string .= 'M';
}
} # for
} # if
return $cigar_string;
}