Mercurial > repos > konradpaszkiewicz > velvetoptimiser
diff VelvetOptimiser-2.1.7_modified/VelvetOpt/hwrap.pm @ 0:7363fee7f20c default tip
Migrated tool version 1.0.0 from old tool shed archive to new tool shed repository
author | konradpaszkiewicz |
---|---|
date | Tue, 07 Jun 2011 17:42:26 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VelvetOptimiser-2.1.7_modified/VelvetOpt/hwrap.pm Tue Jun 07 17:42:26 2011 -0400 @@ -0,0 +1,331 @@ +# VelvetOpt::hwrap.pm +# +# Copyright 2008 Simon Gladman <simon.gladman@csiro.au> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +# +# Version 1.1 - 14/07/2010 - Added support for changing input file types +# Version 1.2 - 11/08/2010 - Changed velveth help parser for new velvet help format +# Thanks to Alexie Papanicolaou - CSIRO for the patch. + +package VelvetOpt::hwrap; + +=head1 NAME + +VelvetOpt::hwrap.pm - Velvet hashing program wrapper module. + +=head1 AUTHOR + +Simon Gladman, CSIRO, 2007, 2008. + +=head1 LICENSE + +Copyright 2008 Simon Gladman <simon.gladman@csiro.au> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. + +=head1 SYNOPSIS + + use VelvetOpt::hwrap; + use VelvetOpt::Assembly; + my $object = VelvetOpt::Assembly->new( + timestamph => "23 November 2008 15:00:00", + ass_id => "1", + versionh => "0.7.04", + pstringh => "test 21 -fasta test_reads.fna", + ass_dir => "/home/gla048/Desktop/newVelvetOptimiser/data_1" + ); + my $worked = VelvetOpt::hwrap::objectVelveth($object); + if($worked){ + print $object->toString(); + } + else { + die "Error in velveth..\n" . $object->toString(); + } + +=head1 DESCRIPTION + +A wrapper module to run velveth on VelvetAssembly objects or on velveth +parameter strings. Also contains private methods to check velveth +parameter strings, run velveth and return results. + +=head2 Uses + +=over 8 + +=item strict + +=item warnings + +=item Carp + +=item VelvetOpt::Assembly + +=item POSIX qw(strftime) + +=back + +=head2 Private Fields + +=over 8 + +=item interested + +STDERR printing debug message toggle. 1 for on, 0 for off. + +=back + +=head2 Methods + +=over 8 + +=item _runVelveth + +Private method which runs velveth with the supplied velveth parameter string and returns velveth output messages as a string. + +=item _checkVHString + +Private method which checks for a correctly formatted velveth string. Returns 1 or 0. + +=item objectVelveth + +Accepts a VelvetAssembly object and the number of categories velvet was compiled with, looks for the velveth parameter string it contains, checks it, sends it to _runVelveth, collects the results and stores them in the VelvetAssembly object. + +=item stringVelveth + +Accepts a velveth parameter string and the number of categories velvet was compiled with, checks it, sends it to _runVelveth and then collects and returns the velveth output messages. + +=back + +=cut + +use warnings; +use strict; +use Carp; +use VelvetOpt::Assembly; +use POSIX qw(strftime); + +my $interested = 0; + +my @Fileformats; +my @Readtypes; +my $usage; +my $inited = 0; + +sub init { + #run a velveth to get its help lines.. + my $response = &_runVelveth(" "); + + $response =~ m/CATEGORIES = (\d+)/; + my $cats = $1; + unless($cats){$cats = 2;} + + $response =~ m/(File format options:(.*)Read type options)/s; + my @t = split /\n/, $1; + foreach(@t){ + #if(/\s+(-\S+)/){ + while(/\s+(-\S+)/g){ + push @Fileformats, $1; + } + } + + $response =~ m/(Read type options:(.*)Options:)/s; + + @t = (); + @t = split /\n/, $1; + foreach(@t){ + #if(/\s+(-\S+)/){ + while(/\s+(-\S+)/g){ + push @Readtypes, $1; + } + } + + for(my $i = 3; $i <= $cats; $i++){ + push @Readtypes, "-short$i"; + push @Readtypes, "-shortPaired$i"; + } + + $usage = "Incorrect velveth parameter string: Needs to be of the form\n{[-file_format][-read_type] filename}\n"; + $usage .= "Where:\n\tFile format options:\n"; + foreach(@Fileformats){ + $usage .= "\t$_\n"; + } + $usage .= "Read type options:\n"; + foreach(@Readtypes){ + $usage .= "\t$_\n"; + } + $usage .= "\nThere can be more than one filename specified as long as its a different type.\nStopping run\n"; + + $inited = 1; +} + +sub _runVelveth { + #unless($inited){ &init(); } + my $cmdline = shift; + my $output = ""; + print STDERR "About to run velveth!\n" if $interested; + $output = `velveth $cmdline`; + $output .= "\nTimestamp: " . strftime("%b %e %Y %H:%M:%S", localtime) . "\n"; + return $output; +} + +sub _checkVHString { + unless($inited){ &init(); } + my $line = shift; + my $cats = shift; + + + + my %fileform = (); + my %readform = (); + + foreach(@Fileformats){ $fileform{$_} = 1;} + foreach(@Readtypes){ $readform{$_} = 1;} + + my @l = split /\s+/, $line; + + #first check for a directory name as the first parameter... + my $dir = shift @l; + if(!($dir =~ /\w+/) || ($dir =~ /^\-/)){ + carp "**** $line\n\tNo directory name specified as first parameter in velveth string. Internal error!\n$usage"; + return 0; + } + #print "VH Check passed directory..\n"; + my $hash = shift @l; + unless($hash =~ /^\d+$/){ + carp "**** $line\n\tHash value in velveth string not a number. Internal error!\n$usage"; + return 0; + } + + #print "VH check passed hash value..\n"; + + my $i = 0; + my $ok = 1; + foreach(@l){ + if(/^-/){ + #s/-//; + if(!$fileform{$_} && !$readform{$_}){ + carp "**** $line\n\tIncorrect fileformat or readformat specified.\n\t$_ is an invalid velveth switch.\n$usage"; + return 0; + } + elsif($fileform{$_}){ + if(($i + 1) > $#l){ + carp "$line\n\tNo filename supplied after file format type $l[$i].\n$usage"; + return 0; + } + if($readform{$l[$i+1]}){ + if(($i+2) > $#l){ + carp "$line\n\tNo filename supplied after read format type $l[$i+1].\n$usage"; + return 0; + } + if(-e $l[$i+2]){ + $ok = 1; + } + else{ + carp "**** $line\n\tVelveth filename " . $l[$i+2] . " doesn't exist.\n$usage"; + return 0; + } + } + elsif (-e $l[$i+1]){ + $ok = 1; + } + else { + carp "**** $line\n\tVelveth filename " . $l[$i+1] . " doesn't exist.$usage\n"; + return 0; + } + } + elsif($readform{$_}){ + if(($i + 1) > $#l){ + carp "$line\n\tNo filename supplied after read format type $l[$i].\n$usage"; + return 0; + } + if($fileform{$l[$i+1]}){ + if(($i+2) > $#l){ + carp "$line\n\tNo filename supplied after file format type $l[$i+1].\n$usage"; + return 0; + } + if(-e $l[$i+2]){ + $ok = 1; + } + else{ + carp "**** $line\n\tVelveth filename " . $l[$i+2] . " doesn't exist.\n$usage"; + return 0; + } + } + elsif (-e $l[$i+1]){ + $ok = 1; + } + else { + carp "**** $line\n\tVelveth filename " . $l[$i+1] ." doesn't exist.\n$usage"; + return 0; + } + } + } + elsif(!-e $_){ + carp "**** $line\n\tVelveth filename $_ doesn't exist.\n$usage"; + return 0; + } + $i ++; + } + if($ok){ + return 1; + } +} + +sub objectVelveth { + unless($inited){ &init(); } + my $va = shift; + my $cats = shift; + my $cmdline = $va->{pstringh}; + if(_checkVHString($cmdline, $cats)){ + $va->{velvethout} = _runVelveth($cmdline); + my @t = split /\n/, $va->{velvethout}; + $t[$#t] =~ s/Timestamp:\s+//; + $va->{timestamph} = $t[$#t]; + return 1; + } + else { + $va->{velvethout} = "Formatting errors in velveth parameter string.$usage"; + return 0; + } +} + +sub stringVelveth { + unless($inited){ &init(); } + my $cmdline = shift; + my $cats = shift; + if(_checkVHString($cmdline,$cats)){ + return _runVelveth($cmdline); + } + else { + return "Formatting errors in velveth parameter string.$usage"; + } +} + +1;