File Coverage

Bio/Matrix/PSM/IO/psiblast.pm
Criterion Covered Total %
statement 49 49 100.0
branch 4 6 66.6
condition n/a
subroutine 7 7 100.0
pod 2 2 100.0
total 62 64 96.8


line stmt bran cond sub pod time code
1             #---------------------------------------------------------
2              
3             =head1 NAME
4              
5             Bio::Matrix::PSM::IO::psiblast - PSM psiblast parser
6              
7             =head1 SYNOPSIS
8              
9             See Bio::Matrix::PSM::IO for documentation
10              
11             =head1 DESCRIPTION
12              
13             Parser for ASCII matrices from PSI-BLAST (blastpgp program in
14             BLAST distribution).
15              
16             =head1 FEEDBACK
17              
18             =head2 Mailing Lists
19              
20             User feedback is an integral part of the evolution of this and other
21             Bioperl modules. Send your comments and suggestions preferably to one
22             of the Bioperl mailing lists. Your participation is much appreciated.
23              
24             bioperl-l@bioperl.org - General discussion
25             http://bioperl.org/wiki/Mailing_lists - About the mailing lists
26              
27             =head2 Support
28              
29             Please direct usage questions or support issues to the mailing list:
30              
31             I
32              
33             rather than to the module maintainer directly. Many experienced and
34             reponsive experts will be able look at the problem and quickly
35             address it. Please include a thorough description of the problem
36             with code and data examples if at all possible.
37              
38             =head2 Reporting Bugs
39              
40             Report bugs to the Bioperl bug tracking system to help us keep track
41             the bugs and their resolution. Bug reports can be submitted via the
42             web:
43              
44             https://github.com/bioperl/bioperl-live/issues
45              
46             =head1 AUTHOR - James Thompson
47              
48             Email tex@biosysadmin.com
49              
50             =head1 APPENDIX
51              
52             =cut
53              
54              
55             # Let the code begin...
56             package Bio::Matrix::PSM::IO::psiblast;
57 1     1   270 use Bio::Matrix::PSM::Psm;
  1         2  
  1         28  
58 1     1   433 use Bio::Matrix::PSM::ProtMatrix;
  1         2  
  1         21  
59 1     1   5 use strict;
  1         1  
  1         19  
60              
61 1     1   3 use base qw(Bio::Matrix::PSM::PsmHeader Bio::Matrix::PSM::IO);
  1         2  
  1         303  
62              
63             # define the order in which amino acids are listed in the psiblast matrix file
64             our @ordered_alphabet = qw/A R N D C Q E G H I L K M F P S T W Y V/;
65              
66             =head2 new
67              
68             Title : new
69             Usage : my $psmIO = Bio::Matrix::PSM::IO->new(-format=>'psiblast',
70             -file=>$file);
71             Function: Associates a file with the appropriate parser
72             Throws :
73             Example :
74             Args :
75             Returns : Bio::Matrix::PSM::ProtMatrix->new(@args);
76              
77             =cut
78              
79             sub new {
80 1     1 1 3 my ($class,@args)=@_;
81 1         1 my $line;
82              
83 1         5 my $self = $class->SUPER::new(@args);
84 1         6 my ($file) = $self->_rearrange(['FILE'], @args);
85 1 50       8 $self->_initialize_io(@args) || warn "Did you intend to use STDIN?"; # Read only for now
86 1         5 $self->_initialize;
87              
88 1         2 $self->{_ordered_alphabet} = \@ordered_alphabet;
89 1         6 return $self;
90             }
91              
92             =head2 next_psm
93              
94             Title : next_psm
95             Usage : my $psm = $psmIO->next_psm();
96             Function: Reads the next PSM from the input file, associated with this object
97             Throws : None
98             Returns : Bio::Matrix::PSM::ProtPsm object
99             Args : none
100              
101             =cut
102              
103             sub next_psm {
104 1     1 1 577 my $self = shift;
105 1         1 my $line;
106              
107 1 50       3 return if ($self->{_end});
108              
109 1         2 my %args;
110 1         0 my @ordered_alphabet = @{$self->{_ordered_alphabet}};
  1         4  
111              
112 1         7 while ( defined( $line = $self->_readline) ) {
113             # remove leading and trailing whitespace
114 516         433 chomp $line;
115 516         1283 $line =~ s/^\s+//g;
116 516         2403 $line =~ s/\s+$//g;
117            
118 516 100       1016 if ( $line =~ /^(\d+)\s+(\w{1})/ ) { # match reference aa and position number
119 507         7017 my @elements = split /\s+/, $line;
120            
121 507         418 my $position = shift @elements;
122 507         377 my $letter = shift @elements;
123            
124 507         288 my $ratio = pop @elements;
125 507         345 my $ic = pop @elements;
126            
127             # put the next 20 elements into the correct array in %args
128 507         590 for ( 0 .. 19 ) { push @{$args{'l'.$ordered_alphabet[$_]}}, shift @elements; }
  10140         5322  
  10140         10278  
129 507         414 for ( 0 .. 19 ) { push @{$args{'p'.$ordered_alphabet[$_]}}, shift @elements; }
  10140         5295  
  10140         9940  
130            
131 507         324 push @{$args{'ic'}}, $ic;
  507         1035  
132             }
133             }
134              
135 1         5 $self->{_end} = 1; # psiblast matrix files currently only hold one PSM per file
136              
137 1         24 my $psm = Bio::Matrix::PSM::ProtMatrix->new( %args );
138 1         118 return $psm;
139             }
140              
141             sub DESTROY {
142 1     1   3 my $self=shift;
143 1         17 $self->close;
144             }
145              
146             1;