From 58cf8f253fce0e6ad126b3a3f93a78036320d7d0 Mon Sep 17 00:00:00 2001 From: kbseah Date: Thu, 25 Feb 2016 18:22:04 +0100 Subject: [PATCH] Add `depth` parameter to `fastgFish()` * User-specified number of iterations for Fastg fishing * Path to perl script can now be specified by user in function call --- R_source_package/gbtools_2.5.4.tar.gz | Bin 0 -> 32588 bytes accessory_scripts/fastg_paths_fishing.pl | 65 ++++++++++++++++------- gbtools/DESCRIPTION | 2 +- gbtools/R/fastgFish.R | 2 +- gbtools/R/fastgFish.gbt.R | 11 ++-- gbtools/man/fastgFish.Rd | 2 +- gbtools/man/fastgFish.gbt.Rd | 9 +++- 7 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 R_source_package/gbtools_2.5.4.tar.gz diff --git a/R_source_package/gbtools_2.5.4.tar.gz b/R_source_package/gbtools_2.5.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..0f6a1906e92400782632fce11f90d71f7f011881 GIT binary patch literal 32588 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%0AhwClSd|p(8gtw_rPKgR;H>QFK{u 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 literal 0 HcmV?d00001 diff --git a/accessory_scripts/fastg_paths_fishing.pl b/accessory_scripts/fastg_paths_fishing.pl index e44b408..2ae466c 100755 --- a/accessory_scripts/fastg_paths_fishing.pl +++ b/accessory_scripts/fastg_paths_fishing.pl @@ -2,7 +2,7 @@ # SPAdes-style Fastg and Scaffold.paths parsing tool # Brandon Seah (kbseah@mpi-bremen.de) -# 2016-02-23 +# 2016-02-25 # Given output from SPAdes: # Fastg assembly graph, @@ -21,6 +21,7 @@ my $version="2016-02-23"; my $fastg_file; my $paths_file; +my $iter_depth = 0; # How many fishing iterations (0 = no limit) my $iter_count = 0; # Counter for iterations of bait fishing my $out="fastg_fishing"; # Output file prefix my $bait_file; @@ -35,10 +36,12 @@ my %fished_nodes_hash; # Hash of nodes corresponding to fished edges ## Usage options ################################# + if (! @ARGV) { usage(); } # Print usage statement if no arguments GetOptions ( "fastg|g=s" =>\$fastg_file, # Fastg file of assembly graph - "paths|p=s" =>\$paths_file, # File scaffold.paths or contigs.paths + "paths|p=s" =>\$paths_file, # File scaffold.paths or contigs.paths + "iter|i=i" =>\$iter_depth, # Number of iterations "output|o=s" =>\$out, # Output prefix "bait|b=s" =>\$bait_file, # List of scaffold names to fish "rflag|r" =>\$rflag # Report to stdout if called from R @@ -63,7 +66,7 @@ print $outlog_fh "Number of corresponding bait edges: ". scalar @bait_edges_array. "\n"; read_fastg(); -perform_fishing_edges(); +perform_fishing_edges($iter_depth); translate_fished_edges_to_nodes(); if ($rflag == 0) { # Save list of fished contigs to file by default @@ -99,16 +102,19 @@ sub usage { print STDERR "These files are produced by SPAdes 3.6.2 onwards \n\n"; print STDERR "Usage: perl $0 \\ \n"; print STDERR "\t -g assembly_graph.fastg \\ \n"; - print STDERR "\t -p scaffols.paths \\ \n"; + print STDERR "\t -p scaffolds.paths \\ \n"; print STDERR "\t -o output_prefix \\ \n"; print STDERR "\t -b list_of_bait_scaffolds \\ \n"; + print STDERR "\t -i [number of fishing iterations] \n"; print STDERR "\t -r [Flag if called from within R] \n"; print STDERR "\n"; + print STDERR "-i 0 means fishing iterates until no more contigs retrieved\n\n"; print STDERR "Output: Logfile (prefix.log) and list of fished scaffolds (prefix.scafflist)\n\n"; exit; } -sub translate_fished_edges_to_nodes { # Convert list of fished edges to list of nodes +sub translate_fished_edges_to_nodes { + # Convert list of fished edges to list of nodes foreach my $theedge (keys %edge_fishing_hash) { foreach my $thenode (@{$node_edge_hash{$theedge}}) { $fished_nodes_hash{$thenode}++; @@ -117,26 +123,42 @@ sub translate_fished_edges_to_nodes { # Convert list of fished edges to list of } sub perform_fishing_edges { + my $depth = shift @_; # Iteration depth + if ($depth == 0) { # I know this is inelegant + $iter_depth = 2; + } my $init_count=0; # Counter for no. of fished contigs my $curr_count=1; # Second counter - while ($init_count != $curr_count) { # Loop until iteratively complete + while ($iter_count <= $iter_depth-1 # Loop until iteratively complete + && $init_count != $curr_count) { # or when fishing is exhausted $iter_count++; # Iteration counter $init_count=0; # Reset counters for each iterative step $curr_count=0; - foreach my $fishedge (keys %edge_fishing_hash) { # Count edges marked as bait - if (defined $edge_fishing_hash{$fishedge} && $edge_fishing_hash{$fishedge} == 1) { + if ($depth == 0) { # If exhaustive looping, + $iter_depth++; # keep shifting goalposts + } + # Count edges marked as bait + foreach my $fishedge (keys %edge_fishing_hash) { + if (defined $edge_fishing_hash{$fishedge} + && $edge_fishing_hash{$fishedge} == 1) { $init_count++; } } - foreach my $fastg_entry (keys %fastg_hash) { # For all Fastg entries - if (defined $edge_fishing_hash{$fastg_entry} && $edge_fishing_hash{$fastg_entry} == 1) { # If edge is listed as a bait + # For all Fastg entries + foreach my $fastg_entry (keys %fastg_hash) { + # If edge is listed as a bait + if (defined $edge_fishing_hash{$fastg_entry} + && $edge_fishing_hash{$fastg_entry} == 1) { foreach my $connected_edges (@{$fastg_hash{$fastg_entry}}) { - $edge_fishing_hash{$connected_edges} = 1; # Mark those connected edges as bait + # Mark those connected edges as bait + $edge_fishing_hash{$connected_edges} = 1; } } } - foreach my $fishedge (keys %edge_fishing_hash) { # Count edges marked as bait after fishing - if (defined $edge_fishing_hash {$fishedge} && $edge_fishing_hash {$fishedge} == 1) { + # Count edges marked as bait after fishing + foreach my $fishedge (keys %edge_fishing_hash) { + if (defined $edge_fishing_hash {$fishedge} + && $edge_fishing_hash {$fishedge} == 1) { $curr_count++; } } @@ -148,10 +170,12 @@ sub read_fastg { open(FASTGIN, "<", $fastg_file) or die ("$!\n"); # Read in Fastg file while () { chomp; - if ($_ =~ m/^>EDGE_(\d+)_.*:(.+);$/) { # If a Fastg header line + # If a Fastg header line + if ($_ =~ m/^>EDGE_(\d+)_.*:(.+);$/) { my $current_node = $1; my $conn_line = $2; - $conn_line =~ s/'//g; # Remove inverted commas, which mark revcomp + # Remove inverted commas, which mark revcomp + $conn_line =~ s/'//g; my @conn_line_array = split ",", $conn_line; foreach my $the_header (@conn_line_array) { if ($the_header =~ m/EDGE_(\d+)_/) { @@ -202,10 +226,14 @@ sub hash_nodes_edges { while () { chomp; my $full_header = $_; - if ($full_header =~ m/NODE.*'$/) { # If header for reversed scaffold, ignore + # If header for reversed scaffold, ignore + if ($full_header =~ m/NODE.*'$/) { $skip_flag = 1; next; - } elsif ($full_header =~ m/NODE_(\d+)_.*\d+$/) { # If header for forward scaffold... + + } + # If header for forward scaffold... + elsif ($full_header =~ m/NODE_(\d+)_.*\d+$/) { $skip_flag = 0; # Turn off skip flag $current_node = $1; $scaffolds_fullnames_hash{$current_node} = $full_header; # Save full header name @@ -215,7 +243,8 @@ sub hash_nodes_edges { next; } else { my $edge_line = $_; - $edge_line =~ s/[-\+;]//g; # Remove unneeded chars, only interested in edge IDs + # Remove unneeded chars, only interested in edge IDs + $edge_line =~ s/[-\+;]//g; my @edge_split = split ",", $edge_line; foreach my $the_edge (@edge_split) { push @{$node_edge_hash{$the_edge}}, $current_node; # Hash nodes with edges as key diff --git a/gbtools/DESCRIPTION b/gbtools/DESCRIPTION index 615f92d..b5cb5df 100644 --- a/gbtools/DESCRIPTION +++ b/gbtools/DESCRIPTION @@ -1,6 +1,6 @@ Package: gbtools Type: Package -Version: 2.5.3 +Version: 2.5.4 Title: Interactive visualization of metagenome assemblies in R Date: 2016-02-25 Author: Brandon Seah diff --git a/gbtools/R/fastgFish.R b/gbtools/R/fastgFish.R index 7168e29..70904cf 100644 --- a/gbtools/R/fastgFish.R +++ b/gbtools/R/fastgFish.R @@ -13,4 +13,4 @@ #' @return Object of class gbtbin #' @export -fastgFish <- function (x, bin, fastg.file, paths.file, save, file) UseMethod ("fastgFish") # Define generic for fastgFish function \ No newline at end of file +fastgFish <- function (x, bin, fastg.file, paths.file, depth, save, file, script.path) UseMethod ("fastgFish") # Define generic for fastgFish function \ No newline at end of file diff --git a/gbtools/R/fastgFish.gbt.R b/gbtools/R/fastgFish.gbt.R index 7625af6..e41dfe1 100644 --- a/gbtools/R/fastgFish.gbt.R +++ b/gbtools/R/fastgFish.gbt.R @@ -8,8 +8,10 @@ #' @param bin Object of class gbtbin, derived from x above #' @param fastg.file Fastg formatted assembly graph from SPAdes #' @param paths Paths file mapping assembly graph edge names to scaffold/contig names +#' @param depth Number of fishing iterations (Default: 0 means iterate until no additional contigs recruited) #' @param save Logical: Save list of fished contigs to external file? (Default: No) #' @param file File name to save list of fished contigs, if save=TRUE +#' @param script.path Location of the fastg_paths_fishing.pl script #' @return Object of class gbtbin #' @export @@ -17,18 +19,19 @@ fastgFish.gbt <- function (x, # Object of class gbt (parent object of the bin) bin, # Object of class gbtbin fastg.file, # Fastg assembly graph paths.file, # scaffolds.paths or contigs.paths file + depth=0, # Number of iterations to fish (Default 0 - exhaustive) save=FALSE, # Save result to external file? Default no - file="fished_bin.list" # File name to save result + file="fished_bin.list", # File name to save result + script.path="/home/kbseah/tools/my_scripts/genome-bin-tools/accessory_scripts/fastg_paths_fishing.pl" ) { - ## REPLACE THIS PATH WITH SCRIPT PATH ON YOUR LOCAL SYSTEM ############################################# - script.path <- "/home/kbseah/tools/my_scripts/genome-bin-tools/accessory_scripts/fastg_paths_fishing.pl" - ######################################################################################################## + script.path=script.path command <- "perl" command.params <- paste(script.path, "-g", fastg.file, "-p", paths.file, "-o /tmp/tmp.fishing_output", "-b -", + "-i", depth, "-r") fished.contigs.list <- system2 (command, command.params, diff --git a/gbtools/man/fastgFish.Rd b/gbtools/man/fastgFish.Rd index c4ed0b6..bcd2ea9 100644 --- a/gbtools/man/fastgFish.Rd +++ b/gbtools/man/fastgFish.Rd @@ -4,7 +4,7 @@ \alias{fastgFish} \title{Perform connectivity fishing with Fastg and paths files from SPAdes 3.6.2+} \usage{ -fastgFish(x, bin, fastg.file, paths.file, save, file) +fastgFish(x, bin, fastg.file, paths.file, depth, save, file, script.path) } \arguments{ \item{x}{Object of class gbt (parent object of the gbtbin object)} diff --git a/gbtools/man/fastgFish.gbt.Rd b/gbtools/man/fastgFish.gbt.Rd index adf9ad1..d53b444 100644 --- a/gbtools/man/fastgFish.gbt.Rd +++ b/gbtools/man/fastgFish.gbt.Rd @@ -4,8 +4,9 @@ \alias{fastgFish.gbt} \title{Perform connectivity fishing with Fastg and paths files from SPAdes 3.6.2+} \usage{ -\method{fastgFish}{gbt}(x, bin, fastg.file, paths.file, save = FALSE, - file = "fished_bin.list") +\method{fastgFish}{gbt}(x, bin, fastg.file, paths.file, depth = 0, + save = FALSE, file = "fished_bin.list", + script.path = "/home/kbseah/tools/my_scripts/genome-bin-tools/accessory_scripts/fastg_paths_fishing.pl") } \arguments{ \item{x}{Object of class gbt (parent object of the gbtbin object)} @@ -14,10 +15,14 @@ \item{fastg.file}{Fastg formatted assembly graph from SPAdes} +\item{depth}{Number of fishing iterations (Default: 0 means iterate until no additional contigs recruited)} + \item{save}{Logical: Save list of fished contigs to external file? (Default: No)} \item{file}{File name to save list of fished contigs, if save=TRUE} +\item{script.path}{Location of the fastg_paths_fishing.pl script} + \item{paths}{Paths file mapping assembly graph edge names to scaffold/contig names} } \value{