204
$self->start_document();
206
while( defined ($_ = $self->_readline )) {
207
next if( ! $self->in_element('hsp') &&
208
/^\s+$/); # skip empty lines
209
if( m/(\S+)\s+searches\s+a\s+(protein\s+or\s+DNA\s+)?sequence/oxi ||
210
/(\S+)\s+compares\s+a/ ||
212
($_ = $self->_readline) &&
213
/(\S+)\s+searches\s+a\s+(protein\s+or\s+DNA\s+)?sequence/oxi ||
214
/(\S+)\s+compares\s+a/
218
$self->_pushback($_);
219
$self->end_element({ 'Name' => 'FastaOutput'});
220
return $self->end_document();
222
$self->{'_reporttype'} = $1;
223
$self->start_element({ 'Name' => 'FastaOutput' } );
224
$self->{'_result_count'}++;
227
$self->element({ 'Name' => 'FastaOutput_program',
228
'Data' => $self->{'_reporttype'}});
229
$_ = $self->_readline();
230
my ($version) = (/version\s+(\S+)/);
231
$version = '' unless defined $version;
232
$self->{'_version'} = $version;
233
$self->element({ 'Name' => 'FastaOutput_version',
234
'Data' => $version});
236
my ($last, $leadin, $type, $querylen, $querytype, $querydef);
238
while( defined($_ = $self->_readline()) ) {
204
$self->start_document();
206
while ( defined( $_ = $self->_readline ) ) {
207
next if ( !$self->in_element('hsp')
208
&& /^\s+$/ ); # skip empty lines
210
m/(\S+)\s+searches\s+a\s+(protein\s+or\s+DNA\s+)?sequence/oxi
211
|| /(\S+)\s+compares\s+a/
213
&& ( $_ = $self->_readline )
214
&& /(\S+)\s+searches\s+a\s+(protein\s+or\s+DNA\s+)?sequence/oxi
215
|| /(\S+)\s+compares\s+a/ )
219
$self->_pushback($_);
220
$self->end_element( { 'Name' => 'FastaOutput' } );
221
return $self->end_document();
223
$self->{'_reporttype'} = $1;
224
$self->start_element( { 'Name' => 'FastaOutput' } );
225
$self->{'_result_count'}++;
227
#$self->debug( "reporttype is " . $self->{'_reporttype'} . "\n" );
230
'Name' => 'FastaOutput_program',
231
'Data' => $self->{'_reporttype'}
234
$_ = $self->_readline();
235
my ($version) = (/version\s+(\S+)/);
236
$version = '' unless defined $version;
237
$self->{'_version'} = $version;
240
'Name' => 'FastaOutput_version',
245
my ( $last, $leadin, $type, $querylen, $querytype, $querydef );
247
while ( defined( $_ = $self->_readline() ) ) {
240
250
(?:\s+>) | # fa33 lead-in
241
251
(?:\s*\d+\s*>>>) # fa34 mlib lead-in
246
($leadin, $querydef) = ($1, $2);
247
if ($leadin =~ m/>>>/) {
248
if($querydef =~ /^(.*?)\s+(?:\-\s+)?(\d+)\s+(aa|nt)\s*$/o ) {
249
($querydef, $querylen, $querytype) = ($1, $2, $3);
253
if( $last =~ /(\S+)[:,]\s*(\d+)\s+(aa|nt)/ ) {
254
($querylen, $querytype) = ($2, $3);
259
} elsif ( m/^\s*vs\s+\S+/o ) {
260
if ( $last =~ /(\S+)[,:]\s+(\d+)\s+(aa|nt)/o) {
261
($querydef, $querylen, $querytype) = ($1, $2, $3);
268
if( $self->{'_reporttype'} &&
269
$self->{'_reporttype'} eq 'FASTA'
271
if( $querytype eq 'nt') {
272
$self->{'_reporttype'} = 'FASTN' ;
273
} elsif( $querytype eq 'aa' ) {
274
$self->{'_reporttype'} = 'FASTP' ;
277
my ($name, $descr) = $querydef =~ m/^(\S+)\s*(.*?)\s*$/o;
278
$self->element({'Name' => 'FastaOutput_query-def',
280
$self->element({'Name' => 'FastaOutput_querydesc',
283
$self->element({'Name' => 'FastaOutput_query-len',
284
'Data' => $querylen});
286
$self->warn("unable to find and set query length");
288
if( $last =~ /^\s*vs\s+(\S+)/ ||
289
( $last =~ /^searching\s+(\S+)\s+library/ ) ||
290
(defined $_ && /^\s*vs\s+(\S+)/) ||
291
(defined ($_ = $self->_readline()) && /^\s*vs\s+(\S+)/)
293
$self->element({'Name' => 'FastaOutput_db',
295
} elsif (m/^\s+opt(?:\s+E\(\))?$/o) {
296
# histogram ... read over it more rapidly than the larger outer loop:
297
while (defined($_ = $self->_readline)) {
302
} elsif( /(\d+) residues in\s+(\d+)\s+sequences/ ) {
303
$self->element({'Name' => 'FastaOutput_db-let',
305
$self->element({'Name' => 'FastaOutput_db-len',
307
$self->element({'Name' => 'Statistics_db-len',
309
$self->element({'Name' => 'Statistics_db-num',
311
} elsif( /Lambda=\s*(\S+)/ ) {
312
$self->element({'Name' => 'Statistics_lambda',
314
} elsif (/K=\s*(\S+)/) {
315
$self->element({'Name' => 'Statistics_kappa',
317
} elsif( /^\s*(Smith-Waterman).+(\S+)\s*matrix [^\]]*?(xS)?\]/ ) {
318
$self->element({'Name' => 'Parameters_matrix',
320
$self->element({'Name' => 'Parameters_filter',
321
'Data' => defined $3 ? 1 : 0,
323
$self->{'_reporttype'} = $1;
325
$self->element({ 'Name' => 'FastaOutput_program',
326
'Data' => $self->{'_reporttype'}});
328
} elsif( /The best( related| unrelated)? scores are:/ ) {
332
if ($_ =~ m/^E\((\d+)\)$/o) {
333
$self->element({'Name' => 'Statistics_eff-space', 'Data' => $1});
338
} @labels[$rel ? 5 : 4 .. $#labels];
340
while( defined ($_ = $self->_readline() ) &&
344
if ($line[-1] =~ m/\=/o && $labels[-1] eq 'fs') {
345
# unlabelled alignment hit;
346
push @labels, "aln_code";
350
@data{@labels} = splice(@line, @line - @labels);
351
if ($line[-1] =~ m/\[([1-6rf])\]/o) {
353
$data{lframe} = ($fr =~ /\d/o ?
354
($fr <= 3 ? "+$fr" : "-@{[$fr-3]}") :
355
($fr eq 'f' ? '+1' : '-1')
362
if ($line[-1] =~ m/^\(?(\d+)\)$/) {
365
if ($line[-1] =~ m/^\($/) {
372
# rebuild the first part of the line, preserving spaces:
373
($_) = m/^(\S+(?:\s+\S+){$#line})/;
375
my ($id, $desc) = split(/\s+/,$_,2);
376
my @pieces = split(/\|/,$id);
377
my $acc = pop @pieces;
380
@data{qw(id desc acc)} = ($id, $desc, $acc);
382
push @hit_signifs, \%data;
384
} elsif( /^\s*([T]?FAST[XYAF]).+,\s*(\S+)\s*matrix[^\]]+?(xS)?\]\s*ktup:\s*(\d+)/ ) {
385
$self->element({'Name' => 'Parameters_matrix',
387
$self->element({'Name' => 'Parameters_filter',
388
'Data' => defined $3 ? 1 : 0,
390
$self->element({'Name' => 'Parameters_ktup',
392
$self->{'_reporttype'} = $1 if( $self->{'_reporttype'} !~ /FAST[PN]/i ) ;
394
$self->element({ 'Name' => 'FastaOutput_program',
395
'Data' => $self->{'_reporttype'}});
397
} elsif( /(?:gap\-pen|open\/ext):\s+([\-\+]?\d+)\s*\/\s*([\-\+]?\d+).+width:\s+(\d+)/ ) {
398
$self->element({'Name' => 'Parameters_gap-open',
400
$self->element({'Name' => 'Parameters_gap-ext',
402
$self->element({'Name' => 'Parameters_word-size',
404
} elsif( /^>>(.+?)\s+\((\d+)\s*(aa|nt)\)$/ ) {
405
if( $self->in_element('hsp') ) {
406
$self->end_element({ 'Name' => 'Hsp'});
408
if( $self->in_element('hit') ) {
409
$self->end_element({ 'Name' => 'Hit'});
412
$self->start_element({'Name' => 'Hit'});
413
$self->element({ 'Name' => 'Hit_len',
415
my ($id,$desc) = split(/\s+/,$1,2);
416
$self->element({ 'Name' => 'Hit_id',
418
my @pieces = split(/\|/,$id);
419
my $acc = pop @pieces;
421
$self->element({ 'Name' => 'Hit_accession',
423
$self->element({ 'Name' => 'Hit_def',
426
$_ = $self->_readline();
427
my ($score,$bits,$e) = /Z-score: \s* (\S+) \s*
257
( $leadin, $querydef ) = ( $1, $2 );
258
if ( $leadin =~ m/>>>/ ) {
260
/^(.*?)\s+(?:\-\s+)?(\d+)\s+(aa|nt).*$/o )
262
( $querydef, $querylen, $querytype ) =
268
if ( $last =~ /(\S+)[:,]\s*(\d+)\s+(aa|nt)/ ) {
269
( $querylen, $querytype ) = ( $2, $3 );
275
elsif (m/^\s*vs\s+\S+/o) {
276
if ( $last =~ /(\S+)[,:]\s+(\d+)\s+(aa|nt)/o ) {
277
( $querydef, $querylen, $querytype ) = ( $1, $2, $3 );
283
if ( $self->{'_reporttype'}
284
&& $self->{'_reporttype'} eq 'FASTA' )
286
if ( $querytype eq 'nt' ) {
287
$self->{'_reporttype'} = 'FASTN';
289
elsif ( $querytype eq 'aa' ) {
290
$self->{'_reporttype'} = 'FASTP';
293
my ( $name, $descr ) = $querydef =~ m/^(\S+)\s*(.*?)\s*$/o;
296
'Name' => 'FastaOutput_query-def',
302
'Name' => 'FastaOutput_querydesc',
309
'Name' => 'FastaOutput_query-len',
315
$self->warn("unable to find and set query length");
318
$last =~ /^\s*vs\s+(\S+)/
319
|| ( $last =~ /^searching\s+(\S+)\s+library/ )
320
|| ( $last =~ /^Library:\s+(\S+)\s+/ )
323
&& ( /^\s*vs\s+(\S+)/
324
|| /^Library:\s+(\S+)\s+/ )
326
|| ( defined( $_ = $self->_readline() )
327
&& ( /^\s*vs\s+(\S+)/ || /^Library:\s+(\S+)/ ) )
332
'Name' => 'FastaOutput_db',
337
elsif (m/^\s+opt(?:\s+E\(\))?$/o) {
339
# histogram ... read over it more rapidly than the larger outer loop:
340
while ( defined( $_ = $self->_readline ) ) {
345
elsif (/(\d+)\s+residues\s+in\s+(\d+)\s+(?:library\s+)?sequences/) {
348
'Name' => 'FastaOutput_db-let',
354
'Name' => 'FastaOutput_db-len',
360
'Name' => 'Statistics_db-len',
366
'Name' => 'Statistics_db-num',
371
elsif (/Lambda=\s*(\S+)/) {
374
'Name' => 'Statistics_lambda',
379
elsif (/K=\s*(\S+)/) {
382
'Name' => 'Statistics_kappa',
387
elsif (/^\s*(Smith-Waterman).+(\S+)\s*matrix [^\]]*?(xS)?\]/) {
390
'Name' => 'Parameters_matrix',
396
'Name' => 'Parameters_filter',
397
'Data' => defined $3 ? 1 : 0,
400
$self->{'_reporttype'} = $1;
404
'Name' => 'FastaOutput_program',
405
'Data' => $self->{'_reporttype'}
409
elsif (/The best( related| unrelated)? scores are:/) {
413
if ( $_ =~ m/^E\((\d+)\)$/o )
416
{ 'Name' => 'Statistics_eff-space', 'Data' => $1 } );
422
} @labels[ $rel ? 5 : 4 .. $#labels ];
424
while ( defined( $_ = $self->_readline() )
429
if ( $line[-1] =~ m/\=/o && $labels[-1] eq 'fs' ) {
431
# unlabelled alignment hit;
432
push @labels, "aln_code";
436
@data{@labels} = splice( @line, @line - @labels );
437
if ( $line[-1] =~ m/\[([1-6rf])\]/o ) {
441
? ( $fr <= 3 ? "+$fr" : "-@{[$fr-3]}" )
442
: ( $fr eq 'f' ? '+1' : '-1' )
450
if ( $line[-1] =~ m/^\(?(\d+)\)$/ ) {
453
if ( $line[-1] =~ m/^\($/ ) {
461
# rebuild the first part of the line, preserving spaces:
462
($_) = m/^(\S+(?:\s+\S+){$#line})/;
464
my ( $id, $desc ) = split( /\s+/, $_, 2 );
465
my @pieces = split( /\|/, $id );
466
my $acc = pop @pieces;
469
@data{qw(id desc acc)} = ( $id, $desc, $acc );
471
push @hit_signifs, \%data;
475
/^\s*([T]?FAST[XYAF]).+,\s*(\S+)\s*matrix[^\]]+?(xS)?\]\s*ktup:\s*(\d+)/
481
'Name' => 'Parameters_matrix',
487
'Name' => 'Parameters_filter',
488
'Data' => defined $3 ? 1 : 0,
493
'Name' => 'Parameters_ktup',
497
$self->{'_reporttype'} = $1
498
if ( $self->{'_reporttype'} !~ /FAST[PN]/i );
502
'Name' => 'FastaOutput_program',
503
'Data' => $self->{'_reporttype'}
507
elsif (/^Algorithm:\s+(\S+)\s+\(([^)]+)\)\s+(\S+)/) {
508
$self->{'_reporttype'} = $1
509
if ( $self->{'_reporttype'} !~ /FAST[PN]/i );
512
/^Parameters:\s+(\S+)\s*matrix\s*(?:\(([^(]+?)\))?\s*ktup:\s*(\d+)/)
516
'Name' => 'Parameters_matrix',
522
'Name' => 'Parameters_filter',
523
'Data' => defined $2 ? $2 : 0,
528
'Name' => 'Parameters_ktup',
534
/(?:gap\-pen|open\/ext):\s+([\-\+]?\d+)\s*\/\s*([\-\+]?\d+).+width:\s+(\d+)/
539
'Name' => 'Parameters_gap-open',
545
'Name' => 'Parameters_gap-ext',
551
'Name' => 'Parameters_word-size',
556
elsif (/^>>(.+?)\s+\((\d+)\s*(aa|nt)\)$/) {
557
if ( $self->in_element('hsp') ) {
558
$self->end_element( { 'Name' => 'Hsp' } );
560
if ( $self->in_element('hit') ) {
561
$self->end_element( { 'Name' => 'Hit' } );
564
$self->start_element( { 'Name' => 'Hit' } );
571
my ( $id, $desc ) = split( /\s+/, $1, 2 );
579
#$self->debug("Hit ID is $id\n") if $self->verbose > 0;
580
my @pieces = split( /\|/, $id );
581
my $acc = pop @pieces;
585
'Name' => 'Hit_accession',
596
$_ = $self->_readline();
597
my ( $score, $bits, $e ) = /Z-score: \s* (\S+) \s*
428
598
(?: bits: \s* (\S+) \s+ )?
429
599
(?: E|expect ) \s* \(\) :? \s*(\S+)/ox;
430
$bits = $score unless defined $bits;
432
my $v = shift @hit_signifs;
434
@{$v}{qw(evalue bits z-sc)} = ($e, $bits, $score);
436
$self->element({'Name' => 'Hit_signif',
437
'Data' => $v ? $v->{evalue} : $e });
438
$self->element({'Name' => 'Hit_score',
439
'Data' => $v ? $v->{bits} : $bits });
440
$self->start_element({'Name' => 'Hsp'});
442
$self->element({'Name' => 'Hsp_score',
443
'Data' => $v ? $v->{'z-sc'} : $score });
444
$self->element({'Name' => 'Hsp_evalue',
445
'Data' => $v ? $v->{evalue} : $e });
446
$self->element({'Name' => 'Hsp_bit-score',
447
'Data' => $v ? $v->{bits} : $bits });
448
$_ = $self->_readline();
449
if( s/Smith-Waterman score:\s*(\d+)\;?// ) {
450
$self->element({'Name' => 'Hsp_sw-score',
453
if( / (\d*\.?\d+)\% \s* identity
600
$bits = $score unless defined $bits;
602
my $v = shift @hit_signifs;
604
@{$v}{qw(evalue bits z-sc)} = ( $e, $bits, $score );
608
'Name' => 'Hit_signif',
609
'Data' => $v ? $v->{evalue} : $e
614
'Name' => 'Hit_score',
615
'Data' => $v ? $v->{bits} : $bits
618
$self->start_element( { 'Name' => 'Hsp' } );
622
'Name' => 'Hsp_score',
623
'Data' => $v ? $v->{'z-sc'} : $score
628
'Name' => 'Hsp_evalue',
629
'Data' => $v ? $v->{evalue} : $e
634
'Name' => 'Hsp_bit-score',
635
'Data' => $v ? $v->{bits} : $bits
638
$_ = $self->_readline();
640
if (s/Smith-Waterman score:\s*(\d+)\;?//) {
643
'Name' => 'Hsp_sw-score',
649
/ (\d*\.?\d+)\% \s* identity
454
650
(?:\s* \(\s*(\S+)\% \s* (?:ungapped|similar) \) )?
455
651
\s* in \s* (\d+) \s+ (?:aa|nt) \s+ overlap \s*
456
652
\( (\d+) \- (\d+) : (\d+) \- (\d+) \)
458
my ($identper,$gapper,$len,$querystart,
459
$queryend,$hitstart,$hitend) = ($1,$2,$3,$4,$5,$6,$7);
460
my $ident = POSIX::ceil(($identper/100) * $len);
461
my $gaps = ( defined $gapper ) ? POSIX::ceil ( ($gapper/100) * $len) : undef;
463
$self->element({'Name' => 'Hsp_gaps',
465
$self->element({'Name' => 'Hsp_identity',
467
$self->element({'Name' => 'Hsp_positive',
469
$self->element({'Name' => 'Hsp_align-len',
472
$self->debug( "query_start = $querystart, query_end = $queryend\n");
473
$self->element({'Name' => 'Hsp_query-from',
474
'Data' => $querystart});
475
$self->element({'Name' => 'Hsp_query-to',
476
'Data' => $queryend});
477
$self->element({'Name' => 'Hsp_hit-from',
478
'Data' => $hitstart});
479
$self->element({'Name' => 'Hsp_hit-to',
485
$self->element({'Name' => 'Hsp_querygaps', 'Data' => $v->{qgaps} }) if exists $v->{qgaps};
486
$self->element({'Name' => 'Hsp_hitgaps', 'Data' => $v->{lgaps} }) if exists $v->{lgaps};
488
if ($self->{'_reporttype'} =~ m/^FAST[NXY]$/o) {
489
if( 8 == scalar grep { exists $v->{$_} } qw(an0 ax0 pn0 px0 an1 ax1 pn1 px1) ) {
490
if ($v->{ax0} < $v->{an0}) {
491
$self->element({'Name' => 'Hsp_query-frame', 'Data' => "-@{[(($v->{px0} - $v->{ax0}) % 3) + 1]}" });
493
$self->element({'Name' => 'Hsp_query-frame', 'Data' => "+@{[(($v->{an0} - $v->{pn0}) % 3) + 1]}" });
495
if ($v->{ax1} < $v->{an1}) {
496
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => "-@{[(($v->{px1} - $v->{ax1}) % 3) + 1]}" });
498
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => "+@{[(($v->{an1} - $v->{pn1}) % 3) + 1]}" });
501
$self->element({'Name' => 'Hsp_query-frame', 'Data' => $v->{lframe} });
502
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => 0 });
505
$self->element({'Name' => 'Hsp_query-frame', 'Data' => 0 });
506
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => $v->{lframe} });
510
$self->warn( "unable to parse FASTA score line: $_");
512
} elsif( /\d+\s*residues\s*in\s*\d+\s*query\s*sequences/ ) {
513
if( $self->in_element('hsp') ) {
514
$self->end_element({'Name' => 'Hsp'});
516
if( $self->in_element('hit') ) {
517
$self->end_element({'Name' => 'Hit'});
520
# $_ = $self->_readline();
521
# my ( $liblen,$libsize) = /(\d+)\s+residues\s*in(\d+)\s*library/;
522
# fast forward to the end of the file as there is
523
# nothing else left to do with this file and want to be sure and
525
while(defined($_ = $self->_readline() ) ) {
526
last if( /^Function used was/);
527
if( /(\S+)\s+searches\s+a\s+(protein\s+or\s+DNA\s+)?
529
/(\S+)\s+compares\s+a/oi ) {
530
$self->_pushback($_);
535
# process remaining best hits
536
for my $h (@hit_signifs) {
537
# Hsp_score Hsp_evalue Hsp_bit-score
538
# Hsp_sw-score Hsp_gaps Hsp_identity Hsp_positive
539
# Hsp_align-len Hsp_query-from Hsp_query-to
540
# Hsp_hit-from Hsp_hit-to Hsp_qseq Hsp_midline
542
$self->start_element({'Name' => 'Hit'});
543
$self->element({ 'Name' => 'Hit_len',
544
'Data' => $h->{hit_len}
545
}) if exists $h->{hit_len};
546
$self->element({ 'Name' => 'Hit_id',
548
}) if exists $h->{id};
549
$self->element({ 'Name' => 'Hit_accession',
551
}) if exists $h->{acc};
552
$self->element({ 'Name' => 'Hit_def',
554
}) if exists $h->{desc};
555
$self->element({'Name' => 'Hit_signif',
556
'Data' => $h->{evalue}
557
}) if exists $h->{evalue};
558
$self->element({'Name' => 'Hit_score',
560
}) if exists $h->{bits};
562
$self->start_element({'Name' => 'Hsp'});
563
$self->element({'Name' => 'Hsp_score', 'Data' => $h->{'z-sc'} }) if exists $h->{'z-sc'};
564
$self->element({'Name' => 'Hsp_evalue', 'Data' => $h->{evalue} }) if exists $h->{evalue};
565
$self->element({'Name' => 'Hsp_bit-score', 'Data' => $h->{bits} }) if exists $h->{bits};
566
$self->element({'Name' => 'Hsp_sw-score', 'Data' => $h->{sw} }) if exists $h->{sw};
567
$self->element({'Name' => 'Hsp_gaps', 'Data' => $h->{'%_gid'} }) if exists $h->{'%_gid'};
568
$self->element({'Name' => 'Hsp_identity', 'Data' => POSIX::ceil($h->{'%_id'} * $h->{alen}) })
569
if (exists $h->{'%_id'} && exists $h->{alen});
570
if( exists $h->{'%_gid'} ) {
571
$self->element({'Name' => 'Hsp_positive', 'Data' => POSIX::ceil($h->{'%_gid'} * $h->{alen})}) if exists $h->{'%_gid'} && exists $h->{alen};
573
$self->element({'Name' => 'Hsp_positive', 'Data' => POSIX::ceil($h->{'%_id'} * $h->{alen}) })
574
if (exists $h->{'%_id'} && exists $h->{alen});
576
$self->element({'Name' => 'Hsp_align-len', 'Data' => $h->{alen} }) if exists $h->{alen};
577
$self->element({'Name' => 'Hsp_query-from', 'Data' => $h->{an0} }) if exists $h->{an0};
578
$self->element({'Name' => 'Hsp_query-to', 'Data' => $h->{ax0} }) if exists $h->{ax0};
579
$self->element({'Name' => 'Hsp_hit-from', 'Data' => $h->{an1} }) if exists $h->{an1};
580
$self->element({'Name' => 'Hsp_hit-to', 'Data' => $h->{ax1} }) if exists $h->{ax1};
582
$self->element({'Name' => 'Hsp_querygaps', 'Data' => $h->{qgaps} }) if exists $h->{qgaps};
583
$self->element({'Name' => 'Hsp_hitgaps', 'Data' => $h->{lgaps} }) if exists $h->{lgaps};
585
if ($self->{'_reporttype'} =~ m/^FAST[NXY]$/o) {
586
if( 8 == scalar grep { exists $h->{$_} } qw(an0 ax0 pn0 px0 an1 ax1 pn1 px1) ) {
587
if ($h->{ax0} < $h->{an0}) {
588
$self->element({'Name' => 'Hsp_query-frame', 'Data' => "-@{[(($h->{px0} - $h->{ax0}) % 3) + 1]}" });
590
$self->element({'Name' => 'Hsp_query-frame', 'Data' => "+@{[(($h->{an0} - $h->{pn0}) % 3) + 1]}" });
592
if ($h->{ax1} < $h->{an1}) {
593
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => "-@{[(($h->{px1} - $h->{ax1}) % 3) + 1]}" });
595
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => "+@{[(($h->{an1} - $h->{pn1}) % 3) + 1]}" });
598
$self->element({'Name' => 'Hsp_query-frame', 'Data' => $h->{lframe} });
599
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => 0 });
602
$self->element({'Name' => 'Hsp_query-frame', 'Data' => 0 });
603
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => $h->{lframe} });
606
$self->end_element({'Name' => 'Hsp'});
607
$self->end_element({'Name' => 'Hit'});
611
$self->end_element({ 'Name' => 'FastaOutput'});
612
return $self->end_document();
613
} elsif( /^\s*\d+\s*>>>/) {
614
if ($self->within_element('FastaOutput')) {
615
if( $self->in_element('hsp') ) {
616
$self->end_element({'Name' => 'Hsp'});
618
if( $self->in_element('hit') ) {
619
$self->end_element({'Name' => 'Hit'});
623
# process remaining best hits
624
for my $h (@hit_signifs) {
625
$self->start_element({'Name' => 'Hit'});
626
$self->element({ 'Name' => 'Hit_len',
627
'Data' => $h->{hit_len}
628
}) if exists $h->{hit_len};
629
$self->element({ 'Name' => 'Hit_id',
631
}) if exists $h->{id};
632
$self->element({ 'Name' => 'Hit_accession',
634
}) if exists $h->{acc};
635
$self->element({ 'Name' => 'Hit_def',
637
}) if exists $h->{desc};
638
$self->element({'Name' => 'Hit_signif',
639
'Data' => $h->{evalue}
640
}) if exists $h->{evalue};
641
$self->element({'Name' => 'Hit_score',
643
}) if exists $h->{bits};
645
$self->start_element({'Name' => 'Hsp'});
646
$self->element({'Name' => 'Hsp_score', 'Data' => $h->{'z-sc'} }) if exists $h->{'z-sc'};
647
$self->element({'Name' => 'Hsp_evalue', 'Data' => $h->{evalue} }) if exists $h->{evalue};
648
$self->element({'Name' => 'Hsp_bit-score', 'Data' => $h->{bits} }) if exists $h->{bits};
649
$self->element({'Name' => 'Hsp_sw-score', 'Data' => $h->{sw} }) if exists $h->{sw};
650
$self->element({'Name' => 'Hsp_gaps', 'Data' => $h->{'%_gid'} }) if exists $h->{'%_gid'};
651
$self->element({'Name' => 'Hsp_identity', 'Data' => POSIX::ceil($h->{'%_id'} * $h->{alen}) })
652
if (exists $h->{'%_id'} && exists $h->{alen});
653
if( exists $h->{'%_gid'} ) {
654
$self->element({'Name' => 'Hsp_positive', 'Data' => POSIX::ceil($h->{'%_gid'} * $h->{alen})}) if exists $h->{'%_gid'} && exists $h->{alen};
656
$self->element({'Name' => 'Hsp_positive', 'Data' => POSIX::ceil($h->{'%_id'} * $h->{alen}) })
657
if (exists $h->{'%_id'} && exists $h->{alen});
659
$self->element({'Name' => 'Hsp_align-len', 'Data' => $h->{alen} }) if exists $h->{alen};
660
$self->element({'Name' => 'Hsp_query-from', 'Data' => $h->{an0} }) if exists $h->{an0};
661
$self->element({'Name' => 'Hsp_query-to', 'Data' => $h->{ax0} }) if exists $h->{ax0};
662
$self->element({'Name' => 'Hsp_hit-from', 'Data' => $h->{an1} }) if exists $h->{an1};
663
$self->element({'Name' => 'Hsp_hit-to', 'Data' => $h->{ax1} }) if exists $h->{ax1};
665
$self->element({'Name' => 'Hsp_querygaps', 'Data' => $h->{qgaps} }) if exists $h->{qgaps};
666
$self->element({'Name' => 'Hsp_hitgaps', 'Data' => $h->{lgaps} }) if exists $h->{lgaps};
668
if ($self->{'_reporttype'} =~ m/^FAST[NXY]$/o) {
669
if( 8 == scalar grep { exists $h->{$_} } qw(an0 ax0 pn0 px0 an1 ax1 pn1 px1) ) {
670
if ($h->{ax0} < $h->{an0}) {
671
$self->element({'Name' => 'Hsp_query-frame', 'Data' => "-@{[(($h->{px0} - $h->{ax0}) % 3) + 1]}" });
673
$self->element({'Name' => 'Hsp_query-frame', 'Data' => "+@{[(($h->{an0} - $h->{pn0}) % 3) + 1]}" });
675
if ($h->{ax1} < $h->{an1}) {
676
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => "-@{[(($h->{px1} - $h->{ax1}) % 3) + 1]}" });
678
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => "+@{[(($h->{an1} - $h->{pn1}) % 3) + 1]}" });
681
$self->element({'Name' => 'Hsp_query-frame', 'Data' => $h->{lframe} });
682
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => 0 });
685
$self->element({'Name' => 'Hsp_query-frame', 'Data' => 0 });
686
$self->element({'Name' => 'Hsp_hit-frame', 'Data' => $h->{lframe} });
689
$self->end_element({'Name' => 'Hsp'});
690
$self->end_element({'Name' => 'Hit'});
693
$self->end_element({ 'Name' => 'FastaOutput' });
694
$self->_pushback($_);
695
return $self->end_document();
697
$self->start_element({ 'Name' => 'FastaOutput' });
698
$self->{'_result_count'}++;
700
$self->element({ 'Name' => 'FastaOutput_program',
701
'Data' => $self->{'_reporttype'} });
702
$self->element({ 'Name' => 'FastaOutput_version',
703
'Data' => $self->{'_version'} });
705
my ($type, $querylen, $querytype, $querydef);
707
if( /^\s*\d+\s*>>>(.*)/ ) {
709
if($querydef =~ /^(.*?)\s+(?:\-\s+)?(\d+)\s+(aa|nt)\s*$/o ) {
710
($querydef, $querylen, $querytype) = ($1, $2, $3);
714
if( $self->{'_reporttype'} &&
715
$self->{'_reporttype'} eq 'FASTA'
717
if( $querytype eq 'nt') {
718
$self->{'_reporttype'} = 'FASTN' ;
719
} elsif( $querytype eq 'aa' ) {
720
$self->{'_reporttype'} = 'FASTP' ;
723
my ($name,$descr) = ($querydef =~ m/^(\S+)(?:\s+(.*))?\s*$/o);
724
$self->element({'Name' => 'FastaOutput_query-def',
726
$self->element({'Name' => 'FastaOutput_querydesc',
729
$self->element({'Name' => 'FastaOutput_query-len',
730
'Data' => $querylen});
732
$self->warn("unable to find and set query length");
736
if( defined ($_ = $self->_readline()) && /^\s*vs\s+(\S+)/ ) {
737
$self->element({'Name' => 'FastaOutput_db',
741
} elsif( $self->in_element('hsp' ) ) {
743
my @data = ( [],[],[]);
745
my $len = $self->idlength + 1;
747
while( defined($_ ) ) {
749
$self->debug( "$count $_\n");
751
if( /residues in \d+\s+query\s+sequences/o) {
752
$self->_pushback($_);
754
} elsif (/^>>>\*\*\*/o) {
755
$self->end_element({Name => "Hsp"});
758
$self->_pushback($_);
760
} elsif (/^\s*\d+\s*>>>/o) {
761
$self->_pushback($_);
766
$self->_pushback($_);
768
} elsif( /^\s+\d+/ || /^\s+$/ ) {
769
# do nothing, this is really a 0 line
770
} elsif( length($_) == 0 ) {
773
$self->_pushback($_);
776
} elsif( $count == 1 || $count == 3 ) {
778
$len = CORE::length($1) if $len < CORE::length($1);
779
s/\s+$//; # trim trailing spaces,we don't want them
780
push @{$data[$count-1]},substr($_,$len);
781
} elsif( /^\s+(\d+)/ ) {
783
$self->_pushback($_);
784
} elsif( /^\s+$/ || length($_) == 0) {
786
# going to skip these
788
$self->warn("Unrecognized alignment line ($count) '$_'");
790
} elsif( $count == 2 ) {
792
$self->warn("$_\n") if $self->verbose > 0;
793
# we are on a Subject part of the alignment
794
# but we THOUGHT we were on the Query
795
# move that last line to the proper place
796
push @{$data[2]}, pop @{$data[0]};
799
# toss the first IDLENGTH characters of the line
800
if( length($_) >= $len ) {
801
push @{$data[$count-1]}, substr($_,$len);
805
last if( $count++ >= 5);
806
$_ = $self->_readline();
808
if( @{$data[0]} || @{$data[2]}) {
809
$self->characters({'Name' => 'Hsp_qseq',
810
'Data' => join('',@{$data[0]}) });
811
$self->characters({'Name' => 'Hsp_midline',
812
'Data' => join('',@{$data[1]}) });
813
$self->characters({'Name' => 'Hsp_hseq',
814
'Data' => join('',@{$data[2]}) });
819
$self->warn("unrecognized FASTA Family report file!");
656
my ( $identper, $gapper, $len, $querystart, $queryend,
658
= ( $1, $2, $3, $4, $5, $6, $7 );
659
my $ident = sprintf( "%.0f", ( $identper / 100 ) * $len );
660
my $positive = sprintf( "%.0f", ( $gapper / 100 ) * $len );
664
'Name' => 'Hsp_identity',
670
'Name' => 'Hsp_positive',
676
'Name' => 'Hsp_align-len',
683
'Name' => 'Hsp_query-from',
684
'Data' => $querystart
689
'Name' => 'Hsp_query-to',
695
'Name' => 'Hsp_hit-from',
701
'Name' => 'Hsp_hit-to',
710
{ 'Name' => 'Hsp_querygaps', 'Data' => $v->{qgaps} } )
711
if exists $v->{qgaps};
713
{ 'Name' => 'Hsp_hitgaps', 'Data' => $v->{lgaps} } )
714
if exists $v->{lgaps};
716
if ( $self->{'_reporttype'} =~ m/^FAST[NXY]$/o ) {
717
if ( 8 == scalar grep { exists $v->{$_} }
718
qw(an0 ax0 pn0 px0 an1 ax1 pn1 px1) )
720
if ( $v->{ax0} < $v->{an0} ) {
723
'Name' => 'Hsp_query-frame',
725
"-@{[(($v->{px0} - $v->{ax0}) % 3) + 1]}"
732
'Name' => 'Hsp_query-frame',
734
"+@{[(($v->{an0} - $v->{pn0}) % 3) + 1]}"
738
if ( $v->{ax1} < $v->{an1} ) {
741
'Name' => 'Hsp_hit-frame',
743
"-@{[(($v->{px1} - $v->{ax1}) % 3) + 1]}"
750
'Name' => 'Hsp_hit-frame',
752
"+@{[(($v->{an1} - $v->{pn1}) % 3) + 1]}"
760
'Name' => 'Hsp_query-frame',
761
'Data' => $v->{lframe}
765
{ 'Name' => 'Hsp_hit-frame', 'Data' => 0 } );
770
{ 'Name' => 'Hsp_query-frame', 'Data' => 0 } );
772
{ 'Name' => 'Hsp_hit-frame', 'Data' => $v->{lframe} } );
777
$self->warn("unable to parse FASTA score line: $_");
780
elsif (/\d+\s*residues\s*in\s*\d+\s*query\s*sequences/) {
781
if ( $self->in_element('hsp') ) {
782
$self->end_element( { 'Name' => 'Hsp' } );
784
if ( $self->in_element('hit') ) {
785
$self->end_element( { 'Name' => 'Hit' } );
788
# $_ = $self->_readline();
789
# my ( $liblen,$libsize) = /(\d+)\s+residues\s*in(\d+)\s*library/;
790
# fast forward to the end of the file as there is
791
# nothing else left to do with this file and want to be sure and
793
while ( defined( $_ = $self->_readline() ) ) {
794
last if (/^Function used was/);
796
/(\S+)\s+searches\s+a\s+(protein\s+or\s+DNA\s+)?
797
sequence/oxi || /(\S+)\s+compares\s+a/oi
800
$self->_pushback($_);
806
# process remaining best hits
807
for my $h (@hit_signifs) {
809
# Hsp_score Hsp_evalue Hsp_bit-score
810
# Hsp_sw-score Hsp_gaps Hsp_identity Hsp_positive
811
# Hsp_align-len Hsp_query-from Hsp_query-to
812
# Hsp_hit-from Hsp_hit-to Hsp_qseq Hsp_midline
814
$self->start_element( { 'Name' => 'Hit' } );
818
'Data' => $h->{hit_len}
820
) if exists $h->{hit_len};
826
) if exists $h->{id};
829
'Name' => 'Hit_accession',
832
) if exists $h->{acc};
838
) if exists $h->{desc};
841
'Name' => 'Hit_signif',
842
'Data' => $h->{evalue}
844
) if exists $h->{evalue};
847
'Name' => 'Hit_score',
850
) if exists $h->{bits};
852
$self->start_element( { 'Name' => 'Hsp' } );
854
{ 'Name' => 'Hsp_score', 'Data' => $h->{'z-sc'} } )
855
if exists $h->{'z-sc'};
857
{ 'Name' => 'Hsp_evalue', 'Data' => $h->{evalue} } )
858
if exists $h->{evalue};
860
{ 'Name' => 'Hsp_bit-score', 'Data' => $h->{bits} } )
861
if exists $h->{bits};
863
{ 'Name' => 'Hsp_sw-score', 'Data' => $h->{sw} } )
866
{ 'Name' => 'Hsp_gaps', 'Data' => $h->{'%_gid'} } )
867
if exists $h->{'%_gid'};
870
'Name' => 'Hsp_identity',
872
sprintf( "%.0f", $h->{'%_id'} * $h->{alen} )
874
) if ( exists $h->{'%_id'} && exists $h->{alen} );
876
if ( exists $h->{'%_gid'} ) {
879
'Name' => 'Hsp_positive',
881
sprintf( "%.0f", $h->{'%_gid'} * $h->{alen} )
883
) if exists $h->{'%_gid'} && exists $h->{alen};
888
'Name' => 'Hsp_positive',
890
sprintf( "%.0f", $h->{'%_id'} * $h->{alen} )
892
) if ( exists $h->{'%_id'} && exists $h->{alen} );
895
{ 'Name' => 'Hsp_align-len', 'Data' => $h->{alen} } )
896
if exists $h->{alen};
898
{ 'Name' => 'Hsp_query-from', 'Data' => $h->{an0} } )
901
{ 'Name' => 'Hsp_query-to', 'Data' => $h->{ax0} } )
904
{ 'Name' => 'Hsp_hit-from', 'Data' => $h->{an1} } )
907
{ 'Name' => 'Hsp_hit-to', 'Data' => $h->{ax1} } )
911
{ 'Name' => 'Hsp_querygaps', 'Data' => $h->{qgaps} } )
912
if exists $h->{qgaps};
914
{ 'Name' => 'Hsp_hitgaps', 'Data' => $h->{lgaps} } )
915
if exists $h->{lgaps};
917
if ( $self->{'_reporttype'} =~ m/^FAST[NXY]$/o ) {
918
if ( 8 == scalar grep { exists $h->{$_} }
919
qw(an0 ax0 pn0 px0 an1 ax1 pn1 px1) )
921
if ( $h->{ax0} < $h->{an0} ) {
924
'Name' => 'Hsp_query-frame',
926
"-@{[(($h->{px0} - $h->{ax0}) % 3) + 1]}"
933
'Name' => 'Hsp_query-frame',
935
"+@{[(($h->{an0} - $h->{pn0}) % 3) + 1]}"
939
if ( $h->{ax1} < $h->{an1} ) {
942
'Name' => 'Hsp_hit-frame',
944
"-@{[(($h->{px1} - $h->{ax1}) % 3) + 1]}"
951
'Name' => 'Hsp_hit-frame',
953
"+@{[(($h->{an1} - $h->{pn1}) % 3) + 1]}"
961
'Name' => 'Hsp_query-frame',
962
'Data' => $h->{lframe}
966
{ 'Name' => 'Hsp_hit-frame', 'Data' => 0 } );
971
{ 'Name' => 'Hsp_query-frame', 'Data' => 0 } );
974
'Name' => 'Hsp_hit-frame',
975
'Data' => $h->{lframe}
980
$self->end_element( { 'Name' => 'Hsp' } );
981
$self->end_element( { 'Name' => 'Hit' } );
984
$self->end_element( { 'Name' => 'FastaOutput' } );
985
return $self->end_document();
987
elsif (/^\s*\d+\s*>>>/) {
988
if ( $self->within_element('FastaOutput') ) {
989
if ( $self->in_element('hsp') ) {
990
$self->end_element( { 'Name' => 'Hsp' } );
992
if ( $self->in_element('hit') ) {
993
$self->end_element( { 'Name' => 'Hit' } );
998
# process remaining best hits
999
for my $h (@hit_signifs) {
1000
$self->start_element( { 'Name' => 'Hit' } );
1003
'Name' => 'Hit_len',
1004
'Data' => $h->{hit_len}
1006
) if exists $h->{hit_len};
1012
) if exists $h->{id};
1015
'Name' => 'Hit_accession',
1018
) if exists $h->{acc};
1021
'Name' => 'Hit_def',
1022
'Data' => $h->{desc}
1024
) if exists $h->{desc};
1027
'Name' => 'Hit_signif',
1028
'Data' => $h->{evalue}
1030
) if exists $h->{evalue};
1033
'Name' => 'Hit_score',
1034
'Data' => $h->{bits}
1036
) if exists $h->{bits};
1038
$self->start_element( { 'Name' => 'Hsp' } );
1040
{ 'Name' => 'Hsp_score', 'Data' => $h->{'z-sc'} } )
1041
if exists $h->{'z-sc'};
1043
{ 'Name' => 'Hsp_evalue', 'Data' => $h->{evalue} } )
1044
if exists $h->{evalue};
1046
{ 'Name' => 'Hsp_bit-score', 'Data' => $h->{bits} }
1047
) if exists $h->{bits};
1049
{ 'Name' => 'Hsp_sw-score', 'Data' => $h->{sw} } )
1052
{ 'Name' => 'Hsp_gaps', 'Data' => $h->{'%_gid'} } )
1053
if exists $h->{'%_gid'};
1056
'Name' => 'Hsp_identity',
1058
sprintf( "%.0f", $h->{'%_id'} * $h->{alen} )
1060
) if ( exists $h->{'%_id'} && exists $h->{alen} );
1062
if ( exists $h->{'%_gid'} ) {
1065
'Name' => 'Hsp_positive',
1066
'Data' => sprintf( "%.0f",
1067
$h->{'%_gid'} * $h->{alen} )
1069
) if exists $h->{'%_gid'} && exists $h->{alen};
1074
'Name' => 'Hsp_positive',
1075
'Data' => sprintf( "%.0f",
1076
$h->{'%_id'} * $h->{alen} )
1078
) if ( exists $h->{'%_id'} && exists $h->{alen} );
1081
{ 'Name' => 'Hsp_align-len', 'Data' => $h->{alen} }
1082
) if exists $h->{alen};
1084
{ 'Name' => 'Hsp_query-from', 'Data' => $h->{an0} }
1085
) if exists $h->{an0};
1087
{ 'Name' => 'Hsp_query-to', 'Data' => $h->{ax0} } )
1088
if exists $h->{ax0};
1090
{ 'Name' => 'Hsp_hit-from', 'Data' => $h->{an1} } )
1091
if exists $h->{an1};
1093
{ 'Name' => 'Hsp_hit-to', 'Data' => $h->{ax1} } )
1094
if exists $h->{ax1};
1098
'Name' => 'Hsp_querygaps',
1099
'Data' => $h->{qgaps}
1101
) if exists $h->{qgaps};
1103
{ 'Name' => 'Hsp_hitgaps', 'Data' => $h->{lgaps} } )
1104
if exists $h->{lgaps};
1106
if ( $self->{'_reporttype'} =~ m/^FAST[NXY]$/o ) {
1107
if ( 8 == scalar grep { exists $h->{$_} }
1108
qw(an0 ax0 pn0 px0 an1 ax1 pn1 px1) )
1110
if ( $h->{ax0} < $h->{an0} ) {
1113
'Name' => 'Hsp_query-frame',
1114
'Data' => "-@{[(($h->{px0} - $h->{ax0}) % 3) + 1]}"
1121
'Name' => 'Hsp_query-frame',
1122
'Data' => "+@{[(($h->{an0} - $h->{pn0}) % 3) + 1]}"
1126
if ( $h->{ax1} < $h->{an1} ) {
1129
'Name' => 'Hsp_hit-frame',
1130
'Data' => "-@{[(($h->{px1} - $h->{ax1}) % 3) + 1]}"
1137
'Name' => 'Hsp_hit-frame',
1138
'Data' => "+@{[(($h->{an1} - $h->{pn1}) % 3) + 1]}"
1146
'Name' => 'Hsp_query-frame',
1147
'Data' => $h->{lframe}
1151
{ 'Name' => 'Hsp_hit-frame', 'Data' => 0 }
1157
{ 'Name' => 'Hsp_query-frame', 'Data' => 0 } );
1160
'Name' => 'Hsp_hit-frame',
1161
'Data' => $h->{lframe}
1166
$self->end_element( { 'Name' => 'Hsp' } );
1167
$self->end_element( { 'Name' => 'Hit' } );
1170
$self->end_element( { 'Name' => 'FastaOutput' } );
1171
$self->_pushback($_);
1172
return $self->end_document();
1175
$self->start_element( { 'Name' => 'FastaOutput' } );
1176
$self->{'_result_count'}++;
1180
'Name' => 'FastaOutput_program',
1181
'Data' => $self->{'_reporttype'}
1186
'Name' => 'FastaOutput_version',
1187
'Data' => $self->{'_version'}
1191
my ( $type, $querylen, $querytype, $querydef );
1193
if (/^\s*\d+\s*>>>(.*)/) {
1195
if ( $querydef =~ /^(.*?)\s+(?:\-\s+)?(\d+)\s+(aa|nt).*$/o )
1197
( $querydef, $querylen, $querytype ) = ( $1, $2, $3 );
1201
if ( $self->{'_reporttype'}
1202
&& $self->{'_reporttype'} eq 'FASTA' )
1204
if ( $querytype eq 'nt' ) {
1205
$self->{'_reporttype'} = 'FASTN';
1207
elsif ( $querytype eq 'aa' ) {
1208
$self->{'_reporttype'} = 'FASTP';
1211
my ( $name, $descr ) =
1212
( $querydef =~ m/^(\S+)(?:\s+(.*))?\s*$/o );
1215
'Name' => 'FastaOutput_query-def',
1221
'Name' => 'FastaOutput_querydesc',
1228
'Name' => 'FastaOutput_query-len',
1234
$self->warn("unable to find and set query length");
1236
if ( defined( $_ = $self->_readline() )
1237
&& ( /^\s*vs\s+(\S+)/ || /^Library:\s+(\S+)/ ) )
1241
'Name' => 'FastaOutput_db',
1249
elsif ( $self->in_element('hsp') ) {
1250
my @data = ( [], [], [] );
1252
my $len = $self->idlength + 1;
1254
while ( defined($_) ) {
1256
#$self->debug("$count $_\n");
1257
if (/residues in \d+\s+query\s+sequences/o) {
1258
$self->_pushback($_);
1261
elsif (/^>>>\*\*\*/o) {
1262
$self->end_element( { Name => "Hsp" } );
1266
$self->_pushback($_);
1269
elsif (/^\s*\d+\s*>>>/o) {
1270
$self->_pushback($_);
1273
if ( $count == 0 ) {
1275
$self->_pushback($_);
1278
elsif ( /^\s+\d+/ || /^\s+$/ ) {
1280
# do nothing, this is really a 0 line
1282
elsif ( length($_) == 0 ) {
1286
$self->_pushback($_);
1290
elsif ( $count == 1 || $count == 3 ) {
1292
$len = CORE::length($1) if $len < CORE::length($1);
1293
s/\s+$//; # trim trailing spaces,we don't want them
1294
push @{ $data[ $count - 1 ] }, substr( $_, $len );
1296
elsif (/^\s+(\d+)/) {
1298
$self->_pushback($_);
1300
elsif ( /^\s+$/ || length($_) == 0 ) {
1303
# going to skip these
1307
"Unrecognized alignment line ($count) '$_'");
1310
elsif ( $count == 2 ) {
1312
$self->warn("$_\n") if $self->verbose > 0;
1314
# we are on a Subject part of the alignment
1315
# but we THOUGHT we were on the Query
1316
# move that last line to the proper place
1317
push @{ $data[2] }, pop @{ $data[0] };
1322
# toss the first IDLENGTH characters of the line
1323
if ( length($_) >= $len ) {
1324
push @{ $data[ $count - 1 ] }, substr( $_, $len );
1328
last if ( $count++ >= 5 );
1329
$_ = $self->_readline();
1331
if ( @{ $data[0] } || @{ $data[2] } ) {
1334
'Name' => 'Hsp_qseq',
1335
'Data' => join( '', @{ $data[0] } )
1340
'Name' => 'Hsp_midline',
1341
'Data' => join( '', @{ $data[1] } )
1346
'Name' => 'Hsp_hseq',
1347
'Data' => join( '', @{ $data[2] } )
1355
#$self->warn("unrecognized FASTA Family report file!");
1360
if ( $self->in_element('result') ) {
1361
if ( $self->in_element('hsp') ) {
1362
$self->end_element( { 'Name' => 'Hsp' } );
1364
if ( $self->in_element('hit') ) {
1365
$self->end_element( { 'Name' => 'Hit' } );
1367
$self->end_element( { 'Name' => 'FastaOutput' } );
1369
return $self->end_document();
827
1372
=head2 start_element
829
1374
Title : start_element