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

Diff of /FigKernelPackages/P2P.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3, Wed Sep 22 20:39:01 2004 UTC revision 1.10, Fri Sep 24 19:36:27 2004 UTC
# Line 90  Line 90 
90              #              #
91              # Peg id is directly usable.              # Peg id is directly usable.
92              #              #
93                $peg_mapping{$peg} = $peg;
94          }          }
95          elsif ($key eq 'peg_info')          elsif ($key eq 'peg_info')
96          {          {
# Line 119  Line 120 
120              if (!defined($peg_mapping{$peg}))              if (!defined($peg_mapping{$peg}))
121              {              {
122                  push(@{$genome_map{$genome_id}}, $peg);                  push(@{$genome_map{$genome_id}}, $peg);
123                    print "$peg did not map\n";
124              }              }
125          }          }
126      }      }
# Line 126  Line 128 
128      #      #
129      # finished first pass. Now go over the per-genome mappings that need to be made.      # finished first pass. Now go over the per-genome mappings that need to be made.
130      #      #
131        # $genome_map{$genome_id} is a list of pegs that reside on that genome.
132        # the pegs and genome id are both target-based identifiers.
133        #
134    
135        my @finalize_req = ();
136        my %local_genome;
137    
138      for my $genome_info (@$genome_list)      for my $genome_info (@$genome_list)
139      {      {
140          my($genome, $n_contigs, $n_nucs, $cksum) = @$genome_info;          my($genome, $n_contigs, $n_nucs, $cksum) = @$genome_info;
141    
142          next unless $genome_map{$genome};          next unless defined($genome_map{$genome});
143    
144            #
145            # Determine if we have a local genome installed that matches precisely the
146            # genome on the target side.
147            #
148          my $my_genome = $fig->find_genome_by_content($genome, $n_contigs, $n_nucs, $cksum);          my $my_genome = $fig->find_genome_by_content($genome, $n_contigs, $n_nucs, $cksum);
149    
150            my $pegs = $genome_map{$genome};
151    
152          if ($my_genome)          if ($my_genome)
153          {          {
154              #              #
155              # Found a match.              # We do have such a local genome. Generate a peg_genome request to
156                # get the location information from the target side.
157                #
158                # Also remember the local genome mapping for this peg.
159              #              #
160              print "Genome $genome maps to $my_genome locally\n";  
161                print "$genome mapped to $my_genome\n";
162                for my $peg (@$pegs)
163                {
164                    push(@finalize_req, ['peg_genome', $peg]);
165                    $local_genome{$peg} = $my_genome;
166                }
167    
168          }          }
169          else          else
170          {          {
171              print "No mapping for $genome\n";              #
172                # We don't have such a genome. We need to retrieve the
173                # sequence data in order to finish mapping.
174                #
175                push(@finalize_req, map { ['peg_unknown', $_] } @$pegs);
176            }
177        }
178    
179        #
180        # If we need to finalize, make the call.
181        if (@finalize_req)
182        {
183            print Dumper(\@finalize_req);
184            $ret = $peer->finalize_pegs($session, \@finalize_req);
185    
186            if (!$ret or ref($ret) ne "ARRAY")
187            {
188                die "perform_update: finalize_pegs failed\n";
189            }
190    
191            #
192            # The return is a list of either location entries or
193            # sequence data. Attempt to finish up the mapping.
194            #
195    
196    
197            my $dbh = $fig->db_handle();
198            for my $entry (@$ret)
199            {
200                my($what, $peg, @rest) = @$entry;
201    
202                if ($what eq "peg_loc")
203                {
204                    my($strand, $start, $end, $cksum) = @rest;
205    
206                    #
207                    # We have a contig location. Try to find a matching contig
208                    # here, and see if it maps to something.
209                    #
210    
211                    my $my_genome = $local_genome{$peg};
212                    my $local_contig = $fig->find_contig_with_checksum($my_genome, $cksum);
213                    if ($local_contig)
214                    {
215                        print "$peg maps to local genome $my_genome and contig $local_contig start=$start end=$end strand=$strand\n";
216                        #
217                        # Now look up the local peg. We match on the end location; depending on the strand
218                        # the feature is on, we want to look at either minloc or maxloc.
219                        #
220    
221                        my $whichloc = $strand eq '-' ? "minloc" : "maxloc";
222    
223                        my $res = $dbh->SQL(qq!SELECT id from features
224                                               WHERE $whichloc = $end and genome = '$my_genome' and
225                                               contig = '$local_contig'
226                                            !);
227    
228                        if ($res and @$res == 1)
229                        {
230                            my($id) = $res->[0]->[0];
231                            $peg_mapping{$peg} = $id;
232                            print "Mapped $peg to $id via contigs\n";
233                        }
234                        else
235                        {
236                            print "Failed to map $peg via contigs\n";
237                        }
238                    }
239                    else
240                    {
241                        print "Mapping failed for $my_genome checksum $cksum\n";
242                    }
243                }
244          }          }
245      }      }
246  }  }
# Line 368  Line 463 
463      return $self->call("get_pegs", $session_id, $start, $length);      return $self->call("get_pegs", $session_id, $start, $length);
464  }  }
465    
466    sub finalize_pegs
467    {
468        my($self, $session_id, $request) = @_;
469    
470        return $self->call("finalize_pegs", $session_id, $request);
471    }
472    
473  sub call  sub call
474  {  {
475      my($self, $func, @args) = @_;      my($self, $func, @args) = @_;
# Line 673  Line 775 
775    
776      return [$peg_output, $genome_output];      return [$peg_output, $genome_output];
777  }  }
778    
779    sub finalize_pegs
780    {
781        my($self, $session, $request) = @_;
782        my($out);
783    
784        my $fig = new FIG;
785    
786        #
787        # Walk the request handling appropriately. This is fairly easy, as it
788        # is just a matter of pulling either sequence or location/contig data.
789        #
790    
791        for my $item (@$request)
792        {
793            my($what, $peg) = @$item;
794    
795            if ($what eq "peg_genome")
796            {
797                #
798                # Return the location and contig checksum for this peg.
799                #
800    
801                my $loc = $fig->feature_location($peg);
802                my $contig = $fig->contig_of($loc);
803                my $cksum = $fig->contig_checksum($fig->genome_of($peg), $contig);
804                warn "Checksum for '$loc' '$contig' is $cksum\n";
805    
806                push(@$out, ['peg_loc', $peg,
807                            $fig->strand_of($loc),
808                            $fig->beg_of($loc), $fig->end_of($loc),
809                            $cksum]);
810    
811            }
812            elsif ($what eq "peg_unknown")
813            {
814                my $seq = $fig->get_translation($peg);
815                push(@$out, ['peg_seq', $peg, $seq]);
816            }
817        }
818        return $out;
819    }
820    

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.10

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3