[Bio] / FigKernelPackages / StandaloneSims.pm Repository:
ViewVC logotype

Annotation of /FigKernelPackages/StandaloneSims.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (view) (download) (as text)

1 : olson 1.1
2 :     #
3 :     # Code to bundle up the manipulation of standalone sims files.
4 :     #
5 :     # A StandaloneSimsSet contains up to four files: raw sims, their flips, expanded sims, and their flips.
6 :     #
7 :     # Each sims file is represente by a StandaloneSimsFile object which wraps up the low level indexing, lookup,
8 :     # and retrieval code.
9 :     #
10 :     #
11 :    
12 :     package StandaloneSimsSet;
13 :    
14 :     use FIG;
15 :     use strict;
16 :    
17 :     my %rast_names = (flips_exp => 'expanded_similarities.flips',
18 :     flips_raw => 'similarities.flips',
19 :     fwd_raw => 'similarities',
20 :     fwd_exp => 'expanded_similarities');
21 :    
22 :     =head3 new
23 :    
24 :     my $sims_set = StandaloneSimsSet->new($dir, %opts).
25 :    
26 :     Constructor for a StandaloneSimsSet. Argument is a directory that is expected
27 :     to contain four sets of sim sets: fwd_raw, fwd_exp, flips_raw, flips_exp.
28 :    
29 :     %opts may contain overrides for the filenames for the four sets listed above. If the
30 :     option rast => 1 is passed, the usual RAST names for the files are used.
31 :    
32 :     Any of the four may be empty.
33 :    
34 :     =cut
35 :    
36 :     sub new
37 :     {
38 :     my($class, $dir, %opts) = @_;
39 :    
40 :     my $self = {
41 :     dir => $dir,
42 :     opts => \%opts,
43 :     };
44 :    
45 :     for my $set (qw(fwd_raw fwd_exp flips_raw flips_exp))
46 :     {
47 :     my $file = "$dir/$set";
48 :     if ($opts{rast})
49 :     {
50 :     $file = "$dir/$rast_names{$set}";
51 :     }
52 :     elsif ((my $alt = $opts{$set}) ne '')
53 :     {
54 :     if ($alt =~ m,^/,)
55 :     {
56 :     $file = $alt;
57 :     }
58 :     else
59 :     {
60 :     $file = "$dir/$alt";
61 :     }
62 :     }
63 :     $self->{$set} = StandaloneSimsFile->new($file);
64 :     }
65 :    
66 :     return bless $self, $class;
67 :     }
68 :    
69 :     sub sims_fwd
70 :     {
71 :     my ($self, $id, $maxN, $maxP, $select, $max_expand, $filters) = @_;
72 :    
73 :     return $self->get_sims('fwd', $id, $maxN, $maxP, $select, $max_expand, $filters);
74 :     }
75 :    
76 :     sub sims_flip
77 :     {
78 :     my ($self, $id, $maxN, $maxP, $select, $max_expand, $filters) = @_;
79 :    
80 :     return $self->get_sims('flips', $id, $maxN, $maxP, $select, $max_expand, $filters);
81 :     }
82 :    
83 :     sub get_sims
84 :     {
85 :     my ($self, $dir, $id_or_list, $maxN, $maxP, $select, $max_expand, $filters) = @_;
86 :    
87 :     my $cooked = ($select eq 'raw') ? 'raw' : 'exp';
88 :     my $set_name = $dir . '_' . $cooked;
89 :    
90 :     my $set = $self->{$set_name};
91 :    
92 :     my $filter_func = &FIG::create_sim_filter(undef, $maxP, $filters);
93 :    
94 :     my @out;
95 :     for my $id (ref($id_or_list) ? @$id_or_list : $id_or_list)
96 :     {
97 :     my $start_len = @out;
98 :    
99 :     push(@out, $set->get_sims($id, $filter_func));
100 :    
101 :     if (defined($maxN) and (@out - $start_len > $maxN))
102 :     {
103 :     $#out = $start_len + $maxN - 1;
104 :     }
105 :     }
106 :     return @out;
107 :     }
108 :    
109 :     package StandaloneSimsFile;
110 :    
111 :     use FIG;
112 :     use strict;
113 :     use DB_File;
114 :    
115 :     #
116 :     # A standalone sims file has the sims data in $file and
117 :     # a btree index in $file.index.
118 :     #
119 :     sub new
120 :     {
121 :     my($class, $file, $index_file) = @_;
122 :    
123 :     my $hash = {};
124 :    
125 :     $index_file = "$file.index" if $index_file eq '';
126 :    
127 :     my $tied = tie %$hash, 'DB_File', $index_file, O_RDONLY, 0666, $DB_BTREE;
128 :    
129 :     my $fh = new FileHandle("<$file");
130 :    
131 :     my $self = {
132 :     file => $file,
133 :     index_file => $index_file,
134 :     fh => $fh,
135 :     tied => $tied,
136 :     hash => $hash,
137 :     };
138 :     return bless $self, $class;
139 :     }
140 :    
141 :     #
142 :     # Retrieve sims. We don't do any filtering here.
143 :     #
144 :     sub get_sims
145 :     {
146 :     my($self, $id, $filter_func) = @_;
147 :    
148 :     my $info = $self->{hash}->{$id};
149 :    
150 :     if ($info !~ /^(\d+),(\d+)$/)
151 :     {
152 :     return;
153 :     }
154 :    
155 :     my($seek, $len) = ($1, $2);
156 :    
157 :     my $sims_txt = &FIG::read_block($self->{fh}, $seek, $len);
158 :    
159 :     my @sims;
160 :    
161 :     if (ref($filter_func))
162 :     {
163 :     @sims = map { bless $_, 'Sim' } grep { &$filter_func($_) } map { [split(/\t/)] } @$sims_txt;
164 :     }
165 :     else
166 :     {
167 :     @sims = map { bless $_, 'Sim' } map { [split(/\t/)] } @$sims_txt;
168 :     }
169 :    
170 :     return @sims;
171 :     }
172 :    
173 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3