[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.2, Wed Sep 22 19:33:35 2004 UTC revision 1.11, Fri Sep 24 19:48:17 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 102  Line 103 
103              for my $alias (@$alias_list)              for my $alias (@$alias_list)
104              {              {
105                  my $mapped = $fig->by_alias($alias);                  my $mapped = $fig->by_alias($alias);
106                  if ($mapped && $peg !~ /5$/)                  if ($mapped)
107                  {                  {
108                      print "$peg maps to $mapped via $alias\n";                      print "$peg maps to $mapped via $alias\n";
109                      $peg_mapping{$peg}= $mapped;                      $peg_mapping{$peg}= $mapped;
# 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                        #
216                        # Now look up the local peg. We match on the end location; depending on the strand
217                        # the feature is on, we want to look at either minloc or maxloc.
218                        #
219    
220                        my $whichloc = $strand eq '-' ? "minloc" : "maxloc";
221    
222                        my $res = $dbh->SQL(qq!SELECT id from features
223                                               WHERE $whichloc = $end and genome = '$my_genome' and
224                                               contig = '$local_contig'
225                                            !);
226    
227                        if ($res and @$res == 1)
228                        {
229                            my($id) = $res->[0]->[0];
230                            $peg_mapping{$peg} = $id;
231                            print "Mapped $peg to $id via contigs\n";
232                        }
233                        else
234                        {
235                            print "failed: $peg  $my_genome and contig $local_contig start=$start end=$end strand=$strand\n";
236                        }
237                    }
238                    else
239                    {
240                        print "Mapping failed for $my_genome checksum $cksum\n";
241                    }
242                }
243          }          }
244      }      }
245  }  }
# Line 368  Line 462 
462      return $self->call("get_pegs", $session_id, $start, $length);      return $self->call("get_pegs", $session_id, $start, $length);
463  }  }
464    
465    sub finalize_pegs
466    {
467        my($self, $session_id, $request) = @_;
468    
469        return $self->call("finalize_pegs", $session_id, $request);
470    }
471    
472  sub call  sub call
473  {  {
474      my($self, $func, @args) = @_;      my($self, $func, @args) = @_;
# Line 673  Line 774 
774    
775      return [$peg_output, $genome_output];      return [$peg_output, $genome_output];
776  }  }
777    
778    sub finalize_pegs
779    {
780        my($self, $session, $request) = @_;
781        my($out);
782    
783        my $fig = new FIG;
784    
785        #
786        # Walk the request handling appropriately. This is fairly easy, as it
787        # is just a matter of pulling either sequence or location/contig data.
788        #
789    
790        for my $item (@$request)
791        {
792            my($what, $peg) = @$item;
793    
794            if ($what eq "peg_genome")
795            {
796                #
797                # Return the location and contig checksum for this peg.
798                #
799    
800                my $loc = $fig->feature_location($peg);
801                my $contig = $fig->contig_of($loc);
802                my $cksum = $fig->contig_checksum($fig->genome_of($peg), $contig);
803                warn "Checksum for '$loc' '$contig' is $cksum\n";
804    
805                push(@$out, ['peg_loc', $peg,
806                            $fig->strand_of($loc),
807                            $fig->beg_of($loc), $fig->end_of($loc),
808                            $cksum]);
809    
810            }
811            elsif ($what eq "peg_unknown")
812            {
813                my $seq = $fig->get_translation($peg);
814                push(@$out, ['peg_seq', $peg, $seq]);
815            }
816        }
817        return $out;
818    }
819    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.11

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3