Bio-SamTools
view release on metacpan or search on metacpan
lib/Bio/DB/Sam/SamToGBrowse.pm view on Meta::CPAN
package Bio::DB::Sam::SamToGBrowse;
use Carp 'croak';
use Bio::DB::Sam;
use File::Spec;
use File::Basename 'basename';
use File::Temp 'tempfile','tmpnam';
use constant FORCE_TEMPFILES=>0;
sub new {
my $class = shift;
my ($dir,$fasta,$debug) = @_;
$dir or croak "Usage: $class->new(\$dir_to_index,[\$fasta_path])";
$fasta ||= $class->find_fasta($dir) or croak "Cannot find a suitable fasta file in $dir";
return bless { dir => $dir,
fasta => $fasta,
debug => $debug||0
},ref $class || $class;
}
sub run {
my $self = shift;
$self->sam_to_bam;
$self->index_bam;
$self->bam_to_wig;
$self->make_conf;
}
sub dir {shift->{dir} }
sub fasta {shift->{fasta} }
sub debug {shift->{debug} }
sub msg {
my $self = shift;
return unless $self->debug;
print STDERR @_,"\n";
}
sub err {
my $self = shift;
$self->{error} = "@_";
print STDERR @_,"\n";
}
sub last_error { shift->{error} }
sub files {
my $self = shift;
my @extensions = @_; # e.g. '.sam','.sam.gz';
my $dir = $self->dir;
return map {glob($self->dir_path("*$_"))} @extensions;
}
sub mtime {
my $self = shift;
my $file = shift;
my $mtime = (stat($file))[9];
return $mtime;
}
sub up_to_date {
my $self = shift;
my ($source,$target) = @_;
return unless -e $target;
return unless $self->mtime($target) >= $self->mtime($source);
return 1;
}
sub find_fasta {
my $self = shift;
my $dir = shift;
my @files = (glob(File::Spec->catfile($dir,"*.fa")),glob(File::Spec->catfile($dir,"*.fasta")));
return unless @files == 1;
return $files[0];
}
sub sam_to_bam {
my $self = shift;
$self->msg('Searching for SAM files');
my @sam = $self->files($self->sam_extensions);
$self->msg("\t",'Found ',@sam+0,' sam files');
$self->convert_one_sam($_) foreach @sam;
}
sub sam_extensions { return qw(.sam .sam.gz) }
sub index_bam {
my $self = shift;
$self->msg('Searching for BAM files');
my @bam = $self->files('.bam');
$self->msg("\t",'Found ',@bam+0,' bam files');
$self->index_one_bam($_) foreach @bam;
}
sub convert_one_sam {
my $self = shift;
my $sam = shift;
my $base = basename($sam,$self->sam_extensions);
my $bam = $self->dir_path("$base.bam");
my $sorted = $self->dir_path("${base}_sorted.bam");
if ($self->up_to_date($sam,$bam) or $self->up_to_date($sam,$sorted)) {
$self->msg("\t","$sam: bam file is up to date");
return;
}
$self->msg("\t","$bam: creating");
my $fai = $self->make_fai;
my $tam = Bio::DB::Tam->open($sam)
or die "Could not open SAM file for reading: $!";
my $header = $tam->header_read2($fai);
my $out = Bio::DB::Bam->open($bam,'w')
or die "Could not open BAM file for writing: $!";
$out->header_write($header);
my $alignment = Bio::DB::Bam::Alignment->new();
( run in 2.855 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )