App-Egaz
view release on metacpan or search on metacpan
lib/App/Egaz/Command/lav2axt.pm view on Meta::CPAN
package App::Egaz::Command::lav2axt;
use strict;
use warnings;
use autodie;
use App::Egaz -command;
use App::Egaz::Common;
sub abstract {
return 'convert .lav files to .axt';
}
sub opt_spec {
return ( [ "outfile|o=s", "Output filename. [stdout] for screen", { default => "stdout" }, ],
{ show_defaults => 1, } );
}
sub usage_desc {
return "egaz lav2axt [options] <infile>";
}
sub description {
my $desc;
$desc .= ucfirst(abstract) . ".\n";
$desc .= <<MARKDOWN;
* infile == stdin means reading from STDIN
MARKDOWN
return $desc;
}
sub validate_args {
my ( $self, $opt, $args ) = @_;
if ( @{$args} != 1 ) {
my $message = "This command need one input file.\n\tIt found";
$message .= sprintf " [%s]", $_ for @{$args};
$message .= ".\n";
$self->usage_error($message);
}
for ( @{$args} ) {
next if lc $_ eq "stdin";
if ( !Path::Tiny::path($_)->is_file ) {
$self->usage_error("The input file [$_] doesn't exist.");
}
}
}
sub execute {
my ( $self, $opt, $args ) = @_;
#----------------------------#
# load lav
#----------------------------#
my $lav_content = Path::Tiny::path( $args->[0] )->slurp;
my @lavs = grep {/^[ds] /} split /\#\:lav\n/, $lav_content;
my $d_stanza = shift @lavs; # Not needed by this program
# print YAML::Syck::Dump \@lavs;
#----------------------------#
# write outputs
#----------------------------#
my $out_fh;
if ( lc( $opt->{outfile} ) eq "stdout" ) {
$out_fh = *STDOUT{IO};
}
else {
open $out_fh, ">", $opt->{outfile};
}
my $serial = 0;
my %cache; # cache fasta files
for my $lav (@lavs) {
#----------------------------#
# s-stanza
#----------------------------#
# "<filename>[-]" <start> <stop> [<rev_comp_flag> <sequence_number>]
$lav =~ /s \{\s+(.+?)\s+\}/s;
my $s_stanza = $1;
my @s_lines = $s_stanza =~ /(.+ \s+ \d+ \s+ \d+ \s+ \d+ \s+ \d+)/gx;
if ( scalar @s_lines != 2 ) {
Carp::croak "s-stanza error.\n";
}
$s_lines[0] =~ /\s*\"?(.+?)\-?\"? \s+ (\d+) \s+ (\d+) \s+ (\d+) \s+ (\d+)/x;
my ( $t_file, $t_seq_start, $t_seq_stop, $t_strand, $t_contig ) = ( $1, $2, $3, $4, $5 );
if ( !-e $t_file ) {
$t_file = App::Egaz::Common::resolve_file( $t_file,
( run in 0.655 second using v1.01-cache-2.11-cpan-99c4e6809bf )