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

Diff of /FigKernelPackages/FIG.pm

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

revision 1.157, Thu Sep 23 20:04:04 2004 UTC revision 1.158, Fri Sep 24 18:34:32 2004 UTC
# Line 5  Line 5 
5  use Fcntl qw/:flock/;  # import LOCK_* constants  use Fcntl qw/:flock/;  # import LOCK_* constants
6    
7  use POSIX;  use POSIX;
8    use IPC::Open2;
9    
10  use DBrtns;  use DBrtns;
11  use Sim;  use Sim;
# Line 2480  Line 2481 
2481      if ($beg < $end) { return '+'; } else { return '-'; }      if ($beg < $end) { return '+'; } else { return '-'; }
2482  }  }
2483    
2484    =pod
2485    
2486    =head1 find_contig_with_checksum
2487    
2488    Find a contig in the given genome with the given checksum.
2489    
2490    
2491    =cut
2492    
2493    sub find_contig_with_checksum
2494    {
2495        my($self, $genome, $checksum) = @_;
2496    
2497        #
2498        # This implementation scans all the contig files for the organism; when
2499        # we have contig checksums in the database this will simplify
2500        # significantly.
2501        #
2502        # For some efficiency, we cache the checksums we compute along the way since
2503        # it's probably likely we'll poke at other contigs for this organism.
2504        #
2505    
2506        my $gdir = "$FIG_Config::organisms/$genome";
2507    
2508        my $cached_cksum = $self->cached('_contig_checksum');
2509    
2510        if (opendir(my $dh, $gdir))
2511        {
2512            for my $file (map { "$gdir/$_" } grep { $_ =~ /^contigs\d*$/ } readdir($dh))
2513            {
2514                local $/ = "\n>";
2515    
2516                if (open(my $fh, "<$file"))
2517                {
2518                    while (<$fh>)
2519                    {
2520                        chomp;
2521                        if (s/^\s*(\S+)([^\n]*)\n//)
2522                        {
2523                            my $ident = $1;
2524                            my $contig_txt = $_;
2525    
2526                            $contig_txt =~ s/\s//sg;
2527                            $contig_txt = uc($contig_txt);
2528    
2529                            #
2530                            # See if we have a cached value.
2531                            #
2532    
2533                            my $this_checksum;
2534                            $this_checksum = $cached_cksum->{$genome, $ident};
2535                            if (!$this_checksum)
2536                            {
2537    
2538                                my($rd, $wr, $pid);
2539    
2540                                if (!($pid = open2($rd, $wr, "cksum")))
2541                                {
2542                                    die "Cannot run open2 cksum: $!";
2543                                }
2544    
2545                                $wr->write($contig_txt, length($contig_txt));
2546    
2547                                close($wr);
2548    
2549                                $_ = <$rd>;
2550                                close($rd);
2551                                waitpid $pid, 0;
2552                                chomp;
2553    
2554                                my @vals = split(/\s+/, $_);
2555                                $this_checksum = $vals[0];
2556                                $cached_cksum->{$genome, $ident} = $this_checksum;
2557                            }
2558                            if ($this_checksum == $checksum)
2559                            {
2560                                return $ident;
2561                            }
2562                        }
2563                    }
2564                }
2565            }
2566        }
2567    }
2568    
2569    sub contig_checksum
2570    {
2571        my($self, $genome, $contig) = @_;
2572    
2573        my $contig_txt = $self->read_contig($genome, $contig);
2574    
2575        $contig_txt =~ s/\s//sg;
2576        $contig_txt = uc($contig_txt);
2577    
2578        my($rd, $wr);
2579    
2580        if (!open2($rd, $wr, "cksum"))
2581        {
2582            die "Cannot run open2 cksum: $!";
2583        }
2584    
2585        $wr->write($contig_txt, length($contig_txt));
2586    
2587        close($wr);
2588    
2589        $_ = <$rd>;
2590        chomp;
2591        my @vals = split(/\s+/, $_);
2592        if (wantarray)
2593        {
2594            return @vals;
2595        }
2596        else
2597        {
2598            return $vals[0];
2599        }
2600    }
2601    
2602    =pod
2603    
2604    =head1 read_contig
2605    
2606    Read a single contig from the contigs file.
2607    
2608    =cut
2609    sub read_contig
2610    {
2611        my($self, $genome, $contig) = @_;
2612    
2613        #
2614        # Read the contig. The database has it in a set of chunks, but we
2615        # just use the seek to the starting point, and read up to the next "\n>".
2616        #
2617    
2618        my $ret = $self->db_handle->SQL(qq!SELECT fileno, seek FROM contig_seeks
2619                                           WHERE genome = '$genome' and contig = '$contig' and
2620                                           startn = 0!);
2621        if (!$ret or @$ret != 1)
2622        {
2623            return undef;
2624        }
2625    
2626        my($fileno, $seek) = @{$ret->[0]};
2627        my $file = $self->N2file($fileno);
2628    
2629        my($fh, $contig_txt);
2630    
2631        if (!open($fh, "<$file"))
2632        {
2633            warn "contig_checksum: could not open $file: $!\n";
2634            return undef;
2635        }
2636    
2637        seek($fh, $seek, 0);
2638    
2639        {
2640            local $/ = "\n>";
2641    
2642            $contig_txt = <$fh>;
2643            chomp($contig_txt);
2644        }
2645    
2646        return $contig_txt;
2647    }
2648    
2649  =pod  =pod
2650    

Legend:
Removed from v.1.157  
changed lines
  Added in v.1.158

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3