From 569936740cbbb61fb77aff294d602184ab93dc67 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 17 Mar 2020 19:08:41 +0100 Subject: [PATCH 001/381] moving def --- pipeline.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index b2c9019..3b9a1b5 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -507,7 +507,7 @@ process 'definition_upload'{ // publishDir "results", mode: 'copy' input: - file "*.txt" from blastDef_results.collect() + file "def*" from blastDef_results.collect() file config from config4perl output: @@ -518,7 +518,7 @@ process 'definition_upload'{ command = checkMySQL( mysql, params.mysqllog ) command += " \ - cat *.txt > allDef; \ + cat def* > allDef; \ upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ " From 1a6afbbb4ea3fc2d1ddbdd4dc0d080a5f24b5070 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 3 Oct 2020 12:49:18 +0200 Subject: [PATCH 002/381] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index a234b60..7410450 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,4 @@ +* In debug, avoid some processes process all (initDB) * Split KEGG retrieval and upload * Include some testing and CI * Add PANNZER in analysis From a945fc58af3d71004541405d28332f0aaa0f06c4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 6 Oct 2020 17:09:36 +0200 Subject: [PATCH 003/381] recover version --- nextflow.config | 2 +- pipeline.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 82920dd..1108417 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,7 +19,7 @@ process{ queue='biocore-el7,long-sl7' time='48h' cpus='8' - container="ncbi/blast:2.10.0" + container="ncbi/blast:2.10.1" } withLabel: diamond { diff --git a/pipeline.nf b/pipeline.nf index 3b9a1b5..6306734 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -176,7 +176,7 @@ if (params.blastFile == "" || params.blastFile == null ){ if ( diamond ) { - formatDbFileName = db_path+"/"+db_name+".dmnd" + formatDbFileName = params.blastDbPath + ".dmnd" formatDbFile = file(formatDbFileName) if ( formatDbFile.exists() && formatDbFile.size() > 0 ) { formatdbDetect = "true" From 952c150c3abb03cdff38c8db6651172bf294d485 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 16 Oct 2020 16:06:37 +0200 Subject: [PATCH 004/381] blastAnnotMode --- main_configuration.config | 1 + pipeline.nf | 218 +++++++++++++++++----------------- scripts/blast-annotator.pl | 237 ++++++++++++++++++------------------- 3 files changed, 231 insertions(+), 225 deletions(-) diff --git a/main_configuration.config b/main_configuration.config index 14766db..a75bc5d 100644 --- a/main_configuration.config +++ b/main_configuration.config @@ -7,6 +7,7 @@ params { blastFile = "" diamond = "false" blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" + blastAnnotMode = "common" speciesName = "P.vulgaris" chunkSize = 25 chunkWebSize = 100 diff --git a/pipeline.nf b/pipeline.nf index 3b9a1b5..b8ab5a1 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -8,7 +8,7 @@ * Copyright (c) 2017, Emilio Palumbo * * Copyright (c) 2018-2020, Toni Hermoso Pulido - * + * * Functional Annotation Pipeline for protein annotation from non-model organisms * from Genome Annotation Team in Catalonia (GATC) implemented in Nextflow * @@ -65,7 +65,7 @@ evalue = 0.00001 // Default evalue for BLAST if(params.evalue != "" || params.evalue != null ) { evalue = params.evalue - + } dbFile = false @@ -92,7 +92,7 @@ dbhost = null // Getting contents of file if ( mysql ) { dbhost = "127.0.0.1" // Default value. Localhost - + if ( new File( params.mysqllog+"/DBHOST" ).exists() ) { dbhost = new File( params.mysqllog+"/DBHOST" ).text.trim() } @@ -165,44 +165,50 @@ if(params.diamond=="TRUE"||params.diamond=="true") { diamond = true } +// BlastAnnotMode +blastAnnotMode = "common" +if( params.blastAnnotMode != "" && params.blastAnnotMode != null ) { + blastAnnotMode = params.blastAnnotMode +} + if (params.blastFile == "" || params.blastFile == null ){ // program-specific parameters db_name = file(params.blastDbPath).name db_path = file(params.blastDbPath).parent - + // Handling Database formatting formatdbDetect = "false" - + if ( diamond ) { - + formatDbFileName = db_path+"/"+db_name+".dmnd" formatDbFile = file(formatDbFileName) if ( formatDbFile.exists() && formatDbFile.size() > 0 ) { formatdbDetect = "true" } - + if ( formatdbDetect == "false" ) { - + process diamondFormat{ - + label 'diamond' - + output: file "${db_name}_formatdb.dmnd" into formatdb - + """ diamond makedb --in ${db_path}/${db_name} --db "${db_name}_formatdb" """ } - + } else { formatdb = params.blastDbPath } - + } else { - - formatDbDir = file( db_path ) + + formatDbDir = file( db_path ) filter = ~/${db_name}.*.phr/ def fcount = 0 formatDbDir.eachFileMatch( filter ) { it -> @@ -211,98 +217,98 @@ if (params.blastFile == "" || params.blastFile == null ){ if ( fcount > 0 ) { formatdbDetect = "true" } - - println( formatdbDetect ) + + println( formatdbDetect ) if ( formatdbDetect == "false" ) { - + // println( "TUR" ) - + process blastFormat{ - + label 'blast' - + output: file "${db_name}.p*" into formatdb - + """ makeblastdb -dbtype prot -in ${db_path}/${db_name} -parse_seqids -out ${db_name} """ } - + } else { formatdb = params.blastDbPath } } - + if ( diamond == true ) { - + process diamond{ - + label 'diamond' - + input: file seq from seq_file6 file formatdb_file from formatdb - + output: file "blastXml${seq}" into (blastXmlResults1, blastXmlResults2, blastXmlResults3) - + script: if ( formatdbDetect == "false" ) { command = "diamond blastp --db ${formatdb_file} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" } else { command = "diamond blastp --db ${db_path}/${db_name} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" } - + command - + } - + } else { - + process blast{ - + label 'blast' - + // publishDir "results", mode: 'copy' - + input: file seq from seq_file6 file formatdb_file from formatdb - + output: file "blastXml${seq}" into (blastXmlResults1, blastXmlResults2, blastXmlResults3) - + script: if ( formatdbDetect == "false" ) { command = "blastp -db ${formatdb_file} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" } else { command = "blastp -db ${db_path}/${db_name} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" } - + command } - + } } else { blastInput=file(params.blastFile) - + process convertBlast{ - + // publishDir "results", mode: 'copy' - + input: file blastFile from blastInput - + output: file("*.xml") into (blastXmlResults1, blastXmlResults2, blastXmlResults3) - + """ hugeBlast2XML.pl -blast $blastFile -n 1000 -out blast.res """ - + } } @@ -311,13 +317,13 @@ if (params.kolist != "" || params.kolist != null ){ process kofamscan{ label 'kofamscan' - + input: file seq from seq_file7 output: file "koala_${seq}" into koalaResults - + """ exec_annotation --cpu ${task.cpus} -p ${params.koprofiles} -k ${params.kolist} -o koala_${seq} $seq """ @@ -348,13 +354,13 @@ keggfile = koala_parsed if(params.keggFile == "" || params.keggFile == null ) { - + println "Please run KEGG KO group annotation on the web server http://www.genome.jp/tools/kaas/" - + } keggfile=file(params.keggFile) - + } if(params.gogourl != ""){ @@ -362,7 +368,7 @@ if(params.gogourl != ""){ process blast_annotator { label 'blastannotator' - + input: file blastXml from blastXmlResults2.flatMap() @@ -370,7 +376,7 @@ process blast_annotator { file "blastAnnot" into blast_annotator_results """ - blast-annotator.pl -in $blastXml -out blastAnnot --url $params.gogourl -q --format blastxml + blast-annotator.pl -in $blastXml -out blastAnnot --url $params.gogourl -t $blastAnnotMode -q --format blastxml """ } @@ -380,7 +386,7 @@ process blastDef { // publishDir "results", mode: 'copy' tag "${blastXml}" - + input: file blastXml from blastXmlResults3.flatMap() @@ -397,22 +403,22 @@ process blastDef { if ( gffclean ) { process cleanGFF { - + label 'gffcheck' - + input: file config_file - + output: file "annot.gff" into gff_file - + """ # get annot file export escaped=\$(echo '$baseDir') export basedirvar=\$(echo '\\\$\\{baseDir\\}') agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff """ - + } @@ -421,13 +427,13 @@ if ( gffclean ) { process copyGFF { label 'gffcheck' - + input: file config_file - + output: file "annot.gff" into gff_file - + """ # get annot file export escaped=\$(echo '$baseDir') @@ -441,22 +447,22 @@ if ( gffclean ) { if ( gffstats ) { process statsGFF { - + publishDir params.resultPath, mode: 'copy' - + label 'gffcheck' - + input: file gff_file - + output: file "*.txt" into gff_stats - + """ # Generate Stats agat_sp_statistics.pl --gff $gff_file > ${gff_file}.stats.txt """ - + } @@ -477,13 +483,13 @@ process initDB { command += "export escaped=\$(echo '$baseDir')\n" command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" - - + + if ( mysql ) { // Add dbhost to config command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" command += "fa_main.v1.pl init -conf configIn" - + if ( gffclean ) { command += " -gff ${gff_file}" } @@ -491,13 +497,13 @@ process initDB { if (!exists) { command += "fa_main.v1.pl init -conf config" - + if ( gffclean ) { command += " -gff ${gff_file}" } } } - + command } @@ -514,14 +520,14 @@ process 'definition_upload'{ file 'def_done' into definition_passed script: - + command = checkMySQL( mysql, params.mysqllog ) command += " \ cat def* > allDef; \ upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ " - + command } @@ -625,14 +631,14 @@ process 'signalP_upload'{ script: - + command = checkMySQL( mysql, params.mysqllog ) - + command += " \ cat out_signalp* > allSignal ; \ load_CBSpredictions.signalP.pl -i allSignal -conf \$config -type s > upload_signalp ; \ " - + command } @@ -650,14 +656,14 @@ process 'targetP_upload'{ file("upload_targetp") into upload_targetp script: - + command = checkMySQL( mysql, params.mysqllog ) command += " \ cat out_targetp* > allTarget ; \ load_CBSpredictions.signalP.pl -i allTarget -conf \$config -type t > upload_targetp ; \ " - + command } @@ -673,8 +679,8 @@ process 'interpro_upload'{ output: file("upload_interpro") into upload_interpro - - + + script: command = checkMySQL( mysql, params.mysqllog ) @@ -683,7 +689,7 @@ process 'interpro_upload'{ cat out_interpro* > allInterpro ; \ run_interpro.pl -mode upload -i allInterpro -conf \$config > upload_interpro ; \ " - + command } @@ -699,16 +705,16 @@ process 'CDsearch_hit_upload'{ output: file("upload_hit") into upload_hit - + script: - + command = checkMySQL( mysql, params.mysqllog ) command += " \ cat out_hit* > allCDsearchHit ; \ upload_CDsearch.pl -i allCDsearchHit -type h -conf \$config > upload_hit ; \ " - + command } @@ -725,14 +731,14 @@ process 'CDsearch_feat_upload'{ file("upload_feat") into upload_feat script: - + command = checkMySQL( mysql, params.mysqllog ) - + command += " \ cat out_feat* > allCDsearchFeat ; \ upload_CDsearch.pl -i allCDsearchFeat -type f -conf \$config > upload_feat ; \ " - + command } @@ -749,15 +755,15 @@ process 'blast_annotator_upload'{ file("upload_blast") into upload_blast script: - + command = checkMySQL( mysql, params.mysqllog ) - + command += " \ cat blastAnnot* > allBlast ; \ awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > upload_blast ; \ " - + command } @@ -777,13 +783,13 @@ process 'kegg_upload'{ script: - + command = checkMySQL( mysql, params.mysqllog ) - + command += " \ load_kegg_KAAS.pl -input $keggfile -rel $params.kegg_release -conf \$config > done 2>err; \ " - + command } @@ -794,13 +800,13 @@ process 'generateResultFiles'{ file obofile from obofile script: - + command = checkMySQL( mysql, params.mysqllog ) - + command += " \ get_results.pl -conf \$config -obo $obofile ; \ " - + command } @@ -813,13 +819,13 @@ process 'generateGFF3File'{ script: - + command = checkMySQL( mysql, params.mysqllog ) - + command += " \ get_gff3.pl -conf \$config ; \ " - + command } @@ -859,9 +865,9 @@ def checkMySQL( mysql, mysqllog ) { workflow.onComplete { println ( workflow.success ? "\nDone! Check results in --> $params.resultPath\n" : "Oops .. something went wrong" ) - + if ( mysql ) { - + def procfile = new File( params.mysqllog+"/PROCESS" ) procfile.delete() } @@ -871,13 +877,13 @@ workflow.onComplete { workflow.onError { println( "Something went wrong" ) - + if ( mysql ) { - + def procfile = new File( params.mysqllog+"/PROCESS" ) procfile.delete() } - + } signalP_result2 diff --git a/scripts/blast-annotator.pl b/scripts/blast-annotator.pl index 76e6c6d..2c36ace 100755 --- a/scripts/blast-annotator.pl +++ b/scripts/blast-annotator.pl @@ -7,7 +7,7 @@ =head1 SYNOPSIS perl blast-annotator.pl [-i blastfile] [-o output] [-f blastformat ] [-t type] [-u url] [-s hits] [-c configfile] [-d delayseconds] [-v] [-h] =head1 DESCRIPTION Typical usage is as follows: - % perl blast-annotator.pl -i blast.out -o blast.annot -f text -t all -v + % perl blast-annotator.pl -i blast.out -o blast.annot -f text -t all -v =head2 Options =head1 AUTHORS @@ -41,13 +41,13 @@ =head1 AUTHORS 'format|f=s' => \$format, 'hits|s=s' => \$numhits, 'type|t=s' => \$type, - 'url|u=s' => \$url, - 'delay|d=s' => \$delay, - 'config|c=s' => \$config_json, #Config file + 'url|u=s' => \$url, + 'delay|d=s' => \$delay, + 'config|c=s' => \$config_json, #Config file 'verbose|v' => \$verbose, - 'accession|a' => \$accession, #use accession instead of name for hits - 'query|q' => \$query_desc, #use query description instead of name - 'help|h' => \$show_help + 'accession|a' => \$accession, #use accession instead of name for hits + 'query|q' => \$query_desc, #use query description instead of name + 'help|h' => \$show_help ) or pod2usage(-verbose=>2); pod2usage(-verbose=>2) if $show_help; @@ -65,18 +65,18 @@ =head1 AUTHORS my $config = Config::JSON->new( $config_json ); if ( $config->get("mysql") ) { - + my $user = $config->get("mysql/user"); my $password = $config->get("mysql/password"); my $db = $config->get("mysql/db"); my $host = $config->get("mysql/host"); - + my $dsn = "DBI:mysql:database=$db;host=$host"; $dbh = DBI->connect($dsn, $user, $password); - + } - + } # Out file @@ -88,47 +88,47 @@ =head1 AUTHORS -file => $input); while( my $result = $report_obj->next_result ) { - + my $debughash = {}; my $query; - + if ( $query_desc ) { $query = $result->query_description(); } else { $query = $result->query_name(); } - + my @hitlist; - + my $desc = ""; - + while( my $hit = $result->next_hit ) { - + if ( $desc eq "" ) { $desc = $hit->description(); } - + if ( $accession ) { push( @hitlist, $hit->accession() ); } else { push( @hitlist, processHitName( $hit->name() ) ); } } - + #print $query, ": ", $#hitlist, "\n"; - + my @slice; if ( $#hitlist <= $numhits - 1 ) { @slice = @hitlist; } else { @slice = @hitlist[ 0 .. $numhits -1 ]; } - - + + $debughash->{"query"} = $query; @{$debughash->{"taken_hits"}} = @slice; - + processGOGO( \@slice, $query, $desc, $fout, $debughash, $dbh ); sleep( $delay ); # exit; @@ -139,29 +139,29 @@ =head1 AUTHORS # Process Hit name sub processHitName { - - + + my $name = shift; - + if ( $name=~/\|/ ) { - + my (@parts) = split(/\|/, $name ); - + if ( $#parts >= 0 ) { $name = $parts[1]; } - + } - + return $name; - + } # Query by GO all hits, using type defined sub processGOGO { - + my $golist = shift; my $query = shift; my $desc = shift; @@ -171,197 +171,196 @@ sub processGOGO { my @entries; @{$debughash->{"found_hits"}} = (); - + if ( $dbh ) { - + #my $string = "SELECT distinct t.acc, t.name from term t, goassociation a, idmapping i where a.ID = i.uniprot and t.acc = a.GO and "; # #my @goquery; #foreach my $goelem ( @{$golist} ) { # my $query = $string." i.external = '".$goelem."' ;"; - # + # # my $sth = $dbh->prepare( $query ); - # + # # $sth->execute(); - # + # # if ( $sth->rows > 0 ) { - # + # # while (my $ref = $sth->fetchrow_hashref()) { # # push( @entries, $ref ); # } - # + # # } #} my $string = "SELECT distinct( i.uniprot ) as uniprot from idmapping i where "; my $string2 = "SELECT distinct t.acc, t.name from term t, goassociation a where t.acc = a.GO and "; - + my @idquery; my @goquery; - + my @querystr; - + if ( $#{$golist} > -1 ) { - + foreach my $goelem ( @{$golist} ) { push( @querystr, " ( i.external = '".$goelem."' ) " ); } - + my $query = $string. " ( ".join( " OR ", @querystr )." );"; my $sth = $dbh->prepare( $query ); - + $sth->execute(); - + if ( $sth->rows > 0 ) { - + while (my $ref = $sth->fetchrow_hashref()) { - + push( @idquery, $ref->{"uniprot"} ); } - + } - + $sth->finish; - + # my @unique = do { my %seen; grep { !$seen{$_}++ } @idquery }; - + foreach my $idelem ( @idquery ) { - + my $query = $string2." a.ID = '".$idelem."' ;"; - + my $sth = $dbh->prepare( $query ); - + $sth->execute(); - + if ( $sth->rows > 0 ) { - + while (my $ref = $sth->fetchrow_hashref()) { - + push( @entries, $ref ); } - + } - + $sth->finish; - } - + } + @entries = rmRedundant( \@entries ); - + } - + } else { - + die "You must specify a GOGO API URL endpoint \n Use -h for help" if !$url; # If no URL - + my $goparam = join("-", @{$golist} ); - + if ( $goparam ) { - + my $finalurl = $url."/go/list/".$goparam; - - if ( $type eq 'common' ) { - - $finalurl.="/common"; - } - + + if ( $type && $type ne "" ) { + + $finalurl .= $type; + } + my $json = ""; - - + + $json = get($finalurl); - - + + if ( defined( $json ) && $json ne '' ) { - + my $jsonobj = JSON->new->utf8->decode($json); - + #print $finalurl, "\n"; #print Dumper($jsonobj); - + # Process JSON here if ( $jsonobj ) { - + my $query = $jsonobj->{"query"}; - + #print Dumper( $query ); - + @{$debughash->{"found_hits"}} = keys( %{$query} ); - + my $outcome = $jsonobj->{"outcome"}; - + if ( $outcome ) { - + foreach my $key ( keys %{$outcome} ) { - + my $goresults = $outcome->{$key}; - + #print $key, "\n"; - + foreach my $goitem ( @{$goresults} ) { - - #print Dumper( $goitem ); + + #print Dumper( $goitem ); push( @entries, $goitem ); } } - + } - - + + } - + } - + } - + } - + my $num = 0; my $outtext = ""; $outtext = $outtext . $query . "\t"."#". "\t". $desc. "\n"; - - + + foreach my $entry ( @entries ) { - - #print Dumper( $entry ); + + #print Dumper( $entry ); $outtext = $outtext . $query . "\t" . $entry->{"acc"} . "\t" . $entry->{"name"} . "\n"; - + } - + print $output $outtext; - + if ( $verbose ) { - + # Process Debug in this case - + print "* ".$debughash->{"query"}, "\n"; print "# HITS TAKEN: ".join(", ", @{$debughash->{"taken_hits"}} )."\n"; print "# NUM HITS TAKEN: ".scalar( @{$debughash->{"taken_hits"}} )."\n"; print "@ HITS FOUND: ".join(", ", @{$debughash->{"found_hits"}} )."\n"; - print "@ NUM HITS FOUND: ".scalar( @{$debughash->{"found_hits"}} )."\n"; + print "@ NUM HITS FOUND: ".scalar( @{$debughash->{"found_hits"}} )."\n"; } - - + + } sub rmRedundant { - + my $array = shift; my %hash; my @new; - + foreach my $c (@{$array} ) { - + my $name = $c->{"name"}; if ( ! defined( $hash{$name} ) ) { $hash{$name} = 1; push( @new, $c ); } - + } - + return @new; - - -} + +} From 55d58dbd488cd17547ef95c922cdfae0d6f2d28b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 16 Oct 2020 16:37:22 +0200 Subject: [PATCH 005/381] debug mode --- pipeline.nf | 11 +++++++++-- scripts/import_data.pl | 45 +++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index a9eb9a9..98b66bf 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -137,9 +137,10 @@ seqWebData= Channel iscan_properties = file("/usr/local/interproscan/interproscan.properties") -if(params.debug=="TRUE"||params.debug=="true") { +if ( params.debug=="TRUE"||params.debug=="true" ) { println("Debugging.. only the first 2 chunks will be processed") - (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.take(2).into(7) + // Diferent parts for different processes. TODO: Change numbers for processes + (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7, seq_file8) = seqData.take(2).into(7) (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) } @@ -473,6 +474,7 @@ process initDB { input: file config_file file gff_file + file seq from seq_file8 output: file 'config' into config4perl @@ -504,6 +506,11 @@ process initDB { } } + if ( params.debug=="TRUE"||params.debug=="true" ) { + // If in debug mode, we restrict de seq entries we process + command += " -fasta ${seq}" + } + command } diff --git a/scripts/import_data.pl b/scripts/import_data.pl index 0ea67b8..860cd12 100755 --- a/scripts/import_data.pl +++ b/scripts/import_data.pl @@ -7,12 +7,12 @@ =head1 NAME import_data.pl =head1 SYNOPSIS - + perl import_data.pl [-conf configuration file] [-l list_with_ids] [-u update] [-h help] Import data from fasta and gff files into main DB. This script could upload all data or by given list. In case when user wants to upload just some of the proteins he could specify their ids in separate file, one per line. -Parameter update could have value 1 if user wants to update data or 0 if not. +Parameter update could have value 1 if user wants to update data or 0 if not. =head1 DESCRIPTION @@ -20,7 +20,7 @@ =head1 DESCRIPTION Typical usage is as follows: - % perl import_data.pl -conf main_configuration.ini + % perl import_data.pl -conf main_configuration.ini =head2 Options @@ -59,9 +59,9 @@ =head1 AUTHOR 'help|h' => \$show_help, 'comm=s'=>\$comment, 'conf=s'=>\$confFile, - 'gff=s'=>\$o_annt_file, - 'fasta=s'=>\$o_fasta_file, - ) + 'gff=s'=>\$o_annt_file, + 'fasta=s'=>\$o_fasta_file, + ) or pod2usage(-verbose=>2); pod2usage(-verbose=>2) if $show_help; @@ -70,7 +70,7 @@ =head1 AUTHOR print "Starting to upload data..Configuration file is $confFile\n"; #read configuration file my $cfg = new Config::Simple($confFile); -#put config parameters into %config +#put config parameters into %config my %config = $cfg->vars(); #my %conf = %::conf; my $debug = $config{'debug'}; @@ -78,17 +78,18 @@ =head1 AUTHOR my $debugSQL = $config{'debugSQL'}; #check whether protein fa and annotation gff3 files exists - $annt_file = $config{'gffFile'}; - $fasta_file = $config{'proteinFile'}; - - # Override if specified explicitly - if ( defined $o_annt_file ) { - $annt_file = $o_annt_file; - } - - if ( defined $o_fasta_file ) { - $fasta_file = $o_fasta_file; - } +$annt_file = $config{'gffFile'}; +$fasta_file = $config{'proteinFile'}; + +# Override if specified explicitly +if ( defined $o_annt_file ) { + $annt_file = $o_annt_file; +} + +# Override fasta file. Useful in debugging +if ( defined $o_fasta_file ) { + $fasta_file = $o_fasta_file; +} if(!-e $fasta_file) {die "The protein fasta file does not exists! There is nothing to work with!\n";} @@ -99,7 +100,7 @@ =head1 AUTHOR if(($loglevel eq 'debug')||($loglevel eq 'info')) {print "DBname $config{'dbname'}\n"; } -# Connect to the DB,depending on the engine +# Connect to the DB,depending on the engine if(! exists $config{'dbEngine'}) {$config{'dbEngine'} = 'mysql';} my $dbh; @@ -123,18 +124,18 @@ =head1 AUTHOR #upload annotation data from gff file if(! defined $annt_file || $annt_file eq ''){print STDOUT "The annotation file was not specified, skipped.\n";} else - { + { if(($loglevel eq 'debug')||($loglevel eq 'info')) {print STDOUT "Upload annotation data from $annt_file\n";} #my $checkResult = &checkGFFData($annt_file); my $checkResult = 1; if ($checkResult==1) - { + { &uploadGFFData($annt_file, $dbh,\%IdsList, $do_update, $config{'dbEngine'}, $loglevel); } else - { print STDOUT "Due to the errors in GFF file, data can not be uploaded. Correct the file first!\n"; + { print STDOUT "Due to the errors in GFF file, data can not be uploaded. Correct the file first!\n"; die;} } From 2417f11cc7593de14ffcf10c2a6e4a13133015a9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 16 Oct 2020 17:08:21 +0200 Subject: [PATCH 006/381] fix 8 parts --- pipeline.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 98b66bf..56fce5a 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -140,13 +140,13 @@ iscan_properties = file("/usr/local/interproscan/interproscan.properties") if ( params.debug=="TRUE"||params.debug=="true" ) { println("Debugging.. only the first 2 chunks will be processed") // Diferent parts for different processes. TODO: Change numbers for processes - (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7, seq_file8) = seqData.take(2).into(7) + (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7, seq_file8) = seqData.take(2).into(8) (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) } else { println("Process entire dataset") -(seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.into(7) +(seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7, seq_file8) = seqData.into(8) (web_seq_file1, web_seq_file2) = seqWebData.into(2) } From 60fbb72d0dc2b519bb1d896004437fc3242c1a9a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 16 Oct 2020 17:25:12 +0200 Subject: [PATCH 007/381] split config --- pipeline.nf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 56fce5a..e4c5cec 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -477,7 +477,7 @@ process initDB { file seq from seq_file8 output: - file 'config' into config4perl + file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10) script: command = "mkdir -p $params.resultPath\n" @@ -521,7 +521,7 @@ process 'definition_upload'{ // publishDir "results", mode: 'copy' input: file "def*" from blastDef_results.collect() - file config from config4perl + file config from config4perl1 output: file 'def_done' into definition_passed @@ -630,7 +630,7 @@ process 'signalP_upload'{ input: file "out_signalp*" from signalP_result1.collect() - file config from config4perl + file config from config4perl2 file def_done from definition_passed output: @@ -656,7 +656,7 @@ process 'targetP_upload'{ input: file "out_targetp*" from targetP_result1.collect() - file config from config4perl + file config from config4perl3 file upload_signalp from upload_signalp output: @@ -681,7 +681,7 @@ process 'interpro_upload'{ input: file "out_interpro*" from ipscn_result1.collect() - file config from config4perl + file config from config4perl4 file upload_targetp from upload_targetp output: @@ -707,7 +707,7 @@ process 'CDsearch_hit_upload'{ input: file "out_hit*" from cdSearch_hit_result.collect() - file config from config4perl + file config from config4perl5 file upload_interpro from upload_interpro output: @@ -731,7 +731,7 @@ process 'CDsearch_feat_upload'{ input: file "out_feat*" from cdSearch_feat_result.collect() - file config from config4perl + file config from config4perl6 file upload_hit from upload_hit output: @@ -755,7 +755,7 @@ process 'blast_annotator_upload'{ input: file "blastAnnot*" from blast_annotator_results.collect() - file config from config4perl + file config from config4perl7 file upload_feat from upload_feat output: @@ -782,7 +782,7 @@ process 'kegg_upload'{ input: file keggfile from keggfile - file config from config4perl + file config from config4perl8 file("upload_blast") from upload_blast output: @@ -802,7 +802,7 @@ process 'kegg_upload'{ process 'generateResultFiles'{ input: - file config from config4perl + file config from config4perl9 file all_done from last_step file obofile from obofile @@ -821,7 +821,7 @@ if ( annotation != null && annotation != "" ){ process 'generateGFF3File'{ input: - file config from config4perl + file config from config4perl10 file all_done from last_step From 99cbdd940a19de0adfde293b92a4c44047d0713c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 16 Oct 2020 17:30:42 +0200 Subject: [PATCH 008/381] last_step channels --- pipeline.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index e4c5cec..9e31709 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -786,7 +786,7 @@ process 'kegg_upload'{ file("upload_blast") from upload_blast output: - file('done') into last_step + file('done') into (last_step1, last_step2) script: @@ -803,7 +803,7 @@ process 'kegg_upload'{ process 'generateResultFiles'{ input: file config from config4perl9 - file all_done from last_step + file all_done from last_step1 file obofile from obofile script: @@ -822,7 +822,7 @@ if ( annotation != null && annotation != "" ){ process 'generateGFF3File'{ input: file config from config4perl10 - file all_done from last_step + file all_done from last_step2 script: From faebc266c748b367f1394863105055e66f8f5548 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 18 Oct 2020 15:53:44 +0200 Subject: [PATCH 009/381] fixing only one upload --- pipeline.nf | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 9e31709..65ec36e 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -127,27 +127,37 @@ log.info "FA database : $dbFileName" // split protein fasta file into chunks and then execute annotation for each chunk // chanels for: interpro, blast, signalP, targetP, cdsearch_hit, cdsearch_features -seqData= Channel +seqData = Channel .from(protein) .splitFasta(by: params.chunkSize) -seqWebData= Channel +seqWebData = Channel .from(protein) .splitFasta(by: params.chunkWebSize) iscan_properties = file("/usr/local/interproscan/interproscan.properties") -if ( params.debug=="TRUE"||params.debug=="true" ) { +if ( params.debug == "TRUE" || params.debug =="true" ) { println("Debugging.. only the first 2 chunks will be processed") // Diferent parts for different processes. TODO: Change numbers for processes - (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7, seq_file8) = seqData.take(2).into(8) + (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.take(2).into(7) (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) + testNum = ( params.chunkSize.toInteger() * 2 ) + seqTestData = Channel + .from(protein) + .splitFasta(by: testNum) + + (seq_test) = seqTestData.take(1) + } else { println("Process entire dataset") -(seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7, seq_file8) = seqData.into(8) -(web_seq_file1, web_seq_file2) = seqWebData.into(2) + (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.into(7) + (web_seq_file1, web_seq_file2) = seqWebData.into(2) + + // Anything for keeping + (seq_test) = seqData.into(1) } @@ -474,7 +484,7 @@ process initDB { input: file config_file file gff_file - file seq from seq_file8 + file seq from seq_test output: file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10) From 994083e832c2cc80c30113465a4935ccdcbf1729 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 18 Oct 2020 21:02:32 +0200 Subject: [PATCH 010/381] fix one --- pipeline.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 65ec36e..04b9fe8 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -148,7 +148,7 @@ if ( params.debug == "TRUE" || params.debug =="true" ) { .from(protein) .splitFasta(by: testNum) - (seq_test) = seqTestData.take(1) + (seq_test) = seqTestData.take(1).into(1) } else { @@ -156,8 +156,8 @@ else { (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.into(7) (web_seq_file1, web_seq_file2) = seqWebData.into(2) - // Anything for keeping - (seq_test) = seqData.into(1) + // Anything for keeping. This is only kept for coherence + (seq_test) = seqData.take(-1).into(1) } From 0d85dd7c062dbff311eb831375ecdb5408f5b557 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 18 Oct 2020 21:31:35 +0200 Subject: [PATCH 011/381] avoid many processes --- pipeline.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline.nf b/pipeline.nf index 04b9fe8..94d5c92 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -157,7 +157,7 @@ else { (web_seq_file1, web_seq_file2) = seqWebData.into(2) // Anything for keeping. This is only kept for coherence - (seq_test) = seqData.take(-1).into(1) + (seq_test) = seqData.take(1).into(1) } From 6b1a4130434f49b6d45310d83f7c7359d4796986 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 19 Oct 2020 17:19:21 +0200 Subject: [PATCH 012/381] fix issue --- scripts/blast-annotator.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/blast-annotator.pl b/scripts/blast-annotator.pl index 2c36ace..0e3bf43 100755 --- a/scripts/blast-annotator.pl +++ b/scripts/blast-annotator.pl @@ -262,7 +262,7 @@ sub processGOGO { if ( $type && $type ne "" ) { - $finalurl .= $type; + $finalurl .= "/".$type; } my $json = ""; From d00854ea46449ddd98310a43e3b239fd0a20211c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 25 Oct 2020 16:59:33 +0100 Subject: [PATCH 013/381] seq_test --- pipeline.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pipeline.nf b/pipeline.nf index 94d5c92..6ab68ca 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -156,8 +156,11 @@ else { (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.into(7) (web_seq_file1, web_seq_file2) = seqWebData.into(2) + seqTestData = Channel + .from(protein) + // Anything for keeping. This is only kept for coherence - (seq_test) = seqData.take(1).into(1) + (seq_test) = seqTestData.into(1) } From e5b382a30d156ac2cdf9209ffd46be391377aba9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 27 Oct 2020 16:32:31 +0100 Subject: [PATCH 014/381] update params to more flexibility --- TODO.md | 1 - main_configuration.config | 3 ++ pipeline.nf | 77 +++++++++++++++++++++++++++++++-------- 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/TODO.md b/TODO.md index 7410450..a234b60 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,3 @@ -* In debug, avoid some processes process all (initDB) * Split KEGG retrieval and upload * Include some testing and CI * Add PANNZER in analysis diff --git a/main_configuration.config b/main_configuration.config index a75bc5d..e849ed3 100644 --- a/main_configuration.config +++ b/main_configuration.config @@ -10,6 +10,9 @@ params { blastAnnotMode = "common" speciesName = "P.vulgaris" chunkSize = 25 + chunkBlastSize = 50 + chunkIPSSize = 25 + chunkKoalaSize = 50 chunkWebSize = 100 dbEngine = "MySQL" dbname = "Pvulgaris" diff --git a/pipeline.nf b/pipeline.nf index 6ab68ca..9b0c4d9 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -33,9 +33,13 @@ // default parameters params.help = false params.debug="false" +params.chunkIPSSize = null +params.chunkBlastSize = null +params.chunkKoalaSize = null +params.chunkWebSize = null //print usage -if (params.help) { +if ( params.help ) { log.info '' log.info 'Functional annotation pipeline' log.info '----------------------------------------------------' @@ -62,7 +66,7 @@ config_file = file(params.config) evalue = 0.00001 // Default evalue for BLAST -if(params.evalue != "" || params.evalue != null ) { +if ( params.evalue != "" || params.evalue != null ) { evalue = params.evalue @@ -74,7 +78,7 @@ boolean mysql = false gffclean = false gffstats = false -if(params.dbEngine.toLowerCase()=="mysql") { +if( params.dbEngine.toLowerCase()=="mysql" ) { mysql = true } @@ -115,32 +119,70 @@ log.info "------------------" log.info "Protein sequence file : ${params.proteinFile}" log.info "Annotation file : ${params.gffFile}" if ( params.blastFile != "" ) { -log.info "BLAST results file : ${params.blastFile}" + log.info "BLAST results file : ${params.blastFile}" } log.info "Species name : ${params.speciesName}" log.info "KEGG species : ${params.kegg_species}" if ( mysql ) { -log.info "FA database : ${params.dbname}" + log.info "FA database : ${params.dbname}" } else { -log.info "FA database : $dbFileName" + log.info "FA database : $dbFileName" } // split protein fasta file into chunks and then execute annotation for each chunk // chanels for: interpro, blast, signalP, targetP, cdsearch_hit, cdsearch_features + +chunkSize = params.chunkSize +chunkBlastSize = chunkSize +chunkIPSSize = chunkSize +chunkKoalaSize = chunkSize +chunkWebSize = chunkSize + +if ( params.chunkBlastSize ) { + chunkBlastSize = params.chunkBlastSize +} + +if ( params.chunkIPSSize ) { + chunkIPSSize = params.chunkIPSSize +} + +if ( params.chunkKoalaSize ) { + chunkKoalaSize = params.chunkKoalaSize +} + +if ( params.chunkWebSize ) { + chunkWebSize = params.chunkWebSize +} + seqData = Channel .from(protein) - .splitFasta(by: params.chunkSize) + .splitFasta( by: chunkSize ) + + seqBlastData = Channel + .from(protein) + .splitFasta( by: chunkBlastSize ) + +seqKoalaData = Channel + .from(protein) + .splitFasta( by: chunkKoalaSize ) + + seqIPSData = Channel + .from(protein) + .splitFasta( by: chunkIPSSize ) seqWebData = Channel .from(protein) - .splitFasta(by: params.chunkWebSize) + .splitFasta( by: chunkWebSize ) iscan_properties = file("/usr/local/interproscan/interproscan.properties") if ( params.debug == "TRUE" || params.debug =="true" ) { println("Debugging.. only the first 2 chunks will be processed") // Diferent parts for different processes. TODO: Change numbers for processes - (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.take(2).into(7) + (seq_file1, seq_file2) = seqData.take(2).into(2) + (seq_file_blast) = seqBlastData.take(2).into(1) + (seq_file_koala) = seqKoalaData.take(2).into(1) + (seq_file_ipscan) = seqIPSData.take(2).into(1) (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) testNum = ( params.chunkSize.toInteger() * 2 ) @@ -153,7 +195,10 @@ if ( params.debug == "TRUE" || params.debug =="true" ) { } else { println("Process entire dataset") - (seq_file1, seq_file2, seq_file3, seq_file4, seq_file5, seq_file6, seq_file7) = seqData.into(7) + (seq_file1, seq_file2) = seqData.into(2) + (seq_file_blast) = seqBlastData.into(1) + (seq_file_koala) = seqKoalaData.into(1) + (seq_file_ipscan) = seqIPSData.into(1) (web_seq_file1, web_seq_file2) = seqWebData.into(2) seqTestData = Channel @@ -261,7 +306,7 @@ if (params.blastFile == "" || params.blastFile == null ){ label 'diamond' input: - file seq from seq_file6 + file seq from seq_file_blast file formatdb_file from formatdb output: @@ -287,7 +332,7 @@ if (params.blastFile == "" || params.blastFile == null ){ // publishDir "results", mode: 'copy' input: - file seq from seq_file6 + file seq from seq_file_blast file formatdb_file from formatdb output: @@ -333,7 +378,7 @@ process kofamscan{ label 'kofamscan' input: - file seq from seq_file7 + file seq from seq_file_koala output: file "koala_${seq}" into koalaResults @@ -556,7 +601,7 @@ process ipscn { label 'ipscan' input: - file seq from seq_file1 + file seq from seq_file_ipscan file ("interproscan.properties") from file( iscan_properties ) output: @@ -608,7 +653,7 @@ process 'signalP' { label 'sigtarp' input: - file seq from seq_file4 + file seq from seq_file1 output: file("out_signalp_${seq}") into (signalP_result1, signalP_result2) @@ -623,7 +668,7 @@ process 'targetP' { label 'sigtarp' input: - file seq from seq_file5 + file seq from seq_file2 output: file("out_targetp_${seq}") into (targetP_result1, targetP_result2) From 0cacec35f2b9430dd46ac8b98eec0d63cefbfcdc Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 27 Oct 2020 18:04:42 +0100 Subject: [PATCH 015/381] defaults --- pipeline.nf | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 9b0c4d9..6011c82 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -37,6 +37,11 @@ params.chunkIPSSize = null params.chunkBlastSize = null params.chunkKoalaSize = null params.chunkWebSize = null +params.evalue = null +params.dbEngine = "mysql" +params.gffclean = false +params.gffstats = false +params.diamond = null //print usage if ( params.help ) { @@ -54,7 +59,6 @@ if ( params.help ) { exit 1 } - /* * Parse the input parameters */ @@ -67,9 +71,7 @@ config_file = file(params.config) evalue = 0.00001 // Default evalue for BLAST if ( params.evalue != "" || params.evalue != null ) { - evalue = params.evalue - } dbFile = false @@ -82,11 +84,11 @@ if( params.dbEngine.toLowerCase()=="mysql" ) { mysql = true } -if ( params.gffclean != null && ( params.gffclean=="TRUE" || params.gffclean=="true" ) ) { +if ( params.gffclean && ( params.gffclean=="TRUE" || params.gffclean=="true" ) ) { gffclean = true } -if ( params.gffstats != null && ( params.gffstats=="TRUE" || params.gffstats=="true" ) ) { +if ( params.gffstats && ( params.gffstats=="TRUE" || params.gffstats=="true" ) ) { gffstats = true } @@ -118,11 +120,14 @@ log.info "General parameters" log.info "------------------" log.info "Protein sequence file : ${params.proteinFile}" log.info "Annotation file : ${params.gffFile}" + if ( params.blastFile != "" ) { log.info "BLAST results file : ${params.blastFile}" } + log.info "Species name : ${params.speciesName}" log.info "KEGG species : ${params.kegg_species}" + if ( mysql ) { log.info "FA database : ${params.dbname}" } else { From 05db6f3cc7dec32a0e28417a444513074a968bec Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 27 Oct 2020 18:07:38 +0100 Subject: [PATCH 016/381] improvements --- TODO.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index a234b60..6baac19 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,5 @@ + +* Improve documentation of parameters * Split KEGG retrieval and upload * Include some testing and CI * Add PANNZER in analysis @@ -13,4 +15,4 @@ * Allow more flexibility for input parameters batch * Generalize and consider other programs for BLAST process or similar annotation processes: e.g. [GHOSTZ](http://www.bi.cs.titech.ac.jp/ghostz/) and [Argot2.5](http://www.medcomp.medicina.unipd.it/Argot2-5/) * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) -* Allow more customization of chunks for programs. Fallback one and program specific +* Migrate to DSL2 From da815e41678290d11ae56066d8417be55e673dc2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 31 Oct 2020 16:31:20 +0100 Subject: [PATCH 017/381] cleaning and allowing new method --- scripts/download_kegg_KASS.pl | 129 ++++++++++++ scripts/load_kegg_KAAS.pl | 381 +++++++++++++++++----------------- 2 files changed, 322 insertions(+), 188 deletions(-) create mode 100644 scripts/download_kegg_KASS.pl diff --git a/scripts/download_kegg_KASS.pl b/scripts/download_kegg_KASS.pl new file mode 100644 index 0000000..b3de615 --- /dev/null +++ b/scripts/download_kegg_KASS.pl @@ -0,0 +1,129 @@ +#!/usr/bin/env perl + +=head1 NAME + +download_kegg_data.pl + +=head1 SYNOPSIS + + perl download_kegg_KAAS.pl [--input] [-h help] + +=head1 DESCRIPTION + +Utility to download KEGG annotation + +Typical usage is as follows: + + % perl download_kegg_KAAs.pl + +=head2 Options + +Required arguments: + + --input= File produced by KAAS with associations bewteen Prot IDs & KEGG orthologs [Mandatory] + +The following options are accepted: + + --help This documentation + +Important: Please specify in configuration file list of 3-letters code for KEGG species used for annotation via KAAS server +=head1 AUTHORS + +Vlasova Anna: vlasova dot av A gmail dot com + +=cut + +use strict; +use warnings; +use FindBin qw($RealBin); +FindBin::again(); +use lib "$RealBin/lib/"; +use Getopt::Long; +use Pod::Usage; +use Data::Dumper; +use LWP::Simple; +use Config::Simple; +use String::Util 'trim'; +my $confFile = 'main_configuration.ini'; + +my $USAGE = "perl download_kegg_KAAS.pl [-i input] [-h help]\n"; +my ($show_help, $input); + +&GetOptions( + 'input|i=s' => \$input, + 'conf=s' =>\$confFile, + 'help|h' => \$show_help + ) + or pod2usage(-verbose=>2); +pod2usage(-verbose=>2) if $show_help; + +if (!$input) { + die("Please specify input file with results of KAAS server or KEGG DB release used to annotated data!\n Launch 'perl download_kegg_KAAS.pl -h' to see parameters description\n") +} + +#read configuration file + +my $cfg = new Config::Simple($confFile); +#put config parameters into %config +my %config = $cfg->vars(); + +#my %conf = %::conf; +#my $debug = $config{'debug'}; + +my $loglevel = $config{'loglevel'}; +if(! defined $loglevel){$loglevel='info';} + +my %keggs=(); +# parse $input to know the number of associations of a KEGG group to different proteins +open (FH, "$input"); +while (my $line = ) { + chomp ($line); + my ($protein_stable_id, $kegg_id) = split (/\t/, $line); + if ($kegg_id) { + push(@{$keggs{$kegg_id}},$protein_stable_id); + } +} +close FH; + + +if(($loglevel eq 'debug' )||($loglevel eq 'info' )) {print STDOUT "Number of unique KEGG groups:",scalar(keys %keggs),"\n";} + +my $down_kegg_dir = "down_kegg"; +if ( ! -d $down_kegg_dir ) { + system( "mkdir -p $down_kegg_dir" ) +} + +my $webChunk = 10; +my @queue = []; +my $iter = 0; + +foreach my $kegg_id (keys %{%keggs} ) { + + if ( $#queue > $webChunk - 1 ) { + + &processByAPI( \@queue, $down_kegg_dir, $iter ); + + @queue = []; + $iter++; + + } + + push( @queue, "ko:".$kegg_id ); + + +} + +sub processByAPI { + + my $arr = shift; + my $down_kegg_dir = shift; + my $iter = shift; + + my $url = "http://rest.kegg.jp/get/".join("+", @{$arr}); + my $response = get $url; + + open FILEOUT, ">", $down_kegg_dir."/".$iter.".txt"; + print FILEOUT $response; + close FILEOUT; + +} diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 34e4054..9336372 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -54,13 +54,13 @@ =head1 AUTHORS my $USAGE = "perl load_kegg_KAAS.pl [-i input] [-rel Kegg release] [-h help] [-conf configuration file] \n"; -my ($do_update, $show_help, $input,$kegg_release); +my ($do_update, $show_help, $input, $kegg_release); &GetOptions( - 'update|u=s' => \$do_update, - 'input|i=s' => \$input, - 'rel|r=s' => \$kegg_release, - 'conf=s'=>\$confFile, + 'update|u=s' => \$do_update, + 'input|i=s' => \$input, + 'rel|r=s' => \$kegg_release, + 'conf=s' =>\$confFile, 'help|h' => \$show_help ) or pod2usage(-verbose=>2); @@ -68,8 +68,9 @@ =head1 AUTHORS $do_update = 0 if (!defined $do_update); -if (!$input || !$kegg_release) -{die("Please specify input file with results of KAAS server or KEGG DB release used to annotated data!\n Launch 'perl load_kegg_KAAS.pl -h' to see parameters description\n")} +if (!$input || !$kegg_release) { + die("Please specify input file with results of KAAS server or KEGG DB release used to annotated data!\n Launch 'perl load_kegg_KAAS.pl -h' to see parameters description\n") +} #read configuration file @@ -104,9 +105,8 @@ =head1 AUTHORS #make hash record out of list with kegg species, specified in ini file. my %codes=(); my %organisms=(); -foreach my $item(@kegg_codes) - { - $item=~s/\s+//; +foreach my $item ( @kegg_codes ) { + $item =~s/\s+//; $codes{$item}=1; } @@ -120,203 +120,214 @@ =head1 AUTHORS chomp ($line); my ($protein_stable_id, $kegg_id) = split (/\t/, $line); if ($kegg_id) { - push(@{$keggs{$kegg_id}},$protein_stable_id); + push(@{$keggs{$kegg_id}},$protein_stable_id); } } close FH; if(($loglevel eq 'debug' )||($loglevel eq 'info' )) {print STDOUT "Number of unique KEGG groups:",scalar(keys %keggs),"\n";} -#upload KEGG group information into DB - this will speed-up uploading process.. There are usually fewer groups then proteins assigned to them + +# TODO: upload KEGG group information into DB - this will speed-up uploading process.. There are usually fewer groups then proteins assigned to them #print Dumper( \%keggs ); #print Dumper( \%organisms ); - -&uploadKeggInformation($dbh, \%keggs,\%organisms,$config{'dbEngine'}); +&uploadKeggInformation( $dbh, \%keggs,\%organisms,$config{'dbEngine'} ); -sub uploadKeggInformation -{ +sub uploadKeggInformation { my($dbh, $keggData,$codesOrg,$dbEngine)=@_; my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); - foreach my $kegg_id(keys %{$keggData}) - { + foreach my $kegg_id(keys %{$keggData}) { #get KO information from server - my $hash=parse_kegg_record($kegg_id); + my $hash = parse_kegg_record($kegg_id); # print Dumper($hash)."\n"; die; - - my @proteinList = @{$keggData->{$kegg_id}}; + + my @proteinList = @{$keggData->{$kegg_id}}; my $numberProteinsInGroup=scalar @proteinList; #upload information about KO group into DB if its absent in DB my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS); - foreach my $absItem(@absentList) - { if(!defined $hash->{$absItem}) - {$hash->{$absItem}="";} - } + foreach my $absItem(@absentList) { + if(!defined $hash->{$absItem}) { + $hash->{$absItem}=""; + } + } #populate kegg_group table #check if kegg_group already exists (yes && do_update => update record; no => insert new kegg_group) my $kegg_group_sql_select = qq{ SELECT kegg_group_id FROM kegg_group WHERE db_id=\"$kegg_id\" }; my $kegg_group_sql_update = qq{ UPDATE kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; my $kegg_group_sql_insert = ""; - if( lc( $dbEngine ) eq 'sqlite') - { $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id, name,definition,pathway,module,class,db_links,db_id,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$kegg_release\")}; } - else - { $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";};} - if(($loglevel eq 'debug' )||($loglevel eq 'info' )){ print "SQL: $kegg_group_sql_insert\n";} + if( lc( $dbEngine ) eq 'sqlite') { + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id, name,definition,pathway,module,class,db_links,db_id,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$kegg_release\")}; + } + else { + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; + } + if(($loglevel eq 'debug' )||($loglevel eq 'info' )) { + print "SQL: $kegg_group_sql_insert\n"; + } + my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); - #small patch for SQLite - the current insert function could not return id of the last inserted record... + + # small patch for SQLite - the current insert function could not return id of the last inserted record... if(!defined $kegg_group_id) { my $select = &selectLastId( $dbEngine ); my $results = $dbh->select_from_table($select); $kegg_group_id=$results->[0]->{'id'}; - } - if(!defined $kegg_group_id) - {die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n");} - - foreach my $proteinItem(@proteinList) - { - #select protein_id infor (because items are stable_ids in protein table) - my $protein_sql_select= qq{ SELECT d.protein_id,d.definition d FROM definition d, protein p WHERE p.protein_id=d.protein_id and p.stable_id=\"$proteinItem\"}; - my $res = $dbh->select_from_table($protein_sql_select); - - # If no content, next. Cases of partial tests. - if ( $#{$res} < 0 ){ - next; - } - - my $protein_id=$res->[0]->{'protein_id'}; - my $protein_definition=$res->[0]->{'definition'}; - - #add orthologus information from the list of species for proteins associated to this KO group - my $gene_string=$hash->{'GENES'}; - #print STDERR $proteinItem, "\t", $gene_string, "\n"; - #print "gene string: $gene_string\n"; - my @lines=split/\,/,$gene_string; - my $is_cluster; - foreach my $l (@lines) { - # insert each ortholog - my ($code,$gene_id)=split/\:/,$l; - $gene_id=~s/^ //; - # determine if $gene_id containt a cluster of genes - my @cluster=split/ /,$gene_id; - $is_cluster=1 if scalar(@cluster)>1; - $is_cluster=0 if scalar(@cluster)==1; - my $lcode=lc($code); - #print STDERR "* ", $lcode, "\n"; - #print STDERR "- ", Dumper( $codesOrg ); - # next if ortholog is not in the list of species to analyze - next if !$codesOrg->{$lcode}; - #print STDERR "Passed\n"; - #get organism_id from DB - #my $organism_id= organism_table($lcode,$dbEngine,$dbh); - my $organism_id= $codesOrg->{$lcode}; - - #populate ortholog table - #check if ortholog already exists (yes && do_update => update record; no => insert new ortholog) - my $ortholog_sql_select = qq{ SELECT ortholog_id FROM ortholog WHERE name=\"$gene_id\" }; - # print STDERR $ortholog_sql_select, "\n"; - my $ortholog_sql_update = qq{ UPDATE ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; - # print STDERR $ortholog_sql_update, "\n"; - - my $ortholog_sql_insert = ""; - if( lc( $dbEngine ) eq 'sqlite') - { - $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id,name,organism_id, db_id,db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; - } - else - { - $ortholog_sql_insert = qq{ INSERT INTO ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; - } - # print STDERR $ortholog_sql_insert, "\n"; - my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); + } + if(!defined $kegg_group_id) { + die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); + } + + foreach my $proteinItem(@proteinList) { + + #select protein_id infor (because items are stable_ids in protein table) + my $protein_sql_select= qq{ SELECT d.protein_id,d.definition d FROM definition d, protein p WHERE p.protein_id=d.protein_id and p.stable_id=\"$proteinItem\"}; + my $res = $dbh->select_from_table($protein_sql_select); + + # If no content, next. Cases of partial tests. + if ( $#{$res} < 0 ){ + next; + } + + my $protein_id = $res->[0]->{'protein_id'}; + my $protein_definition = $res->[0]->{'definition'}; + + #add orthologus information from the list of species for proteins associated to this KO group + my $gene_string = $hash->{'GENES'}; + + #print STDERR $proteinItem, "\t", $gene_string, "\n"; + #print "gene string: $gene_string\n"; + my @lines=split/\,/,$gene_string; + my $is_cluster; + foreach my $l (@lines) { + # insert each ortholog + my ($code,$gene_id)=split/\:/,$l; + $gene_id=~s/^ //; + # determine if $gene_id containt a cluster of genes + my @cluster=split/ /,$gene_id; + $is_cluster=1 if scalar(@cluster)>1; + $is_cluster=0 if scalar(@cluster)==1; + my $lcode=lc($code); + #print STDERR "* ", $lcode, "\n"; + #print STDERR "- ", Dumper( $codesOrg ); + # next if ortholog is not in the list of species to analyze + next if !$codesOrg->{$lcode}; + #print STDERR "Passed\n"; + #get organism_id from DB + #my $organism_id= organism_table($lcode,$dbEngine,$dbh); + my $organism_id= $codesOrg->{$lcode}; + + #populate ortholog table + #check if ortholog already exists (yes && do_update => update record; no => insert new ortholog) + my $ortholog_sql_select = qq{ SELECT ortholog_id FROM ortholog WHERE name=\"$gene_id\" }; + # print STDERR $ortholog_sql_select, "\n"; + my $ortholog_sql_update = qq{ UPDATE ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; + # print STDERR $ortholog_sql_update, "\n"; + + my $ortholog_sql_insert = ""; + if( lc( $dbEngine ) eq 'sqlite') { + $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id,name,organism_id, db_id,db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; + } + else { + $ortholog_sql_insert = qq{ INSERT INTO ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; + } + # print STDERR $ortholog_sql_insert, "\n"; + my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $ortholog_id) - { my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $ortholog_id=$results->[0]->{'id'}; - } - if(($loglevel eq 'debug' )||($loglevel eq 'info' )){ print "SQL: $ortholog_sql_insert --- $ortholog_id\n";} - #populate protein_ortholog - #check if protein_ortholog already exists in the table (yes && do_update => update record; no => insert new protein_ortholog) - my $type; - if ($numberProteinsInGroup>1 && $is_cluster==0) { - $type="many2one"; - } elsif ($numberProteinsInGroup>1 && $is_cluster==1) { - $type="many2many"; - } elsif ($numberProteinsInGroup==1 && $is_cluster==1) { - $type="one2many"; - } else { - $type="one2one"; - } + if(!defined $ortholog_id) { + my $select = &selectLastId( $dbEngine ); + my $results = $dbh->select_from_table($select); + $ortholog_id=$results->[0]->{'id'}; + } + + if(($loglevel eq 'debug' )||($loglevel eq 'info' )){ print "SQL: $ortholog_sql_insert --- $ortholog_id\n";} + #populate protein_ortholog + #check if protein_ortholog already exists in the table (yes && do_update => update record; no => insert new protein_ortholog) + + # TODO start new iterator from here + + my $type; + + if ($numberProteinsInGroup>1 && $is_cluster==0) { + $type="many2one"; + } elsif ($numberProteinsInGroup>1 && $is_cluster==1) { + $type="many2many"; + } elsif ($numberProteinsInGroup==1 && $is_cluster==1) { + $type="one2many"; + } else { + $type="one2one"; + } my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; my $prot_ortholog_sql_insert =""; - if( lc( $config{'dbEngine'} ) eq 'sqlite') - { $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");};} - else - { $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";};} - my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); - }#for each group of genes in multiply organisms - - #update definition field for proteins associated to this KO group - if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') - { push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'});} - # Toniher. This below is not necessary since it is sent to updateProteinDefinition - #$protein_definition .='KEGG:'.$hash->{'DEFINITION'}.';'; - #$sqlUpdate = "UPDATE protein set definition='$protein_definition' where protein_id=$protein_id"; -# print "SQL_CODE:$sqlUpdate\n" ; - #$dbh->update_set($sqlUpdate); - - #add GO terms info into go_term and protein_go table - if(defined $hash->{'DBLINKS'}) - { - my $goId =parseKEGGDBLInks($hash->{'DBLINKS'}); - if($goId ne '') - { - #insert go term, associated with this protein into go_term table, and then into protein_go - my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; - my $sqlUpdate =""; - my $sqlInsert = ""; - if( lc( $dbEngine ) eq 'sqlite') - { $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")";} - else - { $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\"";} - my $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); - #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $goTermId) - { - my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $goTermId=$results->[0]->{'id'}; - } - #select protein_go_id if there is one, and add 'KEGG' to the source field - $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; - my $result =$dbh->select_from_table($sqlSelect); - if ( $#$result < 0 ) - { - if( lc( $config{'dbEngine'} ) eq 'sqlite') - { $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)";} - else - { $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId";} - $dbh->insert_set($sqlInsert); - } - }#if there was a GO records - }#if defined dbLinks - }#foreach protein Item - - }#foreach kegg KO item - - #update protein definition for KEGG source - #print STDERR "Definition\n"; - #print STDERR Dumper( \%protDefinitionData ); - &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); - -}#sub + if( lc( $config{'dbEngine'} ) eq 'sqlite') { + $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");};} + else { + $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";};} + my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); + } #for each group of genes in multiply organisms + + #update definition field for proteins associated to this KO group + if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { + push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); + } + + # Toniher. This below is not necessary since it is sent to updateProteinDefinition + #$protein_definition .='KEGG:'.$hash->{'DEFINITION'}.';'; + #$sqlUpdate = "UPDATE protein set definition='$protein_definition' where protein_id=$protein_id"; + # print "SQL_CODE:$sqlUpdate\n" ; + #$dbh->update_set($sqlUpdate); + + # add GO terms info into go_term and protein_go table. + # TODO Consider in the future other annotations, such as COG + if(defined $hash->{'DBLINKS'}) { + my $goId = parseKEGGDBLInks($hash->{'DBLINKS'}); + if($goId ne '') { + #insert go term, associated with this protein into go_term table, and then into protein_go + my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; + my $sqlUpdate =""; + my $sqlInsert = ""; + if( lc( $dbEngine ) eq 'sqlite') { + $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; + } + else { + $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; + } + my $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); + #small patch for SQLite - the current insert function could not return id of the last inserted record... + if(!defined $goTermId) { + my $select = &selectLastId( $dbEngine ); + my $results = $dbh->select_from_table($select); + $goTermId=$results->[0]->{'id'}; + } + #select protein_go_id if there is one, and add 'KEGG' to the source field + $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; + my $result =$dbh->select_from_table($sqlSelect); + if ( $#$result < 0 ) { + if( lc( $config{'dbEngine'} ) eq 'sqlite') { + $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)"; + } else { + $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId"; + } + $dbh->insert_set($sqlInsert); + } + }#if there was a GO records + }#if defined dbLinks + }#foreach protein Item + }#foreach kegg KO item + + #update protein definition for KEGG source + #print STDERR "Definition\n"; + #print STDERR Dumper( \%protDefinitionData ); + &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + + }#sub sub parseKEGGDBLInks @@ -335,28 +346,25 @@ sub parseKEGGDBLInks return $retGO; } - +# TODO adapt for multiple REST # subroutine to parse KEGG record and put its elements into a hash sub parse_kegg_record { my $kegg_id=shift; my %returnData; my $url = "http://rest.kegg.jp/get/ko:$kegg_id"; my $response = get $url; -# print $response; + # print $response; my @lines = split(/\n/,$response); my($name, $value); - foreach my $item (@lines) - { + foreach my $item (@lines) { chomp($item); if($item=~/\/\/\//){last;} - if($item=~/^(\w+)\s+(.+)$/) - { + if($item=~/^(\w+)\s+(.+)$/) { $name =$1;$value=$2; $value =~s/\"//g; $returnData{$name}=$value; - } - else - { + } + else { $item=~s/^\s+//; $item=~s/\s+$//; $item =~s/\"//g; @@ -403,7 +411,7 @@ sub organism_table { if(! defined $scName){ ($codeItem, $taxonId, $scName)=$item=~/[^,]+(...)\,.(\d+)\;.(.+)$/; } - + if(!defined $codeItem){next;} if($codeItem eq $code) {last;} @@ -428,13 +436,13 @@ sub organism_table { # print "3. $organism_sql_update\n"; $organism_id = $dbh->select_update_insert("organism_id", $organism_sql_select, $organism_sql_update, $organism_sql_insert, $do_update); - + # print "4. ".$organism_id."\n"; - + #small patch for SQLite - the current insert function could not return id of the last inserted record... if(!defined $organism_id && lc( $engine ) eq "sqlite") { - + my $select = &selectLastId( $engine ); my $results = $dbh->select_from_table($select); #print Dumper($results); @@ -442,9 +450,9 @@ sub organism_table { } }#if ! defined organism id - + if ( $organism_id ) { - + $returnData{$code}=$organism_id; } } @@ -467,6 +475,3 @@ sub selectLastId { } } - - - From 8efcd6664119751bd92998ca14d0a23cadc33709 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 2 Nov 2020 13:04:28 +0100 Subject: [PATCH 018/381] extra step --- pipeline.nf | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 6011c82..412badd 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -837,7 +837,27 @@ process 'blast_annotator_upload'{ command } -/** Last step **/ +process 'kegg_download'{ + + maxForks 1 + + input: + file keggfile from keggfile + file config from config4perl8 + file("upload_blast") from upload_blast + + output: + file("down_kegg", isDirectory: true) into (down_kegg) + + + script: + + command += " \ + download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err; \ + " + + command +} process 'kegg_upload'{ @@ -847,6 +867,7 @@ process 'kegg_upload'{ file keggfile from keggfile file config from config4perl8 file("upload_blast") from upload_blast + file("down_kegg", isDirectory: true) from down_kegg output: file('done') into (last_step1, last_step2) @@ -857,7 +878,7 @@ process 'kegg_upload'{ command = checkMySQL( mysql, params.mysqllog ) command += " \ - load_kegg_KAAS.pl -input $keggfile -rel $params.kegg_release -conf \$config > done 2>err; \ + load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > done 2>err; \ " command From ae6afb1ed72411814397bfe034989eb529852330 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 2 Nov 2020 13:32:16 +0100 Subject: [PATCH 019/381] preprocessing --- scripts/load_kegg_KAAS.pl | 52 ++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 9336372..e033e7a 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -54,11 +54,12 @@ =head1 AUTHORS my $USAGE = "perl load_kegg_KAAS.pl [-i input] [-rel Kegg release] [-h help] [-conf configuration file] \n"; -my ($do_update, $show_help, $input, $kegg_release); +my ($do_update, $show_help, $input, $directory, $kegg_release); &GetOptions( 'update|u=s' => \$do_update, 'input|i=s' => \$input, + 'dir|d=s' => \$directory, 'rel|r=s' => \$kegg_release, 'conf=s' =>\$confFile, 'help|h' => \$show_help @@ -133,19 +134,47 @@ =head1 AUTHORS #print Dumper( \%keggs ); #print Dumper( \%organisms ); -&uploadKeggInformation( $dbh, \%keggs,\%organisms,$config{'dbEngine'} ); +my $pre_upload_kegg = 0; +if ( $directory ) { + $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); +} + +&uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); + +sub preUploadKeggInformation { + + my ($dbh, $directory, $dbEngine) = @_; + + my $pre_upload_kegg = 0; + + opendir(my $dh, $directory) || die "Can't open $directory: $!"; + my @files = grep { /\.txt/ && -f "$directory/$_" } readdir($dh); + closedir $dh; + + foreach my $file (@files) { + # Process Downloaded KEGG files and import into DB + } + + return $pre_upload_kegg; + +} sub uploadKeggInformation { - my($dbh, $keggData,$codesOrg,$dbEngine)=@_; + my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); foreach my $kegg_id(keys %{$keggData}) { #get KO information from server - my $hash = parse_kegg_record($kegg_id); -# print Dumper($hash)."\n"; die; + my $hash; + if ( $pre_upload_kegg > 0 ) { + $hash = retrieve_kegg_record($kegg_id); + } else { + $hash = parse_kegg_record($kegg_id); + } + # print Dumper($hash)."\n"; die; my @proteinList = @{$keggData->{$kegg_id}}; my $numberProteinsInGroup=scalar @proteinList; @@ -346,7 +375,18 @@ sub parseKEGGDBLInks return $retGO; } -# TODO adapt for multiple REST +# subroutine to retrieve KEGG record from DB +sub retrieve_kegg_record { + + my $kegg_id=shift; + my %returnData = {}; + + my $sqlSelect = "SELECT * from ... where kegg_id = $kegg_id"; + my $result =$dbh->select_from_table($sqlSelect); + + return \%returnData; +} + # subroutine to parse KEGG record and put its elements into a hash sub parse_kegg_record { my $kegg_id=shift; From a8fb040abdafd6b469ae8cb2f8e3513634da4625 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 14:06:51 +0100 Subject: [PATCH 020/381] starting moving --- scripts/lib/SQL.schema.sql | 7 ++-- scripts/lib/SQL.schema.sqlite.sql | 7 ++-- scripts/load_kegg_KAAS.pl | 61 +++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 9 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 1377d7d..44e5ae2 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -53,6 +53,7 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `class` TEXT , `db_links` TEXT , `db_id` TEXT , + `genes` TEXT , `kegg_release` INTEGER); CREATE TABLE IF NOT EXISTS `organism` ( @@ -167,7 +168,7 @@ CREATE TABLE IF NOT EXISTS `orthologxref` ( `orthologxref_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `dbname` TEXT NOT NULL DEFAULT '' , `dbid` TEXT NOT NULL DEFAULT '' , - `ortholog_id` INTEGER NOT NULL + `ortholog_id` INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS `pathway` ( @@ -192,7 +193,7 @@ CREATE TABLE IF NOT EXISTS `reaction` ( CREATE TABLE IF NOT EXISTS `ortholog_reaction` ( `ortholog_reaction_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `ortholog_id` INTEGER NOT NULL , - `reaction_id` INTEGER UNSIGNED NOT NULL + `reaction_id` INTEGER UNSIGNED NOT NULL ); CREATE TABLE IF NOT EXISTS `complex` ( @@ -200,7 +201,7 @@ CREATE TABLE IF NOT EXISTS `complex` ( `db_id` TEXT NOT NULL DEFAULT '', `db_name` TEXT NOT NULL DEFAULT '', `name` TEXT NULL DEFAULT NULL, - `stable_id` TEXT NOT NULL DEFAULT '' + `stable_id` TEXT NOT NULL DEFAULT '' ); diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index c14cccd..bff9cd0 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -52,6 +52,7 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `class` TEXT , `db_links` TEXT , `db_id` TEXT , + `genes` TEXT , `kegg_release` INTEGER); CREATE TABLE IF NOT EXISTS `organism` ( @@ -166,7 +167,7 @@ CREATE TABLE IF NOT EXISTS `orthologxref` ( `orthologxref_id` INTEGER PRIMARY KEY AUTOINCREMENT , `dbname` TEXT NOT NULL DEFAULT '' , `dbid` TEXT NOT NULL DEFAULT '' , - `ortholog_id` INTEGER NOT NULL + `ortholog_id` INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS `pathway` ( @@ -191,7 +192,7 @@ CREATE TABLE IF NOT EXISTS `reaction` ( CREATE TABLE IF NOT EXISTS `ortholog_reaction` ( `ortholog_reaction_id` INTEGER PRIMARY KEY AUTOINCREMENT , `ortholog_id` INTEGER NOT NULL , - `reaction_id` INTEGER UNSIGNED NOT NULL + `reaction_id` INTEGER UNSIGNED NOT NULL ); CREATE TABLE IF NOT EXISTS `complex` ( @@ -199,7 +200,7 @@ CREATE TABLE IF NOT EXISTS `complex` ( `db_id` TEXT NOT NULL DEFAULT '', `db_name` TEXT NOT NULL DEFAULT '', `name` TEXT NULL DEFAULT NULL, - `stable_id` TEXT NOT NULL DEFAULT '' + `stable_id` TEXT NOT NULL DEFAULT '' ); diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index e033e7a..af597a5 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -154,12 +154,64 @@ sub preUploadKeggInformation { foreach my $file (@files) { # Process Downloaded KEGG files and import into DB + my ( @filentries ) = &splitKeggFile( $file ); + foreach my $filentry ( @filentries ) { + &parseAndUploadKEGGEntry( $filentry, $dbh, $dbEngine); + $pre_upload_kegg++; + } } return $pre_upload_kegg; } +sub splitKeggFile { + my $file = shift; + my @strings = []; + + open (FH, "$file"); + + my $part = ""; + while () { + $part.=$_; + + if ( $_=~/\/\/\// ) { + push( @strings, $part ); + $part = ""; + } + + } + close FH; + + return @strings; +} + +sub parseAndUploadKEGGEntry { + my $filestr = shift; + my $dbh = shift; + my $dbEngine = shift; + + my @lines = split(/\n/,$filestr); + my($name, $value); + foreach my $item (@lines) { + chomp($item); + if($item=~/\/\/\//){last;} + if($item=~/^(\w+)\s+(.+)$/) { + $name =$1;$value=$2; + $value =~s/\"//g; + $returnData{$name}=$value; + } + else { + $item=~s/^\s+//; + $item=~s/\s+$//; + $item =~s/\"//g; + $returnData{$name} .= ','.$item; + } + + } + +} + sub uploadKeggInformation { my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; @@ -178,8 +230,10 @@ sub uploadKeggInformation { my @proteinList = @{$keggData->{$kegg_id}}; my $numberProteinsInGroup=scalar @proteinList; + + # START to move to a function #upload information about KO group into DB if its absent in DB - my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS); + my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); foreach my $absItem(@absentList) { if(!defined $hash->{$absItem}) { $hash->{$absItem}=""; @@ -203,15 +257,16 @@ sub uploadKeggInformation { my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); # small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $kegg_group_id) - { + if (!defined $kegg_group_id) { my $select = &selectLastId( $dbEngine ); my $results = $dbh->select_from_table($select); $kegg_group_id=$results->[0]->{'id'}; } + if(!defined $kegg_group_id) { die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); } + # END of function move foreach my $proteinItem(@proteinList) { From 509128c0e46990729ac6e5ba5310882e71247cb6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 14:21:38 +0100 Subject: [PATCH 021/381] retrieval --- scripts/lib/SQL.schema.sql | 1 + scripts/lib/SQL.schema.sqlite.sql | 1 + scripts/load_kegg_KAAS.pl | 8 ++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 44e5ae2..829aa2f 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -46,6 +46,7 @@ CREATE TABLE IF NOT EXISTS `domain` ( CREATE TABLE IF NOT EXISTS `kegg_group` ( `kegg_group_id` INTEGER PRIMARY KEY AUTO_INCREMENT , + `kegg_id` TEXT , `name` TEXT , `definition` TEXT, `pathway` TEXT, diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index bff9cd0..138349b 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -45,6 +45,7 @@ CREATE TABLE IF NOT EXISTS `domain` ( CREATE TABLE IF NOT EXISTS `kegg_group` ( `kegg_group_id` INTEGER PRIMARY KEY AUTOINCREMENT , + `kegg_id` TEXT , `name` TEXT , `definition` TEXT, `pathway` TEXT, diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index af597a5..404e547 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -436,8 +436,12 @@ sub retrieve_kegg_record { my $kegg_id=shift; my %returnData = {}; - my $sqlSelect = "SELECT * from ... where kegg_id = $kegg_id"; - my $result =$dbh->select_from_table($sqlSelect); + my $sqlSelect = "SELECT * from kegg_group where kegg_id = $kegg_id limit 1"; + my $results =$dbh->select_from_table($sqlSelect); + + if ( $#{$results} >= 0 ) { + %returnData = $results->[0]; + } return \%returnData; } From 6671800e515e0ef27ef07d763d8448e5a487026d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 15:58:13 +0100 Subject: [PATCH 022/381] more moving --- scripts/lib/SQL.schema.sql | 1 - scripts/lib/SQL.schema.sqlite.sql | 1 - scripts/load_kegg_KAAS.pl | 132 +++++++++++++++++------------- 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 829aa2f..44e5ae2 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -46,7 +46,6 @@ CREATE TABLE IF NOT EXISTS `domain` ( CREATE TABLE IF NOT EXISTS `kegg_group` ( `kegg_group_id` INTEGER PRIMARY KEY AUTO_INCREMENT , - `kegg_id` TEXT , `name` TEXT , `definition` TEXT, `pathway` TEXT, diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index 138349b..bff9cd0 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -45,7 +45,6 @@ CREATE TABLE IF NOT EXISTS `domain` ( CREATE TABLE IF NOT EXISTS `kegg_group` ( `kegg_group_id` INTEGER PRIMARY KEY AUTOINCREMENT , - `kegg_id` TEXT , `name` TEXT , `definition` TEXT, `pathway` TEXT, diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 404e547..6cf4abe 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -142,6 +142,31 @@ =head1 AUTHORS &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); +sub parseAndUploadKEGGEntry { + my $filestr = shift; + my $dbh = shift; + my $dbEngine = shift; + + my @lines = split(/\n/,$filestr); + my($name, $value); + foreach my $item (@lines) { + chomp($item); + if($item=~/\/\/\//){last;} + if($item=~/^(\w+)\s+(.+)$/) { + $name =$1;$value=$2; + $value =~s/\"//g; + $returnData{$name}=$value; + } + else { + $item=~s/^\s+//; + $item=~s/\s+$//; + $item =~s/\"//g; + $returnData{$name} .= ','.$item; + } + + } + +} sub preUploadKeggInformation { my ($dbh, $directory, $dbEngine) = @_; @@ -186,30 +211,39 @@ sub splitKeggFile { return @strings; } -sub parseAndUploadKEGGEntry { - my $filestr = shift; +sub uploadSingleKEGGId { + + my $kegg_id = shift; + my $hash = shift; my $dbh = shift; my $dbEngine = shift; - my @lines = split(/\n/,$filestr); - my($name, $value); - foreach my $item (@lines) { - chomp($item); - if($item=~/\/\/\//){last;} - if($item=~/^(\w+)\s+(.+)$/) { - $name =$1;$value=$2; - $value =~s/\"//g; - $returnData{$name}=$value; - } - else { - $item=~s/^\s+//; - $item=~s/\s+$//; - $item =~s/\"//g; - $returnData{$name} .= ','.$item; - } + #populate kegg_group table + #check if kegg_group already exists (yes && do_update => update record; no => insert new kegg_group) + my $kegg_group_sql_select = qq{ SELECT kegg_group_id FROM kegg_group WHERE db_id=\"$kegg_id\" }; + my $kegg_group_sql_update = qq{ UPDATE kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; + my $kegg_group_sql_insert = ""; + if( lc( $dbEngine ) eq 'sqlite') { + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id,name,definition,pathway,module,class,db_links,db_id,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$kegg_release\")}; + } + else { + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; + } + if(($loglevel eq 'debug' )||($loglevel eq 'info' )) { + print "SQL: $kegg_group_sql_insert\n"; + } + my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); + + # small patch for SQLite - the current insert function could not return id of the last inserted record... + if (!defined $kegg_group_id) { + my $select = &selectLastId( $dbEngine ); + my $results = $dbh->select_from_table($select); + $kegg_group_id=$results->[0]->{'id'}; } + return $kegg_group_id; + } sub uploadKeggInformation { @@ -218,55 +252,38 @@ sub uploadKeggInformation { my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); - foreach my $kegg_id(keys %{$keggData}) { + foreach my $kegg_id (keys %{$keggData}) { #get KO information from server my $hash; + my $kegg_group_id; if ( $pre_upload_kegg > 0 ) { - $hash = retrieve_kegg_record($kegg_id); + + ( $hash, $kegg_group_id ) = retrieve_kegg_record($kegg_id); + } else { + $hash = parse_kegg_record($kegg_id); - } - # print Dumper($hash)."\n"; die; - my @proteinList = @{$keggData->{$kegg_id}}; - my $numberProteinsInGroup=scalar @proteinList; + #upload information about KO group into DB if its absent in DB + my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); + foreach my $absItem(@absentList) { + if(!defined $hash->{$absItem}) { + $hash->{$absItem}=""; + } + } - # START to move to a function - #upload information about KO group into DB if its absent in DB - my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); - foreach my $absItem(@absentList) { - if(!defined $hash->{$absItem}) { - $hash->{$absItem}=""; - } - } - #populate kegg_group table - #check if kegg_group already exists (yes && do_update => update record; no => insert new kegg_group) - my $kegg_group_sql_select = qq{ SELECT kegg_group_id FROM kegg_group WHERE db_id=\"$kegg_id\" }; - my $kegg_group_sql_update = qq{ UPDATE kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; - my $kegg_group_sql_insert = ""; - if( lc( $dbEngine ) eq 'sqlite') { - $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id, name,definition,pathway,module,class,db_links,db_id,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$kegg_release\")}; - } - else { - $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; - } - if(($loglevel eq 'debug' )||($loglevel eq 'info' )) { - print "SQL: $kegg_group_sql_insert\n"; + $kegg_group_id = &uploadSingleKEGGId($kegg_id, $hash, $dbh, $dbEngine); } - my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); + # print Dumper($hash)."\n"; die; - # small patch for SQLite - the current insert function could not return id of the last inserted record... - if (!defined $kegg_group_id) { - my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $kegg_group_id=$results->[0]->{'id'}; - } - if(!defined $kegg_group_id) { + if(!defined $kegg_group_id) { die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); } - # END of function move + + my @proteinList = @{$keggData->{$kegg_id}}; + my $numberProteinsInGroup=scalar @proteinList; foreach my $proteinItem(@proteinList) { @@ -436,14 +453,17 @@ sub retrieve_kegg_record { my $kegg_id=shift; my %returnData = {}; - my $sqlSelect = "SELECT * from kegg_group where kegg_id = $kegg_id limit 1"; + my $sqlSelect = "SELECT * from kegg_group where db_id = $kegg_id limit 1"; my $results =$dbh->select_from_table($sqlSelect); + my $kegg_group_id; + if ( $#{$results} >= 0 ) { %returnData = $results->[0]; + $kegg_group_id = $results->[0]->{"id"}; } - return \%returnData; + return (%returnData, $kegg_group_id); } # subroutine to parse KEGG record and put its elements into a hash From 183bdc835112cec6565eb78cf927450ac14b7405 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 16:21:51 +0100 Subject: [PATCH 023/381] fixes and adding adaptors --- scripts/load_kegg_KAAS.pl | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 6cf4abe..1359641 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -147,11 +147,18 @@ sub parseAndUploadKEGGEntry { my $dbh = shift; my $dbEngine = shift; + my %returnData; + my $kegg_id; + my @lines = split(/\n/,$filestr); my($name, $value); foreach my $item (@lines) { chomp($item); if($item=~/\/\/\//){last;} + + if($item=~/^ENTRY\s+(\w+)/) { + $kegg_id = $1; + } if($item=~/^(\w+)\s+(.+)$/) { $name =$1;$value=$2; $value =~s/\"//g; @@ -166,6 +173,14 @@ sub parseAndUploadKEGGEntry { } + my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); + + if(!defined $kegg_group_id) { + die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); + } + + return 1; + } sub preUploadKeggInformation { @@ -221,13 +236,13 @@ sub uploadSingleKEGGId { #populate kegg_group table #check if kegg_group already exists (yes && do_update => update record; no => insert new kegg_group) my $kegg_group_sql_select = qq{ SELECT kegg_group_id FROM kegg_group WHERE db_id=\"$kegg_id\" }; - my $kegg_group_sql_update = qq{ UPDATE kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; + my $kegg_group_sql_update = qq{ UPDATE kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", genes=\"$hash->{'GENES'}\", kegg_release=\"$kegg_release\";}; my $kegg_group_sql_insert = ""; if( lc( $dbEngine ) eq 'sqlite') { - $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id,name,definition,pathway,module,class,db_links,db_id,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$kegg_release\")}; + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id,name,definition,pathway,module,class,db_links,db_id,genes,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$hash->{'GENES'}\",\"$kegg_release\")}; } else { - $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", kegg_release=\"$kegg_release\";}; + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", genes=\"$hash->{'GENES'}\", kegg_release=\"$kegg_release\";}; } if(($loglevel eq 'debug' )||($loglevel eq 'info' )) { print "SQL: $kegg_group_sql_insert\n"; @@ -459,8 +474,14 @@ sub retrieve_kegg_record { my $kegg_group_id; if ( $#{$results} >= 0 ) { - %returnData = $results->[0]; $kegg_group_id = $results->[0]->{"id"}; + + foreach my $key ( keys %{$results->[0]} ) { + my $finalkey = uc($key); + $finalkey=~s/\_//g; + $returnData{$finalkey} = $results->[0]->{$key}; + } + } return (%returnData, $kegg_group_id); From eb0cdf10e1c20620f7968f44b06506b8c826616a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 16:47:23 +0100 Subject: [PATCH 024/381] change location --- nextflow.config | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/nextflow.config b/nextflow.config index 1108417..b32def4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,14 +21,14 @@ process{ cpus='8' container="ncbi/blast:2.10.1" } - + withLabel: diamond { queue='biocore-el7,long-sl7' time='48h' cpus='8' container="quay.io/biocontainers/diamond:0.9.30--h56fc30b_0" } - + withLabel: blastannotator { cpus='1' memory='8G' @@ -40,17 +40,17 @@ process{ queue='biocore-el7,short-sl7' container="quay.io/biocontainers/agat:0.1.0--pl526r35_0" } - + withLabel: sigtarp { queue='short-sl7' container="/software/bi/biocore_tools/git/singularity/sigtarp-dev.simg" } - + withLabel: cdSearch { cpus='1' memory='8G' queue='biocore-el7,short-sl7' - } + } withLabel: ipscan { queue='biocore-el7,long-sl7' @@ -59,7 +59,7 @@ process{ container="/software/bi/biocore_tools/git/singularity/iprscan-5.39.77.sif" maxRetries=3 } - + withLabel: kofamscan { queue='biocore-el7,long-sl7' time='48h' @@ -70,5 +70,4 @@ process{ process.container = "guigolab/fa-nf:latest" singularity.enabled = true - - +singularity.cacheDir = "$baseDir/singularity" From 9becea544ac5d5a9e88aa15e1d16c21e6c7e8f44 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 20:22:41 +0100 Subject: [PATCH 025/381] minor fix --- pipeline.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 412badd..c788351 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -540,7 +540,7 @@ process initDB { file seq from seq_test output: - file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10) + file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10, config4perl11) script: command = "mkdir -p $params.resultPath\n" @@ -847,7 +847,7 @@ process 'kegg_download'{ file("upload_blast") from upload_blast output: - file("down_kegg", isDirectory: true) into (down_kegg) + file("down_kegg") into (down_kegg) script: @@ -865,9 +865,9 @@ process 'kegg_upload'{ input: file keggfile from keggfile - file config from config4perl8 + file config from config4perl9 file("upload_blast") from upload_blast - file("down_kegg", isDirectory: true) from down_kegg + file("down_kegg") from down_kegg output: file('done') into (last_step1, last_step2) @@ -886,7 +886,7 @@ process 'kegg_upload'{ process 'generateResultFiles'{ input: - file config from config4perl9 + file config from config4perl10 file all_done from last_step1 file obofile from obofile @@ -905,7 +905,7 @@ if ( annotation != null && annotation != "" ){ process 'generateGFF3File'{ input: - file config from config4perl10 + file config from config4perl11 file all_done from last_step2 From 5f771188264c030e31d3685448fa39003874559f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 20:27:06 +0100 Subject: [PATCH 026/381] rm redundant --- pipeline.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/pipeline.nf b/pipeline.nf index c788351..26cefcc 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -866,7 +866,6 @@ process 'kegg_upload'{ input: file keggfile from keggfile file config from config4perl9 - file("upload_blast") from upload_blast file("down_kegg") from down_kegg output: From e9b5a7b7c4eaf6dd7a29d413afad8b3b0bcec512 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 21:21:04 +0100 Subject: [PATCH 027/381] update 755 --- scripts/download_kegg_KASS.pl | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/download_kegg_KASS.pl diff --git a/scripts/download_kegg_KASS.pl b/scripts/download_kegg_KASS.pl old mode 100644 new mode 100755 From e57d97762c87773f2211ff703f1a93d3688a2501 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Nov 2020 22:54:16 +0100 Subject: [PATCH 028/381] update script --- scripts/{download_kegg_KASS.pl => download_kegg_KAAS.pl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{download_kegg_KASS.pl => download_kegg_KAAS.pl} (100%) diff --git a/scripts/download_kegg_KASS.pl b/scripts/download_kegg_KAAS.pl similarity index 100% rename from scripts/download_kegg_KASS.pl rename to scripts/download_kegg_KAAS.pl From 73c65c1777204581e17732b9e81f076dc0de1e71 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 11:49:33 +0100 Subject: [PATCH 029/381] fix hash --- scripts/download_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/download_kegg_KAAS.pl b/scripts/download_kegg_KAAS.pl index b3de615..e27a7da 100755 --- a/scripts/download_kegg_KAAS.pl +++ b/scripts/download_kegg_KAAS.pl @@ -97,7 +97,7 @@ =head1 AUTHORS my @queue = []; my $iter = 0; -foreach my $kegg_id (keys %{%keggs} ) { +foreach my $kegg_id ( keys %keggs ) { if ( $#queue > $webChunk - 1 ) { From 6cbca334f8ad26c261d678523589fa31242ff669 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 11:58:20 +0100 Subject: [PATCH 030/381] fix possible problem --- pipeline.nf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 26cefcc..7287419 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -852,9 +852,7 @@ process 'kegg_download'{ script: - command += " \ - download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err; \ - " + command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" command } From af7c37bdd2adfd34bfde884788ec629cdcfd5e16 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 13:19:58 +0100 Subject: [PATCH 031/381] fix dir place and float --- scripts/lib/SQL.schema.sql | 2 +- scripts/lib/SQL.schema.sqlite.sql | 2 +- scripts/load_kegg_KAAS.pl | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 44e5ae2..5ae2452 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -54,7 +54,7 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `db_links` TEXT , `db_id` TEXT , `genes` TEXT , - `kegg_release` INTEGER); + `kegg_release` FLOAT); CREATE TABLE IF NOT EXISTS `organism` ( `organism_id` INTEGER PRIMARY KEY AUTO_INCREMENT , diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index bff9cd0..461b1eb 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -53,7 +53,7 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `db_links` TEXT , `db_id` TEXT , `genes` TEXT , - `kegg_release` INTEGER); + `kegg_release` FLOAT); CREATE TABLE IF NOT EXISTS `organism` ( `organism_id` INTEGER PRIMARY KEY AUTOINCREMENT , diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 1359641..b993ffe 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -69,10 +69,15 @@ =head1 AUTHORS $do_update = 0 if (!defined $do_update); -if (!$input || !$kegg_release) { +if ( !$input || !$kegg_release ) { die("Please specify input file with results of KAAS server or KEGG DB release used to annotated data!\n Launch 'perl load_kegg_KAAS.pl -h' to see parameters description\n") } +# If null, let's assign 0.0 +if ( $kegg_release eq 'null' ) { + $kegg_release = 0.0; +} + #read configuration file my $cfg = new Config::Simple($confFile); @@ -194,7 +199,7 @@ sub preUploadKeggInformation { foreach my $file (@files) { # Process Downloaded KEGG files and import into DB - my ( @filentries ) = &splitKeggFile( $file ); + my ( @filentries ) = &splitKeggFile( $directory."/".$file ); foreach my $filentry ( @filentries ) { &parseAndUploadKEGGEntry( $filentry, $dbh, $dbEngine); $pre_upload_kegg++; From 1f0ca49eb9c2fefd98e7165bfeb6aae264a356ed Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 18:53:14 +0100 Subject: [PATCH 032/381] more stuff --- scripts/load_kegg_KAAS.pl | 43 +++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index b993ffe..3270180 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -159,25 +159,33 @@ sub parseAndUploadKEGGEntry { my($name, $value); foreach my $item (@lines) { chomp($item); - if($item=~/\/\/\//){last;} - - if($item=~/^ENTRY\s+(\w+)/) { - $kegg_id = $1; - } - if($item=~/^(\w+)\s+(.+)$/) { - $name =$1;$value=$2; - $value =~s/\"//g; - $returnData{$name}=$value; - } - else { - $item=~s/^\s+//; - $item=~s/\s+$//; - $item =~s/\"//g; - $returnData{$name} .= ','.$item; - } - + if ($item=~/\/\/\//) { + $name = ""; $value = ""; + last; + } else { + if($item=~/^ENTRY\s+(\w+)/) { + $kegg_id = $1; + } else { + if($item=~/^(\w+)\s+(.+)$/) { + $name = $1; $value = $2; + $value =~s/\"//g; + $returnData{$name}=$value; + } else { + if ( $name ) { + $item=~s/^\s+//; + $item=~s/\s+$//; + $item =~s/\"//g; + $returnData{$name} .= ','.$item; + } + } + } + } } + print STDERR $kegg_id, "\n"; + print STDERR Dumper( \%returnData ); + + my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); if(!defined $kegg_group_id) { @@ -187,6 +195,7 @@ sub parseAndUploadKEGGEntry { return 1; } + sub preUploadKeggInformation { my ($dbh, $directory, $dbEngine) = @_; From cab9c384c0b7564a9784c6ff4f1978ddf515cf36 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 19:26:34 +0100 Subject: [PATCH 033/381] update parts --- scripts/load_kegg_KAAS.pl | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 3270180..7ffc141 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -184,7 +184,15 @@ sub parseAndUploadKEGGEntry { print STDERR $kegg_id, "\n"; print STDERR Dumper( \%returnData ); + + # Avoid Genes too many entries + if ( $returnData{"GENES"} ) { + my (@parts) = split(",", $returnData{"GENES"} ); + if ( $#parts > 250 ) { # TODO: margin + $returnData{"GENES"} = join(",", @parts[0 .. 250] ); + } + } my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); @@ -247,6 +255,13 @@ sub uploadSingleKEGGId { my $dbh = shift; my $dbEngine = shift; + my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); + foreach my $absItem(@absentList) { + if(!defined $hash->{$absItem}) { + $hash->{$absItem}=""; + } + } + #populate kegg_group table #check if kegg_group already exists (yes && do_update => update record; no => insert new kegg_group) my $kegg_group_sql_select = qq{ SELECT kegg_group_id FROM kegg_group WHERE db_id=\"$kegg_id\" }; From ef3faeda6f8a9b24f0a34457794ad576a224f364 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 19:28:21 +0100 Subject: [PATCH 034/381] more check --- scripts/load_kegg_KAAS.pl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 7ffc141..281bf61 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -184,7 +184,7 @@ sub parseAndUploadKEGGEntry { print STDERR $kegg_id, "\n"; print STDERR Dumper( \%returnData ); - + # Avoid Genes too many entries if ( $returnData{"GENES"} ) { @@ -194,10 +194,13 @@ sub parseAndUploadKEGGEntry { } } - my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); + if ( $kegg_id ) { + my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); + + if(!defined $kegg_group_id) { + die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); + } - if(!defined $kegg_group_id) { - die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); } return 1; From 64e161e8b837a989ead133775d51da304bd6f034 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 19:31:35 +0100 Subject: [PATCH 035/381] check --- scripts/load_kegg_KAAS.pl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 281bf61..7f4b0f6 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -182,8 +182,6 @@ sub parseAndUploadKEGGEntry { } } - print STDERR $kegg_id, "\n"; - print STDERR Dumper( \%returnData ); # Avoid Genes too many entries @@ -191,10 +189,15 @@ sub parseAndUploadKEGGEntry { my (@parts) = split(",", $returnData{"GENES"} ); if ( $#parts > 250 ) { # TODO: margin $returnData{"GENES"} = join(",", @parts[0 .. 250] ); + print STDERR "** Done\n"; } } if ( $kegg_id ) { + + print STDERR $kegg_id, "\n"; + print STDERR Dumper( \%returnData ); + my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); if(!defined $kegg_group_id) { From 078d991e552118c44b4c1600955f7bdffe3a5c20 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 19:37:52 +0100 Subject: [PATCH 036/381] update --- scripts/load_kegg_KAAS.pl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 7f4b0f6..7ec22af 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -145,6 +145,8 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } +print STDERR "KO entries: ".$pre_upload_kegg."\n"; + &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); sub parseAndUploadKEGGEntry { @@ -500,8 +502,8 @@ sub parseKEGGDBLInks # subroutine to retrieve KEGG record from DB sub retrieve_kegg_record { - my $kegg_id=shift; - my %returnData = {}; + my $kegg_id = shift; + my %hash = {}; my $sqlSelect = "SELECT * from kegg_group where db_id = $kegg_id limit 1"; my $results =$dbh->select_from_table($sqlSelect); @@ -514,12 +516,12 @@ sub retrieve_kegg_record { foreach my $key ( keys %{$results->[0]} ) { my $finalkey = uc($key); $finalkey=~s/\_//g; - $returnData{$finalkey} = $results->[0]->{$key}; + $hash{$finalkey} = $results->[0]->{$key}; } } - return (%returnData, $kegg_group_id); + return (%hash, $kegg_group_id); } # subroutine to parse KEGG record and put its elements into a hash From 8a5e87af34d793e97b6220dbe2d3677c937c3090 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 19:43:35 +0100 Subject: [PATCH 037/381] updatyet --- scripts/load_kegg_KAAS.pl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 7ec22af..07570dc 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -145,8 +145,6 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } -print STDERR "KO entries: ".$pre_upload_kegg."\n"; - &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); sub parseAndUploadKEGGEntry { @@ -189,15 +187,15 @@ sub parseAndUploadKEGGEntry { if ( $returnData{"GENES"} ) { my (@parts) = split(",", $returnData{"GENES"} ); - if ( $#parts > 250 ) { # TODO: margin - $returnData{"GENES"} = join(",", @parts[0 .. 250] ); + if ( $#parts > 500 ) { # TODO: margin + $returnData{"GENES"} = join(",", @parts[0 .. 500] ); print STDERR "** Done\n"; } } if ( $kegg_id ) { - print STDERR $kegg_id, "\n"; + print STDERR "* KEGG_ID: ", $kegg_id, "\n"; print STDERR Dumper( \%returnData ); my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); @@ -301,6 +299,8 @@ sub uploadSingleKEGGId { sub uploadKeggInformation { my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; + print STDERR "KO entries: ".$pre_upload_kegg."\n"; + my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); @@ -310,6 +310,7 @@ sub uploadKeggInformation { my $kegg_group_id; if ( $pre_upload_kegg > 0 ) { + print STDERR "* Entering $kegg_id\n"; ( $hash, $kegg_group_id ) = retrieve_kegg_record($kegg_id); } else { From 1919481831211002d9959a53489c9708767e3ab5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 19:51:51 +0100 Subject: [PATCH 038/381] check vals --- scripts/load_kegg_KAAS.pl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 07570dc..26b7785 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -241,11 +241,15 @@ sub splitKeggFile { my $part = ""; while () { - $part.=$_; if ( $_=~/\/\/\// ) { - push( @strings, $part ); + if ( $part!~/^\s*$/ ) { + $part.=$_; + push( @strings, $part ); + } $part = ""; + } else { + $part.=$_; } } @@ -311,7 +315,7 @@ sub uploadKeggInformation { if ( $pre_upload_kegg > 0 ) { print STDERR "* Entering $kegg_id\n"; - ( $hash, $kegg_group_id ) = retrieve_kegg_record($kegg_id); + ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); } else { @@ -504,9 +508,9 @@ sub parseKEGGDBLInks sub retrieve_kegg_record { my $kegg_id = shift; - my %hash = {}; + my %hash; - my $sqlSelect = "SELECT * from kegg_group where db_id = $kegg_id limit 1"; + my $sqlSelect = "SELECT * from kegg_group where db_id = \"$kegg_id\" limit 1"; my $results =$dbh->select_from_table($sqlSelect); my $kegg_group_id; From 316511589d20209d009d77af089383f73e9b2156 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:02:10 +0100 Subject: [PATCH 039/381] more cleaning --- scripts/load_kegg_KAAS.pl | 149 +++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 26b7785..aa31d23 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -187,7 +187,7 @@ sub parseAndUploadKEGGEntry { if ( $returnData{"GENES"} ) { my (@parts) = split(",", $returnData{"GENES"} ); - if ( $#parts > 500 ) { # TODO: margin + if ( $#parts > 1000 ) { # TODO: margin $returnData{"GENES"} = join(",", @parts[0 .. 500] ); print STDERR "** Done\n"; } @@ -357,7 +357,10 @@ sub uploadKeggInformation { my $protein_definition = $res->[0]->{'definition'}; #add orthologus information from the list of species for proteins associated to this KO group - my $gene_string = $hash->{'GENES'}; + my $gene_string = ""; + if ( $hash->{'GENES'} ) { + $gene_string = $hash->{'GENES'}; + } #print STDERR $proteinItem, "\t", $gene_string, "\n"; #print "gene string: $gene_string\n"; @@ -427,81 +430,81 @@ sub uploadKeggInformation { if( lc( $config{'dbEngine'} ) eq 'sqlite') { $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");};} else { - $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";};} - my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); - } #for each group of genes in multiply organisms - - #update definition field for proteins associated to this KO group - if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { - push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); + $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; } - # Toniher. This below is not necessary since it is sent to updateProteinDefinition - #$protein_definition .='KEGG:'.$hash->{'DEFINITION'}.';'; - #$sqlUpdate = "UPDATE protein set definition='$protein_definition' where protein_id=$protein_id"; - # print "SQL_CODE:$sqlUpdate\n" ; - #$dbh->update_set($sqlUpdate); - - # add GO terms info into go_term and protein_go table. - # TODO Consider in the future other annotations, such as COG - if(defined $hash->{'DBLINKS'}) { - my $goId = parseKEGGDBLInks($hash->{'DBLINKS'}); - if($goId ne '') { - #insert go term, associated with this protein into go_term table, and then into protein_go - my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; - my $sqlUpdate =""; - my $sqlInsert = ""; - if( lc( $dbEngine ) eq 'sqlite') { - $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; - } - else { - $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; - } - my $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); - #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $goTermId) { - my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $goTermId=$results->[0]->{'id'}; - } - #select protein_go_id if there is one, and add 'KEGG' to the source field - $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; - my $result =$dbh->select_from_table($sqlSelect); - if ( $#$result < 0 ) { - if( lc( $config{'dbEngine'} ) eq 'sqlite') { - $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)"; - } else { - $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId"; - } - $dbh->insert_set($sqlInsert); - } - }#if there was a GO records - }#if defined dbLinks - }#foreach protein Item - }#foreach kegg KO item - - #update protein definition for KEGG source - #print STDERR "Definition\n"; - #print STDERR Dumper( \%protDefinitionData ); - &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); - - }#sub - - -sub parseKEGGDBLInks -{ - my $dbLinks = shift; + my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); + } #for each group of genes in multiply organisms - my $retGO=''; + #update definition field for proteins associated to this KO group + if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { + push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); + } - $dbLinks=~s/\n//g; - if($dbLinks =~/(GO\:\s*\d+)\s*/) - { - $retGO = $1; - $retGO=~s/\s+//g; - } + # Toniher. This below is not necessary since it is sent to updateProteinDefinition + #$protein_definition .='KEGG:'.$hash->{'DEFINITION'}.';'; + #$sqlUpdate = "UPDATE protein set definition='$protein_definition' where protein_id=$protein_id"; + # print "SQL_CODE:$sqlUpdate\n" ; + #$dbh->update_set($sqlUpdate); + + # add GO terms info into go_term and protein_go table. + # TODO Consider in the future other annotations, such as COG + if(defined $hash->{'DBLINKS'}) { + my $goId = parseKEGGDBLInks($hash->{'DBLINKS'}); + if($goId ne '') { + #insert go term, associated with this protein into go_term table, and then into protein_go + my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; + my $sqlUpdate =""; + my $sqlInsert = ""; + if( lc( $dbEngine ) eq 'sqlite') { + $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; + } + else { + $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; + } + my $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); + #small patch for SQLite - the current insert function could not return id of the last inserted record... + if(!defined $goTermId) { + my $select = &selectLastId( $dbEngine ); + my $results = $dbh->select_from_table($select); + $goTermId=$results->[0]->{'id'}; + } + #select protein_go_id if there is one, and add 'KEGG' to the source field + $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; + my $result =$dbh->select_from_table($sqlSelect); + if ( $#$result < 0 ) { + if( lc( $config{'dbEngine'} ) eq 'sqlite') { + $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)"; + } else { + $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId"; + } + $dbh->insert_set($sqlInsert); + } + }#if there was a GO records + }#if defined dbLinks + }#foreach protein Item + }#foreach kegg KO item + + #update protein definition for KEGG source + #print STDERR "Definition\n"; + #print STDERR Dumper( \%protDefinitionData ); + &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + +}#sub + + +sub parseKEGGDBLInks { + my $dbLinks = shift; + + my $retGO=''; + + $dbLinks=~s/\n//g; + if($dbLinks =~/(GO\:\s*\d+)\s*/) { + $retGO = $1; + $retGO=~s/\s+//g; + } - return $retGO; + return $retGO; } # subroutine to retrieve KEGG record from DB @@ -526,7 +529,7 @@ sub retrieve_kegg_record { } - return (%hash, $kegg_group_id); + return (\%hash, $kegg_group_id); } # subroutine to parse KEGG record and put its elements into a hash From 10021ffa5701bf0494550a4ec00f740e522009b8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:08:55 +0100 Subject: [PATCH 040/381] more genes --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index aa31d23..1943d3b 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -187,8 +187,8 @@ sub parseAndUploadKEGGEntry { if ( $returnData{"GENES"} ) { my (@parts) = split(",", $returnData{"GENES"} ); - if ( $#parts > 1000 ) { # TODO: margin - $returnData{"GENES"} = join(",", @parts[0 .. 500] ); + if ( $#parts > 1500 ) { # TODO: margin + $returnData{"GENES"} = join(",", @parts[0 .. 1500] ); print STDERR "** Done\n"; } } From 3b5ecb6584009e6666b5d9a153ab4f56a65ea80f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:15:35 +0100 Subject: [PATCH 041/381] debug --- scripts/load_kegg_KAAS.pl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 1943d3b..d9d6236 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -200,6 +200,8 @@ sub parseAndUploadKEGGEntry { my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); + print STDERR $kegg_group_id, "\n"; + if(!defined $kegg_group_id) { die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); } @@ -288,6 +290,7 @@ sub uploadSingleKEGGId { } my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); + print STDERR "- HERE $kegg_group_id\n"; # small patch for SQLite - the current insert function could not return id of the last inserted record... if (!defined $kegg_group_id) { From 635329fc5165105d20d97a49a64c774c1010ef73 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:23:05 +0100 Subject: [PATCH 042/381] more debug --- scripts/load_kegg_KAAS.pl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index d9d6236..8e45815 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -320,6 +320,10 @@ sub uploadKeggInformation { print STDERR "* Entering $kegg_id\n"; ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); + print STDERR "Prefilled\n"; + print STDERR Dumper( $hash ); + print STDERR Dumper( $kegg_group_id ); + } else { $hash = parse_kegg_record($kegg_id); From 26202ac86c236e07a2d814a1925c6e1b2085e935 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:30:12 +0100 Subject: [PATCH 043/381] fix --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 8e45815..1ef067d 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -526,7 +526,7 @@ sub retrieve_kegg_record { my $kegg_group_id; if ( $#{$results} >= 0 ) { - $kegg_group_id = $results->[0]->{"id"}; + $kegg_group_id = $results->[0]->{"kegg_group_id"}; foreach my $key ( keys %{$results->[0]} ) { my $finalkey = uc($key); From d58c7ebd3b52b9b1821d6d90b43181a3846c2213 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:38:13 +0100 Subject: [PATCH 044/381] skip --- scripts/load_kegg_KAAS.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 1ef067d..2e19930 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -343,7 +343,8 @@ sub uploadKeggInformation { if(!defined $kegg_group_id) { - die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); + print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; + next; # Skip to another entry } my @proteinList = @{$keggData->{$kegg_id}}; From cff840c37024609633b70c78ce90b830c2d341df Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:43:39 +0100 Subject: [PATCH 045/381] less and better debug --- scripts/load_kegg_KAAS.pl | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 2e19930..58d5f07 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -187,20 +187,20 @@ sub parseAndUploadKEGGEntry { if ( $returnData{"GENES"} ) { my (@parts) = split(",", $returnData{"GENES"} ); - if ( $#parts > 1500 ) { # TODO: margin - $returnData{"GENES"} = join(",", @parts[0 .. 1500] ); - print STDERR "** Done\n"; + if ( $#parts > 2000 ) { # TODO: check this margin + $returnData{"GENES"} = join(",", @parts[0 .. 2000] ); + print STDERR "** Too big GENES in $kegg_id\n"; } } if ( $kegg_id ) { - print STDERR "* KEGG_ID: ", $kegg_id, "\n"; - print STDERR Dumper( \%returnData ); + #print STDERR "* KEGG_ID: ", $kegg_id, "\n"; + #print STDERR Dumper( \%returnData ); my $kegg_group_id = &uploadSingleKEGGId( $kegg_id, \%returnData, $dbh, $dbEngine ); - print STDERR $kegg_group_id, "\n"; + #print STDERR $kegg_group_id, "\n"; if(!defined $kegg_group_id) { die("Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"); @@ -290,7 +290,6 @@ sub uploadSingleKEGGId { } my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); - print STDERR "- HERE $kegg_group_id\n"; # small patch for SQLite - the current insert function could not return id of the last inserted record... if (!defined $kegg_group_id) { @@ -317,12 +316,12 @@ sub uploadKeggInformation { my $kegg_group_id; if ( $pre_upload_kegg > 0 ) { - print STDERR "* Entering $kegg_id\n"; + # print STDERR "* Entering $kegg_id\n"; ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); - print STDERR "Prefilled\n"; - print STDERR Dumper( $hash ); - print STDERR Dumper( $kegg_group_id ); + #print STDERR "Prefilled\n"; + #print STDERR Dumper( $hash ); + #print STDERR Dumper( $kegg_group_id ); } else { From eeaef4abe9dd58bb5b63d2bbe5c1eb0e149c571e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:46:35 +0100 Subject: [PATCH 046/381] final clean --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 58d5f07..dcab9aa 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -187,8 +187,8 @@ sub parseAndUploadKEGGEntry { if ( $returnData{"GENES"} ) { my (@parts) = split(",", $returnData{"GENES"} ); - if ( $#parts > 2000 ) { # TODO: check this margin - $returnData{"GENES"} = join(",", @parts[0 .. 2000] ); + if ( $#parts > 1500 ) { # TODO: check this margin + $returnData{"GENES"} = join(",", @parts[0 .. 1500] ); print STDERR "** Too big GENES in $kegg_id\n"; } } From 55348232fbaef3763ae49bced4653eaa21f90817 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 20:54:21 +0100 Subject: [PATCH 047/381] get release --- scripts/load_kegg_KAAS.pl | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index dcab9aa..607c2db 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -75,7 +75,9 @@ =head1 AUTHORS # If null, let's assign 0.0 if ( $kegg_release eq 'null' ) { - $kegg_release = 0.0; + + $kegg_release = &retrieve_kegg_release; + } #read configuration file @@ -147,6 +149,25 @@ =head1 AUTHORS &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); +sub retrieve_kegg_release { + + my $value = 0.0; + + my $url = "http://rest.kegg.jp/info/ko"; + my $response = get $url; + # print $response; + my @lines = split(/\n/,$response); + foreach my $item (@lines) { + chomp($item); + if ( $item =~ /^ko\s+Release\s+(\d+)/ ) { + $value = $1; + } + + } + + return $value; +} + sub parseAndUploadKEGGEntry { my $filestr = shift; my $dbh = shift; From cee7052f4fa5487ae56101cb2d4e83510185f52e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 7 Nov 2020 23:09:57 +0100 Subject: [PATCH 048/381] Update TODO.md --- TODO.md | 1 - 1 file changed, 1 deletion(-) diff --git a/TODO.md b/TODO.md index 6baac19..8df4775 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,5 @@ * Improve documentation of parameters -* Split KEGG retrieval and upload * Include some testing and CI * Add PANNZER in analysis * Add PhylomeDB in analysis From d42df3f198f163f1c394a681bb455ab838150a5e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Nov 2020 16:31:49 +0100 Subject: [PATCH 049/381] cleaning --- pipeline.nf | 1 + scripts/get_gff3.pl | 632 ++++++++++++++++++++++---------------------- 2 files changed, 320 insertions(+), 313 deletions(-) diff --git a/pipeline.nf b/pipeline.nf index 7287419..9fec1c6 100644 --- a/pipeline.nf +++ b/pipeline.nf @@ -910,6 +910,7 @@ process 'generateGFF3File'{ command = checkMySQL( mysql, params.mysqllog ) + // TODO: add case for debug using -list command += " \ get_gff3.pl -conf \$config ; \ " diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index 1944293..e82e4b6 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -16,7 +16,7 @@ =head1 DESCRIPTION Typical usage is as follows: - % perl get_gff3.pl -conf main_configuration.ini + % perl get_gff3.pl -conf main_configuration.ini =head2 Options @@ -24,13 +24,13 @@ =head2 Options Usage: perl get_gff3.pl Options -conf : Configuration file. [Mandatory] - -list : File with selected protein IDs - script will process only those seqences + -list : File with selected protein IDs - script will process only those seqences -help : This documentation -Note: Don't forget to specify mandatory options in the main configuration file : +Note: Don't forget to specify mandatory options in the main configuration file : Database name and path; Result folder name; - + =head1 AUTHORS @@ -38,7 +38,6 @@ =head1 AUTHORS =cut - use strict; use warnings; use FindBin qw($RealBin); @@ -54,22 +53,23 @@ =head1 AUTHORS use Data::Dumper; use Config::Simple; -my ( $show_help,$confFile, $listFile); +my ( $show_help, $confFile, $listFile); -&GetOptions( - 'conf=s'=>\$confFile, - 'list=s'=>\$listFile, - 'help|h' => \$show_help +&GetOptions( + 'conf=s' => \$confFile, + 'list=s' => \$listFile, + 'help|h' => \$show_help ) or pod2usage(-verbose=>2); pod2usage(-verbose=>2) if $show_help; -if(!defined $confFile) -{ die("Please specify configuration file!\nLaunch 'perl get_gff3.pl -h' to see parameters description\n ");} +if (!defined $confFile) { + die("Please specify configuration file!\nLaunch 'perl get_gff3.pl -h' to see parameters description\n "); +} #read configuration file my $cfg = new Config::Simple($confFile); -#put config parameters into %config +#put config parameters into %config my %config = $cfg->vars(); #my %conf = %::conf; @@ -87,23 +87,22 @@ =head1 AUTHORS $year += 1900; my $date = "$year/$mon/$mday $hour:$min:$sec"; -if(($config{'loglevel'} eq 'debug')||($config{'loglevel'} eq 'info')) -{ +if ( ( $config{'loglevel'} eq 'debug' ) || ( $config{'loglevel'} eq 'info' ) ) { print '#' x35 ."\n"; print '#' x5 . 'Generate results in gff format, '.$date.' '.'#' x5 ."\n"; print '#' x35 ."\n"; - + } #connect to mysqlDB -if(!defined $config{'dbEngine'}){$config{'dbEngine'} = 'mysql';} +if ( !defined $config{'dbEngine'} ){ $config{'dbEngine'} = 'mysql'; } my $dbh; #connect to the DB -if(lc( $config{'dbEngine'} ) eq 'mysql') -{ $dbh= FunctionalAnnotation::DB->new('mysql',$config{'dbname'},$config{'dbhost'},$config{'dbuser'},$config{'dbpass'},$config{'dbport'});} -else -{ + +if ( lc( $config{'dbEngine'} ) eq 'mysql' ) { + $dbh= FunctionalAnnotation::DB->new('mysql',$config{'dbname'},$config{'dbhost'},$config{'dbuser'},$config{'dbpass'},$config{'dbport'}); +} else { my $dbName = $config{'resultPath'}.$config{'dbname'}.'.db'; my $dsn = "DBI:SQLite:dbname=$dbName"; $dbh= FunctionalAnnotation::DB->new('sqlite',$dbName); @@ -115,308 +114,315 @@ =head1 AUTHORS my @listIds=(); #create a list with protein ids, if ones is setted up -if(defined $listFile) - { @listIds=&getSelectedIds($listFile); } - - -&createGFF3File($dbh, \@listIds, $outputFile, lc( $config{'dbEngine'} ) ); - -sub createGFF3File -{ - my($dbh, $protIdList, $outFile, $engine)=@_; - - my $numberKeys =scalar @{$protIdList}; - my $condStat=''; - if($numberKeys>0) - { - foreach my $item(@{$protIdList}) - {$item = "'$item'";} - my $idString = join(',', @{$protIdList}); - $condStat = "where stable_id in ($idString)"; - } - -my $selectString ="select distinct protein_id from protein $condStat"; -my $results =$dbh->select_from_table($selectString); -my @protIds=(); - foreach my $result (@{$results}) - { - push(@protIds, $result->{'protein_id'}); - } - -#each gff3 record should contain unique ID field. - -my $idInterPro=0; -my $idCDSearchHit=0; -my $idCDSearchFeat=0; - -open(OUTFILE, ">$outFile")||die ("Can't open $outFile for writing! $!\n"); -print OUTFILE "##gff-version 3\n"; - -foreach my $idItem(@protIds) - { - - my $descrField=''; - - if( $engine eq 'mysql') { - $selectString = "select p.stable_id, group_concat( d.definition SEPARATOR \"@@\" ) as definition, p.cds_strand, p.cds_start, p.cds_end, length(p.sequence) as length, p.gene_id, p.seq_id from protein p left outer join definition d on p.protein_id=d.protein_id where p.protein_id = $idItem group by p.protein_id"; - } else { - $selectString = "select p.stable_id, group_concat( d.definition, \"@@\" ) as definition, p.cds_strand, p.cds_start, p.cds_end, length(p.sequence) as length, p.gene_id, p.seq_id from protein p left outer join definition d on p.protein_id=d.protein_id where p.protein_id = $idItem group by p.protein_id"; - } - - $results =$dbh->select_from_table($selectString); - #print STDERR Dumper($results); - my $definition= $results->[0]->{'definition'}||''; - my $protName =$results->[0]->{'stable_id'}; - my $strand = $results->[0]->{'cds_strand'}||'+'; - my $stop = $results->[0]->{'length'}||'.'; #Undefined according to spec - my $start =1; - if ( $stop eq '.' ) { - $start = '.'; - } - my $genomicStart = $results->[0]->{'cds_start'}; - my $genomicEnd = $results->[0]->{'cds_end'}; - my $genomicLocation = $results->[0]->{'seq_id'}; - my $gene_id = $results->[0]->{'gene_id'}||'0'; #default for 0, no gene - - #select gene data - $selectString = "select distinct gene_name from gene where gene_id=$gene_id"; - $results =$dbh->select_from_table($selectString); - my $geneName =$results->[0]->{'gene_name'}||''; - - #blast2go - if($definition ne '') - { - my (@defparts) = split(/@@/, $definition); - my @descfields; - foreach my $def ( @defparts ) { - $def = escapeGFF( $def ); - push( @descfields, $def ); - } - $descrField .="Definition=".join( ",", @descfields).";"; - } - - #Xref record - $selectString = "select distinct dbid,dbname from xref where protein_id=$idItem"; - #print STDERR "D:".$selectString, "\n"; - $results =$dbh->select_from_table($selectString); - my @xrefId=(); - foreach my $item(@{$results}) - { push(@xrefId , "$item->{'dbname'}.id=$item->{'dbid'}");} - - if(scalar @xrefId >0) - { - my $xrefList = join(',', @xrefId); - $descrField .= $xrefList.';'; - } - -#ontology - my @ontologyData=(); - #The intersection of this table is too big, since protein_go is huge. Thus I decided to make a two select, and then join results. - $selectString = "select distinct go_term_id, source from protein_go where protein_id=$idItem"; - #print STDERR "G:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); -#one protein could have more then one go_term_id - my @goTermId=(); - my @goSource=(); - foreach my $item(@{$results}) - { - push(@goTermId , $item->{'go_term_id'}); - push(@goSource , $item->{'source'}); - } - - if(scalar @goTermId >0) - { - my $goTermIdString = join(',',@goTermId); - $selectString = "select go_acc from go_term where go_term_id in ($goTermIdString)"; - $results =$dbh->select_from_table($selectString); - foreach my $item(@{$results}) - {push(@ontologyData, $item->{'go_acc'});} - my $ontologyList = join(',', @ontologyData); - if($ontologyList ne '') - { - $descrField .= "Ontology_term=$ontologyList;"; - - my @usources = do { my %seen; grep { !$seen{ trim($_ ) }++ } @goSource }; - - my $usourcestr = join(',',@usources); - - if ($usourcestr ne ''){ - - # TODO: To consider better way to keep this - $descrField .= "Ontology_source=$usourcestr;"; - - } - - } - } - -#KEGG KO groups -#The same thing here - protein_ortholog is quite big, so I will select kegg_groups first and then do select information about them. - $selectString ="select distinct kegg_group_id from protein_ortholog where protein_id=$idItem"; - #print STDERR "G:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - my @keggGroupId=(); - foreach my $item(@{$results}) - { push(@keggGroupId , $item->{'kegg_group_id'});} - if(scalar @keggGroupId >0) - { - my $keggGroupString = join(',',@keggGroupId); - $selectString = "select db_id, definition, pathway from kegg_group where kegg_group_id in ($keggGroupString)"; - $results =$dbh->select_from_table($selectString); - my $koGroup = $results->[0]->{'db_id'}; - my $koDefinition = $results->[0]->{'definition'}; - my $koPathway = $results->[0]->{'pathway'}; - if((defined $koGroup) && ($koGroup ne '')) - {$descrField .= "ko_group=$koGroup;ko_definition=".escapeGFF($koDefinition).";ko_pathway=$koPathway;";} - } - - print OUTFILE "##sequence-region $protName $start $stop\n"; - - if($geneName ne '') - {print OUTFILE "$genomicLocation\t.\tgene\t$genomicStart\t$genomicEnd\t.\t$strand\t.\tID=$geneName;\n";} - ####### update 29/06/2017 - ### in the protein-based coordinates it should be plus strand, if other not specified. - $strand='+'; - -#updt 29/06/2017 added Parent field - - print OUTFILE "$protName\t.\tpolypeptide\t$start\t$stop\t.\t$strand\t.\tID=$protName;Parent=$geneName;$descrField\n"; - -#blast hits - #$selectString = "select hit_id, start, end, score, evalue, description from blast_hit where protein_id=$idItem"; - #$results =$dbh->select_from_table($selectString); - #foreach my $result (@{$results}) - #{ - # my $blastStart = $result->{'start'}; - # my $blastEnd = $result->{'end'}; - # my $blastScore = $result->{'score'}; - # my $blastEvalue = $result->{'evalue'}; - # my $hitId = $result->{'hit_id'}; - # my $descr = $result->{'description'}; - #my ($definition, $organism); - # ($definition, $organism)=$descr=~/^(.+?)\[(.+?)\]/; - # if(!defined $definition) - # { - # $definition = $descr; - # #($definition)=$descr=~/^(.+?)\>/; - # $organism="all"; - # } - # $definition =~s/[][><=:;|.]/ /g; - # print OUTFILE "$protName\tNR\tBLAST_match\t$start\t$stop\t$blastEvalue\t$strand\t.\tName=Match;Target=$hitId $blastStart $blastEnd;score=$blastScore;Note=$definition;organism=$organism;\n"; - #} -#domains - $selectString = "SELECT domain_name, rel_start, rel_end, db_xref, score, evalue,description,ip_desc, ip_id FROM domain where protein_id=$idItem order by db_xref"; - #print STDERR "D:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - foreach my $result (@{$results}) - { - my $dbName = $result->{'db_xref'}; - my $domainStart =$result->{'rel_start'}; - my $domainEnd = $result->{'rel_end'}; - my $evalue = $result->{'evalue'}||'.'; # Default for evalue - if($evalue ne '.' and $evalue ne '-') - {$evalue = sprintf("%.1e", $evalue);} - my $ipID =$result->{'ip_id'}; - my $domainName =$result->{'domain_name'}; - my $descfield = $result->{'description'}||''; - my $ipdesc = $result->{'ip_desc'}||''; - - my @descarr; - if ( $descfield && $descfield ne '' ) { - push( @descarr, escapeGFF( $descfield ) ); - } - if ( $ipdesc && $ipdesc ne '' ) { - push( @descarr, escapeGFF( $ipdesc ) ); - } - - my $description = join( ",", @descarr ); - - #updt 29/06/2017 -added ID and Parent records - - $idInterPro++; - - print OUTFILE "$protName\t$dbName\tprotein_match\t$domainStart\t$domainEnd\t$evalue\t$strand\t.\tName=$domainName;ID=InterProScan$idInterPro;"; - if( $ipID && $ipID ne '' ) { - print OUTFILE "interpro_id=$ipID;"; - } - if($description && $description ne '') - {print OUTFILE "interpro_note=$description;\n"; } - else - {print OUTFILE "\n"; } +if ( defined $listFile ) { + @listIds = &getSelectedIds($listFile); +} - } - #NCBI conserved domains (CD) search results - hits and features - #hits - $selectString = "SELECT accession, Superfamily,Hit_type, PSSM_ID, coordinateFrom, coordinateTo, E_Value, Bitscore, Short_name, Incomplete FROM cd_search_hit where protein_id=$idItem order by coordinateFrom"; - #print STDERR "C:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - foreach my $result (@{$results}) - { - my $access = $result->{'accession'}; - my $superfamily =$result->{'Superfamily'}; - my $CDEnd = $result->{'coordinateTo'}; - my $CDStart = $result->{'coordinateFrom'}; - #my $evalue = sprintf("%.1e", $result->{'E_Value'}); - my $evalue = $result->{'E_Value'}; - my $CDType =$result->{'Hit_type'}; - my $PSS =$result->{'PSSM_ID'}; - my $shortName =$result->{'Short_name'}; - my $Incomplete =$result->{'Incomplete'}; - - #updt 29/06/17 added ID record and remove \" characters from fields - $idCDSearchHit++; - $CDStart=~s/\"//gi; - $CDEnd=~s/\"//gi; - $evalue=~s/\"//gi; - - print OUTFILE "$protName\tCDsearch\tdomain_match\t$CDStart\t$CDEnd\t$evalue\t.\t.\tID=CDSearchHit$idCDSearchHit;Accession=$access;Superfamily=$superfamily;Short_name=$shortName;PSSM_ID=$PSS;Hit_type=$CDType;\n"; - } - #features - $selectString = "SELECT title, Type, coordinates,source_domain FROM cd_search_features where protein_id=$idItem"; - #print STDERR "F:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - foreach my $result (@{$results}) - { - - my $title = $result->{'title'}; - my $coordinates =$result->{'coordinates'}; - my $Type = $result->{'Type'}; - my $sourceDomain = $result->{'source_domain'}; - -#updt 29/06/17 added ID record - - $idCDSearchFeat++; - print OUTFILE "$protName\tCDsearch\tfeature_match\t$start\t$stop\t.\t+\t.\tID=CDSeachFeat$idCDSearchFeat;Title=$title;Type=$Type;Coordinates=$coordinates;Source_domain=$sourceDomain;\n"; - +&createGFF3File( $dbh, \@listIds, $outputFile, lc( $config{'dbEngine'} ) ); + +sub createGFF3File { + + my($dbh, $protIdList, $outFile, $engine)=@_; + + my $numberKeys = scalar @{$protIdList}; + my $condStat=''; + + if( $numberKeys>0 ) { + + foreach my $item(@{$protIdList}) { + $item = "'$item'"; + } + + my $idString = join(',', @{$protIdList}); + $condStat = "where stable_id in ($idString)"; } - #signalP, chloroP features - my @list=('signalP','chloroP'); - foreach my $lItem(@list) - { - $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; - #print STDERR "F:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - foreach my $result (@{$results}) - { - my $end =$result->{'end'}; - my $score = $result->{'score'}; - $end=~s/\"//gi; - $start=~s/\"//gi; - - print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=SignalP_$protName;match=YES;\n"; + my $selectString ="select distinct protein_id from protein $condStat"; + my $results =$dbh->select_from_table($selectString); + my @protIds=(); + foreach my $result (@{$results}) { + push(@protIds, $result->{'protein_id'}); } - } #signalP,chloroP - } #foreach protein item -close(OUTFILE); + #each gff3 record should contain unique ID field. + + my $idInterPro=0; + my $idCDSearchHit=0; + my $idCDSearchFeat=0; + + open( OUTFILE, ">$outFile")||die ("Can't open $outFile for writing! $!\n" ); + print OUTFILE "##gff-version 3\n"; + + foreach my $idItem (@protIds) { + + my $descrField=''; + + if( $engine eq 'mysql') { + $selectString = "select p.stable_id, group_concat( d.definition SEPARATOR \"@@\" ) as definition, p.cds_strand, p.cds_start, p.cds_end, length(p.sequence) as length, p.gene_id, p.seq_id from protein p left outer join definition d on p.protein_id=d.protein_id where p.protein_id = $idItem group by p.protein_id"; + } else { + $selectString = "select p.stable_id, group_concat( d.definition, \"@@\" ) as definition, p.cds_strand, p.cds_start, p.cds_end, length(p.sequence) as length, p.gene_id, p.seq_id from protein p left outer join definition d on p.protein_id=d.protein_id where p.protein_id = $idItem group by p.protein_id"; + } + + $results =$dbh->select_from_table($selectString); + #print STDERR Dumper($results); + my $definition= $results->[0]->{'definition'}||''; + my $protName =$results->[0]->{'stable_id'}; + my $strand = $results->[0]->{'cds_strand'}||'+'; + my $stop = $results->[0]->{'length'}||'.'; #Undefined according to spec + my $start =1; + + if ( $stop eq '.' ) { + $start = '.'; + } + + my $genomicStart = $results->[0]->{'cds_start'}; + my $genomicEnd = $results->[0]->{'cds_end'}; + my $genomicLocation = $results->[0]->{'seq_id'}; + my $gene_id = $results->[0]->{'gene_id'}||'0'; #default for 0, no gene + + #select gene data + $selectString = "select distinct gene_name from gene where gene_id=$gene_id"; + $results =$dbh->select_from_table($selectString); + my $geneName =$results->[0]->{'gene_name'}||''; + + #blast2go + if($definition ne ''){ + my (@defparts) = split(/@@/, $definition); + my @descfields; + foreach my $def ( @defparts ) { + $def = escapeGFF( $def ); + push( @descfields, $def ); + } + $descrField .="Definition=".join( ",", @descfields).";"; + } + + #Xref record + $selectString = "select distinct dbid,dbname from xref where protein_id=$idItem"; + #print STDERR "D:".$selectString, "\n"; + $results =$dbh->select_from_table($selectString); + my @xrefId=(); + + foreach my $item(@{$results}) { + push(@xrefId , "$item->{'dbname'}.id=$item->{'dbid'}");} + + if(scalar @xrefId >0){ + my $xrefList = join(',', @xrefId); + $descrField .= $xrefList.';'; + } + + #ontology + my @ontologyData=(); + #The intersection of this table is too big, since protein_go is huge. Thus I decided to make a two select, and then join results. + $selectString = "select distinct go_term_id, source from protein_go where protein_id=$idItem"; + #print STDERR "G:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + #one protein could have more then one go_term_id + my @goTermId=(); + my @goSource=(); + + foreach my $item(@{$results}) { + push(@goTermId , $item->{'go_term_id'}); + push(@goSource , $item->{'source'}); + } + + if (scalar @goTermId >0) { + my $goTermIdString = join(',',@goTermId); + $selectString = "select go_acc from go_term where go_term_id in ($goTermIdString)"; + $results =$dbh->select_from_table($selectString); + foreach my $item(@{$results}) { + push(@ontologyData, $item->{'go_acc'});} + my $ontologyList = join(',', @ontologyData); + + if($ontologyList ne ''){ + + $descrField .= "Ontology_term=$ontologyList;"; + my @usources = do { my %seen; grep { !$seen{ trim($_ ) }++ } @goSource }; + my $usourcestr = join(',',@usources); + + if ($usourcestr ne ''){ + # TODO: To consider better way to keep this + $descrField .= "Ontology_source=$usourcestr;"; + } + + } + } + + #KEGG KO groups + #The same thing here - protein_ortholog is quite big, so I will select kegg_groups first and then do select information about them. + $selectString ="select distinct kegg_group_id from protein_ortholog where protein_id=$idItem"; + #print STDERR "G:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + my @keggGroupId=(); + foreach my $item(@{$results}) + { push(@keggGroupId , $item->{'kegg_group_id'});} + if(scalar @keggGroupId >0) { + my $keggGroupString = join(',',@keggGroupId); + $selectString = "select db_id, definition, pathway from kegg_group where kegg_group_id in ($keggGroupString)"; + $results =$dbh->select_from_table($selectString); + my $koGroup = $results->[0]->{'db_id'}; + my $koDefinition = $results->[0]->{'definition'}; + my $koPathway = $results->[0]->{'pathway'}; + if((defined $koGroup) && ($koGroup ne '')) + {$descrField .= "ko_group=$koGroup;ko_definition=".escapeGFF($koDefinition).";ko_pathway=$koPathway;";} + } + + if ( $protName && $protName ne '' ) { + print OUTFILE "##sequence-region $protName $start $stop\n"; + } + + if( $geneName ne '' ) { + print OUTFILE "$genomicLocation\t.\tgene\t$genomicStart\t$genomicEnd\t.\t$strand\t.\tID=$geneName;\n"; + } + ####### update 29/06/2017 + ### in the protein-based coordinates it should be plus strand, if other not specified. + $strand='+'; + + #updt 29/06/2017 added Parent field + + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\t.\tpolypeptide\t$start\t$stop\t.\t$strand\t.\tID=$protName;Parent=$geneName;$descrField\n"; + } + + #blast hits TO CONSIDER + #$selectString = "select hit_id, start, end, score, evalue, description from blast_hit where protein_id=$idItem"; + #$results =$dbh->select_from_table($selectString); + #foreach my $result (@{$results}) + #{ + # my $blastStart = $result->{'start'}; + # my $blastEnd = $result->{'end'}; + # my $blastScore = $result->{'score'}; + # my $blastEvalue = $result->{'evalue'}; + # my $hitId = $result->{'hit_id'}; + # my $descr = $result->{'description'}; + #my ($definition, $organism); + # ($definition, $organism)=$descr=~/^(.+?)\[(.+?)\]/; + # if(!defined $definition) + # { + # $definition = $descr; + # #($definition)=$descr=~/^(.+?)\>/; + # $organism="all"; + # } + # $definition =~s/[][><=:;|.]/ /g; + # print OUTFILE "$protName\tNR\tBLAST_match\t$start\t$stop\t$blastEvalue\t$strand\t.\tName=Match;Target=$hitId $blastStart $blastEnd;score=$blastScore;Note=$definition;organism=$organism;\n"; + #} + #domains + $selectString = "SELECT domain_name, rel_start, rel_end, db_xref, score, evalue,description,ip_desc, ip_id FROM domain where protein_id=$idItem order by db_xref"; + #print STDERR "D:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + foreach my $result (@{$results}) { + my $dbName = $result->{'db_xref'}; + my $domainStart =$result->{'rel_start'}; + my $domainEnd = $result->{'rel_end'}; + my $evalue = $result->{'evalue'}||'.'; # Default for evalue + if($evalue ne '.' and $evalue ne '-') { + $evalue = sprintf("%.1e", $evalue); + } + my $ipID =$result->{'ip_id'}; + my $domainName =$result->{'domain_name'}; + my $descfield = $result->{'description'}||''; + my $ipdesc = $result->{'ip_desc'}||''; + + my @descarr; + if ( $descfield && $descfield ne '' ) { + push( @descarr, escapeGFF( $descfield ) ); + } + if ( $ipdesc && $ipdesc ne '' ) { + push( @descarr, escapeGFF( $ipdesc ) ); + } + + my $description = join( ",", @descarr ); + + #updt 29/06/2017 -added ID and Parent records + + $idInterPro++; + + if ( $protName && $protName ne '' ) { + + print OUTFILE "$protName\t$dbName\tprotein_match\t$domainStart\t$domainEnd\t$evalue\t$strand\t.\tName=$domainName;ID=InterProScan$idInterPro;"; + if( $ipID && $ipID ne '' ) { + print OUTFILE "interpro_id=$ipID;"; + } + if($description && $description ne '') { + print OUTFILE "interpro_note=$description;\n"; + } else { + print OUTFILE "\n"; + } + } + + } + #NCBI conserved domains (CD) search results - hits and features + #hits + $selectString = "SELECT accession, Superfamily,Hit_type, PSSM_ID, coordinateFrom, coordinateTo, E_Value, Bitscore, Short_name, Incomplete FROM cd_search_hit where protein_id=$idItem order by coordinateFrom"; + #print STDERR "C:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + foreach my $result (@{$results}) { + my $access = $result->{'accession'}; + my $superfamily =$result->{'Superfamily'}; + my $CDEnd = $result->{'coordinateTo'}; + my $CDStart = $result->{'coordinateFrom'}; + #my $evalue = sprintf("%.1e", $result->{'E_Value'}); + my $evalue = $result->{'E_Value'}; + my $CDType =$result->{'Hit_type'}; + my $PSS =$result->{'PSSM_ID'}; + my $shortName =$result->{'Short_name'}; + my $Incomplete =$result->{'Incomplete'}; + + #updt 29/06/17 added ID record and remove \" characters from fields + $idCDSearchHit++; + $CDStart=~s/\"//gi; + $CDEnd=~s/\"//gi; + $evalue=~s/\"//gi; + + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\tCDsearch\tdomain_match\t$CDStart\t$CDEnd\t$evalue\t.\t.\tID=CDSearchHit$idCDSearchHit;Accession=$access;Superfamily=$superfamily;Short_name=$shortName;PSSM_ID=$PSS;Hit_type=$CDType;\n"; + } + } + #features + $selectString = "SELECT title, Type, coordinates,source_domain FROM cd_search_features where protein_id=$idItem"; + #print STDERR "F:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + foreach my $result (@{$results}) { + + my $title = $result->{'title'}; + my $coordinates =$result->{'coordinates'}; + my $Type = $result->{'Type'}; + my $sourceDomain = $result->{'source_domain'}; + + #updt 29/06/17 added ID record + + $idCDSearchFeat++; + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\tCDsearch\tfeature_match\t$start\t$stop\t.\t+\t.\tID=CDSeachFeat$idCDSearchFeat;Title=$title;Type=$Type;Coordinates=$coordinates;Source_domain=$sourceDomain;\n"; + } + } + + #signalP, chloroP features + my @list=('signalP','chloroP'); + foreach my $lItem(@list) { + $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; + #print STDERR "F:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + foreach my $result (@{$results}) { + my $end =$result->{'end'}; + my $score = $result->{'score'}; + $end=~s/\"//gi; + $start=~s/\"//gi; + + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=SignalP_$protName;match=YES;\n"; + } + } + } #signalP,chloroP + + } #foreach protein item + close(OUTFILE); } sub escapeGFF { # Ref: https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md - + my $string = shift; - + $string=~s/\;/%3B/g; $string=~s/\=/%3D/g; $string=~s/\&/%26/g; From 881674cf4e402df1a266e8ce2a798ee91f28181d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 3 Dec 2020 18:17:47 +0100 Subject: [PATCH 050/381] add more flexibility in wrapper --- TODO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 8df4775..6324655 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,4 @@ - +* Add Nextflow parameters tweaking in wrapper * Improve documentation of parameters * Include some testing and CI * Add PANNZER in analysis From a45c4fa93cd5bf2a752f690203fd855aa88b2f12 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 4 Dec 2020 11:04:46 +0100 Subject: [PATCH 051/381] additiona params --- README.md | 16 ++++---- run_pipeline_mysql.pl | 96 ++++++++++++++++++++++--------------------- 2 files changed, 59 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 83d3977..e708910 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,12 @@ The software used in this pipeline is free software for academic users. For the The pipeline is build on Nextflow as a woking engine, so it need to be installed first ``` - wget -qO- get.nextflow.io | bash + wget -qO- get.nextflow.io | bash ``` The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) ### KEGG orthology groups -Predictions of the KEGG orthology groups (KO) should be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/). +Predictions of the KEGG orthology groups (KO) should be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/). Note: for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three lellters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. @@ -37,7 +37,7 @@ Result files, including main annotation file in gff format and annotation report The annotation step can be launched by using the following command: ``` -./nextflow run -bg pipeline.nf --config configuration_file.config &> logfile +./nextflow run -bg pipeline.nf --config configuration_file.config &> logfile ``` ![Pipeline flow chart](./flowchart.png "Pipeline flow chart") @@ -66,7 +66,7 @@ More information can be found in the [Nextflow documentation](https://www.nextfl * **CDSearch_hit_upload**: : it uploads NCBI CDSearch Hit analyses into the DB * **CDSearch_feat_upload**: it uploads NCBI CDSearch Feature analyses into the DB * **blast_annotator_upload**: it uploads GO terms from BLAST hits into the DB -* **kegg_upload**: it retrieves and uploads KEGG data into the DB +* **kegg_upload**: it retrieves and uploads KEGG data into the DB * **generateResultFiles**: it generates report files * **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information @@ -100,10 +100,14 @@ As written down in ```nextflow.config``` file, whenever possible, we try to prov ## Running in MySQL mode -We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local. +We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local. nohup perl run_pipeline_mysql.pl -conf ./main_configuration.config &> log.mysql & +It is also possible to pass additional Nextflow parameters + + nohup perl run_pipeline_mysql.pl -params "-with-dag -with-report -with-timeline" -conf ./main_configuration.config &> log.mysql & + ## Running only MySQL @@ -115,5 +119,3 @@ This is convenient for checking results database once analyses are finished. NO for further options or details, run: perl run_pipeline_mysql.pl -h - - diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index 1f514e5..06a9f30 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -13,6 +13,7 @@ my ($confFile,$show_help); my $nextflow = "nextflow"; +my $nfparams = ""; # By default no additional params my $resume = 0; my $mysqlonly = 0; @@ -33,6 +34,7 @@ "conf=s"=>\$confFile, "help|h" => \$show_help, "nextflow=s" => \$nextflow, + "params=s" => \$nfparams, "extra=s" => \$extra, "resume|r" => \$resume, "mysqlonly|m" => \$mysqlonly, @@ -40,23 +42,25 @@ ); my $resumeStr = ""; + if ( $resume ) { $resumeStr = "-resume"; } -if( !defined $confFile || $show_help) -{ -die(qq/ - Usage: run_pipeline_mysql.pl [options] - Options - -h || help : This message - -conf : Configuration file; by default 'main_configuration.ini' in the current folder - -nextflow : Nextflow path - -extra : Extra parameters to be passed to the cluster queue - -resume : Resume the pipeline (it passes -resume argument to nextflow) - -mysqlonly : Lauch only MySQL server (as far as running in MySQL mode) - -engine : Engine to be used (so far 'sge' by default, otherwise local) -\n/)}; +if( !defined $confFile || $show_help ) { + die(qq/ + Usage: run_pipeline_mysql.pl [options] + Options + -h || help : This message + -conf : Configuration file; by default 'main_configuration.ini' in the current folder + -nextflow : Nextflow path + -params : Parameters for Nextflow program + -extra : Extra parameters to be passed to the cluster queue + -resume : Resume the pipeline (it passes -resume argument to nextflow) + -mysqlonly : Lauch only MySQL server (as far as running in MySQL mode) + -engine : Engine to be used (so far 'sge' by default, otherwise local) + \n/); +} my $tmpconf = tmpnam(); @@ -66,26 +70,26 @@ open( CONF, $confFile ); while ( ) { - + if ( $_=~/\$\{baseDir\}/ ) { s/\$\{baseDir\}/$pwd/g; } - + if ( $_=~/\$baseDir/ ) { - + s/\$baseDir/$pwd/g; } - + if ($_=~/^\s*params\s*{\s*$/) { next; } - + if ($_=~/^\s*}\s*$/) { next; - } - + } + $_=~s/\s*\=\s*/:/g; - + $strFile = $strFile. $_; } @@ -97,41 +101,41 @@ # Parsing params.config (the same place as nexflow for sake of simplicity) my $cfg = new Config::Simple($tmpconf); -#put config parameters into %config +#put config parameters into %config my %config = $cfg->vars(); print Dumper( \%config ); # If MySQL mode if ( lc( $config{"dbEngine"} ) eq 'mysql' ) { - + # Check all MySQL params are there - + if ( $config{"dbuser"} && $config{"dbpass"} && $config{"dbport"} && $config{"mysqlimg"} ) { - - + + if ( $config{"mysqllog"} ) { $mysqllog = $config{"mysqllog"}; } - + if ( $config{"mysqldata"} ) { $mysqldata = $config{"mysqldata"}; - } - + } + if ( ! -d $mysqldata ) { make_path( $mysqldata ); } if ( ! -d $mysqllog ) { make_path( $mysqllog ); } - + # Avoid show IP of previous process if ( -f "$mysqllog/DBHOST" ) { unlink "$mysqllog/DBHOST"; } - + # Generate files # Mysqlconf my $cnfcontent = "[mysqld]\nbind-address=0.0.0.0\nport=".$config{"dbport"}."\n"; open( CNF, ">$mysqllog/CNF" ); print CNF $cnfcontent; close( CNF ); - + $extra = $extra. " -e $mysqllog/ERR -o $mysqllog/OUT "; - + if ( $engine eq 'sge' ) { $extra = "qsub ". $extra; } elsif ( $engine eq 'local' ) { @@ -139,38 +143,38 @@ } else { die( "Not supported engine!" ); } - + # Run MySQL qsub process. TODO: Allow more flexibility here system( "$extra run.mysql.qsub.sh ".$config{"mysqlimg"}." $mysqldata $mysqllog/CNF $mysqllog/DBHOST $mysqllog/PROCESS ".$config{"dbuser"}." ".$config{"dbpass"}." ".$config{"dbport"}. " ". $random ." & " ); - + # Run nextflow # TODO: To reconsider way of checking while ( ! -d "$mysqldata/db" ) { sleep( 5 ); } - + if ( ! $mysqlonly ) { - + while ( ! -f "$mysqllog/PROCESS" ) { sleep( 5 ); } - + my $myip=`cat "$mysqllog/DBHOST"`; print "DBHOST: ".$myip."\n"; - print( "Run NEXTFLOW\n") ; - system( "$nextflow run -bg pipeline.nf $resumeStr --config $confFile" ); + print( "Run NEXTFLOW\n") ; + system( "$nextflow run $nfparams -bg pipeline.nf $resumeStr --config $confFile" ); } else { - + while ( ! -f "$mysqllog/DBHOST" ) { sleep( 5 ); } - + my $myip=`cat "$mysqllog/DBHOST"`; print "DBHOST: ".$myip."\n"; - + } } else { - + exit 1; } @@ -178,7 +182,7 @@ # Else, SQLite mode # Run Nextflow pipeline - print( "Run NEXTFLOW\n") ; - system( "$nextflow run -bg pipeline.nf $resumeStr --config $confFile" ); + print( "Run NEXTFLOW\n") ; + system( "$nextflow run $nfparams -bg pipeline.nf $resumeStr --config $confFile" ); } From 4b7adf588dfe7286f0c5ebd7ed0fa86e714209a0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 4 Dec 2020 11:19:56 +0100 Subject: [PATCH 052/381] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e708910..ef4ad65 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ More information can be found in the [Nextflow documentation](https://www.nextfl * **generateResultFiles**: it generates report files * **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information -### Formatted databases +### Formatted databases * For BLAST: ```blastDbPath = "/path/to/db"``` It looks for formatted database files (normally named db.p* for protein type based ones), otherwise it will try to format FASTA file with that name * For DIAMOND: ```blastDbPath = "/path/to/db"``` It looks for a single formatted database file (normally named db.dmnd), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) @@ -79,7 +79,7 @@ More information can be found in the [Nextflow documentation](https://www.nextfl Retrieval of GO terms from BLAST results can be performed either from [BLAST2GO](https://www.blast2go.com/) results or from other methods as far as a BLAST2GO-compatible output format is provided. -As a example, in our case we are using a [web API](https://github.com/toniher/gogoAPI) providing this information from [UniProt GOA](https://www.ebi.ac.uk/GOA) database imported into a MySQL and [Neo4j](https://github.com/toniher/neo4j-biorelation). +As an example, in our case we are using a [web API](https://github.com/toniher/gogoAPI) providing this information from [UniProt GOA](https://www.ebi.ac.uk/GOA) database imported into a MySQL and [Neo4j](https://github.com/toniher/neo4j-biorelation). ## Associated containers From d7179978eab3ac168ea26a56e73fe8f44d8c0429 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 4 Dec 2020 11:21:23 +0100 Subject: [PATCH 053/381] Update TODO.md --- TODO.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TODO.md b/TODO.md index 6324655..d7ffebf 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,6 @@ -* Add Nextflow parameters tweaking in wrapper +* Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Improve documentation of parameters * Include some testing and CI -* Add PANNZER in analysis -* Add PhylomeDB in analysis * Visualization of results * Venn Diagrams @@ -13,5 +11,7 @@ * blast_hit reconsider * Allow more flexibility for input parameters batch * Generalize and consider other programs for BLAST process or similar annotation processes: e.g. [GHOSTZ](http://www.bi.cs.titech.ac.jp/ghostz/) and [Argot2.5](http://www.medcomp.medicina.unipd.it/Argot2-5/) -* Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Migrate to DSL2 +* Add PhylomeDB in analysis +* Add PANNZER in analysis + From 0cd04261ca59f7e946d082ee4b69bf7e3c7dd4e9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 21 Dec 2020 19:13:30 +0100 Subject: [PATCH 054/381] updating sif --- nextflow.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index b32def4..dc21529 100644 --- a/nextflow.config +++ b/nextflow.config @@ -43,7 +43,7 @@ process{ withLabel: sigtarp { queue='short-sl7' - container="/software/bi/biocore_tools/git/singularity/sigtarp-dev.simg" + container="/software/bi/biocore_tools/git/singularity/sigtarp.sif" } withLabel: cdSearch { @@ -56,7 +56,7 @@ process{ queue='biocore-el7,long-sl7' time='48h' cpus='8' - container="/software/bi/biocore_tools/git/singularity/iprscan-5.39.77.sif" + container="/software/bi/biocore_tools/git/singularity/iprscan/iprscan-5.48-83.0.sif" maxRetries=3 } From 31b7df3d64450ebb419e4dd364d727627fede869 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 5 Feb 2021 16:23:28 +0100 Subject: [PATCH 055/381] adding in TODO --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index d7ffebf..a0fb562 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,4 @@ +* Check kegg_upload slow process * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Improve documentation of parameters * Include some testing and CI From 8fc9cce06d13b9ca7e7791fe16d80756d64b5ff9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 11:19:20 +0100 Subject: [PATCH 056/381] rename to more normal NF names --- main_configuration.config | 37 -- nextflow.config | 2 +- pipeline.nf | 988 -------------------------------------- run_pipeline_mysql.pl | 4 +- 4 files changed, 3 insertions(+), 1028 deletions(-) delete mode 100644 main_configuration.config delete mode 100644 pipeline.nf diff --git a/main_configuration.config b/main_configuration.config deleted file mode 100644 index e849ed3..0000000 --- a/main_configuration.config +++ /dev/null @@ -1,37 +0,0 @@ -params { - proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" - gffFile = "${baseDir}/dataset/P.vulgaris.gff3" - gffclean = "true" - gffstats = "true" - evalue = "0.00001" - blastFile = "" - diamond = "false" - blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" - blastAnnotMode = "common" - speciesName = "P.vulgaris" - chunkSize = 25 - chunkBlastSize = 50 - chunkIPSSize = 25 - chunkKoalaSize = 50 - chunkWebSize = 100 - dbEngine = "MySQL" - dbname = "Pvulgaris" - oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" - resultPath = "${baseDir}/results/" - stdoutLog = "${baseDir}/logs/functional_annotation.stdout" - stderrLog = "${baseDir}/logs/functional_annotation.stderr" - evalue = 0.0001 - kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" - kolist = "/nfs/db/kegg/ko_list" - koprofiles = "/nfs/db/kegg/profiles" - gogourl = "http://gogo.test.crg.eu/api" - ipscantmp = "${baseDir}/tmp/" - dbuser = "test" - dbpass = "test" - dbport = 12345 - mysqldata = "${baseDir}/mysql/" - mysqllog = "${baseDir}/tmp" - mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" - loglevel = "info" - debug = "true" -} diff --git a/nextflow.config b/nextflow.config index dc21529..65bff52 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,5 +1,5 @@ manifest { - mainScript = 'pipeline.nf' + mainScript = 'main.nf' description = 'Pipeline for FA analysis' } diff --git a/pipeline.nf b/pipeline.nf deleted file mode 100644 index 9fec1c6..0000000 --- a/pipeline.nf +++ /dev/null @@ -1,988 +0,0 @@ -#!/usr/bin/env nextflow - -/* - * Copyright (c) 2017-2020, Centre for Genomic Regulation (CRG) - * - * Copyright (c) 2017, Anna Vlasova - * - * Copyright (c) 2017, Emilio Palumbo - * - * Copyright (c) 2018-2020, Toni Hermoso Pulido - * - * Functional Annotation Pipeline for protein annotation from non-model organisms - * from Genome Annotation Team in Catalonia (GATC) implemented in Nextflow - * - * 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 3 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, see . - */ - - -// there can be three log levels: off (no messages), info (some main messages), debug (all messages + sql queries) - - -// default parameters -params.help = false -params.debug="false" -params.chunkIPSSize = null -params.chunkBlastSize = null -params.chunkKoalaSize = null -params.chunkWebSize = null -params.evalue = null -params.dbEngine = "mysql" -params.gffclean = false -params.gffstats = false -params.diamond = null - -//print usage -if ( params.help ) { - log.info '' - log.info 'Functional annotation pipeline' - log.info '----------------------------------------------------' - log.info 'Run functional annotation for a given specie.' - log.info '' - log.info 'Usage: ' - log.info " ./nextflow run pipeline.nf --config main_configuration.config [options]" - log.info '' - log.info 'Options:' - log.info '-resume resume pipeline from the previous step, i.e. in case of error' - log.info '-help this message' - exit 1 -} - -/* -* Parse the input parameters -*/ - -// species-specific parameters -protein = file(params.proteinFile) -annotation = file(params.gffFile) -config_file = file(params.config) - -evalue = 0.00001 // Default evalue for BLAST - -if ( params.evalue != "" || params.evalue != null ) { - evalue = params.evalue -} - -dbFile = false -boolean exists = false -boolean mysql = false -gffclean = false -gffstats = false - -if( params.dbEngine.toLowerCase()=="mysql" ) { - mysql = true -} - -if ( params.gffclean && ( params.gffclean=="TRUE" || params.gffclean=="true" ) ) { - gffclean = true -} - -if ( params.gffstats && ( params.gffstats=="TRUE" || params.gffstats=="true" ) ) { - gffstats = true -} - -// Handling MySQL in a cleaner way -dbhost = null - -// Getting contents of file -if ( mysql ) { - dbhost = "127.0.0.1" // Default value. Localhost - - if ( new File( params.mysqllog+"/DBHOST" ).exists() ) { - dbhost = new File( params.mysqllog+"/DBHOST" ).text.trim() - } -} else { - dbFileName = params.resultPath+params.dbname+'.db' - dbFile = file(dbFileName) - if ( dbFile.exists() && dbFile.size() > 0 ) { - exists = true - } -} - - -// print log info - -log.info "" -log.info "Functional annotation pipeline" -log.info "" -log.info "General parameters" -log.info "------------------" -log.info "Protein sequence file : ${params.proteinFile}" -log.info "Annotation file : ${params.gffFile}" - -if ( params.blastFile != "" ) { - log.info "BLAST results file : ${params.blastFile}" -} - -log.info "Species name : ${params.speciesName}" -log.info "KEGG species : ${params.kegg_species}" - -if ( mysql ) { - log.info "FA database : ${params.dbname}" -} else { - log.info "FA database : $dbFileName" -} - -// split protein fasta file into chunks and then execute annotation for each chunk -// chanels for: interpro, blast, signalP, targetP, cdsearch_hit, cdsearch_features - -chunkSize = params.chunkSize -chunkBlastSize = chunkSize -chunkIPSSize = chunkSize -chunkKoalaSize = chunkSize -chunkWebSize = chunkSize - -if ( params.chunkBlastSize ) { - chunkBlastSize = params.chunkBlastSize -} - -if ( params.chunkIPSSize ) { - chunkIPSSize = params.chunkIPSSize -} - -if ( params.chunkKoalaSize ) { - chunkKoalaSize = params.chunkKoalaSize -} - -if ( params.chunkWebSize ) { - chunkWebSize = params.chunkWebSize -} - -seqData = Channel - .from(protein) - .splitFasta( by: chunkSize ) - - seqBlastData = Channel - .from(protein) - .splitFasta( by: chunkBlastSize ) - -seqKoalaData = Channel - .from(protein) - .splitFasta( by: chunkKoalaSize ) - - seqIPSData = Channel - .from(protein) - .splitFasta( by: chunkIPSSize ) - -seqWebData = Channel - .from(protein) - .splitFasta( by: chunkWebSize ) - -iscan_properties = file("/usr/local/interproscan/interproscan.properties") - -if ( params.debug == "TRUE" || params.debug =="true" ) { - println("Debugging.. only the first 2 chunks will be processed") - // Diferent parts for different processes. TODO: Change numbers for processes - (seq_file1, seq_file2) = seqData.take(2).into(2) - (seq_file_blast) = seqBlastData.take(2).into(1) - (seq_file_koala) = seqKoalaData.take(2).into(1) - (seq_file_ipscan) = seqIPSData.take(2).into(1) - (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) - - testNum = ( params.chunkSize.toInteger() * 2 ) - seqTestData = Channel - .from(protein) - .splitFasta(by: testNum) - - (seq_test) = seqTestData.take(1).into(1) - -} -else { - println("Process entire dataset") - (seq_file1, seq_file2) = seqData.into(2) - (seq_file_blast) = seqBlastData.into(1) - (seq_file_koala) = seqKoalaData.into(1) - (seq_file_ipscan) = seqIPSData.into(1) - (web_seq_file1, web_seq_file2) = seqWebData.into(2) - - seqTestData = Channel - .from(protein) - - // Anything for keeping. This is only kept for coherence - (seq_test) = seqTestData.into(1) - -} - -if(params.oboFile == "" || params.oboFile == null ) { - - println "Please download OBO File from http://www.geneontology.org/ontology/gene_ontology.obo" - // TODO: Download OBO file -} - -obofile=file(params.oboFile) - -// TODO: To change for different aligners -diamond = false - -if(params.diamond=="TRUE"||params.diamond=="true") { - diamond = true -} - -// BlastAnnotMode -blastAnnotMode = "common" -if( params.blastAnnotMode != "" && params.blastAnnotMode != null ) { - blastAnnotMode = params.blastAnnotMode -} - -if (params.blastFile == "" || params.blastFile == null ){ - - // program-specific parameters - db_name = file(params.blastDbPath).name - db_path = file(params.blastDbPath).parent - - // Handling Database formatting - formatdbDetect = "false" - - if ( diamond ) { - - formatDbFileName = params.blastDbPath + ".dmnd" - formatDbFile = file(formatDbFileName) - if ( formatDbFile.exists() && formatDbFile.size() > 0 ) { - formatdbDetect = "true" - } - - if ( formatdbDetect == "false" ) { - - process diamondFormat{ - - label 'diamond' - - output: - file "${db_name}_formatdb.dmnd" into formatdb - - """ - diamond makedb --in ${db_path}/${db_name} --db "${db_name}_formatdb" - """ - } - - } else { - formatdb = params.blastDbPath - } - - } else { - - formatDbDir = file( db_path ) - filter = ~/${db_name}.*.phr/ - def fcount = 0 - formatDbDir.eachFileMatch( filter ) { it -> - fcount = fcount + 1 - } - if ( fcount > 0 ) { - formatdbDetect = "true" - } - - println( formatdbDetect ) - if ( formatdbDetect == "false" ) { - - // println( "TUR" ) - - process blastFormat{ - - label 'blast' - - output: - file "${db_name}.p*" into formatdb - - """ - makeblastdb -dbtype prot -in ${db_path}/${db_name} -parse_seqids -out ${db_name} - """ - } - - } else { - formatdb = params.blastDbPath - } - } - - if ( diamond == true ) { - - process diamond{ - - label 'diamond' - - input: - file seq from seq_file_blast - file formatdb_file from formatdb - - output: - file "blastXml${seq}" into (blastXmlResults1, blastXmlResults2, blastXmlResults3) - - script: - if ( formatdbDetect == "false" ) { - command = "diamond blastp --db ${formatdb_file} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" - } else { - command = "diamond blastp --db ${db_path}/${db_name} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" - } - - command - - } - - } else { - - process blast{ - - label 'blast' - - // publishDir "results", mode: 'copy' - - input: - file seq from seq_file_blast - file formatdb_file from formatdb - - output: - file "blastXml${seq}" into (blastXmlResults1, blastXmlResults2, blastXmlResults3) - - script: - if ( formatdbDetect == "false" ) { - command = "blastp -db ${formatdb_file} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" - } else { - command = "blastp -db ${db_path}/${db_name} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" - } - - command - } - - } - -} else { - - blastInput=file(params.blastFile) - - process convertBlast{ - - // publishDir "results", mode: 'copy' - - input: - file blastFile from blastInput - - output: - file("*.xml") into (blastXmlResults1, blastXmlResults2, blastXmlResults3) - - """ - hugeBlast2XML.pl -blast $blastFile -n 1000 -out blast.res - """ - - } -} - -if (params.kolist != "" || params.kolist != null ){ - -process kofamscan{ - - label 'kofamscan' - - input: - file seq from seq_file_koala - - output: - file "koala_${seq}" into koalaResults - - """ - exec_annotation --cpu ${task.cpus} -p ${params.koprofiles} -k ${params.kolist} -o koala_${seq} $seq - """ - -} - -process kofam_parse { - - input: - file "koala_*" from koalaResults.collect() - - output: - file allKoala into koala_parsed - -""" - -mkdir -p output -processHmmscan2TSV.pl "koala_*" output -cat output/koala_* > allKoala -""" - -} - -// Replacing keggfile -keggfile = koala_parsed - -} else { - - - if(params.keggFile == "" || params.keggFile == null ) { - - println "Please run KEGG KO group annotation on the web server http://www.genome.jp/tools/kaas/" - - } - - keggfile=file(params.keggFile) - -} - -if(params.gogourl != ""){ - -process blast_annotator { - - label 'blastannotator' - - input: - file blastXml from blastXmlResults2.flatMap() - - output: - file "blastAnnot" into blast_annotator_results - -""" - blast-annotator.pl -in $blastXml -out blastAnnot --url $params.gogourl -t $blastAnnotMode -q --format blastxml -""" -} - -} - -process blastDef { - - // publishDir "results", mode: 'copy' - tag "${blastXml}" - - input: - file blastXml from blastXmlResults3.flatMap() - - output: - file "blastDef_${blastXml}.txt" into blastDef_results - - """ - definitionFromBlast.pl -in $blastXml -out blastDef_${blastXml}.txt -format xml -q - """ -} - -// TODO: Need to simplify this step - -if ( gffclean ) { - - process cleanGFF { - - label 'gffcheck' - - input: - file config_file - - output: - file "annot.gff" into gff_file - - """ - # get annot file - export escaped=\$(echo '$baseDir') - export basedirvar=\$(echo '\\\$\\{baseDir\\}') - agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff - """ - - } - - -} else { - - process copyGFF { - - label 'gffcheck' - - input: - file config_file - - output: - file "annot.gff" into gff_file - - """ - # get annot file - export escaped=\$(echo '$baseDir') - export basedirvar=\$(echo '\\\$\\{baseDir\\}') - cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff - """ - - } -} - -if ( gffstats ) { - - process statsGFF { - - publishDir params.resultPath, mode: 'copy' - - label 'gffcheck' - - input: - file gff_file - - output: - file "*.txt" into gff_stats - - """ - # Generate Stats - agat_sp_statistics.pl --gff $gff_file > ${gff_file}.stats.txt - """ - - } - - -} - -process initDB { - - input: - file config_file - file gff_file - file seq from seq_test - - output: - file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10, config4perl11) - - script: - command = "mkdir -p $params.resultPath\n" - command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' > configt\n" - command += "export escaped=\$(echo '$baseDir')\n" - command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" - command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" - - - if ( mysql ) { - // Add dbhost to config - command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" - command += "fa_main.v1.pl init -conf configIn" - - if ( gffclean ) { - command += " -gff ${gff_file}" - } - } else { - - if (!exists) { - command += "fa_main.v1.pl init -conf config" - - if ( gffclean ) { - command += " -gff ${gff_file}" - } - } - } - - if ( params.debug=="TRUE"||params.debug=="true" ) { - // If in debug mode, we restrict de seq entries we process - command += " -fasta ${seq}" - } - - command -} - -process 'definition_upload'{ - - maxForks 1 - - // publishDir "results", mode: 'copy' - input: - file "def*" from blastDef_results.collect() - file config from config4perl1 - - output: - file 'def_done' into definition_passed - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat def* > allDef; \ - upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ - " - - command -} - -process ipscn { - - label 'ipscan' - - input: - file seq from seq_file_ipscan - file ("interproscan.properties") from file( iscan_properties ) - - output: - file("out_interpro_${seq}") into (ipscn_result1, ipscn_result2) - - """ - sed 's/*//' $seq > tmp4ipscn - interproscan.sh -i tmp4ipscn --goterms --iprlookup --pathways -o out_interpro_${seq} -f TSV -T ${params.ipscantmp} - """ -} - -process 'cdSearchHit' { - - label 'cdSearch' - - maxForks 1 - - input: - file seq from web_seq_file1 - - output: - file("out_hit_${seq}") into cdSearch_hit_result - - """ - submitCDsearch.pl -o out_hit_${seq} -in $seq - """ -} - -process 'cdSearchFeat' { - - label 'cdSearch' - - maxForks 1 - - input: - file seq from web_seq_file2 - - output: - file("out_feat_${seq}") into cdSearch_feat_result - - """ - submitCDsearch.pl -t feats -o out_feat_${seq} -in $seq - """ -} - - -process 'signalP' { - - label 'sigtarp' - - input: - file seq from seq_file1 - - output: - file("out_signalp_${seq}") into (signalP_result1, signalP_result2) - - """ - signalp $seq > out_signalp_${seq} - """ -} - -process 'targetP' { - - label 'sigtarp' - - input: - file seq from seq_file2 - - output: - file("out_targetp_${seq}") into (targetP_result1, targetP_result2) - - """ - targetp -P -c $seq > out_targetp_${seq} - """ -} - -/* -Upload results into DB -- in current version of the pipeline DB is implemented with SQLite, but mySQL is also supported -*/ - -process 'signalP_upload'{ - - maxForks 1 - - input: - file "out_signalp*" from signalP_result1.collect() - file config from config4perl2 - file def_done from definition_passed - - output: - file("upload_signalp") into upload_signalp - - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_signalp* > allSignal ; \ - load_CBSpredictions.signalP.pl -i allSignal -conf \$config -type s > upload_signalp ; \ - " - - command -} - - -process 'targetP_upload'{ - - maxForks 1 - - input: - file "out_targetp*" from targetP_result1.collect() - file config from config4perl3 - file upload_signalp from upload_signalp - - output: - file("upload_targetp") into upload_targetp - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_targetp* > allTarget ; \ - load_CBSpredictions.signalP.pl -i allTarget -conf \$config -type t > upload_targetp ; \ - " - - command -} - - -process 'interpro_upload'{ - - maxForks 1 - - input: - file "out_interpro*" from ipscn_result1.collect() - file config from config4perl4 - file upload_targetp from upload_targetp - - output: - file("upload_interpro") into upload_interpro - - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_interpro* > allInterpro ; \ - run_interpro.pl -mode upload -i allInterpro -conf \$config > upload_interpro ; \ - " - - command -} - - -process 'CDsearch_hit_upload'{ - - maxForks 1 - - input: - file "out_hit*" from cdSearch_hit_result.collect() - file config from config4perl5 - file upload_interpro from upload_interpro - - output: - file("upload_hit") into upload_hit - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_hit* > allCDsearchHit ; \ - upload_CDsearch.pl -i allCDsearchHit -type h -conf \$config > upload_hit ; \ - " - - command -} - -process 'CDsearch_feat_upload'{ - - maxForks 1 - - input: - file "out_feat*" from cdSearch_feat_result.collect() - file config from config4perl6 - file upload_hit from upload_hit - - output: - file("upload_feat") into upload_feat - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_feat* > allCDsearchFeat ; \ - upload_CDsearch.pl -i allCDsearchFeat -type f -conf \$config > upload_feat ; \ - " - - command -} - -process 'blast_annotator_upload'{ - - maxForks 1 - - input: - file "blastAnnot*" from blast_annotator_results.collect() - file config from config4perl7 - file upload_feat from upload_feat - - output: - file("upload_blast") into upload_blast - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat blastAnnot* > allBlast ; \ - awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ - upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > upload_blast ; \ - " - - command -} - -process 'kegg_download'{ - - maxForks 1 - - input: - file keggfile from keggfile - file config from config4perl8 - file("upload_blast") from upload_blast - - output: - file("down_kegg") into (down_kegg) - - - script: - - command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" - - command -} - -process 'kegg_upload'{ - - maxForks 1 - - input: - file keggfile from keggfile - file config from config4perl9 - file("down_kegg") from down_kegg - - output: - file('done') into (last_step1, last_step2) - - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > done 2>err; \ - " - - command -} - -process 'generateResultFiles'{ - input: - file config from config4perl10 - file all_done from last_step1 - file obofile from obofile - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - get_results.pl -conf \$config -obo $obofile ; \ - " - - command -} - -if ( annotation != null && annotation != "" ){ - -process 'generateGFF3File'{ - input: - file config from config4perl11 - file all_done from last_step2 - - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - // TODO: add case for debug using -list - command += " \ - get_gff3.pl -conf \$config ; \ - " - - command -} - -} - -/* -process 'generateReport'{ - input: - - output: - - """ - pdflatex bin\/report_template -""" - -} -*/ - -// Check MySQL IP -def checkMySQL( mysql, mysqllog ) { - - command = "" - - if ( mysql ) { - // Add dbhost to config - command += "DBHOST=\"dbhost:'`cat ${mysqllog}/DBHOST`'\"; echo \"\$(cat config)\n \$DBHOST\" > configIn ;\n" - command += "config=configIn ;" - } else { - command += "config=config ;" - } - - return command - -} - -// On finising -workflow.onComplete { - - println ( workflow.success ? "\nDone! Check results in --> $params.resultPath\n" : "Oops .. something went wrong" ) - - if ( mysql ) { - - def procfile = new File( params.mysqllog+"/PROCESS" ) - procfile.delete() - } - -} - -workflow.onError { - - println( "Something went wrong" ) - - if ( mysql ) { - - def procfile = new File( params.mysqllog+"/PROCESS" ) - procfile.delete() - } - -} - -signalP_result2 - .collectFile(name: file(params.resultPath + "signalP.res.tsv")) - .println { "Result saved to file: $it" } - -targetP_result2 - .collectFile(name: file(params.resultPath + "targetP.res.tsv")) - .println { "Result saved to file: $it" } - -ipscn_result2 - .collectFile(name: file(params.resultPath + "interProScan.res.tsv")) - .println { "Result saved to file: $it" } diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index 06a9f30..c516ae6 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -162,7 +162,7 @@ my $myip=`cat "$mysqllog/DBHOST"`; print "DBHOST: ".$myip."\n"; print( "Run NEXTFLOW\n") ; - system( "$nextflow run $nfparams -bg pipeline.nf $resumeStr --config $confFile" ); + system( "$nextflow run $nfparams -bg main.nf $resumeStr --config $confFile" ); } else { while ( ! -f "$mysqllog/DBHOST" ) { @@ -183,6 +183,6 @@ # Else, SQLite mode # Run Nextflow pipeline print( "Run NEXTFLOW\n") ; - system( "$nextflow run $nfparams -bg pipeline.nf $resumeStr --config $confFile" ); + system( "$nextflow run $nfparams -bg main.nf $resumeStr --config $confFile" ); } From 1772711d198ffd2bd052d7692437ef7f4baf517e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 11:20:58 +0100 Subject: [PATCH 057/381] rename to more normal NF names --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ef4ad65..3d6c0c6 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Result files, including main annotation file in gff format and annotation report The annotation step can be launched by using the following command: ``` -./nextflow run -bg pipeline.nf --config configuration_file.config &> logfile +./nextflow run -bg main.nf --config params.config &> logfile ``` ![Pipeline flow chart](./flowchart.png "Pipeline flow chart") From 6d1db450ea5d334797f064269372bf3345fa4b39 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 11:22:08 +0100 Subject: [PATCH 058/381] rename to more normal NF names --- main.nf | 988 ++++++++++++++++++++++++++++++++++++++++++++++++++ params.config | 37 ++ 2 files changed, 1025 insertions(+) create mode 100644 main.nf create mode 100644 params.config diff --git a/main.nf b/main.nf new file mode 100644 index 0000000..9fec1c6 --- /dev/null +++ b/main.nf @@ -0,0 +1,988 @@ +#!/usr/bin/env nextflow + +/* + * Copyright (c) 2017-2020, Centre for Genomic Regulation (CRG) + * + * Copyright (c) 2017, Anna Vlasova + * + * Copyright (c) 2017, Emilio Palumbo + * + * Copyright (c) 2018-2020, Toni Hermoso Pulido + * + * Functional Annotation Pipeline for protein annotation from non-model organisms + * from Genome Annotation Team in Catalonia (GATC) implemented in Nextflow + * + * 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 3 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, see . + */ + + +// there can be three log levels: off (no messages), info (some main messages), debug (all messages + sql queries) + + +// default parameters +params.help = false +params.debug="false" +params.chunkIPSSize = null +params.chunkBlastSize = null +params.chunkKoalaSize = null +params.chunkWebSize = null +params.evalue = null +params.dbEngine = "mysql" +params.gffclean = false +params.gffstats = false +params.diamond = null + +//print usage +if ( params.help ) { + log.info '' + log.info 'Functional annotation pipeline' + log.info '----------------------------------------------------' + log.info 'Run functional annotation for a given specie.' + log.info '' + log.info 'Usage: ' + log.info " ./nextflow run pipeline.nf --config main_configuration.config [options]" + log.info '' + log.info 'Options:' + log.info '-resume resume pipeline from the previous step, i.e. in case of error' + log.info '-help this message' + exit 1 +} + +/* +* Parse the input parameters +*/ + +// species-specific parameters +protein = file(params.proteinFile) +annotation = file(params.gffFile) +config_file = file(params.config) + +evalue = 0.00001 // Default evalue for BLAST + +if ( params.evalue != "" || params.evalue != null ) { + evalue = params.evalue +} + +dbFile = false +boolean exists = false +boolean mysql = false +gffclean = false +gffstats = false + +if( params.dbEngine.toLowerCase()=="mysql" ) { + mysql = true +} + +if ( params.gffclean && ( params.gffclean=="TRUE" || params.gffclean=="true" ) ) { + gffclean = true +} + +if ( params.gffstats && ( params.gffstats=="TRUE" || params.gffstats=="true" ) ) { + gffstats = true +} + +// Handling MySQL in a cleaner way +dbhost = null + +// Getting contents of file +if ( mysql ) { + dbhost = "127.0.0.1" // Default value. Localhost + + if ( new File( params.mysqllog+"/DBHOST" ).exists() ) { + dbhost = new File( params.mysqllog+"/DBHOST" ).text.trim() + } +} else { + dbFileName = params.resultPath+params.dbname+'.db' + dbFile = file(dbFileName) + if ( dbFile.exists() && dbFile.size() > 0 ) { + exists = true + } +} + + +// print log info + +log.info "" +log.info "Functional annotation pipeline" +log.info "" +log.info "General parameters" +log.info "------------------" +log.info "Protein sequence file : ${params.proteinFile}" +log.info "Annotation file : ${params.gffFile}" + +if ( params.blastFile != "" ) { + log.info "BLAST results file : ${params.blastFile}" +} + +log.info "Species name : ${params.speciesName}" +log.info "KEGG species : ${params.kegg_species}" + +if ( mysql ) { + log.info "FA database : ${params.dbname}" +} else { + log.info "FA database : $dbFileName" +} + +// split protein fasta file into chunks and then execute annotation for each chunk +// chanels for: interpro, blast, signalP, targetP, cdsearch_hit, cdsearch_features + +chunkSize = params.chunkSize +chunkBlastSize = chunkSize +chunkIPSSize = chunkSize +chunkKoalaSize = chunkSize +chunkWebSize = chunkSize + +if ( params.chunkBlastSize ) { + chunkBlastSize = params.chunkBlastSize +} + +if ( params.chunkIPSSize ) { + chunkIPSSize = params.chunkIPSSize +} + +if ( params.chunkKoalaSize ) { + chunkKoalaSize = params.chunkKoalaSize +} + +if ( params.chunkWebSize ) { + chunkWebSize = params.chunkWebSize +} + +seqData = Channel + .from(protein) + .splitFasta( by: chunkSize ) + + seqBlastData = Channel + .from(protein) + .splitFasta( by: chunkBlastSize ) + +seqKoalaData = Channel + .from(protein) + .splitFasta( by: chunkKoalaSize ) + + seqIPSData = Channel + .from(protein) + .splitFasta( by: chunkIPSSize ) + +seqWebData = Channel + .from(protein) + .splitFasta( by: chunkWebSize ) + +iscan_properties = file("/usr/local/interproscan/interproscan.properties") + +if ( params.debug == "TRUE" || params.debug =="true" ) { + println("Debugging.. only the first 2 chunks will be processed") + // Diferent parts for different processes. TODO: Change numbers for processes + (seq_file1, seq_file2) = seqData.take(2).into(2) + (seq_file_blast) = seqBlastData.take(2).into(1) + (seq_file_koala) = seqKoalaData.take(2).into(1) + (seq_file_ipscan) = seqIPSData.take(2).into(1) + (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) + + testNum = ( params.chunkSize.toInteger() * 2 ) + seqTestData = Channel + .from(protein) + .splitFasta(by: testNum) + + (seq_test) = seqTestData.take(1).into(1) + +} +else { + println("Process entire dataset") + (seq_file1, seq_file2) = seqData.into(2) + (seq_file_blast) = seqBlastData.into(1) + (seq_file_koala) = seqKoalaData.into(1) + (seq_file_ipscan) = seqIPSData.into(1) + (web_seq_file1, web_seq_file2) = seqWebData.into(2) + + seqTestData = Channel + .from(protein) + + // Anything for keeping. This is only kept for coherence + (seq_test) = seqTestData.into(1) + +} + +if(params.oboFile == "" || params.oboFile == null ) { + + println "Please download OBO File from http://www.geneontology.org/ontology/gene_ontology.obo" + // TODO: Download OBO file +} + +obofile=file(params.oboFile) + +// TODO: To change for different aligners +diamond = false + +if(params.diamond=="TRUE"||params.diamond=="true") { + diamond = true +} + +// BlastAnnotMode +blastAnnotMode = "common" +if( params.blastAnnotMode != "" && params.blastAnnotMode != null ) { + blastAnnotMode = params.blastAnnotMode +} + +if (params.blastFile == "" || params.blastFile == null ){ + + // program-specific parameters + db_name = file(params.blastDbPath).name + db_path = file(params.blastDbPath).parent + + // Handling Database formatting + formatdbDetect = "false" + + if ( diamond ) { + + formatDbFileName = params.blastDbPath + ".dmnd" + formatDbFile = file(formatDbFileName) + if ( formatDbFile.exists() && formatDbFile.size() > 0 ) { + formatdbDetect = "true" + } + + if ( formatdbDetect == "false" ) { + + process diamondFormat{ + + label 'diamond' + + output: + file "${db_name}_formatdb.dmnd" into formatdb + + """ + diamond makedb --in ${db_path}/${db_name} --db "${db_name}_formatdb" + """ + } + + } else { + formatdb = params.blastDbPath + } + + } else { + + formatDbDir = file( db_path ) + filter = ~/${db_name}.*.phr/ + def fcount = 0 + formatDbDir.eachFileMatch( filter ) { it -> + fcount = fcount + 1 + } + if ( fcount > 0 ) { + formatdbDetect = "true" + } + + println( formatdbDetect ) + if ( formatdbDetect == "false" ) { + + // println( "TUR" ) + + process blastFormat{ + + label 'blast' + + output: + file "${db_name}.p*" into formatdb + + """ + makeblastdb -dbtype prot -in ${db_path}/${db_name} -parse_seqids -out ${db_name} + """ + } + + } else { + formatdb = params.blastDbPath + } + } + + if ( diamond == true ) { + + process diamond{ + + label 'diamond' + + input: + file seq from seq_file_blast + file formatdb_file from formatdb + + output: + file "blastXml${seq}" into (blastXmlResults1, blastXmlResults2, blastXmlResults3) + + script: + if ( formatdbDetect == "false" ) { + command = "diamond blastp --db ${formatdb_file} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" + } else { + command = "diamond blastp --db ${db_path}/${db_name} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" + } + + command + + } + + } else { + + process blast{ + + label 'blast' + + // publishDir "results", mode: 'copy' + + input: + file seq from seq_file_blast + file formatdb_file from formatdb + + output: + file "blastXml${seq}" into (blastXmlResults1, blastXmlResults2, blastXmlResults3) + + script: + if ( formatdbDetect == "false" ) { + command = "blastp -db ${formatdb_file} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" + } else { + command = "blastp -db ${db_path}/${db_name} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" + } + + command + } + + } + +} else { + + blastInput=file(params.blastFile) + + process convertBlast{ + + // publishDir "results", mode: 'copy' + + input: + file blastFile from blastInput + + output: + file("*.xml") into (blastXmlResults1, blastXmlResults2, blastXmlResults3) + + """ + hugeBlast2XML.pl -blast $blastFile -n 1000 -out blast.res + """ + + } +} + +if (params.kolist != "" || params.kolist != null ){ + +process kofamscan{ + + label 'kofamscan' + + input: + file seq from seq_file_koala + + output: + file "koala_${seq}" into koalaResults + + """ + exec_annotation --cpu ${task.cpus} -p ${params.koprofiles} -k ${params.kolist} -o koala_${seq} $seq + """ + +} + +process kofam_parse { + + input: + file "koala_*" from koalaResults.collect() + + output: + file allKoala into koala_parsed + +""" + +mkdir -p output +processHmmscan2TSV.pl "koala_*" output +cat output/koala_* > allKoala +""" + +} + +// Replacing keggfile +keggfile = koala_parsed + +} else { + + + if(params.keggFile == "" || params.keggFile == null ) { + + println "Please run KEGG KO group annotation on the web server http://www.genome.jp/tools/kaas/" + + } + + keggfile=file(params.keggFile) + +} + +if(params.gogourl != ""){ + +process blast_annotator { + + label 'blastannotator' + + input: + file blastXml from blastXmlResults2.flatMap() + + output: + file "blastAnnot" into blast_annotator_results + +""" + blast-annotator.pl -in $blastXml -out blastAnnot --url $params.gogourl -t $blastAnnotMode -q --format blastxml +""" +} + +} + +process blastDef { + + // publishDir "results", mode: 'copy' + tag "${blastXml}" + + input: + file blastXml from blastXmlResults3.flatMap() + + output: + file "blastDef_${blastXml}.txt" into blastDef_results + + """ + definitionFromBlast.pl -in $blastXml -out blastDef_${blastXml}.txt -format xml -q + """ +} + +// TODO: Need to simplify this step + +if ( gffclean ) { + + process cleanGFF { + + label 'gffcheck' + + input: + file config_file + + output: + file "annot.gff" into gff_file + + """ + # get annot file + export escaped=\$(echo '$baseDir') + export basedirvar=\$(echo '\\\$\\{baseDir\\}') + agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff + """ + + } + + +} else { + + process copyGFF { + + label 'gffcheck' + + input: + file config_file + + output: + file "annot.gff" into gff_file + + """ + # get annot file + export escaped=\$(echo '$baseDir') + export basedirvar=\$(echo '\\\$\\{baseDir\\}') + cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff + """ + + } +} + +if ( gffstats ) { + + process statsGFF { + + publishDir params.resultPath, mode: 'copy' + + label 'gffcheck' + + input: + file gff_file + + output: + file "*.txt" into gff_stats + + """ + # Generate Stats + agat_sp_statistics.pl --gff $gff_file > ${gff_file}.stats.txt + """ + + } + + +} + +process initDB { + + input: + file config_file + file gff_file + file seq from seq_test + + output: + file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10, config4perl11) + + script: + command = "mkdir -p $params.resultPath\n" + command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' > configt\n" + command += "export escaped=\$(echo '$baseDir')\n" + command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" + command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" + + + if ( mysql ) { + // Add dbhost to config + command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" + command += "fa_main.v1.pl init -conf configIn" + + if ( gffclean ) { + command += " -gff ${gff_file}" + } + } else { + + if (!exists) { + command += "fa_main.v1.pl init -conf config" + + if ( gffclean ) { + command += " -gff ${gff_file}" + } + } + } + + if ( params.debug=="TRUE"||params.debug=="true" ) { + // If in debug mode, we restrict de seq entries we process + command += " -fasta ${seq}" + } + + command +} + +process 'definition_upload'{ + + maxForks 1 + + // publishDir "results", mode: 'copy' + input: + file "def*" from blastDef_results.collect() + file config from config4perl1 + + output: + file 'def_done' into definition_passed + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat def* > allDef; \ + upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ + " + + command +} + +process ipscn { + + label 'ipscan' + + input: + file seq from seq_file_ipscan + file ("interproscan.properties") from file( iscan_properties ) + + output: + file("out_interpro_${seq}") into (ipscn_result1, ipscn_result2) + + """ + sed 's/*//' $seq > tmp4ipscn + interproscan.sh -i tmp4ipscn --goterms --iprlookup --pathways -o out_interpro_${seq} -f TSV -T ${params.ipscantmp} + """ +} + +process 'cdSearchHit' { + + label 'cdSearch' + + maxForks 1 + + input: + file seq from web_seq_file1 + + output: + file("out_hit_${seq}") into cdSearch_hit_result + + """ + submitCDsearch.pl -o out_hit_${seq} -in $seq + """ +} + +process 'cdSearchFeat' { + + label 'cdSearch' + + maxForks 1 + + input: + file seq from web_seq_file2 + + output: + file("out_feat_${seq}") into cdSearch_feat_result + + """ + submitCDsearch.pl -t feats -o out_feat_${seq} -in $seq + """ +} + + +process 'signalP' { + + label 'sigtarp' + + input: + file seq from seq_file1 + + output: + file("out_signalp_${seq}") into (signalP_result1, signalP_result2) + + """ + signalp $seq > out_signalp_${seq} + """ +} + +process 'targetP' { + + label 'sigtarp' + + input: + file seq from seq_file2 + + output: + file("out_targetp_${seq}") into (targetP_result1, targetP_result2) + + """ + targetp -P -c $seq > out_targetp_${seq} + """ +} + +/* +Upload results into DB -- in current version of the pipeline DB is implemented with SQLite, but mySQL is also supported +*/ + +process 'signalP_upload'{ + + maxForks 1 + + input: + file "out_signalp*" from signalP_result1.collect() + file config from config4perl2 + file def_done from definition_passed + + output: + file("upload_signalp") into upload_signalp + + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat out_signalp* > allSignal ; \ + load_CBSpredictions.signalP.pl -i allSignal -conf \$config -type s > upload_signalp ; \ + " + + command +} + + +process 'targetP_upload'{ + + maxForks 1 + + input: + file "out_targetp*" from targetP_result1.collect() + file config from config4perl3 + file upload_signalp from upload_signalp + + output: + file("upload_targetp") into upload_targetp + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat out_targetp* > allTarget ; \ + load_CBSpredictions.signalP.pl -i allTarget -conf \$config -type t > upload_targetp ; \ + " + + command +} + + +process 'interpro_upload'{ + + maxForks 1 + + input: + file "out_interpro*" from ipscn_result1.collect() + file config from config4perl4 + file upload_targetp from upload_targetp + + output: + file("upload_interpro") into upload_interpro + + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat out_interpro* > allInterpro ; \ + run_interpro.pl -mode upload -i allInterpro -conf \$config > upload_interpro ; \ + " + + command +} + + +process 'CDsearch_hit_upload'{ + + maxForks 1 + + input: + file "out_hit*" from cdSearch_hit_result.collect() + file config from config4perl5 + file upload_interpro from upload_interpro + + output: + file("upload_hit") into upload_hit + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat out_hit* > allCDsearchHit ; \ + upload_CDsearch.pl -i allCDsearchHit -type h -conf \$config > upload_hit ; \ + " + + command +} + +process 'CDsearch_feat_upload'{ + + maxForks 1 + + input: + file "out_feat*" from cdSearch_feat_result.collect() + file config from config4perl6 + file upload_hit from upload_hit + + output: + file("upload_feat") into upload_feat + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat out_feat* > allCDsearchFeat ; \ + upload_CDsearch.pl -i allCDsearchFeat -type f -conf \$config > upload_feat ; \ + " + + command +} + +process 'blast_annotator_upload'{ + + maxForks 1 + + input: + file "blastAnnot*" from blast_annotator_results.collect() + file config from config4perl7 + file upload_feat from upload_feat + + output: + file("upload_blast") into upload_blast + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat blastAnnot* > allBlast ; \ + awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ + upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > upload_blast ; \ + " + + command +} + +process 'kegg_download'{ + + maxForks 1 + + input: + file keggfile from keggfile + file config from config4perl8 + file("upload_blast") from upload_blast + + output: + file("down_kegg") into (down_kegg) + + + script: + + command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" + + command +} + +process 'kegg_upload'{ + + maxForks 1 + + input: + file keggfile from keggfile + file config from config4perl9 + file("down_kegg") from down_kegg + + output: + file('done') into (last_step1, last_step2) + + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > done 2>err; \ + " + + command +} + +process 'generateResultFiles'{ + input: + file config from config4perl10 + file all_done from last_step1 + file obofile from obofile + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + get_results.pl -conf \$config -obo $obofile ; \ + " + + command +} + +if ( annotation != null && annotation != "" ){ + +process 'generateGFF3File'{ + input: + file config from config4perl11 + file all_done from last_step2 + + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + // TODO: add case for debug using -list + command += " \ + get_gff3.pl -conf \$config ; \ + " + + command +} + +} + +/* +process 'generateReport'{ + input: + + output: + + """ + pdflatex bin\/report_template +""" + +} +*/ + +// Check MySQL IP +def checkMySQL( mysql, mysqllog ) { + + command = "" + + if ( mysql ) { + // Add dbhost to config + command += "DBHOST=\"dbhost:'`cat ${mysqllog}/DBHOST`'\"; echo \"\$(cat config)\n \$DBHOST\" > configIn ;\n" + command += "config=configIn ;" + } else { + command += "config=config ;" + } + + return command + +} + +// On finising +workflow.onComplete { + + println ( workflow.success ? "\nDone! Check results in --> $params.resultPath\n" : "Oops .. something went wrong" ) + + if ( mysql ) { + + def procfile = new File( params.mysqllog+"/PROCESS" ) + procfile.delete() + } + +} + +workflow.onError { + + println( "Something went wrong" ) + + if ( mysql ) { + + def procfile = new File( params.mysqllog+"/PROCESS" ) + procfile.delete() + } + +} + +signalP_result2 + .collectFile(name: file(params.resultPath + "signalP.res.tsv")) + .println { "Result saved to file: $it" } + +targetP_result2 + .collectFile(name: file(params.resultPath + "targetP.res.tsv")) + .println { "Result saved to file: $it" } + +ipscn_result2 + .collectFile(name: file(params.resultPath + "interProScan.res.tsv")) + .println { "Result saved to file: $it" } diff --git a/params.config b/params.config new file mode 100644 index 0000000..e849ed3 --- /dev/null +++ b/params.config @@ -0,0 +1,37 @@ +params { + proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" + gffFile = "${baseDir}/dataset/P.vulgaris.gff3" + gffclean = "true" + gffstats = "true" + evalue = "0.00001" + blastFile = "" + diamond = "false" + blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" + blastAnnotMode = "common" + speciesName = "P.vulgaris" + chunkSize = 25 + chunkBlastSize = 50 + chunkIPSSize = 25 + chunkKoalaSize = 50 + chunkWebSize = 100 + dbEngine = "MySQL" + dbname = "Pvulgaris" + oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" + resultPath = "${baseDir}/results/" + stdoutLog = "${baseDir}/logs/functional_annotation.stdout" + stderrLog = "${baseDir}/logs/functional_annotation.stderr" + evalue = 0.0001 + kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" + kolist = "/nfs/db/kegg/ko_list" + koprofiles = "/nfs/db/kegg/profiles" + gogourl = "http://gogo.test.crg.eu/api" + ipscantmp = "${baseDir}/tmp/" + dbuser = "test" + dbpass = "test" + dbport = 12345 + mysqldata = "${baseDir}/mysql/" + mysqllog = "${baseDir}/tmp" + mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" + loglevel = "info" + debug = "true" +} From 6023fc280183528ad90b7bbf9a80a3d854a9ce75 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 12:12:02 +0100 Subject: [PATCH 059/381] downloadURL and test parts --- main.nf | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/main.nf b/main.nf index 9fec1c6..6e79ffb 100644 --- a/main.nf +++ b/main.nf @@ -37,6 +37,7 @@ params.chunkIPSSize = null params.chunkBlastSize = null params.chunkKoalaSize = null params.chunkWebSize = null +params.debugSize = 2 params.evalue = null params.dbEngine = "mysql" params.gffclean = false @@ -182,15 +183,15 @@ seqWebData = Channel iscan_properties = file("/usr/local/interproscan/interproscan.properties") if ( params.debug == "TRUE" || params.debug =="true" ) { - println("Debugging.. only the first 2 chunks will be processed") + println("Debugging.. only the first $params.debugSize chunks will be processed") // Diferent parts for different processes. TODO: Change numbers for processes - (seq_file1, seq_file2) = seqData.take(2).into(2) - (seq_file_blast) = seqBlastData.take(2).into(1) - (seq_file_koala) = seqKoalaData.take(2).into(1) - (seq_file_ipscan) = seqIPSData.take(2).into(1) - (web_seq_file1, web_seq_file2) = seqWebData.take(2).into(2) + (seq_file1, seq_file2) = seqData.take(debugSize).into(2) + (seq_file_blast) = seqBlastData.take(debugSize).into(1) + (seq_file_koala) = seqKoalaData.take(debugSize).into(1) + (seq_file_ipscan) = seqIPSData.take(debugSize).into(1) + (web_seq_file1, web_seq_file2) = seqWebData.take(debugSize).into(2) - testNum = ( params.chunkSize.toInteger() * 2 ) + testNum = ( params.chunkSize.toInteger() * debugSize ) seqTestData = Channel .from(protein) .splitFasta(by: testNum) @@ -214,18 +215,17 @@ else { } -if(params.oboFile == "" || params.oboFile == null ) { - - println "Please download OBO File from http://www.geneontology.org/ontology/gene_ontology.obo" - // TODO: Download OBO file +if( params.oboFile == "" || params.oboFile == null ) { + oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) +} else { + oboFile = file(params.oboFile) } -obofile=file(params.oboFile) // TODO: To change for different aligners diamond = false -if(params.diamond=="TRUE"||params.diamond=="true") { +if( params.diamond == "TRUE" || params.diamond =="true" ) { diamond = true } @@ -950,6 +950,12 @@ def checkMySQL( mysql, mysqllog ) { } +def downloadURL( address, filename ) { + downFile = new File( filename ) << new URL (address).getText() + return downFile +} + + // On finising workflow.onComplete { From 90b9b710e45641c7b9a868a3add25f5e2338a191 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 12:17:23 +0100 Subject: [PATCH 060/381] Update params file --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3d6c0c6..6040900 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Note: for the downstream processing of the KO file it is very important to store ### Configuration file The pipeline require as an input the configuration file with specified parameters, such as path to the input files, specie name, KEGG specie abbreviations used to obtain KO groups, and some more. -The example of configuration file is included into this repository with name main_configuration.config +The example of configuration file is included into this repository with name params.config ## Running the pipeline @@ -102,18 +102,18 @@ As written down in ```nextflow.config``` file, whenever possible, we try to prov We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local. - nohup perl run_pipeline_mysql.pl -conf ./main_configuration.config &> log.mysql & + nohup perl run_pipeline_mysql.pl -conf ./params.config &> log.mysql & It is also possible to pass additional Nextflow parameters - nohup perl run_pipeline_mysql.pl -params "-with-dag -with-report -with-timeline" -conf ./main_configuration.config &> log.mysql & + nohup perl run_pipeline_mysql.pl -params "-with-dag -with-report -with-timeline" -conf ./params.config &> log.mysql & ## Running only MySQL This is convenient for checking results database once analyses are finished. NO further analyses are run. - nohup perl run_pipeline_mysql.pl -mysqlonly -conf ./main_configuration.config &> log.mysql.only & + nohup perl run_pipeline_mysql.pl -mysqlonly -conf ./params.config &> log.mysql.only & for further options or details, run: From b8487d55e772b8af251a967e9ed1e7bd9918c903 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 12:25:56 +0100 Subject: [PATCH 061/381] fix variable --- main.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 6e79ffb..0854a52 100644 --- a/main.nf +++ b/main.nf @@ -185,13 +185,13 @@ iscan_properties = file("/usr/local/interproscan/interproscan.properties") if ( params.debug == "TRUE" || params.debug =="true" ) { println("Debugging.. only the first $params.debugSize chunks will be processed") // Diferent parts for different processes. TODO: Change numbers for processes - (seq_file1, seq_file2) = seqData.take(debugSize).into(2) - (seq_file_blast) = seqBlastData.take(debugSize).into(1) - (seq_file_koala) = seqKoalaData.take(debugSize).into(1) - (seq_file_ipscan) = seqIPSData.take(debugSize).into(1) - (web_seq_file1, web_seq_file2) = seqWebData.take(debugSize).into(2) + (seq_file1, seq_file2) = seqData.take(params.debugSize).into(2) + (seq_file_blast) = seqBlastData.take(params.debugSize).into(1) + (seq_file_koala) = seqKoalaData.take(params.debugSize).into(1) + (seq_file_ipscan) = seqIPSData.take(params.debugSize).into(1) + (web_seq_file1, web_seq_file2) = seqWebData.take(params.debugSize).into(2) - testNum = ( params.chunkSize.toInteger() * debugSize ) + testNum = ( params.chunkSize.toInteger() * params.debugSize ) seqTestData = Channel .from(protein) .splitFasta(by: testNum) From f61d9ac69286980a0afd8d79f8a8c84c668f4eca Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 12:33:50 +0100 Subject: [PATCH 062/381] change oboFile --- TODO.md | 2 +- main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index a0fb562..5a42dc6 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,7 @@ * Include some testing and CI * Visualization of results * Venn Diagrams - +* Ensure stop of MySQL process when error --- * Allow conversion from GenBank https://metacpan.org/pod/bp_genbank2gff3.pl * In reports, put select distincts again tables diff --git a/main.nf b/main.nf index 0854a52..be2c920 100644 --- a/main.nf +++ b/main.nf @@ -885,7 +885,7 @@ process 'generateResultFiles'{ input: file config from config4perl10 file all_done from last_step1 - file obofile from obofile + file obofile from oboFile script: From 4329c69d801ffca77b03d2eee7dcd5b444b36baf Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 15:48:52 +0100 Subject: [PATCH 063/381] fix params --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 65bff52..ca1d9c3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -3,7 +3,7 @@ manifest { description = 'Pipeline for FA analysis' } -includeConfig "${params.config ?: 'main_configuration.config'}" +includeConfig "${params.config ?: 'params.config'}" process{ From 383e6123a04548400a80e0aaafb7b55392a9a0a1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 16:10:55 +0100 Subject: [PATCH 064/381] year changed --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index be2c920..3a702e1 100644 --- a/main.nf +++ b/main.nf @@ -7,7 +7,7 @@ * * Copyright (c) 2017, Emilio Palumbo * - * Copyright (c) 2018-2020, Toni Hermoso Pulido + * Copyright (c) 2018-2021, Toni Hermoso Pulido * * Functional Annotation Pipeline for protein annotation from non-model organisms * from Genome Annotation Team in Catalonia (GATC) implemented in Nextflow From 671e4ef8e6bb9c78819b24a98c380705bfd84225 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 16:43:42 +0100 Subject: [PATCH 065/381] minor changes --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index 3a702e1..e1b55f6 100644 --- a/main.nf +++ b/main.nf @@ -43,6 +43,8 @@ params.dbEngine = "mysql" params.gffclean = false params.gffstats = false params.diamond = null +params.blastAnnotMode = "common" +params.oboFile = null //print usage if ( params.help ) { From 3e512c87d0a09590b57b0ee07f6a3928a9d12da5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 18:13:48 +0100 Subject: [PATCH 066/381] fix evalue --- main.nf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index e1b55f6..5d55c09 100644 --- a/main.nf +++ b/main.nf @@ -71,10 +71,12 @@ protein = file(params.proteinFile) annotation = file(params.gffFile) config_file = file(params.config) -evalue = 0.00001 // Default evalue for BLAST - -if ( params.evalue != "" || params.evalue != null ) { +if ( params.evalue != "" || params.evalue != null ) { evalue = params.evalue +} else { + if ( params.evalue == null ) { + evalue = 0.00001 // Default evalue for BLAST + } } dbFile = false From 275252cb57a0c1cdbb382a36eeb5180d05c1fee1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 3 Mar 2021 18:18:45 +0100 Subject: [PATCH 067/381] simplify evalue --- main.nf | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/main.nf b/main.nf index 5d55c09..cb5d6d2 100644 --- a/main.nf +++ b/main.nf @@ -38,7 +38,7 @@ params.chunkBlastSize = null params.chunkKoalaSize = null params.chunkWebSize = null params.debugSize = 2 -params.evalue = null +params.evalue = 0.00001 params.dbEngine = "mysql" params.gffclean = false params.gffstats = false @@ -71,14 +71,6 @@ protein = file(params.proteinFile) annotation = file(params.gffFile) config_file = file(params.config) -if ( params.evalue != "" || params.evalue != null ) { - evalue = params.evalue -} else { - if ( params.evalue == null ) { - evalue = 0.00001 // Default evalue for BLAST - } -} - dbFile = false boolean exists = false boolean mysql = false @@ -323,9 +315,9 @@ if (params.blastFile == "" || params.blastFile == null ){ script: if ( formatdbDetect == "false" ) { - command = "diamond blastp --db ${formatdb_file} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" + command = "diamond blastp --db ${formatdb_file} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${params.evalue} --out blastXml${seq}" } else { - command = "diamond blastp --db ${db_path}/${db_name} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${evalue} --out blastXml${seq}" + command = "diamond blastp --db ${db_path}/${db_name} --query $seq --outfmt 5 --threads ${task.cpus} --evalue ${params.evalue} --out blastXml${seq}" } command @@ -349,9 +341,9 @@ if (params.blastFile == "" || params.blastFile == null ){ script: if ( formatdbDetect == "false" ) { - command = "blastp -db ${formatdb_file} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" + command = "blastp -db ${formatdb_file} -query $seq -num_threads ${task.cpus} -evalue ${params.evalue} -out blastXml${seq} -outfmt 5" } else { - command = "blastp -db ${db_path}/${db_name} -query $seq -num_threads ${task.cpus} -evalue ${evalue} -out blastXml${seq} -outfmt 5" + command = "blastp -db ${db_path}/${db_name} -query $seq -num_threads ${task.cpus} -evalue ${params.evalue} -out blastXml${seq} -outfmt 5" } command From 77ff726599406c90061de292a68411f9352c69c4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 4 Mar 2021 18:14:05 +0100 Subject: [PATCH 068/381] update script --- run_pipeline_mysql.pl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index c516ae6..2d7d7a1 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -13,6 +13,7 @@ my ($confFile,$show_help); my $nextflow = "nextflow"; +my $nfscript = "main.nf"; my $nfparams = ""; # By default no additional params my $resume = 0; @@ -162,7 +163,7 @@ my $myip=`cat "$mysqllog/DBHOST"`; print "DBHOST: ".$myip."\n"; print( "Run NEXTFLOW\n") ; - system( "$nextflow run $nfparams -bg main.nf $resumeStr --config $confFile" ); + system( "$nextflow run $nfparams -bg $nfscript $resumeStr --config $confFile" ); } else { while ( ! -f "$mysqllog/DBHOST" ) { @@ -183,6 +184,6 @@ # Else, SQLite mode # Run Nextflow pipeline print( "Run NEXTFLOW\n") ; - system( "$nextflow run $nfparams -bg main.nf $resumeStr --config $confFile" ); + system( "$nextflow run $nfparams -bg $nfscript $resumeStr --config $confFile" ); } From ef0d584d5cde12db23cfcc2bbd5d4faab125951d Mon Sep 17 00:00:00 2001 From: Anna Vlasova Date: Fri, 5 Mar 2021 14:09:40 +0100 Subject: [PATCH 069/381] added a new datasets --- dataset/P.vulgaris.gff3.gz | Bin 0 -> 3396 bytes dataset/P.vulgaris.proteins.fa.gz | Bin 0 -> 5063 bytes dataset/README.md | 22 +++++++++++++++--- ...dotorula_toruloides.selected_genes.gff3.gz | Bin 0 -> 1264 bytes ...otorula_toruloides.selected_proteins.fa.gz | Bin 0 -> 2465 bytes dataset/aMicUni.selected_genes.gff.gz | Bin 0 -> 3604 bytes dataset/aMicUni.selected_proteins.fa.gz | Bin 0 -> 1473 bytes 7 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 dataset/P.vulgaris.gff3.gz create mode 100644 dataset/P.vulgaris.proteins.fa.gz create mode 100644 dataset/Rhodotorula_toruloides.selected_genes.gff3.gz create mode 100644 dataset/Rhodotorula_toruloides.selected_proteins.fa.gz create mode 100644 dataset/aMicUni.selected_genes.gff.gz create mode 100644 dataset/aMicUni.selected_proteins.fa.gz diff --git a/dataset/P.vulgaris.gff3.gz b/dataset/P.vulgaris.gff3.gz new file mode 100644 index 0000000000000000000000000000000000000000..bd9cae37db6bca6c1388c19b83a08d120e0e85fe GIT binary patch literal 3396 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 aW^=q7Gz!l}O~ literal 0 HcmV?d00001 diff --git a/dataset/P.vulgaris.proteins.fa.gz b/dataset/P.vulgaris.proteins.fa.gz new file mode 100644 index 0000000000000000000000000000000000000000..0d9887bfbe19159f9c9987d5a9dd6908673989ec GIT binary patch literal 5063 zcmV;&6FBT2iwFquCqiHV15hq@b!=y0a%poeaB^>SWod46E@oi>y_(66Bsp@1@BSz{ zb@f_(8Gv%GppoDPI{5xCqR*mg25Ob74;nz(iO#Hua5`zUf1~F=S~N5Lr!(ctPyQ$U z`qI8!B^k*+>=|5$XY#|WCE|U$&Dq8r^UNnS36G>UUAm{ZJ-i7$th&whj~_<;g;7PC zF}I{y?Or*{9j1-LJZFt?x0z3PjFA<@$Vtij*+L0xw`cFlO-_?>M!5DJLNari{V8F<$JGMM+Ju&S?qQDvW4BDko+0!ulKjO&<~CxuE`+^8VIRbW@h}G?vbJ8rM_LfRmh8RK3?rOr z_#of1i*J`re#oXQOJbMa?b)uFAtSgc!zA&;CDSUK#WIbRkOspU@kz`y(@S7>*J`aB z`vfVexH@Lwj-B-^R+SRNP)gf=tjL$2wIXdsBQ>Yt-4J8TNMfyHtU*7;Y;s;QQ?fPe zP*y%xcCBJ}@T}&@HZkvX?M2U2E4H8dxY;F!Njt1znRw1=j<9lC;w4+##hv8n6xysOxe4nI&WsyUCA}G1eYb$D2?0DXjCUtmpmmi_4L+wUw&hOd(%~0 zLdm<^IH_!1!JEyd?6U9W_niK(7+SuGGh>3Gx!3lkmP`Ed6tf2}vy?k}FbOU|hItsP zOg=yx?&emmsj%B{H zxw*44I0aFq(C)W2Paaacdt}-iFCXXft4_cmW|ZBeoO*1meF`{sY$h|6W389B75%9z zT65UZS$H+jhE2!q?4){YXV2oNu!zjmCd17$oJ@v=N=>GqaBWW#Cggmm=5XeNBreQ3 z^a%QW-I8SH?8@mRJcK{}uK7G!`RvCqYpY`yenKz;XY40G-F3CyG zW4&*E_@}k(@76DnPA8Ri?kKLyzlTZ1_NAO@OG_ik^erNlCv~7VWpEu>%Bi2ebBCrZ#_8 z<5H75S}?20lG5siPPG?RwuctYX1cc-e+XO3$R#=`r$(@_hBBjL-Oa)EhQ4uqR7LKj zw^Mww>1{LSdYqv@Qg+#2jX8nZ%nQ?nfFM`;9HQjIypkIlby(cYCMv1TwS0#>CFB6C zUJLs5|1iDr|2Dl}w6%(H$flo(pOPRmgZy!&q5tXLLt{59OEpg*J5=17-qD~~k?6sU z>6LsT3c$lz-ge&IeF2%gxd7Qiy}(068P=@K(~r{&gQScWLOHx^j2*a?Yl^bi246sH z;5}BvXiPip-eKejrfW)0q_keqJ&P-um>z(ZC<;Y{b2G&6tDOT_-zZlu&%PPNdYfS8 zlyX8zO|{*c)?)8fY7wg-?3KmPxG%-}fMaLHVK3YH(09g{Ktfm!C~Z3KY!FrIqa?p4 zwAZQ{oNNM>00?`}Qp3e&sl*yAjoa9Qw($b!JLYKEkQ)+<2Lv+UkmB?SnV%JsgF*!s zpHNZ8Ytl&w(6@Vx6qFSeY++Y+C>hZ2*aqy&%5BmqQgzA}F*;PRzqQ0KA5S=EP7Qh! zP)^sjTpFf9!kSaRv!f4a-n_#Z(c5L_J^>2HFz~W*@U~oVEKP)Sf{!4P=VtePQx$9` zMWmy{N^o}ye!a{@J#w)(ZZNZi5<1LEj1

iPmAZq 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 literal 0 HcmV?d00001 diff --git a/dataset/README.md b/dataset/README.md index fee9c02..4d465e3 100644 --- a/dataset/README.md +++ b/dataset/README.md @@ -5,10 +5,26 @@ curl -L http://www.geneontology.org/ontology/go.obo > gene_ontology_ext.obo ## Example Dataset +### Phaesolus vulgaris (plant) + Ref: https://doi.org/10.1186/s13059-016-0883-6 -Phaesolus vulgaris (GFF and protein files) +* P.vulgaris.gff3.gz +* P.vulgaris.proteins.fa.gz + +### Microcaecilia unicolor (amphibian) + +Ref: https://www.ncbi.nlm.nih.gov/assembly/GCF_901765095.1 + +* aMicUni.selected_genes.gff.gz +* aMicUni.selected_proteins.fa.gz + +### Rhodotorula toruloides (fungi) + +Ref: https://fungi.ensembl.org/Rhodotorula_toruloides_gca_001255795/Info/Index + +* Rhodotorula_toruloides.selected_genes.gff3.gz +* Rhodotorula_toruloides.selected_proteins.fa.gz + -* P.vulgaris.gff3 -* P.vulgaris.proteins.fa diff --git a/dataset/Rhodotorula_toruloides.selected_genes.gff3.gz b/dataset/Rhodotorula_toruloides.selected_genes.gff3.gz new file mode 100644 index 0000000000000000000000000000000000000000..23183265a32fcc78233e4a783cfdc18c106d9d1c GIT binary patch literal 1264 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 literal 0 HcmV?d00001 diff --git a/dataset/aMicUni.selected_proteins.fa.gz b/dataset/aMicUni.selected_proteins.fa.gz new file mode 100644 index 0000000000000000000000000000000000000000..af24c24a7a5944d480cb671316414f67b7c9182c GIT binary patch literal 1473 zcmV;y1wQ&8iwFoZC_-QW17S^RV^wZxE^}pUWn*+@WM6P{Z**m8ZgVbXVE|2*&5k6w z4TSIcFvg6%3)`0k1c~|qDS;9R=IZ44e+x&>X{ykTs&1u{`WO++zy8+${rK09AAkJ( zT#2lMM5-Wq}nJl2g?ezE-lfP zXeX8s=gGEgL>k6L8%PW)>5=QFCmdFd4~GvKyG(K^bXaeN{FhegNxe$iX#b8K3xCRO6dZh5P~jqDIj#3i>!Y~aqTMb&9xv*? zs131*W3n#Mc+MUL*S3hYQvw7uhjsW|J~TW=aESsjP~ED*7mGJFNvT70XjU{<0*4P`~5(8o=PXOr#6%@YNRS$<3CSR={?f_A)HFqq|%wX|W_{haR( z!=%Lv@uZ2L1i?xY$q#-(zqutyouU7dtCj-zv}6QsKuO^-nFVD5+}I0l-FHCatCvR{wjnGJNZIwXGuhfRopBF$RKnEjy4Pm$B&|zSP)8@Cl}%lah@8jS z*l#Z}6nzkCiDp%O%ZmzJ>G(rQAQYZ;%>Zbbf zXymADm&y%+*rbH_yuA&wxOvrM43SkNuru=E!onr(ElA(fM_c8KqNr%Wa;>3dj%2G! zPj`guAm;4FTrP)&r&CHiT5AJLg-l0fZm8ueM{tX=65W(9C*q1jBAESP3<$CeHk3Y= z?K~%<{aIgA5nK%~YpqtY$|uILV;fl0{6c|wo1=W|)~vSPEYVaR5LJ8@c`yvVZ_xG# zZH#UmWSIMaY7$8ZwwSJyJXG?uex(z zYPsADO=`*u4f6ps4X(R>Df@*Kks>#6+$Nd%^_7AC5v0#>Z3~$K-DG4ua3=%$$lg6>L0P-c=!JNS43p4V(;zzUy}$|Nh0J z{(`R`{sPs2s{`HH0*Yu}?1S(Z$OJ|eFy0s@Hq*KTCSzoj9DN^w%s4Hi2H#Kq6g(3i z0vJXR8eKNOOE4H>bPRh!iYLr|qXZ9}DoBMed6wa$*KO@^3z(cU0*Sx<;P!=Dc1IQI z$iia-RBR{m35C$QrKHF25r5!c8Hg!7?R@E@(6L@TDZy0DH)0&u*w&M9qy?Ek>hPn2 bIuv>F1aTAM@VOXN{XG8%Nn}&)cL@LhTQ}Ap literal 0 HcmV?d00001 From aada2d849c1dccbdf39e1d330d6bd88e9a9b4113 Mon Sep 17 00:00:00 2001 From: Anna Vlasova Date: Fri, 5 Mar 2021 14:09:59 +0100 Subject: [PATCH 070/381] added a new datasets --- dataset/P.vulgaris.gff3 | 200 --------------------------------- dataset/P.vulgaris.proteins.fa | 191 ------------------------------- 2 files changed, 391 deletions(-) delete mode 100644 dataset/P.vulgaris.gff3 delete mode 100644 dataset/P.vulgaris.proteins.fa diff --git a/dataset/P.vulgaris.gff3 b/dataset/P.vulgaris.gff3 deleted file mode 100644 index c48376b..0000000 --- a/dataset/P.vulgaris.gff3 +++ /dev/null @@ -1,200 +0,0 @@ -contig100003 CNAG mRNA 100 288 . - . ID=PHASIBEAM10F000001T1;Parent=PHASIBEAM10F000001;Name=PHASIBEAM10F000001;product=PHASIBEAM10F000001P1;partial_cds=true -contig100003 CNAG exon 100 288 . - . Parent=PHASIBEAM10F000001T1;ID=PHASIBEAM10F000001T1.exon1;Name=PHASIBEAM10F000001T1 -contig100003 CNAG CDS 100 288 . - 0 Parent=PHASIBEAM10F000001T1;ID=PHASIBEAM10F000001C1;partial_cds=true;Name=PHASIBEAM10F000001C1 -contig100033 CNAG mRNA 104 370 . + . ID=PHASIBEAM10F000003T1;Parent=PHASIBEAM10F000003;Name=PHASIBEAM10F000003;product=PHASIBEAM10F000003P1;partial_cds=true -contig100033 CNAG exon 104 370 . + . Parent=PHASIBEAM10F000003T1;ID=PHASIBEAM10F000003T1.exon1;Name=PHASIBEAM10F000003T1 -contig100033 CNAG CDS 104 370 . + 0 Parent=PHASIBEAM10F000003T1;ID=PHASIBEAM10F000003C1;partial_cds=true;Name=PHASIBEAM10F000003C1 -contig100053 CNAG mRNA 57 388 . - . ID=PHASIBEAM10F000004T1;Parent=PHASIBEAM10F000004;Name=PHASIBEAM10F000004;product=PHASIBEAM10F000004P1;partial_cds=true -contig100053 CNAG exon 57 388 . - . Parent=PHASIBEAM10F000004T1;ID=PHASIBEAM10F000004T1.exon1;Name=PHASIBEAM10F000004T1 -contig100053 CNAG CDS 57 388 . - 1 Parent=PHASIBEAM10F000004T1;ID=PHASIBEAM10F000004C1;partial_cds=true;Name=PHASIBEAM10F000004C1 -contig100229 CNAG mRNA 4 747 . - . ID=PHASIBEAM10F000008T1;Parent=PHASIBEAM10F000008;Name=PHASIBEAM10F000008;product=PHASIBEAM10F000008P1;partial_cds=true -contig100229 CNAG exon 4 747 . - . Parent=PHASIBEAM10F000008T1;ID=PHASIBEAM10F000008T1.exon1;Name=PHASIBEAM10F000008T1 -contig100229 CNAG CDS 4 747 . - 0 Parent=PHASIBEAM10F000008T1;ID=PHASIBEAM10F000008C1;partial_cds=true;Name=PHASIBEAM10F000008C1 -contig100828 CNAG mRNA 5 1132 . + . ID=PHASIBEAM10F000012T1;Parent=PHASIBEAM10F000012;Name=PHASIBEAM10F000012;product=PHASIBEAM10F000012P1;partial_cds=true -contig100828 CNAG exon 5 306 . + . Parent=PHASIBEAM10F000012T1;ID=PHASIBEAM10F000012T1.exon1;Name=PHASIBEAM10F000012T1 -contig100828 CNAG exon 412 611 . + . Parent=PHASIBEAM10F000012T1;ID=PHASIBEAM10F000012T1.exon2;Name=PHASIBEAM10F000012T1 -contig100828 CNAG exon 678 1132 . + . Parent=PHASIBEAM10F000012T1;ID=PHASIBEAM10F000012T1.exon3;Name=PHASIBEAM10F000012T1 -contig100828 CNAG CDS 159 306 . + 0 Parent=PHASIBEAM10F000012T1;ID=PHASIBEAM10F000012C1;partial_cds=true;Name=PHASIBEAM10F000012C1 -contig100828 CNAG CDS 412 611 . + 2 Parent=PHASIBEAM10F000012T1;ID=PHASIBEAM10F000012C1;Name=PHASIBEAM10F000012C1 -contig100828 CNAG CDS 678 929 . + 0 Parent=PHASIBEAM10F000012T1;ID=PHASIBEAM10F000012C1;Name=PHASIBEAM10F000012C1 -contig100983 CNAG mRNA 45 461 . + . ID=PHASIBEAM10F000015T1;Parent=PHASIBEAM10F000015;Name=PHASIBEAM10F000015;product=PHASIBEAM10F000015P1;partial_cds=true -contig100983 CNAG exon 45 461 . + . Parent=PHASIBEAM10F000015T1;ID=PHASIBEAM10F000015T1.exon1;Name=PHASIBEAM10F000015T1 -contig100983 CNAG CDS 45 461 . + 0 Parent=PHASIBEAM10F000015T1;ID=PHASIBEAM10F000015C1;partial_cds=true;Name=PHASIBEAM10F000015C1 -contig100990 CNAG mRNA 1 1129 . - . ID=PHASIBEAM10F000016T1;Parent=PHASIBEAM10F000016;product=PHASIBEAM10F000016P1;partial_cds=true -contig100990 CNAG exon 1 1129 . - . ID=PHASIBEAM10F000016T1.exon1;Parent=PHASIBEAM10F000016T1;Name=PHASIBEAM10F000016T1 -contig100990 CNAG CDS 466 1128 . - 0 ID=PHASIBEAM10F000016C1;Parent=PHASIBEAM10F000016T1; 5_prime_partial=true;Name=PHASIBEAM10F000016C1 -contig100994 CNAG mRNA 201 1130 . - . ID=PHASIBEAM10F000018T1;Parent=PHASIBEAM10F000018;Name=PHASIBEAM10F000018;product=PHASIBEAM10F000018P1;partial_cds=true -contig100994 CNAG exon 201 573 . - . Parent=PHASIBEAM10F000018T1;ID=PHASIBEAM10F000018T1.exon2;Name=PHASIBEAM10F000018T1 -contig100994 CNAG exon 749 1130 . - . Parent=PHASIBEAM10F000018T1;ID=PHASIBEAM10F000018T1.exon1;Name=PHASIBEAM10F000018T1 -contig100994 CNAG CDS 286 573 . - 0 Parent=PHASIBEAM10F000018T1;ID=PHASIBEAM10F000018C1;Name=PHASIBEAM10F000018C1 -contig100994 CNAG CDS 749 1015 . - 0 Parent=PHASIBEAM10F000018T1;ID=PHASIBEAM10F000018C1;partial_cds=true;Name=PHASIBEAM10F000018C1 -contig101005 CNAG mRNA 63 1072 . - . ID=PHASIBEAM10F000019T1;Parent=PHASIBEAM10F000019;Name=PHASIBEAM10F000019;product=PHASIBEAM10F000019P1;partial_cds=true -contig101005 CNAG exon 63 356 . - . Parent=PHASIBEAM10F000019T1;ID=PHASIBEAM10F000019T1.exon2;Name=PHASIBEAM10F000019T1 -contig101005 CNAG exon 467 1072 . - . Parent=PHASIBEAM10F000019T1;ID=PHASIBEAM10F000019T1.exon1;Name=PHASIBEAM10F000019T1 -contig101005 CNAG CDS 63 356 . - 0 Parent=PHASIBEAM10F000019T1;ID=PHASIBEAM10F000019C1;Name=PHASIBEAM10F000019C1 -contig101005 CNAG CDS 467 1072 . - 0 Parent=PHASIBEAM10F000019T1;ID=PHASIBEAM10F000019C1;partial_cds=true;Name=PHASIBEAM10F000019C1 -contig101014 CNAG mRNA 644 892 . + . ID=PHASIBEAM10F000020T1;Parent=PHASIBEAM10F000020;Name=PHASIBEAM10F000020;product=PHASIBEAM10F000020P1;partial_cds=true -contig101014 CNAG exon 644 892 . + . Parent=PHASIBEAM10F000020T1;ID=PHASIBEAM10F000020T1.exon1;Name=PHASIBEAM10F000020T1 -contig101014 CNAG CDS 644 892 . + 0 Parent=PHASIBEAM10F000020T1;ID=PHASIBEAM10F000020C1;partial_cds=true;Name=PHASIBEAM10F000020C1 -contig101018 CNAG mRNA 313 1129 . + . ID=PHASIBEAM10F000021T1;Parent=PHASIBEAM10F000021;Name=PHASIBEAM10F000021;product=PHASIBEAM10F000021P1;partial_cds=true -contig101018 CNAG exon 313 1129 . + . Parent=PHASIBEAM10F000021T1;ID=PHASIBEAM10F000021T1.exon1;Name=PHASIBEAM10F000021T1 -contig101018 CNAG CDS 668 1126 . + 0 Parent=PHASIBEAM10F000021T1;ID=PHASIBEAM10F000021C1;partial_cds=true;Name=PHASIBEAM10F000021C1 -contig101047 CNAG mRNA 144 1089 . - . ID=PHASIBEAM10F000022T1;Parent=PHASIBEAM10F000022;Name=PHASIBEAM10F000022;product=PHASIBEAM10B003213P1; -contig101047 CNAG exon 144 494 . - . ID=PHASIBEAM10F000022T1.exon2;Parent=PHASIBEAM10F000022T1;Name=PHASIBEAM10F000022T1 -contig101047 CNAG exon 1036 1089 . - . ID=PHASIBEAM10F000022T1.exon1;Parent=PHASIBEAM10F000022T1;Name=PHASIBEAM10F000022T1 -contig101047 CNAG CDS 144 494 . - 0 ID=PHASIBEAM10F000022C1;Parent=PHASIBEAM10F000022T1;Name=PHASIBEAM10F000022C1 -contig101047 CNAG CDS 1036 1089 . - 0 ID=PHASIBEAM10F000022C1;Parent=PHASIBEAM10F000022T1;Name=PHASIBEAM10F000022C1 -contig101247 CNAG mRNA 144 1084 . - . ID=PHASIBEAM10F000028T1;Parent=PHASIBEAM10F000028;Name=PHASIBEAM10F000028;product=PHASIBEAM10B023363P1; -contig101247 CNAG exon 144 494 . - . ID=PHASIBEAM10F000028T1.exon2;Parent=PHASIBEAM10F000028T1;Name=PHASIBEAM10F000028T1 -contig101247 CNAG exon 1031 1084 . - . ID=PHASIBEAM10F000028T1.exon1;Parent=PHASIBEAM10F000028T1;Name=PHASIBEAM10F000028T1 -contig101247 CNAG CDS 144 494 . - 0 ID=PHASIBEAM10F000028C1;Parent=PHASIBEAM10F000028T1;Name=PHASIBEAM10F000028C1 -contig101247 CNAG CDS 1031 1084 . - 0 ID=PHASIBEAM10F000028C1;Parent=PHASIBEAM10F000028T1;Name=PHASIBEAM10F000028C1 -contig101294 CNAG mRNA 189 1120 . + . ID=PHASIBEAM10F000030T1;Parent=PHASIBEAM10F000030;Name=PHASIBEAM10F000030;product=PHASIBEAM10F000030P1;partial_cds=true -contig101294 CNAG exon 189 1120 . + . Parent=PHASIBEAM10F000030T1;ID=PHASIBEAM10F000030T1.exon1;Name=PHASIBEAM10F000030T1 -contig101294 CNAG CDS 295 1120 . + 0 Parent=PHASIBEAM10F000030T1; 3_prime_partial=true;ID=PHASIBEAM10F000030C1;partial_cds=true;Name=PHASIBEAM10F000030C1 -contig101356 CNAG mRNA 430 1044 . - . ID=PHASIBEAM10F000031T1;Parent=PHASIBEAM10F000031;Name=PHASIBEAM10F000031;product=PHASIBEAM10F000031P1;partial_cds=true -contig101356 CNAG exon 430 1044 . - . Parent=PHASIBEAM10F000031T1;ID=PHASIBEAM10F000031T1.exon1;Name=PHASIBEAM10F000031T1 -contig101356 CNAG CDS 430 1044 . - 0 Parent=PHASIBEAM10F000031T1;ID=PHASIBEAM10F000031C1;partial_cds=true;Name=PHASIBEAM10F000031C1 -contig101547 CNAG mRNA 113 741 . - . ID=PHASIBEAM10F000033T1;Parent=PHASIBEAM10F000033;Name=PHASIBEAM10F000033;product=PHASIBEAM10F000033P1;partial_cds=true -contig101547 CNAG exon 113 143 . - . Parent=PHASIBEAM10F000033T1;ID=PHASIBEAM10F000033T1.exon2;Name=PHASIBEAM10F000033T1 -contig101547 CNAG exon 371 741 . - . Parent=PHASIBEAM10F000033T1;ID=PHASIBEAM10F000033T1.exon1;Name=PHASIBEAM10F000033T1 -contig101547 CNAG CDS 113 143 . - 1 Parent=PHASIBEAM10F000033T1; 3_prime_partial=true;ID=PHASIBEAM10F000033C1;Name=PHASIBEAM10F000033C1 -contig101547 CNAG CDS 371 681 . - 0 Parent=PHASIBEAM10F000033T1;ID=PHASIBEAM10F000033C1;partial_cds=true;Name=PHASIBEAM10F000033C1 -contig101582 CNAG mRNA 349 1008 . + . ID=PHASIBEAM10F000034T1;Parent=PHASIBEAM10F000034;Name=PHASIBEAM10F000034;product=PHASIBEAM10F000034P1;partial_cds=true -contig101582 CNAG exon 349 519 . + . Parent=PHASIBEAM10F000034T1;ID=PHASIBEAM10F000034T1.exon1;Name=PHASIBEAM10F000034T1 -contig101582 CNAG exon 914 1008 . + . Parent=PHASIBEAM10F000034T1;ID=PHASIBEAM10F000034T1.exon2;Name=PHASIBEAM10F000034T1 -contig101582 CNAG CDS 358 519 . + 0 Parent=PHASIBEAM10F000034T1;ID=PHASIBEAM10F000034C1;partial_cds=true;Name=PHASIBEAM10F000034C1 -contig101582 CNAG CDS 914 985 . + 0 Parent=PHASIBEAM10F000034T1;ID=PHASIBEAM10F000034C1;Name=PHASIBEAM10F000034C1 -contig101680 CNAG mRNA 46 636 . + . ID=PHASIBEAM10F000038T1;Parent=PHASIBEAM10F000038;Name=PHASIBEAM10F000038;product=PHASIBEAM10F000038P1;partial_cds=true -contig101680 CNAG exon 46 636 . + . Parent=PHASIBEAM10F000038T1;ID=PHASIBEAM10F000038T1.exon1;Name=PHASIBEAM10F000038T1 -contig101680 CNAG CDS 46 636 . + 0 Parent=PHASIBEAM10F000038T1;ID=PHASIBEAM10F000038C1;partial_cds=true;Name=PHASIBEAM10F000038C1 -contig101823 CNAG mRNA 131 1079 . - . ID=PHASIBEAM10F000043T1;Parent=PHASIBEAM10F000043;Name=PHASIBEAM10F000043;product=PHASIBEAM10F000043P1;partial_cds=true -contig101823 CNAG exon 131 405 . - . Parent=PHASIBEAM10F000043T1;ID=PHASIBEAM10F000043T1.exon2;Name=PHASIBEAM10F000043T1 -contig101823 CNAG exon 1073 1079 . - . Parent=PHASIBEAM10F000043T1;ID=PHASIBEAM10F000043T1.exon1;Name=PHASIBEAM10F000043T1 -contig101823 CNAG CDS 131 405 . - 2 Parent=PHASIBEAM10F000043T1;ID=PHASIBEAM10F000043C1;Name=PHASIBEAM10F000043C1 -contig101823 CNAG CDS 1073 1079 . - 0 Parent=PHASIBEAM10F000043T1;ID=PHASIBEAM10F000043C1;partial_cds=true;Name=PHASIBEAM10F000043C1 -contig101857 CNAG mRNA 335 1019 . - . ID=PHASIBEAM10F000044T1;Parent=PHASIBEAM10F000044;Name=PHASIBEAM10F000044;product=PHASIBEAM10F000044P1;partial_cds=true -contig101857 CNAG exon 335 667 . - . Parent=PHASIBEAM10F000044T1;ID=PHASIBEAM10F000044T1.exon2;Name=PHASIBEAM10F000044T1 -contig101857 CNAG exon 768 1019 . - . Parent=PHASIBEAM10F000044T1;ID=PHASIBEAM10F000044T1.exon1;Name=PHASIBEAM10F000044T1 -contig101857 CNAG CDS 335 667 . - 0 Parent=PHASIBEAM10F000044T1;ID=PHASIBEAM10F000044C1;Name=PHASIBEAM10F000044C1 -contig101857 CNAG CDS 768 1019 . - 0 Parent=PHASIBEAM10F000044T1;ID=PHASIBEAM10F000044C1;partial_cds=true;Name=PHASIBEAM10F000044C1 -contig101929 CNAG mRNA 191 996 . + . ID=PHASIBEAM10F000046T1;Parent=PHASIBEAM10F000046;Name=PHASIBEAM10F000046;product=PHASIBEAM10F000046P1;partial_cds=true -contig101929 CNAG exon 191 627 . + . Parent=PHASIBEAM10F000046T1;ID=PHASIBEAM10F000046T1.exon1;Name=PHASIBEAM10F000046T1 -contig101929 CNAG exon 757 996 . + . Parent=PHASIBEAM10F000046T1;ID=PHASIBEAM10F000046T1.exon2;Name=PHASIBEAM10F000046T1 -contig101929 CNAG CDS 427 627 . + 0 Parent=PHASIBEAM10F000046T1;ID=PHASIBEAM10F000046C1;partial_cds=true;Name=PHASIBEAM10F000046C1 -contig101929 CNAG CDS 757 996 . + 0 Parent=PHASIBEAM10F000046T1; 3_prime_partial=true;ID=PHASIBEAM10F000046C1;Name=PHASIBEAM10F000046C1 -contig102107 CNAG mRNA 7 582 . - . ID=PHASIBEAM10F000049T1;Parent=PHASIBEAM10F000049;Name=PHASIBEAM10F000049;product=PHASIBEAM10F000049P1;partial_cds=true -contig102107 CNAG exon 7 582 . - . Parent=PHASIBEAM10F000049T1;ID=PHASIBEAM10F000049T1.exon1;Name=PHASIBEAM10F000049T1 -contig102107 CNAG CDS 7 582 . - 0 Parent=PHASIBEAM10F000049T1;ID=PHASIBEAM10F000049C1;partial_cds=true;Name=PHASIBEAM10F000049C1 -contig102107 CNAG mRNA 632 1036 . - . ID=PHASIBEAM10F000050T1;Parent=PHASIBEAM10F000050;Name=PHASIBEAM10F000050;product=PHASIBEAM10F000050P1;partial_cds=true -contig102107 CNAG exon 632 1036 . - . Parent=PHASIBEAM10F000050T1;ID=PHASIBEAM10F000050T1.exon1;Name=PHASIBEAM10F000050T1 -contig102107 CNAG CDS 632 1036 . - 0 Parent=PHASIBEAM10F000050T1;ID=PHASIBEAM10F000050C1;partial_cds=true;Name=PHASIBEAM10F000050C1 -contig102125 CNAG mRNA 254 911 . + . ID=PHASIBEAM10F000051T1;Parent=PHASIBEAM10F000051;Name=PHASIBEAM10F000051;product=PHASIBEAM10F000051P1;partial_cds=true -contig102125 CNAG exon 254 911 . + . Parent=PHASIBEAM10F000051T1;ID=PHASIBEAM10F000051T1.exon1;Name=PHASIBEAM10F000051T1 -contig102125 CNAG CDS 254 911 . + 1 Parent=PHASIBEAM10F000051T1;ID=PHASIBEAM10F000051C1;partial_cds=true;Name=PHASIBEAM10F000051C1 -contig102511 CNAG mRNA 482 875 . - . ID=PHASIBEAM10F000056T1;Parent=PHASIBEAM10F000056;Name=PHASIBEAM10F000056;product=PHASIBEAM10F000056P1;partial_cds=true -contig102511 CNAG exon 482 875 . - . Parent=PHASIBEAM10F000056T1;ID=PHASIBEAM10F000056T1.exon1;Name=PHASIBEAM10F000056T1 -contig102511 CNAG CDS 482 873 . - 0 Parent=PHASIBEAM10F000056T1; 5_prime_partial=true; 3_prime_partial=true;ID=PHASIBEAM10F000056C1;partial_cds=true;Name=PHASIBEAM10F000056C1 -contig102567 CNAG mRNA 402 968 . - . ID=PHASIBEAM10F000058T1;Parent=PHASIBEAM10F000058;Name=PHASIBEAM10F000058;product=PHASIBEAM10F000058P1;partial_cds=true -contig102567 CNAG exon 402 968 . - . Parent=PHASIBEAM10F000058T1;ID=PHASIBEAM10F000058T1.exon1;Name=PHASIBEAM10F000058T1 -contig102567 CNAG CDS 402 968 . - 0 Parent=PHASIBEAM10F000058T1;ID=PHASIBEAM10F000058C1;partial_cds=true;Name=PHASIBEAM10F000058C1 -contig102576 CNAG mRNA 4 940 . + . ID=PHASIBEAM10F000059T1;Parent=PHASIBEAM10F000059;Name=PHASIBEAM10F000059;product=PHASIBEAM10F000059P1;partial_cds=true -contig102576 CNAG exon 4 148 . + . Parent=PHASIBEAM10F000059T1;ID=PHASIBEAM10F000059T1.exon1;Name=PHASIBEAM10F000059T1 -contig102576 CNAG exon 258 472 . + . Parent=PHASIBEAM10F000059T1;ID=PHASIBEAM10F000059T1.exon2;Name=PHASIBEAM10F000059T1 -contig102576 CNAG exon 689 940 . + . Parent=PHASIBEAM10F000059T1;ID=PHASIBEAM10F000059T1.exon3;Name=PHASIBEAM10F000059T1 -contig102576 CNAG CDS 4 148 . + 0 Parent=PHASIBEAM10F000059T1;ID=PHASIBEAM10F000059C1;partial_cds=true;Name=PHASIBEAM10F000059C1 -contig102576 CNAG CDS 258 472 . + 2 Parent=PHASIBEAM10F000059T1;ID=PHASIBEAM10F000059C1;Name=PHASIBEAM10F000059C1 -contig102576 CNAG CDS 689 940 . + 0 Parent=PHASIBEAM10F000059T1;ID=PHASIBEAM10F000059C1;Name=PHASIBEAM10F000059C1 -contig102628 CNAG mRNA 14 1061 . - . ID=PHASIBEAM10F000061T1;Parent=PHASIBEAM10F000061;Name=PHASIBEAM10F000061;product=PHASIBEAM10F000061P1;partial_cds=true -contig102628 CNAG exon 14 1061 . - . Parent=PHASIBEAM10F000061T1;ID=PHASIBEAM10F000061T1.exon1;Name=PHASIBEAM10F000061T1 -contig102628 CNAG CDS 14 1061 . - 0 Parent=PHASIBEAM10F000061T1; 3_prime_partial=true;ID=PHASIBEAM10F000061C1;partial_cds=true;Name=PHASIBEAM10F000061C1 -contig102778 CNAG mRNA 790 979 . - . ID=PHASIBEAM10F000064T1;Parent=PHASIBEAM10F000064;Name=PHASIBEAM10F000064;product=PHASIBEAM10F000064P1;partial_cds=true -contig102778 CNAG exon 790 979 . - . Parent=PHASIBEAM10F000064T1;ID=PHASIBEAM10F000064T1.exon1;Name=PHASIBEAM10F000064T1 -contig102778 CNAG CDS 790 979 . - 0 Parent=PHASIBEAM10F000064T1;ID=PHASIBEAM10F000064C1;partial_cds=true;Name=PHASIBEAM10F000064C1 -contig102829 CNAG mRNA 28 963 . - . ID=PHASIBEAM10F000068T1;Parent=PHASIBEAM10F000068;Name=PHASIBEAM10F000068;product=PHASIBEAM10F000068P1;partial_cds=true -contig102829 CNAG exon 28 147 . - . Parent=PHASIBEAM10F000068T1;ID=PHASIBEAM10F000068T1.exon3;Name=PHASIBEAM10F000068T1 -contig102829 CNAG exon 217 353 . - . Parent=PHASIBEAM10F000068T1;ID=PHASIBEAM10F000068T1.exon2;Name=PHASIBEAM10F000068T1 -contig102829 CNAG exon 906 963 . - . Parent=PHASIBEAM10F000068T1;ID=PHASIBEAM10F000068T1.exon1;Name=PHASIBEAM10F000068T1 -contig102829 CNAG CDS 28 147 . - 0 Parent=PHASIBEAM10F000068T1;ID=PHASIBEAM10F000068C1;Name=PHASIBEAM10F000068C1 -contig102829 CNAG CDS 217 353 . - 2 Parent=PHASIBEAM10F000068T1;ID=PHASIBEAM10F000068C1;Name=PHASIBEAM10F000068C1 -contig102829 CNAG CDS 906 963 . - 0 Parent=PHASIBEAM10F000068T1;ID=PHASIBEAM10F000068C1;partial_cds=true;Name=PHASIBEAM10F000068C1 -contig102875 CNAG mRNA 242 1032 . + . ID=PHASIBEAM10F000070T1;Parent=PHASIBEAM10F000070;Name=PHASIBEAM10F000070;product=PHASIBEAM10F000070P1;partial_cds=true -contig102875 CNAG exon 242 295 . + . Parent=PHASIBEAM10F000070T1;ID=PHASIBEAM10F000070T1.exon1;Name=PHASIBEAM10F000070T1 -contig102875 CNAG exon 397 1032 . + . Parent=PHASIBEAM10F000070T1;ID=PHASIBEAM10F000070T1.exon2;Name=PHASIBEAM10F000070T1 -contig102875 CNAG CDS 242 295 . + 0 Parent=PHASIBEAM10F000070T1;ID=PHASIBEAM10F000070C1;partial_cds=true;Name=PHASIBEAM10F000070C1 -contig102875 CNAG CDS 397 1032 . + 0 Parent=PHASIBEAM10F000070T1;ID=PHASIBEAM10F000070C1;Name=PHASIBEAM10F000070C1 -contig102925 CNAG mRNA 25 1004 . - . ID=PHASIBEAM10F000071T1;Parent=PHASIBEAM10F000071;Name=PHASIBEAM10F000071;product=PHASIBEAM10F000071P1;partial_cds=true -contig102925 CNAG exon 25 1004 . - . Parent=PHASIBEAM10F000071T1;ID=PHASIBEAM10F000071T1.exon1;Name=PHASIBEAM10F000071T1 -contig102925 CNAG CDS 190 720 . - 0 Parent=PHASIBEAM10F000071T1;ID=PHASIBEAM10F000071C1;partial_cds=true;Name=PHASIBEAM10F000071C1 -contig103213 CNAG mRNA 694 1035 . - . ID=PHASIBEAM10F000076T1;Parent=PHASIBEAM10F000076;Name=PHASIBEAM10F000076;product=PHASIBEAM10F000076P1;partial_cds=true -contig103213 CNAG exon 694 1035 . - . Parent=PHASIBEAM10F000076T1;ID=PHASIBEAM10F000076T1.exon1;Name=PHASIBEAM10F000076T1 -contig103213 CNAG CDS 694 1035 . - 0 Parent=PHASIBEAM10F000076T1;ID=PHASIBEAM10F000076C1;partial_cds=true;Name=PHASIBEAM10F000076C1 -contig103411 CNAG mRNA 370 920 . - . ID=PHASIBEAM10F000077T1;Parent=PHASIBEAM10F000077;Name=PHASIBEAM10F000077;product=PHASIBEAM10F000077P1;partial_cds=true -contig103411 CNAG exon 370 920 . - . Parent=PHASIBEAM10F000077T1;ID=PHASIBEAM10F000077T1.exon1;Name=PHASIBEAM10F000077T1 -contig103411 CNAG CDS 370 920 . - 0 Parent=PHASIBEAM10F000077T1;ID=PHASIBEAM10F000077C1;partial_cds=true;Name=PHASIBEAM10F000077C1 -contig103645 CNAG mRNA 163 982 . + . ID=PHASIBEAM10F000082T1;Parent=PHASIBEAM10F000082;Name=PHASIBEAM10F000082;product=PHASIBEAM10F000082P1;partial_cds=true -contig103645 CNAG exon 163 376 . + . Parent=PHASIBEAM10F000082T1;ID=PHASIBEAM10F000082T1.exon1;Name=PHASIBEAM10F000082T1 -contig103645 CNAG exon 492 982 . + . Parent=PHASIBEAM10F000082T1;ID=PHASIBEAM10F000082T1.exon2;Name=PHASIBEAM10F000082T1 -contig103645 CNAG CDS 163 376 . + 0 Parent=PHASIBEAM10F000082T1;ID=PHASIBEAM10F000082C1;partial_cds=true;Name=PHASIBEAM10F000082C1 -contig103645 CNAG CDS 492 982 . + 2 Parent=PHASIBEAM10F000082T1;ID=PHASIBEAM10F000082C1;Name=PHASIBEAM10F000082C1 -contig103770 CNAG mRNA 10 994 . + . ID=PHASIBEAM10F000083T1;Parent=PHASIBEAM10F000083;Name=PHASIBEAM10F000083;product=PHASIBEAM10F000083P1;partial_cds=true -contig103770 CNAG exon 10 994 . + . Parent=PHASIBEAM10F000083T1;ID=PHASIBEAM10F000083T1.exon1;Name=PHASIBEAM10F000083T1 -contig103770 CNAG CDS 388 861 . + 0 Parent=PHASIBEAM10F000083T1;ID=PHASIBEAM10F000083C1;partial_cds=true;Name=PHASIBEAM10F000083C1 -contig103870 CNAG mRNA 423 1013 . - . ID=PHASIBEAM10F000085T1;Parent=PHASIBEAM10F000085;Name=PHASIBEAM10F000085;product=PHASIBEAM10F000085P1;partial_cds=true -contig103870 CNAG exon 423 482 . - . Parent=PHASIBEAM10F000085T1;ID=PHASIBEAM10F000085T1.exon2;Name=PHASIBEAM10F000085T1 -contig103870 CNAG exon 645 1013 . - . Parent=PHASIBEAM10F000085T1;ID=PHASIBEAM10F000085T1.exon1;Name=PHASIBEAM10F000085T1 -contig103870 CNAG CDS 423 482 . - 0 Parent=PHASIBEAM10F000085T1;ID=PHASIBEAM10F000085C1;Name=PHASIBEAM10F000085C1 -contig103870 CNAG CDS 645 1013 . - 0 Parent=PHASIBEAM10F000085T1;ID=PHASIBEAM10F000085C1;partial_cds=true;Name=PHASIBEAM10F000085C1 -contig103952 CNAG mRNA 87 1044 . + . ID=PHASIBEAM10F000086T1;Parent=PHASIBEAM10F000086;Name=PHASIBEAM10F000086;product=PHASIBEAM10F000086P1;partial_cds=true -contig103952 CNAG exon 87 117 . + . Parent=PHASIBEAM10F000086T1;ID=PHASIBEAM10F000086T1.exon1;Name=PHASIBEAM10F000086T1 -contig103952 CNAG exon 628 889 . + . Parent=PHASIBEAM10F000086T1;ID=PHASIBEAM10F000086T1.exon2;Name=PHASIBEAM10F000086T1 -contig103952 CNAG exon 972 1044 . + . Parent=PHASIBEAM10F000086T1;ID=PHASIBEAM10F000086T1.exon3;Name=PHASIBEAM10F000086T1 -contig103952 CNAG CDS 87 117 . + 0 Parent=PHASIBEAM10F000086T1;ID=PHASIBEAM10F000086C1;partial_cds=true;Name=PHASIBEAM10F000086C1 -contig103952 CNAG CDS 628 889 . + 2 Parent=PHASIBEAM10F000086T1;ID=PHASIBEAM10F000086C1;Name=PHASIBEAM10F000086C1 -contig103952 CNAG CDS 972 1044 . + 1 Parent=PHASIBEAM10F000086T1;ID=PHASIBEAM10F000086C1;Name=PHASIBEAM10F000086C1 -contig103999 CNAG mRNA 20 742 . + . ID=PHASIBEAM10F000087T1;Parent=PHASIBEAM10F000087;Name=PHASIBEAM10F000087;product=PHASIBEAM10F000087P1;partial_cds=true -contig103999 CNAG exon 20 742 . + . Parent=PHASIBEAM10F000087T1;ID=PHASIBEAM10F000087T1.exon1;Name=PHASIBEAM10F000087T1 -contig103999 CNAG CDS 20 742 . + 0 Parent=PHASIBEAM10F000087T1;ID=PHASIBEAM10F000087C1;partial_cds=true;Name=PHASIBEAM10F000087C1 -contig104059 CNAG mRNA 467 904 . + . ID=PHASIBEAM10F000089T1;Parent=PHASIBEAM10F000089;Name=PHASIBEAM10F000089;product=PHASIBEAM10F000089P1;partial_cds=true -contig104059 CNAG exon 467 904 . + . Parent=PHASIBEAM10F000089T1;ID=PHASIBEAM10F000089T1.exon1;Name=PHASIBEAM10F000089T1 -contig104059 CNAG CDS 467 904 . + 0 Parent=PHASIBEAM10F000089T1;ID=PHASIBEAM10F000089C1;partial_cds=true;Name=PHASIBEAM10F000089C1 -contig104369 CNAG mRNA 1 1037 . + . ID=PHASIBEAM10F000091T1;Parent=PHASIBEAM10F000091;Name=PHASIBEAM10F000091;product=PHASIBEAM10F000091P1;partial_cds=true -contig104369 CNAG exon 1 197 . + . Parent=PHASIBEAM10F000091T1;ID=PHASIBEAM10F000091T1.exon1;Name=PHASIBEAM10F000091T1 -contig104369 CNAG exon 326 584 . + . Parent=PHASIBEAM10F000091T1;ID=PHASIBEAM10F000091T1.exon2;Name=PHASIBEAM10F000091T1 -contig104369 CNAG exon 688 1037 . + . Parent=PHASIBEAM10F000091T1;ID=PHASIBEAM10F000091T1.exon3;Name=PHASIBEAM10F000091T1 -contig104369 CNAG CDS 3 197 . + 0 Parent=PHASIBEAM10F000091T1; 5_prime_partial=true;ID=PHASIBEAM10F000091C1;partial_cds=true;Name=PHASIBEAM10F000091C1 -contig104369 CNAG CDS 326 584 . + 0 Parent=PHASIBEAM10F000091T1;ID=PHASIBEAM10F000091C1;Name=PHASIBEAM10F000091C1 -contig104369 CNAG CDS 688 878 . + 2 Parent=PHASIBEAM10F000091T1;ID=PHASIBEAM10F000091C1;Name=PHASIBEAM10F000091C1 -contig104524 CNAG mRNA 442 786 . - . ID=PHASIBEAM10F000093T1;Parent=PHASIBEAM10F000093;Name=PHASIBEAM10F000093;product=PHASIBEAM10F000093P1;partial_cds=true -contig104524 CNAG exon 442 786 . - . Parent=PHASIBEAM10F000093T1;ID=PHASIBEAM10F000093T1.exon1;Name=PHASIBEAM10F000093T1 -contig104524 CNAG CDS 442 786 . - 0 Parent=PHASIBEAM10F000093T1;ID=PHASIBEAM10F000093C1;partial_cds=true;Name=PHASIBEAM10F000093C1 -contig104583 CNAG mRNA 492 732 . + . ID=PHASIBEAM10F000094T1;Parent=PHASIBEAM10F000094;Name=PHASIBEAM10F000094;product=PHASIBEAM10B024073P1 -contig104583 CNAG exon 492 732 . + . ID=PHASIBEAM10F000094T1.exon1;Parent=PHASIBEAM10F000094T1;Name=PHASIBEAM10F000094T1 -contig104583 CNAG CDS 492 732 . + 0 ID=PHASIBEAM10F000094C1;Parent=PHASIBEAM10F000094T1;Name=PHASIBEAM10F000094C1 -contig104587 CNAG mRNA 24 635 . + . ID=PHASIBEAM10F000095T1;Parent=PHASIBEAM10F000095;Name=PHASIBEAM10F000095;product=PHASIBEAM10F000095P1;partial_cds=true -contig104587 CNAG exon 24 635 . + . Parent=PHASIBEAM10F000095T1;ID=PHASIBEAM10F000095T1.exon1;Name=PHASIBEAM10F000095T1 -contig104587 CNAG CDS 24 635 . + 0 Parent=PHASIBEAM10F000095T1;ID=PHASIBEAM10F000095C1;partial_cds=true;Name=PHASIBEAM10F000095C1 -contig104587 CNAG mRNA 637 990 . - . ID=PHASIBEAM10F000096T1;Parent=PHASIBEAM10F000096;Name=PHASIBEAM10F000096;product=PHASIBEAM10F000096P1;partial_cds=true -contig104587 CNAG exon 637 990 . - . Parent=PHASIBEAM10F000096T1;ID=PHASIBEAM10F000096T1.exon1;Name=PHASIBEAM10F000096T1 -contig104587 CNAG CDS 637 990 . - 0 Parent=PHASIBEAM10F000096T1;ID=PHASIBEAM10F000096C1;partial_cds=true;Name=PHASIBEAM10F000096C1 -contig104618 CNAG mRNA 1 1030 . - . ID=PHASIBEAM10F000097T1;Parent=PHASIBEAM10F000097;Name=PHASIBEAM10F000097;product=PHASIBEAM10F000097P1;partial_cds=true -contig104618 CNAG exon 1 399 . - . Parent=PHASIBEAM10F000097T1;ID=PHASIBEAM10F000097T1.exon2;Name=PHASIBEAM10F000097T1 -contig104618 CNAG exon 482 1030 . - . Parent=PHASIBEAM10F000097T1;ID=PHASIBEAM10F000097T1.exon1;Name=PHASIBEAM10F000097T1 -contig104618 CNAG CDS 177 399 . - 1 Parent=PHASIBEAM10F000097T1;ID=PHASIBEAM10F000097C1;Name=PHASIBEAM10F000097C1 -contig104618 CNAG CDS 482 879 . - 0 Parent=PHASIBEAM10F000097T1;ID=PHASIBEAM10F000097C1;partial_cds=true;Name=PHASIBEAM10F000097C1 -contig104663 CNAG mRNA 139 833 . - . ID=PHASIBEAM10F000098T1;Parent=PHASIBEAM10F000098;Name=PHASIBEAM10F000098;product=PHASIBEAM10F000098P1;partial_cds=true -contig104663 CNAG exon 139 833 . - . Parent=PHASIBEAM10F000098T1;ID=PHASIBEAM10F000098T1.exon1;Name=PHASIBEAM10F000098T1 -contig104663 CNAG CDS 274 780 . - 0 Parent=PHASIBEAM10F000098T1;ID=PHASIBEAM10F000098C1;partial_cds=true;Name=PHASIBEAM10F000098C1 -contig104981 CNAG mRNA 47 706 . + . ID=PHASIBEAM10F000100T1;Parent=PHASIBEAM10F000100;Name=PHASIBEAM10F000100;product=PHASIBEAM10F000100P1;partial_cds=true -contig104981 CNAG exon 47 706 . + . Parent=PHASIBEAM10F000100T1;ID=PHASIBEAM10F000100T1.exon1;Name=PHASIBEAM10F000100T1 -contig104981 CNAG CDS 47 706 . + 0 Parent=PHASIBEAM10F000100T1;ID=PHASIBEAM10F000100C1;partial_cds=true;Name=PHASIBEAM10F000100C1 -contig105004 CNAG mRNA 2 990 . + . ID=PHASIBEAM10F000101T1;Parent=PHASIBEAM10F000101;Name=PHASIBEAM10F000101;product=PHASIBEAM10F000101P1;partial_cds=true -contig105004 CNAG exon 2 990 . + . Parent=PHASIBEAM10F000101T1;ID=PHASIBEAM10F000101T1.exon1;Name=PHASIBEAM10F000101T1 -contig105004 CNAG CDS 69 788 . + 0 Parent=PHASIBEAM10F000101T1;ID=PHASIBEAM10F000101C1;partial_cds=true;Name=PHASIBEAM10F000101C1 -contig105074 CNAG mRNA 233 769 . + . ID=PHASIBEAM10F000102T1;Parent=PHASIBEAM10F000102;Name=PHASIBEAM10F000102;product=PHASIBEAM10F000102P1;partial_cds=true -contig105074 CNAG exon 233 281 . + . Parent=PHASIBEAM10F000102T1;ID=PHASIBEAM10F000102T1.exon1;Name=PHASIBEAM10F000102T1 -contig105074 CNAG exon 501 566 . + . Parent=PHASIBEAM10F000102T1;ID=PHASIBEAM10F000102T1.exon2;Name=PHASIBEAM10F000102T1 -contig105074 CNAG exon 683 769 . + . Parent=PHASIBEAM10F000102T1;ID=PHASIBEAM10F000102T1.exon3;Name=PHASIBEAM10F000102T1 -contig105074 CNAG CDS 233 281 . + 1 Parent=PHASIBEAM10F000102T1;ID=PHASIBEAM10F000102C1;partial_cds=true;Name=PHASIBEAM10F000102C1 -contig105074 CNAG CDS 501 566 . + 0 Parent=PHASIBEAM10F000102T1;ID=PHASIBEAM10F000102C1;Name=PHASIBEAM10F000102C1 -contig105074 CNAG CDS 683 769 . + 0 Parent=PHASIBEAM10F000102T1;ID=PHASIBEAM10F000102C1;Name=PHASIBEAM10F000102C1 diff --git a/dataset/P.vulgaris.proteins.fa b/dataset/P.vulgaris.proteins.fa deleted file mode 100644 index 12451c8..0000000 --- a/dataset/P.vulgaris.proteins.fa +++ /dev/null @@ -1,191 +0,0 @@ ->PHASIBEAM10F000001P1 -MIALKFGVSGEGHYSSGEATTLLFFICAYVAAYAWSWGPLGWLIPSEICSLEVRFAGQGTNVA ->PHASIBEAM10F000003P1 -LLPAACLISNDVTKKLCGSDHRAWYTRGCPSKYGWAALTGLALYIIFFSPGMGTVPWVVNSEIYPLRYRG -VCGGIASTAVWISNLIVS* ->PHASIBEAM10F000004P1 -FFNRAALITDGDLQLDGSIGRQWSLCTVEQVENFKAIIGILPLWSSSIFLFVPITIQGNMTVHQALDTDR -LIGPHFNFPAGSVGVIPLISTSIFLTFLDRVLWPTWHKFN ->PHASIBEAM10F000008P1 -MSKRIAFCLVLFFLMVLLSLVGPWLAPWAVDEIRDMPFAAPAASLLAGSDYLGADVLSRVLSGGQQLLIF -AALSVALAWLAGGVTGMVAALEGRWLDRALLTVADVLLSVPGLLLLTLVVTISGRGYSAAALAALLVMFP -DIFRLVRAATLHQLQQDYVEMARLRGESLRAILFREIAPNLLPLISADLGIRLLTALFILASASFLGLGA -TPPQADWGLMIMENRSGLTLQPWATLAPIIAILLFVDP ->PHASIBEAM10F000012P1 -MPSHALNKIRFERLADMRILDDELMIRLIPHKAKKTLSIIDNGVGMTKYDLVNNLDVGFYSAYLVAHKVI -VTSKYNDLDQYNWESQLHGSLIVTRDISAKKISRGTKITLFLKDDQLEYIEEATIKNLVNKHCQHITYPI -YIWSENTKDYLQLINSCLNKQEMKNKFVDEKLGNHLPNDLIVSILFKLPLKSLKRFEIS* ->PHASIBEAM10F000015P1 -VVIGIVLGMKVQDHSESLNTGFAVLVVVMVCTFVSSFAWSWGPLGWLIPSETFPLEARSAGQSVTVFMNM -LFTFIIAQGFLSMMCHFKFGIFFFFSAWVLVMSLFTIFLVPETKNIPIEEMTEKVWRNHWFWKSFMED* ->PHASIBEAM10F000016P1 -GKTITLEVESSDTIDNVKAKIQDKEGIPPDQQRLIFAGKQLEDGRTLADYNIQKESTLHLVLRLRGGMQI -FVKTLTGKTITLEVESSDTIDNVKAKIQDKEGIPPDQQRLIFAGKQLEDGRTLADYNIQKESTLHLVLRL -RGGMQIFVKTLTGKTITLEVESSDTIDNVKAKIQDKEGIPPDQQRLIFAGKQLEDGRTLADYNIQKESTL -HLVLRLRGGF* ->PHASIBEAM10F000018P1 -MVIFVQWKSLCKAFLVEAKWFGSGKLPSAEEYLENGTVSSGVHIVMVHAFFLLGQGLTEENVQIIDRGPA -IISSPATILRLWDDLGNAEDENQKSNDGSYVNCVMMEKPEYTKMVAREIMMNKICDAWKRLNQEWLSDKH -FHSTFTNSALNLARMVPLMYNYDHNQSLPGLEEKVKSLLYDDFL* ->PHASIBEAM10F000019P1 -MTSRDRQVLRNAGADDIYEVKELNFDDSQKLFSLHAFKQKSSEEKSYRELSEKVLRYAKGIPLALQILGS -LLYGRTREAWESQLQKLKKGQHLGIFNVLKLSYDGLEEEEKNIFLDIACFYRGDKEIVVAETLDECGFSS -KIGMDILKDRGLISVFDGIIVMHDLIQEMGKEIVRKESPQHPGKRSRLFNVEEICEVLRKNKGSDAIECI -LLDTRKVKEVVVHAQSFKKMDNLRMLRLYTWAIESKVSLESSIVGLPDTLKILYWDFFPQRFWPPKFCPQ -NLVTLEMPYCHLEQLWEGDQ ->PHASIBEAM10F000020P1 -HGINLTGEEIVSYESPRPTSGIHRLVFVLFRQPGRQSIHAPGWRQNFITRDFAEYYNLGSPVAAVYFNCQ -RQAGSGGRRLIL* ->PHASIBEAM10F000021P1 -MEQQQSTQLHNDDFIFRSKLPDIYIPTHLPLHTYIFQNISQFSHRPCLINAATGDCFTYAEVQLTSRRVA -AGLNKLDIQKGDVILLLLQNCPQFVFAFLGSSFCGATVTTANPFYTPAEVAKQAAASNAKLIITQASYVD -KVKDYAREKASE* ->PHASIBEAM10F000022P1 -MLMRKMHEVMSNHGLTTRVDEKEPVAPEAILATREEQRNGKTISEWLIHWKAQPVEKATWEAAETIKEKF -PSFCLEDKAETSEGGLDGNSLPIVLAQPTSEKPLLVYSRRSKAHVPETSTTFQESLLGKGGSYL* ->PHASIBEAM10F000028P1 -MLMRKMHEVMSNHGLTTRVDEKEPVAPEAILATREEQRNGKTISEWLIRWKAQPVEKATWEAAETIKEKF -PSFCLEDKAETSEGGLDGNSLPIVLAQPTSEKPLLVYSRRSKAHVPETSTTFQESLLGKGGSYL* ->PHASIBEAM10F000030P1 -MAESFLFSIAESLIAKIASHAFQEASRLVGLYDNLPDLTKTLSLVKAVLLDAQQKQEHNHQLREWLTQLK -TVFSDAEDLLDEFECQTLRKKVVKAHGSTKDKVSHFFSTSNPLLFRYQMAQQIKDISKRLDKVAADRHKF -SLQIIDVDTRVVHRRDMTHSRVSDSDVVGRKHDKENIIELLMPQNPNDDASLSVIPIVGIGGLGKTTLAK -FVFNDSRIQECFPLKMWVCVSDDFDIKQLIIKIINSANDQDAPPHQQNLNMLDLEQLQNQLKNKL ->PHASIBEAM10F000031P1 -MVKNLTGQMVEFGQVKRGELGILGAELNSELAKAMKVDAQRGGFVSQVLPNSAAAKAGVKAGDVVVSMNG -KPLSSFAALRAEVGSLPVGTKLQLGLLRDGKPVTVTVELLQSTQDKVQSATIYTGIEGADLSNDSGSDKG -VRVDNVKPNSAAARIGLKKGDVILGVNQQKIANLGELRKILDTKPSVLALNVKRGDSTLYLLMQ* ->PHASIBEAM10F000033P1 -MSSSKIPEVVLQFSSNHPKMPVIGLGTSSTSSTKEAVLEAIKVGYRHFDTASVYGSEEPLGEAIAEALQL -GLIASRDELFITSKLWCTSNFPHLVLPAIHKSLQYFNLSYIGFT ->PHASIBEAM10F000034P1 -MDCVRAGYVDEPEATSATLVNGWLRTGDLCYFDNDGFLYVVDRLKELIKYKGYQVAPAELEELLLSHPDI -TDAAVIP* ->PHASIBEAM10F000038P1 -MVGTNSDESTNRKLLQYMQAHYADQAEIELMEIKGLPIFNKPENRQIPEQAQGMAAKIEAADGVIISTPE -YDHSAPAVLLNALEWLSFHIQPFVDKPVMILGASYGALGTSRAQAHLRQVLDSPELRARIMPSSEFMLGH -SLQAFDDDGDLVDDQQVAKLDGLFADFQMFVEITKKLKNANATTYQEVRDMDWEKL* ->PHASIBEAM10F000043P1 -MLDGKKIVAKEVVEGIDKENCKLSFKVLEGDLLELYKSFKFNLQVTPKENGSVAQWALEFEKQENHIPAP -HTLLQMGVELSKNIDSYLTQEHN* ->PHASIBEAM10F000044P1 -MVRLLTRHARAAPPKYEMERKNMSYSLPSLPYAYDALEPHFDKQTMEIHHTKHHQTYVNNANAALEGTEF -ADLPVDELITKLDQGDLKAAIEKDFGSVEKFQEEFEKAAATRFGSGWAWLVKKGDKLAVVSTANQDNPLM -GEAISGASGYPILGLDVWEHAYYLKYQNKRPDYIKAFWNVVNWDEAAARFASAK* ->PHASIBEAM10F000046P1 -MAKQVSVINSSYCAPHSIPLQINTEKGATYNENDDRLFYTDDTFFTLHNRRVLYDDAENPIVTLYNKIVS -LHGRCKVFRGESTDSSKLLFWVKEVKESSKIPPGIIKLNVFLAKNPDENKSDFRVIIFGSKRSCTVYAGE -SPNIVAK ->PHASIBEAM10F000049P1 -MGIIPWTSLSPDSSPFVQVFKLAGYPAAAAIINFVVLTSAASSLNSCLFSAGRHFYQLATEMPATSRMRQ -WFGTISKSGVPAAAIVLSAVLVLVTPVMSLSAATTAVFTIVTGISSDMYLIVYTLAMVAHRKYRLSNDYL -EDGFKMPAYRITSPLTIAFFVLIFASLFFIQADIIGAVGAIVWTLLFGTVTT ->PHASIBEAM10F000050P1 -MAELTATATYVKFWLPNVPAWLIEISFLLILAAVNLTAARLFGEAEFWFAMIKIVAIVALIVTGIFMMVG -HHPTPLGQAPIGNLFHNYQLFPHGMANFISAFPMVFFAFQGIEFVSITIGEAKNPHRVIKKSGQ* ->PHASIBEAM10F000051P1 -SNNIQIRIRSGGHDYEGLSYISDVPYVILDMFPLQSVDVDIKSATAWVQAGATLGQLYYQIAKKSNVHAF -PSGVCPSLGTGGHFSGGGYGNLMRKYGLSIDNIIDAKLVNANGVVQDRKSMGEDLFWAIRGGGGASFGVI -VAWRIQLVPVPPQVTVFNVKKSVKEDATDVAYKWQLVAPKLDRDLFIRVEPDVVNGTVIVSFIGQFLGSI -ARLVPLVNK ->PHASIBEAM10F000056P1 -RWYAGKNSFIWLGPTPRVTILDPEQIKDIFNKIYDFPKPDINPLFKLLATGLADYEGEKWSKHRRLINPA -FNLEKLKVSCLHLLDMDLCYALKHIRKKLRNCVCTCMCLFSSPLTRKNVLSLEMQHRFGK ->PHASIBEAM10F000058P1 -DDGCLLTSAYGQVARWYPTKSKPVKTYEWKGSLLSLAVRPDGSIIAAGSQEGAIHLWRLKKGNEFQMGGY -DGKVRLIDWSRNGRYFYTAGGAALVIWDCKGKGPEGTRPDYQLCHDGNITALAAHPQQPVVASGAEDGSL -FIYDSSRQNALAAVQGDAAISSIAWHPVEPMIAAGTVDGGVHLLKIAM* ->PHASIBEAM10F000059P1 -FTDGYSRPKFNIIGAMEWLCFRLDMLSSITFAISLIFLISIPAGLIDPGLAGLAVTYGLNLNMIQAWMIW -NLCNMENKIISVERVLQYTCITSEPPLVVGENRPDPSWPSNGEVDIQDLQVRYAPHLPLVLHGITCKFPG -GLKTGIVGRTGSGKSTLIQTLFRIVEPAAGQIMIDNINISSIGLHDLRSRLSIIPQDPTMFEGT ->PHASIBEAM10F000061P1 -MQGKPEFTDHLTHKLKHHPGQIEAAAIMEHILDGSSYMKDAKKLHEIDPLQKPKQDRYALRTSPQWLGPL -IEVIRFSTKSIEREINSVNDNPLIDVSRNKALHGGNFQGTPIGVSMDNTRLALASIGKLMFAQFSELVND -FYNNGLPSNLTASRNPSLDYGFKGAEIAMASYCSELQYLANPVTSHVQSAEQHNQDVNSLGLISARKTNE -SIEILKLMSSTFLMGLCQAIDLRHLEENLKSSVKNTVSQVSKRTLTTGGNGELHPSRFCEKDLLKVVDRE -YVFSYIDDPCSGTYPLMQKLRQVLVDHALINAENEKDVNTSIFQKIATFEEELKTILPKEVESTRAAYE ->PHASIBEAM10F000064P1 -MDKARALYFGTNEDKDALFFGNPNLLITSWMRMPTYEADFGWGKPVYFGYAAVVTQDRAIITQ ->PHASIBEAM10F000068P1 -MRLAAVRSTKTMNSLTMWCLLVSNTNRDDFVIEARSLDDAITQMTIVDSLPPDRHPERRLKASFKAFEEA -ELPKLKEEKPGLTHNQYKDLIWKLWKKSPDNPLNQ ->PHASIBEAM10F000070P1 -METSRSKNFVRHAKADMKVRVRHNVLTQYIVDVNRKLNRFQQERIKQTPFKWMLQMDKVLDISNSLMREL -LSRWAADKEAFRIRKSIVPFSTLDVCFALGLSVVGEEVKMENDGGGVVNTLFEEGEEMNLSTVLKKLEEK -NLNKNVDDFVRLYILLGLYVFYVPRTSRTFTSFAFKCLDNLDALQLYNWGGAVYNVLVTSLTRASQVYYE -DKNVSEIYLAGCVAVLQVS* ->PHASIBEAM10F000071P1 -MTPCGACKYQRRRCGADCLMAPYFPAESIQRFAYVHHVFGGGNVSNILKSTKPELRKWTARALTYQAEAR -VRDPVHGCVGVICEQEESLRILKEKLEKAKREVAKYVGPEVMQKMIKQCSSDPHANMVDLEAPLAITVDD -ADLSSWDPFPAWEPAFSRLQPPQGGDAKGETIAPPS* ->PHASIBEAM10F000076P1 -SIAAIFIAQLYGIDLSLTDEIILVLTLMVTSKGIAGVPGVSFVVLLATLGSVGIPLEGLAFIAGVDRIMD -MARTALNVIGNALAVLVIARWENQFDTKQAAAYELQLRTQNAS* ->PHASIBEAM10F000077P1 -ERERETGRERYIRRESNNNMTLPYSSVMTRSVWSYNLESEFEMIRFVIALYPFISMDTEFPDVVFQSHPA -FRQPQNNYAVMKANVDSMHLIQVGLTLSDDNDNLPTFGTSNRFIWEFNFCEFDVTQHPHAPHSIALLRRQ -GIDFDKNRRFGVNIVRFVELMMFSGLLCNNNIQWIAFHSAYDFG ->PHASIBEAM10F000082P1 -MGEEYWKMVTKHQDVPEEFKVLKNFDVKSNAVNYRNNDIDVKSKKKVVKNLEASPDHNDIDCMEKKKNME -KAYGDNEVDVKEKSKAMKDFEPRPNVSAYGDNEVDMREKNKAMQDFEPRPNVSTYGDDEVDVKEKNKAMK -DFEPRPNVSAYGENEVDEKEKNKAMKDFEPRPNVSAYGDNEVDVKEKSKNVKDFEPRPNVSAYGDNEVDV -REKNKVKKDFEPRPNVSAYGDNEVD ->PHASIBEAM10F000083P1 -MPIPSFIATMTSLTHLNLSYAGFDGNIPPQIGNLSNLFYLDLGSNYLFAENIDWVSSLSKLRYLDLSGMF -LRTPGMSLPTHLGKMTSLTHLDLSNAAFSGNIPSHIGNLSNLVYLHLQSYSMFPQNLHCLSSLSKLEHLG -LGGIILQNRTEMNKRVN* ->PHASIBEAM10F000085P1 -MEEMRKETDLMRLEMRKENYRMRQEFLSQQLCAEPIQPLVSPTPKSTKGSCAAPTTSGDDIIGQTRECEL -LVAGGKLPQVVALGKVYEEATTLHNVPLSSNGAKVTVEKVRVPDAHVPLPSDEKPLRKPSPEKKREVPVD -DL* ->PHASIBEAM10F000086P1 -MREYGYDVSADTFERFKEQNGEFKASLMGDVKGVLSLYEASFLGYEGEQILDDARAFSSFHLRSALNEGR -SNNMVLEEVNHALELPLHHRTQRLEARCQPCKMISKKSQGQFALKKPTFSI* ->PHASIBEAM10F000087P1 -VTIQASFVSLFLGGVEELIPLMQNNLPELGLDRNDCKETSWIGSAVLINSLMNGSSGNEPPESMLNRTQI -RSGYFKAKSDYVKQPIPIEGLRGLWRFLCDAKVECAQLQLAPYGGIMNEISESEIAFSHRSQYIYHIHYG -VTWQEEGDEIAQRHMEWIRRLYKYMEPYVSNSPRAAYINYRDLDIGVNNNGYTSYTHASIWGLKYFNNNF -KRLVRVKTKVDPENFFRNEQSIPILSIEEY* ->PHASIBEAM10F000089P1 -MLKAEVTQELKESFMEEFSARMEMEFKKRWEGLGHSQQPPTMVEDEPPPPPIKKVSTKGSCSAVDLSGDD -FGSTSQCELYVECNSLTRFVALGKCYEGVTMLHNVPLPSNFMKVTVEKVLYGDLAVPVPTSEVTIVAEAL -HTFVA* ->PHASIBEAM10F000091P1 -EEGQQEGVIVNIDSEQIKELSKHAKSSSRKSLSKQDNTIGNEFGNLTERTDNSLNVLISSIEMKEGALFV -PHYYSKAIVILVVNEGEAHVELVGPKGNKETLEYESYRAELSKDDVFVIPAAYPVAIKATSNVNFTGFGI -NANNNNRNLLAGKTDNVISSIGRALDGKDVLGLTFSGSGDEVMKLMNKQSGSYFVDAHHHQQEQQKGRKG -AFVY* ->PHASIBEAM10F000093P1 -MKVLALVMFVMVYSLAITRFSEGQMPASCDEYNPVFSPCVPYLVNPDFGIPSPRCCAGAAQVFGKANNPA -AIQKLCTCLVATMPNLSFKPEKLTQLPAACKIKLSFPIDKCIKA* ->PHASIBEAM10F000094P1 -MAEERVTSSSQPDPANSYLYLHPSENPAAPLVSPVLDASNYHSWSCSILTTLNVKNKVEFVLGTHPCPEK -DHRNFSVWNR ->PHASIBEAM10F000095P1 -NSTLIFIDHQPQMAFGVANIDRQQLKNNTVALAKAGKIFDVPVIYTSVETESFSGYIWPELLAVHPESKP -IERTSMNSWEDAKFVEAVEKTGRKKLIISALWTEVCLTFPALMALKAGYEVYVVTDTSGGTSVDAHERSV -QRMVQAGAVPVTWQQVLLEYQRDWSRKETYDAVMDLVREHSGAYGMGVDYAYTMVHKAPQRQG* ->PHASIBEAM10F000096P1 -PQDLLQQQCIRHRLPGGKRYRWEYQSAEESLEIDVPGTLTLDNNALMARAAINGSGIAFVPSLYVSEALQ -QGKLVELLADWRIQSAGIALWFPPNRHQSMALRLFIDALKTRLPHYR* ->PHASIBEAM10F000097P1 -MFVHGNISDVFEKFTNKERKFKPELGENIKGMIEMYEASQLGIVGEDILAEAEKFSGKILKEKVDCIDSH -GAKFVKRTLEHPFHKSLPLFTARNFLGDFHDKNPRLSSFCQIAKMDFSLLQGSCHREIGQVSKWWSGLGL -ANELIYARNQPLKWYIWSLACFSDPTLSEERVELTKPISLIYIIDDIFDVYGTLDELTLFTEAVCR* ->PHASIBEAM10F000098P1 -MENANNNAVALQNTHVKLLAFDLLSLKPFPSHSSESSPSFSRRGIPLSLVETLGTVTLRHLKHERLLRFI -IDDGTGCVPCVLWLNDANSPSVVRRRRHELAARFVGVVKIGAVARVRGRLSRYNGGVQVRVSDVVAERDP -NAEIFHRLDCIRLARNCYNLLPPPSFKR* ->PHASIBEAM10F000100P1 -MQNNLPELGLDRNDCKETSWIGSAVFTNSVLIGSSGNEPPESMLNQTQIRSGYFKAKSDYVKQPIPIEGL -RGLWRLLCDVKVEYAQLQLAPYGGIMNEISESEIAFSHRSQYIFHIHYSVIWQEEGDEIAQRHMDWIRRL -YKYMEPYVSNSPRAAYINYRDLDIGVNNNGFTSYTQASIWGLKYFNNNFKRLARVKTKVDPENFFRNEQS -IPILSIEEY* ->PHASIBEAM10F000101P1 -MCLAARKVNHGVLQPSFNSYHHSSNYIVPFFFFFHSNSIDKLKLNNPMNPMEKPEGKEECVDLTRISLRP -LQLSDLDDLLVWTSDEKVATFCTWDPYTSKEDGINFIQNIATKFVWCRAICLNDRAIGCVSLSSNSEHDK -SRNRSVELGYVLGSKYWGKGVATLVVKQVVKVAFTELPLPNMERVEALVDVLNVGSQRVLEKAGFQREGI -LRKYSFLKGKSRDMVMFSLLSTDSHLQFP* ->PHASIBEAM10F000102P1 -GILSAIDVLDNHALIGIFYFIGFGLFCIETLISIWVIQQVYMYFRGSGKAAEMKREAARGALRAAI* From a2504c3b18b0b5791b59e02365452002abb1da0b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 5 Mar 2021 19:19:56 +0100 Subject: [PATCH 071/381] cleaning, more to debug --- scripts/load_kegg_KAAS.pl | 42 +++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 607c2db..2014b5f 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -101,10 +101,9 @@ =head1 AUTHORS if(!defined $config{'dbEngine'}){$config{'dbEngine'} = 'mysql';} my $dbh; #connect to the DB -if(lc( $config{'dbEngine'} ) eq 'mysql') -{ $dbh= FunctionalAnnotation::DB->new('mysql',$config{'dbname'},$config{'dbhost'},$config{'dbuser'},$config{'dbpass'},$config{'dbport'});} -else -{ +if (lc( $config{'dbEngine'} ) eq 'mysql') { + $dbh= FunctionalAnnotation::DB->new('mysql',$config{'dbname'},$config{'dbhost'},$config{'dbuser'},$config{'dbpass'},$config{'dbport'}); +} else { my $dbName = $config{'resultPath'}.$config{'dbname'}.'.db'; my $dsn = "DBI:SQLite:dbname=$dbName"; $dbh= FunctionalAnnotation::DB->new('sqlite',$dbName); @@ -147,6 +146,10 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } +print Dumper( \%keggs ); +print Dumper( \%organisms ); +print Dumper( $pre_upload_kegg ); + &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); sub retrieve_kegg_release { @@ -204,12 +207,11 @@ sub parseAndUploadKEGGEntry { } - # Avoid Genes too many entries - + # TODO: Rewrite into specific table if ( $returnData{"GENES"} ) { - my (@parts) = split(",", $returnData{"GENES"} ); + my (@parts) = split( ",", $returnData{"GENES"} ); if ( $#parts > 1500 ) { # TODO: check this margin - $returnData{"GENES"} = join(",", @parts[0 .. 1500] ); + $returnData{"GENES"} = join( ",", @parts[0 .. 1000] ); print STDERR "** Too big GENES in $kegg_id\n"; } } @@ -331,18 +333,29 @@ sub uploadKeggInformation { my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); + my @countk = keys %{$keggData}; + print STDERR "* COUNT: ", $#countk, "\n"; + my $lim = 10; + + my $l = 0; foreach my $kegg_id (keys %{$keggData}) { #get KO information from server + + $l++; + if ( $l > $lim ) { + last; + } + my $hash; my $kegg_group_id; if ( $pre_upload_kegg > 0 ) { - # print STDERR "* Entering $kegg_id\n"; + print STDERR "* Entering $kegg_id\n"; ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); - #print STDERR "Prefilled\n"; - #print STDERR Dumper( $hash ); - #print STDERR Dumper( $kegg_group_id ); + print STDERR "Prefilled\n"; + print STDERR Dumper( $hash ); + print STDERR Dumper( $kegg_group_id ); } else { @@ -653,14 +666,13 @@ sub organism_table { # print "4. ".$organism_id."\n"; #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $organism_id && lc( $engine ) eq "sqlite") - { + if(!defined $organism_id && lc( $engine ) eq "sqlite") { my $select = &selectLastId( $engine ); my $results = $dbh->select_from_table($select); #print Dumper($results); $organism_id=$results->[0]->{'id'}; - } + } }#if ! defined organism id From dd3e7fec259b053248995d49a690245860b60ff8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 12 Mar 2021 18:28:47 +0100 Subject: [PATCH 072/381] simple gitignore addition --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0764864..7c0ea1d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ external/ +tmp/ .nextflow* work/ From e9572fc25a38fb4672f7a2edf74df49ec1e3165f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 15 Mar 2021 16:59:39 +0100 Subject: [PATCH 073/381] fix multiple --- scripts/lib/FunctionalAnnotation/DB.pm | 14 +++++ scripts/load_kegg_KAAS.pl | 75 +++++++++++++++++++------- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index 6045dbd..f32b811 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -344,6 +344,20 @@ sub select_update_insert { return $dbID; } +sub multiple_query { + my ($self, $queries) = @_; + + $self->{AutoCommit} = 0; + foreach( @{$queries} ) + + my $sth = $self->prepare_stmt($_); + $$th->execute(); + + } + $self->commit(); + return 1; +} + sub _clean_sql () { my ($self, $par) = @_; diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 2014b5f..bf7d231 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -407,14 +407,15 @@ sub uploadKeggInformation { #print "gene string: $gene_string\n"; my @lines=split/\,/,$gene_string; my $is_cluster; + + # We do batch mode for MySQL but not sqlite + # https://sqlite.org/np1queryprob.html + my @orthobucket = (); foreach my $l (@lines) { + # insert each ortholog my ($code,$gene_id)=split/\:/,$l; $gene_id=~s/^ //; - # determine if $gene_id containt a cluster of genes - my @cluster=split/ /,$gene_id; - $is_cluster=1 if scalar(@cluster)>1; - $is_cluster=0 if scalar(@cluster)==1; my $lcode=lc($code); #print STDERR "* ", $lcode, "\n"; #print STDERR "- ", Dumper( $codesOrg ); @@ -434,26 +435,57 @@ sub uploadKeggInformation { my $ortholog_sql_insert = ""; if( lc( $dbEngine ) eq 'sqlite') { - $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id,name,organism_id, db_id,db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; - } - else { - $ortholog_sql_insert = qq{ INSERT INTO ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; + $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id, name, organism_id, db_id, db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; + + # print STDERR $ortholog_sql_insert, "\n"; + my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); + + # Not needed for next step + #small patch for SQLite - the current insert function could not return id of the last inserted record... + # if(!defined $ortholog_id) { + # my $select = &selectLastId( $dbEngine ); + # my $results = $dbh->select_from_table($select); + # $ortholog_id=$results->[0]->{'id'}; + # } + + if(($loglevel eq 'debug' )||($loglevel eq 'info' )){ + print "SQL: $ortholog_sql_insert --- $ortholog_id\n"; + } + } else { + # Handling stuff for SQL + push( @orthobucket, "INSERT INTO ortholog (name, organism_id, db_id, db_name) values(\"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\") ON DUPLICATE KEY UPDATE name = \"$gene_id\", organism_id = \"$organism_id\", db_id = \"$kegg_id\" ;"); } - # print STDERR $ortholog_sql_insert, "\n"; - my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); - #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $ortholog_id) { - my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $ortholog_id=$results->[0]->{'id'}; - } - if(($loglevel eq 'debug' )||($loglevel eq 'info' )){ print "SQL: $ortholog_sql_insert --- $ortholog_id\n";} + } + + if ($#orthobucket >= 0) { + $dbh->multiple_query( \@orthobucket ); + } + + foreach my $l (@lines) { + + # insert each ortholog + my ($code,$gene_id)=split/\:/,$l; + $gene_id=~s/^ //; + # determine if $gene_id containt a cluster of genes + my @cluster=split/ /,$gene_id; + $is_cluster=1 if scalar(@cluster)>1; + $is_cluster=0 if scalar(@cluster)==1; + my $lcode=lc($code); + #print STDERR "* ", $lcode, "\n"; + #print STDERR "- ", Dumper( $codesOrg ); + # next if ortholog is not in the list of species to analyze + next if !$codesOrg->{$lcode}; + #print STDERR "Passed\n"; + #get organism_id from DB + #my $organism_id= organism_table($lcode,$dbEngine,$dbh); + my $organism_id= $codesOrg->{$lcode}; + + # TODO: Missing here ortholog_id we should retrieve from somewhere else via select + #populate protein_ortholog #check if protein_ortholog already exists in the table (yes && do_update => update record; no => insert new protein_ortholog) - # TODO start new iterator from here - my $type; if ($numberProteinsInGroup>1 && $is_cluster==0) { @@ -465,6 +497,11 @@ sub uploadKeggInformation { } else { $type="one2one"; } + + my $results_ortho = $dbh->select_from_table("SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""); + my $ortholog_id = $results_ortho->[0]->{'id'}; + + my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; my $prot_ortholog_sql_insert =""; From 5e3da9ccd59baf66eabefe9d71437484cfe3cbdd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 15 Mar 2021 17:08:47 +0100 Subject: [PATCH 074/381] wrapper --- scripts/lib/FunctionalAnnotation/DB.pm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index f32b811..c4cbd79 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -346,15 +346,17 @@ sub select_update_insert { sub multiple_query { my ($self, $queries) = @_; + my $dbh = $self->db_connection; - $self->{AutoCommit} = 0; - foreach( @{$queries} ) + $dbh->{AutoCommit} = 0; + foreach( @{$queries} ) { my $sth = $self->prepare_stmt($_); - $$th->execute(); + $sth->execute(); } - $self->commit(); + + $dbh->commit(); return 1; } From 959b8186688d5a4bd7e8cd392d35f196d60684d6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 15 Mar 2021 19:30:14 +0100 Subject: [PATCH 075/381] more testing --- scripts/load_kegg_KAAS.pl | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index bf7d231..77d3c3e 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -146,9 +146,10 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } -print Dumper( \%keggs ); -print Dumper( \%organisms ); -print Dumper( $pre_upload_kegg ); +#print Dumper( \%keggs ); +#print Dumper( \%organisms ); +#print Dumper( $pre_upload_kegg ); +#exit; &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); @@ -309,7 +310,7 @@ sub uploadSingleKEGGId { $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", genes=\"$hash->{'GENES'}\", kegg_release=\"$kegg_release\";}; } if(($loglevel eq 'debug' )||($loglevel eq 'info' )) { - print "SQL: $kegg_group_sql_insert\n"; + # print "SQL: $kegg_group_sql_insert\n"; } my $kegg_group_id = $dbh->select_update_insert("kegg_group_id", $kegg_group_sql_select, $kegg_group_sql_update, $kegg_group_sql_insert, $do_update); @@ -338,6 +339,7 @@ sub uploadKeggInformation { my $lim = 10; my $l = 0; + exit; foreach my $kegg_id (keys %{$keggData}) { #get KO information from server @@ -383,6 +385,8 @@ sub uploadKeggInformation { my @proteinList = @{$keggData->{$kegg_id}}; my $numberProteinsInGroup=scalar @proteinList; + print "NUM PROT: $#proteinList\n"; + foreach my $proteinItem(@proteinList) { #select protein_id infor (because items are stable_ids in protein table) @@ -411,6 +415,9 @@ sub uploadKeggInformation { # We do batch mode for MySQL but not sqlite # https://sqlite.org/np1queryprob.html my @orthobucket = (); + + print "NUM LINES: $#lines\n"; + foreach my $l (@lines) { # insert each ortholog @@ -462,6 +469,8 @@ sub uploadKeggInformation { $dbh->multiple_query( \@orthobucket ); } + print "NUM LINES: $#lines\n"; + foreach my $l (@lines) { # insert each ortholog @@ -498,9 +507,17 @@ sub uploadKeggInformation { $type="one2one"; } - my $results_ortho = $dbh->select_from_table("SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""); - my $ortholog_id = $results_ortho->[0]->{'id'}; + my $query = "SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""; + my $results_ortho = $dbh->select_from_table($query); + + my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; + print STDERR "* $ortholog_id\n"; + + if ( $ortholog_id eq '' ) { + print STDERR "Major error here"; + exit; + } my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; @@ -567,6 +584,7 @@ sub uploadKeggInformation { #print STDERR "Definition\n"; #print STDERR Dumper( \%protDefinitionData ); &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + print STDERR "Finished here\n"; }#sub From cb76f337ef246b56618748b4f195bca9d562b6f8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 12:49:49 +0100 Subject: [PATCH 076/381] clean more --- scripts/load_kegg_KAAS.pl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 77d3c3e..70652a6 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -213,7 +213,7 @@ sub parseAndUploadKEGGEntry { my (@parts) = split( ",", $returnData{"GENES"} ); if ( $#parts > 1500 ) { # TODO: check this margin $returnData{"GENES"} = join( ",", @parts[0 .. 1000] ); - print STDERR "** Too big GENES in $kegg_id\n"; + # print STDERR "** Too big GENES in $kegg_id\n"; } } @@ -336,11 +336,13 @@ sub uploadKeggInformation { my @countk = keys %{$keggData}; print STDERR "* COUNT: ", $#countk, "\n"; - my $lim = 10; + + # Temporary limit + my $lim = 3; my $l = 0; - exit; - foreach my $kegg_id (keys %{$keggData}) { + + foreach my $kegg_id (sort( keys %{$keggData})) { #get KO information from server $l++; From 5539ddfb9439fca668d2dbc21715babebb6da3d3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 13:10:34 +0100 Subject: [PATCH 077/381] fix --- scripts/load_kegg_KAAS.pl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 70652a6..458f8f8 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -335,10 +335,10 @@ sub uploadKeggInformation { my %protDefinitionData=(); my @countk = keys %{$keggData}; - print STDERR "* COUNT: ", $#countk, "\n"; + print STDERR "* COUNT: ", $#countk + 1, "\n"; # Temporary limit - my $lim = 3; + my $lim = 1; my $l = 0; @@ -357,9 +357,9 @@ sub uploadKeggInformation { print STDERR "* Entering $kegg_id\n"; ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); - print STDERR "Prefilled\n"; - print STDERR Dumper( $hash ); - print STDERR Dumper( $kegg_group_id ); + #print STDERR "Prefilled\n"; + #print STDERR Dumper( $hash ); + #print STDERR Dumper( $kegg_group_id ); } else { @@ -468,6 +468,7 @@ sub uploadKeggInformation { } if ($#orthobucket >= 0) { + print STDERR Dumper( \@orthobucket ); $dbh->multiple_query( \@orthobucket ); } From 81fdb10742b398adefdaf93642d44caf62b6221c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 13:33:16 +0100 Subject: [PATCH 078/381] fix data --- scripts/lib/FunctionalAnnotation/DB.pm | 13 +++++++------ scripts/load_kegg_KAAS.pl | 7 +++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index c4cbd79..36d6d57 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -345,16 +345,17 @@ sub select_update_insert { } sub multiple_query { - my ($self, $queries) = @_; + my ($self, $query, $values) = @_; my $dbh = $self->db_connection; - $dbh->{AutoCommit} = 0; - foreach( @{$queries} ) { + my $values_string = join( ", " @{$values} ); - my $sth = $self->prepare_stmt($_); - $sth->execute(); + $query =~ s/#VALUES#/$values_string/; + print STDERR $query; - } + $dbh->{AutoCommit} = 0; + my $sth = $self->prepare_stmt($query); + $sth->execute(); $dbh->commit(); return 1; diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 458f8f8..7fe10f9 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -462,14 +462,17 @@ sub uploadKeggInformation { } } else { # Handling stuff for SQL - push( @orthobucket, "INSERT INTO ortholog (name, organism_id, db_id, db_name) values(\"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\") ON DUPLICATE KEY UPDATE name = \"$gene_id\", organism_id = \"$organism_id\", db_id = \"$kegg_id\" ;"); + my $values = "( \"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; + push( @orthobucket, $values ); } } if ($#orthobucket >= 0) { + # VALUES here used for replacement + my $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; print STDERR Dumper( \@orthobucket ); - $dbh->multiple_query( \@orthobucket ); + $dbh->multiple_query( $query, \@orthobucket ); } print "NUM LINES: $#lines\n"; From d2110d96e27f405acad5e59cfda6276b1ab40c64 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 13:36:23 +0100 Subject: [PATCH 079/381] fix --- scripts/lib/FunctionalAnnotation/DB.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index 36d6d57..50150f5 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -348,7 +348,7 @@ sub multiple_query { my ($self, $query, $values) = @_; my $dbh = $self->db_connection; - my $values_string = join( ", " @{$values} ); + my $values_string = join( ", ", @{$values} ); $query =~ s/#VALUES#/$values_string/; print STDERR $query; From 3abbc2dc8897b24c2acb5a02d966aaf5cf222f7a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 13:43:44 +0100 Subject: [PATCH 080/381] more num --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 7fe10f9..773eac2 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -338,7 +338,7 @@ sub uploadKeggInformation { print STDERR "* COUNT: ", $#countk + 1, "\n"; # Temporary limit - my $lim = 1; + my $lim = 3; my $l = 0; From 57a60b973bac83c18a307f1a0fea18e0feb92361 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 14:28:52 +0100 Subject: [PATCH 081/381] carrying on --- scripts/lib/FunctionalAnnotation/DB.pm | 2 -- scripts/lib/SQL.schema.sql | 4 +++- scripts/load_kegg_KAAS.pl | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index 50150f5..f58cb24 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -353,11 +353,9 @@ sub multiple_query { $query =~ s/#VALUES#/$values_string/; print STDERR $query; - $dbh->{AutoCommit} = 0; my $sth = $self->prepare_stmt($query); $sth->execute(); - $dbh->commit(); return 1; } diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 5ae2452..e7bef17 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -70,7 +70,9 @@ CREATE TABLE IF NOT EXISTS `ortholog` ( `name` TEXT NOT NULL DEFAULT '' , `db_id` TEXT , `db_name` TEXT, - `organism_id` INTEGER NOT NULL ); + `organism_id` INTEGER NOT NULL, + UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) +); CREATE TABLE IF NOT EXISTS `protein_ortholog` ( `protein_ortholog_id` INTEGER PRIMARY KEY AUTO_INCREMENT , diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 773eac2..95f7839 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -477,6 +477,8 @@ sub uploadKeggInformation { print "NUM LINES: $#lines\n"; + # TODO: Here we preretrieve orthologs_id, gene and organism for saving time with fixed KEGG_ID + foreach my $l (@lines) { # insert each ortholog @@ -496,8 +498,6 @@ sub uploadKeggInformation { #my $organism_id= organism_table($lcode,$dbEngine,$dbh); my $organism_id= $codesOrg->{$lcode}; - # TODO: Missing here ortholog_id we should retrieve from somewhere else via select - #populate protein_ortholog #check if protein_ortholog already exists in the table (yes && do_update => update record; no => insert new protein_ortholog) From 7cb7d41c0819034cbdf7771fe84a78b6dcdf6565 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 15:08:49 +0100 Subject: [PATCH 082/381] Some caching --- scripts/load_kegg_KAAS.pl | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 95f7839..c13b3c7 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -477,7 +477,21 @@ sub uploadKeggInformation { print "NUM LINES: $#lines\n"; - # TODO: Here we preretrieve orthologs_id, gene and organism for saving time with fixed KEGG_ID + # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID + my ($orthoidlist) = {}; + my $results_ortho = $dbh->select_from_table("SELECT ortholog_id, name, organism_id from `ortholog` where db_id = \"$kegg_id\" ;"); + + foreach my $result ( @{$results_ortho} ) { + my $org = $result->{"organism_id"}; + my $name = $result->{"name"}; + my $oid = $result->{"ortholog_id"}; + + if ( ! $orthoidlist->{$org} ) { + $orthoidlist->{$org} = {}; + } + + $orthoidlist->{$org}->{$name} = $oid; + } foreach my $l (@lines) { @@ -513,14 +527,15 @@ sub uploadKeggInformation { $type="one2one"; } - my $query = "SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""; - my $results_ortho = $dbh->select_from_table($query); + #my $query = "SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""; + #my $results_ortho = $dbh->select_from_table($query); - my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; + #my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; + my $ortholog_id = $orthoidlist->{$organism_id}->{$gene_id}; print STDERR "* $ortholog_id\n"; - if ( $ortholog_id eq '' ) { + if ( ! $ortholog_id ) { print STDERR "Major error here"; exit; } From 08d123e7ccee2b813d6c233b7eaf61b567c214d3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 15:42:41 +0100 Subject: [PATCH 083/381] check --- scripts/load_kegg_KAAS.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c13b3c7..980056e 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -493,6 +493,8 @@ sub uploadKeggInformation { $orthoidlist->{$org}->{$name} = $oid; } + print STDERR Dumper( $orthoidlist ); + foreach my $l (@lines) { # insert each ortholog From de989c609b9a75ec54e9fa495e5a88fbcb29a4a6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 16:36:22 +0100 Subject: [PATCH 084/381] extra process --- scripts/lib/SQL.schema.sql | 6 ++++-- scripts/lib/SQL.schema.sqlite.sql | 8 ++++++-- scripts/load_kegg_KAAS.pl | 22 ++++++++++++++++++---- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index e7bef17..27538ab 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -71,7 +71,7 @@ CREATE TABLE IF NOT EXISTS `ortholog` ( `db_id` TEXT , `db_name` TEXT, `organism_id` INTEGER NOT NULL, - UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) + UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) ); CREATE TABLE IF NOT EXISTS `protein_ortholog` ( @@ -79,7 +79,9 @@ CREATE TABLE IF NOT EXISTS `protein_ortholog` ( `type` TEXT, `kegg_group_id` INTEGER NOT NULL , `protein_id` INTEGER NOT NULL , - `ortholog_id` INTEGER NOT NULL ); + `ortholog_id` INTEGER NOT NULL, + UNIQUE( `type`, `kegg_group_id`, `protein_id`, `ortholog_id` ) +); CREATE TABLE IF NOT EXISTS `ipscn_version` ( `idipscn_version_id` INTEGER PRIMARY KEY AUTO_INCREMENT , diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index 461b1eb..e4d625b 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -69,14 +69,18 @@ CREATE TABLE IF NOT EXISTS `ortholog` ( `name` TEXT NOT NULL DEFAULT '' , `db_id` TEXT , `db_name` TEXT, - `organism_id` INTEGER NOT NULL ); + `organism_id` INTEGER NOT NULL, + UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) +); CREATE TABLE IF NOT EXISTS `protein_ortholog` ( `protein_ortholog_id` INTEGER PRIMARY KEY AUTOINCREMENT , `type` TEXT, `kegg_group_id` INTEGER NOT NULL , `protein_id` INTEGER NOT NULL , - `ortholog_id` INTEGER NOT NULL ); + `ortholog_id` INTEGER NOT NULL, + UNIQUE( `type`, `kegg_group_id`, `protein_id`, `ortholog_id` ) +); CREATE TABLE IF NOT EXISTS `ipscn_version` ( `idipscn_version_id` INTEGER PRIMARY KEY AUTOINCREMENT , diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 980056e..fdf8fb7 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -493,7 +493,11 @@ sub uploadKeggInformation { $orthoidlist->{$org}->{$name} = $oid; } - print STDERR Dumper( $orthoidlist ); + # print STDERR Dumper( $orthoidlist ); + + # We do batch mode for MySQL but not sqlite + # https://sqlite.org/np1queryprob.html + my @porthobucket = (); foreach my $l (@lines) { @@ -546,14 +550,24 @@ sub uploadKeggInformation { my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; my $prot_ortholog_sql_insert =""; if( lc( $config{'dbEngine'} ) eq 'sqlite') { - $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");};} - else { - $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; + $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");}; + my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); + } else { + my $values = "( \"$protein_id\", \"$ortholog_id\", \"$type\", \"$kegg_group_id\" )"; + push( @porthobucket, $values ); } my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); } #for each group of genes in multiply organisms + if ($#porthobucket >= 0) { + # VALUES here used for replacement + my $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + + print STDERR Dumper( \@porthobucket ); + $dbh->multiple_query( $query, \@porthobucket ); + } + #update definition field for proteins associated to this KO group if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); From 02172ac0ede907105fa2ed21a97fdf6aa7f3a7e6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 16:50:48 +0100 Subject: [PATCH 085/381] fix --- scripts/load_kegg_KAAS.pl | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index fdf8fb7..9a8360b 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -557,7 +557,6 @@ sub uploadKeggInformation { push( @porthobucket, $values ); } - my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); } #for each group of genes in multiply organisms if ($#porthobucket >= 0) { From a01a853d93ae33f9be786ee69a4373847423ebb9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 16:55:10 +0100 Subject: [PATCH 086/381] logging --- scripts/load_kegg_KAAS.pl | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 9a8360b..8e80d3d 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -146,6 +146,8 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } +print "* PREUPLOAD: ".getLoggingTime()."\n"; + #print Dumper( \%keggs ); #print Dumper( \%organisms ); #print Dumper( $pre_upload_kegg ); @@ -387,7 +389,8 @@ sub uploadKeggInformation { my @proteinList = @{$keggData->{$kegg_id}}; my $numberProteinsInGroup=scalar @proteinList; - print "NUM PROT: $#proteinList\n"; + print "* NUM PROT: $#proteinList ".getLoggingTime()."\n"; + foreach my $proteinItem(@proteinList) { @@ -475,7 +478,7 @@ sub uploadKeggInformation { $dbh->multiple_query( $query, \@orthobucket ); } - print "NUM LINES: $#lines\n"; + print "* NUM LINES ORTHO: $#lines ".getLoggingTime()."\n"; # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID my ($orthoidlist) = {}; @@ -567,6 +570,9 @@ sub uploadKeggInformation { $dbh->multiple_query( $query, \@porthobucket ); } + print "* NUM LINES PORTHO: $#lines ".getLoggingTime()."\n"; + + #update definition field for proteins associated to this KO group if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); @@ -620,7 +626,7 @@ sub uploadKeggInformation { #print STDERR "Definition\n"; #print STDERR Dumper( \%protDefinitionData ); &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); - print STDERR "Finished here\n"; + print STDERR "Finished here ".getLoggingTime()."\n"; }#sub @@ -776,6 +782,14 @@ sub organism_table { return %returnData; } +sub getLoggingTime { + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); + my $nice_timestamp = sprintf ( "%04d%02d%02d %02d:%02d:%02d", + $year+1900,$mon+1,$mday,$hour,$min,$sec); + return $nice_timestamp; +} + sub selectLastId { my $engine = shift; From 9faa5e0b83e339027969eade88d05c003d5fee30 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 18:06:01 +0100 Subject: [PATCH 087/381] prot fix --- scripts/load_kegg_KAAS.pl | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 8e80d3d..757a166 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -146,7 +146,6 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } -print "* PREUPLOAD: ".getLoggingTime()."\n"; #print Dumper( \%keggs ); #print Dumper( \%organisms ); @@ -340,17 +339,17 @@ sub uploadKeggInformation { print STDERR "* COUNT: ", $#countk + 1, "\n"; # Temporary limit - my $lim = 3; + # my $lim = 3; - my $l = 0; + # my $l = 0; foreach my $kegg_id (sort( keys %{$keggData})) { #get KO information from server - $l++; - if ( $l > $lim ) { - last; - } + # $l++; + # if ( $l > $lim ) { + # last; + #} my $hash; my $kegg_group_id; @@ -389,7 +388,7 @@ sub uploadKeggInformation { my @proteinList = @{$keggData->{$kegg_id}}; my $numberProteinsInGroup=scalar @proteinList; - print "* NUM PROT: $#proteinList ".getLoggingTime()."\n"; + print "* NUM PROT: $#proteinList\n"; foreach my $proteinItem(@proteinList) { @@ -478,7 +477,7 @@ sub uploadKeggInformation { $dbh->multiple_query( $query, \@orthobucket ); } - print "* NUM LINES ORTHO: $#lines ".getLoggingTime()."\n"; + print "* NUM LINES ORTHO: $#lines\n"; # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID my ($orthoidlist) = {}; @@ -570,7 +569,7 @@ sub uploadKeggInformation { $dbh->multiple_query( $query, \@porthobucket ); } - print "* NUM LINES PORTHO: $#lines ".getLoggingTime()."\n"; + print "* NUM LINES PORTHO: $#lines\n"; #update definition field for proteins associated to this KO group From 58fa5502bfecc216438515cb45bd239abf16616e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 16 Mar 2021 18:15:19 +0100 Subject: [PATCH 088/381] clean --- scripts/load_kegg_KAAS.pl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 757a166..a4ca252 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -422,6 +422,7 @@ sub uploadKeggInformation { print "NUM LINES: $#lines\n"; + # TODO: Converge sqlite case to MySQL approach if possible foreach my $l (@lines) { # insert each ortholog @@ -459,9 +460,6 @@ sub uploadKeggInformation { # $ortholog_id=$results->[0]->{'id'}; # } - if(($loglevel eq 'debug' )||($loglevel eq 'info' )){ - print "SQL: $ortholog_sql_insert --- $ortholog_id\n"; - } } else { # Handling stuff for SQL my $values = "( \"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; @@ -473,7 +471,7 @@ sub uploadKeggInformation { if ($#orthobucket >= 0) { # VALUES here used for replacement my $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; - print STDERR Dumper( \@orthobucket ); + # print STDERR Dumper( \@orthobucket ); $dbh->multiple_query( $query, \@orthobucket ); } @@ -541,7 +539,7 @@ sub uploadKeggInformation { #my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; my $ortholog_id = $orthoidlist->{$organism_id}->{$gene_id}; - print STDERR "* $ortholog_id\n"; + # print STDERR "* $ortholog_id\n"; if ( ! $ortholog_id ) { print STDERR "Major error here"; @@ -565,11 +563,11 @@ sub uploadKeggInformation { # VALUES here used for replacement my $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; - print STDERR Dumper( \@porthobucket ); + # print STDERR Dumper( \@porthobucket ); $dbh->multiple_query( $query, \@porthobucket ); } - print "* NUM LINES PORTHO: $#lines\n"; + # print "* NUM LINES PORTHO: $#lines\n"; #update definition field for proteins associated to this KO group From bbfedd0619fd26dd1842077296f337cca003fea4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 17 Mar 2021 10:19:34 +0100 Subject: [PATCH 089/381] fix vars --- scripts/lib/SQL.schema.sql | 8 ++++---- scripts/lib/SQL.schema.sqlite.sql | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 27538ab..9413297 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -67,16 +67,16 @@ CREATE TABLE IF NOT EXISTS `organism` ( CREATE TABLE IF NOT EXISTS `ortholog` ( `ortholog_id` INTEGER PRIMARY KEY AUTO_INCREMENT , - `name` TEXT NOT NULL DEFAULT '' , - `db_id` TEXT , - `db_name` TEXT, + `name` VARCHAR(255) NOT NULL DEFAULT '' , + `db_id` VARCHAR(25), + `db_name` VARCHAR(25), `organism_id` INTEGER NOT NULL, UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) ); CREATE TABLE IF NOT EXISTS `protein_ortholog` ( `protein_ortholog_id` INTEGER PRIMARY KEY AUTO_INCREMENT , - `type` TEXT, + `type` VARCHAR(25), `kegg_group_id` INTEGER NOT NULL , `protein_id` INTEGER NOT NULL , `ortholog_id` INTEGER NOT NULL, diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index e4d625b..ba72589 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -66,16 +66,16 @@ CREATE TABLE IF NOT EXISTS `organism` ( CREATE TABLE IF NOT EXISTS `ortholog` ( `ortholog_id` INTEGER PRIMARY KEY AUTOINCREMENT , - `name` TEXT NOT NULL DEFAULT '' , - `db_id` TEXT , - `db_name` TEXT, + `name` VARCHAR(255) NOT NULL DEFAULT '' , + `db_id` VARCHAR(25), + `db_name` VARCHAR(25), `organism_id` INTEGER NOT NULL, UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) ); CREATE TABLE IF NOT EXISTS `protein_ortholog` ( `protein_ortholog_id` INTEGER PRIMARY KEY AUTOINCREMENT , - `type` TEXT, + `type` VARCHAR(25), `kegg_group_id` INTEGER NOT NULL , `protein_id` INTEGER NOT NULL , `ortholog_id` INTEGER NOT NULL, From eb14936427e16b109a93c38649b58ea8b3b89a42 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 22 Mar 2021 13:54:57 +0100 Subject: [PATCH 090/381] cosmetic --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index a4ca252..4f7bcf8 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -355,7 +355,7 @@ sub uploadKeggInformation { my $kegg_group_id; if ( $pre_upload_kegg > 0 ) { - print STDERR "* Entering $kegg_id\n"; + print STDERR "\n* Entering $kegg_id\n"; ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); #print STDERR "Prefilled\n"; From 216626f1e0cb4ec2e9489e3b59e144d6832d88c7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 22 Mar 2021 13:59:37 +0100 Subject: [PATCH 091/381] simplify sqlite --- scripts/load_kegg_KAAS.pl | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 4f7bcf8..3139604 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -304,12 +304,12 @@ sub uploadSingleKEGGId { my $kegg_group_sql_select = qq{ SELECT kegg_group_id FROM kegg_group WHERE db_id=\"$kegg_id\" }; my $kegg_group_sql_update = qq{ UPDATE kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", genes=\"$hash->{'GENES'}\", kegg_release=\"$kegg_release\";}; my $kegg_group_sql_insert = ""; - if( lc( $dbEngine ) eq 'sqlite') { - $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(kegg_group_id,name,definition,pathway,module,class,db_links,db_id,genes,kegg_release) VALUES (NULL,\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$hash->{'GENES'}\",\"$kegg_release\")}; - } - else { - $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", genes=\"$hash->{'GENES'}\", kegg_release=\"$kegg_release\";}; - } + #if( lc( $dbEngine ) eq 'sqlite') { + $kegg_group_sql_insert = qq{ INSERT INTO kegg_group(name,definition,pathway,module,class,db_links,db_id,genes,kegg_release) VALUES (\"$hash->{'NAME'}\",\"$hash->{'DEFINITION'}\",\"$hash->{'PATHWAY'}\",\"$hash->{'MODULE'}\",\"$hash->{'CLASS'}\", \"$hash->{'DBLINKS'}\",\"$kegg_id\",\"$hash->{'GENES'}\",\"$kegg_release\")}; + #} + #else { + # $kegg_group_sql_insert = qq{ INSERT INTO kegg_group SET name=\"$hash->{'NAME'}\",definition=\"$hash->{'DEFINITION'}\",pathway=\"$hash->{'PATHWAY'}\",module=\"$hash->{'MODULE'}\",class=\"$hash->{'CLASS'}\", db_links=\"$hash->{'DBLINKS'}\", db_id=\"$kegg_id\", genes=\"$hash->{'GENES'}\", kegg_release=\"$kegg_release\";}; + #} if(($loglevel eq 'debug' )||($loglevel eq 'info' )) { # print "SQL: $kegg_group_sql_insert\n"; } @@ -446,11 +446,11 @@ sub uploadKeggInformation { # print STDERR $ortholog_sql_update, "\n"; my $ortholog_sql_insert = ""; - if( lc( $dbEngine ) eq 'sqlite') { - $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id, name, organism_id, db_id, db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; + #if( lc( $dbEngine ) eq 'sqlite') { + # $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id, name, organism_id, db_id, db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; # print STDERR $ortholog_sql_insert, "\n"; - my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); + # my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); # Not needed for next step #small patch for SQLite - the current insert function could not return id of the last inserted record... @@ -460,11 +460,11 @@ sub uploadKeggInformation { # $ortholog_id=$results->[0]->{'id'}; # } - } else { + #} else { # Handling stuff for SQL - my $values = "( \"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; - push( @orthobucket, $values ); - } + my $values = "( \"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; + push( @orthobucket, $values ); + #} } @@ -549,13 +549,13 @@ sub uploadKeggInformation { my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; my $prot_ortholog_sql_insert =""; - if( lc( $config{'dbEngine'} ) eq 'sqlite') { - $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");}; - my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); - } else { - my $values = "( \"$protein_id\", \"$ortholog_id\", \"$type\", \"$kegg_group_id\" )"; - push( @porthobucket, $values ); - } + #if( lc( $config{'dbEngine'} ) eq 'sqlite') { + # $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");}; + # my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); + #} else { + my $values = "( \"$protein_id\", \"$ortholog_id\", \"$type\", \"$kegg_group_id\" )"; + push( @porthobucket, $values ); + #} } #for each group of genes in multiply organisms From 731c485e55e6289d4f37531a42a1ba46c4a44d0e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 22 Mar 2021 19:08:38 +0100 Subject: [PATCH 092/381] update Docker and version of sqlite --- Dockerfile | 2 +- scripts/load_kegg_KAAS.pl | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 109c89a..89638d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM biocorecrg/debian-perlbrew:stretch +FROM biocorecrg/debian-perlbrew:buster # File Author / Maintainer MAINTAINER Toni Hermoso Pulido diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 3139604..86cb860 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -469,8 +469,13 @@ sub uploadKeggInformation { } if ($#orthobucket >= 0) { + my $query; # VALUES here used for replacement - my $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; + if ( lc($dbEngine eq 'sqlite') ) { + $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON CONFLICT DO UPDATE SET name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; + } else { + $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; + } # print STDERR Dumper( \@orthobucket ); $dbh->multiple_query( $query, \@orthobucket ); } @@ -546,9 +551,9 @@ sub uploadKeggInformation { exit; } - my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; - my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; - my $prot_ortholog_sql_insert =""; + #my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; + #my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; + #my $prot_ortholog_sql_insert =""; #if( lc( $config{'dbEngine'} ) eq 'sqlite') { # $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");}; # my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); @@ -560,9 +565,13 @@ sub uploadKeggInformation { } #for each group of genes in multiply organisms if ($#porthobucket >= 0) { + my $query; # VALUES here used for replacement - my $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; - + if ( lc($dbEngine eq 'sqlite') ) { + $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON CONFLICT DO UPDATE SET protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + } else { + $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + } # print STDERR Dumper( \@porthobucket ); $dbh->multiple_query( $query, \@porthobucket ); } From 87288340e125c15aadf27dce88731dbbeca2d82c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 23 Mar 2021 14:38:56 +0100 Subject: [PATCH 093/381] comment that --- scripts/load_kegg_KAAS.pl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 86cb860..4859045 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -440,12 +440,12 @@ sub uploadKeggInformation { #populate ortholog table #check if ortholog already exists (yes && do_update => update record; no => insert new ortholog) - my $ortholog_sql_select = qq{ SELECT ortholog_id FROM ortholog WHERE name=\"$gene_id\" }; + # my $ortholog_sql_select = qq{ SELECT ortholog_id FROM ortholog WHERE name=\"$gene_id\" }; # print STDERR $ortholog_sql_select, "\n"; - my $ortholog_sql_update = qq{ UPDATE ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; + # my $ortholog_sql_update = qq{ UPDATE ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; # print STDERR $ortholog_sql_update, "\n"; - my $ortholog_sql_insert = ""; + # my $ortholog_sql_insert = ""; #if( lc( $dbEngine ) eq 'sqlite') { # $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id, name, organism_id, db_id, db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; From c4af64f93ac0895d90ab0211d5a5450c1238d15d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 23 Mar 2021 14:54:13 +0100 Subject: [PATCH 094/381] update lib --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 89638d9..38d5a76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ MAINTAINER Toni Hermoso Pulido RUN set -x ; apt-get update && apt-get -y upgrade # Specific of FA pipeline -RUN apt-get install -y r-base sqlite mysql-client default-libmysqlclient-dev +RUN apt-get install -y r-base sqlite mariadb-client default-libmysqlclient-dev RUN apt-get install -y texlive-latex-base texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra RUN apt-get install -y libxml2-dev libexpat1-dev libdb-dev libgd-dev From b8c4b6dddd934a18ca6ff11c197e70b024f631ed Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 23 Mar 2021 15:41:03 +0100 Subject: [PATCH 095/381] upgrade --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 38d5a76..71b627b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,9 @@ RUN apt-get install -y libxml2-dev libexpat1-dev libdb-dev libgd-dev RUN cpanm Config::Simple Config::JSON DBI DBD::mysql DBD::SQLite Digest::SHA File::Basename Getopt::Long IO::Handle JSON Lingua::EN::Ngram List::Util Scalar::Util String::Util ARG BIOPERL_VERSION=1.7.5 -RUN cpanm install CDRAUG/BioPerl-${BIOPERL_VERSION}.tar.gz +# https://stackoverflow.com/questions/47966512/error-installing-xmldomxpath +RUN cpanm --force XML::DOM::XPath +RUN cpanm CDRAUG/BioPerl-${BIOPERL_VERSION}.tar.gz RUN cpanm Bio::SearchIO::blastxml RUN apt-get install -y libssl-dev From f747d892bd5a870e0528fa6c1ce7b5f5f4177005 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 23 Mar 2021 19:36:12 +0100 Subject: [PATCH 096/381] fix stupid problem --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 4859045..2127117 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -471,7 +471,7 @@ sub uploadKeggInformation { if ($#orthobucket >= 0) { my $query; # VALUES here used for replacement - if ( lc($dbEngine eq 'sqlite') ) { + if ( lc($dbEngine) eq 'sqlite' ) { $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON CONFLICT DO UPDATE SET name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; } else { $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; @@ -567,7 +567,7 @@ sub uploadKeggInformation { if ($#porthobucket >= 0) { my $query; # VALUES here used for replacement - if ( lc($dbEngine eq 'sqlite') ) { + if ( lc($dbEngine) eq 'sqlite' ) { $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON CONFLICT DO UPDATE SET protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; } else { $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; From 6e78de62818aa40b429437a364b08bbdde699518 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 23 Mar 2021 21:49:27 +0100 Subject: [PATCH 097/381] INSERT OR IGNORE --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 2127117..a57e338 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -472,7 +472,7 @@ sub uploadKeggInformation { my $query; # VALUES here used for replacement if ( lc($dbEngine) eq 'sqlite' ) { - $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON CONFLICT DO UPDATE SET name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; + $query = "INSERT OR IGNORE INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ;"; } else { $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; } @@ -568,7 +568,7 @@ sub uploadKeggInformation { my $query; # VALUES here used for replacement if ( lc($dbEngine) eq 'sqlite' ) { - $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON CONFLICT DO UPDATE SET protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; } else { $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; } From 0b6864a581b851857443e1722320f92db8e73b4a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 24 Mar 2021 11:22:31 +0100 Subject: [PATCH 098/381] cleaning with trim --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 4859045..863a311 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -427,7 +427,7 @@ sub uploadKeggInformation { # insert each ortholog my ($code,$gene_id)=split/\:/,$l; - $gene_id=~s/^ //; + $gene_id = trim($gene_id); my $lcode=lc($code); #print STDERR "* ", $lcode, "\n"; #print STDERR "- ", Dumper( $codesOrg ); @@ -508,7 +508,7 @@ sub uploadKeggInformation { # insert each ortholog my ($code,$gene_id)=split/\:/,$l; - $gene_id=~s/^ //; + $gene_id = trim($gene_id); # determine if $gene_id containt a cluster of genes my @cluster=split/ /,$gene_id; $is_cluster=1 if scalar(@cluster)>1; From a59121692b85665e17a1c9b5eb41eea35be1aeb4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 24 Mar 2021 18:18:31 +0100 Subject: [PATCH 099/381] avoid limit in name --- scripts/load_kegg_KAAS.pl | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index cd6c9cb..b32d462 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -411,8 +411,8 @@ sub uploadKeggInformation { $gene_string = $hash->{'GENES'}; } - #print STDERR $proteinItem, "\t", $gene_string, "\n"; - #print "gene string: $gene_string\n"; + print STDERR $proteinItem, "\t", $gene_string, "\n"; + print STDERR "gene string: $gene_string\n"; my @lines=split/\,/,$gene_string; my $is_cluster; @@ -428,7 +428,16 @@ sub uploadKeggInformation { # insert each ortholog my ($code,$gene_id)=split/\:/,$l; $gene_id = trim($gene_id); - my $lcode=lc($code); + my $lcode=lc(trim($code)); + + my $name; + # Gene id can be too long + my (@names) = split(/ /, $gene_id); + if ( $#names > 9 ) { + $name = join(" ", @names[0..9]); + } else { + $name = join(" ", @names); + } #print STDERR "* ", $lcode, "\n"; #print STDERR "- ", Dumper( $codesOrg ); # next if ortholog is not in the list of species to analyze @@ -462,7 +471,7 @@ sub uploadKeggInformation { #} else { # Handling stuff for SQL - my $values = "( \"$gene_id\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; + my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; push( @orthobucket, $values ); #} @@ -510,10 +519,18 @@ sub uploadKeggInformation { my ($code,$gene_id)=split/\:/,$l; $gene_id = trim($gene_id); # determine if $gene_id containt a cluster of genes - my @cluster=split/ /,$gene_id; - $is_cluster=1 if scalar(@cluster)>1; - $is_cluster=0 if scalar(@cluster)==1; - my $lcode=lc($code); + my $name; + # Gene id can be too long + my (@names) = split(/ /, $gene_id); + if ( $#names > 9 ) { + $name = join(" ", @names[0..9]); + } else { + $name = join(" ", @names); + } + + $is_cluster=1 if scalar(@names)>1; + $is_cluster=0 if scalar(@names)==1; + my $lcode=lc(trim($code)); #print STDERR "* ", $lcode, "\n"; #print STDERR "- ", Dumper( $codesOrg ); # next if ortholog is not in the list of species to analyze @@ -542,7 +559,7 @@ sub uploadKeggInformation { #my $results_ortho = $dbh->select_from_table($query); #my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; - my $ortholog_id = $orthoidlist->{$organism_id}->{$gene_id}; + my $ortholog_id = $orthoidlist->{$organism_id}->{$name}; # print STDERR "* $ortholog_id\n"; From 0274c54391223695842fc77f1367a39fe6820f01 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 24 Mar 2021 18:18:47 +0100 Subject: [PATCH 100/381] more on name --- scripts/load_kegg_KAAS.pl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index b32d462..57a7873 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -390,6 +390,8 @@ sub uploadKeggInformation { print "* NUM PROT: $#proteinList\n"; + # Number limit names + my $limnames = 9; foreach my $proteinItem(@proteinList) { @@ -411,8 +413,8 @@ sub uploadKeggInformation { $gene_string = $hash->{'GENES'}; } - print STDERR $proteinItem, "\t", $gene_string, "\n"; - print STDERR "gene string: $gene_string\n"; + # print STDERR $proteinItem, "\t", $gene_string, "\n"; + # print STDERR "gene string: $gene_string\n"; my @lines=split/\,/,$gene_string; my $is_cluster; @@ -433,8 +435,8 @@ sub uploadKeggInformation { my $name; # Gene id can be too long my (@names) = split(/ /, $gene_id); - if ( $#names > 9 ) { - $name = join(" ", @names[0..9]); + if ( $#names > $limnames ) { + $name = join(" ", @names[0..$limnames]); } else { $name = join(" ", @names); } @@ -522,8 +524,8 @@ sub uploadKeggInformation { my $name; # Gene id can be too long my (@names) = split(/ /, $gene_id); - if ( $#names > 9 ) { - $name = join(" ", @names[0..9]); + if ( $#names > $limnames ) { + $name = join(" ", @names[0..$limnames]); } else { $name = join(" ", @names); } From d0b9c0d8021af0bc1c9a682104c88dedc0028a26 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 11 May 2021 12:08:02 +0200 Subject: [PATCH 101/381] fix get results --- scripts/get_results.pl | 17 +- scripts/lib/FunctionalAnnotation/DB.pm | 14 ++ .../lib/FunctionalAnnotation/uploadData.pm | 157 +++++++++++------- 3 files changed, 118 insertions(+), 70 deletions(-) diff --git a/scripts/get_results.pl b/scripts/get_results.pl index c8c9b1a..42e18c2 100755 --- a/scripts/get_results.pl +++ b/scripts/get_results.pl @@ -16,7 +16,7 @@ =head1 DESCRIPTION Typical usage is as follows: - % perl get_results.pl -conf main_configuration.ini + % perl get_results.pl -conf main_configuration.ini =head2 Options @@ -28,10 +28,10 @@ =head2 Options -list : File with selected protein IDs - script will process only those sequences -help : This documentation -Note: Don't forget to specify mandatory options in the main configuration file : +Note: Don't forget to specify mandatory options in the main configuration file : Database name and path; Result folder name; - + =head1 AUTHORS @@ -56,10 +56,10 @@ =head1 AUTHORS my ( $show_help,$confFile,$oboFile,$listFile); -&GetOptions( +&GetOptions( 'conf=s'=>\$confFile, 'obo=s'=>\$oboFile, - 'list=s'=>\$listFile, + 'list=s'=>\$listFile, 'help|h' => \$show_help ) or pod2usage(-verbose=>2); @@ -74,7 +74,7 @@ =head1 AUTHORS #read configuration file my $cfg = new Config::Simple($confFile); -#put config parameters into %config +#put config parameters into %config my %config = $cfg->vars(); #my %conf = %::conf; @@ -103,7 +103,7 @@ =head1 AUTHORS my @listIds=(); #create a list with protein ids, if ones is setted up -if(defined $listFile) +if(defined $listFile) { @listIds=&getSelectedIds($listFile); } #First - need to fulfill go term information if there are go terms without name and term_type fields fulfilled. To fulfill GO term information @@ -118,7 +118,8 @@ =head1 AUTHORS # print "Ontology File is here: $ontologyFile\n"; &uploadGOInfo($dbh, $ontologyFile); -#Then need to update annotation status to 'annotated' for those proteins with hits in any source of evidence (including blast). + +#Then need to update annotation status to 'annotated' for those proteins with hits in any source of evidence (including blast). &updateAnnotationStatus($dbh); #get summary information diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index f58cb24..4d9a617 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -266,6 +266,20 @@ sub select_from_table { return $self->{'select_from_table'}; } +sub select_from_array { + my ($self, $par) = @_; + + #if(($loglevel eq 'debug')){ $debugSQL && print STDOUT "SQL CODE: $par\n";} + my $sth = $self->prepare_stmt($par); + $sth->execute(); + $self->{'sth'} = $sth; + my @array=(); + while (my $res = $sth->fetchrow_arrayref()) { + push(@array, $res->[0]); + } + return \@array; +} + sub sth { my ($self, $sth) = @_; $self->{'sth'} = $sth if $sth; diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 8083308..f89d172 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -206,7 +206,7 @@ open FH,"$inFile"; # Toniher: Handling IDs more in detail since no always only words. Notice TransDecoder output my (@sids) = split( /\;/, $elms[$ids_ix] ); - + if ( $#sids >= 0 && $sids[0]=~/ID\=(\S+)\s*$/ ) { $gene_name=$1; } @@ -269,37 +269,37 @@ open FH,"$inFile"; # TODO: All this stuff below should be better rationalized for different cases elsif (($elms[$type_ix] eq 'transcript' )||($elms[$type_ix] eq 'mRNA' )||(($elms[$type_ix] eq 'CDS') && ( !$c_prot_id || $c_prot_id eq ''))) { - + my $prot_id=''; - + # Toniher: allowing more flexibility for parsing my $sid = $elms[$ids_ix]; if ( $sid ne '' ) { - + # TransDecoder. Added by Toniher if($prot_id eq '' && $elms[$annot_ix] eq 'transdecoder') { #if(($loglevel eq 'debug')) { print "TRANSID\n"; } $prot_id=$1 if $sid=~/ID=([^\;]+)/; } - + # Priority one if($prot_id eq '') { #if(($loglevel eq 'debug')) { print "TARGET\n"; } $prot_id=$1 if $sid=~/Target=([^\;]+)/; } - + #update 18/11/2015 #In some annotation versions, provided by Tyler he added 'product' instead of Target... Parent is also exists, but it refer to the transcripts, not proteins if($prot_id eq '') { #if(($loglevel eq 'debug')) { print "PRODUCT\n"; } $prot_id=$1 if $sid=~/product\=([^\;]+)/; } - + if($prot_id eq '') { #if(($loglevel eq 'debug')) { print "NAME\n"; } $prot_id=$1 if $sid=~/Name\=([^\;]+)/; } - + #In some annotation versions, provided by Tyler, Target field is absent and only present Parent transcript id. if($prot_id eq '') { #if(($loglevel eq 'debug')) { print "PARENT\n"; } @@ -349,9 +349,9 @@ close FH; sub insertProtein { my($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList,$dbh, $engine,$loglevel) =@_; - + if ( ! $c_prot_id || $c_prot_id eq '' ) { return; } - + if(!defined $engine){$engine = 'mysql';} my $numberElements = scalar keys %{$idList}||''; @@ -397,7 +397,7 @@ sub updateProteinDefinition my $debugSQL = 1; my ($selectString,$res,$proteinId); my @protList=(); - + foreach my $protItem(keys %{$annotData}) { #select protein_id from DB if($keyType eq 'protein_id') {$selectString = "SELECT d.protein_id, d.definition from protein p, definition d where p.protein_id=d.protein_id and p.protein_id = $protItem and d.source = '$source'";} @@ -405,18 +405,18 @@ sub updateProteinDefinition {$selectString = "SELECT d.protein_id, p.sha1, d.definition from protein p, definition d where p.protein_id=d.protein_id and p.stable_id like '$protItem' and d.source = '$source'";} #print STDERR $selectString, "\n"; $res = $dbh->select_from_table($selectString); - + if ( $#res < 0 ) { - + $definition = trim( join( " ", @{$annotData->{$protItem}{'annot'}} ) ); #TODO: Check quoting here $definition=~s/\s{2,}/ /g; - + my $insertString; if($keyType eq 'protein_id') { - + if( lc( $engine ) eq 'sqlite') { $insertString = "INSERT INTO definition ( definition_id, definition, source, protein_id ) values ( NULL, \"$definition\", \"$source\", '$protItem' );"; - + } else { $insertString = "INSERT INTO definition SET definition=\"$definition\", source =\"$source\", protein_id='$protItem';"; @@ -428,23 +428,23 @@ sub updateProteinDefinition $proteinId=$res->[0]->{'protein_id'}; if( lc( $engine ) eq 'sqlite') { $insertString = "INSERT INTO definition ( definition_id, definition, source, protein_id ) values ( NULL, \"$definition\", \"$source\", '$proteinId' );"; - + } else { $insertString = "INSERT INTO definition SET definition=\"$definition\", source =\"$source\", protein_id='$proteinId';"; - + } } } if(($loglevel eq 'debug')) { print "$insertString\n";} $dbh->insert_set($insertString); - + } else { - + if(($loglevel eq 'debug')||($loglevel eq 'info')) { print STDERR "There is no protein_id for $protItem, skipped!\n";} next; - + } } @@ -551,7 +551,7 @@ sub uploadInterProResults { next; } - + # next if $updateFlag==0; #if updateFlag ==1 @@ -726,34 +726,67 @@ return 1; } -sub updateAnnotationStatus -{ - my $dbh=shift; - #annotation status can be either 0 = not annotated, or 1 - annotated. Status==1 setting up when there is at least one hit from any - # source of evidence was used for annotation. +sub updateAnnotationStatus { + my $dbh=shift; - #lets reset to zero status any of the protein in DB + #annotation status can be either 0 = not annotated, or 1 - annotated. Status==1 setting up when there is at least one hit from any + # source of evidence was used for annotation. + + #lets reset to zero status any of the protein in DB my $updateString = "UPDATE protein set status = 0"; -if(($loglevel eq 'debug')){ print "SQL_CODE:$updateString\n";} + if(($loglevel eq 'debug')){ print "SQL_CODE:$updateString\n";} $dbh->update_set($updateString); - #then lets go through all tables and update status to 1 in case if protein had a record in selected table_name - #definition blast2go and kegg - # $updateString = "UPDATE protein, definition set protein.status = 1 where definition.definition is not null and definition.definition not like '' and protein.protein_id=definition.protein_id"; - $updateString = "UPDATE protein SET status = 1 where protein_id in ( SELECT protein_id from definition where definition is not null and definition not like '' )"; - if(($loglevel eq 'debug')){ print "SQL_CODE:$updateString\n" ;} - $dbh->update_set($updateString); -#blast hits, interpro domains and keggs -#my @tableList = qw(blast_hit domain protein_ortholog signalP); -my @tableList = qw(domain protein_ortholog signalP); - foreach my $dbItem(@tableList) - { - $updateString = "UPDATE protein set status = 1 where protein_id in (select distinct protein_id from $dbItem )"; - if(($loglevel eq 'debug')){ print "SQL_CODE:$updateString\n";} - $dbh->update_set($updateString); - } + #then lets go through all tables and update status to 1 in case if protein had a record in selected table_name + #definition blast2go and kegg + # $updateString = "UPDATE protein, definition set protein.status = 1 where definition.definition is not null and definition.definition not like '' and protein.protein_id=definition.protein_id"; + + # Let's get in bulks of 100; + my $protIdSelect = "SELECT protein_id from definition where definition is not null and definition not like '' "; + my $protIdDefs = $dbh->select_from_array($protIdSelect); + + &updateProteinStatus($dbh, $protIdDefs); + + #blast hits, interpro domains and keggs + #my @tableList = qw(blast_hit domain protein_ortholog signalP); + my @tableList = qw(domain protein_ortholog signalP); + foreach my $dbItem (@tableList) { - return 1; + my $protIdSelect = "select distinct protein_id from $dbItem"; + my $protIdDefs = $dbh->select_from_array($protIdSelect); + + &updateProteinStatus($dbh, $protIdDefs); + } + + return 1; +} + +sub updateProteinStatus { + + my $dbh = shift; + my $ids = shift; + + my $bulkNum = 100; # TODO: This could be adapted + + my @temp = (); + foreach my $protIdDef ( @{$ids} ) { + push( @temp, $protIdDef ); + if ( $#temp > $bulkNum ) { + $tmpStr = join( ", ", @temp ); + my $updateString = "UPDATE protein SET status = 1 where protein_id in ( $tmpStr )"; + if(($loglevel eq 'debug')){ print "SQL_CODE:$updateString\n" ;} + $dbh->update_set($updateString); + @temp = (); + } + } + if ( $#temp >= 0 ) { + $tmpStr = join( ", ", @temp ); + my $updateString = "UPDATE protein SET status = 1 where protein_id in ( $tmpStr )"; + if(($loglevel eq 'debug')){ print "SQL_CODE:$updateString\n" ;} + $dbh->update_set($updateString); + } + + return 1; } sub uploadCDsearchData @@ -769,7 +802,7 @@ sub uploadCDsearchData $sth2->execute(); my $proteinId = $sth2->fetchrow()||''; $sth2->finish(); - + #$results = $dbh->select_from_table($select); #my $proteinId = $results->[0]{'protein_id'}; @@ -957,11 +990,11 @@ sub parseAnnotation { chomp($line); ($proteinName, $annotTerm)=$line=~/^(\S+)\s+(\S.*)\s*/; - + if ( $annotTerm eq '#' ) { - + ($proteinName, $annotTerm)=$line=~/^(\S+)\s+\#\s+(\S.*)\s*/; - + } #some patch - new Lynx annotation had transcript name within protein name: LYPA23B012832T1|LYPA23B012832P1 I need only the second part, not the first one: @@ -983,7 +1016,7 @@ sub parseAnnotation push(@{$returnData{$proteinName}{'annot'}}, $annotTerm); } - + #if($line=~/\S+\s+\S+\s+(.+)$/) # {push(@{$returnData{$proteinName}{'definition'}}, $1); } @@ -1258,7 +1291,7 @@ sub constructStatment { $stmt .= $f . " = " . $val; } - + return $stmt; } @@ -1268,11 +1301,11 @@ sub selectLastId { my $engine = shift; if ( $engine eq 'mysql' ) { - + return "SELECT last_insert_id() as id "; } else { - + return "SELECT last_insert_rowid() as id "; } @@ -1280,26 +1313,26 @@ sub selectLastId { } sub handleValue { - + my $value = shift; my $context = shift; - + if ( $context eq 'evalue' ) { - + if ( looks_like_number( $value ) ) { - + return $value; - + } else { - + return undef; } - - + + } else { return $value; } - + } 1; From 3474c2dc6897c9253a6ace82bf443a71eee6eb08 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 11 May 2021 13:12:09 +0200 Subject: [PATCH 102/381] fix SQL schema --- scripts/lib/SQL.schema.sql | 138 +++++++++++++++++++++++++++++-------- 1 file changed, 109 insertions(+), 29 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 9413297..721ec38 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -5,7 +5,10 @@ CREATE TABLE IF NOT EXISTS `gene` ( `start` INTEGER NOT NULL DEFAULT '0' , `end` INTEGER NOT NULL DEFAULT '0' , `stable_id` TEXT , - `strand` TEXT ); + `strand` TEXT, + KEY `start_idx` ( `start` ), + KEY `end_idx` ( `end` ) +); CREATE TABLE IF NOT EXISTS `protein` ( `protein_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -20,13 +23,20 @@ CREATE TABLE IF NOT EXISTS `protein` ( `domain_checked` INTEGER NOT NULL DEFAULT '0' , `gene_id` INTEGER NOT NULL , `sha1` TEXT, - `status` INTEGER); + `status` INTEGER, + KEY `cds_start_idx` ( `cds_start` ), + KEY `cds_end_idx` ( `cds_end` ), + KEY `domain_checked_idx` ( `domain_checked` ), + KEY `gene_id_idx` ( `gene_id` ), + KEY `status_idx` ( `status` ) +); CREATE TABLE IF NOT EXISTS `definition` ( `definition_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` TEXT NOT NULL DEFAULT '' , `definition` TEXT, - `source` TEXT); + `source` TEXT +); CREATE TABLE IF NOT EXISTS `domain` ( @@ -35,14 +45,20 @@ CREATE TABLE IF NOT EXISTS `domain` ( `sequence` TEXT , `description` TEXT NOT NULL DEFAULT '' , `rel_start` INTEGER , - `rel_end` INTEGER , + `rel_start` INTEGER , `db_xref` TEXT NOT NULL DEFAULT '' , `score` REAL DEFAULT NULL , `evalue` REAL DEFAULT NULL , `ip_id` TEXT , `ip_desc` TEXT, `go` TEXT, - `protein_id` INTEGER NOT NULL ); + `protein_id` INTEGER NOT NULL, + KEY `rel_start_idx` ( `rel_start` ), + KEY `rel_end_idx` ( `rel_start` ), + KEY `score_idx` (`score`), + KEY `evalue_idx` (`evalue`), + KEY `protein_id_idx` (`protein_id`) +); CREATE TABLE IF NOT EXISTS `kegg_group` ( `kegg_group_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -54,7 +70,9 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `db_links` TEXT , `db_id` TEXT , `genes` TEXT , - `kegg_release` FLOAT); + `kegg_release` FLOAT, + KEY `kegg_release_idx` (`kegg_release`) +); CREATE TABLE IF NOT EXISTS `organism` ( `organism_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -63,7 +81,9 @@ CREATE TABLE IF NOT EXISTS `organism` ( `taxonomy_id` INTEGER , `name` TEXT , `synonyms` TEXT, - `kegg_code` TEXT ); + `kegg_code` TEXT, + KEY `taxonomy_id_idx` (`taxonomy_id`) +); CREATE TABLE IF NOT EXISTS `ortholog` ( `ortholog_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -71,7 +91,11 @@ CREATE TABLE IF NOT EXISTS `ortholog` ( `db_id` VARCHAR(25), `db_name` VARCHAR(25), `organism_id` INTEGER NOT NULL, - UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ) + UNIQUE( `name`, `db_id`, `db_name`, `organism_id` ), + KEY `name_idx` (`name`), + KEY `db_id_idx` (`db_id`), + KEY `db_name_idx` (`db_name`), + KEY `organism_id_idx` (`organism_id`) ); CREATE TABLE IF NOT EXISTS `protein_ortholog` ( @@ -80,25 +104,36 @@ CREATE TABLE IF NOT EXISTS `protein_ortholog` ( `kegg_group_id` INTEGER NOT NULL , `protein_id` INTEGER NOT NULL , `ortholog_id` INTEGER NOT NULL, - UNIQUE( `type`, `kegg_group_id`, `protein_id`, `ortholog_id` ) + UNIQUE( `type`, `kegg_group_id`, `protein_id`, `ortholog_id` ), + KEY `type_idx` (`type`), + KEY `kegg_group_id_idx` (`kegg_group_id`), + KEY `protein_id_idx` (`protein_id`), + KEY `ortholog_id_idx` (`ortholog_id`) ); CREATE TABLE IF NOT EXISTS `ipscn_version` ( `idipscn_version_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `ipscn_version` TEXT NOT NULL , - `domain_id` INTEGER NOT NULL ); + `domain_id` INTEGER NOT NULL, + KEY `domain_id_idx` (`domain_id`) +); CREATE TABLE IF NOT EXISTS `go_term` ( `go_term_id` INTEGER PRIMARY KEY AUTO_INCREMENT , - `go_acc` TEXT NOT NULL , + `go_acc` VARCHAR(30) NOT NULL, `go_name` TEXT , - `term_type` TEXT ); + `term_type` TEXT, + KEY `go_acc_idx` (`go_acc`) +); CREATE TABLE IF NOT EXISTS `protein_go` ( - `protein_go_id` INTEGER PRIMARY KEY AUTO_INCREMENT , + `protein_go_id` INTEGER PRIMARY KEY AUTO_INCREMENT, `go_term_id` INTEGER NOT NULL , `protein_id` INTEGER NOT NULL , - `source` TEXT ); + `source` TEXT, + KEY `go_term_id_idx` (`go_term_id`), + KEY `protein_id_idx` (`protein_id`) +); CREATE TABLE IF NOT EXISTS `blast_hit` ( `blast_hit_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -111,7 +146,16 @@ CREATE TABLE IF NOT EXISTS `blast_hit` ( length INTEGER, evalue REAL NOT NULL, hsp_length INTEGER, - percent_identity REAL ); + percent_identity REAL, + KEY `protein_id_idx` (`protein_id`), + KEY `score_idx` (`score`), + KEY `start_idx` ( `start` ), + KEY `end_idx` ( `end` ), + KEY `length_idx` ( `length` ), + KEY `evalue_idx` ( `evalue` ), + KEY `hsp_length_idx` ( `hsp_length` ), + KEY `percent_identity_idx` ( `percent_identity` ) + ); CREATE TABLE IF NOT EXISTS `signalP` ( `signalP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -119,7 +163,12 @@ CREATE TABLE IF NOT EXISTS `signalP` ( start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, - description TEXT ); + description TEXT, + KEY `protein_id_idx` (`protein_id`), + KEY `start_idx` ( `start` ), + KEY `end_idx` ( `end` ), + KEY `score_idx` (`score`) +); CREATE TABLE IF NOT EXISTS `chloroP` ( `chloroP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -127,13 +176,21 @@ CREATE TABLE IF NOT EXISTS `chloroP` ( start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, - description TEXT ); + description TEXT, + KEY `protein_id_idx` (`protein_id`), + KEY `start_idx` ( `start` ), + KEY `end_idx` ( `end` ), + KEY `score_idx` (`score`) +); CREATE TABLE IF NOT EXISTS `targetP` ( `targetP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` INTEGER NOT NULL , location TEXT NOT NULL, - RC INTEGER NOT NULL ); + RC INTEGER NOT NULL, + KEY `protein_id_idx` (`protein_id`), + KEY `RC_idx` (`RC`) +); CREATE TABLE IF NOT EXISTS `cd_search_features` ( @@ -144,7 +201,11 @@ CREATE TABLE IF NOT EXISTS `cd_search_features` ( `coordinates` TEXT, `complete_size` INTEGER, `mapped_size` INTEGER , - `source_domain` TEXT ); + `source_domain` TEXT, + KEY `protein_id_idx` (`protein_id`), + KEY `complete_size_idx` (`complete_size`), + KEY `mapped_size_idx` (`mapped_size`) +); CREATE TABLE IF NOT EXISTS `cd_search_hit` ( `cd_search_hit_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -158,13 +219,21 @@ CREATE TABLE IF NOT EXISTS `cd_search_hit` ( `E_Value` REAL , `Bitscore` REAL , `Short_name` TEXT , - `Incomplete` TEXT ); + `Incomplete` TEXT, + KEY `protein_id_idx` (`protein_id`), + KEY `coordinateFrom_idx` (`coordinateFrom`), + KEY `coordinateTo_idx` (`coordinateTo`), + KEY `E_Value_idx` (`E_Value`), + KEY `Bitscore_idx` (`Bitscore`) +); CREATE TABLE IF NOT EXISTS `xref` ( `xref_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `dbname` TEXT NOT NULL DEFAULT '' , `dbid` TEXT NOT NULL DEFAULT '' , - `protein_id` INTEGER NOT NULL ); + `protein_id` INTEGER NOT NULL, + KEY `protein_id_idx` (`protein_id`) +); @@ -172,8 +241,9 @@ CREATE TABLE IF NOT EXISTS `orthologxref` ( `orthologxref_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `dbname` TEXT NOT NULL DEFAULT '' , `dbid` TEXT NOT NULL DEFAULT '' , - `ortholog_id` INTEGER NOT NULL - ); + `ortholog_id` INTEGER NOT NULL, + KEY `ortholog_id_idx` (`ortholog_id`) +); CREATE TABLE IF NOT EXISTS `pathway` ( `pathway_id` INTEGER PRIMARY KEY AUTO_INCREMENT , @@ -182,7 +252,8 @@ CREATE TABLE IF NOT EXISTS `pathway` ( `db_name` TEXT NOT NULL DEFAULT '' , `name` TEXT NULL DEFAULT NULL , `go` TEXT NULL DEFAULT NULL , - `evidence_type` TEXT NOT NULL DEFAULT '' ); + `evidence_type` TEXT NOT NULL DEFAULT '' +); CREATE TABLE IF NOT EXISTS `reaction` ( @@ -191,13 +262,16 @@ CREATE TABLE IF NOT EXISTS `reaction` ( `db_id` TEXT NOT NULL DEFAULT '' , `db_name` TEXT NOT NULL DEFAULT '' , `name` TEXT NULL DEFAULT NULL , - `evidence_type` TEXT NOT NULL DEFAULT '' ); + `evidence_type` TEXT NOT NULL DEFAULT '' +); CREATE TABLE IF NOT EXISTS `ortholog_reaction` ( `ortholog_reaction_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `ortholog_id` INTEGER NOT NULL , - `reaction_id` INTEGER UNSIGNED NOT NULL + `reaction_id` INTEGER UNSIGNED NOT NULL, + KEY `ortholog_id_idx` (`ortholog_id`), + KEY `reaction_id_idx` (`reaction_id`) ); CREATE TABLE IF NOT EXISTS `complex` ( @@ -206,15 +280,21 @@ CREATE TABLE IF NOT EXISTS `complex` ( `db_name` TEXT NOT NULL DEFAULT '', `name` TEXT NULL DEFAULT NULL, `stable_id` TEXT NOT NULL DEFAULT '' - ); +); CREATE TABLE IF NOT EXISTS `ortholog_complex` ( `ortholog_complex_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `complex_id` INTEGER NOT NULL , - `ortholog_id` INTEGER NOT NULL ); + `ortholog_id` INTEGER NOT NULL, + KEY `complex_id_idx` (`complex_id`), + KEY `ortholog_id_idx` (`ortholog_id`) +); CREATE TABLE IF NOT EXISTS `reaction_pathway` ( `reaction_pathway_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `reaction_id` INTEGER NOT NULL , - `pathway_id` INTEGER NOT NULL ); + `pathway_id` INTEGER NOT NULL, + KEY `reaction_id_idx` (`reaction_id`), + KEY `pathway_id_idx` (`pathway_id`) +); From b4632f6bcac6e0bcfb60e8e1e83e301bb30b5f0c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 11 May 2021 13:30:19 +0200 Subject: [PATCH 103/381] fix sql tables --- scripts/lib/SQL.schema.sql | 5 +++-- scripts/lib/SQL.schema.sqlite.sql | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 721ec38..325d9fb 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -33,9 +33,10 @@ CREATE TABLE IF NOT EXISTS `protein` ( CREATE TABLE IF NOT EXISTS `definition` ( `definition_id` INTEGER PRIMARY KEY AUTO_INCREMENT , - `protein_id` TEXT NOT NULL DEFAULT '' , + `protein_id` INTEGER NOT NULL , `definition` TEXT, - `source` TEXT + `source` TEXT, + KEY `protein_id_idx` (`protein_id`) ); diff --git a/scripts/lib/SQL.schema.sqlite.sql b/scripts/lib/SQL.schema.sqlite.sql index ba72589..874bf06 100644 --- a/scripts/lib/SQL.schema.sqlite.sql +++ b/scripts/lib/SQL.schema.sqlite.sql @@ -24,7 +24,7 @@ CREATE TABLE IF NOT EXISTS `protein` ( CREATE TABLE IF NOT EXISTS `definition` ( `definition_id` INTEGER PRIMARY KEY AUTOINCREMENT , - `protein_id` TEXT NOT NULL DEFAULT '' , + `protein_id` INTEGER NOT NULL , `definition` TEXT, `source` TEXT); From 9bc1b8023bb31ae8f8431d96a8a5965825b47fb8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 11 May 2021 14:28:39 +0200 Subject: [PATCH 104/381] fix error --- scripts/lib/SQL.schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 325d9fb..6347a6d 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -46,7 +46,7 @@ CREATE TABLE IF NOT EXISTS `domain` ( `sequence` TEXT , `description` TEXT NOT NULL DEFAULT '' , `rel_start` INTEGER , - `rel_start` INTEGER , + `rel_end` INTEGER , `db_xref` TEXT NOT NULL DEFAULT '' , `score` REAL DEFAULT NULL , `evalue` REAL DEFAULT NULL , @@ -55,7 +55,7 @@ CREATE TABLE IF NOT EXISTS `domain` ( `go` TEXT, `protein_id` INTEGER NOT NULL, KEY `rel_start_idx` ( `rel_start` ), - KEY `rel_end_idx` ( `rel_start` ), + KEY `rel_end_idx` ( `rel_end` ), KEY `score_idx` (`score`), KEY `evalue_idx` (`evalue`), KEY `protein_id_idx` (`protein_id`) From ec240c3382293b0f26b9adc299c05d3fb8fa529b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 15 May 2021 11:19:41 +0200 Subject: [PATCH 105/381] update part here --- scripts/lib/FunctionalAnnotation/DB.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/scripts/lib/FunctionalAnnotation/DB.pm index 4d9a617..4453fa7 100644 --- a/scripts/lib/FunctionalAnnotation/DB.pm +++ b/scripts/lib/FunctionalAnnotation/DB.pm @@ -365,7 +365,7 @@ sub multiple_query { my $values_string = join( ", ", @{$values} ); $query =~ s/#VALUES#/$values_string/; - print STDERR $query; + # print STDERR $query; my $sth = $self->prepare_stmt($query); $sth->execute(); From e94be0f5752c80e536e9fe278b09485cb816bd54 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 15 May 2021 11:32:59 +0200 Subject: [PATCH 106/381] more stuff --- TODO.md | 4 ++-- scripts/load_kegg_KAAS.pl | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/TODO.md b/TODO.md index 5a42dc6..52cf434 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,6 @@ * Check kegg_upload slow process + * In pre-upload insert many KEGG entries at once. + * Improve KEGG-GO part * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Improve documentation of parameters * Include some testing and CI @@ -7,7 +9,6 @@ * Ensure stop of MySQL process when error --- * Allow conversion from GenBank https://metacpan.org/pod/bp_genbank2gff3.pl -* In reports, put select distincts again tables * Allow reports from KEGG orthologs (number of potential orthologs from KEGG species) * blast_hit reconsider * Allow more flexibility for input parameters batch @@ -15,4 +16,3 @@ * Migrate to DSL2 * Add PhylomeDB in analysis * Add PANNZER in analysis - diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 57a7873..c4af3e5 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -597,13 +597,12 @@ sub uploadKeggInformation { # print "* NUM LINES PORTHO: $#lines\n"; - + # Toniher. This below is not necessary since it is sent to updateProteinDefinition #update definition field for proteins associated to this KO group - if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { - push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); - } + #if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { + # push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); + #} - # Toniher. This below is not necessary since it is sent to updateProteinDefinition #$protein_definition .='KEGG:'.$hash->{'DEFINITION'}.';'; #$sqlUpdate = "UPDATE protein set definition='$protein_definition' where protein_id=$protein_id"; # print "SQL_CODE:$sqlUpdate\n" ; @@ -612,6 +611,8 @@ sub uploadKeggInformation { # add GO terms info into go_term and protein_go table. # TODO Consider in the future other annotations, such as COG if(defined $hash->{'DBLINKS'}) { + # TODO: Multiple GOs here, need to consider all maybe + # DBLINKS GO: 0016279 0030544 my $goId = parseKEGGDBLInks($hash->{'DBLINKS'}); if($goId ne '') { #insert go term, associated with this protein into go_term table, and then into protein_go @@ -632,6 +633,7 @@ sub uploadKeggInformation { $goTermId=$results->[0]->{'id'}; } #select protein_go_id if there is one, and add 'KEGG' to the source field + # TODO: Change INSERT or IGNORE here $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; my $result =$dbh->select_from_table($sqlSelect); if ( $#$result < 0 ) { @@ -650,7 +652,8 @@ sub uploadKeggInformation { #update protein definition for KEGG source #print STDERR "Definition\n"; #print STDERR Dumper( \%protDefinitionData ); - &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + # Toniher: We do not include protein Definition here + # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); print STDERR "Finished here ".getLoggingTime()."\n"; }#sub From b2f66a75bb2b95d771759e84b78c11e19a6f433b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 15 May 2021 11:50:44 +0200 Subject: [PATCH 107/381] more info --- scripts/load_kegg_KAAS.pl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c4af3e5..e1093e3 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -120,6 +120,8 @@ =head1 AUTHORS #get list of organisms from the KEGG server and select only ones that needed %organisms = &organism_table(\@kegg_codes,$config{'dbEngine'} ,$dbh); +print STDERR "Start here ".getLoggingTime()."\n"; + my %keggs=(); # parse $input to know the number of associations of a KEGG group to different proteins open (FH, "$input"); @@ -146,6 +148,8 @@ =head1 AUTHORS $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); } +print STDERR "Preupload finished here ".getLoggingTime()."\n"; + #print Dumper( \%keggs ); #print Dumper( \%organisms ); @@ -566,7 +570,7 @@ sub uploadKeggInformation { # print STDERR "* $ortholog_id\n"; if ( ! $ortholog_id ) { - print STDERR "Major error here"; + print STDERR "Major error here\n"; exit; } @@ -595,6 +599,8 @@ sub uploadKeggInformation { $dbh->multiple_query( $query, \@porthobucket ); } + print STDERR "Ortholog here ".getLoggingTime()."\n"; + # print "* NUM LINES PORTHO: $#lines\n"; # Toniher. This below is not necessary since it is sent to updateProteinDefinition @@ -647,6 +653,9 @@ sub uploadKeggInformation { }#if there was a GO records }#if defined dbLinks }#foreach protein Item + + print STDERR "Protein finished here ".getLoggingTime()."\n"; + }#foreach kegg KO item #update protein definition for KEGG source From 5469f3d7ae448314f42b14f3d9ba94c2c662db77 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 16:54:07 +0200 Subject: [PATCH 108/381] cleaning a bit docs --- README.md | 21 ++++++++++++++------- params.config | 4 ++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6040900..5ee8251 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Note: for the downstream processing of the KO file it is very important to store ### Configuration file The pipeline require as an input the configuration file with specified parameters, such as path to the input files, specie name, KEGG specie abbreviations used to obtain KO groups, and some more. -The example of configuration file is included into this repository with name params.config +The example of configuration file is included into this repository with name ```params.config``` ## Running the pipeline @@ -56,7 +56,7 @@ More information can be found in the [Nextflow documentation](https://www.nextfl * **signalP**: it performs signalP analyses from input files * **targetP**: it performs targetP analyses from input files * **blast_annotator**: it retrieves GO terms from BLAST hits -* **blastDef**: it suggest a definition to input entries based on BLAST hits +* **blastDef**: it attaches a definition to input entries based on BLAST hits * **cdSearchHit**: it performs a NCBI CDSearch Hit query * **cdSearchFeat**: it performs a NCBI CDSearch Feature query * **initDB**: it initialitzes the Database used for gathering data from different analyses and later generating the reports @@ -66,14 +66,15 @@ More information can be found in the [Nextflow documentation](https://www.nextfl * **CDSearch_hit_upload**: : it uploads NCBI CDSearch Hit analyses into the DB * **CDSearch_feat_upload**: it uploads NCBI CDSearch Feature analyses into the DB * **blast_annotator_upload**: it uploads GO terms from BLAST hits into the DB -* **kegg_upload**: it retrieves and uploads KEGG data into the DB +* **kegg_download**: it downloads KO (Kegg Ortholog) from KEGG +* **kegg_upload**: it retrieves and uploads KEGG data (either from a KAAS file or KofamKOALA) into the DB * **generateResultFiles**: it generates report files -* **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information +* **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information from the previous annotation steps ### Formatted databases -* For BLAST: ```blastDbPath = "/path/to/db"``` It looks for formatted database files (normally named db.p* for protein type based ones), otherwise it will try to format FASTA file with that name -* For DIAMOND: ```blastDbPath = "/path/to/db"``` It looks for a single formatted database file (normally named db.dmnd), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) +* For NCBI BLAST+: ```blastDbPath = "/path/to/db"``` and ```diamond = "false"```. It looks for formatted database files (normally named db.p* for protein type based ones), otherwise it will try to format FASTA file with that name +* For DIAMOND: ```blastDbPath = "/path/to/db"``` and ```diamond = "true"```. It looks for a single formatted database file (normally named db.dmnd), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) ### About blast_annotator @@ -92,11 +93,17 @@ As written down in ```nextflow.config``` file, whenever possible, we try to prov * [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this) * [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this) -## How to build a container +### How to build base container +The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. + +``` + # Generate Docker image docker build -t fa-nf . + # Generate Singularity image if preferred sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest +``` ## Running in MySQL mode diff --git a/params.config b/params.config index e849ed3..88464c2 100644 --- a/params.config +++ b/params.config @@ -14,8 +14,6 @@ params { chunkIPSSize = 25 chunkKoalaSize = 50 chunkWebSize = 100 - dbEngine = "MySQL" - dbname = "Pvulgaris" oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" resultPath = "${baseDir}/results/" stdoutLog = "${baseDir}/logs/functional_annotation.stdout" @@ -26,6 +24,8 @@ params { koprofiles = "/nfs/db/kegg/profiles" gogourl = "http://gogo.test.crg.eu/api" ipscantmp = "${baseDir}/tmp/" + dbEngine = "MySQL" + dbname = "Pvulgaris" dbuser = "test" dbpass = "test" dbport = 12345 From 0253c2232b2db80dcdedc084f2c73101e3fffd07 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 17:18:57 +0200 Subject: [PATCH 109/381] more details --- README.md | 31 +++++++++++++++++++++++++++++-- run_pipeline_mysql.pl | 3 +++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5ee8251..f906790 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,34 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola ## Running in MySQL mode -We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local. +Running in MySQL mode improves the speed of the pipeline, but some care must be taken for including connection details in the configuration. + +The relevant paremetres below: + +``` + # Database engine. Specify MySQL (otherwise 'SQLite' will be used) + dbEngine = "MySQL" + # Database name. If it does not exist, if the user has enough permissions it will be created + dbname = "Pvulgaris" + # Database user name + dbuser = "test" + # Database user password + dbpass = "test" + # Port of the MySQL engine + dbport = 12345 + # The host where the MySQL engine is located. Skip it if using the wrapper below + dbhost = 0.0.0.0 + # If using the wrapper below, where MySQL data will be stored + mysqldata = "${baseDir}/mysql/" + # If using the wrapper below, where MySQL instance logs will be stored + mysqllog = "${baseDir}/tmp" + # If using the wrapper below, which Singularity image will be used + mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" +``` + +### Execution without ad-hoc database + +We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local without having to set up any MySQL server and database before thanks to Singularity. nohup perl run_pipeline_mysql.pl -conf ./params.config &> log.mysql & @@ -116,7 +143,7 @@ It is also possible to pass additional Nextflow parameters nohup perl run_pipeline_mysql.pl -params "-with-dag -with-report -with-timeline" -conf ./params.config &> log.mysql & -## Running only MySQL +### Inspection of MySQL database This is convenient for checking results database once analyses are finished. NO further analyses are run. diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index 2d7d7a1..c744fe0 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -110,6 +110,9 @@ if ( lc( $config{"dbEngine"} ) eq 'mysql' ) { # Check all MySQL params are there + if ( ! $config{"mysqlimg"} || ! -f $config{"mysqlimg"} ) { + $config{"mysqlimg"} = "docker://library/mariadb"; + } if ( $config{"dbuser"} && $config{"dbpass"} && $config{"dbport"} && $config{"mysqlimg"} ) { From dce52d782adc9cc2573a0833d48a5209bf685b8b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 17:21:52 +0200 Subject: [PATCH 110/381] increase year --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index cb5d6d2..5b32a2f 100644 --- a/main.nf +++ b/main.nf @@ -1,7 +1,7 @@ #!/usr/bin/env nextflow /* - * Copyright (c) 2017-2020, Centre for Genomic Regulation (CRG) + * Copyright (c) 2017-2021, Centre for Genomic Regulation (CRG) * * Copyright (c) 2017, Anna Vlasova * From 4652be4f0da71832a0be49d4b2547f8e16f710e3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 18:23:53 +0200 Subject: [PATCH 111/381] more time margin --- run_pipeline_mysql.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index c744fe0..7cd2d13 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -29,7 +29,7 @@ $random .= @rchars[rand @rchars] for 1..8; # extra params for cluster queue -my $extra = "-j y -l virtual_free=2G,h_rt=172800 -N MYSQL_container -m be -cwd -V -q long-sl7"; +my $extra = "-j y -l virtual_free=4G,h_rt=372800 -N MYSQL_container -m be -cwd -V -q long-sl7"; GetOptions( "conf=s"=>\$confFile, From cd43ae243c290c5ae23dbde99f59ea4f74f04ab8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 18:28:59 +0200 Subject: [PATCH 112/381] more default time kegg_upload --- main.nf | 2 ++ nextflow.config | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/main.nf b/main.nf index 5b32a2f..60a5188 100644 --- a/main.nf +++ b/main.nf @@ -855,6 +855,8 @@ process 'kegg_download'{ process 'kegg_upload'{ + label 'kegg_upload' + maxForks 1 input: diff --git a/nextflow.config b/nextflow.config index ca1d9c3..d910a7d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -66,6 +66,10 @@ process{ cpus='8' container="quay.io/biocontainers/kofamscan:1.2.0--0" } + + withLabel: kegg_upload { + time='48h' + } } process.container = "guigolab/fa-nf:latest" From 7d232043464bdfc1a444e2f5920a23ba60acbd28 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 18:37:43 +0200 Subject: [PATCH 113/381] put biocore --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index d910a7d..9f077b6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -42,7 +42,7 @@ process{ } withLabel: sigtarp { - queue='short-sl7' + queue='biocore-el7,short-sl7' container="/software/bi/biocore_tools/git/singularity/sigtarp.sif" } From be9e06b911d7b27809ee89cb9fb4c1f57ae5a2f8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 May 2021 23:48:01 +0200 Subject: [PATCH 114/381] Remove more than one asterisk --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 60a5188..a2c4934 100644 --- a/main.nf +++ b/main.nf @@ -609,7 +609,7 @@ process ipscn { file("out_interpro_${seq}") into (ipscn_result1, ipscn_result2) """ - sed 's/*//' $seq > tmp4ipscn + sed 's/*//g' $seq > tmp4ipscn interproscan.sh -i tmp4ipscn --goterms --iprlookup --pathways -o out_interpro_${seq} -f TSV -T ${params.ipscantmp} """ } From d98b68a346c88f499f067f55bf0a0916b246ab4d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 14:03:27 +0200 Subject: [PATCH 115/381] avoid non GO entries --- scripts/lib/FunctionalAnnotation/uploadData.pm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index f89d172..fbe0d0e 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -617,10 +617,14 @@ sub uploadInterProResults #Vlasova A. 16-01-2013 #insert go information into go_term table and then into protein_go - $go =~s/^\s+//; - $go =~s/\s+$//; + #$go =~s/^\s+//; + #$go =~s/\s+$//; + $go = trim( $go ); my @goList=split(/\|/, $go); + # Ensure only GO codes enter + @goList = grep {$_=~/^GO/} @goList; + # Toniher. 2019-01-18. Changed key from go to annot, so it can be imported back push(@{$retGOData{$protKey}{'annot'}}, @goList); From 1e089a407057659e4100a32e8091a286198ebf6e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 14:12:06 +0200 Subject: [PATCH 116/381] non IPR entries --- scripts/get_gff3.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index e82e4b6..9af040d 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -326,7 +326,7 @@ sub createGFF3File { if ( $descfield && $descfield ne '' ) { push( @descarr, escapeGFF( $descfield ) ); } - if ( $ipdesc && $ipdesc ne '' ) { + if ( $ipdesc && $ipdesc ne '' && $ipdesc ne '-' ) { push( @descarr, escapeGFF( $ipdesc ) ); } @@ -339,7 +339,7 @@ sub createGFF3File { if ( $protName && $protName ne '' ) { print OUTFILE "$protName\t$dbName\tprotein_match\t$domainStart\t$domainEnd\t$evalue\t$strand\t.\tName=$domainName;ID=InterProScan$idInterPro;"; - if( $ipID && $ipID ne '' ) { + if( $ipID && $ipID ne '' && $ipID ne '-' ) { print OUTFILE "interpro_id=$ipID;"; } if($description && $description ne '') { From 467c7f44b60374df344a264d1c98b44b8ec31035 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 14:24:23 +0200 Subject: [PATCH 117/381] koPathway fix --- scripts/get_gff3.pl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index 9af040d..5fb731a 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -262,8 +262,13 @@ sub createGFF3File { my $koGroup = $results->[0]->{'db_id'}; my $koDefinition = $results->[0]->{'definition'}; my $koPathway = $results->[0]->{'pathway'}; - if((defined $koGroup) && ($koGroup ne '')) - {$descrField .= "ko_group=$koGroup;ko_definition=".escapeGFF($koDefinition).";ko_pathway=$koPathway;";} + if((defined $koGroup) && ($koGroup ne '')) { + + $descrField .= "ko_group=$koGroup;ko_definition=".escapeGFF($koDefinition).";"; + + if ( trim( $koPathway ) ne '' ) { + $descrField .= "ko_pathway=$koPathway;"; + } } if ( $protName && $protName ne '' ) { From e7dbc834daa0bd32834c7b20b7d52415d0082148 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 16:58:35 +0200 Subject: [PATCH 118/381] distinct --- .../lib/FunctionalAnnotation/getResults.pm | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/scripts/lib/FunctionalAnnotation/getResults.pm index 3ecc66a..b527d7e 100644 --- a/scripts/lib/FunctionalAnnotation/getResults.pm +++ b/scripts/lib/FunctionalAnnotation/getResults.pm @@ -6,15 +6,15 @@ Anna Vlasova anna.vlasova@crg.es - + =head2 Description - + This module is selecting data from different tables from the functional annotation database and creates different output files. - + =head2 Example - - + + =cut package FunctionalAnnotation::getResults; @@ -36,7 +36,7 @@ sub getGOInformation my %retData=(); my $numberKeys =scalar @{$protIdList}; - my $condStat= ''; + my $condStat= ''; if($numberKeys>0) { foreach my $item(@{$protIdList}) @@ -49,7 +49,7 @@ sub getGOInformation my $results =$dbh->select_from_table($sqlSelect); #print Dumper($results); my ($protein_id, $key, $source); - foreach my $result (@{$results}) + foreach my $result (@{$results}) { $protein_id = $result->{'protein_id'}; #print "$protein_id\n"; @@ -67,9 +67,9 @@ sub printSummaryInfo { my($protIdList, $dbh,$fileName ) = @_; - + my $numberKeys =scalar @{$protIdList}; - my $condStat= ''; + my $condStat= ''; my $condStat2=''; my($sqlSelect,$result,$resultNumber ); if($numberKeys>0) @@ -128,7 +128,7 @@ sub printSummaryInfo } print OUTPUT '#' x40 ."\n". "Annotated features, proteins\n". '#' x40 ."\n"; - + #Proteins with definition $sqlSelect = "select count(distinct protein_id) from definition where (definition is not null or definition not like '') $condStat2"; $results =$dbh->select_from_table($sqlSelect); @@ -138,7 +138,7 @@ sub printSummaryInfo $propAnnot =sprintf("%.2f",$resultNumber*100/$numberProteins); print OUTPUT "Proteins with definition(name): $resultNumber ($propAnnot %)\n"; } - + # TODO: To review all these tables #get proteins with domains and other features #$sqlSelect = "select protein_id from protein where protein_id in (select distinct protein_id from domain) $condStat2"; @@ -172,26 +172,26 @@ sub printDefinitionInfo my $numberKeys =scalar @{$listIds}; my $condStat=''; - if($numberKeys>0) - { + if ($numberKeys>0) { foreach my $item(@{$protIdList}) {$item = "'$item'";} my $idString = join(',', @{$protIdList}); $condStat = "and p.stable_id in ($idString)"; } + open(OUTPUT, ">$file")||die("Can't open $file for writing $!\n"); print OUTPUT "#PROTEIN_NAME\tDEFINITION_SOURCE\tSOURCE\n"; my @defArray=(); my $sqlselect; - + if ( $dbEngine eq 'mysql' ){ - $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( d.source SEPARATOR \"; \" ) as src, GROUP_CONCAT( d.definition SEPARATOR \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; + $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( distinct( d.source ) SEPARATOR \"; \" ) as src, GROUP_CONCAT( distinct( d.definition ) SEPARATOR \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; } else { - $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( d.source, \"; \" ) as src, GROUP_CONCAT( d.definition, \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; + $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( distinct( d.source ), \"; \" ) as src, GROUP_CONCAT( distinct( d.definition ), \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; } - - + + my $results =$dbh->select_from_table($sqlSelect); foreach my $result (@{$results}) { @@ -199,11 +199,11 @@ sub printDefinitionInfo my $src=$result->{'src'}; my $def=$result->{'def'}; $def=~s/\;$//; - + print OUTPUT "$stbId\t$src\t$def\n"; - } - + } + close(OUTPUT); return 1; } @@ -234,7 +234,7 @@ sub printDomains $description =$domainsHash->{$pItem}{$kItem}{'descr'}; print OUTFILE "$proteinName\t$dbName\tprotein_match\t$domainStart\t$domainEnd\t$evalue\t$proteinHash->{$pItem}{'strand'}\t.\tName=$domainName;Target=$proteinName;Note=$description;\n"; } - + } close(OUTFILE); } @@ -246,7 +246,7 @@ sub printGoTerms my($protIdList,$fileName, $dbh,$param)=@_; my $numberKeys =scalar @{$protIdList}; - my $condStat= ''; + my $condStat= ''; my $condStat2=''; if($numberKeys>0) { @@ -265,7 +265,7 @@ sub printGoTerms print OUTPUT "#PROTEIN_NAME\tGO_ACC\tGO_NAME\tGO_TYPE\tGO_SOURCE\n"; my $sqlSelect = "select protein.protein_id,protein.stable_id, go_term.go_acc, go_term.go_name, go_term.term_type, group_concat( distinct( protein_go.source ) ) as GO_source from protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id group by protein.protein_id, go_term.go_acc order by protein.stable_id;"; $results =$dbh->select_from_table($sqlSelect); - foreach my $result (@{$results}) + foreach my $result (@{$results}) { print OUTPUT "$result->{'stable_id'}\t$result->{'go_acc'}\t$result->{'go_name'}\t$result->{'term_type'}\t$result->{'GO_source'}\n"; } @@ -275,11 +275,11 @@ sub printGoTerms open(OUTPUT, ">$fileName")||die("Can't opne $fileName for writing! $!\n"); print OUTPUT "#GENE_NAME\tGO_ACC\tGO_SOURCE\n"; - my $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; - + my $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; + $results =$dbh->select_from_table($sqlSelect); - foreach my $result (@{$results}) + foreach my $result (@{$results}) { print OUTPUT "$result->{'gene_name'}\t$result->{'GO_acc'}\t$result->{'GO_source'}\n"; } close(OUTPUT); @@ -294,7 +294,7 @@ sub printBlastHit my($protIdList,$fileName, $dbh)=@_; my $numberKeys =scalar @{$protIdList}; - my $condStat= ''; + my $condStat= ''; my $condStat2=''; if($numberKeys>0) { @@ -306,9 +306,9 @@ sub printBlastHit open(OUTPUT, ">$fileName")||die("Can't open $fileName for writing! $!\n"); print OUTPUT "PROTEIN_NAME\thit_id\tscore\te-value\tpercent identity\tProtein length\tHit length\tHSP length\thit description\n"; - my $sqlSelect = "select protein.protein_id,stable_id, hit_id,score,evalue, percent_identity, length(sequence), length, hsp_length,description from protein,blast_hit where $condStat protein.protein_id=blast_hit.protein_id order by protein.protein_id,score DESC"; + my $sqlSelect = "select protein.protein_id,stable_id, hit_id,score,evalue, percent_identity, length(sequence), length, hsp_length,description from protein,blast_hit where $condStat protein.protein_id=blast_hit.protein_id order by protein.protein_id,score DESC"; my $results =$dbh->select_from_table($sqlSelect); - foreach my $result (@{$results}) + foreach my $result (@{$results}) { print OUTPUT "$result->{'stable_id'}\t$result->{'hit_id'}\t$result->{'score'}\t$result->{'evalue'}\t$result->{'percent_identity'}\t$result->{'length(sequence)'}\t$result->{'length'}\t$result->{'hsp_length'}\t$result->{'description'}\n"; } @@ -326,9 +326,9 @@ sub makeAnnotatedVsNotAnnotatedPlot my $lengthFile3 = $tmpFolder."notannotatedProteins.withLength.txt"; my($sqlSelect, $results); - my $sqlSelect1 = "select protein_id, stable_id, length(sequence) from protein"; - my $sqlSelect2 = "select protein_id, stable_id, length(sequence) from protein where status=1"; - my $sqlSelect3 = "select protein_id, stable_id, length(sequence) from protein where status=0"; + my $sqlSelect1 = "select protein_id, stable_id, length(sequence) from protein"; + my $sqlSelect2 = "select protein_id, stable_id, length(sequence) from protein where status=1"; + my $sqlSelect3 = "select protein_id, stable_id, length(sequence) from protein where status=0"; my %fileHash=($lengthFile1=>$sqlSelect1, $lengthFile2=>$sqlSelect2, @@ -339,7 +339,7 @@ sub makeAnnotatedVsNotAnnotatedPlot open(OUT, ">$item")||die("Can't open $item for writing $!\n"); $sqlSelect = $fileHash{$item}; $results =$dbh->select_from_table($sqlSelect); - foreach my $result (@{$results}) + foreach my $result (@{$results}) { if ( $result->{protein_id} && $result->{'stable_id'} && $result->{'length(sequence)'} ) { print OUT "$result->{protein_id}\t$result->{'stable_id'}\t$result->{'length(sequence)'}\n"; From 7aa0b75d272af36b50fa64d02ce98d0a1f0de010 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 17:23:46 +0200 Subject: [PATCH 119/381] more cleaning --- scripts/definitionFromBlast.pl | 32 ++++++++++++++++++-------------- scripts/get_gff3.pl | 1 + 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/scripts/definitionFromBlast.pl b/scripts/definitionFromBlast.pl index 942bb18..3b6e850 100755 --- a/scripts/definitionFromBlast.pl +++ b/scripts/definitionFromBlast.pl @@ -13,6 +13,7 @@ use Bio::SearchIO; use Lingua::EN::Ngram; use List::Util qw(max); +use Text::Trim; #Usual blast output #blast file name @@ -80,20 +81,20 @@ sub getBestDef{ $key=~s/\[[^\[\]]+\]$//i; $key=~s/\[([^\[\]]+)$//i; - if($key=~/Putative|Predicted|probable|uncharacterized|hypothetical/i) - { + if($key=~/Putative|Predicted|probable|uncharacterized|hypothetical/i) { $probableFlag=1; $key=~s/Putative|Predicted|probable|uncharacterized|hypothetical//i; } + $key=~s/\sprotein\s/ /i; # Only protein as word removed - + # Cleaning some UniProt codes as well: https://www.uniprot.org/news/2008/07/22/release $key=~s/RecName\://g; - $key=~s/AltName\://g; - $key=~s/SubName\://g; - $key=~s/Full\=//g; - $key=~s/Short\=//g; - + $key=~s/AltName\://g; + $key=~s/SubName\://g; + $key=~s/Full\=//g; + $key=~s/Short\=//g; + $key=~s/^[:;,.]+//i; $key=~s/^\s+//i; $key=~s/\s+$//i; @@ -193,28 +194,31 @@ sub getBestDef{ #if($count==3){last;} #print Dumper($result)."\n"; - + if ( $query_desc ) { $id = $result->query_description(); } else { $id = $result->query_name(); } - + #$id2 = $result->query_accession(); #print "!$id! !$id2! $id3\n"; @str=(); while( my $hit = $result->next_hit ) { ## $hit is a Bio::Search::Hit::HitI compliant object $def = $hit->description() ; - #push(@{$retData{$id}}, $def); - push(@str, $def); + + # Toniher: Further process description with Diamond + my @def = split("\>\;\S+", $def); + foreach my $d ( @def ) { + push(@str, trim($d) ); + } } my $bestDefinition; #my $bestDefinition = 'NA'; #print Dumper(@str); - if(defined $str[0]) - { + if(defined $str[0]) { #print $id."\n"; $bestDefinition=&getBestDef(\@str); print OUT $id."\t".$bestDefinition."\n"; diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index 5fb731a..9ad385f 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -421,6 +421,7 @@ sub createGFF3File { } #foreach protein item close(OUTFILE); + } } sub escapeGFF { From 468cfd62d0e9088954347402f15b0d03a91a39d9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 17:41:55 +0200 Subject: [PATCH 120/381] proper > --- scripts/definitionFromBlast.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/definitionFromBlast.pl b/scripts/definitionFromBlast.pl index 3b6e850..558da28 100755 --- a/scripts/definitionFromBlast.pl +++ b/scripts/definitionFromBlast.pl @@ -209,7 +209,7 @@ sub getBestDef{ $def = $hit->description() ; # Toniher: Further process description with Diamond - my @def = split("\>\;\S+", $def); + my @def = split("\>\S+", $def); foreach my $d ( @def ) { push(@str, trim($d) ); } From b3ff9ab1d545d44780a388c33d5f86c56150ceac Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 17:55:42 +0200 Subject: [PATCH 121/381] email message --- main.nf | 25 +++++++++++++++++++++++++ params.config | 1 + 2 files changed, 26 insertions(+) diff --git a/main.nf b/main.nf index a2c4934..9323699 100644 --- a/main.nf +++ b/main.nf @@ -45,6 +45,7 @@ params.gffstats = false params.diamond = null params.blastAnnotMode = "common" params.oboFile = null +params.email = "" //print usage if ( params.help ) { @@ -979,6 +980,30 @@ workflow.onError { } + +if (params.email == "yourmail@yourdomain" || params.email == "") { + log.info 'Skipping email\n' +} else { + log.info "Sending email to ${params.email}\n" + + workflow.onComplete { + + def msg = """\ + Pipeline execution summary + --------------------------- + Completed at: ${workflow.complete} + Duration : ${workflow.duration} + Success : ${workflow.success} + workDir : ${workflow.workDir} + exit status : ${workflow.exitStatus} + Error report: ${workflow.errorReport ?: '-'} + """ + .stripIndent() + + sendMail(to: params.email, subject: "[FA-nf] Execution finished", body: msg) + } +} + signalP_result2 .collectFile(name: file(params.resultPath + "signalP.res.tsv")) .println { "Result saved to file: $it" } diff --git a/params.config b/params.config index 88464c2..8450ac9 100644 --- a/params.config +++ b/params.config @@ -34,4 +34,5 @@ params { mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" loglevel = "info" debug = "true" + email = "yourmail@yourdomain" } From 7962cee945d7d8118ac1724726288ec575129cdb Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 19 May 2021 21:53:12 +0200 Subject: [PATCH 122/381] fix regex --- scripts/definitionFromBlast.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/definitionFromBlast.pl b/scripts/definitionFromBlast.pl index 558da28..289ca11 100755 --- a/scripts/definitionFromBlast.pl +++ b/scripts/definitionFromBlast.pl @@ -209,7 +209,7 @@ sub getBestDef{ $def = $hit->description() ; # Toniher: Further process description with Diamond - my @def = split("\>\S+", $def); + my @def = split(/\>\S+/, $def); foreach my $d ( @def ) { push(@str, trim($d) ); } From 6f9622c8cd50c8a8efb598d0e14efe55b48a9d13 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 20 May 2021 12:28:13 +0200 Subject: [PATCH 123/381] multiple GOs --- scripts/load_kegg_KAAS.pl | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index e1093e3..e85210b 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -137,8 +137,6 @@ =head1 AUTHORS if(($loglevel eq 'debug' )||($loglevel eq 'info' )) {print STDOUT "Number of unique KEGG groups:",scalar(keys %keggs),"\n";} -# TODO: upload KEGG group information into DB - this will speed-up uploading process.. There are usually fewer groups then proteins assigned to them - #print Dumper( \%keggs ); #print Dumper( \%organisms ); @@ -428,7 +426,6 @@ sub uploadKeggInformation { print "NUM LINES: $#lines\n"; - # TODO: Converge sqlite case to MySQL approach if possible foreach my $l (@lines) { # insert each ortholog @@ -619,8 +616,10 @@ sub uploadKeggInformation { if(defined $hash->{'DBLINKS'}) { # TODO: Multiple GOs here, need to consider all maybe # DBLINKS GO: 0016279 0030544 - my $goId = parseKEGGDBLInks($hash->{'DBLINKS'}); - if($goId ne '') { + + my @goIds = &parseKEGGDBLinks($hash->{'DBLINKS'}); + + foreach my $goId ( @goIds ) { #insert go term, associated with this protein into go_term table, and then into protein_go my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; my $sqlUpdate =""; @@ -668,18 +667,17 @@ sub uploadKeggInformation { }#sub -sub parseKEGGDBLInks { +sub parseKEGGDBLinks { my $dbLinks = shift; - my $retGO=''; + my @retGO=(); $dbLinks=~s/\n//g; - if($dbLinks =~/(GO\:\s*\d+)\s*/) { - $retGO = $1; - $retGO=~s/\s+//g; + while ($dbLinks=~/(\d+)/g) { + push( @retGO, "GO:".$1 ); } - return $retGO; + return @retGO; } # subroutine to retrieve KEGG record from DB From 9326fab1e8963f32b1667c9cd7d961e351f790f0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 20 May 2021 12:32:23 +0200 Subject: [PATCH 124/381] some cleaning --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index e85210b..e5a8178 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -614,8 +614,6 @@ sub uploadKeggInformation { # add GO terms info into go_term and protein_go table. # TODO Consider in the future other annotations, such as COG if(defined $hash->{'DBLINKS'}) { - # TODO: Multiple GOs here, need to consider all maybe - # DBLINKS GO: 0016279 0030544 my @goIds = &parseKEGGDBLinks($hash->{'DBLINKS'}); @@ -667,6 +665,8 @@ sub uploadKeggInformation { }#sub +# DBLINKS GO: 0016279 0030544 + sub parseKEGGDBLinks { my $dbLinks = shift; From 241e8d152ddb04d7ef3e16aee2ca686ed98d7260 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 20 May 2021 12:59:31 +0200 Subject: [PATCH 125/381] start for faster --- scripts/load_kegg_KAAS.pl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index e5a8178..b47bb15 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -395,7 +395,10 @@ sub uploadKeggInformation { # Number limit names my $limnames = 9; - foreach my $proteinItem(@proteinList) { + # We store mapping of proteins and GO for making it faster + my %gomap; + + foreach my $proteinItem ( @proteinList ) { #select protein_id infor (because items are stable_ids in protein table) my $protein_sql_select= qq{ SELECT d.protein_id,d.definition d FROM definition d, protein p WHERE p.protein_id=d.protein_id and p.stable_id=\"$proteinItem\"}; @@ -617,6 +620,9 @@ sub uploadKeggInformation { my @goIds = &parseKEGGDBLinks($hash->{'DBLINKS'}); + # Define storage + $gomap{$protein_id} = (); + foreach my $goId ( @goIds ) { #insert go term, associated with this protein into go_term table, and then into protein_go my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; @@ -635,6 +641,7 @@ sub uploadKeggInformation { my $results = $dbh->select_from_table($select); $goTermId=$results->[0]->{'id'}; } + #select protein_go_id if there is one, and add 'KEGG' to the source field # TODO: Change INSERT or IGNORE here $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; @@ -651,6 +658,8 @@ sub uploadKeggInformation { }#if defined dbLinks }#foreach protein Item + # TODO: Process gomap here + print STDERR "Protein finished here ".getLoggingTime()."\n"; }#foreach kegg KO item From e2e5c9f58ecbd426c938c72ec3636a9f83007111 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 21 May 2021 17:38:29 +0200 Subject: [PATCH 126/381] fixes for GFF3 --- main.nf | 6 + scripts/fa_main.v1.pl | 148 +++++++++--------- scripts/import_data.pl | 5 +- .../lib/FunctionalAnnotation/uploadData.pm | 148 ++++++++++++------ 4 files changed, 187 insertions(+), 120 deletions(-) diff --git a/main.nf b/main.nf index 9323699..a6f98a7 100644 --- a/main.nf +++ b/main.nf @@ -42,6 +42,7 @@ params.evalue = 0.00001 params.dbEngine = "mysql" params.gffclean = false params.gffstats = false +params.rmversion = false params.diamond = null params.blastAnnotMode = "common" params.oboFile = null @@ -571,6 +572,11 @@ process initDB { command += " -fasta ${seq}" } + if ( params.rmversion=="TRUE"||params.rmversion=="true" ) { + // If remove versioning in protein sequences (for cases like ENSEMBL) + command += " -rmversion" + } + command } diff --git a/scripts/fa_main.v1.pl b/scripts/fa_main.v1.pl index 978f565..66bf7c9 100755 --- a/scripts/fa_main.v1.pl +++ b/scripts/fa_main.v1.pl @@ -7,21 +7,21 @@ =head1 NAME annotation_main.pl =head1 SYNOPSIS - - perl annotation_main + + perl annotation_main This is main script for functional annotation pipeline, that runs different annotation steps by specified command. Each function has its own parameteres =head1 DESCRIPTION Usage: annotation_main.pl [options] -Commands: +Commands: init upload_kegg program get_results - -Dependency: + +Dependency: DBI; Getopt::Long; Data::Dumper; @@ -73,24 +73,24 @@ =head1 AUTHOR sub usage { print < +Usage : fnan_main.pl Commands : init : This is the first step of the pipeline - it creates DB and fulfill it with initial information about sequences. program : Run on of the specified program: Blast, Blast2Go, SignalP, InterProScan. This module can be used also to upload pre-calculated results into DB - - upload_kegg_KAAS : Upload information from KEGG databases using previously obtained KO annotation through KAAS server + + upload_kegg_KAAS : Upload information from KEGG databases using previously obtained KO annotation through KAAS server get_results : This step will extract all annotation information from the DB and create summary file. - + Note : All pipeline scripts uses its own parameters and configuration file. Pipeline uses external software: SQLite [ Mandatory ] R [ Mandatory for creating resulting plots] Pipeline may use also local installations of: - BLAST + BLAST Blast2Go InterProScan SignalP - + EOF exit(0); } @@ -102,7 +102,7 @@ sub usage # Name : loadDataToDB == init # Description: This subroutine upload initital data into DB - sequences and their annotation # Requirements : DBI -# Variables : +# Variables : # fastaFile - sequence file # gffFile - annotation file # @@ -110,11 +110,11 @@ sub usage # because there were two conflicting versions developed at the same time. #11/08/2014 # -# Author : Vlasova AV +# Author : Vlasova AV sub loadDataToDB { - my ($updateFlag, $newVersion, $listIds,$confFile,$comment,$show_help,$o_annt_file,$o_fasta_file); + my ($updateFlag, $newVersion, $listIds,$confFile,$comment,$show_help,$o_annt_file,$o_fasta_file,$rm_version); ($updateFlag, $newVersion) =(0,0); @@ -125,15 +125,16 @@ sub loadDataToDB "conf=s"=>\$confFile, "comm=s"=>\$comment, "gff=s"=>\$o_annt_file, - "fasta=s"=>\$o_fasta_file, - "help|h" => \$show_help + "fasta=s"=>\$o_fasta_file, + "help|h" => \$show_help, + "rmversion" => \$rm_version ); -if(!defined $confFile || $show_help) +if(!defined $confFile || $show_help) { die(qq/ Usage: fa_main.pl init [options] - Options + Options -h || help : This message -conf : Configuration file; by default 'main_configuration.ini' in the current folder -comm : Comment, description. This record will be stored in the protein.comment field @@ -142,9 +143,9 @@ sub loadDataToDB of the existing annotation, and the old one is present in DB, this flag should go with -u flag specified. Default is 0 - Note: Don't forget to specify mandatory options in the main configuration file : - File with the protein sequences in fasta format; - File with the corresponding annotation in gff3 or gtf formats; + Note: Don't forget to specify mandatory options in the main configuration file : + File with the protein sequences in fasta format; + File with the corresponding annotation in gff3 or gtf formats; Database name and path; All files must be specified with the full paths! @@ -155,7 +156,7 @@ sub loadDataToDB #redirect standart output and standart error into log files my $cfg = new Config::Simple($confFile); - #put config parameters into %config + #put config parameters into %config my %config = $cfg->vars(); my $logFile = $config{'stdoutLog'}; my $errFile = $config{'stderrLog'}; @@ -172,14 +173,14 @@ sub loadDataToDB print '#' x35 ."\n"; print '#' x5 . 'Init, '.$date.' '.'#' x5 ."\n"; print '#' x35 ."\n"; - print "Check DB presence...\n"; + print "Check DB presence...\n"; } - + &createSQLDB($confFile); if(($config{'loglevel'} eq 'debug')||($config{'loglevel'} eq 'info')) { - print "Data uploading..\n"; + print "Data uploading..\n"; } my $commandString=''; @@ -190,18 +191,23 @@ sub loadDataToDB if(defined $comment) {$commandString .="-comm $comment ";} - + # Override if specified explicitly if (defined $o_annt_file ) { $commandString .="-gff $o_annt_file "; } - + if (defined $o_fasta_file ) { $commandString .="-fasta $o_fasta_file "; } - + + if (defined $rm_version ) { + $commandString .="-rmversion "; + } + + if($newVersion =='1') - { + { ##4/12/2013 I did not check this option for the moment!! my $fastaFile=$config{'proteinFile'}; my $outFile = $fastaFile.'.stat'; @@ -211,35 +217,35 @@ sub loadDataToDB { $commandString = "perl $RealBin/import_data.pl ".$commandString; } - + if($config{'loglevel'} eq 'debug') -{ +{ my $cwd=getcwd(); print "Folder: $cwd\n"; - print "$commandString\n"; + print "$commandString\n"; } system($commandString)==0 or die("Error running system command: < $commandString >\n $!"); -} +} # # Name : uploadKegg -# Description: This subroutine upload infromation from KEGG DB using BioMart modules and list of KO groups +# Description: This subroutine upload infromation from KEGG DB using BioMart modules and list of KO groups # Requirements : DBI, BioMart (for taxonomy) -# Variables : +# Variables : # Note: # User needs to analyse its proteins in the KAAS server first, and then use result list of KO elements as input. -# +# # Last edited: 11/08/2014 -# Author : Vlasova AV +# Author : Vlasova AV sub uploadKEGG { my ($do_update, $input, $kegg_release, $show_help,$configurationFile); - + GetOptions( 'update|u=s' => \$do_update, 'input|i=s' => \$input, 'rel=s' => \$kegg_release, @@ -247,11 +253,11 @@ sub uploadKEGG 'help|h' => \$show_help ); - if((!defined $input) || (!defined $kegg_release) || ($show_help)) + if((!defined $input) || (!defined $kegg_release) || ($show_help)) { die(qq/ upload_kegg_KAAS : Upload information from KEGG databases using previously obtained KO annotation - through KAAS server + through KAAS server Usage: fa_main.pl upload_kegg [options] Options -input : Input file, obtained from KAAS server [Mandatory] @@ -261,7 +267,7 @@ sub uploadKEGG -update: Flag that indicates to re-write existing record in the DB, or not. Default value is 0. -conf : configuration file. -Note: Don't forget to specify mandatory options in the main configuration file : +Note: Don't forget to specify mandatory options in the main configuration file : Database name and path; Species 3 letters codes used for annotation via KAAS; \n/)}; @@ -269,7 +275,7 @@ sub uploadKEGG #redirect standart output and standart error into log files my $cfg = new Config::Simple($configurationFile); - #put config parameters into %config + #put config parameters into %config my %config = $cfg->vars(); my $logFile =$config{'resultPath'}.$config{'stdoutLog'}; my $errFile =$config{'resultPath'}.$config{'stderrLog'}; @@ -281,7 +287,7 @@ sub uploadKEGG my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; my $date = "$year/$mon/$mday $hour:$min:$sec"; - + if(($config{'loglevel'} eq 'debug')||($config{'loglevel'} eq 'info')) { print '#' x40 ."\n"; @@ -301,12 +307,12 @@ sub uploadKEGG { my $cwd=getcwd(); print "Folder: $cwd\n"; - print "$commandString\n"; + print "$commandString\n"; } system($commandString)==0 or die("Error running system command: <$commandString>\n"); -} +} # @@ -314,12 +320,12 @@ sub uploadKEGG # Description: This subroutine runs local version of specified programs and upload its results into DB # Or, alternatively, it can be used to upload pre-calculated results into DB # Requirements : DBI -# Variables : +# Variables : # Note: # For majority of the programs this step is very time consuming! -# +# # Last edited: 13/08/2014 -# Author : Vlasova AV +# Author : Vlasova AV sub launchProgram @@ -336,7 +342,7 @@ sub launchProgram 'list|l=s'=>\$list, ); - if($show_help) + if($show_help) { die(qq/ program : Launch local installation of specified program and upload its results into DB, or just upload pre-calculated results into DB @@ -351,14 +357,14 @@ sub launchProgram By default it is 0 -help : This documentation -Note: Don't forget to specify mandatory options in the main configuration file : +Note: Don't forget to specify mandatory options in the main configuration file : Database name and path; Software path and parameters; Additional important parameteres for software, such as Blast DB paths; - Chunk size; + Chunk size; Input results files are acepted in following formats: - Blast - in classical NCBI-like, xml and tabular separated (-m 8). + Blast - in classical NCBI-like, xml and tabular separated (-m 8). Important! Its require xml-formatted blast result file in order to use it as input to blast2go local installation. InterProScan - in tsv format Blast2Go - in 3 column tabular separated format. @@ -368,7 +374,7 @@ sub launchProgram In running mode this is very time consuming step! \n/)}; - + if(!defined $soft) {die("Please specify correct program to execute!\nLaunch 'fa_main program -h' to see parameters description\n ");} @@ -381,7 +387,7 @@ sub launchProgram #redirect standart output and standart error into log files my $cfg = new Config::Simple($confFile); - #put config parameters into %config + #put config parameters into %config my %config = $cfg->vars(); my $logFile =$config{'resultPath'}.$config{'stdoutLog'}; my $errFile =$config{'resultPath'}.$config{'stderrLog'}; @@ -393,7 +399,7 @@ sub launchProgram my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; my $date = "$year/$mon/$mday $hour:$min:$sec"; - + if(($config{'loglevel'} eq 'debug')||($config{'loglevel'} eq 'info')) { print '#' x40 ."\n"; @@ -401,7 +407,7 @@ sub launchProgram print '#' x40 ."\n"; } - my $commandString=""; + my $commandString=""; if($soft eq 'blast') {$commandString .="perl $RealBin/bin/run_blast.pl -mode $mode ";} @@ -434,11 +440,11 @@ sub launchProgram { my $cwd=getcwd(); print "Folder: $cwd\n"; - print "$commandString\n"; + print "$commandString\n"; } system($commandString)==0 or die("Error running system command: <$commandString>\n$!\n"); -} +} @@ -449,9 +455,9 @@ sub launchProgram # Variables : configuration file # Note: # Creates banch of files in resulting folder -# +# # Last edited: -# Author : Vlasova AV +# Author : Vlasova AV sub getResults { @@ -463,23 +469,23 @@ sub getResults 'list|l=s'=>\$list, ); - if($show_help) + if($show_help) { die(qq/ - get_results : This part extract all available information from DB (from collected sources) and create banch of result files in result folder. - + get_results : This part extract all available information from DB (from collected sources) and create banch of result files in result folder. + Usage: fa_main.pl get_results [options] Options -conf : Configuration file. [Mandatory] -list | -l : File with selected protein IDs - script will process only those seqences -help : This documentation -Note: Don't forget to specify mandatory options in the main configuration file : +Note: Don't forget to specify mandatory options in the main configuration file : Database name and path; Results folder name and path Result folder should contain following files: - summary.txt Functional annotation summary - number of input proteins, number of proteins with annotaion features and so on. + summary.txt Functional annotation summary - number of input proteins, number of proteins with annotaion features and so on. summary.gff3 Resulting annotation in gff3 format prot_definition.txt Possible protein definition given by blast2go or kegg ortholog go_terms.txt GO terms associated with the sequences @@ -493,7 +499,7 @@ sub getResults #redirect standart output and standart error into log files my $cfg = new Config::Simple($confFile); - #put config parameters into %config + #put config parameters into %config my %config = $cfg->vars(); my $logFile =$config{'resultPath'}.$config{'stdoutLog'}; my $errFile =$config{'resultPath'}.$config{'stderrLog'}; @@ -505,7 +511,7 @@ sub getResults my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; my $date = "$year/$mon/$mday $hour:$min:$sec"; - + if(($config{'loglevel'} eq 'debug')||($config{'loglevel'} eq 'info')) { print '#' x40 ."\n"; @@ -513,7 +519,7 @@ sub getResults print '#' x40 ."\n"; } - my $commandString=""; + my $commandString=""; #create all result files, but without gff3 -fast step $commandString .="perl $RealBin/get_results.pl -conf $confFile "; @@ -521,7 +527,7 @@ sub getResults if(defined $list) {$commandString = "-l $list ";} - print "$commandString\n"; + print "$commandString\n"; system($commandString)==0 or die("Error running system command: <$commandString>\n$!\n"); #create gff3 file - this is a longest step @@ -535,11 +541,9 @@ sub getResults { my $cwd=getcwd(); print "Folder: $cwd\n"; - print "$commandString\n"; + print "$commandString\n"; } system($commandString)==0 or die("Error running system command: <$commandString>\n$!\n"); } - - diff --git a/scripts/import_data.pl b/scripts/import_data.pl index 860cd12..940179c 100755 --- a/scripts/import_data.pl +++ b/scripts/import_data.pl @@ -51,7 +51,7 @@ =head1 AUTHOR my $usage = "perl import_data.pl [-l listfile] [-u update] [-h help] [-conf configuration_file] [-comm comment_string]\n"; -my ( $annt_file, $show_help,$fasta_file, $list_file, $do_update, $comment, $o_annt_file, $o_fasta_file ); +my ( $annt_file, $show_help, $fasta_file, $list_file, $do_update, $comment, $o_annt_file, $o_fasta_file, $rm_version ); &GetOptions( 'l=s' =>\$list_file, @@ -61,6 +61,7 @@ =head1 AUTHOR 'conf=s'=>\$confFile, 'gff=s'=>\$o_annt_file, 'fasta=s'=>\$o_fasta_file, + 'rmversion' => \$rm_version ) or pod2usage(-verbose=>2); pod2usage(-verbose=>2) if $show_help; @@ -145,7 +146,7 @@ =head1 AUTHOR if(! defined $fasta_file){print STDOUT "The fasta file was not specified, skipped.\n";} else - {&uploadFastaData($fasta_file, $dbh,\%IdsList,1,$comment, $config{'dbEngine'}, $loglevel);} + {&uploadFastaData($fasta_file, $dbh, \%IdsList, 1, $comment, $rm_version, $config{'dbEngine'}, $loglevel);} if(($loglevel eq 'debug')||($loglevel eq 'info')) {print "done.";} diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index fbe0d0e..818fd69 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -57,7 +57,7 @@ return %returnData; # sub uploadFastaData { - my($inFile, $dbh, $idList, $do_update,$comment, $engine, $loglevel) =@_; + my($inFile, $dbh, $idList, $do_update, $comment, $rm_version, $engine, $loglevel) =@_; if(!defined $engine){$engine ='mysql'}; my $numberElements = scalar keys %{$idList}||''; @@ -79,6 +79,12 @@ sub uploadFastaData if($line=~/^\>(\S+)/) { $header=$1; + + # Remove versioning if needed + if ( $rm_version ){ + $header=~s/\.\d+$//; + } + if($prevSeq ne ''){ $seqData{$prevHeader} = $prevSeq; $prevSeq=''; @@ -193,7 +199,9 @@ open FH,"$inFile"; next if /^#/; chomp; my $line=$_; + #print STDERR $line, "\n"; #@elms=split/\t/,$line; + # Allow handling more variability below @elms=split/\s+/,$line; if($elms[$type_ix] eq 'gene') { @@ -205,12 +213,11 @@ open FH,"$inFile"; } # Toniher: Handling IDs more in detail since no always only words. Notice TransDecoder output - my (@sids) = split( /\;/, $elms[$ids_ix] ); - if ( $#sids >= 0 && $sids[0]=~/ID\=(\S+)\s*$/ ) { - $gene_name=$1; - } + $gene_name = &getGeneName( $elms[$ids_ix], $elms[$annot_ix] ); + #print STDERR Dumper( \@elms ); + #print STDERR $gene_name, "\n"; #patch for pc2127 isolate, p.cucumerina project - gene name contains . symbol in the name #if( $elms[$ids_ix]=~/ID=(PCUC.+)$/) # {$gene_name=$1;} @@ -266,49 +273,14 @@ open FH,"$inFile"; # I need to check with CDs, if the prot_id is already present - just skip it. #14/09/2016 - new Francisco's annotation contains mRNA field in combination with Name attribute - # TODO: All this stuff below should be better rationalized for different cases + # Here we prioritize transcript and mRNA + # Toniher: Removed transcript option + elsif ( ( $elms[$type_ix] eq 'mRNA' ) || ( ( $elms[$type_ix] eq 'CDS' ) && ( !$c_prot_id || $c_prot_id eq '') ) ) { - elsif (($elms[$type_ix] eq 'transcript' )||($elms[$type_ix] eq 'mRNA' )||(($elms[$type_ix] eq 'CDS') && ( !$c_prot_id || $c_prot_id eq ''))) { + my $prot_id= &parseGFFProduct( $elms[$type_ix], $elms[$ids_ix], $elms[$annot_ix] ); - my $prot_id=''; - - # Toniher: allowing more flexibility for parsing - my $sid = $elms[$ids_ix]; - if ( $sid ne '' ) { - - # TransDecoder. Added by Toniher - if($prot_id eq '' && $elms[$annot_ix] eq 'transdecoder') { - #if(($loglevel eq 'debug')) { print "TRANSID\n"; } - $prot_id=$1 if $sid=~/ID=([^\;]+)/; - } - # Priority one - if($prot_id eq '') { - #if(($loglevel eq 'debug')) { print "TARGET\n"; } - $prot_id=$1 if $sid=~/Target=([^\;]+)/; - } - - #update 18/11/2015 - #In some annotation versions, provided by Tyler he added 'product' instead of Target... Parent is also exists, but it refer to the transcripts, not proteins - if($prot_id eq '') { - #if(($loglevel eq 'debug')) { print "PRODUCT\n"; } - $prot_id=$1 if $sid=~/product\=([^\;]+)/; - } - - if($prot_id eq '') { - #if(($loglevel eq 'debug')) { print "NAME\n"; } - $prot_id=$1 if $sid=~/Name\=([^\;]+)/; - } - - #In some annotation versions, provided by Tyler, Target field is absent and only present Parent transcript id. - if($prot_id eq '') { - #if(($loglevel eq 'debug')) { print "PARENT\n"; } - $prot_id=$1 if $sid=~/Parent\=([^\;]+)/; - } - - } - - if(($loglevel eq 'debug')) { + if(($loglevel eq 'debug')) { #print "PROTNE: ". Dumper( \@elms ); print "PROTNE: $c_prot_id vs $prot_id\n"; } @@ -344,7 +316,91 @@ close FH; } #end sub -# +sub getGeneName { + + my $sid = shift; + my $annotation = shift; + + my $gene_name = ""; + + my (@sids) = split( /\;/, $sid ); + + if ( $#sids >= 0 && $sids[0]=~/ID\=(\S+)\s*$/ ) { + $gene_name = $1; + } + + # Casuistics for ENSEMBL + $gene_name=~s/gene\://g; + # Casuistics for NCBI + $gene_name=~s/gene\-//g; + + return $gene_name; + +} + +# Parser function for GFF. A lot of diversity may be here +# TODO: In the future allow user specific mapping from configuration to avoid it to become too bloated +sub parseGFFProduct { + + my $type = shift; + my $sid = shift; + my $annotation = shift; + + my $prot_id = ""; + + # Toniher: allowing more flexibility for parsing + # print STDERR "SID:", $sid, "\n"; + if ( $sid ne '' ) { + + # TransDecoder. Added by Toniher + if ( $prot_id eq '' && $annotation eq 'transdecoder' ) { + $prot_id=$1 if $sid=~/ID=([^\;]+)/; + } + + # Allowing different types for PASA + elsif ( $prot_id eq '' && $annotation eq 'EVM_PASA' ) { + if ( $type eq "mRNA" ) { + # Recent PASA + $prot_id=$1 if $sid=~/Name\=([^\;]+)/; + } else { + if ( $type eq "CDS" ) { + # Older PASA + $prot_id=$1 if $sid=~/Target=([^\;]+)/; + } + } + } + + # Below we handle most cases, such as NCBI and ENSEMBL + else { + + # Protein meaningful information is kept here + if ( $type eq "CDS" ) { + + if( $prot_id eq '' ) { + $prot_id=$1 if $sid=~/protein_id\=([^\;]+)/; + } + + if($prot_id eq '') { + #if(($loglevel eq 'debug')) { print "NAME\n"; } + $prot_id=$1 if $sid=~/Name\=([^\;]+)/; + } + + #update 18/11/2015 + #In some annotation versions, provided by Tyler he added 'product' instead of Target... Parent is also exists, but it refer to the transcripts, not proteins + if($prot_id eq '') { + #if(($loglevel eq 'debug')) { print "PRODUCT\n"; } + $prot_id=$1 if $sid=~/product\=([^\;]+)/; + } + + } + } + } + + return $prot_id; + +} + + # sub insertProtein { From 79133dd2cd68a8369482089f88861a2d5276c769 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 22 May 2021 18:22:29 +0200 Subject: [PATCH 127/381] option to skip CD search --- main.nf | 67 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/main.nf b/main.nf index a6f98a7..946fd64 100644 --- a/main.nf +++ b/main.nf @@ -33,19 +33,32 @@ // default parameters params.help = false params.debug="false" +params.dbEngine = "mysql" // SQLite otherwise + +// Sizes for different programs params.chunkIPSSize = null params.chunkBlastSize = null params.chunkKoalaSize = null params.chunkWebSize = null params.debugSize = 2 + +// Blast related params params.evalue = 0.00001 -params.dbEngine = "mysql" +params.diamond = null +params.blastAnnotMode = "common" + +// Params for dealing with GFF params.gffclean = false params.gffstats = false params.rmversion = false -params.diamond = null -params.blastAnnotMode = "common" + +// File with GO information, otherwise is downloaded params.oboFile = null + +// Skip params +params.skip_cdSearch = false + +// Mail for sending reports params.email = "" //print usage @@ -78,6 +91,8 @@ boolean exists = false boolean mysql = false gffclean = false gffstats = false +// Skip cdSearch +skip_cdSearch = false if( params.dbEngine.toLowerCase()=="mysql" ) { mysql = true @@ -91,6 +106,10 @@ if ( params.gffstats && ( params.gffstats=="TRUE" || params.gffstats=="true" ) ) gffstats = true } +if ( params.skip_cdSearch && ( params.skip_cdSearch=="TRUE" || params.skip_cdSearch=="true" ) ) { + skip_cdSearch = true +} + // Handling MySQL in a cleaner way dbhost = null @@ -133,6 +152,11 @@ if ( mysql ) { log.info "FA database : $dbFileName" } +if ( skip_cdSearch ) { + log.info "CD Search queries will be skipped." +} + + // split protein fasta file into chunks and then execute annotation for each chunk // chanels for: interpro, blast, signalP, targetP, cdsearch_hit, cdsearch_features @@ -633,9 +657,15 @@ process 'cdSearchHit' { output: file("out_hit_${seq}") into cdSearch_hit_result - """ - submitCDsearch.pl -o out_hit_${seq} -in $seq - """ + script: + if ( skip_cdSearch ) { + // Dummy content + command = "touch out_hit_${seq}" + } else { + command = "submitCDsearch.pl -o out_hit_${seq} -in $seq" + } + + command } process 'cdSearchFeat' { @@ -650,9 +680,15 @@ process 'cdSearchFeat' { output: file("out_feat_${seq}") into cdSearch_feat_result - """ - submitCDsearch.pl -t feats -o out_feat_${seq} -in $seq - """ + script: + if ( skip_cdSearch ) { + // Dummy content + command = "touch out_feat_${seq}" + } else { + command = "submitCDsearch.pl -t feats -o out_feat_${seq} -in $seq" + } + + command } @@ -925,19 +961,6 @@ process 'generateGFF3File'{ } -/* -process 'generateReport'{ - input: - - output: - - """ - pdflatex bin\/report_template -""" - -} -*/ - // Check MySQL IP def checkMySQL( mysql, mysqllog ) { From 719208b5d556a0c492a835a0e046caeeb0661131 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 22 May 2021 21:00:35 +0200 Subject: [PATCH 128/381] clean old comment --- main.nf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/main.nf b/main.nf index 946fd64..fd8ee95 100644 --- a/main.nf +++ b/main.nf @@ -722,10 +722,6 @@ process 'targetP' { """ } -/* -Upload results into DB -- in current version of the pipeline DB is implemented with SQLite, but mySQL is also supported -*/ - process 'signalP_upload'{ maxForks 1 From 843a8f27b62aebb7e082726162d9dfb2550b3a28 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 15:27:29 +0200 Subject: [PATCH 129/381] adding targetP and so on --- scripts/get_gff3.pl | 82 ++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index 9ad385f..39a0bfe 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -226,11 +226,12 @@ sub createGFF3File { } if (scalar @goTermId >0) { - my $goTermIdString = join(',',@goTermId); - $selectString = "select go_acc from go_term where go_term_id in ($goTermIdString)"; - $results =$dbh->select_from_table($selectString); - foreach my $item(@{$results}) { - push(@ontologyData, $item->{'go_acc'});} + my $goTermIdString = join(',',@goTermId); + $selectString = "select go_acc from go_term where go_term_id in ($goTermIdString)"; + $results =$dbh->select_from_table($selectString); + foreach my $item(@{$results}) { + push(@ontologyData, $item->{'go_acc'}); + } my $ontologyList = join(',', @ontologyData); if($ontologyList ne ''){ @@ -247,14 +248,16 @@ sub createGFF3File { } } + #KEGG KO groups #The same thing here - protein_ortholog is quite big, so I will select kegg_groups first and then do select information about them. $selectString ="select distinct kegg_group_id from protein_ortholog where protein_id=$idItem"; #print STDERR "G:".$selectString."\n"; $results =$dbh->select_from_table($selectString); my @keggGroupId=(); - foreach my $item(@{$results}) - { push(@keggGroupId , $item->{'kegg_group_id'});} + foreach my $item(@{$results}){ + push(@keggGroupId , $item->{'kegg_group_id'}); + } if(scalar @keggGroupId >0) { my $keggGroupString = join(',',@keggGroupId); $selectString = "select db_id, definition, pathway from kegg_group where kegg_group_id in ($keggGroupString)"; @@ -361,26 +364,26 @@ sub createGFF3File { #print STDERR "C:".$selectString."\n"; $results =$dbh->select_from_table($selectString); foreach my $result (@{$results}) { - my $access = $result->{'accession'}; - my $superfamily =$result->{'Superfamily'}; - my $CDEnd = $result->{'coordinateTo'}; - my $CDStart = $result->{'coordinateFrom'}; - #my $evalue = sprintf("%.1e", $result->{'E_Value'}); - my $evalue = $result->{'E_Value'}; - my $CDType =$result->{'Hit_type'}; - my $PSS =$result->{'PSSM_ID'}; - my $shortName =$result->{'Short_name'}; - my $Incomplete =$result->{'Incomplete'}; - - #updt 29/06/17 added ID record and remove \" characters from fields - $idCDSearchHit++; - $CDStart=~s/\"//gi; - $CDEnd=~s/\"//gi; - $evalue=~s/\"//gi; + my $access = $result->{'accession'}; + my $superfamily =$result->{'Superfamily'}; + my $CDEnd = $result->{'coordinateTo'}; + my $CDStart = $result->{'coordinateFrom'}; + #my $evalue = sprintf("%.1e", $result->{'E_Value'}); + my $evalue = $result->{'E_Value'}; + my $CDType =$result->{'Hit_type'}; + my $PSS =$result->{'PSSM_ID'}; + my $shortName =$result->{'Short_name'}; + my $Incomplete =$result->{'Incomplete'}; + + #updt 29/06/17 added ID record and remove \" characters from fields + $idCDSearchHit++; + $CDStart=~s/\"//gi; + $CDEnd=~s/\"//gi; + $evalue=~s/\"//gi; - if ( $protName && $protName ne '' ) { - print OUTFILE "$protName\tCDsearch\tdomain_match\t$CDStart\t$CDEnd\t$evalue\t.\t.\tID=CDSearchHit$idCDSearchHit;Accession=$access;Superfamily=$superfamily;Short_name=$shortName;PSSM_ID=$PSS;Hit_type=$CDType;\n"; - } + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\tCDsearch\tdomain_match\t$CDStart\t$CDEnd\t$evalue\t.\t.\tID=CDSearchHit$idCDSearchHit;Accession=$access;Superfamily=$superfamily;Short_name=$shortName;PSSM_ID=$PSS;Hit_type=$CDType;\n"; + } } #features $selectString = "SELECT title, Type, coordinates,source_domain FROM cd_search_features where protein_id=$idItem"; @@ -388,22 +391,22 @@ sub createGFF3File { $results =$dbh->select_from_table($selectString); foreach my $result (@{$results}) { - my $title = $result->{'title'}; - my $coordinates =$result->{'coordinates'}; - my $Type = $result->{'Type'}; - my $sourceDomain = $result->{'source_domain'}; + my $title = $result->{'title'}; + my $coordinates =$result->{'coordinates'}; + my $Type = $result->{'Type'}; + my $sourceDomain = $result->{'source_domain'}; - #updt 29/06/17 added ID record + #updt 29/06/17 added ID record - $idCDSearchFeat++; - if ( $protName && $protName ne '' ) { + $idCDSearchFeat++; + if ( $protName && $protName ne '' ) { print OUTFILE "$protName\tCDsearch\tfeature_match\t$start\t$stop\t.\t+\t.\tID=CDSeachFeat$idCDSearchFeat;Title=$title;Type=$Type;Coordinates=$coordinates;Source_domain=$sourceDomain;\n"; - } + } } #signalP, chloroP features - my @list=('signalP','chloroP'); - foreach my $lItem(@list) { + my @list=('signalP', 'targetP', 'chloroP'); + foreach my $lItem (@list) { $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; #print STDERR "F:".$selectString."\n"; $results =$dbh->select_from_table($selectString); @@ -414,14 +417,15 @@ sub createGFF3File { $start=~s/\"//gi; if ( $protName && $protName ne '' ) { - print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=SignalP_$protName;match=YES;\n"; + print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;\n"; } } - } #signalP,chloroP + } #signalP, targetP, chloroP } #foreach protein item - close(OUTFILE); } + close(OUTFILE); + } sub escapeGFF { From 337a590e9ad99f7da4836bc13bb28f6bd570c72c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 15:37:54 +0200 Subject: [PATCH 130/381] targetP no start-end --- scripts/get_gff3.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index 39a0bfe..f148f34 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -405,7 +405,7 @@ sub createGFF3File { } #signalP, chloroP features - my @list=('signalP', 'targetP', 'chloroP'); + my @list=('signalP', 'chloroP'); foreach my $lItem (@list) { $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; #print STDERR "F:".$selectString."\n"; From d0ad62612bc7f4812c33931d2f193e381f28ddd9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 15:58:50 +0200 Subject: [PATCH 131/381] changed group --- scripts/get_gff3.pl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index f148f34..b1e5055 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -417,7 +417,9 @@ sub createGFF3File { $start=~s/\"//gi; if ( $protName && $protName ne '' ) { - print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;\n"; + # Toniher: Changed from SIGNAL to protein_match and also start despite it must be 1 + #print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;\n"; + print OUTFILE "$protName\t$lItem\tprotein_match\t$start\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;\n"; } } } #signalP, targetP, chloroP From 9181207ef419f02e80ba2238e1b2d3a6fbd8192f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 16:30:21 +0200 Subject: [PATCH 132/381] avoid duplication of genes --- scripts/get_gff3.pl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index b1e5055..90c8bab 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -124,6 +124,8 @@ sub createGFF3File { my($dbh, $protIdList, $outFile, $engine)=@_; + my %geneStore; + my $numberKeys = scalar @{$protIdList}; my $condStat=''; @@ -279,7 +281,11 @@ sub createGFF3File { } if( $geneName ne '' ) { - print OUTFILE "$genomicLocation\t.\tgene\t$genomicStart\t$genomicEnd\t.\t$strand\t.\tID=$geneName;\n"; + if ( ! $geneStore{$geneName} ) { + # Avoid duplication of genes + print OUTFILE "$genomicLocation\t.\tgene\t$genomicStart\t$genomicEnd\t.\t$strand\t.\tID=$geneName;\n"; + $geneStore{$geneName} = 1; + } } ####### update 29/06/2017 ### in the protein-based coordinates it should be plus strand, if other not specified. From 28ceeef91ab5cd92105ffb71c1946fe928dc698e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 17:45:04 +0200 Subject: [PATCH 133/381] update and clean --- README.md | 91 ++++++++++++++++++++++++++++--------------------------- main.nf | 47 ++++++++++++++++------------ 2 files changed, 74 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index f906790..3764565 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,7 @@ The pipeline uses a set of well characterised software to assign functional info The software used in this pipeline is free software for academic users. For the software from the Center for Biological Sequence (CBS), i.e. signalP, a suitable license agreement should be obtained. -## Requirements - -### Nextflow installation +## Installation The pipeline is build on Nextflow as a woking engine, so it need to be installed first ``` @@ -18,21 +16,11 @@ The pipeline is build on Nextflow as a woking engine, so it need to be installed ``` The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) -### KEGG orthology groups -Predictions of the KEGG orthology groups (KO) should be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/). - -Note: for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three lellters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. - -### Configuration file -The pipeline require as an input the configuration file with specified parameters, such as path to the input files, specie name, KEGG specie abbreviations used to obtain KO groups, and some more. - -The example of configuration file is included into this repository with name ```params.config``` - ## Running the pipeline -The annotation itself, when various software is excuted and the results are stored in a internal database. +The annotation itself, when various software is excuted and the results are stored in an internal database. -Result files, including main annotation file in gff format and annotation report in pdf format, are generated at the end of the pipeline. +Result files, including a main annotation file in gff format and annotation report, are generated at the end of the pipeline. The annotation step can be launched by using the following command: @@ -40,16 +28,21 @@ The annotation step can be launched by using the following command: ./nextflow run -bg main.nf --config params.config &> logfile ``` -![Pipeline flow chart](./flowchart.png "Pipeline flow chart") - ## Pipeline parameters -#### `-resume` +### `-resume` This Nextflow build-in parameter allow to re-execute processes that has changed or crashed during the pipeline run. Only processes that not finished will be executed. More information can be found in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html#modify-and-resume) +### `-config` +The pipeline require as an input the configuration file with specified parameters, such as path to the input files, species name, KEGG species abbreviations used to obtain KO groups, and some more. + +The example of configuration file is included into this repository with name ```params.config``` + ## Pipeline steps +![Pipeline flow chart](./flowchart.png "Pipeline flow chart") + * **blast**: it perfoms BLAST search against defined database from input files * **diamond**: the same as above but using DIAMOND ( ```diamond = "true"``` in config file ) * **ipscn**: it performs InterProScan analyses from input files @@ -71,39 +64,25 @@ More information can be found in the [Nextflow documentation](https://www.nextfl * **generateResultFiles**: it generates report files * **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information from the previous annotation steps +### GFF cleaning + +... + ### Formatted databases * For NCBI BLAST+: ```blastDbPath = "/path/to/db"``` and ```diamond = "false"```. It looks for formatted database files (normally named db.p* for protein type based ones), otherwise it will try to format FASTA file with that name * For DIAMOND: ```blastDbPath = "/path/to/db"``` and ```diamond = "true"```. It looks for a single formatted database file (normally named db.dmnd), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) -### About blast_annotator +### Retrieval of GO terms from BLAST results Retrieval of GO terms from BLAST results can be performed either from [BLAST2GO](https://www.blast2go.com/) results or from other methods as far as a BLAST2GO-compatible output format is provided. -As an example, in our case we are using a [web API](https://github.com/toniher/gogoAPI) providing this information from [UniProt GOA](https://www.ebi.ac.uk/GOA) database imported into a MySQL and [Neo4j](https://github.com/toniher/neo4j-biorelation). - -## Associated containers - -We recommend installing either [Docker](https://www.docker.com/) of [Singularity](https://sylabs.io/singularity/) (the latter preferred). +As an example, in our case we are using a [web API](https://github.com/toniher/gogoAPI) providing this information from [UniProt GOA](https://www.ebi.ac.uk/GOA) database imported into a MySQL and/or [Neo4j](https://github.com/toniher/neo4j-biorelation). -The software used all along this pipeline is encapsulated in, at least, 4 containers: - -As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. - -* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this) -* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this) - -### How to build base container - -The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. - -``` - # Generate Docker image - docker build -t fa-nf . +### KEGG orthology groups +Predictions of the KEGG orthology groups (KO) can be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/) or using a previously set-up version of [KofamKOALA](https://www.genome.jp/tools/kofamkoala/). - # Generate Singularity image if preferred - sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest -``` +Note: in the first case for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three lellters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. ## Running in MySQL mode @@ -132,7 +111,7 @@ The relevant paremetres below: mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" ``` -### Execution without ad-hoc database +### Execution without an ad-hoc database We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local without having to set up any MySQL server and database before thanks to Singularity. @@ -143,9 +122,9 @@ It is also possible to pass additional Nextflow parameters nohup perl run_pipeline_mysql.pl -params "-with-dag -with-report -with-timeline" -conf ./params.config &> log.mysql & -### Inspection of MySQL database +#### Inspection of MySQL database -This is convenient for checking results database once analyses are finished. NO further analyses are run. +If run without an ad-hoc database, this is convenient for checking results database once analyses are finished. NO further analyses are run. nohup perl run_pipeline_mysql.pl -mysqlonly -conf ./params.config &> log.mysql.only & @@ -153,3 +132,27 @@ This is convenient for checking results database once analyses are finished. NO for further options or details, run: perl run_pipeline_mysql.pl -h + + +## Associated containers + + We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://sylabs.io/singularity/) (the latter preferred). + + The software used all along this pipeline is encapsulated in, at least, 4 containers: + + As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. + + * [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this) + * [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this) + + ### How to build base container + + The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. + + ``` + # Generate Docker image + docker build -t fa-nf . + + # Generate Singularity image if preferred + sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest + ``` diff --git a/main.nf b/main.nf index fd8ee95..372c485 100644 --- a/main.nf +++ b/main.nf @@ -32,7 +32,7 @@ // default parameters params.help = false -params.debug="false" +params.debug = false params.dbEngine = "mysql" // SQLite otherwise // Sizes for different programs @@ -43,13 +43,15 @@ params.chunkWebSize = null params.debugSize = 2 // Blast related params +params.blastFile = null params.evalue = 0.00001 params.diamond = null -params.blastAnnotMode = "common" +params.blastAnnotMode = "common" // common, most, all available so far // Params for dealing with GFF -params.gffclean = false -params.gffstats = false +params.gffclean = true +params.gffstats = true +// Remove version from protein entries (e.g. X5543AP.2) params.rmversion = false // File with GO information, otherwise is downloaded @@ -66,10 +68,10 @@ if ( params.help ) { log.info '' log.info 'Functional annotation pipeline' log.info '----------------------------------------------------' - log.info 'Run functional annotation for a given specie.' + log.info 'Run functional annotation for a given species.' log.info '' log.info 'Usage: ' - log.info " ./nextflow run pipeline.nf --config main_configuration.config [options]" + log.info " ./nextflow run main.nf --config params.config [options]" log.info '' log.info 'Options:' log.info '-resume resume pipeline from the previous step, i.e. in case of error' @@ -98,15 +100,15 @@ if( params.dbEngine.toLowerCase()=="mysql" ) { mysql = true } -if ( params.gffclean && ( params.gffclean=="TRUE" || params.gffclean=="true" ) ) { +if ( params.gffclean ) { gffclean = true } -if ( params.gffstats && ( params.gffstats=="TRUE" || params.gffstats=="true" ) ) { +if ( params.gffstats ) { gffstats = true } -if ( params.skip_cdSearch && ( params.skip_cdSearch=="TRUE" || params.skip_cdSearch=="true" ) ) { +if ( params.skip_cdSearch ) { skip_cdSearch = true } @@ -137,9 +139,9 @@ log.info "" log.info "General parameters" log.info "------------------" log.info "Protein sequence file : ${params.proteinFile}" -log.info "Annotation file : ${params.gffFile}" +log.info "GFF Annotation file : ${params.gffFile}" -if ( params.blastFile != "" ) { +if ( params.blastFile ) { log.info "BLAST results file : ${params.blastFile}" } @@ -153,7 +155,7 @@ if ( mysql ) { } if ( skip_cdSearch ) { - log.info "CD Search queries will be skipped." + log.info "CD-Search queries will be skipped." } @@ -202,11 +204,13 @@ seqWebData = Channel .from(protein) .splitFasta( by: chunkWebSize ) -iscan_properties = file("/usr/local/interproscan/interproscan.properties") +// TODO: This may be changed as paremeter +ipscan_properties = file("/usr/local/interproscan/interproscan.properties") -if ( params.debug == "TRUE" || params.debug =="true" ) { - println("Debugging.. only the first $params.debugSize chunks will be processed") - // Diferent parts for different processes. TODO: Change numbers for processes +if ( params.debug ) { + println("Debugging... only the first $params.debugSize chunks will be processed") + // Diferent parts for different processes. + // TODO: With DSL2 this is far simpler (seq_file1, seq_file2) = seqData.take(params.debugSize).into(2) (seq_file_blast) = seqBlastData.take(params.debugSize).into(1) (seq_file_koala) = seqKoalaData.take(params.debugSize).into(1) @@ -247,7 +251,7 @@ if( params.oboFile == "" || params.oboFile == null ) { // TODO: To change for different aligners diamond = false -if( params.diamond == "TRUE" || params.diamond =="true" ) { +if( params.diamond ) { diamond = true } @@ -257,7 +261,7 @@ if( params.blastAnnotMode != "" && params.blastAnnotMode != null ) { blastAnnotMode = params.blastAnnotMode } -if (params.blastFile == "" || params.blastFile == null ){ +if ( params.blastFile == "" || params.blastFile == null ){ // program-specific parameters db_name = file(params.blastDbPath).name @@ -512,6 +516,8 @@ if ( gffclean ) { process copyGFF { + publishDir params.resultPath, mode: 'copy' + label 'gffcheck' input: @@ -519,12 +525,13 @@ if ( gffclean ) { output: file "annot.gff" into gff_file + file "annot.gff.clean.txt" into gff_file_log """ # get annot file export escaped=\$(echo '$baseDir') export basedirvar=\$(echo '\\\$\\{baseDir\\}') - cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff + cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff > annot.gff.clean.txt """ } @@ -634,7 +641,7 @@ process ipscn { input: file seq from seq_file_ipscan - file ("interproscan.properties") from file( iscan_properties ) + file ("interproscan.properties") from file( ipscan_properties ) output: file("out_interpro_${seq}") into (ipscn_result1, ipscn_result2) From 84d0b97e049e3e71a76fefc4ccc1290c268f2e78 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 17:48:10 +0200 Subject: [PATCH 134/381] fix --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3764565..e659f79 100644 --- a/README.md +++ b/README.md @@ -136,23 +136,23 @@ for further options or details, run: ## Associated containers - We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://sylabs.io/singularity/) (the latter preferred). +We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://sylabs.io/singularity/) (the latter preferred). - The software used all along this pipeline is encapsulated in, at least, 4 containers: +The software used all along this pipeline is encapsulated in, at least, 4 containers: - As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. +As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. - * [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this) - * [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this) +* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this) +* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this) - ### How to build base container +### How to build base container - The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. +The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. - ``` - # Generate Docker image - docker build -t fa-nf . +``` + # Generate Docker image + docker build -t fa-nf . - # Generate Singularity image if preferred - sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest - ``` + # Generate Singularity image if preferred + sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest +``` From c47659ad5c99af71b5f793537323af38310a39d4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 21:39:59 +0200 Subject: [PATCH 135/381] stupid fix --- main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index 372c485..247bd4a 100644 --- a/main.nf +++ b/main.nf @@ -494,6 +494,8 @@ if ( gffclean ) { process cleanGFF { + publishDir params.resultPath, mode: 'copy' + label 'gffcheck' input: @@ -501,12 +503,13 @@ if ( gffclean ) { output: file "annot.gff" into gff_file + file "annot.gff.clean.txt" into gff_file_log """ # get annot file export escaped=\$(echo '$baseDir') export basedirvar=\$(echo '\\\$\\{baseDir\\}') - agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff + agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff > annot.gff.clean.txt """ } @@ -516,8 +519,6 @@ if ( gffclean ) { process copyGFF { - publishDir params.resultPath, mode: 'copy' - label 'gffcheck' input: @@ -525,13 +526,12 @@ if ( gffclean ) { output: file "annot.gff" into gff_file - file "annot.gff.clean.txt" into gff_file_log """ # get annot file export escaped=\$(echo '$baseDir') export basedirvar=\$(echo '\\\$\\{baseDir\\}') - cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff > annot.gff.clean.txt + cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff """ } From fbd203f170af66b0fe406da301aae69e3c6b7400 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 23 May 2021 22:00:22 +0200 Subject: [PATCH 136/381] result files available --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index e659f79..14ee230 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,22 @@ Predictions of the KEGG orthology groups (KO) can be obtained outside of the pip Note: in the first case for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three lellters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. +## Result files + +* **«myorg».gff**: +* **annot.gff**: +* **annot.gff.clean.txt**: +* **annot.gff.stats.txt**: +* **annotatedVsnot.png**: +* **go_terms_byGene.txt**: +* **go_terms.txt**: +* **interProScan.res.tsv**: +* **protein_definition.txt**: +* **signalP.res.tsv**: +* **targetP.res.tsv**: +* **total_stats.txt**: + + ## Running in MySQL mode Running in MySQL mode improves the speed of the pipeline, but some care must be taken for including connection details in the configuration. From 1494587c97d8485ed3fde63910f899d48e85f952 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 00:22:54 +0200 Subject: [PATCH 137/381] more --- scripts/download_kegg_KAAS.pl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/download_kegg_KAAS.pl b/scripts/download_kegg_KAAS.pl index e27a7da..fe3293f 100755 --- a/scripts/download_kegg_KAAS.pl +++ b/scripts/download_kegg_KAAS.pl @@ -113,6 +113,10 @@ =head1 AUTHORS } +if ( $#queue >= 0 ) { + &processByAPI( \@queue, $down_kegg_dir, $iter ); +} + sub processByAPI { my $arr = shift; From 1b7016f8ee5c031d4e728a9cdcf8262ab5867e9e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 10:12:05 +0200 Subject: [PATCH 138/381] restrict GO --- scripts/load_kegg_KAAS.pl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index b47bb15..a4bca5e 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -682,8 +682,12 @@ sub parseKEGGDBLinks { my @retGO=(); $dbLinks=~s/\n//g; - while ($dbLinks=~/(\d+)/g) { - push( @retGO, "GO:".$1 ); + + # Let's restrict GO here. Future others + if ( $dbLinks=~/\bGO\:/ ) { + while ( $dbLinks=~/(\d+)/g ) { + push( @retGO, "GO:".$1 ); + } } return @retGO; From 280c4f834f0bf0e8dad8fbcebee1801aba41bb75 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 15:52:59 +0200 Subject: [PATCH 139/381] little changes --- README.md | 26 ++++++++++--------- scripts/get_results.pl | 6 ++--- .../lib/FunctionalAnnotation/getResults.pm | 4 +-- scripts/load_kegg_KAAS.pl | 2 +- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 14ee230..6176fef 100644 --- a/README.md +++ b/README.md @@ -86,18 +86,20 @@ Note: in the first case for the downstream processing of the KO file it is very ## Result files -* **«myorg».gff**: -* **annot.gff**: -* **annot.gff.clean.txt**: -* **annot.gff.stats.txt**: -* **annotatedVsnot.png**: -* **go_terms_byGene.txt**: -* **go_terms.txt**: -* **interProScan.res.tsv**: -* **protein_definition.txt**: -* **signalP.res.tsv**: -* **targetP.res.tsv**: -* **total_stats.txt**: +Below you can check all the possibly available files in results directory (defined in ```resultPath``` parameter) at the end of the pipeline execution. Some files may not be there if certain options are switched (e.g., if GFF cleaning is skipped with ```gffclean = "false"```). + +* **«myorg».gff**: final outcome GFF that adds retrieved annotation information to the provided GFF. Filename matches the ```dbname``` parameter +* **annot.gff**: input GFF file after being cleaned at the beginning of the pipeline and used in downstream processes +* **annot.gff.clean.txt**: GFF cleaning log information +* **annot.gff.stats.txt**: GFF input file statistics +* **annotatedVsnot.png**: summary chart with protein length distribution and annotation coverage +* **go_terms_byGene.tsv**: TSV file containing a list of genes, and all the GO codes assigned to the proteins associated to that gene and the different methods (e.g., KEGG) +* **go_terms.tsv**: TSV file containing a list of proteins with their assigned GO codes with the used methods +* **interProScan.res.tsv**: TSV file with all protein domain and signature matches using InterproScan +* **protein_definition.tsv**: TSV file with assigned protein definition and the method uses (e.g., using BLAST matches) +* **signalP.res.tsv**: TSV file with all SignalP predictions +* **targetP.res.tsv**: TSV file with all TargetP predictions +* **total_stats.txt**: Annotation coverage provided at the end of the pipeline execution ## Running in MySQL mode diff --git a/scripts/get_results.pl b/scripts/get_results.pl index 42e18c2..1766dc9 100755 --- a/scripts/get_results.pl +++ b/scripts/get_results.pl @@ -127,14 +127,14 @@ =head1 AUTHORS &printSummaryInfo(\@listIds, $dbh, $summaryFile); #print protein definition -my $definitionFile = $outputFolder.'/'.'protein_definition.txt'; +my $definitionFile = $outputFolder.'/'.'protein_definition.tsv'; &printDefinitionInfo(\@listIds, $dbh, $definitionFile, lc( $config{'dbEngine'} )); #get GO terms info -my $goFile=$outputFolder .'/'.'go_terms.txt'; +my $goFile=$outputFolder .'/'.'go_terms.tsv'; &printGoTerms(\@listIds, $goFile, $dbh, 'protein'); -my $goFile2=$outputFolder .'/'.'go_terms_byGene.txt'; +my $goFile2=$outputFolder .'/'.'go_terms_byGene.tsv'; &printGoTerms(\@listIds, $goFile2, $dbh, 'gene'); diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/scripts/lib/FunctionalAnnotation/getResults.pm index b527d7e..448c0c1 100644 --- a/scripts/lib/FunctionalAnnotation/getResults.pm +++ b/scripts/lib/FunctionalAnnotation/getResults.pm @@ -263,7 +263,7 @@ sub printGoTerms { open(OUTPUT, ">$fileName")||die("Can't open $fileName for writing! $!\n"); print OUTPUT "#PROTEIN_NAME\tGO_ACC\tGO_NAME\tGO_TYPE\tGO_SOURCE\n"; - my $sqlSelect = "select protein.protein_id,protein.stable_id, go_term.go_acc, go_term.go_name, go_term.term_type, group_concat( distinct( protein_go.source ) ) as GO_source from protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id group by protein.protein_id, go_term.go_acc order by protein.stable_id;"; + my $sqlSelect = "select protein.protein_id,protein.stable_id, go_term.go_acc, go_term.go_name, go_term.term_type, group_concat( distinct( protein_go.source ) order by protein_go.source ) as GO_source from protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id group by protein.protein_id, go_term.go_acc order by protein.stable_id;"; $results =$dbh->select_from_table($sqlSelect); foreach my $result (@{$results}) { @@ -275,7 +275,7 @@ sub printGoTerms open(OUTPUT, ">$fileName")||die("Can't opne $fileName for writing! $!\n"); print OUTPUT "#GENE_NAME\tGO_ACC\tGO_SOURCE\n"; - my $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; + my $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) order by protein_go.source ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; $results =$dbh->select_from_table($sqlSelect); diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index a4bca5e..c943608 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -679,7 +679,7 @@ sub uploadKeggInformation { sub parseKEGGDBLinks { my $dbLinks = shift; - my @retGO=(); + my (@retGO)=(); $dbLinks=~s/\n//g; From 3ceadaf75720ae32216fe63dde3e6ba34b4239bd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 16:14:57 +0200 Subject: [PATCH 140/381] provide path for file --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 247bd4a..91ac8be 100644 --- a/main.nf +++ b/main.nf @@ -983,7 +983,7 @@ def checkMySQL( mysql, mysqllog ) { def downloadURL( address, filename ) { downFile = new File( filename ) << new URL (address).getText() - return downFile + return downFile.absolutePath } From 6c9bf01a9e5c04b13b0766c213d9afdff5f19674 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 17:23:36 +0200 Subject: [PATCH 141/381] more details --- README.md | 57 +++++++++++++++++++++++++++++++++++++++++++-------- params.config | 1 + 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6176fef..656b8d7 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A pipeline for **functional annotation** of proteins from non-model organisms im The pipeline uses a set of well characterised software to assign functional information to the proteins of interests, i.e. domains, GO terms annotation, putative name and some other features. -The software used in this pipeline is free software for academic users. For the software from the Center for Biological Sequence (CBS), i.e. signalP, a suitable license agreement should be obtained. +The software used in this pipeline is mostly free software for academic users. For the software from the Center for Biological Sequence (CBS), i.e. signalP, a suitable license agreement should be obtained. More details about how to use this software in the *Associated containers* section at the end of this page. ## Installation The pipeline is build on Nextflow as a woking engine, so it need to be installed first @@ -39,10 +39,45 @@ The pipeline require as an input the configuration file with specified parameter The example of configuration file is included into this repository with name ```params.config``` +Most parameters are self-explanatory. We highlight some below and in upcoming sections: + +``` + # Protein fasta input + proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" + # GFF input + gffFile = "${baseDir}/dataset/P.vulgaris.gff3" +``` + +When approaching a new dataset, we suggest to run first the pipeline in **debug** mode (provided as such in example params config). This will analyze a limited number of protein entries. This way you may save time and troubleshoot some potential problems in your input files. + +``` + # Whether to run pipeline in debug mode or not + debug = "true" +``` + +One of the strenghts of Nextflow is allowing the parallelization and merging of several processes. In our case, input protein FASTA file is split and its sequences are delievered to the different used applications in chunks. For a quick processing, the optimal size of these chunks is not the same for each target application, and it can also depend on the setup of your HPC environment or network health. This can be tuned using the parameters below: + +``` + # Number of protein sequences per chunk (used as fallback) + chunkSize = 25 + # Number of protein sequences per chunk when using BLAST (or DIAMOND) + chunkBlastSize = 50 + # Number of protein sequences per chunk when using InterProScan + chunkIPSSize = 25 + # Number of protein sequences per chunk when using KofamKOALA + chunkKoalaSize = 50 + # Number of protein sequences per chunk when submitting to web processes (CD-Search for now) + chunkWebSize = 100 + # Number of chunks to be used when running in debug mode (e.g., for facllback processes this would be 5*25=125 protein sequences) + debugSize = 5 +``` + ## Pipeline steps ![Pipeline flow chart](./flowchart.png "Pipeline flow chart") +* **cleanGFF**: it cleans input GFF if enabled +* **statsGFF**: it provides some general statistics on the GFF input * **blast**: it perfoms BLAST search against defined database from input files * **diamond**: the same as above but using DIAMOND ( ```diamond = "true"``` in config file ) * **ipscn**: it performs InterProScan analyses from input files @@ -52,7 +87,7 @@ The example of configuration file is included into this repository with name ``` * **blastDef**: it attaches a definition to input entries based on BLAST hits * **cdSearchHit**: it performs a NCBI CDSearch Hit query * **cdSearchFeat**: it performs a NCBI CDSearch Feature query -* **initDB**: it initialitzes the Database used for gathering data from different analyses and later generating the reports +* **initDB**: it initialitzes the database used for gathering data from different analyses and later generating the reports. Starting inputs are FASTA and GFF files * **definition_upload**: it uploads definitions derived from BLAST into the DB * **signalP_upload**: it uploads signalP analyses into the DB * **targetP_upload**: it uploads targetP analyses into the DB @@ -64,9 +99,11 @@ The example of configuration file is included into this repository with name ``` * **generateResultFiles**: it generates report files * **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information from the previous annotation steps -### GFF cleaning +### GFF preparation + +Despite [some existing recommendations](https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md), there is a huge diversity of GFF formats in the wild. For safety reasons, we introduce an initial step, thanks to [AGAT toolkit](https://github.com/NBISweden/AGAT), (which can be disabled with ```gffclean = "false" ```) for ensuring that GFF input files will be properly processed. -... +We suggest to check **annot.gff**, **annot.gff.clean.txt** and **annot.gff.stats.txt** files in results directory and generated during the first steps of the pipeline, for checking that used GFF files are OK. ### Formatted databases @@ -82,11 +119,11 @@ As an example, in our case we are using a [web API](https://github.com/toniher/g ### KEGG orthology groups Predictions of the KEGG orthology groups (KO) can be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/) or using a previously set-up version of [KofamKOALA](https://www.genome.jp/tools/kofamkoala/). -Note: in the first case for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three lellters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. +**Note**: using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. ## Result files -Below you can check all the possibly available files in results directory (defined in ```resultPath``` parameter) at the end of the pipeline execution. Some files may not be there if certain options are switched (e.g., if GFF cleaning is skipped with ```gffclean = "false"```). +Below you can check all the possibly available files in results directory (defined with ```resultPath``` parameter) at the end of the pipeline execution. Some files may not be there if certain options are switched (e.g., if GFF cleaning is skipped with ```gffclean = "false"```). * **«myorg».gff**: final outcome GFF that adds retrieved annotation information to the provided GFF. Filename matches the ```dbname``` parameter * **annot.gff**: input GFF file after being cleaned at the beginning of the pipeline and used in downstream processes @@ -99,7 +136,7 @@ Below you can check all the possibly available files in results directory (defin * **protein_definition.tsv**: TSV file with assigned protein definition and the method uses (e.g., using BLAST matches) * **signalP.res.tsv**: TSV file with all SignalP predictions * **targetP.res.tsv**: TSV file with all TargetP predictions -* **total_stats.txt**: Annotation coverage provided at the end of the pipeline execution +* **total_stats.txt**: Annotation coverage provided at the end of the pipeline execution ## Running in MySQL mode @@ -124,11 +161,13 @@ The relevant paremetres below: # If using the wrapper below, where MySQL data will be stored mysqldata = "${baseDir}/mysql/" # If using the wrapper below, where MySQL instance logs will be stored - mysqllog = "${baseDir}/tmp" + mysqllog = "${baseDir}/tmp/" # If using the wrapper below, which Singularity image will be used mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" ``` +**Note**: when running a different analysis, take care to use a different ```dbname``` for avoiding unexpected problems. + ### Execution without an ad-hoc database We offer a convenience wrapper script for running the pipeline in MySQL mode either in SGE-compatible clusters or in local without having to set up any MySQL server and database before thanks to Singularity. @@ -156,7 +195,7 @@ for further options or details, run: We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://sylabs.io/singularity/) (the latter preferred). -The software used all along this pipeline is encapsulated in, at least, 4 containers: +The software used all along this pipeline is encapsulated in several containers: As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. diff --git a/params.config b/params.config index 8450ac9..a5c9260 100644 --- a/params.config +++ b/params.config @@ -14,6 +14,7 @@ params { chunkIPSSize = 25 chunkKoalaSize = 50 chunkWebSize = 100 + debugSize = 5 oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" resultPath = "${baseDir}/results/" stdoutLog = "${baseDir}/logs/functional_annotation.stdout" From 198f1beaed98bb98b6c44740554444acd233121f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 17:35:12 +0200 Subject: [PATCH 142/381] fix path --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 91ac8be..0616a57 100644 --- a/main.nf +++ b/main.nf @@ -983,7 +983,7 @@ def checkMySQL( mysql, mysqllog ) { def downloadURL( address, filename ) { downFile = new File( filename ) << new URL (address).getText() - return downFile.absolutePath + return file( downFile.absolutePath ) } From 918f4431e052deefd13da23caf0d0f469e7cd743 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 17:51:37 +0200 Subject: [PATCH 143/381] fix detect --- scripts/load_kegg_KAAS.pl | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c943608..032b9ac 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -674,19 +674,25 @@ sub uploadKeggInformation { }#sub -# DBLINKS GO: 0016279 0030544 sub parseKEGGDBLinks { my $dbLinks = shift; - my (@retGO)=(); + my ( @retGO ) = (); - $dbLinks=~s/\n//g; + my ( @dblines ) = split(/\n/, $dbLinks); + + # DBLINKS GO: 0016279 0030544 + + foreach my $dbline ( @dblines ) { + + if ( $dbline=~/\bGO\:/ ) { + + # Let's restrict GO here. Future others + while ( $dbline=~/(\d+)/g ) { + push( @retGO, "GO:".$1 ); + } - # Let's restrict GO here. Future others - if ( $dbLinks=~/\bGO\:/ ) { - while ( $dbLinks=~/(\d+)/g ) { - push( @retGO, "GO:".$1 ); } } From b388a7695440e6921f020354a16bb340ecca2702 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 18:03:34 +0200 Subject: [PATCH 144/381] fix problem --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 032b9ac..879ff62 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -680,7 +680,7 @@ sub parseKEGGDBLinks { my ( @retGO ) = (); - my ( @dblines ) = split(/\n/, $dbLinks); + my ( @dblines ) = split(/\,/, $dbLinks); # DBLINKS GO: 0016279 0030544 From e7a33502f5fb1fde8f3d02ef0e4c2a8b69035ea5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 18:08:30 +0200 Subject: [PATCH 145/381] obofile path --- main.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 0616a57..a828788 100644 --- a/main.nf +++ b/main.nf @@ -244,7 +244,7 @@ else { if( params.oboFile == "" || params.oboFile == null ) { oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) } else { - oboFile = file(params.oboFile) + oboFile = params.oboFile } @@ -929,14 +929,13 @@ process 'generateResultFiles'{ input: file config from config4perl10 file all_done from last_step1 - file obofile from oboFile script: command = checkMySQL( mysql, params.mysqllog ) command += " \ - get_results.pl -conf \$config -obo $obofile ; \ + get_results.pl -conf \$config -obo ${obofile} ; \ " command @@ -983,7 +982,7 @@ def checkMySQL( mysql, mysqllog ) { def downloadURL( address, filename ) { downFile = new File( filename ) << new URL (address).getText() - return file( downFile.absolutePath ) + return downFile.absolutePath } From bdb16350c2a582d5dae9ea8aa2bfb95211f21bc8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 19:02:44 +0200 Subject: [PATCH 146/381] more explanation --- README.md | 31 ++++++++++++++++++++++++++----- main.nf | 34 ++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 656b8d7..7953437 100644 --- a/README.md +++ b/README.md @@ -105,21 +105,42 @@ Despite [some existing recommendations](https://github.com/The-Sequence-Ontology We suggest to check **annot.gff**, **annot.gff.clean.txt** and **annot.gff.stats.txt** files in results directory and generated during the first steps of the pipeline, for checking that used GFF files are OK. -### Formatted databases +### BLAST databases -* For NCBI BLAST+: ```blastDbPath = "/path/to/db"``` and ```diamond = "false"```. It looks for formatted database files (normally named db.p* for protein type based ones), otherwise it will try to format FASTA file with that name -* For DIAMOND: ```blastDbPath = "/path/to/db"``` and ```diamond = "true"```. It looks for a single formatted database file (normally named db.dmnd), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) +* For NCBI BLAST+: ```blastDbPath = "/path/to/db"``` and ```diamond = "false"```. It looks for formatted database files (normally named ``db.p*`` for protein type based ones), otherwise it will try to format FASTA file with that name +* For DIAMOND: ```blastDbPath = "/path/to/db"``` and ```diamond = "true"```. It looks for a single formatted database file (normally named ``db.dmnd``), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) ### Retrieval of GO terms from BLAST results Retrieval of GO terms from BLAST results can be performed either from [BLAST2GO](https://www.blast2go.com/) results or from other methods as far as a BLAST2GO-compatible output format is provided. -As an example, in our case we are using a [web API](https://github.com/toniher/gogoAPI) providing this information from [UniProt GOA](https://www.ebi.ac.uk/GOA) database imported into a MySQL and/or [Neo4j](https://github.com/toniher/neo4j-biorelation). +Moreover, we are also providing a web API for retrieving protein-GO mapping from [UniProt GOA](https://www.ebi.ac.uk/GOA) and other resources. More details for [for setting an own instance here](https://github.com/toniher/gogoAPI). + +When using the second option, you can tune it with the parameters below: + +``` + # Instance from where to retrieve GO mappings + params.gogourl = "http://myinstance.example.com/api" + # Maximum number of hits to consider (up to 30 by default)) + params.gogohits = 30 + # Modes of retrieval from BLAST matches + * Common: Only GO entries appearing in all matches + * Most: Only GO entries appearing in more than half of matches + * All: All GO entries appearing in all matches + params.blastAnnotMode = "common" +``` ### KEGG orthology groups Predictions of the KEGG orthology groups (KO) can be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/) or using a previously set-up version of [KofamKOALA](https://www.genome.jp/tools/kofamkoala/). -**Note**: using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. +For KofamKOLA, adjust the parameters below to match the location in your system ([FTP source](ftp://ftp.genome.jp/pub/db/kofam/)) + +``` + kolist = "/nfs/db/kegg/ko_list" + koprofiles = "/nfs/db/kegg/profiles" +``` + +**Note**: when using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. ## Result files diff --git a/main.nf b/main.nf index a828788..dd4885a 100644 --- a/main.nf +++ b/main.nf @@ -46,8 +46,18 @@ params.debugSize = 2 params.blastFile = null params.evalue = 0.00001 params.diamond = null + +// GO retrieval params +params.gogourl = "" +params.gogohits = 30 params.blastAnnotMode = "common" // common, most, all available so far +// Params for InterProScan +// Temporary location for InterproScan intermediary files. This can be huge +params.ipscantmp = "${baseDir}/tmp/" +// Location of InterproScan properties. Do not modify unless it matches your container +params.ipscanproperties = "/usr/local/interproscan/interproscan.properties" + // Params for dealing with GFF params.gffclean = true params.gffstats = true @@ -205,7 +215,7 @@ seqWebData = Channel .splitFasta( by: chunkWebSize ) // TODO: This may be changed as paremeter -ipscan_properties = file("/usr/local/interproscan/interproscan.properties") +ipscan_properties = file(params.ipscanproperties) if ( params.debug ) { println("Debugging... only the first $params.debugSize chunks will be processed") @@ -453,22 +463,22 @@ keggfile = koala_parsed } -if(params.gogourl != ""){ +if (params.gogourl != "") { -process blast_annotator { + process blast_annotator { - label 'blastannotator' + label 'blastannotator' - input: - file blastXml from blastXmlResults2.flatMap() + input: + file blastXml from blastXmlResults2.flatMap() - output: - file "blastAnnot" into blast_annotator_results + output: + file "blastAnnot" into blast_annotator_results -""" - blast-annotator.pl -in $blastXml -out blastAnnot --url $params.gogourl -t $blastAnnotMode -q --format blastxml -""" -} + """ + blast-annotator.pl -in $blastXml -out blastAnnot --hits $params.gogohits --url $params.gogourl -t $blastAnnotMode -q --format blastxml + """ + } } From 2bc516b7d936abd3ea3ed491fba42964420a48df Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 19:06:50 +0200 Subject: [PATCH 147/381] oboFile --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index dd4885a..52849b8 100644 --- a/main.nf +++ b/main.nf @@ -945,7 +945,7 @@ process 'generateResultFiles'{ command = checkMySQL( mysql, params.mysqllog ) command += " \ - get_results.pl -conf \$config -obo ${obofile} ; \ + get_results.pl -conf \$config -obo ${oboFile} ; \ " command From 5442a45bfb0f40b7a1eb76e7ac49ec2cc57fccfd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 24 May 2021 20:22:08 +0200 Subject: [PATCH 148/381] More info --- README.md | 8 ++++---- params.config | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7953437..afe965b 100644 --- a/README.md +++ b/README.md @@ -183,8 +183,8 @@ The relevant paremetres below: mysqldata = "${baseDir}/mysql/" # If using the wrapper below, where MySQL instance logs will be stored mysqllog = "${baseDir}/tmp/" - # If using the wrapper below, which Singularity image will be used - mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" + # If using the wrapper below, which Singularity/Docker image will be used + mysqlimg = "docker://library/mariadb:10.3" ``` **Note**: when running a different analysis, take care to use a different ```dbname``` for avoiding unexpected problems. @@ -220,8 +220,8 @@ The software used all along this pipeline is encapsulated in several containers: As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. -* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this) -* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this) +* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this, **sigtarp** process in ```nextflow.config```) +* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this, **ipscan** process in ```nextflow.config```) ### How to build base container diff --git a/params.config b/params.config index a5c9260..e113c13 100644 --- a/params.config +++ b/params.config @@ -32,7 +32,7 @@ params { dbport = 12345 mysqldata = "${baseDir}/mysql/" mysqllog = "${baseDir}/tmp" - mysqlimg = "/software/bi/biocore_tools/git/singularity/mariadb-10.3.simg" + mysqlimg = "docker://library/mariadb:10.3" loglevel = "info" debug = "true" email = "yourmail@yourdomain" From d40639992b581eafed4a41168c605c36d0159777 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 25 May 2021 10:19:28 +0200 Subject: [PATCH 149/381] Update flowchart --- flowchart.png | Bin 308518 -> 429812 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/flowchart.png b/flowchart.png index 01f701b866764584bc4e70e275cc59b333710a1c..075f811b05a8844ce26415d751e95bdafac914b9 100644 GIT binary patch literal 429812 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 zEynJced?*

!U#eaC`Q%<~wIv;i@SDaY83E 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�M9iP3g0entkhz9TVfvM9CDO(i8?^_S<|!?)2>1 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 IMpj$@AIy|Ep8x;= literal 308518 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

kmlANEEZ`Xayr8 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 Date: Tue, 25 May 2021 23:59:27 +0200 Subject: [PATCH 150/381] clean --- .../lib/FunctionalAnnotation/uploadData.pm | 95 ++++++++++++------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 818fd69..4af750d 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -189,6 +189,7 @@ my $end_ix=4; my $strand_ix=6; my $ids_ix=8; +my %detectp = {}; my($g_id, $gene_start, $gene_end, $gene_strand, $gene_name, $c_prot_id, $c_contig, $c_start, $c_strand, $start, $end); my @elms; my $duplicated=0; @@ -203,12 +204,11 @@ open FH,"$inFile"; #@elms=split/\t/,$line; # Allow handling more variability below @elms=split/\s+/,$line; - if($elms[$type_ix] eq 'gene') - { + if($elms[$type_ix] eq 'gene') { if($c_prot_id ne '') { #if there was some protein before, insert it into DB - &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList,$dbh, $engine,$loglevel); + &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList, $dbh, $engine, $loglevel); $c_prot_id=''; } @@ -267,51 +267,74 @@ open FH,"$inFile"; if(($loglevel eq 'debug')) { print "GENE_ID: $g_id\n";} } + #elsif ($elms[$type_ix] eq 'CDS') { -#29/01/2016 - Francisco's annotation does not contain transcript field, but CDs -#14/09/2016 - Tyler's annotation contains both - transcript field and CDs, so there is a clear confusion - protein information is uploading twice. -# I need to check with CDs, if the prot_id is already present - just skip it. -#14/09/2016 - new Francisco's annotation contains mRNA field in combination with Name attribute + #29/01/2016 - Francisco's annotation does not contain transcript field, but CDs + #14/09/2016 - Tyler's annotation contains both - transcript field and CDs, so there is a clear confusion - protein information is uploading twice. + # I need to check with CDs, if the prot_id is already present - just skip it. + #14/09/2016 - new Francisco's annotation contains mRNA field in combination with Name attribute - # Here we prioritize transcript and mRNA # Toniher: Removed transcript option - elsif ( ( $elms[$type_ix] eq 'mRNA' ) || ( ( $elms[$type_ix] eq 'CDS' ) && ( !$c_prot_id || $c_prot_id eq '') ) ) { + + # Easy case, mRNA + if ( $elms[$type_ix] eq 'mRNA' ) { my $prot_id= &parseGFFProduct( $elms[$type_ix], $elms[$ids_ix], $elms[$annot_ix] ); + $c_prot_id=$prot_id; + $c_contig=$elms[$contig_ix]; + $c_strand=$elms[$strand_ix]; + $start=$elms[$start_ix]; + $end=$elms[$end_ix]; - if(($loglevel eq 'debug')) { - #print "PROTNE: ". Dumper( \@elms ); - print "PROTNE: $c_prot_id vs $prot_id\n"; + if ( ! $detectp{$c_prot_id} ) { + &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList,$dbh,$engine,$loglevel); + $detectp{$c_prot_id} = 1; + $c_prot_id = ""; } - if (!$c_prot_id || $c_prot_id eq '') { - $c_prot_id=$prot_id; - $c_contig=$elms[$contig_ix]; - $c_strand=$elms[$strand_ix]; - $start=$elms[$start_ix]; - $end=$elms[$end_ix]; - } elsif ($c_prot_id eq $prot_id) { - # if($c_strand eq '+') - # {$end=$elms[$end_ix];} - # else - {$start = $elms[$start_ix];} - next; - } elsif ($c_prot_id ne $prot_id) { - - &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList,$dbh,$engine,$loglevel); - $c_prot_id=$prot_id; - $c_strand=$elms[$strand_ix]; - $c_contig=$elms[$contig_ix]; - $start=$elms[$start_ix]; - $end=$elms[$end_ix]; - } + } + + # Convoluted case, via CDS + if ( $elms[$type_ix] eq 'CDS' ) { + + my $prot_id= &parseGFFProduct( $elms[$type_ix], $elms[$ids_ix], $elms[$annot_ix] ); + + # First case of CDS + if ( !$c_prot_id || $c_prot_id eq '' ) { + $c_prot_id=$prot_id; + $c_contig=$elms[$contig_ix]; + $c_strand=$elms[$strand_ix]; + $start=$elms[$start_ix]; + $end=$elms[$end_ix]; + } else { + if ( $c_prot_id eq $prot_id ) { + if($c_strand eq '+') { + $end=$elms[$end_ix]; + } else { + $start = $elms[$start_ix]; + } + next; + } else { + + if ( ! $detectp{$c_prot_id} ) { + &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList,$dbh,$engine,$loglevel); + $detectp{$c_prot_id} = 1; + $c_prot_id = ""; + } + + $c_prot_id=$prot_id; + $c_strand=$elms[$strand_ix]; + $c_contig=$elms[$contig_ix]; + $start=$elms[$start_ix]; + $end=$elms[$end_ix]; + } } -} + } close FH; -#update tailing record - &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList,$dbh, $engine, $loglevel); + #update tailing record + &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList, $dbh, $engine, $loglevel); } #end sub From 9b1a614fa2126dee390b2002e3468e69ca6db799 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 00:06:13 +0200 Subject: [PATCH 151/381] cleaning --- .../lib/FunctionalAnnotation/uploadData.pm | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 4af750d..e8e8e29 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -196,7 +196,7 @@ my $duplicated=0; $c_prot_id=''; #open file for parsing open FH,"$inFile"; - while() { +while() { next if /^#/; chomp; my $line=$_; @@ -204,51 +204,52 @@ open FH,"$inFile"; #@elms=split/\t/,$line; # Allow handling more variability below @elms=split/\s+/,$line; - if($elms[$type_ix] eq 'gene') { - if($c_prot_id ne '') - { - #if there was some protein before, insert it into DB - &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList, $dbh, $engine, $loglevel); - $c_prot_id=''; - } - # Toniher: Handling IDs more in detail since no always only words. Notice TransDecoder output + if($elms[$type_ix] eq 'gene') { + + if($c_prot_id ne '') { + #if there was some protein before, insert it into DB + &insertProtein($c_prot_id, $c_contig, $start, $end, $c_strand, $g_id, $idList, $dbh, $engine, $loglevel); + $c_prot_id=''; + } + + # Toniher: Handling IDs more in detail since no always only words. Notice TransDecoder output - $gene_name = &getGeneName( $elms[$ids_ix], $elms[$annot_ix] ); + $gene_name = &getGeneName( $elms[$ids_ix], $elms[$annot_ix] ); - #print STDERR Dumper( \@elms ); - #print STDERR $gene_name, "\n"; - #patch for pc2127 isolate, p.cucumerina project - gene name contains . symbol in the name - #if( $elms[$ids_ix]=~/ID=(PCUC.+)$/) - # {$gene_name=$1;} + #print STDERR Dumper( \@elms ); + #print STDERR $gene_name, "\n"; + #patch for pc2127 isolate, p.cucumerina project - gene name contains . symbol in the name + #if( $elms[$ids_ix]=~/ID=(PCUC.+)$/) + # {$gene_name=$1;} - # check that this gene is not present in DB + # check that this gene is not present in DB $duplicated=0; # check if there is already a gene with this gene_name in the DB my $selectString ="SELECT gene_id FROM gene WHERE gene_name=\"$gene_name\""; - if(($loglevel eq 'debug')) + if(($loglevel eq 'debug')) {print "$selectString\n";} my @res= @{$dbh->select_from_table($selectString,$dbh)}; # if YES, then do not insert if (scalar(@res)) { - if(($loglevel eq 'debug')||($loglevel eq 'info')) - { print STDOUT "WARN: $gene_name already exists in the DB. Skipping\n"; } + if(($loglevel eq 'debug')||($loglevel eq 'info')) + { print STDOUT "WARN: $gene_name already exists in the DB. Skipping\n"; } - $duplicated=1; - $g_id = $res[0]->{'gene_id'}; - if(($loglevel eq 'debug')) - { print "GENE_ID: $g_id\n";} + $duplicated=1; + $g_id = $res[0]->{'gene_id'}; + if(($loglevel eq 'debug')) + { print "GENE_ID: $g_id\n";} - next; + next; } # insert new gene $gene_strand=$elms[$strand_ix]; $gene_start=$elms[$start_ix]; $gene_end=$elms[$end_ix]; my $gene_sql_insert; - if( lc( $engine ) eq 'sqlite') + if( lc( $engine ) eq 'sqlite') {$gene_sql_insert = qq{ INSERT INTO gene(gene_id, gene_name,start,end,strand) VALUES (NULL,\"$gene_name\", \"$gene_start\", \"$gene_end\", \"$gene_strand\");};} - else + else { $gene_sql_insert = qq{ INSERT INTO gene SET gene_name=\"$gene_name\", start=\"$gene_start\", end=\"$gene_end\", strand=\"$gene_strand\";};} if(($loglevel eq 'debug')) { @@ -257,15 +258,15 @@ open FH,"$inFile"; } $g_id = $dbh->insert_set($gene_sql_insert,$dbh) if $duplicated==0; - if(!defined $g_id) + if(!defined $g_id) { my $select = &selectLastId( $engine ); my $results = $dbh->select_from_table($select); #print Dumper($results); $g_id=$results->[0]->{'id'}; - } - if(($loglevel eq 'debug')) - { print "GENE_ID: $g_id\n";} + } + if(($loglevel eq 'debug')) + { print "GENE_ID: $g_id\n";} } #elsif ($elms[$type_ix] eq 'CDS') { @@ -331,6 +332,7 @@ open FH,"$inFile"; } } } +} close FH; #update tailing record From 09b1e5e9beb8b40ba5bcd480df0392e64ce44dd8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 16:03:16 +0200 Subject: [PATCH 152/381] adding mediumtext for KEGG --- scripts/lib/SQL.schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 6347a6d..9169ac4 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -70,7 +70,7 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `class` TEXT , `db_links` TEXT , `db_id` TEXT , - `genes` TEXT , + `genes` MEDIUMTEXT , `kegg_release` FLOAT, KEY `kegg_release_idx` (`kegg_release`) ); From b8895fcad824348cd40c63839ec2f3d0d5d58c77 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 16:05:42 +0200 Subject: [PATCH 153/381] test bigger size of text --- scripts/lib/SQL.schema.sql | 2 +- scripts/load_kegg_KAAS.pl | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/lib/SQL.schema.sql b/scripts/lib/SQL.schema.sql index 9169ac4..57b6db7 100644 --- a/scripts/lib/SQL.schema.sql +++ b/scripts/lib/SQL.schema.sql @@ -70,7 +70,7 @@ CREATE TABLE IF NOT EXISTS `kegg_group` ( `class` TEXT , `db_links` TEXT , `db_id` TEXT , - `genes` MEDIUMTEXT , + `genes` LONGTEXT , `kegg_release` FLOAT, KEY `kegg_release_idx` (`kegg_release`) ); diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 879ff62..1a04a04 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -212,13 +212,13 @@ sub parseAndUploadKEGGEntry { # TODO: Rewrite into specific table - if ( $returnData{"GENES"} ) { - my (@parts) = split( ",", $returnData{"GENES"} ); - if ( $#parts > 1500 ) { # TODO: check this margin - $returnData{"GENES"} = join( ",", @parts[0 .. 1000] ); + #if ( $returnData{"GENES"} ) { + # my (@parts) = split( ",", $returnData{"GENES"} ); + # if ( $#parts > 1500 ) { # TODO: check this margin + # $returnData{"GENES"} = join( ",", @parts[0 .. 1000] ); # print STDERR "** Too big GENES in $kegg_id\n"; - } - } + # } + #} if ( $kegg_id ) { From 68d2a9580acde9263b6da4e08921b0fec872cb99 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 16:59:51 +0200 Subject: [PATCH 154/381] some debug --- main.nf | 2 +- params.config | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 52849b8..877b734 100644 --- a/main.nf +++ b/main.nf @@ -217,7 +217,7 @@ seqWebData = Channel // TODO: This may be changed as paremeter ipscan_properties = file(params.ipscanproperties) -if ( params.debug ) { +if ( params.debug == "true" || params.debug == true ) { println("Debugging... only the first $params.debugSize chunks will be processed") // Diferent parts for different processes. // TODO: With DSL2 this is far simpler diff --git a/params.config b/params.config index e113c13..2230936 100644 --- a/params.config +++ b/params.config @@ -1,11 +1,11 @@ params { proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" gffFile = "${baseDir}/dataset/P.vulgaris.gff3" - gffclean = "true" - gffstats = "true" + gffclean = true + gffstats = true evalue = "0.00001" blastFile = "" - diamond = "false" + diamond = false blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" blastAnnotMode = "common" speciesName = "P.vulgaris" @@ -14,7 +14,7 @@ params { chunkIPSSize = 25 chunkKoalaSize = 50 chunkWebSize = 100 - debugSize = 5 + debugSize = 2 oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" resultPath = "${baseDir}/results/" stdoutLog = "${baseDir}/logs/functional_annotation.stdout" @@ -34,6 +34,6 @@ params { mysqllog = "${baseDir}/tmp" mysqlimg = "docker://library/mariadb:10.3" loglevel = "info" - debug = "true" + debug = true email = "yourmail@yourdomain" } From 58ce6106a5e2baad9445ae00972cc3ece453f4da Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 17:15:48 +0200 Subject: [PATCH 155/381] avoid problem --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 877b734..a417cbc 100644 --- a/main.nf +++ b/main.nf @@ -261,7 +261,7 @@ if( params.oboFile == "" || params.oboFile == null ) { // TODO: To change for different aligners diamond = false -if( params.diamond ) { +if( params.diamond == "true" || params.diamond == true ) { diamond = true } From eb479c214718a40f39ff9e763b1dd01ca7bad414 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 17:24:15 +0200 Subject: [PATCH 156/381] specified specific NXF_VER --- run_pipeline_mysql.pl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index 7cd2d13..7eeb604 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -13,6 +13,8 @@ my ($confFile,$show_help); my $nextflow = "nextflow"; +# Tested NF version +my $nextflowver = "20.10.0"; my $nfscript = "main.nf"; my $nfparams = ""; # By default no additional params @@ -35,6 +37,7 @@ "conf=s"=>\$confFile, "help|h" => \$show_help, "nextflow=s" => \$nextflow, + "nextflowver=s" => \$nextflowver, "params=s" => \$nfparams, "extra=s" => \$extra, "resume|r" => \$resume, @@ -166,7 +169,7 @@ my $myip=`cat "$mysqllog/DBHOST"`; print "DBHOST: ".$myip."\n"; print( "Run NEXTFLOW\n") ; - system( "$nextflow run $nfparams -bg $nfscript $resumeStr --config $confFile" ); + system( "export NXF_VER=$nextflowver; $nextflow run $nfparams -bg $nfscript $resumeStr --config $confFile" ); } else { while ( ! -f "$mysqllog/DBHOST" ) { @@ -187,6 +190,6 @@ # Else, SQLite mode # Run Nextflow pipeline print( "Run NEXTFLOW\n") ; - system( "$nextflow run $nfparams -bg $nfscript $resumeStr --config $confFile" ); + system( "export NXF_VER=$nextflowver; $nextflow run $nfparams -bg $nfscript $resumeStr --config $confFile" ); } From 6bd4bb2ae8460fbedeb87044e88bb2ff36e6453c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 17:46:07 +0200 Subject: [PATCH 157/381] little fix --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 1a04a04..ee8830b 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -264,7 +264,7 @@ sub preUploadKeggInformation { sub splitKeggFile { my $file = shift; - my @strings = []; + my @strings = (); open (FH, "$file"); From f03078ca7d8cf7e3c58996aa28eb6db96228866b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 26 May 2021 17:46:31 +0200 Subject: [PATCH 158/381] min fix --- scripts/download_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/download_kegg_KAAS.pl b/scripts/download_kegg_KAAS.pl index fe3293f..30649fe 100755 --- a/scripts/download_kegg_KAAS.pl +++ b/scripts/download_kegg_KAAS.pl @@ -94,7 +94,7 @@ =head1 AUTHORS } my $webChunk = 10; -my @queue = []; +my @queue = (); my $iter = 0; foreach my $kegg_id ( keys %keggs ) { @@ -103,7 +103,7 @@ =head1 AUTHORS &processByAPI( \@queue, $down_kegg_dir, $iter ); - @queue = []; + @queue = (); $iter++; } From a422e111168fae9142e57b4eaebcb74e20ab64a0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 28 May 2021 16:40:56 +0200 Subject: [PATCH 159/381] adding docker ignore --- .dockerignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..df86c67 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +external/ +tmp/ +.nextflow* +work/ +.git/ +Dockerfile* +Singularity* +dataset/ From de9b60fb0b045da9f72daf3991228f14a7b98e02 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 31 May 2021 16:53:35 +0200 Subject: [PATCH 160/381] rm duplicate evalue --- params.config | 1 - 1 file changed, 1 deletion(-) diff --git a/params.config b/params.config index 2230936..ad6237b 100644 --- a/params.config +++ b/params.config @@ -19,7 +19,6 @@ params { resultPath = "${baseDir}/results/" stdoutLog = "${baseDir}/logs/functional_annotation.stdout" stderrLog = "${baseDir}/logs/functional_annotation.stderr" - evalue = 0.0001 kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" kolist = "/nfs/db/kegg/ko_list" koprofiles = "/nfs/db/kegg/profiles" From 712dffcdb3cc66c748bb21a7fa655fffb898c63b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 31 May 2021 16:56:38 +0200 Subject: [PATCH 161/381] Update new stuff --- TODO.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/TODO.md b/TODO.md index 52cf434..ba28685 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,10 @@ +* Singularity file for run_mysql wrapper process * Check kegg_upload slow process * In pre-upload insert many KEGG entries at once. - * Improve KEGG-GO part * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) -* Improve documentation of parameters * Include some testing and CI * Visualization of results * Venn Diagrams -* Ensure stop of MySQL process when error --- * Allow conversion from GenBank https://metacpan.org/pod/bp_genbank2gff3.pl * Allow reports from KEGG orthologs (number of potential orthologs from KEGG species) From d224818006986d240f2fb35cb1e90aeffe30885b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 31 May 2021 17:15:40 +0200 Subject: [PATCH 162/381] some troubleshooting --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index afe965b..203f696 100644 --- a/README.md +++ b/README.md @@ -234,3 +234,13 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola # Generate Singularity image if preferred sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest ``` + +## Troubleshooting + +* **I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** + +*Ensure you have an up-to-date version of Singularity. Otherwise you may need to clean some Singularity directories, the singularity one (where pipeline images are stored) in FA-nf base directory and ```.singularity``` in your ```$HOME``` directory.* + + + + From 3c8f8b18f601653c7dc590ddd39aa789098554bd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 31 May 2021 17:22:00 +0200 Subject: [PATCH 163/381] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 203f696..7e49ae4 100644 --- a/README.md +++ b/README.md @@ -237,7 +237,7 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola ## Troubleshooting -* **I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** +**I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** *Ensure you have an up-to-date version of Singularity. Otherwise you may need to clean some Singularity directories, the singularity one (where pipeline images are stored) in FA-nf base directory and ```.singularity``` in your ```$HOME``` directory.* From 1360b66986609481a5a9e9ff5d8b94aaf3b2ffb2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 31 May 2021 17:25:57 +0200 Subject: [PATCH 164/381] More troubleshoot --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7e49ae4..41bb31a 100644 --- a/README.md +++ b/README.md @@ -243,4 +243,7 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola +**Something went wrong. No supported configuration file syntax found at /your/path/lib/site_perl/5.26.2/Config/Simple.pm line 184, line 23.** + +*Check in line **23** (or the number you have) of your params.config if you have any syntax error (e.g., new line, additional quote character, etc.)* From ea4926e9467b6284322475a5bbeec975d2dbc551 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 31 May 2021 17:27:42 +0200 Subject: [PATCH 165/381] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 41bb31a..c7f6667 100644 --- a/README.md +++ b/README.md @@ -237,13 +237,13 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola ## Troubleshooting -**I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** +**At the beginning of the pipeline execution, I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** *Ensure you have an up-to-date version of Singularity. Otherwise you may need to clean some Singularity directories, the singularity one (where pipeline images are stored) in FA-nf base directory and ```.singularity``` in your ```$HOME``` directory.* -**Something went wrong. No supported configuration file syntax found at /your/path/lib/site_perl/5.26.2/Config/Simple.pm line 184, line 23.** +**Just after starting the pipeline, it stops and I get a message such as ```Something went wrong. No supported configuration file syntax found at /your/path/lib/site_perl/5.26.2/Config/Simple.pm line 184, line 23.```** -*Check in line **23** (or the number you have) of your params.config if you have any syntax error (e.g., new line, additional quote character, etc.)* +*Check line **23** (or the number you have) of your params.config if you have any syntax error (e.g., new line, additional quote character, etc.)* From 9e2d25f13dda7f05eef821a856cb451166a746a3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 1 Jun 2021 15:00:25 +0200 Subject: [PATCH 166/381] cleaning and some extra checks --- main.nf | 378 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 216 insertions(+), 162 deletions(-) diff --git a/main.nf b/main.nf index a417cbc..e3a6c8f 100644 --- a/main.nf +++ b/main.nf @@ -35,6 +35,10 @@ params.help = false params.debug = false params.dbEngine = "mysql" // SQLite otherwise +// Main input files +params.proteinFile = null; +params.gffFile = null; + // Sizes for different programs params.chunkIPSSize = null params.chunkBlastSize = null @@ -94,13 +98,14 @@ if ( params.help ) { */ // species-specific parameters -protein = file(params.proteinFile) -annotation = file(params.gffFile) +protein = null +annotation = null config_file = file(params.config) dbFile = false boolean exists = false boolean mysql = false +gffavail = false gffclean = false gffstats = false // Skip cdSearch @@ -148,8 +153,35 @@ log.info "Functional annotation pipeline" log.info "" log.info "General parameters" log.info "------------------" -log.info "Protein sequence file : ${params.proteinFile}" -log.info "GFF Annotation file : ${params.gffFile}" +log.info "GFF Structural Annotation file : ${params.gffFile}" + +if ( params.proteinFile == null || params.proteinFile == "" ) { + log.info "No protein sequence file specified!" + exit 1 +} else { + if ( file( params.proteinFile ).exists() && file( params.proteinFile ).size() > 0 ) { + log.info "Protein sequence file : ${params.proteinFile}" + protein = file(params.proteinFile) + } else { + log.info "Protein sequence file does not exist or it is empty!" + exit 1 + } +} + +if ( params.gffFile == null || params.gffFile == "" ) { + log.info "No GFF Structural Annotation file specified!" + log.info "We proceed anyway..." +} else { + if ( file( params.gffFile ).exists() && file( params.gffFile ).size() > 0 ) { + log.info "GFF Structural Annotation file : ${params.gffFile}" + gffavail = true + annotation = file(params.gffFile) + } else { + log.info "GFF Structural Annotation file is missing or empty." + log.info "We stop the pipeline so you can check it and define as \"\" otherwise if no GFF file is provided." + exit 1 + } +} if ( params.blastFile ) { log.info "BLAST results file : ${params.blastFile}" @@ -159,9 +191,9 @@ log.info "Species name : ${params.speciesName}" log.info "KEGG species : ${params.kegg_species}" if ( mysql ) { - log.info "FA database : ${params.dbname}" + log.info "MySQL FA database : ${params.dbname}" } else { - log.info "FA database : $dbFileName" + log.info "SQLite FA database : $dbFileName" } if ( skip_cdSearch ) { @@ -214,7 +246,6 @@ seqWebData = Channel .from(protein) .splitFasta( by: chunkWebSize ) -// TODO: This may be changed as paremeter ipscan_properties = file(params.ipscanproperties) if ( params.debug == "true" || params.debug == true ) { @@ -234,8 +265,7 @@ if ( params.debug == "true" || params.debug == true ) { (seq_test) = seqTestData.take(1).into(1) -} -else { +} else { println("Process entire dataset") (seq_file1, seq_file2) = seqData.into(2) (seq_file_blast) = seqBlastData.into(1) @@ -251,13 +281,160 @@ else { } -if( params.oboFile == "" || params.oboFile == null ) { +if ( params.oboFile == "" || params.oboFile == null ) { oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) } else { oboFile = params.oboFile } +// Preprocessing GFF File +if ( gffavail ) { + + if ( gffclean ) { + + process cleanGFF { + + publishDir params.resultPath, mode: 'copy' + + label 'gffcheck' + + input: + file config_file + + output: + file "annot.gff" into gff_file + file "annot.gff.clean.txt" into gff_file_log + + """ + # get annot file + export escaped=\$(echo '$baseDir') + export basedirvar=\$(echo '\\\$\\{baseDir\\}') + agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff > annot.gff.clean.txt + """ + + } + + + } else { + + process copyGFF { + + label 'gffcheck' + + input: + file config_file + + output: + file "annot.gff" into gff_file + + """ + # get annot file + export escaped=\$(echo '$baseDir') + export basedirvar=\$(echo '\\\$\\{baseDir\\}') + cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff + """ + + } + } + + if ( gffstats ) { + + process statsGFF { + + publishDir params.resultPath, mode: 'copy' + + label 'gffcheck' + + input: + file gff_file + + output: + file "*.txt" into gff_stats + + """ + # Generate Stats + agat_sp_statistics.pl --gff $gff_file > ${gff_file}.stats.txt + """ + + } + + + } + +} else { + + // Dummy empty GFF + process copyGFF { + + label 'gffcheck' + + input: + file config_file + + output: + file "annot.gff" into gff_file + + """ + # empty annot file + touch annot.gff + """ + + } +} + +// Database setup below +process initDB { + + input: + file config_file + file gff_file + file seq from seq_test + + output: + file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10, config4perl11) + + script: + command = "mkdir -p $params.resultPath\n" + command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' > configt\n" + command += "export escaped=\$(echo '$baseDir')\n" + command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" + command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" + + + if ( mysql ) { + // Add dbhost to config + command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" + command += "fa_main.v1.pl init -conf configIn" + + if ( gffavail && gffclean ) { + command += " -gff ${gff_file}" + } + } else { + + if (!exists) { + command += "fa_main.v1.pl init -conf config" + + if ( gffavail && gffclean ) { + command += " -gff ${gff_file}" + } + } + } + + if ( params.debug=="TRUE"||params.debug=="true" ) { + // If in debug mode, we restrict de seq entries we process + command += " -fasta ${seq}" + } + + if ( params.rmversion=="TRUE"||params.rmversion=="true" ) { + // If remove versioning in protein sequences (for cases like ENSEMBL) + command += " -rmversion" + } + + command +} + +// Blast like processes // TODO: To change for different aligners diamond = false @@ -395,7 +572,7 @@ if ( params.blastFile == "" || params.blastFile == null ){ blastInput=file(params.blastFile) - process convertBlast{ + process convertBlast { // publishDir "results", mode: 'copy' @@ -412,57 +589,58 @@ if ( params.blastFile == "" || params.blastFile == null ){ } } -if (params.kolist != "" || params.kolist != null ){ +if ( params.kolist != "" || params.kolist != null ){ -process kofamscan{ + process kofamscan{ - label 'kofamscan' + label 'kofamscan' - input: - file seq from seq_file_koala + input: + file seq from seq_file_koala - output: - file "koala_${seq}" into koalaResults + output: + file "koala_${seq}" into koalaResults - """ - exec_annotation --cpu ${task.cpus} -p ${params.koprofiles} -k ${params.kolist} -o koala_${seq} $seq - """ + """ + exec_annotation --cpu ${task.cpus} -p ${params.koprofiles} -k ${params.kolist} -o koala_${seq} $seq + """ -} + } -process kofam_parse { + process kofam_parse { - input: - file "koala_*" from koalaResults.collect() + input: + file "koala_*" from koalaResults.collect() - output: - file allKoala into koala_parsed + output: + file allKoala into koala_parsed -""" + """ -mkdir -p output -processHmmscan2TSV.pl "koala_*" output -cat output/koala_* > allKoala -""" + mkdir -p output + processHmmscan2TSV.pl "koala_*" output + cat output/koala_* > allKoala + """ -} + } -// Replacing keggfile -keggfile = koala_parsed + // Replacing keggfile + keggfile = koala_parsed } else { - if(params.keggFile == "" || params.keggFile == null ) { + if (params.keggFile == "" || params.keggFile == null ) { println "Please run KEGG KO group annotation on the web server http://www.genome.jp/tools/kaas/" } - keggfile=file(params.keggFile) + keggfile = file(params.keggFile) } +// GO retrieval from BLAST results if (params.gogourl != "") { process blast_annotator { @@ -498,129 +676,6 @@ process blastDef { """ } -// TODO: Need to simplify this step - -if ( gffclean ) { - - process cleanGFF { - - publishDir params.resultPath, mode: 'copy' - - label 'gffcheck' - - input: - file config_file - - output: - file "annot.gff" into gff_file - file "annot.gff.clean.txt" into gff_file_log - - """ - # get annot file - export escaped=\$(echo '$baseDir') - export basedirvar=\$(echo '\\\$\\{baseDir\\}') - agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff > annot.gff.clean.txt - """ - - } - - -} else { - - process copyGFF { - - label 'gffcheck' - - input: - file config_file - - output: - file "annot.gff" into gff_file - - """ - # get annot file - export escaped=\$(echo '$baseDir') - export basedirvar=\$(echo '\\\$\\{baseDir\\}') - cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff - """ - - } -} - -if ( gffstats ) { - - process statsGFF { - - publishDir params.resultPath, mode: 'copy' - - label 'gffcheck' - - input: - file gff_file - - output: - file "*.txt" into gff_stats - - """ - # Generate Stats - agat_sp_statistics.pl --gff $gff_file > ${gff_file}.stats.txt - """ - - } - - -} - -process initDB { - - input: - file config_file - file gff_file - file seq from seq_test - - output: - file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10, config4perl11) - - script: - command = "mkdir -p $params.resultPath\n" - command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' > configt\n" - command += "export escaped=\$(echo '$baseDir')\n" - command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" - command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" - - - if ( mysql ) { - // Add dbhost to config - command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" - command += "fa_main.v1.pl init -conf configIn" - - if ( gffclean ) { - command += " -gff ${gff_file}" - } - } else { - - if (!exists) { - command += "fa_main.v1.pl init -conf config" - - if ( gffclean ) { - command += " -gff ${gff_file}" - } - } - } - - if ( params.debug=="TRUE"||params.debug=="true" ) { - // If in debug mode, we restrict de seq entries we process - command += " -fasta ${seq}" - } - - if ( params.rmversion=="TRUE"||params.rmversion=="true" ) { - // If remove versioning in protein sequences (for cases like ENSEMBL) - command += " -rmversion" - } - - command -} - process 'definition_upload'{ maxForks 1 @@ -789,7 +844,6 @@ process 'targetP_upload'{ command } - process 'interpro_upload'{ maxForks 1 @@ -864,7 +918,7 @@ process 'CDsearch_feat_upload'{ command } -process 'blast_annotator_upload'{ +process 'blast_annotator_upload' { maxForks 1 From 710d79c8db8118895a2529f34797bd899f94f4f3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 1 Jun 2021 16:14:09 +0200 Subject: [PATCH 167/381] dummy GFF --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index e3a6c8f..4373358 100644 --- a/main.nf +++ b/main.nf @@ -365,7 +365,7 @@ if ( gffavail ) { } else { // Dummy empty GFF - process copyGFF { + process dummyGFF { label 'gffcheck' From 36496511b442c0eeb3d0ea699dff5bd6c91773e0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 1 Jun 2021 16:21:26 +0200 Subject: [PATCH 168/381] clean unnedeed --- main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/main.nf b/main.nf index 4373358..48334e1 100644 --- a/main.nf +++ b/main.nf @@ -153,7 +153,6 @@ log.info "Functional annotation pipeline" log.info "" log.info "General parameters" log.info "------------------" -log.info "GFF Structural Annotation file : ${params.gffFile}" if ( params.proteinFile == null || params.proteinFile == "" ) { log.info "No protein sequence file specified!" From 77edc8042a38661590bd026e1240888bed592969 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 2 Jun 2021 19:03:25 +0200 Subject: [PATCH 169/381] Update README.md debug to false --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c7f6667..88992e6 100644 --- a/README.md +++ b/README.md @@ -247,3 +247,7 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola *Check line **23** (or the number you have) of your params.config if you have any syntax error (e.g., new line, additional quote character, etc.)* + +**Despite it ran successfully, the pipeline did not process the whole dataset but just a small part of it** + +*You may have run it in debug mode. Check your params file and change it to debug = 'false'* From bfb0c2974ca5c47286c9e8cf296e133195e2bd1f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 4 Jun 2021 16:54:23 +0200 Subject: [PATCH 170/381] min change --- scripts/lib/FunctionalAnnotation/getResults.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/scripts/lib/FunctionalAnnotation/getResults.pm index 448c0c1..686d39d 100644 --- a/scripts/lib/FunctionalAnnotation/getResults.pm +++ b/scripts/lib/FunctionalAnnotation/getResults.pm @@ -136,7 +136,7 @@ sub printSummaryInfo if(defined $resultNumber && $resultNumber >0) { $propAnnot =sprintf("%.2f",$resultNumber*100/$numberProteins); - print OUTPUT "Proteins with definition(name): $resultNumber ($propAnnot %)\n"; + print OUTPUT "Proteins with definition (name): $resultNumber ($propAnnot %)\n"; } # TODO: To review all these tables From 314ec2175935d95bd29af8f0bdeeaebfedbef485 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 4 Jun 2021 19:10:35 +0200 Subject: [PATCH 171/381] update, clean and fix gff generation problem --- scripts/get_gff3.pl | 343 ++++++++++++++++++++++---------------------- 1 file changed, 174 insertions(+), 169 deletions(-) diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index 90c8bab..c8ba12b 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -188,7 +188,7 @@ sub createGFF3File { my $geneName =$results->[0]->{'gene_name'}||''; #blast2go - if($definition ne ''){ + if ( $definition ne '' ){ my (@defparts) = split(/@@/, $definition); my @descfields; foreach my $def ( @defparts ) { @@ -196,200 +196,205 @@ sub createGFF3File { push( @descfields, $def ); } $descrField .="Definition=".join( ",", @descfields).";"; - } + } #Xref record - $selectString = "select distinct dbid,dbname from xref where protein_id=$idItem"; + $selectString = "select distinct dbid, dbname from xref where protein_id=$idItem"; #print STDERR "D:".$selectString, "\n"; $results =$dbh->select_from_table($selectString); my @xrefId=(); + foreach my $item( @{$results} ) { + push(@xrefId , "$item->{'dbname'}.id=$item->{'dbid'}"); + } + + if(scalar @xrefId >0){ + my $xrefList = join(',', @xrefId); + $descrField .= $xrefList.';'; + } + + #ontology + my @ontologyData=(); + #The intersection of this table is too big, since protein_go is huge. Thus I decided to make a two select, and then join results. + $selectString = "select distinct go_term_id, source from protein_go where protein_id=$idItem"; + #print STDERR "G:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + #one protein could have more then one go_term_id + my @goTermId=(); + my @goSource=(); + foreach my $item(@{$results}) { - push(@xrefId , "$item->{'dbname'}.id=$item->{'dbid'}");} + push(@goTermId , $item->{'go_term_id'}); + push(@goSource , $item->{'source'}); + } - if(scalar @xrefId >0){ - my $xrefList = join(',', @xrefId); - $descrField .= $xrefList.';'; - } + if ( scalar @goTermId > 0 ) { + my $goTermIdString = join(',',@goTermId); + $selectString = "select go_acc from go_term where go_term_id in ($goTermIdString)"; + $results =$dbh->select_from_table($selectString); + foreach my $item(@{$results}) { + push(@ontologyData, $item->{'go_acc'}); + } + my $ontologyList = join(',', @ontologyData); - #ontology - my @ontologyData=(); - #The intersection of this table is too big, since protein_go is huge. Thus I decided to make a two select, and then join results. - $selectString = "select distinct go_term_id, source from protein_go where protein_id=$idItem"; - #print STDERR "G:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - #one protein could have more then one go_term_id - my @goTermId=(); - my @goSource=(); - - foreach my $item(@{$results}) { - push(@goTermId , $item->{'go_term_id'}); - push(@goSource , $item->{'source'}); - } - - if (scalar @goTermId >0) { - my $goTermIdString = join(',',@goTermId); - $selectString = "select go_acc from go_term where go_term_id in ($goTermIdString)"; - $results =$dbh->select_from_table($selectString); - foreach my $item(@{$results}) { - push(@ontologyData, $item->{'go_acc'}); - } - my $ontologyList = join(',', @ontologyData); + if($ontologyList ne ''){ - if($ontologyList ne ''){ + $descrField .= "Ontology_term=$ontologyList;"; + my @usources = do { my %seen; grep { !$seen{ trim($_ ) }++ } @goSource }; + my $usourcestr = join(',',@usources); - $descrField .= "Ontology_term=$ontologyList;"; - my @usources = do { my %seen; grep { !$seen{ trim($_ ) }++ } @goSource }; - my $usourcestr = join(',',@usources); + if ($usourcestr ne ''){ + # TODO: To consider better way to keep this + $descrField .= "Ontology_source=$usourcestr;"; + } - if ($usourcestr ne ''){ - # TODO: To consider better way to keep this - $descrField .= "Ontology_source=$usourcestr;"; - } + } + } - } - } + #KEGG KO groups + #The same thing here - protein_ortholog is quite big, so I will select kegg_groups first and then do select information about them. + $selectString ="select distinct kegg_group_id from protein_ortholog where protein_id=$idItem"; + #print STDERR "G:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + my @keggGroupId=(); + + foreach my $item(@{$results}){ + push(@keggGroupId , $item->{'kegg_group_id'}); + } - #KEGG KO groups - #The same thing here - protein_ortholog is quite big, so I will select kegg_groups first and then do select information about them. - $selectString ="select distinct kegg_group_id from protein_ortholog where protein_id=$idItem"; - #print STDERR "G:".$selectString."\n"; + if(scalar @keggGroupId >0) { + my $keggGroupString = join(',',@keggGroupId); + $selectString = "select db_id, definition, pathway from kegg_group where kegg_group_id in ($keggGroupString)"; $results =$dbh->select_from_table($selectString); - my @keggGroupId=(); - foreach my $item(@{$results}){ - push(@keggGroupId , $item->{'kegg_group_id'}); - } - if(scalar @keggGroupId >0) { - my $keggGroupString = join(',',@keggGroupId); - $selectString = "select db_id, definition, pathway from kegg_group where kegg_group_id in ($keggGroupString)"; - $results =$dbh->select_from_table($selectString); - my $koGroup = $results->[0]->{'db_id'}; - my $koDefinition = $results->[0]->{'definition'}; - my $koPathway = $results->[0]->{'pathway'}; - if((defined $koGroup) && ($koGroup ne '')) { - - $descrField .= "ko_group=$koGroup;ko_definition=".escapeGFF($koDefinition).";"; - - if ( trim( $koPathway ) ne '' ) { - $descrField .= "ko_pathway=$koPathway;"; - } - } + my $koGroup = $results->[0]->{'db_id'}; + my $koDefinition = $results->[0]->{'definition'}; + my $koPathway = $results->[0]->{'pathway'}; + if((defined $koGroup) && ($koGroup ne '')) { - if ( $protName && $protName ne '' ) { - print OUTFILE "##sequence-region $protName $start $stop\n"; - } + $descrField .= "ko_group=$koGroup;ko_definition=".escapeGFF($koDefinition).";"; - if( $geneName ne '' ) { - if ( ! $geneStore{$geneName} ) { - # Avoid duplication of genes - print OUTFILE "$genomicLocation\t.\tgene\t$genomicStart\t$genomicEnd\t.\t$strand\t.\tID=$geneName;\n"; - $geneStore{$geneName} = 1; - } + if ( trim( $koPathway ) ne '' ) { + $descrField .= "ko_pathway=$koPathway;"; + } } - ####### update 29/06/2017 - ### in the protein-based coordinates it should be plus strand, if other not specified. - $strand='+'; + } - #updt 29/06/2017 added Parent field + if ( $protName && $protName ne '' ) { + print OUTFILE "##sequence-region $protName $start $stop\n"; + } - if ( $protName && $protName ne '' ) { - print OUTFILE "$protName\t.\tpolypeptide\t$start\t$stop\t.\t$strand\t.\tID=$protName;Parent=$geneName;$descrField\n"; + if( $geneName ne '' ) { + if ( ! $geneStore{$geneName} ) { + # Avoid duplication of genes + print OUTFILE "$genomicLocation\t.\tgene\t$genomicStart\t$genomicEnd\t.\t$strand\t.\tID=$geneName;\n"; + $geneStore{$geneName} = 1; } + } - #blast hits TO CONSIDER - #$selectString = "select hit_id, start, end, score, evalue, description from blast_hit where protein_id=$idItem"; - #$results =$dbh->select_from_table($selectString); - #foreach my $result (@{$results}) - #{ - # my $blastStart = $result->{'start'}; - # my $blastEnd = $result->{'end'}; - # my $blastScore = $result->{'score'}; - # my $blastEvalue = $result->{'evalue'}; - # my $hitId = $result->{'hit_id'}; - # my $descr = $result->{'description'}; - #my ($definition, $organism); - # ($definition, $organism)=$descr=~/^(.+?)\[(.+?)\]/; - # if(!defined $definition) - # { - # $definition = $descr; - # #($definition)=$descr=~/^(.+?)\>/; - # $organism="all"; - # } - # $definition =~s/[][><=:;|.]/ /g; - # print OUTFILE "$protName\tNR\tBLAST_match\t$start\t$stop\t$blastEvalue\t$strand\t.\tName=Match;Target=$hitId $blastStart $blastEnd;score=$blastScore;Note=$definition;organism=$organism;\n"; - #} - #domains - $selectString = "SELECT domain_name, rel_start, rel_end, db_xref, score, evalue,description,ip_desc, ip_id FROM domain where protein_id=$idItem order by db_xref"; - #print STDERR "D:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - foreach my $result (@{$results}) { - my $dbName = $result->{'db_xref'}; - my $domainStart =$result->{'rel_start'}; - my $domainEnd = $result->{'rel_end'}; - my $evalue = $result->{'evalue'}||'.'; # Default for evalue - if($evalue ne '.' and $evalue ne '-') { - $evalue = sprintf("%.1e", $evalue); - } - my $ipID =$result->{'ip_id'}; - my $domainName =$result->{'domain_name'}; - my $descfield = $result->{'description'}||''; - my $ipdesc = $result->{'ip_desc'}||''; - - my @descarr; - if ( $descfield && $descfield ne '' ) { - push( @descarr, escapeGFF( $descfield ) ); - } - if ( $ipdesc && $ipdesc ne '' && $ipdesc ne '-' ) { - push( @descarr, escapeGFF( $ipdesc ) ); - } + ####### update 29/06/2017 + ### in the protein-based coordinates it should be plus strand, if other not specified. + $strand='+'; - my $description = join( ",", @descarr ); + #updt 29/06/2017 added Parent field - #updt 29/06/2017 -added ID and Parent records + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\t.\tpolypeptide\t$start\t$stop\t.\t$strand\t.\tID=$protName;Parent=$geneName;$descrField\n"; + } - $idInterPro++; + #blast hits TO CONSIDER + #$selectString = "select hit_id, start, end, score, evalue, description from blast_hit where protein_id=$idItem"; + #$results =$dbh->select_from_table($selectString); + #foreach my $result (@{$results}) + #{ + # my $blastStart = $result->{'start'}; + # my $blastEnd = $result->{'end'}; + # my $blastScore = $result->{'score'}; + # my $blastEvalue = $result->{'evalue'}; + # my $hitId = $result->{'hit_id'}; + # my $descr = $result->{'description'}; + #my ($definition, $organism); + # ($definition, $organism)=$descr=~/^(.+?)\[(.+?)\]/; + # if(!defined $definition) + # { + # $definition = $descr; + # #($definition)=$descr=~/^(.+?)\>/; + # $organism="all"; + # } + # $definition =~s/[][><=:;|.]/ /g; + # print OUTFILE "$protName\tNR\tBLAST_match\t$start\t$stop\t$blastEvalue\t$strand\t.\tName=Match;Target=$hitId $blastStart $blastEnd;score=$blastScore;Note=$definition;organism=$organism;\n"; + #} + #domains + $selectString = "SELECT domain_name, rel_start, rel_end, db_xref, score, evalue,description,ip_desc, ip_id FROM domain where protein_id=$idItem order by db_xref"; + #print STDERR "D:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + foreach my $result (@{$results}) { + my $dbName = $result->{'db_xref'}; + my $domainStart =$result->{'rel_start'}; + my $domainEnd = $result->{'rel_end'}; + my $evalue = $result->{'evalue'}||'.'; # Default for evalue + if($evalue ne '.' and $evalue ne '-') { + $evalue = sprintf("%.1e", $evalue); + } + my $ipID =$result->{'ip_id'}; + my $domainName =$result->{'domain_name'}; + my $descfield = $result->{'description'}||''; + my $ipdesc = $result->{'ip_desc'}||''; + + my @descarr; + if ( $descfield && $descfield ne '' ) { + push( @descarr, escapeGFF( $descfield ) ); + } + if ( $ipdesc && $ipdesc ne '' && $ipdesc ne '-' ) { + push( @descarr, escapeGFF( $ipdesc ) ); + } + + my $description = join( ",", @descarr ); + + #updt 29/06/2017 -added ID and Parent records + + $idInterPro++; + + if ( $protName && $protName ne '' ) { + + print OUTFILE "$protName\t$dbName\tprotein_match\t$domainStart\t$domainEnd\t$evalue\t$strand\t.\tName=$domainName;ID=InterProScan$idInterPro;"; + if( $ipID && $ipID ne '' && $ipID ne '-' ) { + print OUTFILE "interpro_id=$ipID;"; + } + if($description && $description ne '') { + print OUTFILE "interpro_note=$description;\n"; + } else { + print OUTFILE "\n"; + } + } - if ( $protName && $protName ne '' ) { + } + #NCBI conserved domains (CD) search results - hits and features + #hits + $selectString = "SELECT accession, Superfamily,Hit_type, PSSM_ID, coordinateFrom, coordinateTo, E_Value, Bitscore, Short_name, Incomplete FROM cd_search_hit where protein_id=$idItem order by coordinateFrom"; + #print STDERR "C:".$selectString."\n"; + $results =$dbh->select_from_table($selectString); + foreach my $result (@{$results}) { + my $access = $result->{'accession'}; + my $superfamily =$result->{'Superfamily'}; + my $CDEnd = $result->{'coordinateTo'}; + my $CDStart = $result->{'coordinateFrom'}; + #my $evalue = sprintf("%.1e", $result->{'E_Value'}); + my $evalue = $result->{'E_Value'}; + my $CDType =$result->{'Hit_type'}; + my $PSS =$result->{'PSSM_ID'}; + my $shortName =$result->{'Short_name'}; + my $Incomplete =$result->{'Incomplete'}; + + #updt 29/06/17 added ID record and remove \" characters from fields + $idCDSearchHit++; + $CDStart=~s/\"//gi; + $CDEnd=~s/\"//gi; + $evalue=~s/\"//gi; - print OUTFILE "$protName\t$dbName\tprotein_match\t$domainStart\t$domainEnd\t$evalue\t$strand\t.\tName=$domainName;ID=InterProScan$idInterPro;"; - if( $ipID && $ipID ne '' && $ipID ne '-' ) { - print OUTFILE "interpro_id=$ipID;"; - } - if($description && $description ne '') { - print OUTFILE "interpro_note=$description;\n"; - } else { - print OUTFILE "\n"; - } + if ( $protName && $protName ne '' ) { + print OUTFILE "$protName\tCDsearch\tdomain_match\t$CDStart\t$CDEnd\t$evalue\t.\t.\tID=CDSearchHit$idCDSearchHit;Accession=$access;Superfamily=$superfamily;Short_name=$shortName;PSSM_ID=$PSS;Hit_type=$CDType;\n"; } - - } - #NCBI conserved domains (CD) search results - hits and features - #hits - $selectString = "SELECT accession, Superfamily,Hit_type, PSSM_ID, coordinateFrom, coordinateTo, E_Value, Bitscore, Short_name, Incomplete FROM cd_search_hit where protein_id=$idItem order by coordinateFrom"; - #print STDERR "C:".$selectString."\n"; - $results =$dbh->select_from_table($selectString); - foreach my $result (@{$results}) { - my $access = $result->{'accession'}; - my $superfamily =$result->{'Superfamily'}; - my $CDEnd = $result->{'coordinateTo'}; - my $CDStart = $result->{'coordinateFrom'}; - #my $evalue = sprintf("%.1e", $result->{'E_Value'}); - my $evalue = $result->{'E_Value'}; - my $CDType =$result->{'Hit_type'}; - my $PSS =$result->{'PSSM_ID'}; - my $shortName =$result->{'Short_name'}; - my $Incomplete =$result->{'Incomplete'}; - - #updt 29/06/17 added ID record and remove \" characters from fields - $idCDSearchHit++; - $CDStart=~s/\"//gi; - $CDEnd=~s/\"//gi; - $evalue=~s/\"//gi; - - if ( $protName && $protName ne '' ) { - print OUTFILE "$protName\tCDsearch\tdomain_match\t$CDStart\t$CDEnd\t$evalue\t.\t.\tID=CDSearchHit$idCDSearchHit;Accession=$access;Superfamily=$superfamily;Short_name=$shortName;PSSM_ID=$PSS;Hit_type=$CDType;\n"; - } } #features $selectString = "SELECT title, Type, coordinates,source_domain FROM cd_search_features where protein_id=$idItem"; @@ -410,7 +415,7 @@ sub createGFF3File { } } - #signalP, chloroP features + #signalP, chloroP features my @list=('signalP', 'chloroP'); foreach my $lItem (@list) { $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; @@ -430,8 +435,8 @@ sub createGFF3File { } } #signalP, targetP, chloroP - } #foreach protein item - } + } #foreach protein item + close(OUTFILE); } From 694132856490dfadcca61bcb4d9bf23b4e5b4466 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 6 Jun 2021 23:16:57 +0200 Subject: [PATCH 172/381] Upgrade --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index ba28685..99ce2c8 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,4 @@ +* Log directory check * Singularity file for run_mysql wrapper process * Check kegg_upload slow process * In pre-upload insert many KEGG entries at once. From 79019ac31a1418b53f2a137e091f8eef5b73eeae Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:03:49 +0200 Subject: [PATCH 173/381] update CDS case with prefix --- scripts/lib/FunctionalAnnotation/uploadData.pm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index e8e8e29..17bceea 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -380,6 +380,10 @@ sub parseGFFProduct { # TransDecoder. Added by Toniher if ( $prot_id eq '' && $annotation eq 'transdecoder' ) { $prot_id=$1 if $sid=~/ID=([^\;]+)/; + if ( $type eq "CDS" ) { + # Case of CDS prefix + $prot_id=~s/^cds\.//g; + } } # Allowing different types for PASA From 258c4a3f5fec25bda31232d73a3d2e3681c06065 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:07:23 +0200 Subject: [PATCH 174/381] allow case insenstive --- scripts/lib/FunctionalAnnotation/uploadData.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 17bceea..41a6405 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -382,7 +382,7 @@ sub parseGFFProduct { $prot_id=$1 if $sid=~/ID=([^\;]+)/; if ( $type eq "CDS" ) { # Case of CDS prefix - $prot_id=~s/^cds\.//g; + $prot_id=~s/^cds\.//ig; } } From 5500a41bb0a26b7351e00352e178047ea33b9bd5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:26:08 +0200 Subject: [PATCH 175/381] CDS cases --- scripts/lib/FunctionalAnnotation/uploadData.pm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 41a6405..78ee3d7 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -280,6 +280,11 @@ while() { # Easy case, mRNA if ( $elms[$type_ix] eq 'mRNA' ) { + # We skip transdecoder. # TODO: Check there are CDS around + if ( $type eq 'transdecoder' ) { + next; + } + my $prot_id= &parseGFFProduct( $elms[$type_ix], $elms[$ids_ix], $elms[$annot_ix] ); $c_prot_id=$prot_id; From e86addc2277121b112403de75974b2978e1fca90 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:29:11 +0200 Subject: [PATCH 176/381] fix --- scripts/lib/FunctionalAnnotation/uploadData.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 78ee3d7..ee86f13 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -281,7 +281,7 @@ while() { if ( $elms[$type_ix] eq 'mRNA' ) { # We skip transdecoder. # TODO: Check there are CDS around - if ( $type eq 'transdecoder' ) { + if ( $elms[$annot_ix] eq 'transdecoder' ) { next; } From 71ba7bd2f31328d13009b96287c195b922e3f939 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:42:26 +0200 Subject: [PATCH 177/381] check a bit --- .../lib/FunctionalAnnotation/uploadData.pm | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index ee86f13..f5de5ef 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -165,13 +165,39 @@ sub uploadFastaData }#while }#sub -# + +sub retrieveGFFTypes { + + my %htypes; + my $inFile = shift; + + #open file for parsing + open FH, "$inFile"; + while() { + next if /^#/; + chomp; + my $line=$_; + + my (@elms) =split/\s+/,$line; + + if ( $elms[$type_ix] ) { + if ( $htypes{$elms[$type_ix]} ) { + $htypes{$elms[$type_ix]}++; + } else { + $htypes{$elms[$type_ix]} = 1; + } + } + + } + + return %htypes; +} + # #Note: here I assume that gff file is correct and soesnot contain errors, e.g. all genes and their transcript are at the same strand and so on. All genes definition is prior to cds definition! # For checking correctness on the gff file there is another subroutine. -sub uploadGFFData -{ +sub uploadGFFData { my($inFile, $dbh, $idList,$do_update, $engine, $loglevel)=@_; my $numberElements = scalar keys %{$idList}||''; @@ -194,8 +220,12 @@ my($g_id, $gene_start, $gene_end, $gene_strand, $gene_name, $c_prot_id, $c_conti my @elms; my $duplicated=0; $c_prot_id=''; + +my %htypes = &retrieveGFFTypes( $inFile ); +print STDERR \%htypes; + #open file for parsing -open FH,"$inFile"; +open FH, "$inFile"; while() { next if /^#/; chomp; From 949b974ebd6142af0c58486f19e12e476147fa67 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:48:48 +0200 Subject: [PATCH 178/381] fix --- scripts/lib/FunctionalAnnotation/uploadData.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index f5de5ef..c45d4af 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -170,6 +170,7 @@ sub retrieveGFFTypes { my %htypes; my $inFile = shift; + my $type_ix = shift; #open file for parsing open FH, "$inFile"; @@ -221,7 +222,7 @@ my @elms; my $duplicated=0; $c_prot_id=''; -my %htypes = &retrieveGFFTypes( $inFile ); +my %htypes = &retrieveGFFTypes( $inFile, $type_ix ); print STDERR \%htypes; #open file for parsing From 1cf2470b657106af43b1cb80a8ec4c83ff6d3cf6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 11:54:32 +0200 Subject: [PATCH 179/381] test --- scripts/lib/FunctionalAnnotation/uploadData.pm | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index c45d4af..839ca74 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -223,7 +223,7 @@ my $duplicated=0; $c_prot_id=''; my %htypes = &retrieveGFFTypes( $inFile, $type_ix ); -print STDERR \%htypes; +# print STDERR \%htypes; #open file for parsing open FH, "$inFile"; @@ -308,13 +308,8 @@ while() { # Toniher: Removed transcript option - # Easy case, mRNA - if ( $elms[$type_ix] eq 'mRNA' ) { - - # We skip transdecoder. # TODO: Check there are CDS around - if ( $elms[$annot_ix] eq 'transdecoder' ) { - next; - } + # Easy case, mRNA and no CDS around + if ( ( $elms[$type_ix] eq 'mRNA' ) && ! $htypes{"CDS"} ) { my $prot_id= &parseGFFProduct( $elms[$type_ix], $elms[$ids_ix], $elms[$annot_ix] ); From f72cf2936fddcf269dbc0471df55e4f14dfb92ac Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 12:00:20 +0200 Subject: [PATCH 180/381] more case --- scripts/lib/FunctionalAnnotation/uploadData.pm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 839ca74..df6c3e6 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -308,8 +308,13 @@ while() { # Toniher: Removed transcript option - # Easy case, mRNA and no CDS around - if ( ( $elms[$type_ix] eq 'mRNA' ) && ! $htypes{"CDS"} ) { + # Easy case, mRNA + if ( ( $elms[$type_ix] eq 'mRNA' ) ) { + + # We skip transdecoder if there are CDS around + if ( $elms[$annot_ix] eq 'transdecoder' && $htypes{"CDS"} ) { + next; + } my $prot_id= &parseGFFProduct( $elms[$type_ix], $elms[$ids_ix], $elms[$annot_ix] ); From f1850ae4a25e9a3f0cad3c43f790108aa2a4ea1c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 12:38:27 +0200 Subject: [PATCH 181/381] some more work on logs --- main.nf | 5 +++++ scripts/fa_main.v1.pl | 45 +++++++++++++++++++++++++++++++++++++------ scripts/get_gff3.pl | 3 +++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 48334e1..53bedcd 100644 --- a/main.nf +++ b/main.nf @@ -39,6 +39,11 @@ params.dbEngine = "mysql" // SQLite otherwise params.proteinFile = null; params.gffFile = null; +// Main result and log dirs +params.resultPath = "${baseDir}/results/" +params.stdoutLog = "${baseDir}/logs/out.log" +params.stderrLog = "${baseDir}/logs/err.log" + // Sizes for different programs params.chunkIPSSize = null params.chunkBlastSize = null diff --git a/scripts/fa_main.v1.pl b/scripts/fa_main.v1.pl index 66bf7c9..d30e07d 100755 --- a/scripts/fa_main.v1.pl +++ b/scripts/fa_main.v1.pl @@ -51,6 +51,7 @@ =head1 AUTHOR use FunctionalAnnotation::uploadData; use FunctionalAnnotation::getResults; use IO::Handle; +use File::Basename; use Cwd; &usage if (@ARGV < 1); @@ -160,6 +161,8 @@ sub loadDataToDB my %config = $cfg->vars(); my $logFile = $config{'stdoutLog'}; my $errFile = $config{'stderrLog'}; + + &setLogDirs( $config{'stdoutLog'}, $config{'stderrLog'} ); #open OUTPUT, '>>', $logFile or die $!; #open ERROR, '>>', $errFile or die $!; #STDOUT->fdopen( \*OUTPUT, 'w' ) or die $!; @@ -229,6 +232,27 @@ sub loadDataToDB } +sub setLogDirs { + my $outfile = shift; + my $errfile = shift; + + if ( ! -f $outfile ) { + my $outdir = dirname( $outfile ); + if ( ! -d $outdir ) { + mkdir $outdir; + } + } + + if ( ! -f $errfile ) { + my $errdir = dirname( $errfile ); + if ( ! -d $errdir ) { + mkdir $errdir; + } + } + + return 1; + +} # # Name : uploadKegg @@ -277,8 +301,13 @@ sub uploadKEGG my $cfg = new Config::Simple($configurationFile); #put config parameters into %config my %config = $cfg->vars(); - my $logFile =$config{'resultPath'}.$config{'stdoutLog'}; - my $errFile =$config{'resultPath'}.$config{'stderrLog'}; + + my $logFile = $config{'stdoutLog'}; + my $errFile = $config{'stderrLog'}; + + &setLogDirs( $config{'stdoutLog'}, $config{'stderrLog'} ); + + open OUTPUT, '>>', $logFile or die $!; open ERROR, '>>', $errFile or die $!; STDOUT->fdopen( \*OUTPUT, 'w' ) or die $!; @@ -389,8 +418,10 @@ sub launchProgram my $cfg = new Config::Simple($confFile); #put config parameters into %config my %config = $cfg->vars(); - my $logFile =$config{'resultPath'}.$config{'stdoutLog'}; - my $errFile =$config{'resultPath'}.$config{'stderrLog'}; + my $logFile = $config{'stdoutLog'}; + my $errFile = $config{'stderrLog'}; + + &setLogDirs( $config{'stdoutLog'}, $config{'stderrLog'} ); open OUTPUT, '>>', $logFile or die $!; open ERROR, '>>', $errFile or die $!; STDOUT->fdopen( \*OUTPUT, 'w' ) or die $!; @@ -501,8 +532,10 @@ sub getResults my $cfg = new Config::Simple($confFile); #put config parameters into %config my %config = $cfg->vars(); - my $logFile =$config{'resultPath'}.$config{'stdoutLog'}; - my $errFile =$config{'resultPath'}.$config{'stderrLog'}; + my $logFile = $config{'stdoutLog'}; + my $errFile = $config{'stderrLog'}; + + &setLogDirs( $config{'stdoutLog'}, $config{'stderrLog'} ); open OUTPUT, '>>', $logFile or die $!; open ERROR, '>>', $errFile or die $!; STDOUT->fdopen( \*OUTPUT, 'w' ) or die $!; diff --git a/scripts/get_gff3.pl b/scripts/get_gff3.pl index c8ba12b..1c01a07 100755 --- a/scripts/get_gff3.pl +++ b/scripts/get_gff3.pl @@ -78,6 +78,9 @@ =head1 AUTHORS my $logFile = $config{'stdoutLog'}; my $errFile = $config{'stderrLog'}; + + &setLogDirs( $config{'stdoutLog'}, $config{'stderrLog'} ); + open OUTPUT, '>>', $logFile or die $!; open ERROR, '>>', $errFile or die $!; STDOUT->fdopen( \*OUTPUT, 'w' ) or die $!; From e8877d69c009e84a71fe7db1ef6aa213901a71e2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 15:12:21 +0200 Subject: [PATCH 182/381] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 88992e6..aa02dbc 100644 --- a/README.md +++ b/README.md @@ -250,4 +250,8 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola **Despite it ran successfully, the pipeline did not process the whole dataset but just a small part of it** -*You may have run it in debug mode. Check your params file and change it to debug = 'false'* +*You may have run it in debug mode. Check your params file and change it to ```debug = 'false'```* + +**After several retries, a process stops and the pipeline finishes unsucessfully** + +*You may need to assign more time, CPU or memory to the involved process from ```nextflow.config``` file. If it keeps failing you may need to check input files (e.g., there may be sequences of anomalous length). Otherwise, submit an issue in this Github repo detailing your problem. From 3f9aec366f11e156b31c716bd027bcedb665546b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 15:12:38 +0200 Subject: [PATCH 183/381] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aa02dbc..7b5778c 100644 --- a/README.md +++ b/README.md @@ -254,4 +254,4 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola **After several retries, a process stops and the pipeline finishes unsucessfully** -*You may need to assign more time, CPU or memory to the involved process from ```nextflow.config``` file. If it keeps failing you may need to check input files (e.g., there may be sequences of anomalous length). Otherwise, submit an issue in this Github repo detailing your problem. +*You may need to assign more time, CPU or memory to the involved process from ```nextflow.config``` file. If it keeps failing you may need to check input files (e.g., there may be sequences of anomalous length). Otherwise, submit an issue in this Github repo detailing your problem.* From 2f7bccc9c725729a3ef1f8db41c97deadd6fe884 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 15:29:53 +0200 Subject: [PATCH 184/381] moving part --- scripts/fa_main.v1.pl | 22 ----------------- .../lib/FunctionalAnnotation/uploadData.pm | 24 ++++++++++++++++++- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/scripts/fa_main.v1.pl b/scripts/fa_main.v1.pl index d30e07d..352e51f 100755 --- a/scripts/fa_main.v1.pl +++ b/scripts/fa_main.v1.pl @@ -232,28 +232,6 @@ sub loadDataToDB } -sub setLogDirs { - my $outfile = shift; - my $errfile = shift; - - if ( ! -f $outfile ) { - my $outdir = dirname( $outfile ); - if ( ! -d $outdir ) { - mkdir $outdir; - } - } - - if ( ! -f $errfile ) { - my $errdir = dirname( $errfile ); - if ( ! -d $errdir ) { - mkdir $errdir; - } - } - - return 1; - -} - # # Name : uploadKegg # Description: This subroutine upload infromation from KEGG DB using BioMart modules and list of KO groups diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index df6c3e6..0621300 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -21,7 +21,7 @@ package FunctionalAnnotation::uploadData; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(readListFile uploadFastaData checkGFFData uploadGFFData uploadGoAnnotation uploadBlastResults parseBlastResults parseAnnotation updateProteinDefinition parseInterProTSV uploadInterProResults uploadGOInfo updateAnnotationStatus parseCDsearchData uploadCDsearchData); +@EXPORT = qw(readListFile uploadFastaData checkGFFData uploadGFFData uploadGoAnnotation uploadBlastResults parseBlastResults parseAnnotation updateProteinDefinition parseInterProTSV uploadInterProResults uploadGOInfo updateAnnotationStatus parseCDsearchData uploadCDsearchData setLogDirs); use FindBin qw($RealBin); use lib "$RealBin/lib"; @@ -1460,4 +1460,26 @@ sub handleValue { } +sub setLogDirs { + my $outfile = shift; + my $errfile = shift; + + if ( ! -f $outfile ) { + my $outdir = dirname( $outfile ); + if ( ! -d $outdir ) { + mkdir $outdir; + } + } + + if ( ! -f $errfile ) { + my $errdir = dirname( $errfile ); + if ( ! -d $errdir ) { + mkdir $errdir; + } + } + + return 1; + +} + 1; From 33d6b4559c11e623820e36a7c879dfda569e97ce Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 17:23:23 +0200 Subject: [PATCH 185/381] geneid options --- scripts/lib/FunctionalAnnotation/uploadData.pm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index 0621300..ca5e3da 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -312,7 +312,7 @@ while() { if ( ( $elms[$type_ix] eq 'mRNA' ) ) { # We skip transdecoder if there are CDS around - if ( $elms[$annot_ix] eq 'transdecoder' && $htypes{"CDS"} ) { + if ( ( $elms[$annot_ix] eq 'transdecoder' || $elms[$annot_ix]=~/^geneid/ ) && $htypes{"CDS"} ) { next; } @@ -422,8 +422,9 @@ sub parseGFFProduct { } } - # Allowing different types for PASA - elsif ( $prot_id eq '' && $annotation eq 'EVM_PASA' ) { + # Allowing different types for PASA and GeneId + + elsif ( $prot_id eq '' && ( $annotation eq 'EVM_PASA' || $annotation=~/^geneid/ ) ) { if ( $type eq "mRNA" ) { # Recent PASA $prot_id=$1 if $sid=~/Name\=([^\;]+)/; @@ -461,6 +462,10 @@ sub parseGFFProduct { } } + # Let's clean empty parts + my ( @clean ) = split(/\s+/, $prot_id); + $prot_id = $clean[0]; + return $prot_id; } From 8a982073aa3ad9f76d2549a8a76c0edadab2d214 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 7 Jun 2021 17:25:42 +0200 Subject: [PATCH 186/381] file basename --- scripts/fa_main.v1.pl | 1 - scripts/lib/FunctionalAnnotation/uploadData.pm | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/fa_main.v1.pl b/scripts/fa_main.v1.pl index 352e51f..a3c439a 100755 --- a/scripts/fa_main.v1.pl +++ b/scripts/fa_main.v1.pl @@ -51,7 +51,6 @@ =head1 AUTHOR use FunctionalAnnotation::uploadData; use FunctionalAnnotation::getResults; use IO::Handle; -use File::Basename; use Cwd; &usage if (@ARGV < 1); diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index ca5e3da..b8c4fb0 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -30,6 +30,7 @@ use FunctionalAnnotation::DB; use Scalar::Util qw( looks_like_number ); use Text::Trim; use Digest::SHA qw(sha1_hex); +use File::Basename; #use Bio::SeqIO; #use Bio::SearchIO; From 76fc6f019e0d5cc43abd10559083f22763f063ef Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 12:48:41 +0200 Subject: [PATCH 187/381] MySQL locking --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 7b5778c..923277b 100644 --- a/README.md +++ b/README.md @@ -255,3 +255,7 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola **After several retries, a process stops and the pipeline finishes unsucessfully** *You may need to assign more time, CPU or memory to the involved process from ```nextflow.config``` file. If it keeps failing you may need to check input files (e.g., there may be sequences of anomalous length). Otherwise, submit an issue in this Github repo detailing your problem.* + +**When using MySQL database mode with Singularity wrapper, it does not start and it complains it is locked** + +*Ensure no Singularity process is running on the contents of the selected MySQL directory. If it is not the case and it is still failing, copy the contents in another directory and run it from there instead* From 214f8d6a059fe09c8a417fa9d9166780f205414d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 15:52:01 +0200 Subject: [PATCH 188/381] Create docker.yml adding Docker Action --- .github/workflows/docker.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..f0f5583 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,35 @@ +name: Publish Docker image +on: + release: + types: [published] +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Check out the repo + uses: actions/checkout@v2 + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Log in to GitHub Docker Registry + uses: docker/login-action@v1 + with: + registry: docker.pkg.github.com + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Push to Docker Hub + uses: docker/build-push-action@v2 + with: + push: true + tags: toniher/fa-nf:${{ github.ref }} + - name: Build container image + uses: docker/build-push-action@v2 + with: + push: true + tags: docker.pkg.github.com/${{ github.repository }}/fa-nf:${{ github.ref }} From 72d379e7df2d1344816f109f1d4f3d3225f7be61 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 15:52:43 +0200 Subject: [PATCH 189/381] Update docker.yml --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index f0f5583..e725268 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -27,7 +27,7 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: toniher/fa-nf:${{ github.ref }} + tags: ${{ secrets.DOCKER_USERNAME }}/fa-nf:${{ github.ref }} - name: Build container image uses: docker/build-push-action@v2 with: From a6c42c2b9ad3564075db0e4b6d0f6b3a1b71df04 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 15:53:49 +0200 Subject: [PATCH 190/381] Update .dockerignore --- .dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.dockerignore b/.dockerignore index df86c67..4731b10 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,6 +3,7 @@ tmp/ .nextflow* work/ .git/ +.github/ Dockerfile* Singularity* dataset/ From 3b4d07aa527780bf4142cf37886992d76eb8e2c7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 15:56:43 +0200 Subject: [PATCH 191/381] Create docker-latest.yml --- .github/workflows/docker-latest.yml | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/docker-latest.yml diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml new file mode 100644 index 0000000..53bd03d --- /dev/null +++ b/.github/workflows/docker-latest.yml @@ -0,0 +1,38 @@ +name: Publish Docker image +on: + push: + branches: + # Default branches below + - main + - master +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Check out the repo + uses: actions/checkout@v2 + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Log in to GitHub Docker Registry + uses: docker/login-action@v1 + with: + registry: docker.pkg.github.com + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Push to Docker Hub + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ secrets.DOCKER_USERNAME }}/fa-nf:latest + - name: Build container image + uses: docker/build-push-action@v2 + with: + push: true + tags: docker.pkg.github.com/${{ github.repository }}/fa-nf:latest From 2d772aef86156e59b51bc5453d398816cf650c2e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 16:47:15 +0200 Subject: [PATCH 192/381] Update docker.yml --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index e725268..612a281 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,4 +1,4 @@ -name: Publish Docker image +name: Publish Docker image (release) on: release: types: [published] From d9c13b0d869f5b2499d8c14977fa095379120194 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 16:51:52 +0200 Subject: [PATCH 193/381] Update docker-latest.yml --- .github/workflows/docker-latest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml index 53bd03d..c8dd9a6 100644 --- a/.github/workflows/docker-latest.yml +++ b/.github/workflows/docker-latest.yml @@ -1,4 +1,4 @@ -name: Publish Docker image +name: Publish Docker image (latest) on: push: branches: @@ -35,4 +35,4 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: docker.pkg.github.com/${{ github.repository }}/fa-nf:latest + tags: docker.pkg.github.com/${{ github.actor }}/fa-nf/fa-nf:latest From 3686d67ca5d2b9517b98270d84e01c999f0b2bb0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 18:10:19 +0200 Subject: [PATCH 194/381] Update docker.yml --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 612a281..40bfd82 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -32,4 +32,4 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: docker.pkg.github.com/${{ github.repository }}/fa-nf:${{ github.ref }} + tags: docker.pkg.github.com/${{ github.actor }}/fa-nf/fa-nf:${{ github.ref }} From 3b742647803721354d7fb9dca878fa7969dc8eb4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 9 Jun 2021 19:31:10 +0200 Subject: [PATCH 195/381] new secret --- .github/workflows/docker-latest.yml | 4 ++-- .github/workflows/docker.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml index c8dd9a6..64e7dba 100644 --- a/.github/workflows/docker-latest.yml +++ b/.github/workflows/docker-latest.yml @@ -30,9 +30,9 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ secrets.DOCKER_USERNAME }}/fa-nf:latest + tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:latest - name: Build container image uses: docker/build-push-action@v2 with: push: true - tags: docker.pkg.github.com/${{ github.actor }}/fa-nf/fa-nf:latest + tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:latest diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 40bfd82..8a20f04 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -27,9 +27,9 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ secrets.DOCKER_USERNAME }}/fa-nf:${{ github.ref }} + tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ github.ref }} - name: Build container image uses: docker/build-push-action@v2 with: push: true - tags: docker.pkg.github.com/${{ github.actor }}/fa-nf/fa-nf:${{ github.ref }} + tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:${{ github.ref }} From 3eb46896249fb30299323fba8b84f61c02889ffe Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 10 Jun 2021 15:32:18 +0200 Subject: [PATCH 196/381] default KO params --- main.nf | 5 +++++ params.config | 1 + 2 files changed, 6 insertions(+) diff --git a/main.nf b/main.nf index 53bedcd..d848211 100644 --- a/main.nf +++ b/main.nf @@ -61,6 +61,11 @@ params.gogourl = "" params.gogohits = 30 params.blastAnnotMode = "common" // common, most, all available so far +// KEGG +params.kolist = "" +params.koprofiles = "" +params.koentries = "" + // Params for InterProScan // Temporary location for InterproScan intermediary files. This can be huge params.ipscantmp = "${baseDir}/tmp/" diff --git a/params.config b/params.config index ad6237b..ccad2c6 100644 --- a/params.config +++ b/params.config @@ -22,6 +22,7 @@ params { kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" kolist = "/nfs/db/kegg/ko_list" koprofiles = "/nfs/db/kegg/profiles" + koentries = "" gogourl = "http://gogo.test.crg.eu/api" ipscantmp = "${baseDir}/tmp/" dbEngine = "MySQL" From be6b220647a4de089afef2f48b4ba116297a7ac1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 10 Jun 2021 15:47:13 +0200 Subject: [PATCH 197/381] dummy process --- main.nf | 63 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/main.nf b/main.nf index d848211..b04e9e5 100644 --- a/main.nf +++ b/main.nf @@ -952,27 +952,51 @@ process 'blast_annotator_upload' { command } -process 'kegg_download'{ +if ( params.koentries == "" ) { - maxForks 1 + process 'kegg_download'{ - input: - file keggfile from keggfile - file config from config4perl8 - file("upload_blast") from upload_blast + maxForks 1 - output: - file("down_kegg") into (down_kegg) + input: + file keggfile from keggfile + file config from config4perl8 + + output: + file("down_kegg") into (down_kegg) - script: + script: - command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" + command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" - command + command + } + +} else { + + process 'kegg_download_dummy' { + + maxForks 1 + + input: + file keggfile from keggfile + file config from config4perl8 + + output: + file("down_kegg") into (down_kegg) + + + script: + + command = "touch down_kegg" + + command + + } } -process 'kegg_upload'{ +process 'kegg_upload' { label 'kegg_upload' @@ -982,6 +1006,8 @@ process 'kegg_upload'{ file keggfile from keggfile file config from config4perl9 file("down_kegg") from down_kegg + // We do after blast Upload + file("upload_blast") from upload_blast output: file('done') into (last_step1, last_step2) @@ -991,9 +1017,16 @@ process 'kegg_upload'{ command = checkMySQL( mysql, params.mysqllog ) - command += " \ - load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > done 2>err; \ - " + + if ( params.koentries == "" ) { + command += " \ + load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > done 2>err; \ + " + } else { + command += " \ + load_kegg_KAAS.pl -input $keggfile -entries $params.koentries -rel $params.kegg_release -conf \$config > done 2>err; \ + " + } command } From 788e692e922ad8c5d0d2088a77968e18bb28d324 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 10 Jun 2021 16:11:14 +0200 Subject: [PATCH 198/381] preupload from dir --- main.nf | 1 + scripts/load_kegg_KAAS.pl | 31 ++++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index b04e9e5..135afec 100644 --- a/main.nf +++ b/main.nf @@ -65,6 +65,7 @@ params.blastAnnotMode = "common" // common, most, all available so far params.kolist = "" params.koprofiles = "" params.koentries = "" +params.kegg_release = null // Params for InterProScan // Temporary location for InterproScan intermediary files. This can be huge diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index ee8830b..3f082c3 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -54,12 +54,13 @@ =head1 AUTHORS my $USAGE = "perl load_kegg_KAAS.pl [-i input] [-rel Kegg release] [-h help] [-conf configuration file] \n"; -my ($do_update, $show_help, $input, $directory, $kegg_release); +my ($do_update, $show_help, $input, $directory, $entries, $kegg_release); &GetOptions( 'update|u=s' => \$do_update, 'input|i=s' => \$input, 'dir|d=s' => \$directory, + 'entries|e=s' => \$entries, 'rel|r=s' => \$kegg_release, 'conf=s' =>\$confFile, 'help|h' => \$show_help @@ -74,7 +75,7 @@ =head1 AUTHORS } # If null, let's assign 0.0 -if ( $kegg_release eq 'null' ) { +if ( $kegg_release eq 'null' || $kegg_release eq '' ) { $kegg_release = &retrieve_kegg_release; @@ -144,11 +145,14 @@ =head1 AUTHORS if ( $directory ) { $pre_upload_kegg = &preUploadKeggInformation( $dbh, $directory, $config{'dbEngine'} ); +} else { + if ( $entries ) { + $pre_upload_kegg = &preUploadKeggEntries( $dbh, $entries, $config{'dbEngine'} ); + } } print STDERR "Preupload finished here ".getLoggingTime()."\n"; - #print Dumper( \%keggs ); #print Dumper( \%organisms ); #print Dumper( $pre_upload_kegg ); @@ -262,6 +266,27 @@ sub preUploadKeggInformation { } +sub preUploadKeggEntries { + + my ($dbh, $directory, $dbEngine) = @_; + + opendir(my $dh, $directory) || die "Can't open $directory: $!"; + my @files = grep { /\.txt/ && -f "$directory/$_" } readdir($dh); + closedir $dh; + + foreach my $file (@files) { + open my $fh, '<', $directory."/".$file; + my $filentry = do { local $/; <$fh> }; + close $fh; + + &parseAndUploadKEGGEntry( $filentry, $dbh, $dbEngine); + $pre_upload_kegg++; + } + + return $pre_upload_kegg; + +} + sub splitKeggFile { my $file = shift; my @strings = (); From affeb68c0aaf3548b07a2f4792ad591c97b6728c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 10 Jun 2021 17:24:06 +0200 Subject: [PATCH 199/381] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 923277b..d97205f 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The software used in this pipeline is mostly free software for academic users. F The pipeline is build on Nextflow as a woking engine, so it need to be installed first ``` - wget -qO- get.nextflow.io | bash + export NXF_VER=20.10.0; curl -s https://get.nextflow.io | bash ``` The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) From bdb6768dcd4178171c6d31337391238066fded15 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 10 Jun 2021 17:25:28 +0200 Subject: [PATCH 200/381] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 923277b..d97205f 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The software used in this pipeline is mostly free software for academic users. F The pipeline is build on Nextflow as a woking engine, so it need to be installed first ``` - wget -qO- get.nextflow.io | bash + export NXF_VER=20.10.0; curl -s https://get.nextflow.io | bash ``` The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) From 2071b1baaa360214c35304e2d8196c7ccd13c355 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Jun 2021 18:03:38 +0200 Subject: [PATCH 201/381] Fix in group concat. TODO to explore more --- scripts/lib/FunctionalAnnotation/getResults.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/scripts/lib/FunctionalAnnotation/getResults.pm index 686d39d..657cd8f 100644 --- a/scripts/lib/FunctionalAnnotation/getResults.pm +++ b/scripts/lib/FunctionalAnnotation/getResults.pm @@ -186,9 +186,10 @@ sub printDefinitionInfo my $sqlselect; if ( $dbEngine eq 'mysql' ){ - $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( distinct( d.source ) SEPARATOR \"; \" ) as src, GROUP_CONCAT( distinct( d.definition ) SEPARATOR \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; + $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( distinct( d.source ) SEPARATOR \",\" ) as src, GROUP_CONCAT( distinct( d.definition ) SEPARATOR \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; } else { - $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( distinct( d.source ), \"; \" ) as src, GROUP_CONCAT( distinct( d.definition ), \"; \" ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; + # TODO: Problem with group concat in SQLite https://stackoverflow.com/questions/49879115/sqlite-group-concat-and-distinct + $sqlSelect = "select p.protein_id, p.stable_id, GROUP_CONCAT( distinct( d.source ) ) as src, GROUP_CONCAT( distinct( d.definition ) ) as def from protein p, definition d where d.protein_id=p.protein_id and d.definition is not null and d.definition not like '' $condStat group by p.protein_id order by p.protein_id"; } From 1a305847bb5dc13b11347788fbc97ed9cce356d7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Jun 2021 18:59:12 +0200 Subject: [PATCH 202/381] Exit if file exists --- main.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.nf b/main.nf index 135afec..f646070 100644 --- a/main.nf +++ b/main.nf @@ -428,6 +428,9 @@ process initDB { if ( gffavail && gffclean ) { command += " -gff ${gff_file}" } + } else { + log.info "SQLite database ${dbFileName} exists. Exiting..." + exit 1 } } From c5bf6e47c623b91198dafbd37d432966e1d86c0c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Jun 2021 13:45:01 +0200 Subject: [PATCH 203/381] fix problems with SQLite --- scripts/lib/FunctionalAnnotation/getResults.pm | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/scripts/lib/FunctionalAnnotation/getResults.pm index 657cd8f..7704da6 100644 --- a/scripts/lib/FunctionalAnnotation/getResults.pm +++ b/scripts/lib/FunctionalAnnotation/getResults.pm @@ -264,7 +264,13 @@ sub printGoTerms { open(OUTPUT, ">$fileName")||die("Can't open $fileName for writing! $!\n"); print OUTPUT "#PROTEIN_NAME\tGO_ACC\tGO_NAME\tGO_TYPE\tGO_SOURCE\n"; - my $sqlSelect = "select protein.protein_id,protein.stable_id, go_term.go_acc, go_term.go_name, go_term.term_type, group_concat( distinct( protein_go.source ) order by protein_go.source ) as GO_source from protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id group by protein.protein_id, go_term.go_acc order by protein.stable_id;"; + my $sqlSelect; + if ( $dbEngine eq 'mysql' ){ + $sqlSelect = "select protein.protein_id,protein.stable_id, go_term.go_acc, go_term.go_name, go_term.term_type, group_concat( distinct( protein_go.source ) order by protein_go.source ) as GO_source from protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id group by protein.protein_id, go_term.go_acc order by protein.stable_id;"; + } else { + # TODO: To allow equivalent order in group_concat in SQLite + $sqlSelect = "select protein.protein_id,protein.stable_id, go_term.go_acc, go_term.go_name, go_term.term_type, group_concat( distinct( protein_go.source ) ) as GO_source from protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id group by protein.protein_id, go_term.go_acc order by protein.stable_id;"; + } $results =$dbh->select_from_table($sqlSelect); foreach my $result (@{$results}) { @@ -276,7 +282,13 @@ sub printGoTerms open(OUTPUT, ">$fileName")||die("Can't opne $fileName for writing! $!\n"); print OUTPUT "#GENE_NAME\tGO_ACC\tGO_SOURCE\n"; - my $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) order by protein_go.source ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; + my $sqlSelect; + if ( $dbEngine eq 'mysql' ){ + $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) order by protein_go.source ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; + } else { + # TODO: To allow equivalent order in group_concat in SQLite + $sqlSelect = "select gene_name, GROUP_CONCAT( distinct( go_acc ) ) as GO_acc, GROUP_CONCAT( distinct( protein_go.source ) ) as GO_source from gene,protein,protein_go,go_term where $condStat protein.protein_id=protein_go.protein_id and protein_go.go_term_id=go_term.go_term_id and protein.gene_id=gene.gene_id group by gene_name order by gene_name"; + } $results =$dbh->select_from_table($sqlSelect); From a1d516a2d48be0bf24970822c279540a001621dc Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Jun 2021 13:48:23 +0200 Subject: [PATCH 204/381] space --- scripts/lib/FunctionalAnnotation/getResults.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/scripts/lib/FunctionalAnnotation/getResults.pm index 7704da6..d41791b 100644 --- a/scripts/lib/FunctionalAnnotation/getResults.pm +++ b/scripts/lib/FunctionalAnnotation/getResults.pm @@ -147,8 +147,8 @@ sub printSummaryInfo 'protein_go'=>'GO terms', 'protein_ortholog'=>'Ortholog signatures', 'signalP'=>'SignalP signatures', - 'cd_search_hit'=>'Conserved domains(NCBI CDs)', - 'cd_search_features'=>'Conserved features(NCBI CDs)'); + 'cd_search_hit'=>'Conserved domains (NCBI CDs)', + 'cd_search_features'=>'Conserved features (NCBI CDs)'); foreach my $key(keys %dbHash) From c285df18bf614c12f9dca72a0ed850ad64526378 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Jun 2021 14:17:10 +0200 Subject: [PATCH 205/381] ensure GO --- scripts/lib/FunctionalAnnotation/uploadData.pm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/scripts/lib/FunctionalAnnotation/uploadData.pm index b8c4fb0..df918b7 100644 --- a/scripts/lib/FunctionalAnnotation/uploadData.pm +++ b/scripts/lib/FunctionalAnnotation/uploadData.pm @@ -605,8 +605,12 @@ sub uploadGoAnnotation } my @goList = &uniqueValues(\@{$annotData->{$protItem}{'annot'}}); - foreach my $goItem(@goList) - { + foreach my $goItem (@goList) { + + # Avoid dummy stuff + unless ( $goItem=~/^GO\:/ ) { + next; + } #select go_term_id: if this go is present then select id, otherwise upload it. if( lc( $engine ) eq 'sqlite') { From 33f1955a1e17073096060d7b96fd6507f2a1c836 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Jun 2021 15:02:53 +0200 Subject: [PATCH 206/381] some simplify --- scripts/load_kegg_KAAS.pl | 45 ++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 3f082c3..d650cbb 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -278,7 +278,7 @@ sub preUploadKeggEntries { open my $fh, '<', $directory."/".$file; my $filentry = do { local $/; <$fh> }; close $fh; - + &parseAndUploadKEGGEntry( $filentry, $dbh, $dbEngine); $pre_upload_kegg++; } @@ -361,6 +361,7 @@ sub uploadKeggInformation { my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); + my %goall; my @countk = keys %{$keggData}; print STDERR "* COUNT: ", $#countk + 1, "\n"; @@ -649,23 +650,33 @@ sub uploadKeggInformation { $gomap{$protein_id} = (); foreach my $goId ( @goIds ) { - #insert go term, associated with this protein into go_term table, and then into protein_go - my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; - my $sqlUpdate =""; - my $sqlInsert = ""; - if( lc( $dbEngine ) eq 'sqlite') { - $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; - } - else { - $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; + + my $goTermId; + + if ( ! $goall{$goId} ) { + + #insert go term, associated with this protein into go_term table, and then into protein_go + my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; + my $sqlUpdate =""; + my $sqlInsert = ""; + if( lc( $dbEngine ) eq 'sqlite') { + $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; + } + else { + $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; + } + $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); + #small patch for SQLite - the current insert function could not return id of the last inserted record... + if(!defined $goTermId) { + my $select = &selectLastId( $dbEngine ); + my $results = $dbh->select_from_table($select); + $goTermId=$results->[0]->{'id'}; + } + + $goall{$goId} = $goTermId; + } else { + $goTermId = $goall{$goId}; } - my $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); - #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $goTermId) { - my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $goTermId=$results->[0]->{'id'}; - } #select protein_go_id if there is one, and add 'KEGG' to the source field # TODO: Change INSERT or IGNORE here From 49a50073601648a8a2210ae580c1e4fcb7c02530 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 13 Jun 2021 16:05:05 +0200 Subject: [PATCH 207/381] proceed anyway --- main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.nf b/main.nf index f646070..df0a6bc 100644 --- a/main.nf +++ b/main.nf @@ -429,8 +429,7 @@ process initDB { command += " -gff ${gff_file}" } } else { - log.info "SQLite database ${dbFileName} exists. Exiting..." - exit 1 + log.info "SQLite database ${dbFileName} exists. We proceed anyway..." } } From 15663433c222c4231bc10ac805fdac9e5c67e5bc Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 13 Jun 2021 16:46:25 +0200 Subject: [PATCH 208/381] optimize --- scripts/load_kegg_KAAS.pl | 47 ++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index d650cbb..5e3c8b8 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -678,25 +678,46 @@ sub uploadKeggInformation { $goTermId = $goall{$goId}; } + push( @{$gomap{$protein_id}}, $goTermId ); + #select protein_go_id if there is one, and add 'KEGG' to the source field - # TODO: Change INSERT or IGNORE here - $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; - my $result =$dbh->select_from_table($sqlSelect); - if ( $#$result < 0 ) { - if( lc( $config{'dbEngine'} ) eq 'sqlite') { - $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)"; - } else { - $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId"; - } - $dbh->insert_set($sqlInsert); - } + # # TODO: Change INSERT or IGNORE here + # $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; + # my $result =$dbh->select_from_table($sqlSelect); + # if ( $#$result < 0 ) { + # if( lc( $config{'dbEngine'} ) eq 'sqlite') { + # $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)"; + # } else { + # $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId"; + # } + # $dbh->insert_set($sqlInsert); + # } }#if there was a GO records }#if defined dbLinks }#foreach protein Item - # TODO: Process gomap here + my @gobucket = (); + foreach my $protein_id ( keys %gomap ) { + foreach my $goTermId ( @{@gomap{$protein_id}} ) { + my $values = "( \"$protein_id\", \"$goTermId\", \"KEGG\" )"; + push( @gobucket, $values ); + } + + } + if ( $#gobucket >= 0 ) { + my $query; + # VALUES here used for replacement + if ( lc($dbEngine) eq 'sqlite' ) { + $query = "INSERT OR IGNORE INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ;"; + } else { + $query = "INSERT INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), go_term_id=values(go_term_id), source=values(source) ;"; + } + # print STDERR Dumper( \@gobucket ); + $dbh->multiple_query( $query, \@gobucket ); + } - print STDERR "Protein finished here ".getLoggingTime()."\n"; + print STDERR "KO finished here ".getLoggingTime()."\n"; + %gomap = (); }#foreach kegg KO item From 60c013d1fef0cbe885b77d361af4a75e3e8b8ea0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 13 Jun 2021 18:36:16 +0200 Subject: [PATCH 209/381] fix --- params.config | 2 +- scripts/load_kegg_KAAS.pl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/params.config b/params.config index ccad2c6..25af0be 100644 --- a/params.config +++ b/params.config @@ -5,7 +5,7 @@ params { gffstats = true evalue = "0.00001" blastFile = "" - diamond = false + diamond = true blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" blastAnnotMode = "common" speciesName = "P.vulgaris" diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 5e3c8b8..79a44bb 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -698,7 +698,7 @@ sub uploadKeggInformation { my @gobucket = (); foreach my $protein_id ( keys %gomap ) { - foreach my $goTermId ( @{@gomap{$protein_id}} ) { + foreach my $goTermId ( @{$gomap{$protein_id}} ) { my $values = "( \"$protein_id\", \"$goTermId\", \"KEGG\" )"; push( @gobucket, $values ); } From 8863b2b48ba95f4a615351108479b9bc4bbd7c23 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 13 Jun 2021 22:46:32 +0200 Subject: [PATCH 210/381] moving porthobucket to the end --- scripts/load_kegg_KAAS.pl | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 79a44bb..c284625 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -423,6 +423,7 @@ sub uploadKeggInformation { # We store mapping of proteins and GO for making it faster my %gomap; + my @porthobucket = (); foreach my $proteinItem ( @proteinList ) { @@ -543,7 +544,6 @@ sub uploadKeggInformation { # We do batch mode for MySQL but not sqlite # https://sqlite.org/np1queryprob.html - my @porthobucket = (); foreach my $l (@lines) { @@ -613,17 +613,17 @@ sub uploadKeggInformation { } #for each group of genes in multiply organisms - if ($#porthobucket >= 0) { - my $query; - # VALUES here used for replacement - if ( lc($dbEngine) eq 'sqlite' ) { - $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; - } else { - $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; - } - # print STDERR Dumper( \@porthobucket ); - $dbh->multiple_query( $query, \@porthobucket ); - } + # if ($#porthobucket >= 0) { + # my $query; + # # VALUES here used for replacement + # if ( lc($dbEngine) eq 'sqlite' ) { + # $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; + # } else { + # $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + # } + # # print STDERR Dumper( \@porthobucket ); + # $dbh->multiple_query( $query, \@porthobucket ); + # } print STDERR "Ortholog here ".getLoggingTime()."\n"; @@ -696,6 +696,19 @@ sub uploadKeggInformation { }#if defined dbLinks }#foreach protein Item + if ($#porthobucket >= 0) { + my $query; + # VALUES here used for replacement + if ( lc($dbEngine) eq 'sqlite' ) { + $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; + } else { + $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + } + # print STDERR Dumper( \@porthobucket ); + $dbh->multiple_query( $query, \@porthobucket ); + } + @porthobucket = (); + my @gobucket = (); foreach my $protein_id ( keys %gomap ) { foreach my $goTermId ( @{$gomap{$protein_id}} ) { From ba4bda18b4837a36e59db2300d289383c9cf176e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 13 Jun 2021 23:31:28 +0200 Subject: [PATCH 211/381] move order, before kegg --- main.nf | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index df0a6bc..214c5ab 100644 --- a/main.nf +++ b/main.nf @@ -937,10 +937,10 @@ process 'blast_annotator_upload' { input: file "blastAnnot*" from blast_annotator_results.collect() file config from config4perl7 - file upload_feat from upload_feat + file upload_kegg from upload_kegg output: - file("upload_blast") into upload_blast + file('done') into (last_step1, last_step2) script: @@ -949,7 +949,7 @@ process 'blast_annotator_upload' { command += " \ cat blastAnnot* > allBlast ; \ awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ - upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > upload_blast ; \ + upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > done ; \ " command @@ -1008,12 +1008,11 @@ process 'kegg_upload' { input: file keggfile from keggfile file config from config4perl9 + file upload_feat from upload_feat file("down_kegg") from down_kegg - // We do after blast Upload - file("upload_blast") from upload_blast output: - file('done') into (last_step1, last_step2) + file('kegg_done') into (upload_kegg) script: @@ -1027,7 +1026,7 @@ process 'kegg_upload' { " } else { command += " \ - load_kegg_KAAS.pl -input $keggfile -entries $params.koentries -rel $params.kegg_release -conf \$config > done 2>err; \ + load_kegg_KAAS.pl -input $keggfile -entries $params.koentries -rel $params.kegg_release -conf \$config > kegg_done 2>err; \ " } From 8654bb7e6112ffb8b9b742939b0ec5d5e6526b9d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Jun 2021 00:11:01 +0200 Subject: [PATCH 212/381] fix names --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 214c5ab..40951e7 100644 --- a/main.nf +++ b/main.nf @@ -1012,7 +1012,7 @@ process 'kegg_upload' { file("down_kegg") from down_kegg output: - file('kegg_done') into (upload_kegg) + file('upload_kegg') into (upload_kegg) script: @@ -1026,7 +1026,7 @@ process 'kegg_upload' { " } else { command += " \ - load_kegg_KAAS.pl -input $keggfile -entries $params.koentries -rel $params.kegg_release -conf \$config > kegg_done 2>err; \ + load_kegg_KAAS.pl -input $keggfile -entries $params.koentries -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ " } From 8004320770fe5756739b3603a13220d514fcb177 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Jun 2021 00:16:21 +0200 Subject: [PATCH 213/381] missing part --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 40951e7..049fce8 100644 --- a/main.nf +++ b/main.nf @@ -1022,7 +1022,7 @@ process 'kegg_upload' { if ( params.koentries == "" ) { command += " \ - load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > done 2>err; \ + load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ " } else { command += " \ From 0d4d737b0d701795cd8d6e10c4f9a40b9aebe1e4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Jun 2021 00:17:26 +0200 Subject: [PATCH 214/381] moving down --- main.nf | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/main.nf b/main.nf index 049fce8..2bec536 100644 --- a/main.nf +++ b/main.nf @@ -930,31 +930,6 @@ process 'CDsearch_feat_upload'{ command } -process 'blast_annotator_upload' { - - maxForks 1 - - input: - file "blastAnnot*" from blast_annotator_results.collect() - file config from config4perl7 - file upload_kegg from upload_kegg - - output: - file('done') into (last_step1, last_step2) - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat blastAnnot* > allBlast ; \ - awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ - upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > done ; \ - " - - command -} - if ( params.koentries == "" ) { process 'kegg_download'{ @@ -1033,6 +1008,31 @@ process 'kegg_upload' { command } +process 'blast_annotator_upload' { + + maxForks 1 + + input: + file "blastAnnot*" from blast_annotator_results.collect() + file config from config4perl7 + file upload_kegg from upload_kegg + + output: + file('done') into (last_step1, last_step2) + + script: + + command = checkMySQL( mysql, params.mysqllog ) + + command += " \ + cat blastAnnot* > allBlast ; \ + awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ + upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > done ; \ + " + + command +} + process 'generateResultFiles'{ input: file config from config4perl10 From d51ce5cebe608a0efaac289716ee30f776e8ab9a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Jun 2021 13:26:52 +0200 Subject: [PATCH 215/381] more bucket optimization --- scripts/load_kegg_KAAS.pl | 140 +++++++++++++++++++++++++++----------- 1 file changed, 102 insertions(+), 38 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c284625..5bc5108 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -371,6 +371,12 @@ sub uploadKeggInformation { # my $l = 0; + # Let's put buckets here + my $bucketsize = 100; + my @orthobucket = (); + my @porthobucket = (); + my @gobucket = (); + foreach my $kegg_id (sort( keys %{$keggData})) { #get KO information from server @@ -423,7 +429,7 @@ sub uploadKeggInformation { # We store mapping of proteins and GO for making it faster my %gomap; - my @porthobucket = (); + # my @porthobucket = (); foreach my $proteinItem ( @proteinList ) { @@ -452,7 +458,7 @@ sub uploadKeggInformation { # We do batch mode for MySQL but not sqlite # https://sqlite.org/np1queryprob.html - my @orthobucket = (); + # my @orthobucket = (); print "NUM LINES: $#lines\n"; @@ -510,17 +516,17 @@ sub uploadKeggInformation { } - if ($#orthobucket >= 0) { - my $query; - # VALUES here used for replacement - if ( lc($dbEngine) eq 'sqlite' ) { - $query = "INSERT OR IGNORE INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ;"; - } else { - $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; - } - # print STDERR Dumper( \@orthobucket ); - $dbh->multiple_query( $query, \@orthobucket ); - } + # if ($#orthobucket >= 0) { + # my $query; + # # VALUES here used for replacement + # if ( lc($dbEngine) eq 'sqlite' ) { + # $query = "INSERT OR IGNORE INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ;"; + # } else { + # $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; + # } + # # print STDERR Dumper( \@orthobucket ); + # $dbh->multiple_query( $query, \@orthobucket ); + # } print "* NUM LINES ORTHO: $#lines\n"; @@ -696,20 +702,20 @@ sub uploadKeggInformation { }#if defined dbLinks }#foreach protein Item - if ($#porthobucket >= 0) { - my $query; - # VALUES here used for replacement - if ( lc($dbEngine) eq 'sqlite' ) { - $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; - } else { - $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; - } - # print STDERR Dumper( \@porthobucket ); - $dbh->multiple_query( $query, \@porthobucket ); - } - @porthobucket = (); - - my @gobucket = (); + # if ($#porthobucket >= 0) { + # my $query; + # # VALUES here used for replacement + # if ( lc($dbEngine) eq 'sqlite' ) { + # $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; + # } else { + # $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + # } + # # print STDERR Dumper( \@porthobucket ); + # $dbh->multiple_query( $query, \@porthobucket ); + # } + # @porthobucket = (); + + # my @gobucket = (); foreach my $protein_id ( keys %gomap ) { foreach my $goTermId ( @{$gomap{$protein_id}} ) { my $values = "( \"$protein_id\", \"$goTermId\", \"KEGG\" )"; @@ -717,21 +723,25 @@ sub uploadKeggInformation { } } - if ( $#gobucket >= 0 ) { - my $query; - # VALUES here used for replacement - if ( lc($dbEngine) eq 'sqlite' ) { - $query = "INSERT OR IGNORE INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ;"; - } else { - $query = "INSERT INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), go_term_id=values(go_term_id), source=values(source) ;"; - } - # print STDERR Dumper( \@gobucket ); - $dbh->multiple_query( $query, \@gobucket ); - } + # if ( $#gobucket >= 0 ) { + # my $query; + # # VALUES here used for replacement + # if ( lc($dbEngine) eq 'sqlite' ) { + # $query = "INSERT OR IGNORE INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ;"; + # } else { + # $query = "INSERT INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), go_term_id=values(go_term_id), source=values(source) ;"; + # } + # # print STDERR Dumper( \@gobucket ); + # $dbh->multiple_query( $query, \@gobucket ); + # } print STDERR "KO finished here ".getLoggingTime()."\n"; %gomap = (); + @orthobucket = &processBucket( $dbh, \@orthobucket, $bucketsize, "ortho "); + @porthobucket = &processBucket( $dbh, \@porthobucket, $bucketsize, "portho "); + @gobucket = &processBucket( $dbh, \@gobucket, $bucketsize, "go "); + }#foreach kegg KO item #update protein definition for KEGG source @@ -739,10 +749,64 @@ sub uploadKeggInformation { #print STDERR Dumper( \%protDefinitionData ); # Toniher: We do not include protein Definition here # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + + @orthobucket = &processBucket( $dbh, \@orthobucket, 0, "ortho "); + @porthobucket = &processBucket( $dbh, \@porthobucket, 0, "portho "); + @gobucket = &processBucket( $dbh, \@gobucket, 0, "go "); + print STDERR "Finished here ".getLoggingTime()."\n"; }#sub +sub processBucket { + + my $dbh = shift; + my $bucket = shift; + my $size = shift; + my $type = shift; + + if ( $#bucket >= $size ) { + + my $query; + if ( $type eq 'go' ) { + + # VALUES here used for replacement + if ( lc($dbEngine) eq 'sqlite' ) { + $query = "INSERT OR IGNORE INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ;"; + } else { + $query = "INSERT INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), go_term_id=values(go_term_id), source=values(source) ;"; + } + } + if ( $type eq 'portho' ) { + + if ( lc($dbEngine) eq 'sqlite' ) { + $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; + } else { + $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; + } + } + + if ( $type eq 'ortho' ) { + + if ( lc($dbEngine) eq 'sqlite' ) { + $query = "INSERT OR IGNORE INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ;"; + } else { + $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; + } + } + + $dbh->multiple_query( $query, $bucket ); + + # Return empty bucket + return (); + + } else { + + # Continue with the bucket + return @{$bucket}; + } + +} sub parseKEGGDBLinks { From 290e9238684a7307670951a7779edfbb3127a3b5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Jun 2021 13:45:40 +0200 Subject: [PATCH 216/381] dbEngine --- scripts/load_kegg_KAAS.pl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 5bc5108..1b4ff8d 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -738,9 +738,9 @@ sub uploadKeggInformation { print STDERR "KO finished here ".getLoggingTime()."\n"; %gomap = (); - @orthobucket = &processBucket( $dbh, \@orthobucket, $bucketsize, "ortho "); - @porthobucket = &processBucket( $dbh, \@porthobucket, $bucketsize, "portho "); - @gobucket = &processBucket( $dbh, \@gobucket, $bucketsize, "go "); + @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, $bucketsize, "ortho "); + @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho "); + @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go "); }#foreach kegg KO item @@ -750,9 +750,9 @@ sub uploadKeggInformation { # Toniher: We do not include protein Definition here # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); - @orthobucket = &processBucket( $dbh, \@orthobucket, 0, "ortho "); - @porthobucket = &processBucket( $dbh, \@porthobucket, 0, "portho "); - @gobucket = &processBucket( $dbh, \@gobucket, 0, "go "); + @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, 0, "ortho "); + @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, 0, "portho "); + @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, 0, "go "); print STDERR "Finished here ".getLoggingTime()."\n"; @@ -761,6 +761,7 @@ sub uploadKeggInformation { sub processBucket { my $dbh = shift; + my $dbEngine = shift; my $bucket = shift; my $size = shift; my $type = shift; From 28a618112fbe821b3956a64d21a9e060b3e9ffdd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Jun 2021 15:19:40 +0200 Subject: [PATCH 217/381] fix array ref length --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 1b4ff8d..a50ebea 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -766,7 +766,7 @@ sub processBucket { my $size = shift; my $type = shift; - if ( $#bucket >= $size ) { + if ( $#{$bucket} >= $size ) { my $query; if ( $type eq 'go' ) { From 63dd1b419df24d29cf7d1c04886a601c2cffa751 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 10:01:22 +0200 Subject: [PATCH 218/381] recover one orthobucket --- scripts/load_kegg_KAAS.pl | 75 ++------------------------------------- 1 file changed, 3 insertions(+), 72 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index a50ebea..450f5ab 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -373,7 +373,6 @@ sub uploadKeggInformation { # Let's put buckets here my $bucketsize = 100; - my @orthobucket = (); my @porthobucket = (); my @gobucket = (); @@ -458,7 +457,7 @@ sub uploadKeggInformation { # We do batch mode for MySQL but not sqlite # https://sqlite.org/np1queryprob.html - # my @orthobucket = (); + my @orthobucket = (); print "NUM LINES: $#lines\n"; @@ -486,47 +485,13 @@ sub uploadKeggInformation { #my $organism_id= organism_table($lcode,$dbEngine,$dbh); my $organism_id= $codesOrg->{$lcode}; - #populate ortholog table - #check if ortholog already exists (yes && do_update => update record; no => insert new ortholog) - # my $ortholog_sql_select = qq{ SELECT ortholog_id FROM ortholog WHERE name=\"$gene_id\" }; - # print STDERR $ortholog_sql_select, "\n"; - # my $ortholog_sql_update = qq{ UPDATE ortholog SET name=\"$gene_id\",organism_id=\"$organism_id\",db_id=\"$kegg_id\",db_name=\"KEGG\";}; - # print STDERR $ortholog_sql_update, "\n"; - - # my $ortholog_sql_insert = ""; - #if( lc( $dbEngine ) eq 'sqlite') { - # $ortholog_sql_insert = qq{ INSERT INTO ortholog(ortholog_id, name, organism_id, db_id, db_name ) VALUES(NULL,\"$gene_id\",\"$organism_id\",\"$kegg_id\",\"KEGG\")}; - - # print STDERR $ortholog_sql_insert, "\n"; - # my $ortholog_id = $dbh->select_update_insert("ortholog_id", $ortholog_sql_select, $ortholog_sql_update, $ortholog_sql_insert, $do_update); - - # Not needed for next step - #small patch for SQLite - the current insert function could not return id of the last inserted record... - # if(!defined $ortholog_id) { - # my $select = &selectLastId( $dbEngine ); - # my $results = $dbh->select_from_table($select); - # $ortholog_id=$results->[0]->{'id'}; - # } - - #} else { - # Handling stuff for SQL my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; push( @orthobucket, $values ); - #} } - # if ($#orthobucket >= 0) { - # my $query; - # # VALUES here used for replacement - # if ( lc($dbEngine) eq 'sqlite' ) { - # $query = "INSERT OR IGNORE INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ;"; - # } else { - # $query = "INSERT INTO ortholog (name, organism_id, db_id, db_name) VALUES #VALUES# ON DUPLICATE KEY UPDATE name = values(name), organism_id = values(organism_id), db_id = values(db_id) ;"; - # } - # # print STDERR Dumper( \@orthobucket ); - # $dbh->multiple_query( $query, \@orthobucket ); - # } + @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, 0, "ortho "); + print "* NUM LINES ORTHO: $#lines\n"; @@ -606,46 +571,14 @@ sub uploadKeggInformation { exit; } - #my $prot_ortholog_sql_select = qq{ SELECT protein_ortholog_id FROM protein_ortholog WHERE protein_id=\"$protein_id\" AND ortholog_id=\"$ortholog_id\" }; - #my $prot_ortholog_sql_update = qq{ UPDATE protein_ortholog SET protein_id=\"$protein_id\",ortholog_id=\"$ortholog_id\",type=\"$type\",kegg_group_id=\"$kegg_group_id\";}; - #my $prot_ortholog_sql_insert =""; - #if( lc( $config{'dbEngine'} ) eq 'sqlite') { - # $prot_ortholog_sql_insert = qq{ INSERT INTO protein_ortholog (protein_ortholog_id, protein_id,ortholog_id,type,kegg_group_id) VALUES(NULL,\"$protein_id\",\"$ortholog_id\",\"$type\",\"$kegg_group_id\");}; - # my $protein_ortholog_id = $dbh->select_update_insert("protein_ortholog_id", $prot_ortholog_sql_select, $prot_ortholog_sql_update, $prot_ortholog_sql_insert, $do_update); - #} else { my $values = "( \"$protein_id\", \"$ortholog_id\", \"$type\", \"$kegg_group_id\" )"; push( @porthobucket, $values ); - #} } #for each group of genes in multiply organisms - # if ($#porthobucket >= 0) { - # my $query; - # # VALUES here used for replacement - # if ( lc($dbEngine) eq 'sqlite' ) { - # $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; - # } else { - # $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; - # } - # # print STDERR Dumper( \@porthobucket ); - # $dbh->multiple_query( $query, \@porthobucket ); - # } print STDERR "Ortholog here ".getLoggingTime()."\n"; - # print "* NUM LINES PORTHO: $#lines\n"; - - # Toniher. This below is not necessary since it is sent to updateProteinDefinition - #update definition field for proteins associated to this KO group - #if($hash->{'DEFINITION'} && $hash->{'DEFINITION'} ne '') { - # push(@{$protDefinitionData{$protein_id}{'annot'}},$hash->{'DEFINITION'}); - #} - - #$protein_definition .='KEGG:'.$hash->{'DEFINITION'}.';'; - #$sqlUpdate = "UPDATE protein set definition='$protein_definition' where protein_id=$protein_id"; - # print "SQL_CODE:$sqlUpdate\n" ; - #$dbh->update_set($sqlUpdate); - # add GO terms info into go_term and protein_go table. # TODO Consider in the future other annotations, such as COG if(defined $hash->{'DBLINKS'}) { @@ -738,7 +671,6 @@ sub uploadKeggInformation { print STDERR "KO finished here ".getLoggingTime()."\n"; %gomap = (); - @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, $bucketsize, "ortho "); @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho "); @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go "); @@ -750,7 +682,6 @@ sub uploadKeggInformation { # Toniher: We do not include protein Definition here # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); - @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, 0, "ortho "); @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, 0, "portho "); @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, 0, "go "); From 36197008afe59cf7433ad50bb35745133c415236 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 10:23:20 +0200 Subject: [PATCH 219/381] clean comments --- scripts/load_kegg_KAAS.pl | 47 --------------------------------------- 1 file changed, 47 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 450f5ab..c578b62 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -366,11 +366,6 @@ sub uploadKeggInformation { my @countk = keys %{$keggData}; print STDERR "* COUNT: ", $#countk + 1, "\n"; - # Temporary limit - # my $lim = 3; - - # my $l = 0; - # Let's put buckets here my $bucketsize = 100; my @porthobucket = (); @@ -379,11 +374,6 @@ sub uploadKeggInformation { foreach my $kegg_id (sort( keys %{$keggData})) { #get KO information from server - # $l++; - # if ( $l > $lim ) { - # last; - #} - my $hash; my $kegg_group_id; if ( $pre_upload_kegg > 0 ) { @@ -618,36 +608,10 @@ sub uploadKeggInformation { } push( @{$gomap{$protein_id}}, $goTermId ); - - #select protein_go_id if there is one, and add 'KEGG' to the source field - # # TODO: Change INSERT or IGNORE here - # $sqlSelect = "SELECT protein_go_id, source FROM protein_go where protein_id = $protein_id and go_term_id=$goTermId and source='KEGG'"; - # my $result =$dbh->select_from_table($sqlSelect); - # if ( $#$result < 0 ) { - # if( lc( $config{'dbEngine'} ) eq 'sqlite') { - # $sqlInsert = "INSERT INTO protein_go (protein_go_id,source, protein_id, go_term_id) VALUES (NULL,'KEGG',$protein_id,$goTermId)"; - # } else { - # $sqlInsert = "INSERT INTO protein_go SET source='KEGG', protein_id=$protein_id, go_term_id = $goTermId"; - # } - # $dbh->insert_set($sqlInsert); - # } }#if there was a GO records }#if defined dbLinks }#foreach protein Item - # if ($#porthobucket >= 0) { - # my $query; - # # VALUES here used for replacement - # if ( lc($dbEngine) eq 'sqlite' ) { - # $query = "INSERT OR IGNORE INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ;"; - # } else { - # $query = "INSERT INTO protein_ortholog (protein_id, ortholog_id, type, kegg_group_id) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), ortholog_id=values(ortholog_id), type=values(ortholog_id), kegg_group_id=values(kegg_group_id) ;"; - # } - # # print STDERR Dumper( \@porthobucket ); - # $dbh->multiple_query( $query, \@porthobucket ); - # } - # @porthobucket = (); - # my @gobucket = (); foreach my $protein_id ( keys %gomap ) { foreach my $goTermId ( @{$gomap{$protein_id}} ) { @@ -656,17 +620,6 @@ sub uploadKeggInformation { } } - # if ( $#gobucket >= 0 ) { - # my $query; - # # VALUES here used for replacement - # if ( lc($dbEngine) eq 'sqlite' ) { - # $query = "INSERT OR IGNORE INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ;"; - # } else { - # $query = "INSERT INTO protein_go (protein_id, go_term_id, source) VALUES #VALUES# ON DUPLICATE KEY UPDATE protein_id=values(protein_id), go_term_id=values(go_term_id), source=values(source) ;"; - # } - # # print STDERR Dumper( \@gobucket ); - # $dbh->multiple_query( $query, \@gobucket ); - # } print STDERR "KO finished here ".getLoggingTime()."\n"; %gomap = (); From b7d5ddc5ffb07b6947317c28bcb04a999a27f341 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 10:24:54 +0200 Subject: [PATCH 220/381] clean --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c578b62..abb8f09 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -160,6 +160,8 @@ =head1 AUTHORS &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); +print STDERR "Finished here ".getLoggingTime()."\n"; + sub retrieve_kegg_release { my $value = 0.0; @@ -638,8 +640,6 @@ sub uploadKeggInformation { @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, 0, "portho "); @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, 0, "go "); - print STDERR "Finished here ".getLoggingTime()."\n"; - }#sub sub processBucket { From 81b6109deb8da2c2712b0e277e3de9bcccb3a8bf Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 10:30:20 +0200 Subject: [PATCH 221/381] ortho --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index abb8f09..a8a2ed6 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -556,7 +556,7 @@ sub uploadKeggInformation { #my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; my $ortholog_id = $orthoidlist->{$organism_id}->{$name}; - # print STDERR "* $ortholog_id\n"; + print STDERR "* ORTHO_ID: $ortholog_id\n"; if ( ! $ortholog_id ) { print STDERR "Major error here\n"; From 69125d6fc5126fdd15fe27c89543ff0fb4cc1bb5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 11:57:42 +0200 Subject: [PATCH 222/381] refactor --- scripts/load_kegg_KAAS.pl | 186 +++++++++++++++++++++++--------------- 1 file changed, 114 insertions(+), 72 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index a8a2ed6..57b68b8 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -158,7 +158,8 @@ =head1 AUTHORS #print Dumper( $pre_upload_kegg ); #exit; -&uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); +&uploadKOInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); +&uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'} ); print STDERR "Finished here ".getLoggingTime()."\n"; @@ -356,10 +357,111 @@ sub uploadSingleKEGGId { } -sub uploadKeggInformation { - my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; +sub uploadKOInformation { + + my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; + + print STDERR "KO entries: ".$pre_upload_kegg."\n"; + + my($sqlSelect, $sqlInsert,$sqlUpdate); + + my @countk = keys %{$keggData}; + print STDERR "* COUNT: ", $#countk + 1, "\n"; + + # Let's put buckets here + my $bucketsize = 100; + my @orthobucket = (); + + foreach my $kegg_id (sort( keys %{$keggData})) { + #get KO information from server + + my $hash; + my $kegg_group_id; + if ( $pre_upload_kegg > 0 ) { + + print STDERR "\n* Entering $kegg_id\n"; + ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); + + #print STDERR "Prefilled\n"; + #print STDERR Dumper( $hash ); + #print STDERR Dumper( $kegg_group_id ); + + } else { + + $hash = parse_kegg_record($kegg_id); + + #upload information about KO group into DB if its absent in DB + my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); + foreach my $absItem(@absentList) { + if(!defined $hash->{$absItem}) { + $hash->{$absItem}=""; + } + } + + $kegg_group_id = &uploadSingleKEGGId($kegg_id, $hash, $dbh, $dbEngine); + } + + if(!defined $kegg_group_id) { + print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; + next; # Skip to another entry + } + + #add orthologus information from the list of species for proteins associated to this KO group + my $gene_string = ""; + if ( $hash->{'GENES'} ) { + $gene_string = $hash->{'GENES'}; + } + + # print STDERR $proteinItem, "\t", $gene_string, "\n"; + # print STDERR "gene string: $gene_string\n"; + my @lines=split/\,/,$gene_string; + + # We do batch mode for MySQL but not sqlite + # https://sqlite.org/np1queryprob.html - print STDERR "KO entries: ".$pre_upload_kegg."\n"; + print "NUM LINES: $#lines\n"; + + foreach my $l (@lines) { + + # insert each ortholog + my ($code,$gene_id)=split/\:/,$l; + $gene_id = trim($gene_id); + my $lcode=lc(trim($code)); + + my $name; + # Gene id can be too long + my (@names) = split(/ /, $gene_id); + if ( $#names > $limnames ) { + $name = join(" ", @names[0..$limnames]); + } else { + $name = join(" ", @names); + } + #print STDERR "* ", $lcode, "\n"; + #print STDERR "- ", Dumper( $codesOrg ); + # next if ortholog is not in the list of species to analyze + next if !$codesOrg->{$lcode}; + #print STDERR "Passed\n"; + #get organism_id from DB + #my $organism_id= organism_table($lcode,$dbEngine,$dbh); + my $organism_id= $codesOrg->{$lcode}; + + my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; + push( @orthobucket, $values ); + + } + + @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, $bucketsize, "ortho" ); + + + } + + @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, 0, "ortho" ); + + +} + +sub uploadKeggInformation { + my($dbh, $keggData, $codesOrg, $dbEngine)=@_; my($sqlSelect, $sqlInsert,$sqlUpdate); my %protDefinitionData=(); @@ -378,29 +480,8 @@ sub uploadKeggInformation { my $hash; my $kegg_group_id; - if ( $pre_upload_kegg > 0 ) { - - print STDERR "\n* Entering $kegg_id\n"; - ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); - - #print STDERR "Prefilled\n"; - #print STDERR Dumper( $hash ); - #print STDERR Dumper( $kegg_group_id ); - - } else { - - $hash = parse_kegg_record($kegg_id); - - #upload information about KO group into DB if its absent in DB - my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); - foreach my $absItem(@absentList) { - if(!defined $hash->{$absItem}) { - $hash->{$absItem}=""; - } - } - - $kegg_group_id = &uploadSingleKEGGId($kegg_id, $hash, $dbh, $dbEngine); - } + print STDERR "\n* Entering $kegg_id\n"; + ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); # print Dumper($hash)."\n"; die; @@ -436,6 +517,8 @@ sub uploadKeggInformation { my $protein_id = $res->[0]->{'protein_id'}; my $protein_definition = $res->[0]->{'definition'}; + my $is_cluster; + #add orthologus information from the list of species for proteins associated to this KO group my $gene_string = ""; if ( $hash->{'GENES'} ) { @@ -445,47 +528,6 @@ sub uploadKeggInformation { # print STDERR $proteinItem, "\t", $gene_string, "\n"; # print STDERR "gene string: $gene_string\n"; my @lines=split/\,/,$gene_string; - my $is_cluster; - - # We do batch mode for MySQL but not sqlite - # https://sqlite.org/np1queryprob.html - my @orthobucket = (); - - print "NUM LINES: $#lines\n"; - - foreach my $l (@lines) { - - # insert each ortholog - my ($code,$gene_id)=split/\:/,$l; - $gene_id = trim($gene_id); - my $lcode=lc(trim($code)); - - my $name; - # Gene id can be too long - my (@names) = split(/ /, $gene_id); - if ( $#names > $limnames ) { - $name = join(" ", @names[0..$limnames]); - } else { - $name = join(" ", @names); - } - #print STDERR "* ", $lcode, "\n"; - #print STDERR "- ", Dumper( $codesOrg ); - # next if ortholog is not in the list of species to analyze - next if !$codesOrg->{$lcode}; - #print STDERR "Passed\n"; - #get organism_id from DB - #my $organism_id= organism_table($lcode,$dbEngine,$dbh); - my $organism_id= $codesOrg->{$lcode}; - - my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; - push( @orthobucket, $values ); - - } - - @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, 0, "ortho "); - - - print "* NUM LINES ORTHO: $#lines\n"; # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID my ($orthoidlist) = {}; @@ -626,8 +668,8 @@ sub uploadKeggInformation { print STDERR "KO finished here ".getLoggingTime()."\n"; %gomap = (); - @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho "); - @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go "); + @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho" ); + @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go" ); }#foreach kegg KO item @@ -637,8 +679,8 @@ sub uploadKeggInformation { # Toniher: We do not include protein Definition here # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); - @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, 0, "portho "); - @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, 0, "go "); + @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, 0, "portho" ); + @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, 0, "go" ); }#sub From 93e1cd2dbde12065d00f0b5c33b720c6ae815a90 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 11:58:12 +0200 Subject: [PATCH 223/381] log --- scripts/load_kegg_KAAS.pl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 57b68b8..d068831 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -159,6 +159,9 @@ =head1 AUTHORS #exit; &uploadKOInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'}, $pre_upload_kegg ); + +print STDERR "Second gone here ".getLoggingTime()."\n"; + &uploadKeggInformation( $dbh, \%keggs, \%organisms, $config{'dbEngine'} ); print STDERR "Finished here ".getLoggingTime()."\n"; From ba31ed34f0446e532f61406629dda20f6611fccd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 12:24:44 +0200 Subject: [PATCH 224/381] search first --- scripts/load_kegg_KAAS.pl | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index d068831..3f8096e 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -506,6 +506,22 @@ sub uploadKeggInformation { my %gomap; # my @porthobucket = (); + # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID + my ($orthoidlist) = {}; + my $results_ortho = $dbh->select_from_table("SELECT ortholog_id, name, organism_id from `ortholog` where db_id = \"$kegg_id\" ;"); + + foreach my $result ( @{$results_ortho} ) { + my $org = $result->{"organism_id"}; + my $name = $result->{"name"}; + my $oid = $result->{"ortholog_id"}; + + if ( ! $orthoidlist->{$org} ) { + $orthoidlist->{$org} = {}; + } + + $orthoidlist->{$org}->{$name} = $oid; + } + foreach my $proteinItem ( @proteinList ) { #select protein_id infor (because items are stable_ids in protein table) @@ -532,24 +548,6 @@ sub uploadKeggInformation { # print STDERR "gene string: $gene_string\n"; my @lines=split/\,/,$gene_string; - # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID - my ($orthoidlist) = {}; - my $results_ortho = $dbh->select_from_table("SELECT ortholog_id, name, organism_id from `ortholog` where db_id = \"$kegg_id\" ;"); - - foreach my $result ( @{$results_ortho} ) { - my $org = $result->{"organism_id"}; - my $name = $result->{"name"}; - my $oid = $result->{"ortholog_id"}; - - if ( ! $orthoidlist->{$org} ) { - $orthoidlist->{$org} = {}; - } - - $orthoidlist->{$org}->{$name} = $oid; - } - - # print STDERR Dumper( $orthoidlist ); - # We do batch mode for MySQL but not sqlite # https://sqlite.org/np1queryprob.html From 7c741b9261ea29616341994fbca7adcae6db09b5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 16:49:23 +0200 Subject: [PATCH 225/381] remove dependency blast --- main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/main.nf b/main.nf index 2bec536..e01e8b9 100644 --- a/main.nf +++ b/main.nf @@ -813,7 +813,6 @@ process 'signalP_upload'{ input: file "out_signalp*" from signalP_result1.collect() file config from config4perl2 - file def_done from definition_passed output: file("upload_signalp") into upload_signalp From 164eda5ef693d0a25b45a8aa65d00fd8d10dae45 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Jun 2021 20:35:13 +0200 Subject: [PATCH 226/381] limnames fix --- scripts/load_kegg_KAAS.pl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 3f8096e..c62317e 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -371,6 +371,9 @@ sub uploadKOInformation { my @countk = keys %{$keggData}; print STDERR "* COUNT: ", $#countk + 1, "\n"; + # Number limit names + my $limnames = 9; + # Let's put buckets here my $bucketsize = 100; my @orthobucket = (); From 766a280c402b12763ed424c998dd7bb400c5f8f3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 16 Jun 2021 11:45:54 +0200 Subject: [PATCH 227/381] changed bucket size if any effect --- scripts/load_kegg_KAAS.pl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c62317e..c1f1f48 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -373,9 +373,9 @@ sub uploadKOInformation { # Number limit names my $limnames = 9; - + # Let's put buckets here - my $bucketsize = 100; + my $bucketsize = 1000; my @orthobucket = (); foreach my $kegg_id (sort( keys %{$keggData})) { @@ -477,7 +477,7 @@ sub uploadKeggInformation { print STDERR "* COUNT: ", $#countk + 1, "\n"; # Let's put buckets here - my $bucketsize = 100; + my $bucketsize = 1000; my @porthobucket = (); my @gobucket = (); @@ -675,6 +675,8 @@ sub uploadKeggInformation { @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho" ); @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go" ); + print STDERR "KO upload finished here ".getLoggingTime()."\n"; + }#foreach kegg KO item #update protein definition for KEGG source @@ -728,6 +730,7 @@ sub processBucket { $dbh->multiple_query( $query, $bucket ); + print STDERR "Done here $type\n"; # Return empty bucket return (); From b3f02a1a5f292a5a4776c07d77ba7d46d4928d62 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 16 Jun 2021 12:03:12 +0200 Subject: [PATCH 228/381] logging time --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index c1f1f48..dd511ce 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -730,7 +730,7 @@ sub processBucket { $dbh->multiple_query( $query, $bucket ); - print STDERR "Done here $type\n"; + print STDERR "Done here $type ".getLoggingTime()."\n"; # Return empty bucket return (); From 7ae280a35ed4d1083ea4d6fd1d28914d47b1b08f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 16 Jun 2021 16:06:29 +0200 Subject: [PATCH 229/381] last bucket size --- scripts/load_kegg_KAAS.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index dd511ce..f4b2ff6 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -375,7 +375,7 @@ sub uploadKOInformation { my $limnames = 9; # Let's put buckets here - my $bucketsize = 1000; + my $bucketsize = 10000; my @orthobucket = (); foreach my $kegg_id (sort( keys %{$keggData})) { @@ -477,7 +477,7 @@ sub uploadKeggInformation { print STDERR "* COUNT: ", $#countk + 1, "\n"; # Let's put buckets here - my $bucketsize = 1000; + my $bucketsize = 10000; my @porthobucket = (); my @gobucket = (); From 8ce133ae3128ae38378f2458b9404f2a4cdf2441 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 16 Jun 2021 16:50:18 +0200 Subject: [PATCH 230/381] kegg window --- scripts/load_kegg_KAAS.pl | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index f4b2ff6..3042b7e 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -478,9 +478,14 @@ sub uploadKeggInformation { # Let's put buckets here my $bucketsize = 10000; + my $winsize = 100; my @porthobucket = (); my @gobucket = (); + # RETRIEVE By windows + my ( @all_kegg ) = sort( keys %{$keggData} ); + my ( @keg_windows ) = &prepareWinArray( \@all_kegg, $winsize ); + foreach my $kegg_id (sort( keys %{$keggData})) { #get KO information from server @@ -742,6 +747,35 @@ sub processBucket { } +sub prepareWinArray { + + my $array = shift; + my $winsize = shift; + my @final; + + my $i = 0; + my $tmparr; + + foreach my $el ( @{$array} ) { + + push( @{$tmparr}, $el ); + + if ( $i >= $winsize ) { + push( @final, $tmparr ); + @{$tmparr} = (); + $i = 0; + } else { + $i++; + } + } + + if ( $#{$tmparr} >= 0 ) { + push( @final, $tmparr ); + } + + return @final; +} + sub parseKEGGDBLinks { my $dbLinks = shift; @@ -792,6 +826,36 @@ sub retrieve_kegg_record { return (\%hash, $kegg_group_id); } +# subroutine to retrieve KEGG record from DB +sub retrieve_kegg_window { + + my $kegg_window = shift; + my %hash; + + if ( $#{$kegg_window} >= 0 ) { + + # TODO: Mapping needed here + my $sqlSelect = "SELECT * from kegg_group where db_id = \"$kegg_id\" limit 1"; + my $results =$dbh->select_from_table($sqlSelect); + + my $kegg_group_id; + + if ( $#{$results} >= 0 ) { + $kegg_group_id = $results->[0]->{"kegg_group_id"}; + + foreach my $key ( keys %{$results->[0]} ) { + my $finalkey = uc($key); + $finalkey=~s/\_//g; + $hash{$finalkey} = $results->[0]->{$key}; + } + + } + + } + + return (\%hash, $kegg_group_id); +} + # subroutine to parse KEGG record and put its elements into a hash sub parse_kegg_record { my $kegg_id=shift; From a828fea21da9e7c06a5580402e22ac39ae7ac5df Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 16 Jun 2021 18:29:08 +0200 Subject: [PATCH 231/381] try to check improvement --- scripts/load_kegg_KAAS.pl | 377 ++++++++++++++++++++------------------ 1 file changed, 195 insertions(+), 182 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 3042b7e..977abf4 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -484,211 +484,216 @@ sub uploadKeggInformation { # RETRIEVE By windows my ( @all_kegg ) = sort( keys %{$keggData} ); - my ( @keg_windows ) = &prepareWinArray( \@all_kegg, $winsize ); + my ( @kegg_windows ) = &prepareWinArray( \@all_kegg, $winsize ); - foreach my $kegg_id (sort( keys %{$keggData})) { - #get KO information from server + foreach my $kw ( @kegg_windows ) { - my $hash; - my $kegg_group_id; - print STDERR "\n* Entering $kegg_id\n"; - ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); - - # print Dumper($hash)."\n"; die; - - - if(!defined $kegg_group_id) { - print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; - next; # Skip to another entry - } + my $hash = retrieve_kegg_window( $dbh, $kw ); - my @proteinList = @{$keggData->{$kegg_id}}; - my $numberProteinsInGroup=scalar @proteinList; + foreach my $kegg_id (sort( keys %{$hash} ) ) { + #get KO information from server - print "* NUM PROT: $#proteinList\n"; + my $hash; + my $kegg_group_id = $hash->{$kegg_id}->{"KEGGGROUPID"}; + print STDERR "\n* Entering $kegg_id\n"; + #( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); - # Number limit names - my $limnames = 9; - - # We store mapping of proteins and GO for making it faster - my %gomap; - # my @porthobucket = (); + # print Dumper($hash)."\n"; die; - # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID - my ($orthoidlist) = {}; - my $results_ortho = $dbh->select_from_table("SELECT ortholog_id, name, organism_id from `ortholog` where db_id = \"$kegg_id\" ;"); - foreach my $result ( @{$results_ortho} ) { - my $org = $result->{"organism_id"}; - my $name = $result->{"name"}; - my $oid = $result->{"ortholog_id"}; - - if ( ! $orthoidlist->{$org} ) { - $orthoidlist->{$org} = {}; + if(!defined $kegg_group_id) { + print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; + next; # Skip to another entry } - $orthoidlist->{$org}->{$name} = $oid; - } + my @proteinList = @{$keggData->{$kegg_id}}; + my $numberProteinsInGroup=scalar @proteinList; - foreach my $proteinItem ( @proteinList ) { + print "* NUM PROT: $#proteinList\n"; - #select protein_id infor (because items are stable_ids in protein table) - my $protein_sql_select= qq{ SELECT d.protein_id,d.definition d FROM definition d, protein p WHERE p.protein_id=d.protein_id and p.stable_id=\"$proteinItem\"}; - my $res = $dbh->select_from_table($protein_sql_select); + # Number limit names + my $limnames = 9; - # If no content, next. Cases of partial tests. - if ( $#{$res} < 0 ){ - next; - } + # We store mapping of proteins and GO for making it faster + my %gomap; + # my @porthobucket = (); - my $protein_id = $res->[0]->{'protein_id'}; - my $protein_definition = $res->[0]->{'definition'}; + # Here we preretrieve orthologs_id for saving time with fixed KEGG_ID + my ($orthoidlist) = {}; + my $results_ortho = $dbh->select_from_table("SELECT ortholog_id, name, organism_id from `ortholog` where db_id = \"$kegg_id\" ;"); - my $is_cluster; + foreach my $result ( @{$results_ortho} ) { + my $org = $result->{"organism_id"}; + my $name = $result->{"name"}; + my $oid = $result->{"ortholog_id"}; - #add orthologus information from the list of species for proteins associated to this KO group - my $gene_string = ""; - if ( $hash->{'GENES'} ) { - $gene_string = $hash->{'GENES'}; + if ( ! $orthoidlist->{$org} ) { + $orthoidlist->{$org} = {}; } - # print STDERR $proteinItem, "\t", $gene_string, "\n"; - # print STDERR "gene string: $gene_string\n"; - my @lines=split/\,/,$gene_string; - - # We do batch mode for MySQL but not sqlite - # https://sqlite.org/np1queryprob.html - - foreach my $l (@lines) { - - # insert each ortholog - my ($code,$gene_id)=split/\:/,$l; - $gene_id = trim($gene_id); - # determine if $gene_id containt a cluster of genes - my $name; - # Gene id can be too long - my (@names) = split(/ /, $gene_id); - if ( $#names > $limnames ) { - $name = join(" ", @names[0..$limnames]); - } else { - $name = join(" ", @names); - } - - $is_cluster=1 if scalar(@names)>1; - $is_cluster=0 if scalar(@names)==1; - my $lcode=lc(trim($code)); - #print STDERR "* ", $lcode, "\n"; - #print STDERR "- ", Dumper( $codesOrg ); - # next if ortholog is not in the list of species to analyze - next if !$codesOrg->{$lcode}; - #print STDERR "Passed\n"; - #get organism_id from DB - #my $organism_id= organism_table($lcode,$dbEngine,$dbh); - my $organism_id= $codesOrg->{$lcode}; - - #populate protein_ortholog - #check if protein_ortholog already exists in the table (yes && do_update => update record; no => insert new protein_ortholog) - - my $type; - - if ($numberProteinsInGroup>1 && $is_cluster==0) { - $type="many2one"; - } elsif ($numberProteinsInGroup>1 && $is_cluster==1) { - $type="many2many"; - } elsif ($numberProteinsInGroup==1 && $is_cluster==1) { - $type="one2many"; - } else { - $type="one2one"; - } - - #my $query = "SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""; - #my $results_ortho = $dbh->select_from_table($query); + $orthoidlist->{$org}->{$name} = $oid; + } - #my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; - my $ortholog_id = $orthoidlist->{$organism_id}->{$name}; + foreach my $proteinItem ( @proteinList ) { - print STDERR "* ORTHO_ID: $ortholog_id\n"; + #select protein_id infor (because items are stable_ids in protein table) + my $protein_sql_select= qq{ SELECT d.protein_id,d.definition d FROM definition d, protein p WHERE p.protein_id=d.protein_id and p.stable_id=\"$proteinItem\"}; + my $res = $dbh->select_from_table($protein_sql_select); - if ( ! $ortholog_id ) { - print STDERR "Major error here\n"; - exit; + # If no content, next. Cases of partial tests. + if ( $#{$res} < 0 ){ + next; } - my $values = "( \"$protein_id\", \"$ortholog_id\", \"$type\", \"$kegg_group_id\" )"; - push( @porthobucket, $values ); - - } #for each group of genes in multiply organisms + my $protein_id = $res->[0]->{'protein_id'}; + my $protein_definition = $res->[0]->{'definition'}; + my $is_cluster; - print STDERR "Ortholog here ".getLoggingTime()."\n"; - - # add GO terms info into go_term and protein_go table. - # TODO Consider in the future other annotations, such as COG - if(defined $hash->{'DBLINKS'}) { - - my @goIds = &parseKEGGDBLinks($hash->{'DBLINKS'}); - - # Define storage - $gomap{$protein_id} = (); + #add orthologus information from the list of species for proteins associated to this KO group + my $gene_string = ""; + if ( $hash->{$kegg_id}->{'GENES'} ) { + $gene_string = $hash->{$kegg_id}->{'GENES'}; + } - foreach my $goId ( @goIds ) { + # print STDERR $proteinItem, "\t", $gene_string, "\n"; + # print STDERR "gene string: $gene_string\n"; + my @lines=split/\,/,$gene_string; + + # We do batch mode for MySQL but not sqlite + # https://sqlite.org/np1queryprob.html + + foreach my $l (@lines) { + + # insert each ortholog + my ($code,$gene_id)=split/\:/,$l; + $gene_id = trim($gene_id); + # determine if $gene_id containt a cluster of genes + my $name; + # Gene id can be too long + my (@names) = split(/ /, $gene_id); + if ( $#names > $limnames ) { + $name = join(" ", @names[0..$limnames]); + } else { + $name = join(" ", @names); + } + + $is_cluster=1 if scalar(@names)>1; + $is_cluster=0 if scalar(@names)==1; + my $lcode=lc(trim($code)); + #print STDERR "* ", $lcode, "\n"; + #print STDERR "- ", Dumper( $codesOrg ); + # next if ortholog is not in the list of species to analyze + next if !$codesOrg->{$lcode}; + #print STDERR "Passed\n"; + #get organism_id from DB + #my $organism_id= organism_table($lcode,$dbEngine,$dbh); + my $organism_id= $codesOrg->{$lcode}; + + #populate protein_ortholog + #check if protein_ortholog already exists in the table (yes && do_update => update record; no => insert new protein_ortholog) + + my $type; + + if ($numberProteinsInGroup>1 && $is_cluster==0) { + $type="many2one"; + } elsif ($numberProteinsInGroup>1 && $is_cluster==1) { + $type="many2many"; + } elsif ($numberProteinsInGroup==1 && $is_cluster==1) { + $type="one2many"; + } else { + $type="one2one"; + } + + #my $query = "SELECT ortholog_id from ortholog WHERE name = \"$gene_id\" AND organism_id = \"$organism_id\" AND db_id = \"$kegg_id\""; + #my $results_ortho = $dbh->select_from_table($query); + + #my $ortholog_id = $results_ortho->[0]->{'ortholog_id'}; + my $ortholog_id = $orthoidlist->{$organism_id}->{$name}; + + print STDERR "* ORTHO_ID: $ortholog_id\n"; + + if ( ! $ortholog_id ) { + print STDERR "Major error here\n"; + exit; + } + + my $values = "( \"$protein_id\", \"$ortholog_id\", \"$type\", \"$kegg_group_id\" )"; + push( @porthobucket, $values ); + + } #for each group of genes in multiply organisms + + + print STDERR "Ortholog here ".getLoggingTime()."\n"; + + # add GO terms info into go_term and protein_go table. + # TODO Consider in the future other annotations, such as COG + if(defined $hash->{$kegg_id}->{'DBLINKS'}) { + + my @goIds = &parseKEGGDBLinks($hash->{$kegg_id}->{'DBLINKS'}); + + # Define storage + $gomap{$protein_id} = (); + + foreach my $goId ( @goIds ) { + + my $goTermId; + + if ( ! $goall{$goId} ) { + + #insert go term, associated with this protein into go_term table, and then into protein_go + my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; + my $sqlUpdate =""; + my $sqlInsert = ""; + if( lc( $dbEngine ) eq 'sqlite') { + $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; + } + else { + $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; + } + $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); + #small patch for SQLite - the current insert function could not return id of the last inserted record... + if(!defined $goTermId) { + my $select = &selectLastId( $dbEngine ); + my $results = $dbh->select_from_table($select); + $goTermId=$results->[0]->{'id'}; + } + + $goall{$goId} = $goTermId; + } else { + $goTermId = $goall{$goId}; + } - my $goTermId; + push( @{$gomap{$protein_id}}, $goTermId ); + }#if there was a GO records + }#if defined dbLinks + }#foreach protein Item - if ( ! $goall{$goId} ) { + # my @gobucket = (); + foreach my $protein_id ( keys %gomap ) { + foreach my $goTermId ( @{$gomap{$protein_id}} ) { + my $values = "( \"$protein_id\", \"$goTermId\", \"KEGG\" )"; + push( @gobucket, $values ); + } - #insert go term, associated with this protein into go_term table, and then into protein_go - my $sqlSelect = "SELECT go_term_id from go_term where go_acc like '$goId'"; - my $sqlUpdate =""; - my $sqlInsert = ""; - if( lc( $dbEngine ) eq 'sqlite') { - $sqlInsert = "INSERT INTO go_term (go_term_id,go_acc) VALUES (NULL,\"$goId\")"; - } - else { - $sqlInsert = "INSERT INTO go_term SET go_acc =\"$goId\""; - } - $goTermId = $dbh->select_update_insert("go_term_id", $sqlSelect, $sqlUpdate, $sqlInsert, 0); - #small patch for SQLite - the current insert function could not return id of the last inserted record... - if(!defined $goTermId) { - my $select = &selectLastId( $dbEngine ); - my $results = $dbh->select_from_table($select); - $goTermId=$results->[0]->{'id'}; - } - - $goall{$goId} = $goTermId; - } else { - $goTermId = $goall{$goId}; - } - - push( @{$gomap{$protein_id}}, $goTermId ); - }#if there was a GO records - }#if defined dbLinks - }#foreach protein Item - - # my @gobucket = (); - foreach my $protein_id ( keys %gomap ) { - foreach my $goTermId ( @{$gomap{$protein_id}} ) { - my $values = "( \"$protein_id\", \"$goTermId\", \"KEGG\" )"; - push( @gobucket, $values ); } - } - - print STDERR "KO finished here ".getLoggingTime()."\n"; - %gomap = (); + print STDERR "KO finished here ".getLoggingTime()."\n"; + %gomap = (); - @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho" ); - @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go" ); + @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, $bucketsize, "portho" ); + @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, $bucketsize, "go" ); - print STDERR "KO upload finished here ".getLoggingTime()."\n"; + print STDERR "KO upload finished here ".getLoggingTime()."\n"; - }#foreach kegg KO item + }#foreach kegg KO item - #update protein definition for KEGG source - #print STDERR "Definition\n"; - #print STDERR Dumper( \%protDefinitionData ); - # Toniher: We do not include protein Definition here - # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + #update protein definition for KEGG source + #print STDERR "Definition\n"; + #print STDERR Dumper( \%protDefinitionData ); + # Toniher: We do not include protein Definition here + # &updateProteinDefinition(\%protDefinitionData,$dbh,1,'KEGG',$dbEngine,'protein_id'); + } @porthobucket = &processBucket( $dbh, $dbEngine, \@porthobucket, 0, "portho" ); @gobucket = &processBucket( $dbh, $dbEngine, \@gobucket, 0, "go" ); @@ -829,31 +834,39 @@ sub retrieve_kegg_record { # subroutine to retrieve KEGG record from DB sub retrieve_kegg_window { + my $dbh = shift; my $kegg_window = shift; my %hash; if ( $#{$kegg_window} >= 0 ) { - # TODO: Mapping needed here - my $sqlSelect = "SELECT * from kegg_group where db_id = \"$kegg_id\" limit 1"; - my $results =$dbh->select_from_table($sqlSelect); + my @arrSel; + foreach my $kw ( @{$kegg_window} ) { + push( @arrSel, "\"".$kw."\"" ) + } - my $kegg_group_id; + my $sqlSelect = "SELECT * from kegg_group where db_id in ( ".join( ", ", @arrSel )." ) "; + print STDERR $sqlSelect, "\n"; + my $results =$dbh->select_from_table($sqlSelect); if ( $#{$results} >= 0 ) { - $kegg_group_id = $results->[0]->{"kegg_group_id"}; - foreach my $key ( keys %{$results->[0]} ) { - my $finalkey = uc($key); - $finalkey=~s/\_//g; - $hash{$finalkey} = $results->[0]->{$key}; - } + foreach my $result ( @{$results} ) { + $dbid = $result->{"db_id"}; + $hash{$db_id} = {}; + + foreach my $key ( keys %{$result} ) { + my $finalkey = uc($key); + $finalkey=~s/\_//g; + $hash{$db_id}->{$finalkey} = $result->{$key}; + } + } } } - return (\%hash, $kegg_group_id); + return (\%hash); } # subroutine to parse KEGG record and put its elements into a hash From f6bb5c5d15e88500408acbcf5cc16b0c5bc4b5e4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 16 Jun 2021 19:48:36 +0200 Subject: [PATCH 232/381] fix db_id --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 977abf4..70ae812 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -852,7 +852,7 @@ sub retrieve_kegg_window { if ( $#{$results} >= 0 ) { foreach my $result ( @{$results} ) { - $dbid = $result->{"db_id"}; + my $db_id = $result->{"db_id"}; $hash{$db_id} = {}; foreach my $key ( keys %{$result} ) { From 6d2615bf0f9d5520dd5bd54bf2205e74df7421a7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 17 Jun 2021 15:55:07 +0200 Subject: [PATCH 233/381] split by --- Dockerfile | 4 +--- scripts/load_kegg_KAAS.pl | 33 ++------------------------------- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/Dockerfile b/Dockerfile index 71b627b..5d43a29 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN apt-get install -y texlive-latex-base texlive-fonts-recommended texlive-font RUN apt-get install -y libxml2-dev libexpat1-dev libdb-dev libgd-dev # Perl packages -RUN cpanm Config::Simple Config::JSON DBI DBD::mysql DBD::SQLite Digest::SHA File::Basename Getopt::Long IO::Handle JSON Lingua::EN::Ngram List::Util Scalar::Util String::Util +RUN cpanm Config::Simple Config::JSON DBI DBD::mysql DBD::SQLite Digest::SHA File::Basename Getopt::Long IO::Handle JSON Lingua::EN::Ngram List::Util Scalar::Util String::Util Array::Split ARG BIOPERL_VERSION=1.7.5 # https://stackoverflow.com/questions/47966512/error-installing-xmldomxpath @@ -46,5 +46,3 @@ ENV PATH /scripts:$PATH COPY scripts/ /scripts/ RUN chmod -R a+rx /scripts/* - - diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 70ae812..4d41c89 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -50,6 +50,7 @@ =head1 AUTHORS use LWP::Simple; use Config::Simple; use String::Util 'trim'; +use Array::Split qw( split_by split_into ); my $confFile = 'main_configuration.ini'; @@ -484,7 +485,7 @@ sub uploadKeggInformation { # RETRIEVE By windows my ( @all_kegg ) = sort( keys %{$keggData} ); - my ( @kegg_windows ) = &prepareWinArray( \@all_kegg, $winsize ); + my ( @kegg_windows ) = split_by( $winsize, @all_kegg ); foreach my $kw ( @kegg_windows ) { @@ -752,36 +753,6 @@ sub processBucket { } -sub prepareWinArray { - - my $array = shift; - my $winsize = shift; - my @final; - - my $i = 0; - my $tmparr; - - foreach my $el ( @{$array} ) { - - push( @{$tmparr}, $el ); - - if ( $i >= $winsize ) { - push( @final, $tmparr ); - @{$tmparr} = (); - $i = 0; - } else { - $i++; - } - } - - if ( $#{$tmparr} >= 0 ) { - push( @final, $tmparr ); - } - - return @final; -} - - sub parseKEGGDBLinks { my $dbLinks = shift; From 8244cc5620483dc9d92c6fdbdf70cd267c5880a1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 17 Jun 2021 17:07:26 +0200 Subject: [PATCH 234/381] fix hash --- scripts/load_kegg_KAAS.pl | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 4d41c89..b9de361 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -494,7 +494,6 @@ sub uploadKeggInformation { foreach my $kegg_id (sort( keys %{$hash} ) ) { #get KO information from server - my $hash; my $kegg_group_id = $hash->{$kegg_id}->{"KEGGGROUPID"}; print STDERR "\n* Entering $kegg_id\n"; #( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); From 64857b7262846cbb17d2ab902dcc6e1daf9d7d72 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 17 Jun 2021 17:45:02 +0200 Subject: [PATCH 235/381] optimize the most --- scripts/load_kegg_KAAS.pl | 117 ++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 63 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index b9de361..fe060e3 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -372,93 +372,84 @@ sub uploadKOInformation { my @countk = keys %{$keggData}; print STDERR "* COUNT: ", $#countk + 1, "\n"; + if ( $pre_upload_kegg < 1 ) { + print STDERR "No entries!"; + } + # Number limit names my $limnames = 9; # Let's put buckets here my $bucketsize = 10000; + my $winsize = 100; my @orthobucket = (); - foreach my $kegg_id (sort( keys %{$keggData})) { - #get KO information from server + # RETRIEVE By windows + my ( @all_kegg ) = sort( keys %{$keggData} ); + my ( @kegg_windows ) = split_by( $winsize, @all_kegg ); - my $hash; - my $kegg_group_id; - if ( $pre_upload_kegg > 0 ) { + foreach my $kw ( @kegg_windows ) { - print STDERR "\n* Entering $kegg_id\n"; - ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); + my $hash = retrieve_kegg_window( $dbh, $kw ); - #print STDERR "Prefilled\n"; - #print STDERR Dumper( $hash ); - #print STDERR Dumper( $kegg_group_id ); + foreach my $kegg_id (sort( keys %{$hash} ) ) { + #get KO information from server - } else { + my $kegg_group_id = $hash->{$kegg_id}->{"KEGGGROUPID"}; - $hash = parse_kegg_record($kegg_id); - #upload information about KO group into DB if its absent in DB - my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); - foreach my $absItem(@absentList) { - if(!defined $hash->{$absItem}) { - $hash->{$absItem}=""; - } - } - - $kegg_group_id = &uploadSingleKEGGId($kegg_id, $hash, $dbh, $dbEngine); - } + if(!defined $kegg_group_id) { + print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; + next; # Skip to another entry + } - if(!defined $kegg_group_id) { - print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; - next; # Skip to another entry - } + #add orthologus information from the list of species for proteins associated to this KO group + my $gene_string = ""; + if ( $hash->{$kegg_id}->{'GENES'} ) { + $gene_string = $hash->{$kegg_id}->{'GENES'}; + } - #add orthologus information from the list of species for proteins associated to this KO group - my $gene_string = ""; - if ( $hash->{'GENES'} ) { - $gene_string = $hash->{'GENES'}; - } + # print STDERR $proteinItem, "\t", $gene_string, "\n"; + # print STDERR "gene string: $gene_string\n"; + my @lines=split/\,/,$gene_string; - # print STDERR $proteinItem, "\t", $gene_string, "\n"; - # print STDERR "gene string: $gene_string\n"; - my @lines=split/\,/,$gene_string; + # We do batch mode for MySQL but not sqlite + # https://sqlite.org/np1queryprob.html - # We do batch mode for MySQL but not sqlite - # https://sqlite.org/np1queryprob.html + print "NUM LINES: $#lines\n"; - print "NUM LINES: $#lines\n"; + foreach my $l (@lines) { - foreach my $l (@lines) { + # insert each ortholog + my ($code,$gene_id)=split/\:/,$l; + $gene_id = trim($gene_id); + my $lcode=lc(trim($code)); - # insert each ortholog - my ($code,$gene_id)=split/\:/,$l; - $gene_id = trim($gene_id); - my $lcode=lc(trim($code)); + my $name; + # Gene id can be too long + my (@names) = split(/ /, $gene_id); + if ( $#names > $limnames ) { + $name = join(" ", @names[0..$limnames]); + } else { + $name = join(" ", @names); + } + #print STDERR "* ", $lcode, "\n"; + #print STDERR "- ", Dumper( $codesOrg ); + # next if ortholog is not in the list of species to analyze + next if !$codesOrg->{$lcode}; + #print STDERR "Passed\n"; + #get organism_id from DB + #my $organism_id= organism_table($lcode,$dbEngine,$dbh); + my $organism_id= $codesOrg->{$lcode}; + + my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; + push( @orthobucket, $values ); - my $name; - # Gene id can be too long - my (@names) = split(/ /, $gene_id); - if ( $#names > $limnames ) { - $name = join(" ", @names[0..$limnames]); - } else { - $name = join(" ", @names); } - #print STDERR "* ", $lcode, "\n"; - #print STDERR "- ", Dumper( $codesOrg ); - # next if ortholog is not in the list of species to analyze - next if !$codesOrg->{$lcode}; - #print STDERR "Passed\n"; - #get organism_id from DB - #my $organism_id= organism_table($lcode,$dbEngine,$dbh); - my $organism_id= $codesOrg->{$lcode}; - - my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; - push( @orthobucket, $values ); - } - - @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, $bucketsize, "ortho" ); + @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, $bucketsize, "ortho" ); + } } From af212e1b8faf8dbd85e34a75bc203e7a32abb790 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 17 Jun 2021 19:22:10 +0200 Subject: [PATCH 236/381] avoid verbose --- scripts/load_kegg_KAAS.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index fe060e3..3bd5ca2 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -807,7 +807,7 @@ sub retrieve_kegg_window { } my $sqlSelect = "SELECT * from kegg_group where db_id in ( ".join( ", ", @arrSel )." ) "; - print STDERR $sqlSelect, "\n"; + #print STDERR $sqlSelect, "\n"; my $results =$dbh->select_from_table($sqlSelect); if ( $#{$results} >= 0 ) { From b61a9ddf6416df66a9aa820efb5822b83711d803 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 18 Jun 2021 11:22:13 +0200 Subject: [PATCH 237/381] kept old for sake of completion and reduce bucket size --- scripts/load_kegg_KAAS.pl | 111 +++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/scripts/load_kegg_KAAS.pl b/scripts/load_kegg_KAAS.pl index 3bd5ca2..d268ef3 100755 --- a/scripts/load_kegg_KAAS.pl +++ b/scripts/load_kegg_KAAS.pl @@ -361,6 +361,113 @@ sub uploadSingleKEGGId { } +# sub uploadKOInformation { +# +# my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; +# +# print STDERR "KO entries: ".$pre_upload_kegg."\n"; +# +# my($sqlSelect, $sqlInsert,$sqlUpdate); +# +# my @countk = keys %{$keggData}; +# print STDERR "* COUNT: ", $#countk + 1, "\n"; +# +# # Number limit names +# my $limnames = 9; +# +# # Let's put buckets here +# my $bucketsize = 10000; +# my @orthobucket = (); +# +# foreach my $kegg_id (sort( keys %{$keggData})) { +# #get KO information from server +# +# my $hash; +# my $kegg_group_id; +# if ( $pre_upload_kegg > 0 ) { +# +# print STDERR "\n* Entering $kegg_id\n"; +# ( $hash, $kegg_group_id ) = retrieve_kegg_record( $kegg_id ); +# +# #print STDERR "Prefilled\n"; +# #print STDERR Dumper( $hash ); +# #print STDERR Dumper( $kegg_group_id ); +# +# } else { +# +# $hash = parse_kegg_record($kegg_id); +# +# #upload information about KO group into DB if its absent in DB +# my @absentList=qw(PATHWAY CLASS MODULE DEFINITION DBLINKS GENES); +# foreach my $absItem(@absentList) { +# if(!defined $hash->{$absItem}) { +# $hash->{$absItem}=""; +# } +# } +# +# $kegg_group_id = &uploadSingleKEGGId($kegg_id, $hash, $dbh, $dbEngine); +# } +# +# if(!defined $kegg_group_id) { +# print STDERR "Unexpectable problem! Can not find kegg_group_id for $kegg_id group!$!\n"; +# next; # Skip to another entry +# } +# +# #add orthologus information from the list of species for proteins associated to this KO group +# my $gene_string = ""; +# if ( $hash->{'GENES'} ) { +# $gene_string = $hash->{'GENES'}; +# } +# +# # print STDERR $proteinItem, "\t", $gene_string, "\n"; +# # print STDERR "gene string: $gene_string\n"; +# my @lines=split/\,/,$gene_string; +# +# # We do batch mode for MySQL but not sqlite +# # https://sqlite.org/np1queryprob.html +# +# print "NUM LINES: $#lines\n"; +# +# foreach my $l (@lines) { +# +# # insert each ortholog +# my ($code,$gene_id)=split/\:/,$l; +# $gene_id = trim($gene_id); +# my $lcode=lc(trim($code)); +# +# my $name; +# # Gene id can be too long +# my (@names) = split(/ /, $gene_id); +# if ( $#names > $limnames ) { +# $name = join(" ", @names[0..$limnames]); +# } else { +# $name = join(" ", @names); +# } +# #print STDERR "* ", $lcode, "\n"; +# #print STDERR "- ", Dumper( $codesOrg ); +# # next if ortholog is not in the list of species to analyze +# next if !$codesOrg->{$lcode}; +# #print STDERR "Passed\n"; +# #get organism_id from DB +# #my $organism_id= organism_table($lcode,$dbEngine,$dbh); +# my $organism_id= $codesOrg->{$lcode}; +# +# my $values = "( \"$name\", \"$organism_id\", \"$kegg_id\", \"KEGG\" )"; +# push( @orthobucket, $values ); +# +# } +# +# @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, $bucketsize, "ortho" ); +# +# +# } +# +# @orthobucket = &processBucket( $dbh, $dbEngine, \@orthobucket, 0, "ortho" ); +# +# +# } + + sub uploadKOInformation { my($dbh, $keggData, $codesOrg, $dbEngine, $pre_upload_kegg)=@_; @@ -380,7 +487,7 @@ sub uploadKOInformation { my $limnames = 9; # Let's put buckets here - my $bucketsize = 10000; + my $bucketsize = 100; my $winsize = 100; my @orthobucket = (); @@ -469,7 +576,7 @@ sub uploadKeggInformation { print STDERR "* COUNT: ", $#countk + 1, "\n"; # Let's put buckets here - my $bucketsize = 10000; + my $bucketsize = 100; my $winsize = 100; my @porthobucket = (); my @gobucket = (); From c44d38b1e6c2313b50e5a7f019f4fe2aa85a3367 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 22 Jun 2021 13:07:39 +0200 Subject: [PATCH 238/381] handling maxforks --- main.nf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index e01e8b9..8dd4354 100644 --- a/main.nf +++ b/main.nf @@ -733,7 +733,9 @@ process 'cdSearchHit' { label 'cdSearch' - maxForks 1 + if ( ! skip_cdSearch ) { + maxForks 1 + } input: file seq from web_seq_file1 @@ -756,7 +758,9 @@ process 'cdSearchFeat' { label 'cdSearch' - maxForks 1 + if ( ! skip_cdSearch ) { + maxForks 1 + } input: file seq from web_seq_file2 @@ -954,8 +958,6 @@ if ( params.koentries == "" ) { process 'kegg_download_dummy' { - maxForks 1 - input: file keggfile from keggfile file config from config4perl8 From 6b67dc8727e546da017807577f427243dcb822b0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 22 Jun 2021 13:19:08 +0200 Subject: [PATCH 239/381] avoid saturation of web services --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index 8dd4354..444117d 100644 --- a/main.nf +++ b/main.nf @@ -658,6 +658,8 @@ if (params.gogourl != "") { process blast_annotator { label 'blastannotator' + + maxForks 3 input: file blastXml from blastXmlResults2.flatMap() From 7fe9a1b7796f1a9b0275bb41ceb9b5a36d0cdbb5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 25 Jun 2021 12:46:56 +0200 Subject: [PATCH 240/381] Update docker.yml update ref --- .github/workflows/docker.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8a20f04..61a8648 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -10,8 +10,13 @@ jobs: packages: write contents: read steps: - - name: Check out the repo - uses: actions/checkout@v2 + - uses: actions/checkout@v2 + - run: | + ref="${github_ref/refs\/tags\///}" + echo $ref + echo "::set-env name=ref::$ref" + env: + github_ref: ${{ github.ref }} - name: Log in to Docker Hub uses: docker/login-action@v1 with: @@ -23,13 +28,15 @@ jobs: registry: docker.pkg.github.com username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: String manipulation + uses: actions/checkout@v1 - name: Push to Docker Hub uses: docker/build-push-action@v2 with: push: true - tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ github.ref }} + tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ ref }} - name: Build container image uses: docker/build-push-action@v2 with: push: true - tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:${{ github.ref }} + tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:${{ ref }} From 377661d6eb8ef678359bc38b572323e92464b544 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 25 Jun 2021 17:50:03 +0200 Subject: [PATCH 241/381] check for FASTA file --- TODO.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 99ce2c8..f1c1a8c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,7 +1,6 @@ * Log directory check * Singularity file for run_mysql wrapper process -* Check kegg_upload slow process - * In pre-upload insert many KEGG entries at once. +* Initial check for FASTA file * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Include some testing and CI * Visualization of results From 58f9212bb3421725b381251bceaaf19fa3cf578b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 3 Jul 2021 18:28:31 +0200 Subject: [PATCH 242/381] Update nextflow.config --- nextflow.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nextflow.config b/nextflow.config index 9f077b6..c0f3e41 100644 --- a/nextflow.config +++ b/nextflow.config @@ -43,6 +43,7 @@ process{ withLabel: sigtarp { queue='biocore-el7,short-sl7' + // Modify container value below with the resulting image from: https://github.com/biocorecrg/sigtarp_docker container="/software/bi/biocore_tools/git/singularity/sigtarp.sif" } @@ -56,6 +57,7 @@ process{ queue='biocore-el7,long-sl7' time='48h' cpus='8' + // Modify container value below with the resulting image from: https://github.com/biocorecrg/interproscan_docker container="/software/bi/biocore_tools/git/singularity/iprscan/iprscan-5.48-83.0.sif" maxRetries=3 } From 523f974bea838bfdfc6e6b9329ed1c290275a75a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 3 Jul 2021 18:37:10 +0200 Subject: [PATCH 243/381] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d97205f..5ba8e08 100644 --- a/README.md +++ b/README.md @@ -220,8 +220,8 @@ The software used all along this pipeline is encapsulated in several containers: As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. -* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build this, **sigtarp** process in ```nextflow.config```) -* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build this, **ipscan** process in ```nextflow.config```) +* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build container image first. Please check **sigtarp** process in ```nextflow.config```) +* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build container image fisrt. Please check **ipscan** process in ```nextflow.config```. Two versions are available: one with privative software and one without) ### How to build base container From 635039f2e92b12d4238ba5dbf72fc1c03f378d90 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 5 Jul 2021 13:16:46 +0200 Subject: [PATCH 244/381] Dataset resources --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5ba8e08..659d267 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,10 @@ For KofamKOLA, adjust the parameters below to match the location in your system **Note**: when using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. +### Dataset resources + +For downloading and formatting diferent datasets used by the programs part of this pipeline, [some scripts are provided here](https://github.com/toniher/biomirror/) for convenience. + ## Result files Below you can check all the possibly available files in results directory (defined with ```resultPath``` parameter) at the end of the pipeline execution. Some files may not be there if certain options are switched (e.g., if GFF cleaning is skipped with ```gffclean = "false"```). From d5836a0be05bcc6b60d49ff3e9598b60f6287cd0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 5 Jul 2021 13:52:13 +0200 Subject: [PATCH 245/381] more info for koentries --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 659d267..f2285d0 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,11 @@ For KofamKOLA, adjust the parameters below to match the location in your system ``` kolist = "/nfs/db/kegg/ko_list" koprofiles = "/nfs/db/kegg/profiles" + koentries = "/nfs/db/kegg/ko_store" ``` +In the parameters above, ```koentries``` refers to a directory containing KO entries text files that can be downloaded in advance (check *Dataset resources* section below). + **Note**: when using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. ### Dataset resources From 12e309f017c84617723b14471e9f4254b9b5ae05 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 6 Jul 2021 15:39:35 +0200 Subject: [PATCH 246/381] skip sigtarp --- main.nf | 83 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/main.nf b/main.nf index 444117d..53de0c8 100644 --- a/main.nf +++ b/main.nf @@ -84,6 +84,7 @@ params.oboFile = null // Skip params params.skip_cdSearch = false +params.skip_sigtarp = false // Mail for sending reports params.email = "" @@ -119,8 +120,9 @@ boolean mysql = false gffavail = false gffclean = false gffstats = false -// Skip cdSearch +// Skip skip_cdSearch = false +skip_sigtarp = false if( params.dbEngine.toLowerCase()=="mysql" ) { mysql = true @@ -138,6 +140,10 @@ if ( params.skip_cdSearch ) { skip_cdSearch = true } +if ( params.skip_sigtarp ) { + skip_sigtarp = true +} + // Handling MySQL in a cleaner way dbhost = null @@ -210,6 +216,9 @@ if ( skip_cdSearch ) { log.info "CD-Search queries will be skipped." } +if ( skip_sigtarp ) { + log.info "SignalP and targetP queries will be skipped." +} // split protein fasta file into chunks and then execute annotation for each chunk // chanels for: interpro, blast, signalP, targetP, cdsearch_hit, cdsearch_features @@ -658,7 +667,7 @@ if (params.gogourl != "") { process blast_annotator { label 'blastannotator' - + maxForks 3 input: @@ -781,35 +790,67 @@ process 'cdSearchFeat' { command } +if ( skip_sigtarp ) { -process 'signalP' { + process 'signalP_dummy' { - label 'sigtarp' + input: + file seq from seq_file1 - input: - file seq from seq_file1 + output: + file("out_signalp_${seq}") into (signalP_result1, signalP_result2) - output: - file("out_signalp_${seq}") into (signalP_result1, signalP_result2) + """ + touch out_signalp_${seq} + """ + } - """ - signalp $seq > out_signalp_${seq} - """ -} + process 'targetP_dummy' { -process 'targetP' { + input: + file seq from seq_file2 - label 'sigtarp' + output: + file("out_targetp_${seq}") into (targetP_result1, targetP_result2) - input: - file seq from seq_file2 + """ + touch > out_targetp_${seq} + """ + } - output: - file("out_targetp_${seq}") into (targetP_result1, targetP_result2) +} else { + + + process 'signalP' { + + label 'sigtarp' + + input: + file seq from seq_file1 + + output: + file("out_signalp_${seq}") into (signalP_result1, signalP_result2) + + """ + signalp $seq > out_signalp_${seq} + """ + } + + process 'targetP' { + + label 'sigtarp' + + input: + file seq from seq_file2 + + output: + file("out_targetp_${seq}") into (targetP_result1, targetP_result2) + + """ + targetp -P -c $seq > out_targetp_${seq} + """ + } - """ - targetp -P -c $seq > out_targetp_${seq} - """ } process 'signalP_upload'{ From 5e6b968da97c51ab0feacbdc850828f0c2f770ae Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 6 Jul 2021 16:02:02 +0200 Subject: [PATCH 247/381] typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 53de0c8..5516d71 100644 --- a/main.nf +++ b/main.nf @@ -814,7 +814,7 @@ if ( skip_sigtarp ) { file("out_targetp_${seq}") into (targetP_result1, targetP_result2) """ - touch > out_targetp_${seq} + touch out_targetp_${seq} """ } From 7bf8a03df32a9bdd5992f4850ce6930962440b6a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 6 Jul 2021 16:24:54 +0200 Subject: [PATCH 248/381] skip if sigtarp --- main.nf | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index 5516d71..79da323 100644 --- a/main.nf +++ b/main.nf @@ -1187,13 +1187,15 @@ if (params.email == "yourmail@yourdomain" || params.email == "") { } } -signalP_result2 - .collectFile(name: file(params.resultPath + "signalP.res.tsv")) - .println { "Result saved to file: $it" } - -targetP_result2 - .collectFile(name: file(params.resultPath + "targetP.res.tsv")) - .println { "Result saved to file: $it" } +if ( ! skip_sigtarp ) { + signalP_result2 + .collectFile(name: file(params.resultPath + "signalP.res.tsv")) + .println { "Result saved to file: $it" } + + targetP_result2 + .collectFile(name: file(params.resultPath + "targetP.res.tsv")) + .println { "Result saved to file: $it" } +} ipscn_result2 .collectFile(name: file(params.resultPath + "interProScan.res.tsv")) From f2d34ca7b8a5d397c234983aafb9d5c83d232089 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 6 Jul 2021 16:50:33 +0200 Subject: [PATCH 249/381] some skip processes --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f2285d0..2ca816a 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,17 @@ In the parameters above, ```koentries``` refers to a directory containing KO ent **Note**: when using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. +### Skipping some analyses + +Future versions of this pipeline might allow to control in more detail which applications to run. For now, it is possible to skip some of them: *cdSearch* (hit and features retrieval), *signalP* and *targetP*. For the first case, since it is a web process, it can be time-consuming and problematic in some HPC setups. For the last two cases, since preparing a container with privative software can be troublesome or problematic, it can also be skipped. It is worth noting that some CD-Search data is actually available in InterPro. + +For skipping these applications, the following lines can be added in the configuration file: + +``` + skip_cdSearch = true + skip_sigtarp = true +``` + ### Dataset resources For downloading and formatting diferent datasets used by the programs part of this pipeline, [some scripts are provided here](https://github.com/toniher/biomirror/) for convenience. From e71f5269ac65d3fe2ba22d84db3bca917bc4ada5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 6 Jul 2021 19:50:18 +0200 Subject: [PATCH 250/381] change term --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ca816a..eece3a5 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ In the parameters above, ```koentries``` refers to a directory containing KO ent ### Skipping some analyses -Future versions of this pipeline might allow to control in more detail which applications to run. For now, it is possible to skip some of them: *cdSearch* (hit and features retrieval), *signalP* and *targetP*. For the first case, since it is a web process, it can be time-consuming and problematic in some HPC setups. For the last two cases, since preparing a container with privative software can be troublesome or problematic, it can also be skipped. It is worth noting that some CD-Search data is actually available in InterPro. +Future versions of this pipeline might allow to control in more detail which applications to run. For now, it is possible to skip some of them: *cdSearch* (hit and features retrieval), *signalP* and *targetP*. For the first case, since it is a web process, it can be time-consuming and not possible in some HPC setups. For the last two cases, since preparing a container with privative software can be troublesome or problematic, it can also be skipped. It is worth noting that some CD-Search data is actually available in InterPro. For skipping these applications, the following lines can be added in the configuration file: From 89ef281369a0e6d6722bfeabfe0a697f9759b352 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 7 Jul 2021 01:25:58 +0200 Subject: [PATCH 251/381] msg --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ca816a..6d64640 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ In the parameters above, ```koentries``` refers to a directory containing KO ent ### Skipping some analyses -Future versions of this pipeline might allow to control in more detail which applications to run. For now, it is possible to skip some of them: *cdSearch* (hit and features retrieval), *signalP* and *targetP*. For the first case, since it is a web process, it can be time-consuming and problematic in some HPC setups. For the last two cases, since preparing a container with privative software can be troublesome or problematic, it can also be skipped. It is worth noting that some CD-Search data is actually available in InterPro. +Future versions of this pipeline might allow to control in more detail which applications to run. For now, it is possible to skip some of them: *cdSearch* (hit and features retrieval), *signalP* and *targetP*. For the first case, since it is a web process, it can be time-consuming and problematic in some HPC setups. For the last two cases, since [preparing a container with privative software]((https://github.com/biocorecrg/sigtarp_docker)) can be troublesome or problematic, it can also be skipped. It is worth noting that some CD-Search data is actually available in InterPro. For skipping these applications, the following lines can be added in the configuration file: From 98ab825a8d9ce12be4c0f8b3eeac8377febb6efe Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 09:09:43 +0200 Subject: [PATCH 252/381] Update nextflow.config more comments for helping understanding --- nextflow.config | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/nextflow.config b/nextflow.config index c0f3e41..b6b68b1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -5,12 +5,14 @@ manifest { includeConfig "${params.config ?: 'params.config'}" -process{ +// Adapt queue entries below to match your infrastructure. If unsure, simply comment them with '//' +// More details at: https://www.nextflow.io/docs/latest/config.html +process{ queue='biocore-el7,long-sl7,short-sl7' - memory='24G' - cpus='4' time='6h' + cpus='4' + memory='24G' scratch = false maxRetries = 2 errorStrategy = 'retry' @@ -30,27 +32,29 @@ process{ } withLabel: blastannotator { + queue='biocore-el7,short-sl7' cpus='1' memory='8G' - queue='biocore-el7,short-sl7' } withLabel: gffcheck { - cpus='1' queue='biocore-el7,short-sl7' + cpus='1' container="quay.io/biocontainers/agat:0.1.0--pl526r35_0" } + // Process skipped with skip_sigtarp withLabel: sigtarp { queue='biocore-el7,short-sl7' // Modify container value below with the resulting image from: https://github.com/biocorecrg/sigtarp_docker container="/software/bi/biocore_tools/git/singularity/sigtarp.sif" } + // Process skipped with skip_cdSearch withLabel: cdSearch { + queue='biocore-el7,short-sl7' cpus='1' memory='8G' - queue='biocore-el7,short-sl7' } withLabel: ipscan { @@ -75,5 +79,8 @@ process{ } process.container = "guigolab/fa-nf:latest" +// Singularity preferred. If chosen docker, uncomment line below, comment singularity one and replace sif containers above accordingly +// docker.enabled = true singularity.enabled = true +// Location where Singularity images are cached. baseDir refers to the location from where the pipeline is executed singularity.cacheDir = "$baseDir/singularity" From 12b810b4a76cc53c7544180c78f7917072327bca Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 09:10:36 +0200 Subject: [PATCH 253/381] Update nextflow.config --- nextflow.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index b6b68b1..5cdd806 100644 --- a/nextflow.config +++ b/nextflow.config @@ -43,14 +43,14 @@ process{ container="quay.io/biocontainers/agat:0.1.0--pl526r35_0" } - // Process skipped with skip_sigtarp + // Process skipped with 'skip_sigtarp = true' in params.config withLabel: sigtarp { queue='biocore-el7,short-sl7' // Modify container value below with the resulting image from: https://github.com/biocorecrg/sigtarp_docker container="/software/bi/biocore_tools/git/singularity/sigtarp.sif" } - // Process skipped with skip_cdSearch + // Process skipped with 'skip_cdSearch = true' in params.config withLabel: cdSearch { queue='biocore-el7,short-sl7' cpus='1' From 87eb87516f6ff8e39731f1b5855ce2837b20d917 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:05:13 +0200 Subject: [PATCH 254/381] Update nextflow.config --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 5cdd806..f81a8a4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -62,7 +62,7 @@ process{ time='48h' cpus='8' // Modify container value below with the resulting image from: https://github.com/biocorecrg/interproscan_docker - container="/software/bi/biocore_tools/git/singularity/iprscan/iprscan-5.48-83.0.sif" + container="https://biocore.crg.eu/iprscan/iprscan-5.48-83.0.open.sif" maxRetries=3 } From 70eb7bee88d72266e5014217a11fa4cec9924b3b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:10:16 +0200 Subject: [PATCH 255/381] Update params.config --- params.config | 1 - 1 file changed, 1 deletion(-) diff --git a/params.config b/params.config index 25af0be..317f35a 100644 --- a/params.config +++ b/params.config @@ -4,7 +4,6 @@ params { gffclean = true gffstats = true evalue = "0.00001" - blastFile = "" diamond = true blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" blastAnnotMode = "common" From c866d59bd7b0ec487e24b512e6a8c8a3a7a12bf3 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:17:42 +0200 Subject: [PATCH 256/381] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c2c448c..94b83c4 100644 --- a/README.md +++ b/README.md @@ -120,14 +120,14 @@ When using the second option, you can tune it with the parameters below: ``` # Instance from where to retrieve GO mappings - params.gogourl = "http://myinstance.example.com/api" + gogourl = "http://myinstance.example.com/api" # Maximum number of hits to consider (up to 30 by default)) - params.gogohits = 30 + gogohits = 30 # Modes of retrieval from BLAST matches * Common: Only GO entries appearing in all matches * Most: Only GO entries appearing in more than half of matches * All: All GO entries appearing in all matches - params.blastAnnotMode = "common" + blastAnnotMode = "common" ``` ### KEGG orthology groups From f44a1a60fef28231a1b73ec898a75bfb755f020e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:20:43 +0200 Subject: [PATCH 257/381] Update params.config --- params.config | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/params.config b/params.config index 317f35a..ac64613 100644 --- a/params.config +++ b/params.config @@ -1,19 +1,33 @@ params { + # Protein fasta input proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" + # GFF input gffFile = "${baseDir}/dataset/P.vulgaris.gff3" + # Whether to run pipeline in debug mode or not + debug = true + # Whether to check and clean GFF input file gffclean = true + # Whether to generate stats from GFF input file gffstats = true - evalue = "0.00001" - diamond = true - blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" - blastAnnotMode = "common" - speciesName = "P.vulgaris" + # Processing sizes below + # Number of protein sequences per chunk (used as fallback) chunkSize = 25 + # Number of protein sequences per chunk when using BLAST (or DIAMOND) + # You can normally use a far higher number if using DIAMOND chunkBlastSize = 50 + # Number of protein sequences per chunk when using InterProScan chunkIPSSize = 25 + # Number of protein sequences per chunk when using KofamKOALA chunkKoalaSize = 50 + # Number of protein sequences per chunk when submitting to web processes (CD-Search for now) chunkWebSize = 100 - debugSize = 2 + # Number of chunks to be used when running in debug mode (e.g., for facllback processes this would be 5*25=125 protein sequences) + debugSize = 5 + evalue = "0.00001" + diamond = true + blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" + blastAnnotMode = "common" + speciesName = "P.vulgaris" oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" resultPath = "${baseDir}/results/" stdoutLog = "${baseDir}/logs/functional_annotation.stdout" @@ -33,6 +47,8 @@ params { mysqllog = "${baseDir}/tmp" mysqlimg = "docker://library/mariadb:10.3" loglevel = "info" - debug = true email = "yourmail@yourdomain" + # Uncomment lines below to skip those analyses + #skip_cdSearch = true + #skip_sigtarp = true } From e2bf6fd65cd0b365dafadbf0685f9da40bf163be Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:21:27 +0200 Subject: [PATCH 258/381] Update params.config --- params.config | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/params.config b/params.config index ac64613..b17baa2 100644 --- a/params.config +++ b/params.config @@ -1,27 +1,27 @@ params { - # Protein fasta input + // Protein fasta input proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" - # GFF input + // GFF input gffFile = "${baseDir}/dataset/P.vulgaris.gff3" - # Whether to run pipeline in debug mode or not + // Whether to run pipeline in debug mode or not debug = true - # Whether to check and clean GFF input file + // Whether to check and clean GFF input file gffclean = true - # Whether to generate stats from GFF input file + // Whether to generate stats from GFF input file gffstats = true - # Processing sizes below - # Number of protein sequences per chunk (used as fallback) + // Processing sizes below + // Number of protein sequences per chunk (used as fallback) chunkSize = 25 - # Number of protein sequences per chunk when using BLAST (or DIAMOND) - # You can normally use a far higher number if using DIAMOND + // Number of protein sequences per chunk when using BLAST (or DIAMOND) + // You can normally use a far higher number if using DIAMOND chunkBlastSize = 50 - # Number of protein sequences per chunk when using InterProScan + // Number of protein sequences per chunk when using InterProScan chunkIPSSize = 25 - # Number of protein sequences per chunk when using KofamKOALA + // Number of protein sequences per chunk when using KofamKOALA chunkKoalaSize = 50 - # Number of protein sequences per chunk when submitting to web processes (CD-Search for now) + // Number of protein sequences per chunk when submitting to web processes (CD-Search for now) chunkWebSize = 100 - # Number of chunks to be used when running in debug mode (e.g., for facllback processes this would be 5*25=125 protein sequences) + // Number of chunks to be used when running in debug mode (e.g., for facllback processes this would be 5*25=125 protein sequences) debugSize = 5 evalue = "0.00001" diamond = true @@ -48,7 +48,7 @@ params { mysqlimg = "docker://library/mariadb:10.3" loglevel = "info" email = "yourmail@yourdomain" - # Uncomment lines below to skip those analyses - #skip_cdSearch = true - #skip_sigtarp = true + // Uncomment lines below to skip those analyses + //skip_cdSearch = true + //skip_sigtarp = true } From bcc538f975f577ad2e05470f707e2bc60a1b7d3b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:33:44 +0200 Subject: [PATCH 259/381] Update params.config --- params.config | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/params.config b/params.config index b17baa2..8d6cee6 100644 --- a/params.config +++ b/params.config @@ -26,17 +26,19 @@ params { evalue = "0.00001" diamond = true blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" + // Instance from where to retrieve GO mappings. You can set up your own at: https://github.com/toniher/gogoAPI + gogourl = "http://gogo.test.crg.eu/api" + // Maximum number of hits to consider (up to 30 by default)) + // gogohits = 30 + // Modes of retrieval from BLAST matches (common, most, all) blastAnnotMode = "common" speciesName = "P.vulgaris" + // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" - resultPath = "${baseDir}/results/" - stdoutLog = "${baseDir}/logs/functional_annotation.stdout" - stderrLog = "${baseDir}/logs/functional_annotation.stderr" kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" kolist = "/nfs/db/kegg/ko_list" koprofiles = "/nfs/db/kegg/profiles" koentries = "" - gogourl = "http://gogo.test.crg.eu/api" ipscantmp = "${baseDir}/tmp/" dbEngine = "MySQL" dbname = "Pvulgaris" @@ -46,8 +48,15 @@ params { mysqldata = "${baseDir}/mysql/" mysqllog = "${baseDir}/tmp" mysqlimg = "docker://library/mariadb:10.3" + // Where results are stored + resultPath = "${baseDir}/results/" + // Where log files are stored + stdoutLog = "${baseDir}/logs/functional_annotation.stdout" + stderrLog = "${baseDir}/logs/functional_annotation.stderr" + // Logging verbosity for some data upload processes loglevel = "info" - email = "yourmail@yourdomain" + // Uncomment and put your mail if your setup allows sending emails + //email = "yourmail@yourdomain" // Uncomment lines below to skip those analyses //skip_cdSearch = true //skip_sigtarp = true From bf7eb7d6342feaabc93304c80e5c7268c79232c4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:34:13 +0200 Subject: [PATCH 260/381] Update params.config --- params.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/params.config b/params.config index 8d6cee6..0f1bac6 100644 --- a/params.config +++ b/params.config @@ -26,7 +26,7 @@ params { evalue = "0.00001" diamond = true blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" - // Instance from where to retrieve GO mappings. You can set up your own at: https://github.com/toniher/gogoAPI + // Instance from where to retrieve GO mappings. You can set up your own from: https://github.com/toniher/gogoAPI gogourl = "http://gogo.test.crg.eu/api" // Maximum number of hits to consider (up to 30 by default)) // gogohits = 30 From 8a085b533449ef6a17171732a8782975733f0921 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 11:41:20 +0200 Subject: [PATCH 261/381] Update params.config --- params.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/params.config b/params.config index 0f1bac6..c4a851b 100644 --- a/params.config +++ b/params.config @@ -35,11 +35,12 @@ params { speciesName = "P.vulgaris" // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" + // Directory where to store intermediary Interproscan files (ensure there is enough space) + ipscantmp = "${baseDir}/tmp/" kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" kolist = "/nfs/db/kegg/ko_list" koprofiles = "/nfs/db/kegg/profiles" koentries = "" - ipscantmp = "${baseDir}/tmp/" dbEngine = "MySQL" dbname = "Pvulgaris" dbuser = "test" From 0baddc871eb9ae88fb44a39b2abeafb606323209 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 12:12:05 +0200 Subject: [PATCH 262/381] more verbose config --- README.md | 2 +- main.nf | 7 +++++-- params.config | 36 +++++++++++++++++++++++++----------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 94b83c4..ead2c71 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ The relevant paremetres below: dbuser = "test" # Database user password dbpass = "test" - # Port of the MySQL engine + # Port of the MySQL engine (3306 default) dbport = 12345 # The host where the MySQL engine is located. Skip it if using the wrapper below dbhost = 0.0.0.0 diff --git a/main.nf b/main.nf index 79da323..ddfaae8 100644 --- a/main.nf +++ b/main.nf @@ -33,11 +33,13 @@ // default parameters params.help = false params.debug = false -params.dbEngine = "mysql" // SQLite otherwise +params.dbEngine = "SQLite" // MySQL otherwise // Main input files params.proteinFile = null; params.gffFile = null; +params.speciesName = "organism" +params.dbname = "organismDB" // Main result and log dirs params.resultPath = "${baseDir}/results/" @@ -66,6 +68,7 @@ params.kolist = "" params.koprofiles = "" params.koentries = "" params.kegg_release = null +params.kegg_species = "hsa, dme, cel, ath" // Params for InterProScan // Temporary location for InterproScan intermediary files. This can be huge @@ -204,7 +207,7 @@ if ( params.blastFile ) { } log.info "Species name : ${params.speciesName}" -log.info "KEGG species : ${params.kegg_species}" +log.info "KEGG species : ${params.kegg_species}" if ( mysql ) { log.info "MySQL FA database : ${params.dbname}" diff --git a/params.config b/params.config index c4a851b..f026975 100644 --- a/params.config +++ b/params.config @@ -4,7 +4,7 @@ params { // GFF input gffFile = "${baseDir}/dataset/P.vulgaris.gff3" // Whether to run pipeline in debug mode or not - debug = true + debug = "true" // Whether to check and clean GFF input file gffclean = true // Whether to generate stats from GFF input file @@ -25,6 +25,7 @@ params { debugSize = 5 evalue = "0.00001" diamond = true + // Blast DB. Details to retrieve from: https://github.com/toniher/biomirror/tree/master/files/ncbi blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" // Instance from where to retrieve GO mappings. You can set up your own from: https://github.com/toniher/gogoAPI gogourl = "http://gogo.test.crg.eu/api" @@ -37,18 +38,31 @@ params { oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" + // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" + // Profiles and KEGG codes list from ftp://ftp.genome.jp/pub/db/kofam/ kolist = "/nfs/db/kegg/ko_list" koprofiles = "/nfs/db/kegg/profiles" + // KO entries. Can be retrieved in advance using: https://github.com/toniher/biomirror/tree/master/files/kegg koentries = "" - dbEngine = "MySQL" + // Database engine. Specify MySQL (otherwise 'SQLite' will be used) + // dbEngine = "MySQL" + // Database name. If it does not exist, if the user has enough permissions it will be created dbname = "Pvulgaris" - dbuser = "test" - dbpass = "test" - dbport = 12345 - mysqldata = "${baseDir}/mysql/" - mysqllog = "${baseDir}/tmp" - mysqlimg = "docker://library/mariadb:10.3" + // Database user name + // dbuser = "test" + // Database user password + // dbpass = "test" + // Port of the MySQL engine (3306 default) + // dbport = 12345 + // The host where the MySQL engine is located. Skip it if using the MySQL wrapper + // dbhost = 0.0.0.0 + // If using the wrapper below, where MySQL data will be stored + // mysqldata = "${baseDir}/mysql/" + // If using the wrapper below, where MySQL instance logs will be stored + // mysqllog = "${baseDir}/tmp/" + // If using the wrapper below, which Singularity/Docker image will be used + // mysqlimg = "docker://library/mariadb:10.3" // Where results are stored resultPath = "${baseDir}/results/" // Where log files are stored @@ -57,8 +71,8 @@ params { // Logging verbosity for some data upload processes loglevel = "info" // Uncomment and put your mail if your setup allows sending emails - //email = "yourmail@yourdomain" + // email = "yourmail@yourdomain" // Uncomment lines below to skip those analyses - //skip_cdSearch = true - //skip_sigtarp = true + // skip_cdSearch = true + // skip_sigtarp = true } From 2df81d46fadb8c85962128465c50aaa99acf3cc1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 12:13:33 +0200 Subject: [PATCH 263/381] Update params.config --- params.config | 1 + 1 file changed, 1 insertion(+) diff --git a/params.config b/params.config index f026975..7a221d9 100644 --- a/params.config +++ b/params.config @@ -1,3 +1,4 @@ +// Uncomment or modify the parameters below to fit your dataset and setup choices params { // Protein fasta input proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" From c3b10826834d4203ae6630029a1e7d8ea66f85a2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 12:14:34 +0200 Subject: [PATCH 264/381] Update README.md --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index ead2c71..7da311f 100644 --- a/README.md +++ b/README.md @@ -42,33 +42,33 @@ The example of configuration file is included into this repository with name ``` Most parameters are self-explanatory. We highlight some below and in upcoming sections: ``` - # Protein fasta input + // Protein fasta input proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" - # GFF input + // GFF input gffFile = "${baseDir}/dataset/P.vulgaris.gff3" ``` When approaching a new dataset, we suggest to run first the pipeline in **debug** mode (provided as such in example params config). This will analyze a limited number of protein entries. This way you may save time and troubleshoot some potential problems in your input files. ``` - # Whether to run pipeline in debug mode or not + // Whether to run pipeline in debug mode or not debug = "true" ``` One of the strenghts of Nextflow is allowing the parallelization and merging of several processes. In our case, input protein FASTA file is split and its sequences are delievered to the different used applications in chunks. For a quick processing, the optimal size of these chunks is not the same for each target application, and it can also depend on the setup of your HPC environment or network health. This can be tuned using the parameters below: ``` - # Number of protein sequences per chunk (used as fallback) + // Number of protein sequences per chunk (used as fallback) chunkSize = 25 - # Number of protein sequences per chunk when using BLAST (or DIAMOND) + // Number of protein sequences per chunk when using BLAST (or DIAMOND) chunkBlastSize = 50 - # Number of protein sequences per chunk when using InterProScan + // Number of protein sequences per chunk when using InterProScan chunkIPSSize = 25 - # Number of protein sequences per chunk when using KofamKOALA + // Number of protein sequences per chunk when using KofamKOALA chunkKoalaSize = 50 - # Number of protein sequences per chunk when submitting to web processes (CD-Search for now) + // Number of protein sequences per chunk when submitting to web processes (CD-Search for now) chunkWebSize = 100 - # Number of chunks to be used when running in debug mode (e.g., for facllback processes this would be 5*25=125 protein sequences) + // Number of chunks to be used when running in debug mode (e.g., for facllback processes this would be 5*25=125 protein sequences) debugSize = 5 ``` @@ -119,14 +119,14 @@ Moreover, we are also providing a web API for retrieving protein-GO mapping from When using the second option, you can tune it with the parameters below: ``` - # Instance from where to retrieve GO mappings + // Instance from where to retrieve GO mappings gogourl = "http://myinstance.example.com/api" - # Maximum number of hits to consider (up to 30 by default)) + // Maximum number of hits to consider (up to 30 by default)) gogohits = 30 - # Modes of retrieval from BLAST matches - * Common: Only GO entries appearing in all matches - * Most: Only GO entries appearing in more than half of matches - * All: All GO entries appearing in all matches + // Modes of retrieval from BLAST matches + // * Common: Only GO entries appearing in all matches + // * Most: Only GO entries appearing in more than half of matches + // * All: All GO entries appearing in all matches blastAnnotMode = "common" ``` From c65f274ca56652f6307f630df28a9271bb918601 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 18:00:28 +0200 Subject: [PATCH 265/381] Update TODO.md --- TODO.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index f1c1a8c..7a25a51 100644 --- a/TODO.md +++ b/TODO.md @@ -1,11 +1,12 @@ * Log directory check -* Singularity file for run_mysql wrapper process +* Uncompress input files on the fly * Initial check for FASTA file * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Include some testing and CI * Visualization of results * Venn Diagrams --- +* Singularity file for run_mysql wrapper process * Allow conversion from GenBank https://metacpan.org/pod/bp_genbank2gff3.pl * Allow reports from KEGG orthologs (number of potential orthologs from KEGG species) * blast_hit reconsider From 2bb8384a1e6d9514bcbfb61ae097cd6edfeaa99e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 18:59:48 +0200 Subject: [PATCH 266/381] download images --- README.md | 5 ++++- nextflow.config | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7da311f..b90a366 100644 --- a/README.md +++ b/README.md @@ -261,7 +261,6 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola *Ensure you have an up-to-date version of Singularity. Otherwise you may need to clean some Singularity directories, the singularity one (where pipeline images are stored) in FA-nf base directory and ```.singularity``` in your ```$HOME``` directory.* - **Just after starting the pipeline, it stops and I get a message such as ```Something went wrong. No supported configuration file syntax found at /your/path/lib/site_perl/5.26.2/Config/Simple.pm line 184, line 23.```** *Check line **23** (or the number you have) of your params.config if you have any syntax error (e.g., new line, additional quote character, etc.)* @@ -278,3 +277,7 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola **When using MySQL database mode with Singularity wrapper, it does not start and it complains it is locked** *Ensure no Singularity process is running on the contents of the selected MySQL directory. If it is not the case and it is still failing, copy the contents in another directory and run it from there instead* + +**My HPC infrastructure cannot access the Internet. Can I use the pipeline?** + +*Yes, as far as you skip CD-Search analyses (```skip_cdSearch = true```), you can use it by pre-downloading container images first (assuming Singularity) and replacing container values in ```nextflow.config``` for their path in your filesystem. You can download singularity images for latter placing them in your filesystem with a command like this: ```singularity pull kofamscan-1.2.0.sif docker://quay.io/biocontainers/kofamscan:1.2.0--0```.* diff --git a/nextflow.config b/nextflow.config index f81a8a4..3adc2fb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,6 +7,8 @@ includeConfig "${params.config ?: 'params.config'}" // Adapt queue entries below to match your infrastructure. If unsure, simply comment them with '//' // More details at: https://www.nextflow.io/docs/latest/config.html +// If your queue system does not have access to Internet, you will need to download container images in advance +// and replace it in the different container properties of the different processes process{ queue='biocore-el7,long-sl7,short-sl7' From c4aae532d385c820e67ab5ba1a5e3ae171aa9c73 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 19:01:00 +0200 Subject: [PATCH 267/381] later --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b90a366..48c2548 100644 --- a/README.md +++ b/README.md @@ -280,4 +280,4 @@ The base container is [available in Docker Hub](https://hub.docker.com/r/guigola **My HPC infrastructure cannot access the Internet. Can I use the pipeline?** -*Yes, as far as you skip CD-Search analyses (```skip_cdSearch = true```), you can use it by pre-downloading container images first (assuming Singularity) and replacing container values in ```nextflow.config``` for their path in your filesystem. You can download singularity images for latter placing them in your filesystem with a command like this: ```singularity pull kofamscan-1.2.0.sif docker://quay.io/biocontainers/kofamscan:1.2.0--0```.* +*Yes, as far as you skip CD-Search analyses (```skip_cdSearch = true```), you can use it by pre-downloading container images first (assuming Singularity) and replacing container values in ```nextflow.config``` for their path in your filesystem. You can download singularity images for later placing them in your filesystem with a command like this: ```singularity pull kofamscan-1.2.0.sif docker://quay.io/biocontainers/kofamscan:1.2.0--0```.* From 9c708d9d510507179d0983c1ee0b754dc036d725 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 15 Jul 2021 19:08:45 +0200 Subject: [PATCH 268/381] adding LICENSE --- LICENSE | 675 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 675 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6b156fe --- /dev/null +++ b/LICENSE @@ -0,0 +1,675 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + From 15b6f0575bda19495c6fc0dfe0a081cf4596baac Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 16 Jul 2021 09:04:50 +0200 Subject: [PATCH 269/381] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 48c2548..7c1401c 100644 --- a/README.md +++ b/README.md @@ -186,23 +186,23 @@ Running in MySQL mode improves the speed of the pipeline, but some care must be The relevant paremetres below: ``` - # Database engine. Specify MySQL (otherwise 'SQLite' will be used) + // Database engine. Specify MySQL (otherwise 'SQLite' will be used) dbEngine = "MySQL" - # Database name. If it does not exist, if the user has enough permissions it will be created + // Database name. If it does not exist, if the user has enough permissions it will be created dbname = "Pvulgaris" - # Database user name + // Database user name dbuser = "test" - # Database user password + // Database user password dbpass = "test" - # Port of the MySQL engine (3306 default) + // Port of the MySQL engine (3306 default) dbport = 12345 - # The host where the MySQL engine is located. Skip it if using the wrapper below + // The host where the MySQL engine is located. Skip it if using the wrapper below dbhost = 0.0.0.0 - # If using the wrapper below, where MySQL data will be stored + // If using the wrapper below, where MySQL data will be stored mysqldata = "${baseDir}/mysql/" - # If using the wrapper below, where MySQL instance logs will be stored + // If using the wrapper below, where MySQL instance logs will be stored mysqllog = "${baseDir}/tmp/" - # If using the wrapper below, which Singularity/Docker image will be used + // If using the wrapper below, which Singularity/Docker image will be used mysqlimg = "docker://library/mariadb:10.3" ``` From 18dccb9ced35bccaae2286a25d8b9450b8bf3158 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 11:53:58 +0200 Subject: [PATCH 270/381] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7c1401c..f98467f 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,8 @@ For skipping these applications, the following lines can be added in the configu skip_sigtarp = true ``` +In the provided example ```params.config``` file we keep these two lines uncommented. + ### Dataset resources For downloading and formatting diferent datasets used by the programs part of this pipeline, [some scripts are provided here](https://github.com/toniher/biomirror/) for convenience. From 25923d49f50eb4cdc63830cefa2894a9f98b9f1a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 11:54:53 +0200 Subject: [PATCH 271/381] Update params.config --- params.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/params.config b/params.config index 7a221d9..7448337 100644 --- a/params.config +++ b/params.config @@ -73,7 +73,7 @@ params { loglevel = "info" // Uncomment and put your mail if your setup allows sending emails // email = "yourmail@yourdomain" - // Uncomment lines below to skip those analyses - // skip_cdSearch = true - // skip_sigtarp = true + // Comment the lines below to skip those analyses + skip_cdSearch = true + skip_sigtarp = true } From 2f14c9822e882d6b55b2e68404f7ddd4d7df0e81 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 11:55:21 +0200 Subject: [PATCH 272/381] Update params.config --- params.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/params.config b/params.config index 7448337..7cf74cb 100644 --- a/params.config +++ b/params.config @@ -73,7 +73,7 @@ params { loglevel = "info" // Uncomment and put your mail if your setup allows sending emails // email = "yourmail@yourdomain" - // Comment the lines below to skip those analyses + // Comment the lines below to execute those analyses skip_cdSearch = true skip_sigtarp = true } From 602c862de04bb44bdfa7be9dc166dcd2ecf9b87a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 12:49:33 +0200 Subject: [PATCH 273/381] fixes conf --- main.nf | 2 +- params.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index ddfaae8..ae8b859 100644 --- a/main.nf +++ b/main.nf @@ -418,7 +418,7 @@ process initDB { script: command = "mkdir -p $params.resultPath\n" - command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' > configt\n" + command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' | sed '/^\s*\/\//d' > configt\n" command += "export escaped=\$(echo '$baseDir')\n" command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" diff --git a/params.config b/params.config index 7cf74cb..aa4ee89 100644 --- a/params.config +++ b/params.config @@ -47,7 +47,7 @@ params { // KO entries. Can be retrieved in advance using: https://github.com/toniher/biomirror/tree/master/files/kegg koentries = "" // Database engine. Specify MySQL (otherwise 'SQLite' will be used) - // dbEngine = "MySQL" + dbEngine = "SQLite" // Database name. If it does not exist, if the user has enough permissions it will be created dbname = "Pvulgaris" // Database user name From 0b78eeb950485becd9c450124995545981cb294b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 12:54:35 +0200 Subject: [PATCH 274/381] fix escaping --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index ae8b859..bc930dc 100644 --- a/main.nf +++ b/main.nf @@ -418,7 +418,7 @@ process initDB { script: command = "mkdir -p $params.resultPath\n" - command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' | sed '/^\s*\/\//d' > configt\n" + command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' | sed '/^\\s*\\/\\//d' > configt\n" command += "export escaped=\$(echo '$baseDir')\n" command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" From 71d582e9a073f70af552046b055b04adc2899b2a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 14:45:39 +0200 Subject: [PATCH 275/381] remove P.vulgaris to retrieve from standard sources --- dataset/P.vulgaris.gff3.gz | Bin 3396 -> 0 bytes dataset/P.vulgaris.proteins.fa.gz | Bin 5063 -> 0 bytes dataset/README.md | 7 ------- 3 files changed, 7 deletions(-) delete mode 100644 dataset/P.vulgaris.gff3.gz delete mode 100644 dataset/P.vulgaris.proteins.fa.gz diff --git a/dataset/P.vulgaris.gff3.gz b/dataset/P.vulgaris.gff3.gz deleted file mode 100644 index bd9cae37db6bca6c1388c19b83a08d120e0e85fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3396 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 aW^=q7Gz!l}O~ diff --git a/dataset/P.vulgaris.proteins.fa.gz b/dataset/P.vulgaris.proteins.fa.gz deleted file mode 100644 index 0d9887bfbe19159f9c9987d5a9dd6908673989ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5063 zcmV;&6FBT2iwFquCqiHV15hq@b!=y0a%poeaB^>SWod46E@oi>y_(66Bsp@1@BSz{ zb@f_(8Gv%GppoDPI{5xCqR*mg25Ob74;nz(iO#Hua5`zUf1~F=S~N5Lr!(ctPyQ$U z`qI8!B^k*+>=|5$XY#|WCE|U$&Dq8r^UNnS36G>UUAm{ZJ-i7$th&whj~_<;g;7PC zF}I{y?Or*{9j1-LJZFt?x0z3PjFA<@$Vtij*+L0xw`cFlO-_?>M!5DJLNari{V8F<$JGMM+Ju&S?qQDvW4BDko+0!ulKjO&<~CxuE`+^8VIRbW@h}G?vbJ8rM_LfRmh8RK3?rOr z_#of1i*J`re#oXQOJbMa?b)uFAtSgc!zA&;CDSUK#WIbRkOspU@kz`y(@S7>*J`aB z`vfVexH@Lwj-B-^R+SRNP)gf=tjL$2wIXdsBQ>Yt-4J8TNMfyHtU*7;Y;s;QQ?fPe zP*y%xcCBJ}@T}&@HZkvX?M2U2E4H8dxY;F!Njt1znRw1=j<9lC;w4+##hv8n6xysOxe4nI&WsyUCA}G1eYb$D2?0DXjCUtmpmmi_4L+wUw&hOd(%~0 zLdm<^IH_!1!JEyd?6U9W_niK(7+SuGGh>3Gx!3lkmP`Ed6tf2}vy?k}FbOU|hItsP zOg=yx?&emmsj%B{H zxw*44I0aFq(C)W2Paaacdt}-iFCXXft4_cmW|ZBeoO*1meF`{sY$h|6W389B75%9z zT65UZS$H+jhE2!q?4){YXV2oNu!zjmCd17$oJ@v=N=>GqaBWW#Cggmm=5XeNBreQ3 z^a%QW-I8SH?8@mRJcK{}uK7G!`RvCqYpY`yenKz;XY40G-F3CyG zW4&*E_@}k(@76DnPA8Ri?kKLyzlTZ1_NAO@OG_ik^erNlCv~7VWpEu>%Bi2ebBCrZ#_8 z<5H75S}?20lG5siPPG?RwuctYX1cc-e+XO3$R#=`r$(@_hBBjL-Oa)EhQ4uqR7LKj zw^Mww>1{LSdYqv@Qg+#2jX8nZ%nQ?nfFM`;9HQjIypkIlby(cYCMv1TwS0#>CFB6C zUJLs5|1iDr|2Dl}w6%(H$flo(pOPRmgZy!&q5tXLLt{59OEpg*J5=17-qD~~k?6sU z>6LsT3c$lz-ge&IeF2%gxd7Qiy}(068P=@K(~r{&gQScWLOHx^j2*a?Yl^bi246sH z;5}BvXiPip-eKejrfW)0q_keqJ&P-um>z(ZC<;Y{b2G&6tDOT_-zZlu&%PPNdYfS8 zlyX8zO|{*c)?)8fY7wg-?3KmPxG%-}fMaLHVK3YH(09g{Ktfm!C~Z3KY!FrIqa?p4 zwAZQ{oNNM>00?`}Qp3e&sl*yAjoa9Qw($b!JLYKEkQ)+<2Lv+UkmB?SnV%JsgF*!s zpHNZ8Ytl&w(6@Vx6qFSeY++Y+C>hZ2*aqy&%5BmqQgzA}F*;PRzqQ0KA5S=EP7Qh! zP)^sjTpFf9!kSaRv!f4a-n_#Z(c5L_J^>2HFz~W*@U~oVEKP)Sf{!4P=VtePQx$9` zMWmy{N^o}ye!a{@J#w)(ZZNZi5<1LEj1

iPmAZq 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 diff --git a/dataset/README.md b/dataset/README.md index 4d465e3..8f34538 100644 --- a/dataset/README.md +++ b/dataset/README.md @@ -5,13 +5,6 @@ curl -L http://www.geneontology.org/ontology/go.obo > gene_ontology_ext.obo ## Example Dataset -### Phaesolus vulgaris (plant) - -Ref: https://doi.org/10.1186/s13059-016-0883-6 - -* P.vulgaris.gff3.gz -* P.vulgaris.proteins.fa.gz - ### Microcaecilia unicolor (amphibian) Ref: https://www.ncbi.nlm.nih.gov/assembly/GCF_901765095.1 From c29008341eacbc5c2c8adc0db09bb42ba823bad4 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 14:49:59 +0200 Subject: [PATCH 276/381] ignore comments --- run_pipeline_mysql.pl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/run_pipeline_mysql.pl b/run_pipeline_mysql.pl index 7eeb604..223f90b 100644 --- a/run_pipeline_mysql.pl +++ b/run_pipeline_mysql.pl @@ -94,6 +94,10 @@ $_=~s/\s*\=\s*/:/g; + if ( $_=~/^\s*\/\// ) { + next; + } + $strFile = $strFile. $_; } From 9afac80b5db5389aa0b3b30f7eb4845c96eb6a89 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 22 Jul 2021 15:13:47 +0200 Subject: [PATCH 277/381] update params --- README.md | 7 ++++++- params.config | 10 +++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f98467f..8bc9664 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ The relevant paremetres below: // If using the wrapper below, where MySQL instance logs will be stored mysqllog = "${baseDir}/tmp/" // If using the wrapper below, which Singularity/Docker image will be used - mysqlimg = "docker://library/mariadb:10.3" + mysqlimg = "https://biocore.crg.eu/singularity/mariadb-10.3.sif" ``` **Note**: when running a different analysis, take care to use a different ```dbname``` for avoiding unexpected problems. @@ -220,6 +220,11 @@ It is also possible to pass additional Nextflow parameters nohup perl run_pipeline_mysql.pl -params "-with-dag -with-report -with-timeline" -conf ./params.config &> log.mysql & +The Singularity recipe for the database container image is the ```Singularity.mysql``` file in the root of the repository and can be generated as shown below: + +``` + sudo singularity build mariadb-10.3.sif Singularity.mysql +``` #### Inspection of MySQL database diff --git a/params.config b/params.config index aa4ee89..d787421 100644 --- a/params.config +++ b/params.config @@ -1,9 +1,9 @@ // Uncomment or modify the parameters below to fit your dataset and setup choices params { // Protein fasta input - proteinFile = "${baseDir}/dataset/P.vulgaris.proteins.fa" + proteinFile = "${baseDir}/dataset/aMicUni.selected_proteins.fa.gz" // GFF input - gffFile = "${baseDir}/dataset/P.vulgaris.gff3" + gffFile = "${baseDir}/dataset/aMicUni.selected_genes.gff.gz" // Whether to run pipeline in debug mode or not debug = "true" // Whether to check and clean GFF input file @@ -34,7 +34,7 @@ params { // gogohits = 30 // Modes of retrieval from BLAST matches (common, most, all) blastAnnotMode = "common" - speciesName = "P.vulgaris" + speciesName = "M.unicolor" // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Directory where to store intermediary Interproscan files (ensure there is enough space) @@ -49,7 +49,7 @@ params { // Database engine. Specify MySQL (otherwise 'SQLite' will be used) dbEngine = "SQLite" // Database name. If it does not exist, if the user has enough permissions it will be created - dbname = "Pvulgaris" + dbname = "aMicUni" // Database user name // dbuser = "test" // Database user password @@ -63,7 +63,7 @@ params { // If using the wrapper below, where MySQL instance logs will be stored // mysqllog = "${baseDir}/tmp/" // If using the wrapper below, which Singularity/Docker image will be used - // mysqlimg = "docker://library/mariadb:10.3" + // mysqlimg = "https://biocore.crg.eu/singularity/mariadb-10.3.sif" // Where results are stored resultPath = "${baseDir}/results/" // Where log files are stored From 3a286d36d0ba610729bf904b0ff690152431022f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 23 Jul 2021 17:23:41 +0200 Subject: [PATCH 278/381] Update README.md --- dataset/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dataset/README.md b/dataset/README.md index 8f34538..ca689f7 100644 --- a/dataset/README.md +++ b/dataset/README.md @@ -3,9 +3,11 @@ ## Gene Ontology OBO curl -L http://www.geneontology.org/ontology/go.obo > gene_ontology_ext.obo -## Example Dataset +## Test datasets -### Microcaecilia unicolor (amphibian) +Below we provide a couple of modified reduced datasets to test the pipeline. They can be run in short time and using ```SQLite``` as database engine. + +### Microcaecilia unicolor (amphibian) Ref: https://www.ncbi.nlm.nih.gov/assembly/GCF_901765095.1 @@ -19,5 +21,7 @@ Ref: https://fungi.ensembl.org/Rhodotorula_toruloides_gca_001255795/Info/Index * Rhodotorula_toruloides.selected_genes.gff3.gz * Rhodotorula_toruloides.selected_proteins.fa.gz +## Example datasets +As closer to real life cases, configuration, input and output files of examples mentioned in *Vlasova A. (2001)* can be found [here](https://biocore.crg.eu/papers/FA-nf-2021/). From 1d0fda9864fdc0f3faf4daf1a023b1b19503dc90 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 23 Jul 2021 17:24:32 +0200 Subject: [PATCH 279/381] Update README.md --- dataset/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataset/README.md b/dataset/README.md index ca689f7..8043134 100644 --- a/dataset/README.md +++ b/dataset/README.md @@ -23,5 +23,5 @@ Ref: https://fungi.ensembl.org/Rhodotorula_toruloides_gca_001255795/Info/Index ## Example datasets -As closer to real life cases, configuration, input and output files of examples mentioned in *Vlasova A. (2001)* can be found [here](https://biocore.crg.eu/papers/FA-nf-2021/). +As closer to real life cases, configuration, input and output files of examples mentioned in *Vlasova A. (2021)* can be found [here](https://biocore.crg.eu/papers/FA-nf-2021/). From f1ee23c409858304bc7eda202628ce15accc70d6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 24 Jul 2021 14:16:18 +0200 Subject: [PATCH 280/381] Update README.md --- dataset/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataset/README.md b/dataset/README.md index 8043134..4fa7c1b 100644 --- a/dataset/README.md +++ b/dataset/README.md @@ -23,5 +23,5 @@ Ref: https://fungi.ensembl.org/Rhodotorula_toruloides_gca_001255795/Info/Index ## Example datasets -As closer to real life cases, configuration, input and output files of examples mentioned in *Vlasova A. (2021)* can be found [here](https://biocore.crg.eu/papers/FA-nf-2021/). +Closer to real life cases with configuration, input and output files of the examples mentioned in *Vlasova A. (2021)* can be found [here](https://biocore.crg.eu/papers/FA-nf-2021/). From 8a8783700ad326110059c5835de23ebf771346d7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 24 Jul 2021 14:38:58 +0200 Subject: [PATCH 281/381] Update README.md --- README.md | 71 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 8bc9664..7a14cbb 100644 --- a/README.md +++ b/README.md @@ -9,25 +9,62 @@ The pipeline uses a set of well characterised software to assign functional info The software used in this pipeline is mostly free software for academic users. For the software from the Center for Biological Sequence (CBS), i.e. signalP, a suitable license agreement should be obtained. More details about how to use this software in the *Associated containers* section at the end of this page. ## Installation -The pipeline is build on Nextflow as a woking engine, so it need to be installed first +The pipeline is built on Nextflow as a woking engine, so it need to be installed first: ``` export NXF_VER=20.10.0; curl -s https://get.nextflow.io | bash ``` The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) +You can place the Nextflow binary somewhere in your ```PATH``` or in the same location as where you are going to run the pipeline. + +If you want to use the ```latest``` version you can clone the last commit of the repository: + +``` +git clone --–depth 1 https://github.com/guigolab/FA-nf +``` + +Alternately you can clone the whole repository and choose the tag you want with ```git checkout``` command, or download a specific release from: https://github.com/guigolab/FA-nf/releases + +### Associated containers + +We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://singularity.hpcng.org/) (the latter preferred). + +The software used all along this pipeline is encapsulated in several containers: + +As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. + +* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build container image first. Please check **sigtarp** process in ```nextflow.config```) +* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build container image fisrt. Please check **ipscan** process in ```nextflow.config```. Two versions are available: one with privative software and one without) + +### How to build base container + +The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. + +``` + # Generate Docker image + docker build -t fa-nf . + + # Generate Singularity image if preferred + sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest +``` + ## Running the pipeline -The annotation itself, when various software is excuted and the results are stored in an internal database. +The annotation process consists of different programs which, once they are executed and finished, store their results in an internal database. + +Result files, including a main annotation file in GFF format and diferent annotation reports, are generated at the last steps of the pipeline. -Result files, including a main annotation file in gff format and annotation report, are generated at the end of the pipeline. +First of all, users need to adapt ```nextflow.config``` and ```params.config``` to fit their HPC system and the location of the necessary datasets. Users need to download (and index when necessary) BLAST, Interproscan and KEGG datasets and point where they are located in ```params.config``` file. This explained in the sections below. -The annotation step can be launched by using the following command: +Once the datasets are prepared, the whole annotation process can be launched by using the following command: ``` ./nextflow run -bg main.nf --config params.config &> logfile ``` +This executes this Nextflow pipeline in the background and its progress can be followed by inspecting ```logfile```. It can be done in real time with ```tail -f logfile``` command. + ## Pipeline parameters ### `-resume` @@ -133,7 +170,7 @@ When using the second option, you can tune it with the parameters below: ### KEGG orthology groups Predictions of the KEGG orthology groups (KO) can be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/) or using a previously set-up version of [KofamKOALA](https://www.genome.jp/tools/kofamkoala/). -For KofamKOLA, adjust the parameters below to match the location in your system ([FTP source](ftp://ftp.genome.jp/pub/db/kofam/)) +For KofamKOLA, adjust the parameters below to match the location in your system (ftp://ftp.genome.jp/pub/db/kofam/) ``` kolist = "/nfs/db/kegg/ko_list" @@ -163,6 +200,7 @@ In the provided example ```params.config``` file we keep these two lines uncomme For downloading and formatting diferent datasets used by the programs part of this pipeline, [some scripts are provided here](https://github.com/toniher/biomirror/) for convenience. + ## Result files Below you can check all the possibly available files in results directory (defined with ```resultPath``` parameter) at the end of the pipeline execution. Some files may not be there if certain options are switched (e.g., if GFF cleaning is skipped with ```gffclean = "false"```). @@ -238,29 +276,6 @@ for further options or details, run: perl run_pipeline_mysql.pl -h -## Associated containers - -We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://sylabs.io/singularity/) (the latter preferred). - -The software used all along this pipeline is encapsulated in several containers: - -As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. - -* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build container image first. Please check **sigtarp** process in ```nextflow.config```) -* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build container image fisrt. Please check **ipscan** process in ```nextflow.config```. Two versions are available: one with privative software and one without) - -### How to build base container - -The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. - -``` - # Generate Docker image - docker build -t fa-nf . - - # Generate Singularity image if preferred - sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest -``` - ## Troubleshooting **At the beginning of the pipeline execution, I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** From 4b93be068c8fb2148bc515c76937c67fc42a121e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 24 Jul 2021 14:39:39 +0200 Subject: [PATCH 282/381] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a14cbb..b07a0b2 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ As written down in ```nextflow.config``` file, whenever possible, we try to prov * [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build container image first. Please check **sigtarp** process in ```nextflow.config```) * [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build container image fisrt. Please check **ipscan** process in ```nextflow.config```. Two versions are available: one with privative software and one without) -### How to build base container +#### How to build base container The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. From a09841206ebcd1d539c78b923b92410d90f7b646 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 24 Jul 2021 14:41:12 +0200 Subject: [PATCH 283/381] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b07a0b2..58d3a56 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A pipeline for **functional annotation** of proteins from non-model organisms im The pipeline uses a set of well characterised software to assign functional information to the proteins of interests, i.e. domains, GO terms annotation, putative name and some other features. -The software used in this pipeline is mostly free software for academic users. For the software from the Center for Biological Sequence (CBS), i.e. signalP, a suitable license agreement should be obtained. More details about how to use this software in the *Associated containers* section at the end of this page. +The software used in this pipeline is mostly free software for academic users. For some software, such as signalP, a suitable license agreement should be obtained. More details about how to use this software in the *Associated containers* section. ## Installation The pipeline is built on Nextflow as a woking engine, so it need to be installed first: From 4722e2dec6392e575db0acd18ed9edbe76da30db Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 24 Jul 2021 15:32:47 +0200 Subject: [PATCH 284/381] Update README.md --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 58d3a56..cb35622 100644 --- a/README.md +++ b/README.md @@ -9,22 +9,23 @@ The pipeline uses a set of well characterised software to assign functional info The software used in this pipeline is mostly free software for academic users. For some software, such as signalP, a suitable license agreement should be obtained. More details about how to use this software in the *Associated containers* section. ## Installation -The pipeline is built on Nextflow as a woking engine, so it need to be installed first: + +If you want to use the ```latest``` version you can clone the last commit of the repository: ``` - export NXF_VER=20.10.0; curl -s https://get.nextflow.io | bash +git clone --–depth 1 https://github.com/guigolab/FA-nf ``` -The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) -You can place the Nextflow binary somewhere in your ```PATH``` or in the same location as where you are going to run the pipeline. +Alternately, and actually recommended, you can clone the whole repository and choose the tag you want with ```git checkout``` command, or download a specific release from: https://github.com/guigolab/FA-nf/releases -If you want to use the ```latest``` version you can clone the last commit of the repository: +Since the pipeline is built on Nextflow as a woking engine, it needs to be installed as well: ``` -git clone --–depth 1 https://github.com/guigolab/FA-nf + export NXF_VER=20.10.0; curl -s https://get.nextflow.io | bash ``` +The detailed procedure is described in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html) -Alternately you can clone the whole repository and choose the tag you want with ```git checkout``` command, or download a specific release from: https://github.com/guigolab/FA-nf/releases +You can place the Nextflow binary somewhere in your ```PATH``` or in the same location where the pipeline is going to be run. ### Associated containers From cc4e80017bfd7cf5b4e83bf5e17785c3e10d62e1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 28 Jul 2021 13:44:51 +0200 Subject: [PATCH 285/381] start download and typo --- README.md | 4 +- download.nf | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 download.nf diff --git a/README.md b/README.md index cb35622..969c30d 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ The software used in this pipeline is mostly free software for academic users. F If you want to use the ```latest``` version you can clone the last commit of the repository: ``` -git clone --–depth 1 https://github.com/guigolab/FA-nf +git clone --depth 1 https://github.com/guigolab/FA-nf . ``` -Alternately, and actually recommended, you can clone the whole repository and choose the tag you want with ```git checkout``` command, or download a specific release from: https://github.com/guigolab/FA-nf/releases +Alternately, and actually recommended, you can clone the whole repository and choose the tag you want with ```git checkout``` command, or download a specific release from: https://github.com/guigolab/FA-nf/releases Since the pipeline is built on Nextflow as a woking engine, it needs to be installed as well: diff --git a/download.nf b/download.nf new file mode 100644 index 0000000..1a89989 --- /dev/null +++ b/download.nf @@ -0,0 +1,116 @@ +#!/usr/bin/env nextflow + +/* + * Copyright (c) 2017-2021, Centre for Genomic Regulation (CRG) + * + * Copyright (c) 2021, Toni Hermoso Pulido + * + * Functional Annotation Pipeline for protein annotation from non-model organisms + * from Genome Annotation Team in Catalonia (GATC) implemented in Nextflow + * + * 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 3 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, see . + */ + + +// default parameters +params.help = false + +// Main result and log dirs +params.dbPath = "/nfs/db" + +// Version +params.ipscanVersion = "5.48-83.0" +params.koVersion = "2021-05-02" + +// URLs +params.ipscanURL = "https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/${params.ipscanVersion}/interproscan-${params.ipscanVersion}-64-bit.tar.gz " +params.koURLlist = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/ko_list.gz" +params.koURLprofiles = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/profiles.tar.gz" + +// File with GO information, otherwise is downloaded +params.oboFile = null + +// Mail for sending reports +params.email = "" + +//print usage +if ( params.help ) { + log.info '' + log.info 'Functional Annotation - Download datasets pipeline' + log.info '----------------------------------------------------' + log.info '' + log.info 'Usage: ' + log.info " ./nextflow run download.nf --config params.config [options]" + log.info '' + log.info 'Options:' + log.info '-resume resume pipeline from the previous step, i.e. in case of error' + log.info '-help this message' + exit 1 +} + +if ( params.dbPath == null || params.dbPath == "" ) { + log.info "No target directory specified" + exit 1 +} + +if ( params.oboFile == "" || params.oboFile == null ) { + oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) +} else { + oboFile = params.oboFile +} + + + +def downloadURL( address, filename ) { + downFile = new File( filename ) << new URL (address).getText() + return downFile.absolutePath +} + + +// On finising +workflow.onComplete { + + println ( workflow.success ? "\nDone! Check downloaded datasets in --> $params.dbPath\n" : "Oops .. something went wrong" ) + +} + +workflow.onError { + + println( "Something went wrong" ) + +} + + +if (params.email == "yourmail@yourdomain" || params.email == "") { + log.info 'Skipping email\n' +} else { + log.info "Sending email to ${params.email}\n" + + workflow.onComplete { + + def msg = """\ + Pipeline execution summary + --------------------------- + Completed at: ${workflow.complete} + Duration : ${workflow.duration} + Success : ${workflow.success} + workDir : ${workflow.workDir} + exit status : ${workflow.exitStatus} + Error report: ${workflow.errorReport ?: '-'} + """ + .stripIndent() + + sendMail(to: params.email, subject: "[FA-nf] Download finished", body: msg) + } +} From bf163cb9f9b4f86765111f891bfe0a26d06050a9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 28 Jul 2021 14:07:15 +0200 Subject: [PATCH 286/381] more process --- download.nf | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/download.nf b/download.nf index 1a89989..21de7bb 100644 --- a/download.nf +++ b/download.nf @@ -30,14 +30,19 @@ params.help = false params.dbPath = "/nfs/db" // Version -params.ipscanVersion = "5.48-83.0" +params.iprscanVersion = "5.48-83.0" params.koVersion = "2021-05-02" // URLs -params.ipscanURL = "https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/${params.ipscanVersion}/interproscan-${params.ipscanVersion}-64-bit.tar.gz " +params.iprscanURL = "https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/${params.iprscanVersion}/interproscan-${params.iprscanVersion}-64-bit.tar.gz " params.koURLlist = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/ko_list.gz" params.koURLprofiles = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/profiles.tar.gz" +// Specific DB Paths +params.dbNCBIPath = "${params.dbPath}/202105/blastdb/db" +params.dbipscanPath = "${params.dbPath}/iprscan/${params.iprscanVersion}" +params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" + // File with GO information, otherwise is downloaded params.oboFile = null @@ -70,14 +75,47 @@ if ( params.oboFile == "" || params.oboFile == null ) { oboFile = params.oboFile } - - def downloadURL( address, filename ) { downFile = new File( filename ) << new URL (address).getText() return downFile.absolutePath } +process downloadNCBI { + + label 'blast' + + +} + +process formatDIAMOND { + + label 'diamond' + + publishDir params.dbNCBIPath, mode: 'move' + + +} + +process downloadInterPro { + + publishDir params.dbipscanPath, mode: 'move' + + label 'download' + + +} + +process downloadKO { + + publishDir params.dbKOPath, mode: 'move' + + label 'download' + + +} + + // On finising workflow.onComplete { From ebbfa2c46e4218a6c45bb9def10a7ac07ab66e27 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 30 Jul 2021 19:34:14 +0200 Subject: [PATCH 287/381] extra step --- download.nf | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/download.nf b/download.nf index 21de7bb..98eedfc 100644 --- a/download.nf +++ b/download.nf @@ -106,6 +106,16 @@ process downloadInterPro { } +process formatInterPro { + + publishDir params.dbipscanPath, mode: 'move' + + label 'ipscan' + + +} + + process downloadKO { publishDir params.dbKOPath, mode: 'move' From 5035b7ae47d2207b72ce8a5b9a5235805cfdecea Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 30 Jul 2021 20:07:23 +0200 Subject: [PATCH 288/381] process --- download.nf | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/download.nf b/download.nf index 98eedfc..16d712f 100644 --- a/download.nf +++ b/download.nf @@ -85,15 +85,35 @@ process downloadNCBI { label 'blast' + input: + file params.dbNCBIList + + output: + file "*" into blastdb + + + """ + downloadNCBI.sh ${params.dbNCBIList} + """ } process formatDIAMOND { + publishDir params.dbNCBIPath, mode: 'move' + label 'diamond' - publishDir params.dbNCBIPath, mode: 'move' + input: + file params.dbNCBIList + file blastdb + + output: + file "*" into formatted_blastdb + """ + formatDIAMOND.sh ${params.dbNCBIList} + """ } @@ -122,6 +142,19 @@ process downloadKO { label 'download' + output: + file "ko_list" into ko_list + file "profiles" into ko_profiles + file "ko_store" into ko_store + + """ + wget -c -t0 ${params.koURLlist}; + gunzip ko_list.gz; + wget -c -t0 ${params.koURLprofiles}; + tar zxf ${params.koURLprofiles}; + mkdir ko_store + bulkDownloadKEGG.pl ko_list ko_store + """ } From 4944546d4643a65b493f0a07951dab5c9356c74a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 30 Jul 2021 20:23:58 +0200 Subject: [PATCH 289/381] pass info --- download.nf | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/download.nf b/download.nf index 16d712f..af7ce40 100644 --- a/download.nf +++ b/download.nf @@ -83,6 +83,25 @@ def downloadURL( address, filename ) { process downloadNCBI { + publishDir params.dbNCBIPath, mode: 'copy' + + label 'blast' + + input: + file params.dbNCBIList + + output: + file "*" into blastdb + + + """ + update_blastdb.pl ${params.dbNCBIList} + """ + +} + +process uncompressNCBI { + label 'blast' input: @@ -93,7 +112,7 @@ process downloadNCBI { """ - downloadNCBI.sh ${params.dbNCBIList} + blastdbcmd -dbtype prot -db $line -entry all -out $line.fa """ } @@ -112,7 +131,7 @@ process formatDIAMOND { file "*" into formatted_blastdb """ - formatDIAMOND.sh ${params.dbNCBIList} + diamond makedb --in ${line}.fa --db ${line} """ } From b04bd1a2b3ce9b040aedf04a7565c9209596b06d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 10:56:49 +0200 Subject: [PATCH 290/381] moving files --- download.nf | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/download.nf b/download.nf index af7ce40..844b7ca 100644 --- a/download.nf +++ b/download.nf @@ -38,6 +38,9 @@ params.iprscanURL = "https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/${params. params.koURLlist = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/ko_list.gz" params.koURLprofiles = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/profiles.tar.gz" +// NCBI DB list +params.blastDBList = "swissprot,refseq_protein" + // Specific DB Paths params.dbNCBIPath = "${params.dbPath}/202105/blastdb/db" params.dbipscanPath = "${params.dbPath}/iprscan/${params.iprscanVersion}" @@ -69,6 +72,13 @@ if ( params.dbPath == null || params.dbPath == "" ) { exit 1 } +if ( params.blastDBList == null || params.blastDBList == "" ) { + log.info "No BLAST DBs provided" + exit 1 +} + +blastDBChannel = Channel.fromList( params.blastDBList?.tokenize(',') ) + if ( params.oboFile == "" || params.oboFile == null ) { oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) } else { @@ -88,31 +98,14 @@ process downloadNCBI { label 'blast' input: - file params.dbNCBIList + val db from blastDBChannel output: - file "*" into blastdb - - - """ - update_blastdb.pl ${params.dbNCBIList} - """ - -} - -process uncompressNCBI { - - label 'blast' - - input: - file params.dbNCBIList - - output: - file "*" into blastdb - + set val(db), file ("*") into blastdb """ - blastdbcmd -dbtype prot -db $line -entry all -out $line.fa + update_blastdb.pl ${db} + blastdbcmd -dbtype prot -db ${db} -entry all -out ${db}.fa """ } @@ -124,14 +117,13 @@ process formatDIAMOND { label 'diamond' input: - file params.dbNCBIList - file blastdb + set db, file(fasta) from blastdb output: file "*" into formatted_blastdb """ - diamond makedb --in ${line}.fa --db ${line} + diamond makedb --in ${db}.fa --db ${db} """ } From 3f1bb334c80b3c87b0bfd699d50509ad63e072aa Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 11:54:04 +0200 Subject: [PATCH 291/381] update definition --- download.nf | 85 +++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/download.nf b/download.nf index 844b7ca..176a6cb 100644 --- a/download.nf +++ b/download.nf @@ -39,10 +39,13 @@ params.koURLlist = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion params.koURLprofiles = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/profiles.tar.gz" // NCBI DB list -params.blastDBList = "swissprot,refseq_protein" +params.blastDBList = "swissprot,pdbaa" +params.blastTimeout = 600 // Specific DB Paths -params.dbNCBIPath = "${params.dbPath}/202105/blastdb/db" +Date date = new Date() +String datePart = date.format("yyyyMM") +params.blastDbPath = "${params.dbPath}/ncbi/${datePart}/blastdb/db" params.dbipscanPath = "${params.dbPath}/iprscan/${params.iprscanVersion}" params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" @@ -78,22 +81,22 @@ if ( params.blastDBList == null || params.blastDBList == "" ) { } blastDBChannel = Channel.fromList( params.blastDBList?.tokenize(',') ) - -if ( params.oboFile == "" || params.oboFile == null ) { - oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) -} else { - oboFile = params.oboFile -} - -def downloadURL( address, filename ) { - downFile = new File( filename ) << new URL (address).getText() - return downFile.absolutePath -} +// +// if ( params.oboFile == "" || params.oboFile == null ) { +// oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) +// } else { +// oboFile = params.oboFile +// } +// +// def downloadURL( address, filename ) { +// downFile = new File( filename ) << new URL (address).getText() +// return downFile.absolutePath +// } process downloadNCBI { - publishDir params.dbNCBIPath, mode: 'copy' + publishDir params.blastDbPath, mode: 'copy' label 'blast' @@ -104,7 +107,7 @@ process downloadNCBI { set val(db), file ("*") into blastdb """ - update_blastdb.pl ${db} + update_blastdb.pl ${db} --timeout ${params.blastTimeout} --decompress blastdbcmd -dbtype prot -db ${db} -entry all -out ${db}.fa """ @@ -112,7 +115,7 @@ process downloadNCBI { process formatDIAMOND { - publishDir params.dbNCBIPath, mode: 'move' + publishDir params.blastDbPath, mode: 'copy' label 'diamond' @@ -127,29 +130,29 @@ process formatDIAMOND { """ } - -process downloadInterPro { - - publishDir params.dbipscanPath, mode: 'move' - - label 'download' - - -} - -process formatInterPro { - - publishDir params.dbipscanPath, mode: 'move' - - label 'ipscan' - - -} - - +// +// process downloadInterPro { +// +// publishDir params.dbipscanPath, mode: 'move' +// +// label 'download' +// +// +// } +// +// process formatInterPro { +// +// publishDir params.dbipscanPath, mode: 'move' +// +// label 'ipscan' +// +// +// } +// +// process downloadKO { - publishDir params.dbKOPath, mode: 'move' + publishDir params.dbKOPath, mode: 'copy' label 'download' @@ -159,12 +162,12 @@ process downloadKO { file "ko_store" into ko_store """ - wget -c -t0 ${params.koURLlist}; + curl --retry 3 -o ko_list.gz ${params.koURLlist}; gunzip ko_list.gz; - wget -c -t0 ${params.koURLprofiles}; - tar zxf ${params.koURLprofiles}; + curl --retry 3 -o profiles.tar.gz ${params.koURLprofiles}; + tar zxf profiles.tar.gz; rm profiles.tar.gz; mkdir ko_store - bulkDownloadKEGG.pl ko_list ko_store + perl bulkDownloadKEGG.pl ko_list ko_store """ } From 0cfd8bf67b9a483fe583c7447a29c6079712706f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 12:36:28 +0200 Subject: [PATCH 292/381] more steps --- download.nf | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/download.nf b/download.nf index 176a6cb..9de6a72 100644 --- a/download.nf +++ b/download.nf @@ -133,10 +133,17 @@ process formatDIAMOND { // // process downloadInterPro { // -// publishDir params.dbipscanPath, mode: 'move' -// // label 'download' // +// output: +// file "interproscan-${params.iprscanVersion}/data/*" into interpro_data +// +// """ +// curl --retry 3 -o iprscan.tar.gz ${params.iprscanURL}; +// tar zxf iprscan.tar.gz +// +// """ +// // // } // @@ -167,7 +174,7 @@ process downloadKO { curl --retry 3 -o profiles.tar.gz ${params.koURLprofiles}; tar zxf profiles.tar.gz; rm profiles.tar.gz; mkdir ko_store - perl bulkDownloadKEGG.pl ko_list ko_store + bulkDownloadKEGG.pl ko_list ko_store """ } From 92da341c38070ce98ef94abe113d3965ecc8e7e9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 12:56:01 +0200 Subject: [PATCH 293/381] more download --- download.nf | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/download.nf b/download.nf index 9de6a72..a3084eb 100644 --- a/download.nf +++ b/download.nf @@ -130,33 +130,25 @@ process formatDIAMOND { """ } -// -// process downloadInterPro { -// -// label 'download' -// -// output: -// file "interproscan-${params.iprscanVersion}/data/*" into interpro_data -// -// """ -// curl --retry 3 -o iprscan.tar.gz ${params.iprscanURL}; -// tar zxf iprscan.tar.gz -// -// """ -// -// -// } -// -// process formatInterPro { -// -// publishDir params.dbipscanPath, mode: 'move' -// -// label 'ipscan' -// -// -// } -// -// + +process downloadInterPro { + + publishDir params.dbipscanPath, mode: 'copy' + label 'ipscan' + + output: + file "interproscan-${params.iprscanVersion}/data/*" into interpro_data + + """ + curl --retry 3 -o iprscan.tar.gz ${params.iprscanURL}; + tar zxf iprscan.tar.gz + rm iprscan.tar.gz + cd interproscan-${params.iprscanVersion} + python3 initial_setup.py + """ + +} + process downloadKO { publishDir params.dbKOPath, mode: 'copy' From 1ee285a75b3bf720c1d72ea3880c9b3908ccc106 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 14:30:15 +0200 Subject: [PATCH 294/381] change to Folder to avoid clash --- download.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/download.nf b/download.nf index a3084eb..ac0b309 100644 --- a/download.nf +++ b/download.nf @@ -45,7 +45,7 @@ params.blastTimeout = 600 // Specific DB Paths Date date = new Date() String datePart = date.format("yyyyMM") -params.blastDbPath = "${params.dbPath}/ncbi/${datePart}/blastdb/db" +params.blastDbFolder = "${params.dbPath}/ncbi/${datePart}/blastdb/db" params.dbipscanPath = "${params.dbPath}/iprscan/${params.iprscanVersion}" params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" @@ -96,7 +96,7 @@ blastDBChannel = Channel.fromList( params.blastDBList?.tokenize(',') ) process downloadNCBI { - publishDir params.blastDbPath, mode: 'copy' + publishDir params.blastDbFolder, mode: 'copy' label 'blast' @@ -115,7 +115,7 @@ process downloadNCBI { process formatDIAMOND { - publishDir params.blastDbPath, mode: 'copy' + publishDir params.blastDbFolder, mode: 'copy' label 'diamond' From e98649b9c3e90c104a6c04577f6224f3976b45ce Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 16:08:07 +0200 Subject: [PATCH 295/381] process download --- download.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/download.nf b/download.nf index ac0b309..1e19d9f 100644 --- a/download.nf +++ b/download.nf @@ -137,7 +137,7 @@ process downloadInterPro { label 'ipscan' output: - file "interproscan-${params.iprscanVersion}/data/*" into interpro_data + file "*" into interpro_data """ curl --retry 3 -o iprscan.tar.gz ${params.iprscanURL}; @@ -145,6 +145,9 @@ process downloadInterPro { rm iprscan.tar.gz cd interproscan-${params.iprscanVersion} python3 initial_setup.py + mv interproscan-${params.iprscanVersion}/data . + rm -rf interproscan-${params.iprscanVersion} + mv data/* .; rmdir interproscan-${params.iprscanVersion} """ } From 1a162bc4040020936e92576c756a29d69a5aadde Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 17:31:37 +0200 Subject: [PATCH 296/381] obo Download --- download.nf | 31 +++++++++++++++++-------------- params.config | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/download.nf b/download.nf index 1e19d9f..caca8ec 100644 --- a/download.nf +++ b/download.nf @@ -37,6 +37,7 @@ params.koVersion = "2021-05-02" params.iprscanURL = "https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/${params.iprscanVersion}/interproscan-${params.iprscanVersion}-64-bit.tar.gz " params.koURLlist = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/ko_list.gz" params.koURLprofiles = "ftp://ftp.genome.jp/pub/db/kofam/archives/${params.koVersion}/profiles.tar.gz" +params.goOboURL = "http://www.geneontology.org/ontology/gene_ontology.obo" // NCBI DB list params.blastDBList = "swissprot,pdbaa" @@ -48,9 +49,7 @@ String datePart = date.format("yyyyMM") params.blastDbFolder = "${params.dbPath}/ncbi/${datePart}/blastdb/db" params.dbipscanPath = "${params.dbPath}/iprscan/${params.iprscanVersion}" params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" - -// File with GO information, otherwise is downloaded -params.oboFile = null +params.oboFolder = "${params.dbPath}/geneontology/${datePart}" // Mail for sending reports params.email = "" @@ -81,17 +80,21 @@ if ( params.blastDBList == null || params.blastDBList == "" ) { } blastDBChannel = Channel.fromList( params.blastDBList?.tokenize(',') ) -// -// if ( params.oboFile == "" || params.oboFile == null ) { -// oboFile = downloadURL( "http://www.geneontology.org/ontology/gene_ontology.obo", "gene_ontology.obo" ) -// } else { -// oboFile = params.oboFile -// } -// -// def downloadURL( address, filename ) { -// downFile = new File( filename ) << new URL (address).getText() -// return downFile.absolutePath -// } + + +process oboFile { + + publishDir params.oboFolder, mode: 'copy' + label 'download' + + output: + file "gene_ontology.obo" into oboFile + + """ + curl --retry 3 -o gene_ontology.obo ${params.goOboURL}; + """ + +} process downloadNCBI { diff --git a/params.config b/params.config index d787421..80ddcf1 100644 --- a/params.config +++ b/params.config @@ -36,7 +36,7 @@ params { blastAnnotMode = "common" speciesName = "M.unicolor" // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it - oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" + // oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html From 7b97ca98965943388fee42d514f100b76d2b1e52 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 1 Aug 2021 23:11:50 +0200 Subject: [PATCH 297/381] mv fix and bin --- bin/bulkDownloadKEGG.pl | 122 ++++++++++++++++++++++++++++++++++++++++ download.nf | 1 + 2 files changed, 123 insertions(+) create mode 100755 bin/bulkDownloadKEGG.pl diff --git a/bin/bulkDownloadKEGG.pl b/bin/bulkDownloadKEGG.pl new file mode 100755 index 0000000..2068845 --- /dev/null +++ b/bin/bulkDownloadKEGG.pl @@ -0,0 +1,122 @@ +#!/usr/bin/env perl + +# make life easier +use warnings; +use strict; + +# imports needed +use Cwd; +use File::Spec; +use File::Path qw(make_path remove_tree); +use Data::Dumper; +use File::stat; +use LWP::Simple; +use POSIX qw/strftime/; + +my $kolist = shift // '/nfs/db/kegg/ko_list'; +my $downdir = shift // '/nfs/db/kegg/ko_store'; +my $webChunk = shift // 50; + +if ( ! -d $downdir ) { + system( "mkdir -p $downdir" ) +} + +my ( @kolist ); + +open (KOLIST, $kolist) || die "Cannot open $kolist"; + +while () { + + if ( $_=~/^(K\d+)/ ) { + push( @kolist, $1 ); + } + +} + +close (KOLIST); + +my @queue = (); + +foreach my $ko ( @kolist ) { + + if ( $#queue > $webChunk - 1 ) { + + my $response = &processByAPI( \@queue ); + &processToFile( $response, $downdir ); + + @queue = (); + + } + + push( @queue, $ko ); + + +} + +if ( $#queue >= 0 ) { + my $response = &processByAPI( \@queue ); + &processToFile( $response, $downdir ); +} + +sub processByAPI { + + my $arr = shift; + + my $url = "http://rest.kegg.jp/get/".join("+", @{$arr}); + my $response = get $url; + + sleep( 2 ); + + return $response; + +} + +sub processToFile { + + my $response = shift; + my $downdir = shift; + + my @split = splitKegg( $response ); + + foreach my $split ( @split ) { + + my ($KO) = $split =~ /ENTRY\s+(K\d+)/; + + if ( $KO ) { + + open FILEOUT, ">", $downdir."/".$KO.".txt"; + print FILEOUT $split; + close FILEOUT; + } + } + + return 1; + +} + +sub splitKegg { + + my $text = shift; + my @strings = (); + + my ( @lines ) = split(/\n/, $text); + + my $part = ""; + + foreach my $line ( @lines ) { + + if ( $line=~/\/\/\// ) { + if ( $part!~/^\s*$/ ) { + $part.=$line."\n"; + push( @strings, $part ); + } + $part = ""; + } else { + $part.=$line."\n"; + } + + } + + return @strings; + +} diff --git a/download.nf b/download.nf index caca8ec..f37d9eb 100644 --- a/download.nf +++ b/download.nf @@ -148,6 +148,7 @@ process downloadInterPro { rm iprscan.tar.gz cd interproscan-${params.iprscanVersion} python3 initial_setup.py + cd .. mv interproscan-${params.iprscanVersion}/data . rm -rf interproscan-${params.iprscanVersion} mv data/* .; rmdir interproscan-${params.iprscanVersion} From c02c885185206edf6fccb4b6b427acdadcf99ebd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 6 Aug 2021 11:11:44 +0200 Subject: [PATCH 298/381] fix moving --- download.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.nf b/download.nf index f37d9eb..f2b7f25 100644 --- a/download.nf +++ b/download.nf @@ -151,7 +151,7 @@ process downloadInterPro { cd .. mv interproscan-${params.iprscanVersion}/data . rm -rf interproscan-${params.iprscanVersion} - mv data/* .; rmdir interproscan-${params.iprscanVersion} + mv data/* . """ } From 030610e772f66662a353f92df0957a0fb56116d8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sun, 8 Aug 2021 17:13:30 +0200 Subject: [PATCH 299/381] open version in Dockerhub --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 3adc2fb..7c19560 100644 --- a/nextflow.config +++ b/nextflow.config @@ -64,7 +64,7 @@ process{ time='48h' cpus='8' // Modify container value below with the resulting image from: https://github.com/biocorecrg/interproscan_docker - container="https://biocore.crg.eu/iprscan/iprscan-5.48-83.0.open.sif" + container="biocorecrg/interproscan:5.48-83.0" maxRetries=3 } From 624231a825b6ac33ad5809b1c69810d292ad2554 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 10 Aug 2021 16:31:08 +0200 Subject: [PATCH 300/381] allow gzipped GFF --- main.nf | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index bc930dc..7c36a97 100644 --- a/main.nf +++ b/main.nf @@ -332,7 +332,14 @@ if ( gffavail ) { # get annot file export escaped=\$(echo '$baseDir') export basedirvar=\$(echo '\\\$\\{baseDir\\}') - agat_sp_gxf_to_gff3.pl --gff `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` -o annot.gff > annot.gff.clean.txt + export basedirvar=\$(echo '\\\$\\{baseDir\\}') + input_file=`perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` + + if [ "\${input_file: -3}" == ".gz" ]; then + gunzip -c \$input_file > input_gff + input_file=input_gff + fi + agat_sp_gxf_to_gff3.pl --gff \$input_file -o annot.gff > annot.gff.clean.txt """ } @@ -354,7 +361,14 @@ if ( gffavail ) { # get annot file export escaped=\$(echo '$baseDir') export basedirvar=\$(echo '\\\$\\{baseDir\\}') - cp `perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` annot.gff + input_file=`perl -lae 'if (\$_=~/gffFile\\s*\\=\\s*[\\x27|\\"](\\S+)[\\x27|\\"]/) { \$base = \$1; \$base=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print \$base }' $config_file` + + if [ "\${input_file: -3}" == ".gz" ]; then + gunzip -c \$input_file > input_gff + input_file=input_gff + fi + + cp \$input_file annot.gff """ } From effc7b449a94862dd068a4a147b3968871fdfd62 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 11 Aug 2021 16:38:17 +0200 Subject: [PATCH 301/381] adding submodules --- .gitmodules | 6 ++++++ containers/README.md | 4 ++++ containers/interproscan | 1 + containers/sigtarp | 1 + 4 files changed, 12 insertions(+) create mode 100644 .gitmodules create mode 100644 containers/README.md create mode 160000 containers/interproscan create mode 160000 containers/sigtarp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..28c2852 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "containers/interproscan"] + path = containers/interproscan + url = https://github.com/biocorecrg/interproscan_docker +[submodule "containers/sigtarp"] + path = containers/sigtarp + url = https://github.com/biocorecrg/sigtarp_docker diff --git a/containers/README.md b/containers/README.md new file mode 100644 index 0000000..eb9613d --- /dev/null +++ b/containers/README.md @@ -0,0 +1,4 @@ +Additional containers used for the pipeline + +Linked as submodules from other repositories + diff --git a/containers/interproscan b/containers/interproscan new file mode 160000 index 0000000..7dc947d --- /dev/null +++ b/containers/interproscan @@ -0,0 +1 @@ +Subproject commit 7dc947d4efabb35c54c11b5f4e7c3d34312f711f diff --git a/containers/sigtarp b/containers/sigtarp new file mode 160000 index 0000000..4f9a243 --- /dev/null +++ b/containers/sigtarp @@ -0,0 +1 @@ +Subproject commit 4f9a243a8491cac24dae78496990b4fa1b0a8b7b From a8dcf2fbd78699b9a89f30bee5c44fd55595e60c Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 17 Aug 2021 17:23:28 +0200 Subject: [PATCH 302/381] approach of defaults compatible with simplified download part --- main.nf | 71 +++++++++++++++++++++++++++++++++++++----- params.config | 6 ++-- params.download.config | 11 +++++++ 3 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 params.download.config diff --git a/main.nf b/main.nf index 7c36a97..43c4fe7 100644 --- a/main.nf +++ b/main.nf @@ -57,6 +57,7 @@ params.debugSize = 2 params.blastFile = null params.evalue = 0.00001 params.diamond = null +params.blastDbPath = null // GO retrieval params params.gogourl = "" @@ -64,9 +65,9 @@ params.gogohits = 30 params.blastAnnotMode = "common" // common, most, all available so far // KEGG -params.kolist = "" -params.koprofiles = "" -params.koentries = "" +params.kolist = null +params.koprofiles = null +params.koentries = null params.kegg_release = null params.kegg_species = "hsa, dme, cel, ath" @@ -92,6 +93,61 @@ params.skip_sigtarp = false // Mail for sending reports params.email = "" +// Download paths +params.dbPath = null +params.blastDbFolder = null +params.dbipscanPath = null +params.dbKOPath = null + +// Handling defaults from download part +Date date = new Date() +String datePart = date.format("yyyyMM") + +// Handle BlastDB paths +if ( ! params.blastDbPath ) { + + if ( ! params.blastDbFolder ) { + + if ( ! params.dbPath ) { + + log.info "At least dbPath needs to be defined!" + exit 1 + + } else { + params.blastDbFolder = "${params.dbPath}/ncbi/${datePart}/blastdb/db" + // Let's assume Swissprot + params.blastDbPath = "${params.blastDbFolder}/swissprot" + } + + } else { + // Let's assume Swissprot + params.blastDbPath = "${params.blastDbFolder}/swissprot" + } + +} + +// KEGG paths +if ( ! params.kolist && ! params.keggFile ) { + if ( params.koVersion && params.dbPath ) { + params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" + params.kolist = "${params.dbKOPath}/ko_list" + } +} + +if ( ! params.koprofiles && ! params.keggFile ) { + if ( params.koVersion && params.dbPath ) { + params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" + params.koprofiles = "${params.dbKOPath}/profiles" + } +} + +if ( ! params.koentries ) { + if ( params.koVersion && params.dbPath ) { + params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" + params.koentries = "${params.dbKOPath}/ko_store" + } +} + //print usage if ( params.help ) { log.info '' @@ -671,11 +727,12 @@ if ( params.kolist != "" || params.kolist != null ){ if (params.keggFile == "" || params.keggFile == null ) { println "Please run KEGG KO group annotation on the web server http://www.genome.jp/tools/kaas/" + exit 1 + } else { + keggfile = file(params.keggFile) } - keggfile = file(params.keggFile) - } // GO retrieval from BLAST results @@ -993,7 +1050,7 @@ process 'CDsearch_feat_upload'{ command } -if ( params.koentries == "" ) { +if ( ! params.koentries ) { process 'kegg_download'{ @@ -1056,7 +1113,7 @@ process 'kegg_upload' { command = checkMySQL( mysql, params.mysqllog ) - if ( params.koentries == "" ) { + if ( ! params.koentries ) { command += " \ load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ " diff --git a/params.config b/params.config index 80ddcf1..4493ec9 100644 --- a/params.config +++ b/params.config @@ -42,10 +42,10 @@ params { // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" // Profiles and KEGG codes list from ftp://ftp.genome.jp/pub/db/kofam/ - kolist = "/nfs/db/kegg/ko_list" - koprofiles = "/nfs/db/kegg/profiles" + kolist = "/nfs/db/kegg/2021-05-02/ko_list" + koprofiles = "/nfs/db/kegg/2021-05-02/profiles" // KO entries. Can be retrieved in advance using: https://github.com/toniher/biomirror/tree/master/files/kegg - koentries = "" + koentries = "/nfs/db/kegg/2021-05-02/ko_store" // Database engine. Specify MySQL (otherwise 'SQLite' will be used) dbEngine = "SQLite" // Database name. If it does not exist, if the user has enough permissions it will be created diff --git a/params.download.config b/params.download.config new file mode 100644 index 0000000..4da4892 --- /dev/null +++ b/params.download.config @@ -0,0 +1,11 @@ +// Uncomment or modify the parameters below to fit your dataset and setup choices +params { + // Root path for Database + params.dbPath = "/nfs/db" + // Interproscan version used + params.iprscanVersion = "5.48-83.0" + // Kofam version used + params.koVersion = "2021-05-02" + // NCBI DB list - Comma separated + params.blastDBList = "swissprot,pdbaa" +} From b778cef044c10a3d8baab9de22739596c5a1094d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 17 Aug 2021 17:53:14 +0200 Subject: [PATCH 303/381] more info --- README.md | 36 ++++++++++++++++++++++++++++++------ nextflow.config | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 969c30d..0984237 100644 --- a/README.md +++ b/README.md @@ -35,21 +35,49 @@ The software used all along this pipeline is encapsulated in several containers: As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. +Custom containers are available as Git submodules in ```containers``` directory. **Only Interproscan one is strictly speaking mandatory.** + * [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build container image first. Please check **sigtarp** process in ```nextflow.config```) * [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build container image fisrt. Please check **ipscan** process in ```nextflow.config```. Two versions are available: one with privative software and one without) #### How to build base container -The base container is [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. +The base container is already [available in Docker Hub](https://hub.docker.com/r/guigolab/fa-nf) and Nextflow takes care automatically to retrieve it form there, but you can always decide to generate it yourself. ``` - # Generate Docker image + # Generate Docker image from latest version docker build -t fa-nf . # Generate Singularity image if preferred sudo singularity build fa-nf.sif docker-daemon://fa-nf:latest ``` +### Dataset resources + +For downloading and formatting diferent datasets used by the programs part of this pipeline, [some scripts are provided here](https://github.com/toniher/biomirror/) for convenience. + +Alternately, a separate Nextflow pipeline is also provided for downloading all the minimally necessary datasets from Internet sources. + +``` +./nextflow run -bg download.nf --config params.download.config &> download.logfile +``` + +Below you can see the minimal amount of parameters needed to run the script. They can be reused for running the actual pipeline. + +``` + // Root path for Database + params.dbPath = "/nfs/db" + // Interproscan version used + params.iprscanVersion = "5.48-83.0" + // Kofam version used + params.koVersion = "2021-05-02" + // NCBI DB list - Comma separated + params.blastDBList = "swissprot,pdbaa" +``` + +**It's important to have container images ready before running download pipeline. Specially for Interproscan one, it must be taken into account that ```IPSCAN_DATA``` container argument must be the same ```{params.dbPath}/iprscan/${params.iprscanVersion}```** + + ## Running the pipeline The annotation process consists of different programs which, once they are executed and finished, store their results in an internal database. @@ -197,10 +225,6 @@ For skipping these applications, the following lines can be added in the configu In the provided example ```params.config``` file we keep these two lines uncommented. -### Dataset resources - -For downloading and formatting diferent datasets used by the programs part of this pipeline, [some scripts are provided here](https://github.com/toniher/biomirror/) for convenience. - ## Result files diff --git a/nextflow.config b/nextflow.config index 7c19560..3df2c7a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -80,7 +80,7 @@ process{ } } -process.container = "guigolab/fa-nf:latest" +process.container = "guigolab/fa-nf:0.3.1" // Singularity preferred. If chosen docker, uncomment line below, comment singularity one and replace sif containers above accordingly // docker.enabled = true singularity.enabled = true From cb6d59420b828929ed0cc0ef0f3e79662b947862 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 17 Aug 2021 18:09:57 +0200 Subject: [PATCH 304/381] Some params.config --- params.config | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/params.config b/params.config index 4493ec9..4833e94 100644 --- a/params.config +++ b/params.config @@ -26,8 +26,10 @@ params { debugSize = 5 evalue = "0.00001" diamond = true - // Blast DB. Details to retrieve from: https://github.com/toniher/biomirror/tree/master/files/ncbi - blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/nr" + // Base DB Path + dbPath = "/nfs/db" + // Blast DB. Check README for details + blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/swissprot" // Instance from where to retrieve GO mappings. You can set up your own from: https://github.com/toniher/gogoAPI gogourl = "http://gogo.test.crg.eu/api" // Maximum number of hits to consider (up to 30 by default)) @@ -37,10 +39,14 @@ params { speciesName = "M.unicolor" // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it // oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" + // Interproscan Version + iprscanVersion = "5.48-83.0" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html kegg_species = "hsa, dme, cel, ath, sce, cho, eco, nme, hpy, rpr, bsu, lla, cac, mge, mtu, ctr, bbu, syn, bth, dra, aae, mja, ape, aly, cit, tcc, gmx, fve, csv, vvi, sly, osa, olu, ota, mis, cme, gsl" + // Kofam version used + koVersion = "2021-05-02" // Profiles and KEGG codes list from ftp://ftp.genome.jp/pub/db/kofam/ kolist = "/nfs/db/kegg/2021-05-02/ko_list" koprofiles = "/nfs/db/kegg/2021-05-02/profiles" From 323757b7fbf1494e690dde22c6da63ca2cfb929f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 17 Aug 2021 18:26:00 +0200 Subject: [PATCH 305/381] file config --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0984237..7421cdb 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Alternately, a separate Nextflow pipeline is also provided for downloading all t ./nextflow run -bg download.nf --config params.download.config &> download.logfile ``` -Below you can see the minimal amount of parameters needed to run the script. They can be reused for running the actual pipeline. +Below you can see the minimal amount of parameters in ```params.download.config``` file needed to run the script. These can be reused for running the actual pipeline. ``` // Root path for Database From 4a14fa45905e3956c4ff1ed682cb61c45590120a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 18 Aug 2021 14:02:17 +0200 Subject: [PATCH 306/381] not writing on params --- main.nf | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/main.nf b/main.nf index 43c4fe7..505fa69 100644 --- a/main.nf +++ b/main.nf @@ -104,6 +104,8 @@ Date date = new Date() String datePart = date.format("yyyyMM") // Handle BlastDB paths +blastDbPath = null; + if ( ! params.blastDbPath ) { if ( ! params.blastDbFolder ) { @@ -114,37 +116,52 @@ if ( ! params.blastDbPath ) { exit 1 } else { - params.blastDbFolder = "${params.dbPath}/ncbi/${datePart}/blastdb/db" + blastDbFolder = "${params.dbPath}/ncbi/${datePart}/blastdb/db" // Let's assume Swissprot - params.blastDbPath = "${params.blastDbFolder}/swissprot" + blastDbPath = "${blastDbFolder}/swissprot" } } else { // Let's assume Swissprot - params.blastDbPath = "${params.blastDbFolder}/swissprot" + blastDbPath = "${params.blastDbFolder}/swissprot" } +} else { + blastDbPath = params.blastDbPath } // KEGG paths +kolist = null +koprofiles = null +koentries = null + +if ( params.kolist ) { + kolist = params.kolist +} + +if ( params.koprofiles ) { + koprofiles = params.koprofiles +} + +if ( params.koentries ) { + koentries = params.koentries +} + if ( ! params.kolist && ! params.keggFile ) { if ( params.koVersion && params.dbPath ) { - params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" - params.kolist = "${params.dbKOPath}/ko_list" + kolist = "${params.dbPath}/kegg/${params.koVersion}/ko_list" } } if ( ! params.koprofiles && ! params.keggFile ) { if ( params.koVersion && params.dbPath ) { - params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" - params.koprofiles = "${params.dbKOPath}/profiles" + koprofiles = "${params.dbPath}/kegg/${params.koVersion}/profiles" } } if ( ! params.koentries ) { if ( params.koVersion && params.dbPath ) { - params.dbKOPath = "${params.dbPath}/kegg/${params.koVersion}" - params.koentries = "${params.dbKOPath}/ko_store" + koentries = "${params.dbPath}/kegg/${params.koVersion}/ko_store" } } @@ -545,15 +562,15 @@ if( params.blastAnnotMode != "" && params.blastAnnotMode != null ) { if ( params.blastFile == "" || params.blastFile == null ){ // program-specific parameters - db_name = file(params.blastDbPath).name - db_path = file(params.blastDbPath).parent + db_name = file(blastDbPath).name + db_path = file(blastDbPath).parent // Handling Database formatting formatdbDetect = "false" if ( diamond ) { - formatDbFileName = params.blastDbPath + ".dmnd" + formatDbFileName = blastDbPath + ".dmnd" formatDbFile = file(formatDbFileName) if ( formatDbFile.exists() && formatDbFile.size() > 0 ) { formatdbDetect = "true" @@ -574,7 +591,7 @@ if ( params.blastFile == "" || params.blastFile == null ){ } } else { - formatdb = params.blastDbPath + formatdb = blastDbPath } } else { @@ -607,7 +624,7 @@ if ( params.blastFile == "" || params.blastFile == null ){ } } else { - formatdb = params.blastDbPath + formatdb = blastDbPath } } @@ -683,7 +700,7 @@ if ( params.blastFile == "" || params.blastFile == null ){ } } -if ( params.kolist != "" || params.kolist != null ){ +if ( kolist != "" || kolist != null ){ process kofamscan{ @@ -696,7 +713,7 @@ if ( params.kolist != "" || params.kolist != null ){ file "koala_${seq}" into koalaResults """ - exec_annotation --cpu ${task.cpus} -p ${params.koprofiles} -k ${params.kolist} -o koala_${seq} $seq + exec_annotation --cpu ${task.cpus} -p ${koprofiles} -k ${kolist} -o koala_${seq} $seq """ } @@ -1050,7 +1067,7 @@ process 'CDsearch_feat_upload'{ command } -if ( ! params.koentries ) { +if ( ! koentries ) { process 'kegg_download'{ @@ -1113,13 +1130,13 @@ process 'kegg_upload' { command = checkMySQL( mysql, params.mysqllog ) - if ( ! params.koentries ) { + if ( ! koentries ) { command += " \ load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ " } else { command += " \ - load_kegg_KAAS.pl -input $keggfile -entries $params.koentries -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ + load_kegg_KAAS.pl -input $keggfile -entries $koentries -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ " } From c20453575577fd8ae503ea13a85d9fd15dc7d436 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 18 Aug 2021 14:07:31 +0200 Subject: [PATCH 307/381] value for params.keggFile --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index 505fa69..d80be6c 100644 --- a/main.nf +++ b/main.nf @@ -70,6 +70,7 @@ params.koprofiles = null params.koentries = null params.kegg_release = null params.kegg_species = "hsa, dme, cel, ath" +params.keggFile = null // Params for InterProScan // Temporary location for InterproScan intermediary files. This can be huge From 3b3a79e012cbb7244ed7442b1a540a4a241830c0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 18 Aug 2021 14:51:53 +0200 Subject: [PATCH 308/381] fix if exists --- main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index d80be6c..3cad40f 100644 --- a/main.nf +++ b/main.nf @@ -522,15 +522,15 @@ process initDB { } } else { - if (!exists) { - command += "fa_main.v1.pl init -conf config" + if (exists) { + log.info "SQLite database ${dbFileName} exists. We proceed anyway..." + } + command += "fa_main.v1.pl init -conf config" + if ( gffavail && gffclean ) { command += " -gff ${gff_file}" } - } else { - log.info "SQLite database ${dbFileName} exists. We proceed anyway..." - } } if ( params.debug=="TRUE"||params.debug=="true" ) { From ce4a79c58f9d2c32a1bb6a74d7d254d8434a0cbb Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 18 Aug 2021 16:13:21 +0200 Subject: [PATCH 309/381] more README details --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0984237..2b636da 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ Below you can see the minimal amount of parameters needed to run the script. The params.blastDBList = "swissprot,pdbaa" ``` -**It's important to have container images ready before running download pipeline. Specially for Interproscan one, it must be taken into account that ```IPSCAN_DATA``` container argument must be the same ```{params.dbPath}/iprscan/${params.iprscanVersion}```** +**It's VERY IMPORTANT to have container images ready before running the download pipeline. Specially for Interproscan, it must be taken into account that ```IPSCAN_DATA``` container build argument must be the same as ```{params.dbPath}/iprscan/${params.iprscanVersion}```** ## Running the pipeline @@ -173,6 +173,8 @@ We suggest to check **annot.gff**, **annot.gff.clean.txt** and **annot.gff.stats ### BLAST databases +The parameter ```blastDbPath``` hosts the path of the BLAST/DIAMOND database to be used. If not set or commented, a path compatible with the defaults from ```download.nf``` pipeline and the set ```dbPath``` parameter. + * For NCBI BLAST+: ```blastDbPath = "/path/to/db"``` and ```diamond = "false"```. It looks for formatted database files (normally named ``db.p*`` for protein type based ones), otherwise it will try to format FASTA file with that name * For DIAMOND: ```blastDbPath = "/path/to/db"``` and ```diamond = "true"```. It looks for a single formatted database file (normally named ``db.dmnd``), otherwise it will try to format the FASTA file with that name (gzip compressed files accepted) @@ -202,12 +204,15 @@ Predictions of the KEGG orthology groups (KO) can be obtained outside of the pip For KofamKOLA, adjust the parameters below to match the location in your system (ftp://ftp.genome.jp/pub/db/kofam/) ``` - kolist = "/nfs/db/kegg/ko_list" - koprofiles = "/nfs/db/kegg/profiles" - koentries = "/nfs/db/kegg/ko_store" + koVersion = "2021-05-02" + kolist = "/nfs/db/kegg/2021-05-02/ko_list" + koprofiles = "/nfs/db/kegg/2021-05-02/profiles" + koentries = "/nfs/db/kegg/2021-05-02/ko_store" ``` -In the parameters above, ```koentries``` refers to a directory containing KO entries text files that can be downloaded in advance (check *Dataset resources* section below). +If ```kolist```, ```koprofiles``` are either not set or commented, ```koVersion``` will be used for completing their paths if ```dbPath``` (used in ```download.nf``` pipeline) is set. + +In the parameters above, ```koentries``` refers to a directory containing KO entries text files that can be downloaded in advance (check ***Dataset resources*** section above). Otherwise a process will take care of retrieving them. **Note**: when using KAAS, for the downstream processing of the KO file it is very important to store information about species used for predictions. Species are encoded in three letters abbreviations, and the list can be copied from the 'Selected organisms' field in the kaas_main form. From ce8335b55fdeb6616f8069ff34f168f6ccd29b5d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 18 Aug 2021 16:29:41 +0200 Subject: [PATCH 310/381] simplified params.config --- params.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params.config b/params.config index 4833e94..b48b9a2 100644 --- a/params.config +++ b/params.config @@ -29,7 +29,7 @@ params { // Base DB Path dbPath = "/nfs/db" // Blast DB. Check README for details - blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/swissprot" + // blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/swissprot" // Instance from where to retrieve GO mappings. You can set up your own from: https://github.com/toniher/gogoAPI gogourl = "http://gogo.test.crg.eu/api" // Maximum number of hits to consider (up to 30 by default)) @@ -48,10 +48,10 @@ params { // Kofam version used koVersion = "2021-05-02" // Profiles and KEGG codes list from ftp://ftp.genome.jp/pub/db/kofam/ - kolist = "/nfs/db/kegg/2021-05-02/ko_list" - koprofiles = "/nfs/db/kegg/2021-05-02/profiles" + // kolist = "/nfs/db/kegg/2021-05-02/ko_list" + // koprofiles = "/nfs/db/kegg/2021-05-02/profiles" // KO entries. Can be retrieved in advance using: https://github.com/toniher/biomirror/tree/master/files/kegg - koentries = "/nfs/db/kegg/2021-05-02/ko_store" + // koentries = "/nfs/db/kegg/2021-05-02/ko_store" // Database engine. Specify MySQL (otherwise 'SQLite' will be used) dbEngine = "SQLite" // Database name. If it does not exist, if the user has enough permissions it will be created From 54057c8f43064a4a19ca9e30dd259dc0cffd7f08 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 24 Aug 2021 11:24:52 +0200 Subject: [PATCH 311/381] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index db7a2f5..4af2158 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Below you can see the minimal amount of parameters in ```params.download.config` **It's VERY IMPORTANT to have container images ready before running the download pipeline. Specially for Interproscan, it must be taken into account that ```IPSCAN_DATA``` container build argument must be the same as ```{params.dbPath}/iprscan/${params.iprscanVersion}```** +For convenience and test purposes, some sample already downloaded datasets [can be found here](https://biocore.crg.eu/papers/FA-nf-2021/datasets/). You can simply extract their contents in your final ```dbPath``` location. ## Running the pipeline From 4e593c95e03dbba22087d6314cf73dcd6e6ebcb8 Mon Sep 17 00:00:00 2001 From: Jacques Dainat Date: Thu, 2 Sep 2021 09:50:52 +0200 Subject: [PATCH 312/381] update AGAT for more up to date version --- main.nf | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 3cad40f..1087c61 100644 --- a/main.nf +++ b/main.nf @@ -413,7 +413,7 @@ if ( gffavail ) { gunzip -c \$input_file > input_gff input_file=input_gff fi - agat_sp_gxf_to_gff3.pl --gff \$input_file -o annot.gff > annot.gff.clean.txt + agat_convert_sp_gxf2gxf.pl --gff \$input_file -o annot.gff > annot.gff.clean.txt """ } diff --git a/nextflow.config b/nextflow.config index 3df2c7a..5af0e52 100644 --- a/nextflow.config +++ b/nextflow.config @@ -42,7 +42,7 @@ process{ withLabel: gffcheck { queue='biocore-el7,short-sl7' cpus='1' - container="quay.io/biocontainers/agat:0.1.0--pl526r35_0" + container="quay.io/biocontainers/agat:0.8.0--pl5262hdfd78af_0" } // Process skipped with 'skip_sigtarp = true' in params.config From d30d1ad9a853649e67c668a472bd14198be5a69d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 9 Sep 2021 18:38:19 +0200 Subject: [PATCH 313/381] mount interproscandata --- main.nf | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 3cad40f..254fe69 100644 --- a/main.nf +++ b/main.nf @@ -78,6 +78,19 @@ params.ipscantmp = "${baseDir}/tmp/" // Location of InterproScan properties. Do not modify unless it matches your container params.ipscanproperties = "/usr/local/interproscan/interproscan.properties" +ipscandata = "/usr/local/interproscan/data" +if ( params.ipscandata ) { + ipscandata = params.ipscandata +} else { + if ( params.iprscanVersion ) { + if ( params.dbPath ) { + if ( new File( params.dbPath + "/iprscan/" + params.iprscanVersion ).exists() ) { + ipscandata = "${params.dbPath}/iprscan/${params.iprscanVersion}" + } + } + } +} + // Params for dealing with GFF params.gffclean = true params.gffstats = true @@ -527,7 +540,7 @@ process initDB { } command += "fa_main.v1.pl init -conf config" - + if ( gffavail && gffclean ) { command += " -gff ${gff_file}" } @@ -819,6 +832,12 @@ process ipscn { label 'ipscan' + if ( singularity.enabled ) { + containerOptions "--bind ${ipscandata}:/usr/local/interproscan/data" + } else { + containerOptions "--volume ${ipscandata}:/usr/local/interproscan/data" + } + input: file seq from seq_file_ipscan file ("interproscan.properties") from file( ipscan_properties ) From df86e5beb716942c02143dc92a6386300d721850 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 13 Sep 2021 13:51:57 +0200 Subject: [PATCH 314/381] update content Update README content --- README.md | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 4af2158..40584a4 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,15 @@ The software used in this pipeline is mostly free software for academic users. F If you want to use the ```latest``` version you can clone the last commit of the repository: ``` -git clone --depth 1 https://github.com/guigolab/FA-nf . +git clone --recursive https://github.com/guigolab/FA-nf +``` + +This will download FA-nf repository and also some repository submodules (in containers directory) that are needed if we want to generate custom container images. + +This will generate a FA-nf directory with the pipeline. You can go there inside: + +``` +cd FA-nf ``` Alternately, and actually recommended, you can clone the whole repository and choose the tag you want with ```git checkout``` command, or download a specific release from: https://github.com/guigolab/FA-nf/releases @@ -29,16 +37,16 @@ You can place the Nextflow binary somewhere in your ```PATH``` or in the same lo ### Associated containers -We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://singularity.hpcng.org/) (the latter preferred). +We recommend installing either [Docker](https://www.docker.com/) or [Singularity](https://singularity.hpcng.org/) (the later is preferred). The software used all along this pipeline is encapsulated in several containers: As written down in ```nextflow.config``` file, whenever possible, we try to provide necessary images in a public repository (e.g. [Docker hub](https://hub.docker.com/) or quay.io from [Biocontainers](https://biocontainers.pro/)). However, for some software that includes privative components, we suggest to build the container image by yourself. -Custom containers are available as Git submodules in ```containers``` directory. **Only Interproscan one is strictly speaking mandatory.** +Custom containers are available as Git submodules in ```containers``` directory. **They need to be generated first if privative software is used.** -* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (user needs to build container image first. Please check **sigtarp** process in ```nextflow.config```) -* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (user needs to build container image fisrt. Please check **ipscan** process in ```nextflow.config```. Two versions are available: one with privative software and one without) +* [SignalP and TargetP](https://github.com/biocorecrg/sigtarp_docker) (Please check **sigtarp** process in ```nextflow.config```) +* [Interproscan and 3rd party tools](https://github.com/biocorecrg/interproscan_docker) (Please check **ipscan** process in ```nextflow.config```. Two recipes are available: one with privative software and one without. The later is already available in Docker Hub) #### How to build base container @@ -75,9 +83,7 @@ Below you can see the minimal amount of parameters in ```params.download.config` params.blastDBList = "swissprot,pdbaa" ``` -**It's VERY IMPORTANT to have container images ready before running the download pipeline. Specially for Interproscan, it must be taken into account that ```IPSCAN_DATA``` container build argument must be the same as ```{params.dbPath}/iprscan/${params.iprscanVersion}```** - -For convenience and test purposes, some sample already downloaded datasets [can be found here](https://biocore.crg.eu/papers/FA-nf-2021/datasets/). You can simply extract their contents in your final ```dbPath``` location. +For convenience and test purposes, some sample pre-downloaded minimal datasets [can be found here](https://biocore.crg.eu/papers/FA-nf-2021/datasets/). You can simply extract their contents in your final ```dbPath``` location. ## Running the pipeline @@ -114,6 +120,8 @@ Most parameters are self-explanatory. We highlight some below and in upcoming se // GFF input gffFile = "${baseDir}/dataset/P.vulgaris.gff3" ``` +These two files can be gzipped and the pipeline will take care to uncompress them in advance. + When approaching a new dataset, we suggest to run first the pipeline in **debug** mode (provided as such in example params config). This will analyze a limited number of protein entries. This way you may save time and troubleshoot some potential problems in your input files. @@ -183,7 +191,7 @@ The parameter ```blastDbPath``` hosts the path of the BLAST/DIAMOND database to Retrieval of GO terms from BLAST results can be performed either from [BLAST2GO](https://www.blast2go.com/) results or from other methods as far as a BLAST2GO-compatible output format is provided. -Moreover, we are also providing a web API for retrieving protein-GO mapping from [UniProt GOA](https://www.ebi.ac.uk/GOA) and other resources. More details for [for setting an own instance here](https://github.com/toniher/gogoAPI). +In any case, we are also providing a web API for retrieving protein-GO mapping from [UniProt GOA](https://www.ebi.ac.uk/GOA) and other resources. More details for [for setting an own instance here](https://github.com/toniher/gogoAPI). When using the second option, you can tune it with the parameters below: @@ -199,6 +207,9 @@ When using the second option, you can tune it with the parameters below: blastAnnotMode = "common" ``` +**IMPORTANT: This step requires so far network connection to the defined instance.** + + ### KEGG orthology groups Predictions of the KEGG orthology groups (KO) can be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/) or using a previously set-up version of [KofamKOALA](https://www.genome.jp/tools/kofamkoala/). From a001009e64754a373a28bd95ce07a0dc6fecbb0e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 13 Sep 2021 14:30:32 +0200 Subject: [PATCH 315/381] Update submodule --- containers/interproscan | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/interproscan b/containers/interproscan index 7dc947d..ee74451 160000 --- a/containers/interproscan +++ b/containers/interproscan @@ -1 +1 @@ -Subproject commit 7dc947d4efabb35c54c11b5f4e7c3d34312f711f +Subproject commit ee74451692081efcbc38533e712b791c995cb628 From 07b03f1494f73cd01a2ac60797be8c6a29a678f7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 13 Sep 2021 15:06:12 +0200 Subject: [PATCH 316/381] adding gogoapi submodule --- .gitmodules | 3 +++ gogoapi | 1 + 2 files changed, 4 insertions(+) create mode 160000 gogoapi diff --git a/.gitmodules b/.gitmodules index 28c2852..b602b0e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "containers/sigtarp"] path = containers/sigtarp url = https://github.com/biocorecrg/sigtarp_docker +[submodule "gogoapi"] + path = gogoapi + url = https://github.com/toniher/gogoapi diff --git a/gogoapi b/gogoapi new file mode 160000 index 0000000..0408c58 --- /dev/null +++ b/gogoapi @@ -0,0 +1 @@ +Subproject commit 0408c58405b57daec51af0c3d66c1f834d77a0e6 From 7cd567ca9587eb70a214170351ef53c9c8afb275 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 14 Sep 2021 17:02:30 +0200 Subject: [PATCH 317/381] Update main.nf --- main.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 254fe69..2f41afd 100644 --- a/main.nf +++ b/main.nf @@ -78,8 +78,9 @@ params.ipscantmp = "${baseDir}/tmp/" // Location of InterproScan properties. Do not modify unless it matches your container params.ipscanproperties = "/usr/local/interproscan/interproscan.properties" +params.ipscandata = "" ipscandata = "/usr/local/interproscan/data" -if ( params.ipscandata ) { +if ( params.ipscandata != "" ) { ipscandata = params.ipscandata } else { if ( params.iprscanVersion ) { @@ -832,7 +833,7 @@ process ipscn { label 'ipscan' - if ( singularity.enabled ) { + if ( workflow.engine == "singularity" ) { containerOptions "--bind ${ipscandata}:/usr/local/interproscan/data" } else { containerOptions "--volume ${ipscandata}:/usr/local/interproscan/data" From 27dd94451aae60339bd4cbe684ff5b4bc473cbff Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 14 Sep 2021 23:27:16 +0200 Subject: [PATCH 318/381] fix workflow def --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 2f41afd..b261628 100644 --- a/main.nf +++ b/main.nf @@ -833,7 +833,7 @@ process ipscn { label 'ipscan' - if ( workflow.engine == "singularity" ) { + if ( workflow.containerEngine == "singularity" ) { containerOptions "--bind ${ipscandata}:/usr/local/interproscan/data" } else { containerOptions "--volume ${ipscandata}:/usr/local/interproscan/data" From e9a1c47b57bec3a435055787a487ef2531d05313 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 14 Sep 2021 23:36:16 +0200 Subject: [PATCH 319/381] simple log file --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index b261628..4ea76f7 100644 --- a/main.nf +++ b/main.nf @@ -34,6 +34,7 @@ params.help = false params.debug = false params.dbEngine = "SQLite" // MySQL otherwise +params.mysqllog = "${baseDir}/tmp" // Main input files params.proteinFile = null; From 5edad38fb67d61145f81508ff0bd04fa7c577287 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 14 Sep 2021 23:38:07 +0200 Subject: [PATCH 320/381] Update params.config ipscandata --- params.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/params.config b/params.config index b48b9a2..532d7fd 100644 --- a/params.config +++ b/params.config @@ -41,6 +41,8 @@ params { // oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Interproscan Version iprscanVersion = "5.48-83.0" + // Defined Interproscan Data directory + // ipscandata = "/nfs/db/iprscan/5.48-83.0" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html From 971837f67e4d2a8661f8a3e608463d778e76444b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 17 Sep 2021 12:20:48 +0200 Subject: [PATCH 321/381] More details --- README.md | 15 +++++++++++++++ params.config | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 40584a4..8d4b4b4 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,21 @@ When using the second option, you can tune it with the parameters below: **IMPORTANT: This step requires so far network connection to the defined instance.** +### Interproscan + +Interproscan step launches several computing-intensive application within the same process, so care must be taken to assign enough resources in ```nextflow.config``` **ipscan** section. + +It is **very important** to ensure that used Interproscan data directory matches the version of the used software. More details can be found at ```containers/interproscan``` directory. + +Below the Interproscan parameters that can be tuned: +``` +// Interproscan Version +iprscanVersion = "5.48-83.0" +// Defined Interproscan Data directory. It will override version parameter above. +// ipscandata = "/nfs/db/iprscan/5.48-83.0" +// Directory where to store intermediary Interproscan files (ensure there is enough space) +ipscantmp = "${baseDir}/tmp/" +``` ### KEGG orthology groups Predictions of the KEGG orthology groups (KO) can be obtained outside of the pipeline, i.e. via [KAAS server](http://www.genome.jp/tools/kaas/) or using a previously set-up version of [KofamKOALA](https://www.genome.jp/tools/kofamkoala/). diff --git a/params.config b/params.config index 532d7fd..4c3fe84 100644 --- a/params.config +++ b/params.config @@ -41,7 +41,7 @@ params { // oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Interproscan Version iprscanVersion = "5.48-83.0" - // Defined Interproscan Data directory + // Defined Interproscan Data directory. It will override version parameter above. // ipscandata = "/nfs/db/iprscan/5.48-83.0" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" From 0d7cb517c18b2a5a7ba9373227f4b16017b30b66 Mon Sep 17 00:00:00 2001 From: Anna Vlasova Date: Wed, 22 Sep 2021 16:30:53 +0200 Subject: [PATCH 322/381] Update README.md --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d4b4b4..edf1344 100644 --- a/README.md +++ b/README.md @@ -85,15 +85,22 @@ Below you can see the minimal amount of parameters in ```params.download.config` For convenience and test purposes, some sample pre-downloaded minimal datasets [can be found here](https://biocore.crg.eu/papers/FA-nf-2021/datasets/). You can simply extract their contents in your final ```dbPath``` location. +## Preparation of the pipeline + +Before running the pipeline users need to adapt configuration files ```nextflow.config``` and ```params.config``` to fit their system and the location of the necessary datasets. File ```nextflow.config``` contains execution instructions for Nextflow engine, such as executor (slurm/local/other), number of cpus for parallel execution, and paths to container images. Detailed description of the parameters can be found in the [Nextflow documentation](https://www.nextflow.io/docs/latest/getstarted.html). User need to prepare this file once when setting up the pipeline. The second configuration file, ```params.config```, contains parameters for concrete annotation run, such as path to protein sequences in fasta format, size for chunks to split files, and location of additional datasets. Therefore this configuration file need to be adapted every time user runs a new dataset. We recommend to create a new cofiguration file per each annotation and keep it together with the result files. + +Users also may need to download and index when necessary BLAST, Interproscan and KEGG datasets, as described in the **Dataset resources** section, and point where they are located in ```params.config``` file. Parameters for concrete datasets are explained in the sections below. + + ## Running the pipeline The annotation process consists of different programs which, once they are executed and finished, store their results in an internal database. Result files, including a main annotation file in GFF format and diferent annotation reports, are generated at the last steps of the pipeline. -First of all, users need to adapt ```nextflow.config``` and ```params.config``` to fit their HPC system and the location of the necessary datasets. Users need to download (and index when necessary) BLAST, Interproscan and KEGG datasets and point where they are located in ```params.config``` file. This explained in the sections below. +First of all, users need to adapt configuration files as specified in the previous section. -Once the datasets are prepared, the whole annotation process can be launched by using the following command: +Once the datasets and containers/software are prepared, the whole annotation process can be launched by using the following command: ``` ./nextflow run -bg main.nf --config params.config &> logfile From 3dba38377726bdfd728dfdf9ecdfc1a0aeeb3f6e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 24 Sep 2021 11:26:26 +0200 Subject: [PATCH 323/381] link interproscan --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d4b4b4..49da7c6 100644 --- a/README.md +++ b/README.md @@ -211,7 +211,7 @@ When using the second option, you can tune it with the parameters below: ### Interproscan -Interproscan step launches several computing-intensive application within the same process, so care must be taken to assign enough resources in ```nextflow.config``` **ipscan** section. +[Interproscan](https://www.ebi.ac.uk/interpro/search/sequence/) step launches several computing-intensive application within the same process, so care must be taken to assign enough resources in ```nextflow.config``` **ipscan** section. It is **very important** to ensure that used Interproscan data directory matches the version of the used software. More details can be found at ```containers/interproscan``` directory. From dadd5c3bb2a60be1994d2b7efd45222d63b2ab31 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 19 Oct 2021 18:09:42 +0200 Subject: [PATCH 324/381] update citation --- CITATION.cff | 35 +++++++++++++++++++++++++++++++++++ README.md | 20 ++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..2d29c3d --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,35 @@ +# YAML 1.2 +--- +abstract: "Functional annotation allows adding biologically relevant information to predicted features in genomic sequences, and it is, therefore, an important procedure of any de novo genome sequencing project. It is also useful for proofreading and improving gene structural annotation. Here, we introduce FA-nf, a pipeline implemented in Nextflow, a versatile computational workflow management engine. The pipeline integrates different annotation approaches, such as NCBI BLAST+, DIAMOND, InterProScan, and KEGG. It starts from a protein sequence FASTA file and, optionally, a structural annotation file in GFF format, and produces several files, such as GO assignments, output summaries of the abovementioned programs and final annotation reports. The pipeline can be broken easily into smaller processes for the purpose of parallelization and easily deployed in a Linux computational environment, thanks to software containerization, thus helping to ensure full reproducibility." +authors: + - + family-names: Vlasova + given-names: Anna + - + family-names: "Hermoso Pulido" + given-names: Toni + orcid: "https://orcid.org/0000-0003-2016-6465" + - + family-names: Camara + given-names: Francisco + orcid: "https://orcid.org/0000-0002-1971-5466 " + - + family-names: Ponomarenko + given-names: Julia + orcid: "https://orcid.org/0000-0002-1477-9444" + - + family-names: "Guigó" + given-names: Roderic + orcid: "https://orcid.org/0000-0002-5738-4477" +cff-version: "1.1.0" +doi: "10.3390/genes12101645 " +keywords: + - "functional annotation" + - containerization + - pipeline + - reproducibility +license: GPLv3 +message: "If you use this software, please cite it using these metadata." +repository-code: "https://github.com/guigolab/FA-nf" +title: "FA-nf: A Functional Annotation Pipeline for Proteins from Non-Model Organisms Implemented in Nextflow" +... diff --git a/README.md b/README.md index 51b82d3..7c4893c 100644 --- a/README.md +++ b/README.md @@ -340,6 +340,26 @@ for further options or details, run: perl run_pipeline_mysql.pl -h +## Citation + +Vlasova, A.; Hermoso Pulido, T.; Camara, F.; Ponomarenko, J.; Guigó, R. FA-nf: A Functional Annotation Pipeline for Proteins from Non-Model Organisms Implemented in Nextflow. *Genes* **2021**, 12, 1645. https://doi.org/10.3390/genes12101645 + +``` +@Article{genes12101645, +AUTHOR = {Vlasova, Anna and Hermoso Pulido, Toni and Camara, Francisco and Ponomarenko, Julia and Guigó, Roderic}, +TITLE = {FA-nf: A Functional Annotation Pipeline for Proteins from Non-Model Organisms Implemented in Nextflow}, +JOURNAL = {Genes}, +VOLUME = {12}, +YEAR = {2021}, +NUMBER = {10}, +ARTICLE-NUMBER = {1645}, +URL = {https://www.mdpi.com/2073-4425/12/10/1645}, +ISSN = {2073-4425}, +ABSTRACT = {Functional annotation allows adding biologically relevant information to predicted features in genomic sequences, and it is, therefore, an important procedure of any de novo genome sequencing project. It is also useful for proofreading and improving gene structural annotation. Here, we introduce FA-nf, a pipeline implemented in Nextflow, a versatile computational workflow management engine. The pipeline integrates different annotation approaches, such as NCBI BLAST+, DIAMOND, InterProScan, and KEGG. It starts from a protein sequence FASTA file and, optionally, a structural annotation file in GFF format, and produces several files, such as GO assignments, output summaries of the abovementioned programs and final annotation reports. The pipeline can be broken easily into smaller processes for the purpose of parallelization and easily deployed in a Linux computational environment, thanks to software containerization, thus helping to ensure full reproducibility.}, +DOI = {10.3390/genes12101645} +} +``` + ## Troubleshooting **At the beginning of the pipeline execution, I get an error message such as ```FATAL: While making image from oci registry: while building SIF from layers: conveyor failed to get: no descriptor found for reference``` or any other mentioning OCI, SIF or Singularity.** From 4927a16e72135bb2923f94c114fbefa829094bd2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 19 Oct 2021 18:26:36 +0200 Subject: [PATCH 325/381] CITATION --- CITATION.cff | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 2d29c3d..ed19657 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,6 +1,5 @@ # YAML 1.2 --- -abstract: "Functional annotation allows adding biologically relevant information to predicted features in genomic sequences, and it is, therefore, an important procedure of any de novo genome sequencing project. It is also useful for proofreading and improving gene structural annotation. Here, we introduce FA-nf, a pipeline implemented in Nextflow, a versatile computational workflow management engine. The pipeline integrates different annotation approaches, such as NCBI BLAST+, DIAMOND, InterProScan, and KEGG. It starts from a protein sequence FASTA file and, optionally, a structural annotation file in GFF format, and produces several files, such as GO assignments, output summaries of the abovementioned programs and final annotation reports. The pipeline can be broken easily into smaller processes for the purpose of parallelization and easily deployed in a Linux computational environment, thanks to software containerization, thus helping to ensure full reproducibility." authors: - family-names: Vlasova @@ -21,15 +20,38 @@ authors: family-names: "Guigó" given-names: Roderic orcid: "https://orcid.org/0000-0002-5738-4477" -cff-version: "1.1.0" -doi: "10.3390/genes12101645 " +cff-version: "1.2.0" +doi: "10.5281/zenodo.5526102" keywords: - "functional annotation" - containerization - pipeline - reproducibility -license: GPLv3 +license: GPL-3.0+ message: "If you use this software, please cite it using these metadata." repository-code: "https://github.com/guigolab/FA-nf" title: "FA-nf: A Functional Annotation Pipeline for Proteins from Non-Model Organisms Implemented in Nextflow" +preferred-citation: + type: article + authors: + - family-names: Vlasova + given-names: Anna + - family-names: "Hermoso Pulido" + given-names: Toni + orcid: "https://orcid.org/0000-0003-2016-6465" + - family-names: Camara + given-names: Francisco + orcid: "https://orcid.org/0000-0002-1971-5466 " + - family-names: Ponomarenko + given-names: Julia + orcid: "https://orcid.org/0000-0002-1477-9444" + - family-names: "Guigó" + given-names: Roderic + orcid: "https://orcid.org/0000-0002-5738-4477" + doi: "10.3390/genes12101645" + journal: "Genes" + month: 9 + title: "FA-nf: A Functional Annotation Pipeline for Proteins from Non-Model Organisms Implemented in Nextflow" + abstract: "Functional annotation allows adding biologically relevant information to predicted features in genomic sequences, and it is, therefore, an important procedure of any de novo genome sequencing project. It is also useful for proofreading and improving gene structural annotation. Here, we introduce FA-nf, a pipeline implemented in Nextflow, a versatile computational workflow management engine. The pipeline integrates different annotation approaches, such as NCBI BLAST+, DIAMOND, InterProScan, and KEGG. It starts from a protein sequence FASTA file and, optionally, a structural annotation file in GFF format, and produces several files, such as GO assignments, output summaries of the abovementioned programs and final annotation reports. The pipeline can be broken easily into smaller processes for the purpose of parallelization and easily deployed in a Linux computational environment, thanks to software containerization, thus helping to ensure full reproducibility." + year: 2021 ... From 6dfb478e387faa73719e9592818c6879b1c32ad2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 19 Oct 2021 18:33:04 +0200 Subject: [PATCH 326/381] update --- CITATION.cff | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index ed19657..8763c38 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -50,8 +50,10 @@ preferred-citation: orcid: "https://orcid.org/0000-0002-5738-4477" doi: "10.3390/genes12101645" journal: "Genes" - month: 9 title: "FA-nf: A Functional Annotation Pipeline for Proteins from Non-Model Organisms Implemented in Nextflow" abstract: "Functional annotation allows adding biologically relevant information to predicted features in genomic sequences, and it is, therefore, an important procedure of any de novo genome sequencing project. It is also useful for proofreading and improving gene structural annotation. Here, we introduce FA-nf, a pipeline implemented in Nextflow, a versatile computational workflow management engine. The pipeline integrates different annotation approaches, such as NCBI BLAST+, DIAMOND, InterProScan, and KEGG. It starts from a protein sequence FASTA file and, optionally, a structural annotation file in GFF format, and produces several files, such as GO assignments, output summaries of the abovementioned programs and final annotation reports. The pipeline can be broken easily into smaller processes for the purpose of parallelization and easily deployed in a Linux computational environment, thanks to software containerization, thus helping to ensure full reproducibility." year: 2021 + volume: 12 + number: 10 + issn: 2073-4425 ... From dfca08fbd672e5ed34c3ea2248ff5c1753fd778a Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 17:42:12 +0100 Subject: [PATCH 327/381] Create citation.yml --- .github/workflows/citation.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/workflows/citation.yml diff --git a/.github/workflows/citation.yml b/.github/workflows/citation.yml new file mode 100644 index 0000000..dae7a50 --- /dev/null +++ b/.github/workflows/citation.yml @@ -0,0 +1,13 @@ +on: + push: + branches: + - main + pull_request: + +jobs: + validate_citation: + name: Validate CITATION.cff + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: LutrisEng/validate-cff@v1 From 4fdd545c3da12c60f8870325247c9274be4fc7d5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 17:44:54 +0100 Subject: [PATCH 328/381] Update citation.yml --- .github/workflows/citation.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/citation.yml b/.github/workflows/citation.yml index dae7a50..53fb4a6 100644 --- a/.github/workflows/citation.yml +++ b/.github/workflows/citation.yml @@ -1,7 +1,7 @@ +name: Check Citation.cff + on: push: - branches: - - main pull_request: jobs: From 8301f9956e17081ccc213523c0ce1f77482580f9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 17:46:55 +0100 Subject: [PATCH 329/381] Update citation.yml --- .github/workflows/citation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/citation.yml b/.github/workflows/citation.yml index 53fb4a6..7d72bd1 100644 --- a/.github/workflows/citation.yml +++ b/.github/workflows/citation.yml @@ -10,4 +10,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: LutrisEng/validate-cff@v1 + - uses: LutrisEng/validate-cff@v1.0.0 From 3a52a169be98e131dd927762e21bec2c341029ab Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:08:38 +0100 Subject: [PATCH 330/381] Update docker-latest.yml --- .github/workflows/docker-latest.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml index 64e7dba..c88532c 100644 --- a/.github/workflows/docker-latest.yml +++ b/.github/workflows/docker-latest.yml @@ -5,6 +5,11 @@ on: # Default branches below - main - master + pull_request: + branches: + # Default branches below + - main + - master jobs: push_to_registries: name: Push Docker image to multiple registries From 68ddb33eb51ae23bd08e1f1ca2945ada4c2dbe60 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:20:08 +0100 Subject: [PATCH 331/381] Update docker.yml fixing env --- .github/workflows/docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 61a8648..86352e8 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -34,9 +34,9 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ ref }} + tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ env.ref }} - name: Build container image uses: docker/build-push-action@v2 with: push: true - tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:${{ ref }} + tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:${{ env.ref }} From f8174dd6781de764143efec11a5a8927dd788d44 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:27:58 +0100 Subject: [PATCH 332/381] Create docker-trigger.yml --- .github/workflows/docker-trigger.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/docker-trigger.yml diff --git a/.github/workflows/docker-trigger.yml b/.github/workflows/docker-trigger.yml new file mode 100644 index 0000000..c29e761 --- /dev/null +++ b/.github/workflows/docker-trigger.yml @@ -0,0 +1,17 @@ +name: Docker release trigger +on: + workflow_dispatch: + +jobs: + get_release: + runs-on: ubuntu-latest + steps: + + - uses: actions/checkout@v2 + + - name: Fetch latest release version + id: fetch-latest-release + uses: reloc8/action-latest-release-version@1.0.0 + + - name: Test + run: echo ${{ steps.fetch-latest-release.outputs.latest-release }} From 3bc918949e4ba852ac0b1beeb7c2135ce2c08538 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:31:16 +0100 Subject: [PATCH 333/381] Update citation.yml restrict paths --- .github/workflows/citation.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/citation.yml b/.github/workflows/citation.yml index 7d72bd1..93b8f1d 100644 --- a/.github/workflows/citation.yml +++ b/.github/workflows/citation.yml @@ -2,7 +2,11 @@ name: Check Citation.cff on: push: + paths: + - 'CITATION.cff' pull_request: + paths: + - 'CITATION.cff' jobs: validate_citation: From c291e7773eca58bb7df6cbed8949c7da49e08b58 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:37:11 +0100 Subject: [PATCH 334/381] Update docker-trigger.yml --- .github/workflows/docker-trigger.yml | 36 +++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-trigger.yml b/.github/workflows/docker-trigger.yml index c29e761..d08c598 100644 --- a/.github/workflows/docker-trigger.yml +++ b/.github/workflows/docker-trigger.yml @@ -5,13 +5,43 @@ on: jobs: get_release: runs-on: ubuntu-latest + name: Push Docker image to multiple registries on demand + permissions: + packages: write + contents: read + steps: - uses: actions/checkout@v2 - name: Fetch latest release version - id: fetch-latest-release + id: latest-release uses: reloc8/action-latest-release-version@1.0.0 + + - name: Output latest release version + run: echo ${{ steps.latest-release.outputs.latest-release }} + + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Log in to GitHub Docker Registry + uses: docker/login-action@v1 + with: + registry: docker.pkg.github.com + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: String manipulation + uses: actions/checkout@v1 + - name: Push to Docker Hub + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ steps.latest-release.outputs.latest-release }} + - name: Build container image + uses: docker/build-push-action@v2 + with: + push: true + tags: docker.pkg.github.com/${{ secrets.DOCKER_ACCOUNT }}/fa-nf/fa-nf:${{ steps.latest-release.outputs.latest-release }} - - name: Test - run: echo ${{ steps.fetch-latest-release.outputs.latest-release }} From 06ed348fae1e845d8f49b2a95dba870eef125e66 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:45:14 +0100 Subject: [PATCH 335/381] Update docker-trigger.yml specific version --- .github/workflows/docker-trigger.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-trigger.yml b/.github/workflows/docker-trigger.yml index d08c598..5698c54 100644 --- a/.github/workflows/docker-trigger.yml +++ b/.github/workflows/docker-trigger.yml @@ -12,33 +12,36 @@ jobs: steps: - - uses: actions/checkout@v2 - - name: Fetch latest release version id: latest-release uses: reloc8/action-latest-release-version@1.0.0 - + - name: Output latest release version run: echo ${{ steps.latest-release.outputs.latest-release }} + + - uses: actions/checkout@v2 + with: + ref: ${{ steps.latest-release.outputs.latest-release }} - name: Log in to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Log in to GitHub Docker Registry uses: docker/login-action@v1 with: registry: docker.pkg.github.com username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: String manipulation - uses: actions/checkout@v1 + - name: Push to Docker Hub uses: docker/build-push-action@v2 with: push: true tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ steps.latest-release.outputs.latest-release }} + - name: Build container image uses: docker/build-push-action@v2 with: From 7129db6a436331d1abba6f8aedab61a83fac2a68 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:46:25 +0100 Subject: [PATCH 336/381] Update docker.yml --- .github/workflows/docker.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 86352e8..2c00b7c 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,24 +17,26 @@ jobs: echo "::set-env name=ref::$ref" env: github_ref: ${{ github.ref }} + - name: Log in to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Log in to GitHub Docker Registry uses: docker/login-action@v1 with: registry: docker.pkg.github.com username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: String manipulation - uses: actions/checkout@v1 + - name: Push to Docker Hub uses: docker/build-push-action@v2 with: push: true tags: ${{ secrets.DOCKER_ACCOUNT }}/fa-nf:${{ env.ref }} + - name: Build container image uses: docker/build-push-action@v2 with: From 6f2b7f3022ab50c97c6d44e13d13b0e2d7473901 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 17 Jan 2022 18:48:45 +0100 Subject: [PATCH 337/381] Update docker-trigger.yml --- .github/workflows/docker-trigger.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docker-trigger.yml b/.github/workflows/docker-trigger.yml index 5698c54..886580f 100644 --- a/.github/workflows/docker-trigger.yml +++ b/.github/workflows/docker-trigger.yml @@ -12,6 +12,8 @@ jobs: steps: + - uses: actions/checkout@v2 + - name: Fetch latest release version id: latest-release uses: reloc8/action-latest-release-version@1.0.0 From ed0299b2412cf2f34ffa5723fd96eb3be6a893ce Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 4 Feb 2022 17:20:49 +0100 Subject: [PATCH 338/381] some updates to test --- README.md | 6 +++--- containers/interproscan | 2 +- containers/sigtarp | 2 +- download.nf | 2 +- nextflow.config | 2 +- params.config | 4 ++-- params.download.config | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7c4893c..1cf3849 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Below you can see the minimal amount of parameters in ```params.download.config` // Root path for Database params.dbPath = "/nfs/db" // Interproscan version used - params.iprscanVersion = "5.48-83.0" + params.iprscanVersion = "5.52-86.0" // Kofam version used params.koVersion = "2021-05-02" // NCBI DB list - Comma separated @@ -225,9 +225,9 @@ It is **very important** to ensure that used Interproscan data directory matches Below the Interproscan parameters that can be tuned: ``` // Interproscan Version -iprscanVersion = "5.48-83.0" +iprscanVersion = "5.52-86.0" // Defined Interproscan Data directory. It will override version parameter above. -// ipscandata = "/nfs/db/iprscan/5.48-83.0" +// ipscandata = "/nfs/db/iprscan/5.52-86.0" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" ``` diff --git a/containers/interproscan b/containers/interproscan index ee74451..656e070 160000 --- a/containers/interproscan +++ b/containers/interproscan @@ -1 +1 @@ -Subproject commit ee74451692081efcbc38533e712b791c995cb628 +Subproject commit 656e07073f823c5777b0cbb6658c5cfab2290bcf diff --git a/containers/sigtarp b/containers/sigtarp index 4f9a243..2d486d6 160000 --- a/containers/sigtarp +++ b/containers/sigtarp @@ -1 +1 @@ -Subproject commit 4f9a243a8491cac24dae78496990b4fa1b0a8b7b +Subproject commit 2d486d6f75d4c1b8fadfe80c1f98ab26b18c33f7 diff --git a/download.nf b/download.nf index f2b7f25..0849d04 100644 --- a/download.nf +++ b/download.nf @@ -30,7 +30,7 @@ params.help = false params.dbPath = "/nfs/db" // Version -params.iprscanVersion = "5.48-83.0" +params.iprscanVersion = "5.52-86.0" params.koVersion = "2021-05-02" // URLs diff --git a/nextflow.config b/nextflow.config index 5af0e52..8dac196 100644 --- a/nextflow.config +++ b/nextflow.config @@ -64,7 +64,7 @@ process{ time='48h' cpus='8' // Modify container value below with the resulting image from: https://github.com/biocorecrg/interproscan_docker - container="biocorecrg/interproscan:5.48-83.0" + container="biocorecrg/interproscan:5.52-86.0" maxRetries=3 } diff --git a/params.config b/params.config index 4c3fe84..89d7480 100644 --- a/params.config +++ b/params.config @@ -40,9 +40,9 @@ params { // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it // oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Interproscan Version - iprscanVersion = "5.48-83.0" + iprscanVersion = "5.52-86.0" // Defined Interproscan Data directory. It will override version parameter above. - // ipscandata = "/nfs/db/iprscan/5.48-83.0" + // ipscandata = "/nfs/db/iprscan/5.52-86.0" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html diff --git a/params.download.config b/params.download.config index 4da4892..963dbd9 100644 --- a/params.download.config +++ b/params.download.config @@ -3,7 +3,7 @@ params { // Root path for Database params.dbPath = "/nfs/db" // Interproscan version used - params.iprscanVersion = "5.48-83.0" + params.iprscanVersion = "5.52-86.0" // Kofam version used params.koVersion = "2021-05-02" // NCBI DB list - Comma separated From bc3e286c69d7f3cabb370cced95d0cb4dee7c0c9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 10 Feb 2022 15:45:38 +0100 Subject: [PATCH 339/381] updating version --- nextflow.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 8dac196..840bbf5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,7 @@ process{ queue='biocore-el7,long-sl7' time='48h' cpus='8' - container="ncbi/blast:2.10.1" + container="ncbi/blast:2.12.0" } withLabel: diamond { @@ -64,7 +64,7 @@ process{ time='48h' cpus='8' // Modify container value below with the resulting image from: https://github.com/biocorecrg/interproscan_docker - container="biocorecrg/interproscan:5.52-86.0" + container="biocorecrg/interproscan:5.54-87.0" maxRetries=3 } @@ -72,7 +72,7 @@ process{ queue='biocore-el7,long-sl7' time='48h' cpus='8' - container="quay.io/biocontainers/kofamscan:1.2.0--0" + container="quay.io/biocontainers/kofamscan:1.3.0--hdfd78af_2" } withLabel: kegg_upload { From 9805b0597cf34c3dca33182cf8d05db72d94387b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Feb 2022 11:50:17 +0100 Subject: [PATCH 340/381] some move --- Dockerfile | 8 ++++---- {scripts => bin}/blast-annotator.pl | 0 {scripts => bin}/checkDB.sh | 0 {scripts => bin}/definitionFromBlast.pl | 0 {scripts => bin}/download_kegg_KAAS.pl | 0 {scripts => bin}/fa_main.v1.pl | 0 {scripts => bin}/get_gff3.pl | 0 {scripts => bin}/get_results.pl | 0 {scripts => bin}/hugeBlast2XML.pl | 0 {scripts => bin}/import_data.pl | 0 {scripts => bin}/lib/FunctionalAnnotation/DB.pm | 0 .../lib/FunctionalAnnotation/Utils/Argument.pm | 0 {scripts => bin}/lib/FunctionalAnnotation/getResults.pm | 0 {scripts => bin}/lib/FunctionalAnnotation/sqlDB.pm | 0 {scripts => bin}/lib/FunctionalAnnotation/uploadData.pm | 0 {scripts => bin}/lib/SQL.schema.sql | 0 {scripts => bin}/lib/SQL.schema.sqlite.sql | 0 {scripts => bin}/load_CBSpredictions.signalP.pl | 0 {scripts => bin}/load_kegg_KAAS.pl | 0 {scripts => bin}/plotProtLengthDistribution.R | 0 {scripts => bin}/processHmmscan2TSV.pl | 0 {scripts => bin}/run_interpro.pl | 0 {scripts => bin}/submitCDsearch.pl | 0 {scripts => bin}/upload_CDsearch.pl | 0 {scripts => bin}/upload_go_definitions.pl | 0 containers/interproscan | 2 +- containers/sigtarp | 2 +- 27 files changed, 6 insertions(+), 6 deletions(-) rename {scripts => bin}/blast-annotator.pl (100%) rename {scripts => bin}/checkDB.sh (100%) rename {scripts => bin}/definitionFromBlast.pl (100%) rename {scripts => bin}/download_kegg_KAAS.pl (100%) rename {scripts => bin}/fa_main.v1.pl (100%) rename {scripts => bin}/get_gff3.pl (100%) rename {scripts => bin}/get_results.pl (100%) rename {scripts => bin}/hugeBlast2XML.pl (100%) rename {scripts => bin}/import_data.pl (100%) rename {scripts => bin}/lib/FunctionalAnnotation/DB.pm (100%) rename {scripts => bin}/lib/FunctionalAnnotation/Utils/Argument.pm (100%) rename {scripts => bin}/lib/FunctionalAnnotation/getResults.pm (100%) rename {scripts => bin}/lib/FunctionalAnnotation/sqlDB.pm (100%) rename {scripts => bin}/lib/FunctionalAnnotation/uploadData.pm (100%) rename {scripts => bin}/lib/SQL.schema.sql (100%) rename {scripts => bin}/lib/SQL.schema.sqlite.sql (100%) rename {scripts => bin}/load_CBSpredictions.signalP.pl (100%) rename {scripts => bin}/load_kegg_KAAS.pl (100%) rename {scripts => bin}/plotProtLengthDistribution.R (100%) rename {scripts => bin}/processHmmscan2TSV.pl (100%) rename {scripts => bin}/run_interpro.pl (100%) rename {scripts => bin}/submitCDsearch.pl (100%) rename {scripts => bin}/upload_CDsearch.pl (100%) rename {scripts => bin}/upload_go_definitions.pl (100%) diff --git a/Dockerfile b/Dockerfile index 5d43a29..12b0110 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,9 +40,9 @@ RUN apt-get clean RUN set -x; rm -rf /var/lib/apt/lists/* # Place /scripts -RUN mkdir -p /scripts +# RUN mkdir -p /scripts -ENV PATH /scripts:$PATH +# ENV PATH /scripts:$PATH -COPY scripts/ /scripts/ -RUN chmod -R a+rx /scripts/* +# COPY scripts/ /scripts/ +# RUN chmod -R a+rx /scripts/* diff --git a/scripts/blast-annotator.pl b/bin/blast-annotator.pl similarity index 100% rename from scripts/blast-annotator.pl rename to bin/blast-annotator.pl diff --git a/scripts/checkDB.sh b/bin/checkDB.sh similarity index 100% rename from scripts/checkDB.sh rename to bin/checkDB.sh diff --git a/scripts/definitionFromBlast.pl b/bin/definitionFromBlast.pl similarity index 100% rename from scripts/definitionFromBlast.pl rename to bin/definitionFromBlast.pl diff --git a/scripts/download_kegg_KAAS.pl b/bin/download_kegg_KAAS.pl similarity index 100% rename from scripts/download_kegg_KAAS.pl rename to bin/download_kegg_KAAS.pl diff --git a/scripts/fa_main.v1.pl b/bin/fa_main.v1.pl similarity index 100% rename from scripts/fa_main.v1.pl rename to bin/fa_main.v1.pl diff --git a/scripts/get_gff3.pl b/bin/get_gff3.pl similarity index 100% rename from scripts/get_gff3.pl rename to bin/get_gff3.pl diff --git a/scripts/get_results.pl b/bin/get_results.pl similarity index 100% rename from scripts/get_results.pl rename to bin/get_results.pl diff --git a/scripts/hugeBlast2XML.pl b/bin/hugeBlast2XML.pl similarity index 100% rename from scripts/hugeBlast2XML.pl rename to bin/hugeBlast2XML.pl diff --git a/scripts/import_data.pl b/bin/import_data.pl similarity index 100% rename from scripts/import_data.pl rename to bin/import_data.pl diff --git a/scripts/lib/FunctionalAnnotation/DB.pm b/bin/lib/FunctionalAnnotation/DB.pm similarity index 100% rename from scripts/lib/FunctionalAnnotation/DB.pm rename to bin/lib/FunctionalAnnotation/DB.pm diff --git a/scripts/lib/FunctionalAnnotation/Utils/Argument.pm b/bin/lib/FunctionalAnnotation/Utils/Argument.pm similarity index 100% rename from scripts/lib/FunctionalAnnotation/Utils/Argument.pm rename to bin/lib/FunctionalAnnotation/Utils/Argument.pm diff --git a/scripts/lib/FunctionalAnnotation/getResults.pm b/bin/lib/FunctionalAnnotation/getResults.pm similarity index 100% rename from scripts/lib/FunctionalAnnotation/getResults.pm rename to bin/lib/FunctionalAnnotation/getResults.pm diff --git a/scripts/lib/FunctionalAnnotation/sqlDB.pm b/bin/lib/FunctionalAnnotation/sqlDB.pm similarity index 100% rename from scripts/lib/FunctionalAnnotation/sqlDB.pm rename to bin/lib/FunctionalAnnotation/sqlDB.pm diff --git a/scripts/lib/FunctionalAnnotation/uploadData.pm b/bin/lib/FunctionalAnnotation/uploadData.pm similarity index 100% rename from scripts/lib/FunctionalAnnotation/uploadData.pm rename to bin/lib/FunctionalAnnotation/uploadData.pm diff --git a/scripts/lib/SQL.schema.sql b/bin/lib/SQL.schema.sql similarity index 100% rename from scripts/lib/SQL.schema.sql rename to bin/lib/SQL.schema.sql diff --git a/scripts/lib/SQL.schema.sqlite.sql b/bin/lib/SQL.schema.sqlite.sql similarity index 100% rename from scripts/lib/SQL.schema.sqlite.sql rename to bin/lib/SQL.schema.sqlite.sql diff --git a/scripts/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl similarity index 100% rename from scripts/load_CBSpredictions.signalP.pl rename to bin/load_CBSpredictions.signalP.pl diff --git a/scripts/load_kegg_KAAS.pl b/bin/load_kegg_KAAS.pl similarity index 100% rename from scripts/load_kegg_KAAS.pl rename to bin/load_kegg_KAAS.pl diff --git a/scripts/plotProtLengthDistribution.R b/bin/plotProtLengthDistribution.R similarity index 100% rename from scripts/plotProtLengthDistribution.R rename to bin/plotProtLengthDistribution.R diff --git a/scripts/processHmmscan2TSV.pl b/bin/processHmmscan2TSV.pl similarity index 100% rename from scripts/processHmmscan2TSV.pl rename to bin/processHmmscan2TSV.pl diff --git a/scripts/run_interpro.pl b/bin/run_interpro.pl similarity index 100% rename from scripts/run_interpro.pl rename to bin/run_interpro.pl diff --git a/scripts/submitCDsearch.pl b/bin/submitCDsearch.pl similarity index 100% rename from scripts/submitCDsearch.pl rename to bin/submitCDsearch.pl diff --git a/scripts/upload_CDsearch.pl b/bin/upload_CDsearch.pl similarity index 100% rename from scripts/upload_CDsearch.pl rename to bin/upload_CDsearch.pl diff --git a/scripts/upload_go_definitions.pl b/bin/upload_go_definitions.pl similarity index 100% rename from scripts/upload_go_definitions.pl rename to bin/upload_go_definitions.pl diff --git a/containers/interproscan b/containers/interproscan index 656e070..ee74451 160000 --- a/containers/interproscan +++ b/containers/interproscan @@ -1 +1 @@ -Subproject commit 656e07073f823c5777b0cbb6658c5cfab2290bcf +Subproject commit ee74451692081efcbc38533e712b791c995cb628 diff --git a/containers/sigtarp b/containers/sigtarp index 2d486d6..4f9a243 160000 --- a/containers/sigtarp +++ b/containers/sigtarp @@ -1 +1 @@ -Subproject commit 2d486d6f75d4c1b8fadfe80c1f98ab26b18c33f7 +Subproject commit 4f9a243a8491cac24dae78496990b4fa1b0a8b7b From 47a0d136d8bad6e7321ba9a05970056629697b11 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Feb 2022 14:56:12 +0100 Subject: [PATCH 341/381] update iprscan and blast --- params.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/params.config b/params.config index 89d7480..9de7ddf 100644 --- a/params.config +++ b/params.config @@ -29,7 +29,7 @@ params { // Base DB Path dbPath = "/nfs/db" // Blast DB. Check README for details - // blastDbPath = "/nfs/db/ncbi/201908/blastdb/db/swissprot" + // blastDbPath = "/nfs/db/ncbi/202111/blastdb/db/swissprot" // Instance from where to retrieve GO mappings. You can set up your own from: https://github.com/toniher/gogoAPI gogourl = "http://gogo.test.crg.eu/api" // Maximum number of hits to consider (up to 30 by default)) @@ -40,9 +40,9 @@ params { // Pre-downloaded OBO file with GO descriptions. Otherwise pipeline will download it // oboFile = "${baseDir}/dataset/gene_ontology_ext.obo" // Interproscan Version - iprscanVersion = "5.52-86.0" + iprscanVersion = "5.54-87.0" // Defined Interproscan Data directory. It will override version parameter above. - // ipscandata = "/nfs/db/iprscan/5.52-86.0" + // ipscandata = "/nfs/db/iprscan/5.54-87.0" // Directory where to store intermediary Interproscan files (ensure there is enough space) ipscantmp = "${baseDir}/tmp/" // Kegg species codes to retrieve ortholog information. Codes from: https://www.genome.jp/kegg/catalog/org_list.html From 2f339c355b7aa18c4646e663cf18deeea9945759 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Feb 2022 16:48:01 +0100 Subject: [PATCH 342/381] comment problematic case --- bin/lib/FunctionalAnnotation/uploadData.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/lib/FunctionalAnnotation/uploadData.pm b/bin/lib/FunctionalAnnotation/uploadData.pm index df918b7..f1787f1 100644 --- a/bin/lib/FunctionalAnnotation/uploadData.pm +++ b/bin/lib/FunctionalAnnotation/uploadData.pm @@ -1128,7 +1128,7 @@ sub parseAnnotation if ( $annotTerm eq '#' ) { - ($proteinName, $annotTerm)=$line=~/^(\S+)\s+\#\s+(\S.*)\s*/; + ($proteinName, $annotTerm)=$line=~/^(\S+)\s+\#\s*(\S.*)\s*/; } @@ -1142,8 +1142,8 @@ sub parseAnnotation #another patch - Wheat proteins from fasta file (that was used for kegg web search) have additional protein length in it., need to remove it/ # $proteinName=~s/^(TAES1a\S+)\_\d+$/$1/; - if($proteinName =~/([^_]+)\_\d+/) - {$proteinName=$1;} + #if($proteinName =~/([^_]+)\_\d+/) + #{$proteinName=$1;} # Let's ensure everything uploaded should be OK if ( $proteinName && $annotTerm ) { From caa75235a74ed670beec8ab6fd9803624c8e0ce0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Feb 2022 16:55:24 +0100 Subject: [PATCH 343/381] update sigtarp --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 840bbf5..0a670c7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -49,7 +49,7 @@ process{ withLabel: sigtarp { queue='biocore-el7,short-sl7' // Modify container value below with the resulting image from: https://github.com/biocorecrg/sigtarp_docker - container="/software/bi/biocore_tools/git/singularity/sigtarp.sif" + container="/software/bi/biocore_tools/git/singularity/sigtarp/sigtarp-5.0b.sif" } // Process skipped with 'skip_cdSearch = true' in params.config From 106f1e21b7838bd40ac945f169729f016f5df353 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Feb 2022 18:10:55 +0100 Subject: [PATCH 344/381] adding signalp and targetp --- main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 672fd3d..e5f45aa 100644 --- a/main.nf +++ b/main.nf @@ -1,13 +1,13 @@ #!/usr/bin/env nextflow /* - * Copyright (c) 2017-2021, Centre for Genomic Regulation (CRG) + * Copyright (c) 2017-2022, Centre for Genomic Regulation (CRG) * * Copyright (c) 2017, Anna Vlasova * * Copyright (c) 2017, Emilio Palumbo * - * Copyright (c) 2018-2021, Toni Hermoso Pulido + * Copyright (c) 2018-2022, Toni Hermoso Pulido * * Functional Annotation Pipeline for protein annotation from non-model organisms * from Genome Annotation Team in Catalonia (GATC) implemented in Nextflow @@ -945,7 +945,7 @@ if ( skip_sigtarp ) { file("out_signalp_${seq}") into (signalP_result1, signalP_result2) """ - signalp $seq > out_signalp_${seq} + signalp -fasta $seq -stdout > out_signalp_${seq} """ } @@ -960,7 +960,7 @@ if ( skip_sigtarp ) { file("out_targetp_${seq}") into (targetP_result1, targetP_result2) """ - targetp -P -c $seq > out_targetp_${seq} + targetp -fasta $seq -stdout > out_targetp_${seq} """ } From d6cf5ade76ec08688882924ac753b93ecbd669a0 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 11 Feb 2022 18:21:39 +0100 Subject: [PATCH 345/381] allow output koala results --- main.nf | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index e5f45aa..6af9bdb 100644 --- a/main.nf +++ b/main.nf @@ -740,7 +740,7 @@ if ( kolist != "" || kolist != null ){ file "koala_*" from koalaResults.collect() output: - file allKoala into koala_parsed + file allKoala into ( koala_parsed, koala_parsed2 ) """ @@ -1313,3 +1313,10 @@ if ( ! skip_sigtarp ) { ipscn_result2 .collectFile(name: file(params.resultPath + "interProScan.res.tsv")) .println { "Result saved to file: $it" } + +if ( kolist != "" || kolist != null ){ + + koala_parsed2 + .collectFile(name: file(params.resultPath + "koala.res.tsv")) + .println { "Result saved to file: $it" } +} From 61dbf60a4b264560522810e8adccda8b912171d1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 11:40:45 +0100 Subject: [PATCH 346/381] no db mode --- TODO.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 7a25a51..8ef175e 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,11 @@ * Log directory check -* Uncompress input files on the fly * Initial check for FASTA file * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) +* Include no DB mode for scripts - for debugging * Include some testing and CI * Visualization of results * Venn Diagrams --- -* Singularity file for run_mysql wrapper process * Allow conversion from GenBank https://metacpan.org/pod/bp_genbank2gff3.pl * Allow reports from KEGG orthologs (number of potential orthologs from KEGG species) * blast_hit reconsider From 4d9169418c491ccc48e98f4979471092b239a69f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 12:13:50 +0100 Subject: [PATCH 347/381] new versions --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 8ef175e..cd6371c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,4 @@ +* Allow parsing new versions of SignalP and targetP * Log directory check * Initial check for FASTA file * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) From 6772d6422a839321b6042cf7a8c73d4462dcde82 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 13:40:11 +0100 Subject: [PATCH 348/381] steps --- TODO.md | 1 + bin/load_CBSpredictions.signalP.pl | 124 ++++++++++++++--------------- 2 files changed, 59 insertions(+), 66 deletions(-) diff --git a/TODO.md b/TODO.md index cd6371c..1f37bdc 100644 --- a/TODO.md +++ b/TODO.md @@ -3,6 +3,7 @@ * Initial check for FASTA file * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Include no DB mode for scripts - for debugging +* Move all database process as a last step in the end * Include some testing and CI * Visualization of results * Venn Diagrams diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 96a8b67..f14828e 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -29,7 +29,7 @@ =head2 Options --conf= Configuration file with details for DB connections, pathways and so on. [Mandatory] --type Result type - either signalP, targetP or chloroP predictions [s/t/c] [Mandatory, 's' by default] - + --help This documentation. =head1 AUTHOR @@ -60,15 +60,15 @@ =head1 AUTHOR &GetOptions( 'i|idf=s' => \$idfile, - 'conf=s'=>\$confFile, - 'type=s'=>\$type, + 'conf=s'=>\$confFile, + 'type=s'=>\$type, 'help|h' => \$show_help ) or pod2usage(-verbose=>2); pod2usage(-verbose=>2) if $show_help; my $cfg = new Config::Simple($confFile); -#put config parameters into %config +#put config parameters into %config my %config = $cfg->vars(); #my %conf = %::conf; my $debug = $config{'debug'}; @@ -77,7 +77,7 @@ =head1 AUTHOR my $dbh; #connect to the DB if(lc( $config{'dbEngine'} ) eq 'mysql') -{ +{ $dbh = DBI->connect( "DBI:mysql:database=".$config{'dbname'}.";host=".$config{'dbhost'}.";port=".$config{'dbport'}, $config{'dbuser'}, $config{'dbpass'}); } @@ -85,7 +85,7 @@ =head1 AUTHOR { my $dbName = $config{'resultPath'}.$config{'dbname'}.'.db'; my $dsn = "DBI:SQLite:dbname=$dbName"; - $dbh= DBI->connect("DBI:SQLite:dbname=$dbName","", "", { + $dbh= DBI->connect("DBI:SQLite:dbname=$dbName","", "", { RaiseError => 1, ShowErrorStatement => 1, sqlite_use_immediate_transaction => 1, @@ -94,7 +94,7 @@ =head1 AUTHOR #my %conf = %::conf; -die "You must specify a file with the predictions\n Use -h for help" +die "You must specify a file with the predictions\n Use -h for help" if !$idfile; my %dataHash = &parseCBSpredictionsData($idfile,$type); @@ -112,62 +112,61 @@ =head1 AUTHOR sub uploadCBSpredictionsFast { my ($dbh, $dataHash,$engine, $type)=@_; - + my($select, $result,$table,$tableId ,$selectString, $insertString, $updateString); my @keys=(); - if($type eq 's') - { - $table = 'signalP'; - $tableId = 'signalP_id'; - @keys=('start', 'end', 'score'); - if ( $engine eq 'mysql' ) { - $insertString = "INSERT INTO $table (protein_id,".join(",",@keys).") VALUES(?,?,?,?)"; - } else { - $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys).") VALUES(NULL,?,?,?,?)"; - } - } - elsif($type eq 'c') - {$table = 'chloroP'; - $tableId = 'chloroP_id'; - @keys=('start', 'end', 'score'); - if ( $engine eq 'mysql' ) { - $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?,?)"; - } else { - $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys)." ) VALUES(NULL,?,?,?,?)"; - } - } - elsif($type eq 't') - {$table = 'targetP'; - $tableId = 'targetP_id'; - @keys=('location','RC'); - if ( $engine eq 'mysql' ) { - $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?)"; - } else { - $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys)." ) VALUES(NULL,?,?,?)"; - } - } - + if($type eq 's') { + $table = 'signalP'; + $tableId = 'signalP_id'; + @keys=('start', 'end', 'score'); + if ( $engine eq 'mysql' ) { + $insertString = "INSERT INTO $table (protein_id,".join(",",@keys).") VALUES(?,?,?,?)"; + } else { + $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys).") VALUES(NULL,?,?,?,?)"; + } + } + elsif($type eq 'c') { + $table = 'chloroP'; + $tableId = 'chloroP_id'; + @keys=('start', 'end', 'score'); + if ( $engine eq 'mysql' ) { + $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?,?)"; + } else { + $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys)." ) VALUES(NULL,?,?,?,?)"; + } + } + elsif($type eq 't') { + $table = 'targetP'; + $tableId = 'targetP_id'; + @keys=('location','RC'); + if ( $engine eq 'mysql' ) { + $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?)"; + } else { + $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys)." ) VALUES(NULL,?,?,?)"; + } + } + my $sth = $dbh->prepare($insertString); foreach my $protItem (keys %{$dataHash}) { $select = "select protein_id from protein where stable_id like '%$protItem%'"; - my $sth2 = $dbh->prepare($select); + my $sth2 = $dbh->prepare($select); $sth2->execute(); my $proteinId = $sth2->fetchrow()||''; $sth2->finish(); - + if ( $proteinId eq '' ) { next; # No protein ID, let's skip } - + my $setString=''; my @setData=(); push(@setData,$proteinId); # for SQLite engine only - + foreach my $keyItem(@keys) { push(@setData, processType( $dataHash->{$protItem}{$keyItem} ) ); @@ -178,7 +177,7 @@ sub uploadCBSpredictionsFast # $sth->commit; # $sth->finish(); } - + $sth->finish(); } @@ -196,56 +195,49 @@ sub processType { } -sub parseCBSpredictionsData -{ +sub parseCBSpredictionsData { my ($fileName, $pType) = @_; my %retData=(); my @data=(); - + my($protName); - open(IN, $fileName)|| die "Can't open $fileName for reading $!\n"; - while(my $line=) - { + open(IN, $fileName) || die "Can't open $fileName for reading $!\n"; + while(my $line=) { chomp($line); - if($line=~/^\#/) - {next;} + if($line=~/^\#/) {next;} @data=split(/\s+/,$line); if(scalar(@data) < 6) {next;} #for signalP - if($type eq 's') - { + if($type eq 's') { if($data[9] eq 'Y'){ $protName=$data[0]; $retData{$protName}{'start'} = 1; $retData{$protName}{'end'} = $data[2]; $retData{$protName}{'score'} = $data[8]; } - } + } #for chloroP - elsif($type eq 'c') - { + elsif($type eq 'c') { if($data[3] eq 'Y'){ $protName=$data[0]; $retData{$protName}{'start'} = 1; $retData{$protName}{'end'} = $data[5]; $retData{$protName}{'score'} = $data[2]; - } - } + } + } #for targetP - elsif($type eq 't') - { + elsif($type eq 't') { if($data[6] ne '_'){ $protName=$data[0]; $retData{$protName}{'location'} = $data[6]; $retData{$protName}{'RC'} = $data[7]; } } - else - {die "Error: Unknown type of the input data, can not proceed!\n";} - } + else + {die "Error: Unknown type of the input data, can not proceed!\n";} + } close(IN); return %retData; } - From fede76aa416949bfb9ff99ee3ffad3cd3926fefe Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 14:48:23 +0100 Subject: [PATCH 349/381] merge generation results --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 1f37bdc..d60331f 100644 --- a/TODO.md +++ b/TODO.md @@ -4,6 +4,7 @@ * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Include no DB mode for scripts - for debugging * Move all database process as a last step in the end +* Merge two generation results * Include some testing and CI * Visualization of results * Venn Diagrams From 4a3b2142ad959b80b3aff20442159d0c57bf52d2 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 14:53:19 +0100 Subject: [PATCH 350/381] merge generateResults --- README.md | 3 +-- TODO.md | 1 - main.nf | 34 +++++++++------------------------- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 1cf3849..4746e50 100644 --- a/README.md +++ b/README.md @@ -178,8 +178,7 @@ One of the strenghts of Nextflow is allowing the parallelization and merging of * **blast_annotator_upload**: it uploads GO terms from BLAST hits into the DB * **kegg_download**: it downloads KO (Kegg Ortholog) from KEGG * **kegg_upload**: it retrieves and uploads KEGG data (either from a KAAS file or KofamKOALA) into the DB -* **generateResultFiles**: it generates report files -* **generateGFF3File**: if GFF provided as input, it provides a modified GFF with additional information from the previous annotation steps +* **generateResultFiles**: it generates report files. If GFF provided as input, it provides a modified GFF with additional information from the previous annotation steps ### GFF preparation diff --git a/TODO.md b/TODO.md index d60331f..1f37bdc 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,6 @@ * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) * Include no DB mode for scripts - for debugging * Move all database process as a last step in the end -* Merge two generation results * Include some testing and CI * Visualization of results * Venn Diagrams diff --git a/main.nf b/main.nf index 6af9bdb..2a27005 100644 --- a/main.nf +++ b/main.nf @@ -517,7 +517,7 @@ process initDB { file seq from seq_test output: - file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10, config4perl11) + file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10) script: command = "mkdir -p $params.resultPath\n" @@ -1175,7 +1175,7 @@ process 'blast_annotator_upload' { file upload_kegg from upload_kegg output: - file('done') into (last_step1, last_step2) + file('done') into (last_step) script: @@ -1193,41 +1193,25 @@ process 'blast_annotator_upload' { process 'generateResultFiles'{ input: file config from config4perl10 - file all_done from last_step1 + file all_done from last_step script: command = checkMySQL( mysql, params.mysqllog ) - command += " \ - get_results.pl -conf \$config -obo ${oboFile} ; \ - " - - command -} - -if ( annotation != null && annotation != "" ){ - -process 'generateGFF3File'{ - input: - file config from config4perl11 - file all_done from last_step2 - - - script: - - command = checkMySQL( mysql, params.mysqllog ) + if ( annotation != null && annotation != "" ){ + command += " \ + get_gff3.pl -conf \$config ; \ + " + } - // TODO: add case for debug using -list command += " \ - get_gff3.pl -conf \$config ; \ + get_results.pl -conf \$config -obo ${oboFile} ; \ " command } -} - // Check MySQL IP def checkMySQL( mysql, mysqllog ) { From e22592c25debd0b2b999a5a4e9bf2105f23213ee Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 15:25:56 +0100 Subject: [PATCH 351/381] simplify --- README.md | 9 +-- main.nf | 234 +++++++++++++----------------------------------------- 2 files changed, 58 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index 4746e50..e47ca93 100644 --- a/README.md +++ b/README.md @@ -170,14 +170,7 @@ One of the strenghts of Nextflow is allowing the parallelization and merging of * **cdSearchHit**: it performs a NCBI CDSearch Hit query * **cdSearchFeat**: it performs a NCBI CDSearch Feature query * **initDB**: it initialitzes the database used for gathering data from different analyses and later generating the reports. Starting inputs are FASTA and GFF files -* **definition_upload**: it uploads definitions derived from BLAST into the DB -* **signalP_upload**: it uploads signalP analyses into the DB -* **targetP_upload**: it uploads targetP analyses into the DB -* **CDSearch_hit_upload**: : it uploads NCBI CDSearch Hit analyses into the DB -* **CDSearch_feat_upload**: it uploads NCBI CDSearch Feature analyses into the DB -* **blast_annotator_upload**: it uploads GO terms from BLAST hits into the DB -* **kegg_download**: it downloads KO (Kegg Ortholog) from KEGG -* **kegg_upload**: it retrieves and uploads KEGG data (either from a KAAS file or KofamKOALA) into the DB +* **data_upload**: it uploads all the data from the different analyses into the DB * **generateResultFiles**: it generates report files. If GFF provided as input, it provides a modified GFF with additional information from the previous annotation steps ### GFF preparation diff --git a/main.nf b/main.nf index 2a27005..e2b40a8 100644 --- a/main.nf +++ b/main.nf @@ -517,7 +517,7 @@ process initDB { file seq from seq_test output: - file 'config' into (config4perl1, config4perl2, config4perl3, config4perl4, config4perl5, config4perl6, config4perl7, config4perl8, config4perl9, config4perl10) + file 'config' into (config4perl7, config4perl8, config4perl10) script: command = "mkdir -p $params.resultPath\n" @@ -806,30 +806,6 @@ process blastDef { """ } -process 'definition_upload'{ - - maxForks 1 - - // publishDir "results", mode: 'copy' - input: - file "def*" from blastDef_results.collect() - file config from config4perl1 - - output: - file 'def_done' into definition_passed - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat def* > allDef; \ - upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ - " - - command -} - process ipscn { label 'ipscan' @@ -966,128 +942,6 @@ if ( skip_sigtarp ) { } -process 'signalP_upload'{ - - maxForks 1 - - input: - file "out_signalp*" from signalP_result1.collect() - file config from config4perl2 - - output: - file("upload_signalp") into upload_signalp - - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_signalp* > allSignal ; \ - load_CBSpredictions.signalP.pl -i allSignal -conf \$config -type s > upload_signalp ; \ - " - - command -} - - -process 'targetP_upload'{ - - maxForks 1 - - input: - file "out_targetp*" from targetP_result1.collect() - file config from config4perl3 - file upload_signalp from upload_signalp - - output: - file("upload_targetp") into upload_targetp - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_targetp* > allTarget ; \ - load_CBSpredictions.signalP.pl -i allTarget -conf \$config -type t > upload_targetp ; \ - " - - command -} - -process 'interpro_upload'{ - - maxForks 1 - - input: - file "out_interpro*" from ipscn_result1.collect() - file config from config4perl4 - file upload_targetp from upload_targetp - - output: - file("upload_interpro") into upload_interpro - - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_interpro* > allInterpro ; \ - run_interpro.pl -mode upload -i allInterpro -conf \$config > upload_interpro ; \ - " - - command -} - - -process 'CDsearch_hit_upload'{ - - maxForks 1 - - input: - file "out_hit*" from cdSearch_hit_result.collect() - file config from config4perl5 - file upload_interpro from upload_interpro - - output: - file("upload_hit") into upload_hit - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_hit* > allCDsearchHit ; \ - upload_CDsearch.pl -i allCDsearchHit -type h -conf \$config > upload_hit ; \ - " - - command -} - -process 'CDsearch_feat_upload'{ - - maxForks 1 - - input: - file "out_feat*" from cdSearch_feat_result.collect() - file config from config4perl6 - file upload_hit from upload_hit - - output: - file("upload_feat") into upload_feat - - script: - - command = checkMySQL( mysql, params.mysqllog ) - - command += " \ - cat out_feat* > allCDsearchFeat ; \ - upload_CDsearch.pl -i allCDsearchFeat -type f -conf \$config > upload_feat ; \ - " - - command -} if ( ! koentries ) { @@ -1131,48 +985,33 @@ if ( ! koentries ) { } } -process 'kegg_upload' { - label 'kegg_upload' - maxForks 1 +process 'data_upload' { - input: - file keggfile from keggfile - file config from config4perl9 - file upload_feat from upload_feat - file("down_kegg") from down_kegg - - output: - file('upload_kegg') into (upload_kegg) + maxForks 1 + label 'upload' - script: + input: - command = checkMySQL( mysql, params.mysqllog ) + file "def*" from blastDef_results.collect() + file "out_signalp*" from signalP_result1.collect() + file "out_targetp*" from targetP_result1.collect() - if ( ! koentries ) { - command += " \ - load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ - " - } else { - command += " \ - load_kegg_KAAS.pl -input $keggfile -entries $koentries -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ - " - } + file "out_interpro*" from ipscn_result1.collect() - command -} + file "out_hit*" from cdSearch_hit_result.collect() + file "out_feat*" from cdSearch_feat_result.collect() -process 'blast_annotator_upload' { + file keggfile from keggfile - maxForks 1 + file("down_kegg") from down_kegg - input: file "blastAnnot*" from blast_annotator_results.collect() + file config from config4perl7 - file upload_kegg from upload_kegg output: file('done') into (last_step) @@ -1182,11 +1021,52 @@ process 'blast_annotator_upload' { command = checkMySQL( mysql, params.mysqllog ) command += " \ + cat def* > allDef; \ + upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ + " + + command += " \ + cat out_signalp* > allSignal ; \ + load_CBSpredictions.signalP.pl -i allSignal -conf \$config -type s > upload_signalp ; \ + " + + command += " \ + cat out_targetp* > allTarget ; \ + load_CBSpredictions.signalP.pl -i allTarget -conf \$config -type t > upload_targetp ; \ + " + + command += " \ + cat out_interpro* > allInterpro ; \ + run_interpro.pl -mode upload -i allInterpro -conf \$config > upload_interpro ; \ + " + + command += " \ + cat out_hit* > allCDsearchHit ; \ + upload_CDsearch.pl -i allCDsearchHit -type h -conf \$config > upload_hit ; \ + " + + command += " \ + cat out_feat* > allCDsearchFeat ; \ + upload_CDsearch.pl -i allCDsearchFeat -type f -conf \$config > upload_feat ; \ + " + + command += " \ + # Blast Annotator cat blastAnnot* > allBlast ; \ - awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file ; \ - upload_go_definitions.pl -i two_column_file -conf \$config -mode go -param 'blast_annotator' > done ; \ + awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file_blast ; \ + upload_go_definitions.pl -i two_column_file_blast -conf \$config -mode go -param 'blast_annotator' > done ; \ " + if ( ! koentries ) { + command += " \ + load_kegg_KAAS.pl -input $keggfile -dir down_kegg -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ + " + } else { + command += " \ + load_kegg_KAAS.pl -input $keggfile -entries $koentries -rel $params.kegg_release -conf \$config > upload_kegg 2>err; \ + " + } + command } From d84907890b0c6e42faf28df9dac62147d3d07c10 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 15:26:32 +0100 Subject: [PATCH 352/381] change label --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 0a670c7..35c7058 100644 --- a/nextflow.config +++ b/nextflow.config @@ -75,7 +75,7 @@ process{ container="quay.io/biocontainers/kofamscan:1.3.0--hdfd78af_2" } - withLabel: kegg_upload { + withLabel: upload { time='48h' } } From 98d672d54236e9e5a957abcc8d82ab0300c39f0f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 15:36:28 +0100 Subject: [PATCH 353/381] fix space --- main.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/main.nf b/main.nf index e2b40a8..4971078 100644 --- a/main.nf +++ b/main.nf @@ -985,8 +985,6 @@ if ( ! koentries ) { } } - - process 'data_upload' { maxForks 1 @@ -1051,7 +1049,6 @@ process 'data_upload' { " command += " \ - # Blast Annotator cat blastAnnot* > allBlast ; \ awk '\$2!=\"#\"{print \$1\"\t\"\$2}' allBlast > two_column_file_blast ; \ upload_go_definitions.pl -i two_column_file_blast -conf \$config -mode go -param 'blast_annotator' > done ; \ From 477d2591edbca88110842982c67589c181552636 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 16:28:42 +0100 Subject: [PATCH 354/381] moving down data process --- main.nf | 107 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/main.nf b/main.nf index 4971078..0dbf851 100644 --- a/main.nf +++ b/main.nf @@ -508,59 +508,6 @@ if ( gffavail ) { } } -// Database setup below -process initDB { - - input: - file config_file - file gff_file - file seq from seq_test - - output: - file 'config' into (config4perl7, config4perl8, config4perl10) - - script: - command = "mkdir -p $params.resultPath\n" - command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' | sed '/^\\s*\\/\\//d' > configt\n" - command += "export escaped=\$(echo '$baseDir')\n" - command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" - command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" - - - if ( mysql ) { - // Add dbhost to config - command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" - command += "fa_main.v1.pl init -conf configIn" - - if ( gffavail && gffclean ) { - command += " -gff ${gff_file}" - } - } else { - - if (exists) { - log.info "SQLite database ${dbFileName} exists. We proceed anyway..." - } - - command += "fa_main.v1.pl init -conf config" - - if ( gffavail && gffclean ) { - command += " -gff ${gff_file}" - } - } - - if ( params.debug=="TRUE"||params.debug=="true" ) { - // If in debug mode, we restrict de seq entries we process - command += " -fasta ${seq}" - } - - if ( params.rmversion=="TRUE"||params.rmversion=="true" ) { - // If remove versioning in protein sequences (for cases like ENSEMBL) - command += " -rmversion" - } - - command -} - // Blast like processes // TODO: To change for different aligners diamond = false @@ -985,6 +932,60 @@ if ( ! koentries ) { } } +// Database setup below +process initDB { + + input: + file config_file + file gff_file + file seq from seq_test + + output: + file 'config' into (config4perl7, config4perl8, config4perl10) + + script: + command = "mkdir -p $params.resultPath\n" + command += "sed 's/^\\s*params\\s*{\\s*\$//gi' $config_file | sed 's/^\\s*}\\s*\$//gi' | sed '/^\\s*\$/d' | sed 's/\\s\\=\\s/:/gi' | sed '/^\\s*\\/\\//d' > configt\n" + command += "export escaped=\$(echo '$baseDir')\n" + command += "export basedirvar=\$(echo '\\\$\\{baseDir\\}')\n" + command += "perl -lae '\$_=~s/\$ENV{'basedirvar'}/\$ENV{'escaped'}/g; print;' configt > config\n" + + + if ( mysql ) { + // Add dbhost to config + command += "echo \"\$(cat config)\n dbhost:${dbhost}\" > configIn ;\n" + command += "fa_main.v1.pl init -conf configIn" + + if ( gffavail && gffclean ) { + command += " -gff ${gff_file}" + } + } else { + + if (exists) { + log.info "SQLite database ${dbFileName} exists. We proceed anyway..." + } + + command += "fa_main.v1.pl init -conf config" + + if ( gffavail && gffclean ) { + command += " -gff ${gff_file}" + } + } + + if ( params.debug=="TRUE"||params.debug=="true" ) { + // If in debug mode, we restrict de seq entries we process + command += " -fasta ${seq}" + } + + if ( params.rmversion=="TRUE"||params.rmversion=="true" ) { + // If remove versioning in protein sequences (for cases like ENSEMBL) + command += " -rmversion" + } + + command +} + +// Data upload process process 'data_upload' { maxForks 1 From 4f2fefe540ba26fcb1c4a83658729b7a76d33784 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 19:23:43 +0100 Subject: [PATCH 355/381] Create docker-test.yml --- .github/workflows/docker-test.yml | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/docker-test.yml diff --git a/.github/workflows/docker-test.yml b/.github/workflows/docker-test.yml new file mode 100644 index 0000000..642b8d6 --- /dev/null +++ b/.github/workflows/docker-test.yml @@ -0,0 +1,32 @@ +name: Publish Docker image (latest) +on: + pull_request: + branches: + # Default branches below + - main + - master +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Check out the repo + uses: actions/checkout@v2 + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Log in to GitHub Docker Registry + uses: docker/login-action@v1 + with: + registry: docker.pkg.github.com + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Push to Docker Hub + uses: docker/build-push-action@v2 + with: + push: false From 9cfb044f3a287234e11e46eccecb31dc06387031 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 19:24:08 +0100 Subject: [PATCH 356/381] Update docker-latest.yml --- .github/workflows/docker-latest.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml index c88532c..64e7dba 100644 --- a/.github/workflows/docker-latest.yml +++ b/.github/workflows/docker-latest.yml @@ -5,11 +5,6 @@ on: # Default branches below - main - master - pull_request: - branches: - # Default branches below - - main - - master jobs: push_to_registries: name: Push Docker image to multiple registries From 2808c602f8fdc9dfedd19d64ec27465e434daed1 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 19:24:49 +0100 Subject: [PATCH 357/381] Update docker-test.yml --- .github/workflows/docker-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-test.yml b/.github/workflows/docker-test.yml index 642b8d6..71239c5 100644 --- a/.github/workflows/docker-test.yml +++ b/.github/workflows/docker-test.yml @@ -6,7 +6,7 @@ on: - main - master jobs: - push_to_registries: + docker_test: name: Push Docker image to multiple registries runs-on: ubuntu-latest permissions: From 043fd009d16c3508a1a485ea0ac8304aae526bab Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 19:36:53 +0100 Subject: [PATCH 358/381] update version containers --- containers/interproscan | 2 +- containers/sigtarp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/interproscan b/containers/interproscan index ee74451..2c85163 160000 --- a/containers/interproscan +++ b/containers/interproscan @@ -1 +1 @@ -Subproject commit ee74451692081efcbc38533e712b791c995cb628 +Subproject commit 2c85163a30ceeb5cae12467f221b17ea64e61dd0 diff --git a/containers/sigtarp b/containers/sigtarp index 4f9a243..2d486d6 160000 --- a/containers/sigtarp +++ b/containers/sigtarp @@ -1 +1 @@ -Subproject commit 4f9a243a8491cac24dae78496990b4fa1b0a8b7b +Subproject commit 2d486d6f75d4c1b8fadfe80c1f98ab26b18c33f7 From cd47ce99e06656771703f0e523e1cca80b3844a9 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 21:01:35 +0100 Subject: [PATCH 359/381] move stuff --- main.nf | 86 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/main.nf b/main.nf index 0dbf851..2d1c339 100644 --- a/main.nf +++ b/main.nf @@ -889,49 +889,6 @@ if ( skip_sigtarp ) { } - -if ( ! koentries ) { - - process 'kegg_download'{ - - maxForks 1 - - input: - file keggfile from keggfile - file config from config4perl8 - - output: - file("down_kegg") into (down_kegg) - - - script: - - command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" - - command - } - -} else { - - process 'kegg_download_dummy' { - - input: - file keggfile from keggfile - file config from config4perl8 - - output: - file("down_kegg") into (down_kegg) - - - script: - - command = "touch down_kegg" - - command - - } -} - // Database setup below process initDB { @@ -985,6 +942,49 @@ process initDB { command } + +if ( ! koentries ) { + + process 'kegg_download'{ + + maxForks 1 + + input: + file keggfile from keggfile + file config from config4perl8 + + output: + file("down_kegg") into (down_kegg) + + + script: + + command = "download_kegg_KAAS.pl -input $keggfile -conf $config > done 2>err" + + command + } + +} else { + + process 'kegg_download_dummy' { + + input: + file keggfile from keggfile + file config from config4perl8 + + output: + file("down_kegg") into (down_kegg) + + + script: + + command = "touch down_kegg" + + command + + } +} + // Data upload process process 'data_upload' { From 3078ccc822ce6b857284586154bbc4e479c28709 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 21:03:51 +0100 Subject: [PATCH 360/381] Update docker-test.yml restrict paths --- .github/workflows/docker-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docker-test.yml b/.github/workflows/docker-test.yml index 71239c5..e10cc8d 100644 --- a/.github/workflows/docker-test.yml +++ b/.github/workflows/docker-test.yml @@ -5,6 +5,9 @@ on: # Default branches below - main - master + paths: + - 'bin/**' + - 'Dockerfile' jobs: docker_test: name: Push Docker image to multiple registries From 711da015ecba50bc47f6a26fef1d01ffac9455bb Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 12 Feb 2022 21:04:19 +0100 Subject: [PATCH 361/381] Update docker-latest.yml --- .github/workflows/docker-latest.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml index 64e7dba..7357d6d 100644 --- a/.github/workflows/docker-latest.yml +++ b/.github/workflows/docker-latest.yml @@ -5,6 +5,9 @@ on: # Default branches below - main - master + paths: + - 'bin/**' + - 'Dockerfile' jobs: push_to_registries: name: Push Docker image to multiple registries From 251c89c055ce713bd88d5cb3b1e9d4f0df122389 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 12:49:43 +0100 Subject: [PATCH 362/381] check new versions signalP and targetP --- bin/load_CBSpredictions.signalP.pl | 181 +++++++++++++++++++++++------ 1 file changed, 148 insertions(+), 33 deletions(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index f14828e..d5d41ce 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -73,6 +73,10 @@ =head1 AUTHOR #my %conf = %::conf; my $debug = $config{'debug'}; +unless ( $type ~~ ['s', 'c', 't'] ) { + die "Unexpected program option!"; +} + if(!defined $config{'dbEngine'}){$config{'dbEngine'} = 'mysql';} my $dbh; #connect to the DB @@ -194,50 +198,161 @@ sub processType { } +sub detectVersion { + + my $fileName = shift; + my $version = ""; + + open(IN, $fileName) || die "Can't open $fileName for reading $!\n"; + + while(my $line=) { + if ( $_=~/^\#\s+(\S+)\s+/ ) { + ($version)= $_=~/^\#\s+(\S+)/; + last; + } + } + + close(IN): + + return $version; + +} + +sub parseOldPrograms { + + my $retData = shift; + my $line = shift; + my $type = shift; + + my $protName; + + my (@data)=split(/\s+/,$line); + if(scalar(@data) < 6) {next;} + #for signalP + if($type eq 's') { + if($data[9] eq 'Y'){ + $protName=$data[0]; + $retData->{$protName}{'start'} = 1; + $retData->{$protName}{'end'} = $data[2]; + $retData->{$protName}{'score'} = $data[8]; + } + } + #for chloroP + elsif($type eq 'c') { + if($data[3] eq 'Y'){ + $protName=$data[0]; + $retData->{$protName}{'start'} = 1; + $retData->{$protName}{'end'} = $data[5]; + $retData->{$protName}{'score'} = $data[2]; + } + } + #for targetP + elsif($type eq 't') { + if($data[6] ne '_'){ + $protName=$data[0]; + $retData->{$protName}{'location'} = $data[6]; + $retData->{$protName}{'RC'} = $data[7]; + } + } + + return $retData; + +} + +sub parseSignalP { + + my $retData = shift; + my $line = shift; + + my (@data)=split(/\t+/,$line); + + my $protName = $data[0]; + + if ( $data[-1]=~/\S+/ ) { + + $retData->{$protName}{'start'} = 1; + + my ( $pos ) = $data[-1] =~ /CS\s+pos:\s+(\d+)\-/; + + $retData->{$protName}{'end'} = $pos; + $retData->{$protName}{'score'} = $data[2]; + } + + return $retData; + +} + +sub parseTargetP { + + my $retData = shift; + my $line = shift; + + my (@data)=split(/\t+/,$line); + + my $protName = $data[0]; + + if ( $data[-1]=~/\S+/ ) { + + $retData->{$protName}{'location'} = $data[1]; + + my $pos = 3; + + if ( $data[1] =~/SP/i ) { + $pos = 3; + } + + if ( $data[1] =~/MT/i ) { + $pos = 4; + } + + if ( $data[1] =~/CH/i ) { + $pos = 5; + } + + if ( $data[1] =~/TH/i ) { + $pos = 6; + } + + $retData->{$protName}{'RC'} = $data[$pos]; + } + + return $retData; + +} sub parseCBSpredictionsData { my ($fileName, $pType) = @_; - my %retData=(); + my $retData=(); my @data=(); - my($protName); + my $progVersion = detectVersion($fileName); + open(IN, $fileName) || die "Can't open $fileName for reading $!\n"; while(my $line=) { chomp($line); if($line=~/^\#/) {next;} - @data=split(/\s+/,$line); - if(scalar(@data) < 6) {next;} - #for signalP - if($type eq 's') { - if($data[9] eq 'Y'){ - $protName=$data[0]; - $retData{$protName}{'start'} = 1; - $retData{$protName}{'end'} = $data[2]; - $retData{$protName}{'score'} = $data[8]; - } - } - #for chloroP - elsif($type eq 'c') { - if($data[3] eq 'Y'){ - $protName=$data[0]; - $retData{$protName}{'start'} = 1; - $retData{$protName}{'end'} = $data[5]; - $retData{$protName}{'score'} = $data[2]; - } - } - #for targetP - elsif($type eq 't') { - if($data[6] ne '_'){ - $protName=$data[0]; - $retData{$protName}{'location'} = $data[6]; - $retData{$protName}{'RC'} = $data[7]; - } - } - else - {die "Error: Unknown type of the input data, can not proceed!\n";} + + else { + + if ( $progVersion eq "SignalP-5.0" ) { + + $retData = parseOldPrograms( $retData, $line ); + } + + if ( $progVersion eq "TargetP-2.0" ) { + + $retData = parseOldPrograms( $retData, $line ); + } + + else { + $retData = parseOldPrograms( $retData, $line, $type ); + } + + } + } close(IN); - return %retData; + return %{$retData}; } From bd0e5e1b928cf11b97946a643c0b826b3afd8068 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 14:27:18 +0100 Subject: [PATCH 363/381] collection of results of cdSearch --- main.nf | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 2d1c339..0bce454 100644 --- a/main.nf +++ b/main.nf @@ -788,7 +788,7 @@ process 'cdSearchHit' { file seq from web_seq_file1 output: - file("out_hit_${seq}") into cdSearch_hit_result + file("out_hit_${seq}") into ( cdSearch_hit_result1, cdSearch_hit_result2 ) script: if ( skip_cdSearch ) { @@ -813,7 +813,7 @@ process 'cdSearchFeat' { file seq from web_seq_file2 output: - file("out_feat_${seq}") into cdSearch_feat_result + file("out_feat_${seq}") into ( cdSearch_feat_result1, cdSearch_feat_result2 ) script: if ( skip_cdSearch ) { @@ -1001,8 +1001,8 @@ process 'data_upload' { file "out_interpro*" from ipscn_result1.collect() - file "out_hit*" from cdSearch_hit_result.collect() - file "out_feat*" from cdSearch_feat_result.collect() + file "out_hit*" from cdSearch_hit_result1.collect() + file "out_feat*" from cdSearch_feat_result1.collect() file keggfile from keggfile @@ -1172,6 +1172,18 @@ if ( ! skip_sigtarp ) { .println { "Result saved to file: $it" } } +if ( ! skip_cdSearch ) { + + cdSearch_hit_result2 + .collectFile(name: file(params.resultPath + "cdSearch_hit.res.tsv")) + .println { "Result saved to file: $it" } + + cdSearch_feat_result2 + .collectFile(name: file(params.resultPath + "cdSearch_feat.res.tsv")) + .println { "Result saved to file: $it" } + +} + ipscn_result2 .collectFile(name: file(params.resultPath + "interProScan.res.tsv")) .println { "Result saved to file: $it" } From ca2006c026b10c9b490de1089cc3683ab9f82652 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 14:28:35 +0100 Subject: [PATCH 364/381] typo file handler --- bin/load_CBSpredictions.signalP.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index d5d41ce..40eff97 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -212,7 +212,7 @@ sub detectVersion { } } - close(IN): + close(IN); return $version; From 17b0b923ac501475c9548d48428301ad84ec8659 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 15:07:19 +0100 Subject: [PATCH 365/381] fixes --- bin/load_CBSpredictions.signalP.pl | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 40eff97..1db27e3 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -206,8 +206,8 @@ sub detectVersion { open(IN, $fileName) || die "Can't open $fileName for reading $!\n"; while(my $line=) { - if ( $_=~/^\#\s+(\S+)\s+/ ) { - ($version)= $_=~/^\#\s+(\S+)/; + if ( $line=~/^\#\s+(\S+)\s+/ ) { + ($version)= $line=~/^\#\s+(\S+)/; last; } } @@ -268,7 +268,7 @@ sub parseSignalP { my $protName = $data[0]; - if ( $data[-1]=~/\S+/ ) { + if ( $data[-1]=~/pos/ ) { $retData->{$protName}{'start'} = 1; @@ -291,7 +291,7 @@ sub parseTargetP { my $protName = $data[0]; - if ( $data[-1]=~/\S+/ ) { + if ( $data[-1]=~/pos/ ) { $retData->{$protName}{'location'} = $data[1]; @@ -323,7 +323,7 @@ sub parseTargetP { sub parseCBSpredictionsData { my ($fileName, $pType) = @_; - my $retData=(); + my $retData = {}; my @data=(); my $progVersion = detectVersion($fileName); @@ -337,12 +337,12 @@ sub parseCBSpredictionsData { if ( $progVersion eq "SignalP-5.0" ) { - $retData = parseOldPrograms( $retData, $line ); + $retData = parseSignalP( $retData, $line ); } if ( $progVersion eq "TargetP-2.0" ) { - $retData = parseOldPrograms( $retData, $line ); + $retData = parseTargetP( $retData, $line ); } else { @@ -354,5 +354,10 @@ sub parseCBSpredictionsData { } close(IN); - return %{$retData}; + if ( $retData ) { + return %{$retData}; + } else { + return (); + } + } From 3673e2c513a7a721aeb0ecedf6379e659f7a81b7 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 16:29:09 +0100 Subject: [PATCH 366/381] fixing typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 0bce454..4105d31 100644 --- a/main.nf +++ b/main.nf @@ -1021,7 +1021,7 @@ process 'data_upload' { command += " \ cat def* > allDef; \ - upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done \ + upload_go_definitions.pl -i allDef -conf \$config -mode def -param 'blast_def' > def_done ; \ " command += " \ From 9ca271a711cb5bc8da8dd3140c757040e5410222 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 17:29:29 +0100 Subject: [PATCH 367/381] update targetP --- bin/get_gff3.pl | 2 +- bin/lib/SQL.schema.sql | 21 +++++++++++------ bin/lib/SQL.schema.sqlite.sql | 15 +++++++----- bin/load_CBSpredictions.signalP.pl | 38 ++++++++++++++++++------------ 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/bin/get_gff3.pl b/bin/get_gff3.pl index 1c01a07..001ad71 100755 --- a/bin/get_gff3.pl +++ b/bin/get_gff3.pl @@ -419,7 +419,7 @@ sub createGFF3File { } #signalP, chloroP features - my @list=('signalP', 'chloroP'); + my @list=('signalP', 'targetP', 'chloroP'); foreach my $lItem (@list) { $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; #print STDERR "F:".$selectString."\n"; diff --git a/bin/lib/SQL.schema.sql b/bin/lib/SQL.schema.sql index 57b6db7..8a8ea0c 100644 --- a/bin/lib/SQL.schema.sql +++ b/bin/lib/SQL.schema.sql @@ -171,29 +171,36 @@ CREATE TABLE IF NOT EXISTS `signalP` ( KEY `score_idx` (`score`) ); -CREATE TABLE IF NOT EXISTS `chloroP` ( - `chloroP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , +CREATE TABLE IF NOT EXISTS `targetP` ( + `targetP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` INTEGER NOT NULL , + `targetP_type` VARCHAR(255) NOT NULL DEFAULT '' , start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, description TEXT, KEY `protein_id_idx` (`protein_id`), + KEY `type_idx` ( `targetP_type` ), KEY `start_idx` ( `start` ), KEY `end_idx` ( `end` ), KEY `score_idx` (`score`) ); -CREATE TABLE IF NOT EXISTS `targetP` ( - `targetP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , +CREATE TABLE IF NOT EXISTS `chloroP` ( + `chloroP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` INTEGER NOT NULL , - location TEXT NOT NULL, - RC INTEGER NOT NULL, + start INTEGER NOT NULL, + end INTEGER NOT NULL, + score REAL NOT NULL, + description TEXT, KEY `protein_id_idx` (`protein_id`), - KEY `RC_idx` (`RC`) + KEY `start_idx` ( `start` ), + KEY `end_idx` ( `end` ), + KEY `score_idx` (`score`) ); + CREATE TABLE IF NOT EXISTS `cd_search_features` ( `cd_search_features_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` INTEGER NOT NULL , diff --git a/bin/lib/SQL.schema.sqlite.sql b/bin/lib/SQL.schema.sqlite.sql index 874bf06..5f2efa4 100644 --- a/bin/lib/SQL.schema.sqlite.sql +++ b/bin/lib/SQL.schema.sqlite.sql @@ -120,19 +120,22 @@ CREATE TABLE IF NOT EXISTS `signalP` ( score REAL NOT NULL, description TEXT ); -CREATE TABLE IF NOT EXISTS `chloroP` ( - `chloroP_id` INTEGER PRIMARY KEY AUTOINCREMENT , +CREATE TABLE IF NOT EXISTS `targetP` ( + `targetP_id` INTEGER PRIMARY KEY AUTOINCREMENT , `protein_id` INTEGER NOT NULL , + `targetP_type` VARCHAR(255) NOT NULL DEFAULT '' , start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, description TEXT ); -CREATE TABLE IF NOT EXISTS `targetP` ( - `targetP_id` INTEGER PRIMARY KEY AUTOINCREMENT , +CREATE TABLE IF NOT EXISTS `chloroP` ( + `chloroP_id` INTEGER PRIMARY KEY AUTOINCREMENT , `protein_id` INTEGER NOT NULL , - location TEXT NOT NULL, - RC INTEGER NOT NULL ); + start INTEGER NOT NULL, + end INTEGER NOT NULL, + score REAL NOT NULL, + description TEXT ); CREATE TABLE IF NOT EXISTS `cd_search_features` ( diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 1db27e3..5f6f2a6 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -101,8 +101,11 @@ =head1 AUTHOR die "You must specify a file with the predictions\n Use -h for help" if !$idfile; -my %dataHash = &parseCBSpredictionsData($idfile,$type); -&uploadCBSpredictionsFast($dbh, \%dataHash,$config{'dbEngine'}, $type); + +my $progVersion = detectVersion( $idfile ); + +my %dataHash = &parseCBSpredictionsData( $idfile, $type, $progVersion ); +&uploadCBSpredictionsFast($dbh, \%dataHash,$config{'dbEngine'}, $type, $progVersion ); # Commit needed for SQLite if(lc( $config{'dbEngine'} ) eq 'sqlite') @@ -143,7 +146,7 @@ sub uploadCBSpredictionsFast elsif($type eq 't') { $table = 'targetP'; $tableId = 'targetP_id'; - @keys=('location','RC'); + @keys=('start', 'end', 'targetP_type', 'score'); if ( $engine eq 'mysql' ) { $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?)"; } else { @@ -250,8 +253,10 @@ sub parseOldPrograms { elsif($type eq 't') { if($data[6] ne '_'){ $protName=$data[0]; - $retData->{$protName}{'location'} = $data[6]; - $retData->{$protName}{'RC'} = $data[7]; + $retData->{$protName}{'start'} = 1; + $retData->{$protName}{'end'} = 1; + $retData->{$protName}{'targetP_type'} = $data[6]; + $retData->{$protName}{'score'} = $data[7]; } } @@ -293,27 +298,32 @@ sub parseTargetP { if ( $data[-1]=~/pos/ ) { - $retData->{$protName}{'location'} = $data[1]; + $retData->{$protName}{'targetP_type'} = $data[1]; - my $pos = 3; + my $spos = 3; if ( $data[1] =~/SP/i ) { - $pos = 3; + $spos = 3; } if ( $data[1] =~/MT/i ) { - $pos = 4; + $spos = 4; } if ( $data[1] =~/CH/i ) { - $pos = 5; + $spos = 5; } if ( $data[1] =~/TH/i ) { - $pos = 6; + $spos = 6; } - $retData->{$protName}{'RC'} = $data[$pos]; + + $retData->{$protName}{'start'} = 1; + my ( $pos ) = $data[-1] =~ /CS\s+pos:\s+(\d+)\-/; + $retData->{$protName}{'end'} = $pos; + + $retData->{$protName}{'score'} = $data[$spos]; } return $retData; @@ -321,13 +331,11 @@ sub parseTargetP { } sub parseCBSpredictionsData { - my ($fileName, $pType) = @_; + my ($fileName, $pType, $progVersion) = @_; my $retData = {}; my @data=(); - my $progVersion = detectVersion($fileName); - open(IN, $fileName) || die "Can't open $fileName for reading $!\n"; while(my $line=) { chomp($line); From 8071134b915c7c37bf38d28cb7c80f454c9f0ed5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 17:42:47 +0100 Subject: [PATCH 368/381] class change --- bin/get_gff3.pl | 18 +++++++++++++----- bin/lib/SQL.schema.sql | 6 ++++-- bin/lib/SQL.schema.sqlite.sql | 3 ++- bin/load_CBSpredictions.signalP.pl | 7 +++++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/bin/get_gff3.pl b/bin/get_gff3.pl index 001ad71..a21203a 100755 --- a/bin/get_gff3.pl +++ b/bin/get_gff3.pl @@ -418,25 +418,33 @@ sub createGFF3File { } } - #signalP, chloroP features - my @list=('signalP', 'targetP', 'chloroP'); + #signalP, targetP features + my @list=('signalP', 'targetP'); foreach my $lItem (@list) { - $selectString = "SELECT start, end, score FROM $lItem where protein_id=$idItem"; + $selectString = "SELECT start, end, class, score FROM $lItem where protein_id=$idItem"; #print STDERR "F:".$selectString."\n"; $results =$dbh->select_from_table($selectString); foreach my $result (@{$results}) { my $end =$result->{'end'}; my $score = $result->{'score'}; + my $class = $result->{'class'}; $end=~s/\"//gi; $start=~s/\"//gi; if ( $protName && $protName ne '' ) { + + $classStr = ""; + + if ( $class ne '' ) { + $classStr = ";Note=".$class.";"; + } + # Toniher: Changed from SIGNAL to protein_match and also start despite it must be 1 #print OUTFILE "$protName\t$lItem\tSIGNAL\t1\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;\n"; - print OUTFILE "$protName\t$lItem\tprotein_match\t$start\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;\n"; + print OUTFILE "$protName\t$lItem\tprotein_match\t$start\t$end\t$score\t.\t.\tID=".ucfirst($lItem)."_$protName;match=YES;$classStr\n"; } } - } #signalP, targetP, chloroP + } #signalP, targetP } #foreach protein item diff --git a/bin/lib/SQL.schema.sql b/bin/lib/SQL.schema.sql index 8a8ea0c..8c2970c 100644 --- a/bin/lib/SQL.schema.sql +++ b/bin/lib/SQL.schema.sql @@ -161,11 +161,13 @@ CREATE TABLE IF NOT EXISTS `blast_hit` ( CREATE TABLE IF NOT EXISTS `signalP` ( `signalP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` INTEGER NOT NULL , + `class` VARCHAR(255) NOT NULL DEFAULT '' , start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, description TEXT, KEY `protein_id_idx` (`protein_id`), + KEY `class_idx` ( `class` ), KEY `start_idx` ( `start` ), KEY `end_idx` ( `end` ), KEY `score_idx` (`score`) @@ -174,13 +176,13 @@ CREATE TABLE IF NOT EXISTS `signalP` ( CREATE TABLE IF NOT EXISTS `targetP` ( `targetP_id` INTEGER PRIMARY KEY AUTO_INCREMENT , `protein_id` INTEGER NOT NULL , - `targetP_type` VARCHAR(255) NOT NULL DEFAULT '' , + `class` VARCHAR(255) NOT NULL DEFAULT '' , start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, description TEXT, KEY `protein_id_idx` (`protein_id`), - KEY `type_idx` ( `targetP_type` ), + KEY `class_idx` ( `class` ), KEY `start_idx` ( `start` ), KEY `end_idx` ( `end` ), KEY `score_idx` (`score`) diff --git a/bin/lib/SQL.schema.sqlite.sql b/bin/lib/SQL.schema.sqlite.sql index 5f2efa4..607afc5 100644 --- a/bin/lib/SQL.schema.sqlite.sql +++ b/bin/lib/SQL.schema.sqlite.sql @@ -115,6 +115,7 @@ CREATE TABLE IF NOT EXISTS `blast_hit` ( CREATE TABLE IF NOT EXISTS `signalP` ( `signalP_id` INTEGER PRIMARY KEY AUTOINCREMENT , `protein_id` INTEGER NOT NULL , + `class` VARCHAR(255) NOT NULL DEFAULT '' , start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, @@ -123,7 +124,7 @@ CREATE TABLE IF NOT EXISTS `signalP` ( CREATE TABLE IF NOT EXISTS `targetP` ( `targetP_id` INTEGER PRIMARY KEY AUTOINCREMENT , `protein_id` INTEGER NOT NULL , - `targetP_type` VARCHAR(255) NOT NULL DEFAULT '' , + `class` VARCHAR(255) NOT NULL DEFAULT '' , start INTEGER NOT NULL, end INTEGER NOT NULL, score REAL NOT NULL, diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 5f6f2a6..6ff2727 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -237,6 +237,7 @@ sub parseOldPrograms { $protName=$data[0]; $retData->{$protName}{'start'} = 1; $retData->{$protName}{'end'} = $data[2]; + $retData->{$protName}{'class'} = ""; $retData->{$protName}{'score'} = $data[8]; } } @@ -246,6 +247,7 @@ sub parseOldPrograms { $protName=$data[0]; $retData->{$protName}{'start'} = 1; $retData->{$protName}{'end'} = $data[5]; + $retData->{$protName}{'class'} = ""; $retData->{$protName}{'score'} = $data[2]; } } @@ -255,7 +257,7 @@ sub parseOldPrograms { $protName=$data[0]; $retData->{$protName}{'start'} = 1; $retData->{$protName}{'end'} = 1; - $retData->{$protName}{'targetP_type'} = $data[6]; + $retData->{$protName}{'class'} = $data[6]; $retData->{$protName}{'score'} = $data[7]; } } @@ -279,6 +281,7 @@ sub parseSignalP { my ( $pos ) = $data[-1] =~ /CS\s+pos:\s+(\d+)\-/; + $retData->{$protName}{'class'} = ""; $retData->{$protName}{'end'} = $pos; $retData->{$protName}{'score'} = $data[2]; } @@ -298,7 +301,7 @@ sub parseTargetP { if ( $data[-1]=~/pos/ ) { - $retData->{$protName}{'targetP_type'} = $data[1]; + $retData->{$protName}{'class'} = $data[1]; my $spos = 3; From 7ad7138618b818440a052ba9e3a61205d7769f6b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 20:28:50 +0100 Subject: [PATCH 369/381] my missing --- bin/get_gff3.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/get_gff3.pl b/bin/get_gff3.pl index a21203a..3de275e 100755 --- a/bin/get_gff3.pl +++ b/bin/get_gff3.pl @@ -433,7 +433,7 @@ sub createGFF3File { if ( $protName && $protName ne '' ) { - $classStr = ""; + my $classStr = ""; if ( $class ne '' ) { $classStr = ";Note=".$class.";"; From f6811ad8fb1b58b2881504a8f9c364f96b422e3d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 22:00:53 +0100 Subject: [PATCH 370/381] changing to class --- bin/load_CBSpredictions.signalP.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 6ff2727..641d1d2 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -146,7 +146,7 @@ sub uploadCBSpredictionsFast elsif($type eq 't') { $table = 'targetP'; $tableId = 'targetP_id'; - @keys=('start', 'end', 'targetP_type', 'score'); + @keys=('start', 'end', 'class', 'score'); if ( $engine eq 'mysql' ) { $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?)"; } else { From 4178f6ad41370f84009c12f2b7ff873d261eb477 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 14 Feb 2022 22:04:14 +0100 Subject: [PATCH 371/381] blast_annotator --- main.nf | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 4105d31..6e3c77b 100644 --- a/main.nf +++ b/main.nf @@ -728,7 +728,7 @@ if (params.gogourl != "") { file blastXml from blastXmlResults2.flatMap() output: - file "blastAnnot" into blast_annotator_results + file "blastAnnot" into ( blast_annotator_results1, blast_annotator_results2 ) """ blast-annotator.pl -in $blastXml -out blastAnnot --hits $params.gogohits --url $params.gogourl -t $blastAnnotMode -q --format blastxml @@ -1008,7 +1008,7 @@ process 'data_upload' { file("down_kegg") from down_kegg - file "blastAnnot*" from blast_annotator_results.collect() + file "blastAnnot*" from blast_annotator_results1.collect() file config from config4perl7 @@ -1194,3 +1194,9 @@ if ( kolist != "" || kolist != null ){ .collectFile(name: file(params.resultPath + "koala.res.tsv")) .println { "Result saved to file: $it" } } + +if (params.gogourl != "") { + blast_annotator_results2 + .collectFile(name: file(params.resultPath + "blastAnnotator.res.tsv")) + .println { "Result saved to file: $it" } +} From 3360ff6a55d63d5ca625056685c81549593dd19b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Feb 2022 10:58:58 +0100 Subject: [PATCH 372/381] fixes --- bin/load_CBSpredictions.signalP.pl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 641d1d2..7b09944 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -148,9 +148,9 @@ sub uploadCBSpredictionsFast $tableId = 'targetP_id'; @keys=('start', 'end', 'class', 'score'); if ( $engine eq 'mysql' ) { - $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?)"; + $insertString = "INSERT INTO $table (protein_id,".join(",",@keys)." ) VALUES(?,?,?,?,?)"; } else { - $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys)." ) VALUES(NULL,?,?,?)"; + $insertString = "INSERT INTO $table ($tableId, protein_id,".join(",",@keys)." ) VALUES(NULL,?,?,?,?,?)"; } } @@ -174,10 +174,11 @@ sub uploadCBSpredictionsFast push(@setData,$proteinId); # for SQLite engine only - foreach my $keyItem(@keys) - { - push(@setData, processType( $dataHash->{$protItem}{$keyItem} ) ); - } + foreach my $keyItem(@keys){ + # push(@setData, processType( $dataHash->{$protItem}{$keyItem} ) ); + push( @setData, $dataHash->{$protItem}{$keyItem} ); + + } my $setValuesString = join(',', @setData); # print STDERR "$setValuesString\n"; $sth->execute(@setData); From fcc3c31e9e4d90bcaadc9d3ada243fe37c4ceae8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Feb 2022 11:24:46 +0100 Subject: [PATCH 373/381] avoid duplicates --- bin/get_gff3.pl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/get_gff3.pl b/bin/get_gff3.pl index 3de275e..18f1859 100755 --- a/bin/get_gff3.pl +++ b/bin/get_gff3.pl @@ -421,7 +421,8 @@ sub createGFF3File { #signalP, targetP features my @list=('signalP', 'targetP'); foreach my $lItem (@list) { - $selectString = "SELECT start, end, class, score FROM $lItem where protein_id=$idItem"; + my $idKey = $lItem."_id"; + $selectString = "SELECT distinct($idKey), start, end, class, score FROM $lItem where protein_id=$idItem"; #print STDERR "F:".$selectString."\n"; $results =$dbh->select_from_table($selectString); foreach my $result (@{$results}) { @@ -436,7 +437,7 @@ sub createGFF3File { my $classStr = ""; if ( $class ne '' ) { - $classStr = ";Note=".$class.";"; + $classStr = "Note=".$class.";"; } # Toniher: Changed from SIGNAL to protein_match and also start despite it must be 1 From 1c6ed193da0ba36999b9256586505c9d3ab91192 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Feb 2022 13:12:46 +0100 Subject: [PATCH 374/381] to be fixed with update --- bin/load_CBSpredictions.signalP.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 7b09944..791b2aa 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -115,7 +115,7 @@ =head1 AUTHOR $dbh->disconnect(); - +# TODO: To be fixed with update sub uploadCBSpredictionsFast { my ($dbh, $dataHash,$engine, $type)=@_; From c885dbaea51f334431995d896422a5a197bdcbf5 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Tue, 15 Feb 2022 16:14:45 +0100 Subject: [PATCH 375/381] some cleaning --- bin/lib/FunctionalAnnotation/uploadData.pm | 2 +- bin/load_CBSpredictions.signalP.pl | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/bin/lib/FunctionalAnnotation/uploadData.pm b/bin/lib/FunctionalAnnotation/uploadData.pm index f1787f1..e686fb3 100644 --- a/bin/lib/FunctionalAnnotation/uploadData.pm +++ b/bin/lib/FunctionalAnnotation/uploadData.pm @@ -773,7 +773,7 @@ sub uploadBlastResults my $update =0; my %tmpHash=(); - my($selectString, $updateString, $insertString,$proteinId,$blastHitId,$shaData); + my($selectString, $updateString, $insertString, $proteinId,$ blastHitId, $shaData); foreach my $protItem(keys %{$blastData}) { diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 791b2aa..e947b29 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -105,7 +105,7 @@ =head1 AUTHOR my $progVersion = detectVersion( $idfile ); my %dataHash = &parseCBSpredictionsData( $idfile, $type, $progVersion ); -&uploadCBSpredictionsFast($dbh, \%dataHash,$config{'dbEngine'}, $type, $progVersion ); +&uploadCBSpredictionsFast( $dbh, \%dataHash, $config{'dbEngine'}, $type, $progVersion ); # Commit needed for SQLite if(lc( $config{'dbEngine'} ) eq 'sqlite') @@ -116,11 +116,10 @@ =head1 AUTHOR $dbh->disconnect(); # TODO: To be fixed with update -sub uploadCBSpredictionsFast -{ +sub uploadCBSpredictionsFast { my ($dbh, $dataHash,$engine, $type)=@_; - my($select, $result,$table,$tableId ,$selectString, $insertString, $updateString); + my( $select, $result, $table, $tableId, $selectString, $insertString, $updateString ); my @keys=(); if($type eq 's') { @@ -156,8 +155,7 @@ sub uploadCBSpredictionsFast my $sth = $dbh->prepare($insertString); - foreach my $protItem (keys %{$dataHash}) - { + foreach my $protItem (keys %{$dataHash}) { $select = "select protein_id from protein where stable_id like '%$protItem%'"; my $sth2 = $dbh->prepare($select); $sth2->execute(); From 0043273ddfa029f488d49bf79e0b0f65eb58c6eb Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 18 Feb 2022 17:59:48 +0100 Subject: [PATCH 376/381] check queries --- bin/load_CBSpredictions.signalP.pl | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index e947b29..14a574b 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -153,7 +153,16 @@ sub uploadCBSpredictionsFast { } } - my $sth = $dbh->prepare($insertString); + my @whereArr = (); + foreach my $keyItem ( @keys ) { + push( @whereArr, " $key = ? "); + } + + $selectString = "SELECT * from $table where protein_id = ? AND ".join( @whereArr, " AND "); + + + my $sth = $dbh->prepare( $insertString ); + my $qth = $dbh->prepare( $selectString ); foreach my $protItem (keys %{$dataHash}) { $select = "select protein_id from protein where stable_id like '%$protItem%'"; @@ -177,13 +186,21 @@ sub uploadCBSpredictionsFast { push( @setData, $dataHash->{$protItem}{$keyItem} ); } - my $setValuesString = join(',', @setData); + # my $setValuesString = join(',', @setData); # print STDERR "$setValuesString\n"; - $sth->execute(@setData); + + $qth->execute(@setData); + + if ( $qth->rows < 1 ) { + + $sth->execute(@setData); + + } # $sth->commit; # $sth->finish(); } + $qth->finish(); $sth->finish(); } From 139ec670050770656ea5da8c7182f8aff10ec0bd Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 18 Feb 2022 18:18:47 +0100 Subject: [PATCH 377/381] fix typo --- bin/load_CBSpredictions.signalP.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_CBSpredictions.signalP.pl index 14a574b..357ae7f 100755 --- a/bin/load_CBSpredictions.signalP.pl +++ b/bin/load_CBSpredictions.signalP.pl @@ -155,7 +155,7 @@ sub uploadCBSpredictionsFast { my @whereArr = (); foreach my $keyItem ( @keys ) { - push( @whereArr, " $key = ? "); + push( @whereArr, " $keyItem = ? "); } $selectString = "SELECT * from $table where protein_id = ? AND ".join( @whereArr, " AND "); From 1f7e8f57002f04e3299b6fdd809999c2d770379b Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Fri, 18 Feb 2022 19:02:38 +0100 Subject: [PATCH 378/381] cleaning --- TODO.md | 2 +- bin/{load_CBSpredictions.signalP.pl => load_sigtarp.pl} | 0 main.nf | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename bin/{load_CBSpredictions.signalP.pl => load_sigtarp.pl} (100%) diff --git a/TODO.md b/TODO.md index 1f37bdc..5c9ca91 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,4 @@ -* Allow parsing new versions of SignalP and targetP +* Allow parsing new versions of SignalP and add more options * Log directory check * Initial check for FASTA file * Add option to detect if possible contamination from BLAST (inspiration from MEGAN) diff --git a/bin/load_CBSpredictions.signalP.pl b/bin/load_sigtarp.pl similarity index 100% rename from bin/load_CBSpredictions.signalP.pl rename to bin/load_sigtarp.pl diff --git a/main.nf b/main.nf index 6e3c77b..9600bf5 100644 --- a/main.nf +++ b/main.nf @@ -1026,12 +1026,12 @@ process 'data_upload' { command += " \ cat out_signalp* > allSignal ; \ - load_CBSpredictions.signalP.pl -i allSignal -conf \$config -type s > upload_signalp ; \ + load_sigtarp.pl -i allSignal -conf \$config -type s > upload_signalp ; \ " command += " \ cat out_targetp* > allTarget ; \ - load_CBSpredictions.signalP.pl -i allTarget -conf \$config -type t > upload_targetp ; \ + load_sigtarp.pl -i allTarget -conf \$config -type t > upload_targetp ; \ " command += " \ From b286394e9b345cce3e369f2d8b0c683db0d1c918 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 19 Feb 2022 19:27:49 +0100 Subject: [PATCH 379/381] fix problem --- bin/load_sigtarp.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/load_sigtarp.pl b/bin/load_sigtarp.pl index 357ae7f..8d5e231 100755 --- a/bin/load_sigtarp.pl +++ b/bin/load_sigtarp.pl @@ -158,7 +158,7 @@ sub uploadCBSpredictionsFast { push( @whereArr, " $keyItem = ? "); } - $selectString = "SELECT * from $table where protein_id = ? AND ".join( @whereArr, " AND "); + $selectString = "SELECT * from $table where protein_id = ? AND ".join( " AND ", @whereArr ); my $sth = $dbh->prepare( $insertString ); From 1e857c76f3763c959775b8464406234139724b84 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Sat, 19 Feb 2022 20:05:40 +0100 Subject: [PATCH 380/381] replaced workflow --- flowchart.png | Bin 429812 -> 276719 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/flowchart.png b/flowchart.png index 075f811b05a8844ce26415d751e95bdafac914b9..445c74093f842e0c04753ecf58fb12ee26c8fbd2 100644 GIT binary patch literal 276719 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�u3((tmLBbKMgPggAZ!EAKaRbn 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 zEynJced?*

!U#eaC`Q%<~wIv;i@SDaY83E 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�M9iP3g0entkhz9TVfvM9CDO(i8?^_S<|!?)2>1 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 IMpj$@AIy|Ep8x;= From fd3e5203a99a9e40c06df7eb33d4ad780733c25f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Mon, 28 Feb 2022 15:16:58 +0100 Subject: [PATCH 381/381] let's push for new version --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 35c7058..8fbae84 100644 --- a/nextflow.config +++ b/nextflow.config @@ -80,7 +80,7 @@ process{ } } -process.container = "guigolab/fa-nf:0.3.1" +process.container = "guigolab/fa-nf:0.4.0" // Singularity preferred. If chosen docker, uncomment line below, comment singularity one and replace sif containers above accordingly // docker.enabled = true singularity.enabled = true