[Bio] / FigKernelScripts / generate_partitions_worker.pl Repository:
ViewVC logotype

Annotation of /FigKernelScripts/generate_partitions_worker.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : overbeek 1.1 use FIG;
2 :     my $fig = new FIG;
3 : arodri7 1.2 my $dbf = $fig->db_handle;
4 : overbeek 1.1 use FIGO;
5 :     my $figO = new FIGO;
6 :    
7 :     use strict;
8 :    
9 :     my $sim_thresh = 1.0e-10;
10 : arodri7 1.2 my($usage,$fams,$outD,$proc,$log_file);
11 :     $usage = "usage: generate_partition_worker Families OutDir Process < FIGfams > Partitions";
12 :    
13 :     while ( $ARGV[0] =~ /^-/ )
14 :     {
15 :     $_ = shift @ARGV;
16 :     if ($_ =~ s/^-log//) { $log_file = ($_ || shift @ARGV) }
17 :     else { print STDERR "Bad flag: '$_'\n$usage"; exit 1 }
18 :     }
19 : overbeek 1.1
20 :     (
21 :     ($fams = shift @ARGV) && open(FAMS,"<$fams") &&
22 :     ($outD = shift @ARGV) &&
23 :     ($proc = shift @ARGV)
24 :     )
25 :     || die $usage;
26 :    
27 :     open(OUT,">>$outD/$proc") || die "could not open $outD/$proc";
28 :     my $ofh = select OUT; $| = 1; select $ofh;
29 :     my %done_fam;
30 :    
31 :     my(%fam_to_pegs,%peg_to_fams);
32 :     while (defined($_ = <FAMS>))
33 :     {
34 :     if ($_ =~ /^(\S+)\t(\S+)/)
35 :     {
36 :     my($fam,$peg) = ($1,$2);
37 :     if ((! $fig->is_deleted_fid($peg)) && (! $done_fam{$fam}))
38 :     {
39 :     push(@{$fam_to_pegs{$fam}},$peg);
40 :     push(@{$peg_to_fams{$peg}},$fam);
41 :     }
42 :     }
43 :     }
44 :     close(FAMS);
45 :     #print STDERR "loaded FIGfamsd\n";
46 :    
47 :     my $peg;
48 :     while (defined($_ = <STDIN>))
49 :     {
50 : arodri7 1.2 if (!$fig){
51 :     $fig = new FIG;
52 :     $dbf = $fig->db_handle;
53 :     }
54 :    
55 :     my $cond = "fam = '".$_."'";
56 :     my $x = $dbf->SQL("select fam from tmp_sync_partitions where $cond");
57 :    
58 :     # if (($_ =~ /(FIG\d{6})/) && (! $done_fam{$1}))
59 :     if (($_ =~ /(FIG\d{6})/) && (! $done_fam{$1}) && (! scalar @$x > 0))
60 : overbeek 1.1 {
61 :     my $ff = $1;
62 : arodri7 1.2 print STDERR "$proc processing $ff\n";
63 : overbeek 1.1
64 :     my $todo = { $ff => 1 };
65 :     my $loaded_fams = {};
66 :     my $state = [$fig,$figO,\%done_fam,$todo,$loaded_fams,\%fam_to_pegs,\%peg_to_fams,$sim_thresh];
67 :     &load_fam($ff,$state);
68 :    
69 :     my @todo;
70 :     while ((@todo = keys(%$todo)) > 0)
71 :     {
72 :     my $fam = $todo[0];
73 :     &process($fam,$state);
74 :     # print STDERR &Dumper(['todo',$todo]);
75 :     }
76 :     }
77 :     }
78 :    
79 :     sub load_fam {
80 :     my($ff,$state) = @_;
81 :    
82 :     my($fig,$figO,$done_fam,$todo,$loaded_fams,$fam_to_pegs,$peg_to_fams,$sim_thresh) = @$state;
83 :    
84 :     my $loaded_fam = $loaded_fams->{$ff};
85 :     if (! $loaded_fam)
86 :     {
87 :     my $pegs = $fam_to_pegs{$ff};
88 :     my @clean_pegs = ();
89 :     foreach my $peg (@$pegs)
90 :     {
91 :     my $featureO = new FeatureO($figO,$peg);
92 :     if ($featureO && (! $fig->possibly_truncated($peg)) && (! $featureO->possible_frameshift))
93 :     {
94 :     push(@clean_pegs,$peg);
95 :     }
96 :     }
97 :    
98 :     my @sims = ();
99 :     foreach my $sim ($fig->sims(\@clean_pegs,100000,$sim_thresh,'fig'))
100 :     {
101 :     my $match1 = $sim->e1 - $sim->b1;
102 :     my $match2 = $sim->e2 - $sim->b2;
103 :     if ((($match1 / $sim->ln1) > 0.7) &&
104 :     (($match2 / $sim->ln2) > 0.7))
105 :     {
106 :     push(@sims,$sim);
107 :     }
108 :     }
109 :    
110 :     my $others_not_in_fam = {};
111 :     my $other_fams = {};
112 :     my $worst_hit = 1000;
113 :     foreach my $sim (sort { ($a->id1 cmp $b->id1) or ($b->bsc <=> $a->bsc) } @sims)
114 :     {
115 :     my $id1 = $sim->id1;
116 :     my $id2 = $sim->id2;
117 :     my $in = $peg_to_fams{$id2};
118 :     my $matched1 = ($sim->e1 + 1) - $sim->b1;
119 :     if (! $in)
120 :     {
121 :     $others_not_in_fam->{$id2} = 1;
122 :     }
123 :     else
124 :     {
125 :     foreach my $fam_in (@$in)
126 :     {
127 :     if ($fam_in eq $ff)
128 :     {
129 :     # print STDERR &Dumper([$worst_hit,$sim->bsc/$matched1]);
130 :     if (((! defined($worst_hit)) || (($sim->bsc / $matched1) < $worst_hit)))
131 :     {
132 :     $worst_hit = sprintf("%5.3f",($sim->bsc / $matched1));
133 :     }
134 :     }
135 :     else
136 :     {
137 :     if (! $other_fams->{$fam_in})
138 :     {
139 :     # print STDERR "$ff - $fam_in $id1 $id2\n";
140 :     }
141 :     $other_fams->{$fam_in} = 1;
142 :     }
143 :     }
144 :     }
145 :     }
146 :     $loaded_fams->{$ff} = [$worst_hit,$other_fams,$others_not_in_fam];
147 :     }
148 :     # print STDERR &Dumper(["loaded $ff",$loaded_fams->{$ff}]);
149 :     }
150 :    
151 :     sub process {
152 :     my($fam,$state) = @_;
153 :    
154 :     my($fig,$figO,$done_fam,$todo,$loaded_fams,$fam_to_pegs,$peg_to_fams,$sim_thresh) = @$state;
155 :     my $loaded = $loaded_fams->{$fam};
156 :     my($worst_hit,$other_fams,$others_not_in_fam) = @$loaded;
157 :    
158 :     my @contained_in = ();
159 :     my @not_contained_in = ();
160 :     foreach my $famO (keys(%$other_fams))
161 :     {
162 :     &load_fam($famO,$state);
163 :     my $other_fams2 = $loaded_fams->{$famO}->[1];
164 :     my $contained = 1;
165 :     foreach my $famO2 (keys(%$other_fams2))
166 :     {
167 :     if (($famO2 ne $fam) && (! $other_fams->{$famO2}))
168 :     {
169 :     $contained = 0;
170 :     }
171 :     }
172 :    
173 :     if ($contained)
174 :     {
175 :     push(@contained_in,$famO);
176 :     }
177 :     else
178 :     {
179 :     push(@not_contained_in,$famO);
180 :     }
181 :     }
182 :    
183 :     my $set_to_write = [$fam,@contained_in];
184 :     &write_set($set_to_write,$state,\@not_contained_in);
185 :     foreach my $famD (@$set_to_write)
186 :     {
187 :     if ($todo->{$famD}) { delete $todo->{$famD} }
188 :     $done_fam->{$famD} = 1;
189 : arodri7 1.2
190 :     # add to db_handle to show that figfam is done for all other processes
191 :     if (!$fig){
192 :     $fig = new FIG;
193 :     $dbf = $fig->db_handle;
194 :     }
195 :     $dbf->SQL("insert into tmp_sync_partitions (fam) values ('$famD')");
196 : overbeek 1.1 }
197 :    
198 :     foreach my $famO (@not_contained_in)
199 :     {
200 : arodri7 1.2 if (!$fig){
201 :     $fig = new FIG;
202 :     $dbf = $fig->db_handle;
203 :     }
204 :    
205 :     my $cond = "fam = '".$famO."'";
206 :     my $x = $dbf->SQL("select fam from tmp_sync_partitions where $cond");
207 :    
208 :     # if (! $done_fam->{$famO})
209 :     if ( (! $done_fam->{$famO}) && (! scalar @$x > 0) )
210 : overbeek 1.1 {
211 :     $todo->{$famO} = 1;
212 :     }
213 :     }
214 :     }
215 :    
216 :     sub write_set {
217 :     my($set,$state,$not_contained_in) = @_;
218 :    
219 :     my($fig,$figO,$done_fam,$todo,$loaded_fams,$fam_to_pegs,$peg_to_fams,$sim_thresh) = @$state;
220 :     my %all_pegs;
221 :    
222 :     my @fams_with_worst = ();
223 :     foreach my $fam (@$set)
224 :     {
225 :     my $loaded = $loaded_fams->{$fam};
226 :     my($worst_hit,$other_fams,$others_not_in_fam) = @$loaded;
227 :     push(@fams_with_worst,"$fam,$worst_hit");
228 :     my $pegs = $fam_to_pegs->{$fam};
229 :     foreach my $peg (@$pegs,keys(%$others_not_in_fam))
230 :     {
231 :     $all_pegs{$peg} = 1;
232 :     }
233 :     }
234 :    
235 :     foreach my $fam (@$not_contained_in)
236 :     {
237 :     my $loaded = $loaded_fams->{$fam};
238 :     my($worst_hit,$other_fams,$others_not_in_fam) = @$loaded;
239 :     my $pegs = $fam_to_pegs->{$fam};
240 :     foreach my $peg (@$pegs,keys(%$others_not_in_fam))
241 :     {
242 :     $all_pegs{$peg} = 1;
243 :     }
244 :     }
245 :    
246 :     foreach $peg (sort { &FIG::by_fig_id($a,$b) } keys(%all_pegs))
247 :     {
248 :     print OUT "$peg\n";
249 :     }
250 :     print OUT "//\t",join(" ",@fams_with_worst),"\n";
251 :     }
252 :    

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3