App-Egaz

 view release on metacpan or  search on metacpan

lib/App/Egaz/Command/fas2vcf.pm  view on Meta::CPAN

package App::Egaz::Command::fas2vcf;
use strict;
use warnings;
use autodie;

use App::Egaz -command;
use App::Egaz::Common;

sub abstract {
    return 'list variations in blocked fasta file';
}

sub opt_spec {
    return (
        [ "outfile|o=s", "Output filename. [stdout] for screen", { default => "stdout" }, ],
        [ "list=s",      "a list of names to keep, one per line", ],
        [ "verbose|v",   "verbose mode", ],
        { show_defaults => 1, }
    );
}

sub usage_desc {
    return "egaz fas2vcf [options] <infile> <chr.sizes>";
}

sub description {
    my $desc;
    $desc .= ucfirst(abstract) . ".\n";
    $desc .= <<MARKDOWN;

* infile == stdin means reading from STDIN
* Steps:
    1. split .fas to a temp dir by `fasops split`
    2. convert each fasta files to .vcf by `snp-sites`
    3. concat every .vcf files by `bcftools`

MARKDOWN

    return $desc;
}

sub validate_args {
    my ( $self, $opt, $args ) = @_;

    if ( @{$args} != 2 ) {
        my $message = "This command need two input files.\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 ) = @_;

    my $tempdir = Path::Tiny->tempdir( TEMPLATE => "fas2vcf_XXXXXXXX", );
    my $length_of = App::RL::Common::read_sizes( $args->[1] );

    {    # fasops split
        my $cmd = "";
        if ( $opt->{list} ) {
            $cmd .= " fasops subset $args->[0] $opt->{list} --required -o stdout";
            $cmd .= " |";



( run in 0.779 second using v1.01-cache-2.11-cpan-13bb782fe5a )