Commit ae3c8ea3 authored by mmassaviol's avatar mmassaviol
Browse files

Update workflow

parent ff13170d
......@@ -42,7 +42,8 @@ RUN cd /opt/biotools \
&& cd bin \
&& ln -s /opt/biotools/metabat/metabat metabat
RUN apt-get install -y zlib1g-dev pkg-config libfreetype6-dev libpng-dev python-matplotlib python-setuptools
RUN apt-get update \
&& apt-get install -y zlib1g-dev pkg-config libfreetype6-dev libpng-dev python-matplotlib python-setuptools
RUN cd /opt/biotools \
&& wget https://github.com/ablab/quast/releases/download/quast_5.0.2/quast-5.0.2.tar.gz \
......
Ce workflow peut être lancé de manière autonome sur :
* des machines de type BigMem
* sur un Cloud type IFB <https://biosphere.france-bioinformatique.fr/>
* sur le cluster MBB (non détaillée)
* En pouvant les modifier en y apporter de légères adaptations
* Dans ce qui suit nous allons voir comment déployer un workflow sur une machine autonome, de lancer ce workflow en mode Web, de le modifier puis de le lancer en mode ligne de commande.
* Remarquer la présence des fichiers suivants :
* install.sh permet d'installer les logiciels pré-requis (à faire une seule fois si nécessaire!)
* deployBigMem.sh : permet de déployer un conteneur en mode web sur une machine de type bigmem
* deployIFB.sh : permet de deployer en mode web sur le cloud IFB (<https://biosphere.france-bioinformatique.fr/cloudweb/login/)>
* deployLocalHost.sh : permet de deployer sur votre machine
* waw_workflow.qsub : script de soumission d'un workflow sur le cluster MBB
* RunCmdLine.sh : permet de déployer et executer un workflow en ligne de commande (Nous verrons cela dans une prochaine partie)
## Déploiement en mode application web :
* Lancer ***bash deployLocalHost.sh*** pour voir les paramètres dont il a besoin :
* dataDir : dossier de la machine Bigmem hôte contenant les données
* resultsDir : dossier de la machine hôte qui va contenir les résultats de l'analyse
* le dernier paramètre (optionnel) indique la source de l'image Docker à utiliser
* dockerHub : l'image sera téléchargée depuis le dépôt Docker Hub (cette option n'est valide que pour les workflows développés par MBB)
* local : l'image sera construite en local à partir des fichiers sources issus du dépôt Git (il faut choisir cette option pour les workflows non disponibles sur gitHub)
* Assurez vous que les données soient disponibles dans un dossier ex. : /home/$USER/datasets/rnaseq/
les fichiers de reads doivent être de la forme : <sample_name><pair><extension>
pair = _R1 _R2 ou _1 _2 ou vide en single end
extension libre (fastq, fastq.gz, fq, fq.gz, ...)
ex paired end : sample1_R1.fastq.gz sample1_R2.fastq.gz
ex single end : sample1.fastq.gz
* Créer un dossier pour les résultas ex. : *** mkdir -p /home/$USER/result1 ***
* lancer :
*** deployLocalHost.sh /home/$USER/datasets/rnaseq/ /home/$USER/result1 local ***
* Voir plus bas pour la correspondance entre chemins sur le système hôte et chemins du conteneur
* Consulter la sortie écran pour voir comment :
* Accéder au workflow par navigateur web
* Accéder en *ssh* à l'intérieur du système du conteneur
* Noter quel est l'identifiant de votre conteneur !!!
* Pour arrêter le conteneur :
* *** docker ps *** pour lister les conteneurs
* *** docker kill ID ***
* Modifications du workflow
### A/ Ajouter un paramètre à un outil
Les règles des différentes étapes du workflow sont assemblées dans le fichier files/Snakefile. Elles sont écrites selon la syntaxe du gestionnaire de workflow Snakemake (<https://github.com/deto/Snakemake_Tutorial)> (<https://www.youtube.com/watch?v=UOKxta3061g&feature=youtu.be)>
* Ajout du paramètre --gcBias pour corriger les biais de GC des reads à l'outil de quantification SALMON :
* Ouvrir le fichier Snakemake et aller au rule salmon_quant_PE
* Repérer la partie shell qui indique comment sera lancé l'outil SALMON
* Insérer le paramètre --gcBias
* Relancer le conteneur avec l'option 'local' pour reconstruire l'image avec vos modifs
***deployLocalHost.sh /home/$USER/datasets/rnaseq/ /home/$USER/result1 local***
### B/ Changer la version d’un outil
Les procédures d'installation des différente outils nécessaires au bon fonctionnement du workflow sont rassemblées dans un fichier de recette nommé Dockerfile.
* Ouvrir ce fichier et repérer la partie concernant l'installation de kallisto
* Liste des versions de kallisto : <https://github.com/pachterlab/kallisto/releases>
* Modifier le n° de version pour une version de kallisto plus récente
* Relancer le conteneur avec l'option 'local' pour reconstruire l'image avec vos modifs
***deployLocalHost.sh /home/$USER/datasets/rnaseq/ /home/$USER/result1 local***
### C/ Ajouter une étape
* Deux possibilités :
* recharger le fichier .json sur l'interface subwaw (http://web.mbb.univ-montp2.fr/subwaw/workflowmanager.php) puis insérer l'étape souhaitée puis télécharger la nouvelle version du workflow
* Faire une demande via le système de tickets : <https://kimura.univ-montp2.fr/calcul/helpdesk_NewTicket.html>
## Utilisation en mode ligne de commande
Pour ré-utiliser un workflow sur différents fichiers ou avec différents paramètres, il est bon de pouvoir le lancer en ligne de commande.
Il faut pour cela avoir un fichier texte contenant tous les paramètres du workflow.
Ce fichier peur être :
* Récupéré depuis l'interface Web d'un déploiement comme en [Déploiement en mode application web] puis modifié à vos besoins
* Récupéré depuis le dossier de résultats d'une analyse effectuée avec ce workflow
* Directement à partir du modèle par défaut disponible dans files/params.total.yml
* Modifier un ou plusieurs paramètres parmi les suivants :
* results_dir:
* sample_dir:
* group_file:
* kallisto_index_input:
ou
* salmon_index_input:
* edger_annotations:
* Enregistrer vos modifs dans maconfig.yaml dans par ex. /home/$USER/results1/version2/ et sera visible dans le conteneur sous /Result/maconfig.yaml
* lancer depuis une console la ligne de commande (ici la paramètre 10 pour utiliser 10 coeurs) :
***bash RunCmdLine.sh /home/$USER/datasets/rnaseq/ /home/$USER/results1/version2/ /Results/maconfig.yaml 10***
* Suivre la progression du workflow
* A la fin vérifier le contenu de /home/$USER/results1/version2/
## Correspondance entre dossiers de votre machine et dossiers du conteneur
ex 1 deploiement : ***bash deployBigMem.sh /home/votrelogin/data1/ /home/votrelogin/results1/***
A l’intérieur du conteneur :
* /home/votrelogin/data1/ -> /Data/
* /home/votrelogin/results1/ -> /Results/
ex 2 deploiement : ***bash deployBigMem.sh /share/bio/datasets/rnaseq/ /home/votrelogin/results1/version1/***
A l'interieur du conteneur :
* /share/bio/datasets/rnaseq/ -> /Data/
* /share/bio/datasets/rnaseq/fastqs/ -> /Data/fastqs/
* /share/bio/datasets/rnaseq/reference/ -> /Data/reference/
* /share/bio/datasets/rnaseq/conditions/groups.tsv -> /Results/conditions/groups.tsv
* /home/votrelogin/results1/version1/ -> /Results/
## 6/ Liens utiles
* commandes docker : <https://devhints.io/docker>
* commandes bash : <https://devhints.io/bash>
* système de tickets MBB : <https://kimura.univ-montp2.fr/calcul/helpdesk_NewTicket.html>
* système de réservation de Bigmem : <https://mbb.univ-montp2.fr/grr/login.php>
* cloud IFB : <https://biosphere.france-bioinformatique.fr/>
* cluster mbb : ssh login@cluster-mbb.mbb.univ-montp2.fr
* depôts Git des MBBworkflows : <https://gitlab.mbb.univ-montp2.fr/mmassaviol/wapps>
* dépôt Git du framework de conception MBBworkflows : <https://gitlab.mbb.univ-montp2.fr/mmassaviol/waw>
* les conteneurs docker des MBBworkflows : <https://hub.docker.com/search?q=mbbteam&type=image>
......@@ -53,5 +53,5 @@ then
echo Results were written to : $2
echo " "
else
echo Failed to run the docker container !!
echo Failed to run the docker container
fi
......@@ -93,5 +93,5 @@ then
echo " "
echo To start a Bash session inside the container : docker exec -it $CONTAINER_ID /bin/bash
else
echo Failed to run the docker container !!
echo Failed to run the docker container
fi
......@@ -114,5 +114,5 @@ then
echo " "
echo XX étant le nombre de coeurs qui seront utilisés par le workflow.
else
echo Failed to run the docker container !!
echo Failed to run the docker container
fi
......@@ -6,36 +6,19 @@ then
echo usage : $0 dataDir resultsDir '[dockerHub|local]'
exit
fi
#nginx
##### nginx install #####
#sudo apt-get install -y nginx
# HOST_NAME="192.168.100.49"
# Exit on error with message
exit_on_error() {
exit_code=$1
last_command=${@:2}
if [ $exit_code -ne 0 ]; then
>&2 echo "\"${last_command}\" command failed with exit code ${exit_code}."
exit $exit_code
fi
}
# HTTP_ENDP="https://$HOST_NAME"
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj "/C=FR/ST=LR/L=Montpellier/O=CNRS/OU=CNRS-ISEM/CN=mbb.univ-montp2.fr"
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
# mkdir -p /etc/nginx/snippets
# echo "ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;" > /etc/nginx/snippets/self-signed.conf
# echo "ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;" >> /etc/nginx/snippets/self-signed.conf
# cp system/nginx_snippets_ssl-params.conf /etc/nginx/snippets/ssl-params.conf
# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
# cp system/nginx_sites-available_default /etc/nginx/sites-available/default
# sed -i "s|server_domain_or_IP|$HOST_NAME|" /etc/nginx/sites-available/default
# useradd nginx
# cp system/nginx_nginx.conf /etc/nginx/nginx.conf
# cp system/nginx_conf.d_10-rstudio.conf /etc/nginx/conf.d/10-rstudio.conf
# sed -i "s|example.com|$HOST_NAME|" /etc/nginx/conf.d/10-rstudio.conf
# systemctl restart nginx
# systemctl enable nginx
# enable !! command completion
set -o history -o histexpand
#essayer une plage de ports entre 8787 et 8800
#APP_PORT=$2
......@@ -74,7 +57,7 @@ else
dockerHub )
APP_IMG="mbbteam/microbial_metagenome:latest" ;;
local)
docker build . -t microbial_metagenome:latest
docker build . -t microbial_metagenome:latest
APP_IMG="microbial_metagenome:latest" ;;
mbb)
#APP_IMG="X.X.X.X:5000/microbial_metagenome:latest" ;;
......@@ -94,5 +77,5 @@ then
echo " "
echo To start a Bash session inside the container : docker exec -it $IMG_NAME /bin/bash
else
echo Failed to run the docker container !!
echo Failed to run the docker container
fi
This diff is collapsed.
......@@ -17,9 +17,9 @@ base_tools:
and deployment. Linux J. 2014, 239, Article 2 (March 2014), 1 pages.'
trimmomatic:
trimmomatic:
- "Anthony M. Bolger, Marc Lohse, Bjoern Usadel, Trimmomatic: a flexible trimmer\
\ for Illumina sequence data, Bioinformatics, Volume 30, Issue 15, 1 August 2014,\
\ Pages 2114\u20132120, https://doi.org/10.1093/bioinformatics/btu170"
- 'Anthony M. Bolger, Marc Lohse, Bjoern Usadel, Trimmomatic: a flexible trimmer
for Illumina sequence data, Bioinformatics, Volume 30, Issue 15, 1 August 2014,
Pages 2114-2120, https://doi.org/10.1093/bioinformatics/btu170'
megahit:
megahit:
- "Li, D., Luo, R., Liu, C.-M., Leung, C.-M., Ting, H.-F., Sadakane, K., Yamashita,\
......@@ -36,6 +36,6 @@ metabat:
https://doi.org/10.7717/peerj.1165
quast:
quast:
- "Alexey Gurevich, Vladislav Saveliev, Nikolay Vyahhi, Glenn Tesler, QUAST: quality\
\ assessment tool for genome assemblies, Bioinformatics, Volume 29, Issue 8, 15\
\ April 2013, Pages 1072\u20131075, https://doi.org/10.1093/bioinformatics/btt086"
- 'Alexey Gurevich, Vladislav Saveliev, Nikolay Vyahhi, Glenn Tesler, QUAST: quality
assessment tool for genome assemblies, Bioinformatics, Volume 29, Issue 8, 15
April 2013, Pages 1072-1075, https://doi.org/10.1093/bioinformatics/btt086'
......@@ -22,9 +22,10 @@ def files_or_dirs_to_ignore():
return res
def module_order():
res = "module_order:\n"
res = ""
for step in config["steps"]:
tool = config["params"][step["name"]]
print(tool)
if (config["multiqc"][tool] != "custom"):
res += " - " + config["multiqc"][tool] + ":\n"
res += " name: " + step["title"] + " (" + tool + ")\n"
......@@ -33,6 +34,8 @@ def module_order():
for rule in config["outputs"][step["name"] + "__" + tool].keys():
res += " - '*" + config["params"][rule + "_output_dir"] + "/*'\n" # limit search to tool output dir
res += " - '*/logs/" + config["params"][rule + "_output_dir"] + "/*'\n" # and tool logs
# dont put module order if empty
if res != "" : res = "module_order:\n" + res
return res
def report_section_order():
......
......@@ -20,6 +20,7 @@ params:
assembly__megahit_SE_output_dir: assembly/megahit_SE
assembly__megahit_SE_command: megahit
assembly__megahit_threads: 4
assembly__megahit_min_contig_len: 200
assembly__megahit_PE_output_dir: assembly/megahit_PE
assembly__megahit_PE_command: megahit
metagenomic: abricate
......@@ -107,6 +108,11 @@ params_info:
rule: assembly_megahit_PE
type: numeric
label: Number of threads to use
assembly__megahit_min_contig_len:
tool: megahit
rule: assembly_megahit_PE
type: numeric
label: Minimum length of contigs to output
metagenomic__abricate_threads:
tool: abricate
rule: metagenomic_abricate
......
import oyaml as yaml
import shutil
import cerberus
def read_yaml(filepath):
try:
with open(filepath, 'r') as file:
with open(filepath, 'rb') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
#data = yaml.load(file)
return data
except IOError as e:
print("Error in file opening:", e)
......@@ -25,4 +27,16 @@ def copy_dir(src,dst):
shutil.copytree(src,dst)
except FileExistsError:
shutil.rmtree(dst, ignore_errors=True)
shutil.copytree(src,dst)
\ No newline at end of file
shutil.copytree(src,dst)
def validate_yaml(document_yaml, schema_yaml):
document = read_yaml(document_yaml)
schema = read_yaml(schema_yaml)
v = cerberus.Validator(schema)
res = v.validate(document, schema)
if (not res):
exit(v.errors)
else:
return res
\ No newline at end of file
{'App': {'project': None, 'general': {'title': 'microbial_metagenome', 'skin': 'blue', 'menu_width': 230}, 'pages': [{'icon': 'pencil', 'label': 'Global parameters', 'name': 'global_params', 'boxes': [{'name': 'global_params', 'title': 'Global parameters :', 'status': 'success', 'content': [{'name': 'results_dir', 'type': 'output_dir', 'value': '/Results', 'label': 'Results directory: ', 'volumes': [{'Results': '/Results'}]}, {'name': 'sample_dir', 'type': 'input_dir', 'value': '/Data', 'label': 'Directory containing the fastq files: ', 'volumes': [{'Data': '/Data'}, {'Results': '/Results'}]}, {'name': 'SeOrPe', 'type': 'radio', 'value': 'PE', 'choices': [{'Single end': 'SE'}, {'Paired end': 'PE'}], 'label': 'Single end reads (SE) or Paired end reads (PE): '}, {'name': 'memo', 'type': 'textArea', 'value': '', 'label': 'Text area for the user'}]}]}, {'icon': 'pencil', 'label': 'quality', 'name': 'quality', 'default': 'trimmomatic', 'boxes': [{'name': 'trimmomatic', 'title': 'Trimmomatic', 'status': 'success', 'content': [{'name': 'quality__trimmomatic_threads', 'prefix': '-threads', 'type': 'numeric', 'value': 4, 'min': 1, 'max': 'NA', 'step': 1, 'label': 'Number of threads to use'}, {'name': 'quality__trimmomatic_qc_score', 'type': 'radio', 'value': '-phred64', 'choices': [{'phred33': '-phred33'}, {'phred64': '-phred64'}], 'label': 'Quality score encoding'}, {'name': 'quality__trimmomatic_fastaWithAdapters', 'type': 'input_file', 'value': '', 'label': '(optional) fastaWithAdapters file for ILLUMINACLIP parameter'}, {'name': 'quality__trimmomatic_illuminaclip', 'type': 'text', 'value': '', 'label': '(optional) See ILLUMINACLIP in documentation <seed mismatches>:<palindrome clip threshold>:<simple clip threshold>:<minAdapterLength>:<keepBothReads>'}, {'name': 'quality__trimmomatic_otherparams', 'type': 'text', 'value': '', 'label': '(optional) See documentation for other trimmomatic parameters (LEADING, TRAILING, MINLEN, ...)'}, {'name': 'trimmomatic', 'type': 'help', 'label': 'Trimmomatic: A flexible read trimming tool for Illumina NGS data'}, {'name': 'trimmomatic', 'type': 'link', 'label': 'Website : ', 'href': 'http://www.usadellab.org/cms/?page=trimmomatic'}, {'name': 'trimmomatic', 'type': 'link', 'label': 'Documentation : ', 'href': 'http://www.usadellab.org/cms/uploads/supplementary/Trimmomatic/TrimmomaticManual_V0.32.pdf'}, {'name': 'trimmomatic', 'type': 'link', 'label': 'Paper : ', 'href': 'https://doi.org/10.1093/bioinformatics/btu170'}]}]}, {'icon': 'pencil', 'label': 'assembly', 'name': 'assembly', 'default': 'megahit', 'boxes': [{'name': 'megahit', 'title': 'MEGAHIT', 'status': 'success', 'content': [{'name': 'assembly__megahit_threads', 'prefix': '-t', 'type': 'numeric', 'value': 4, 'min': 1, 'max': 'NA', 'step': 1, 'label': 'Number of threads to use'}, {'name': 'assembly__megahit_min_contig_len', 'prefix': '--min-contig-len', 'type': 'numeric', 'value': 200, 'min': 1, 'max': 'NA', 'step': 1, 'label': 'Minimum length of contigs to output'}, {'name': 'megahit', 'type': 'help', 'label': 'MEGAHIT: An ultra-fast single-node solution for large and complex metagenomics assembly via succinct de Bruijn graph'}, {'name': 'megahit', 'type': 'link', 'label': 'Website : ', 'href': 'https://github.com/voutcn/megahit'}, {'name': 'megahit', 'type': 'link', 'label': 'Documentation : ', 'href': 'https://github.com/voutcn/megahit/wiki'}, {'name': 'megahit', 'type': 'link', 'label': 'Paper : ', 'href': 'https://doi.org/10.1016/j.ymeth.2016.02.020'}]}]}, {'icon': 'pencil', 'label': 'metagenomic', 'name': 'metagenomic', 'default': 'abricate', 'boxes': [{'name': 'abricate', 'title': 'ABRicate', 'status': 'success', 'content': [{'name': 'metagenomic__abricate_threads', 'prefix': '--threads', 'type': 'numeric', 'value': 4, 'min': 1, 'max': 'NA', 'step': 1, 'label': 'Number of threads to use'}, {'name': 'metagenomic__abricate_database', 'prefix': '--db', 'type': 'select', 'choices': [{'card': 'card'}, {'resfinder': 'resfinder'}, {'megares': 'megares'}, {'argannot': 'argannot'}, {'ecoli_vf': 'ecoli_vf'}, {'plasmidfinder': 'plasmidfinder'}, {'vfdb': 'vfdb'}, {'ncbi': 'ncbi'}], 'value': 'ncbi', 'label': 'Database to use'}, {'name': 'metagenomic__abricate_minid', 'prefix': '--minid', 'type': 'numeric', 'value': 80, 'min': 0, 'max': 100, 'step': 0.1, 'label': 'Minimum DNA %identity'}, {'name': 'metagenomic__abricate_mincov', 'prefix': '--mincov', 'type': 'numeric', 'value': 80, 'min': 0, 'max': 100, 'step': 0.1, 'label': 'Minimum DNA %coverage'}, {'name': 'abricate', 'type': 'help', 'label': 'ABRicate: Mass screening of contigs for antimicrobial resistance or virulence genes'}, {'name': 'abricate', 'type': 'link', 'label': 'Website : ', 'href': 'https://github.com/tseemann/abricate/tree/v1.0.1'}, {'name': 'abricate', 'type': 'link', 'label': 'Documentation : ', 'href': 'https://github.com/tseemann/abricate/blob/v1.0.1/README.md'}]}]}, {'icon': 'pencil', 'label': 'metagenomic_2', 'name': 'metagenomic_2', 'default': 'metabat', 'boxes': [{'name': 'metabat', 'title': 'MetaBAT', 'status': 'success', 'content': [{'name': 'metagenomic_2__metabat_threads', 'prefix': '-t', 'type': 'numeric', 'value': 4, 'min': 1, 'max': 'NA', 'step': 1, 'label': 'Number of threads to use'}, {'name': 'metagenomic_2__metabat_mincontig', 'prefix': '--minContig', 'type': 'numeric', 'value': 2500, 'min': 1500, 'max': 'NA', 'step': 1, 'label': 'Minimum size of a contig for binning'}, {'name': 'metabat', 'type': 'help', 'label': 'MetaBAT: Metagenome Binning based on Abundance and Tetranucleotide frequency'}, {'name': 'metabat', 'type': 'link', 'label': 'Website : ', 'href': 'https://bitbucket.org/berkeleylab/metabat'}, {'name': 'metabat', 'type': 'link', 'label': 'Documentation : ', 'href': 'https://bitbucket.org/berkeleylab/metabat/wiki/Home'}, {'name': 'metabat', 'type': 'link', 'label': 'Paper : ', 'href': 'https://doi.org/10.7717/peerj.1165'}]}]}, {'icon': 'pencil', 'label': 'Assembly Quality', 'name': 'assembly_quality', 'default': 'quast', 'boxes': [{'name': 'quast', 'title': 'QUAST', 'status': 'success', 'content': [{'name': 'assembly_quality__quast_threads', 'prefix': '--threads', 'value': 4, 'min': 1, 'max': 32, 'step': 1, 'label': 'Threads to use', 'type': 'numeric'}, {'name': 'quast', 'type': 'help', 'label': 'QUAST: Quality Assessment Tool for Genome Assemblies'}, {'name': 'quast', 'type': 'link', 'label': 'Website : ', 'href': 'http://bioinf.spbau.ru/quast'}, {'name': 'quast', 'type': 'link', 'label': 'Documentation : ', 'href': 'http://quast.bioinf.spbau.ru/manual.html'}, {'name': 'quast', 'type': 'link', 'label': 'Paper : ', 'href': 'https://doi.org/10.1093/bioinformatics/btt086'}]}]}], 'run': {'shiny_button': {'name': 'RunPipeline', 'type': 'button', 'icon': 'play', 'class': 'btn btn-info', 'label': 'Run pipeline'}, 'program': 'snakemake', 'options': [{'name': '-s', 'type': 'value', 'value': '/workflow/Snakefile'}, {'name': '--configfile', 'type': 'value', 'value': '/Results/params.yml'}, {'name': '-d', 'type': 'value', 'value': '/Results'}, {'name': '--cores', 'type': 'shiny', 'value': 'cores'}]}, 'RULEGRAPH': None, 'Report': None, 'download': {'shiny_button': {'name': 'DownloadParams', 'type': 'button', 'class': 'btn btn-light', 'label': 'Download config file'}}}}
......@@ -138,6 +138,7 @@ observeEvent(input$results_dir,{
})
observe({
rv$timer()
if (!file.exists(paste0(input$results_dir,"/logs/workflow.running"))){rv$running = F}
if (isolate(rv$running)){
if (file.exists(paste0(input$results_dir,"/logs/runlog.txt"))){
rv$textstream <- paste(readLines(paste0(input$results_dir,"/logs/runlog.txt"),warn=F), collapse = "<br/>")
......@@ -154,15 +155,11 @@ observeEvent(input$results_dir,{
addResourcePath("results", input$results_dir)
outUI = tags$iframe(src=paste0("results/multiqc_report.html"),width="100%", height="900px")
output$report_html = renderUI(outUI)
file.remove(paste0(input$results_dir,"/logs/workflow_end.ok"))
file.remove(paste0(input$results_dir,"/logs/workflow.running"))
}
else if (file.exists(paste0(input$results_dir,"/logs/workflow_end.error"))){
isolate({rv$running = F})
toggle_inputs(reactiveValuesToList(input),T,F)
output$report_html = renderUI(HTML(paste(readLines(paste0(input$results_dir,"/logs/workflow_end.error"),warn=F), collapse = "<br/>")))
file.remove(paste0(input$results_dir,"/logs/workflow_end.error"))
file.remove(paste0(input$results_dir,"/logs/workflow.running"))
}
}
})
......
......@@ -5,6 +5,8 @@ box(title = "Parameters :", width = 12, status = "primary", collapsible = TRUE,
hidden(textInput("selectassembly", label = "", value="megahit")),box(title = "MEGAHIT", width = 12, status = "success", collapsible = TRUE, solidHeader = TRUE,
numericInput("assembly__megahit_threads", label = "Number of threads to use", min = 1, max = NA, step = 1, width = "auto", value = 4),
numericInput("assembly__megahit_min_contig_len", label = "Minimum length of contigs to output", min = 1, max = NA, step = 1, width = "auto", value = 200),
p("MEGAHIT: An ultra-fast single-node solution for large and complex metagenomics assembly via succinct de Bruijn graph"),
p("Website : ",a(href="https://github.com/voutcn/megahit","https://github.com/voutcn/megahit",target="_blank")),
......
......@@ -67,6 +67,12 @@ save_params <- function(path_param){
res = paste0(res, paste("assembly__megahit_threads:", paste0('"', input$assembly__megahit_threads, '"'), "\n", sep = " "))
}
if(!is.na(as.numeric(input$assembly__megahit_min_contig_len))) {
res = paste0(res, paste("assembly__megahit_min_contig_len:", format(input$assembly__megahit_min_contig_len, scientific=F), "\n", sep = " "))
} else {
res = paste0(res, paste("assembly__megahit_min_contig_len:", paste0('"', input$assembly__megahit_min_contig_len, '"'), "\n", sep = " "))
}
# Page : metagenomic
res = paste0(res , paste("metagenomic:", paste0('"', input$selectmetagenomic, '"'), "\n", sep = " "))
if(!is.na(as.numeric(input$metagenomic__abricate_threads))) {
......@@ -140,10 +146,11 @@ force_rule <- function(force_from){
params = yaml.load_file(paste0(input$results_dir,"/params.yml"), handlers=list("float#fix"=function(x){ format(x,scientific=F)}))
outputs = params[["outputs"]]
tool = params[["params"]][[force_from]]
if (length(outputs[[tool]])==1)
rule = names(outputs[[tool]])[[1]]
steptool = paste0(force_from,"__",tool)
if (length(outputs[[steptool]])==1)
rule = names(outputs[[steptool]])[[1]]
else{
rule = names(outputs[[tool]])[[grep(input$SeOrPe,names(outputs[[tool]]))]]
rule = names(outputs[[steptool]])[[grep(input$SeOrPe,names(outputs[[steptool]]))]]
}
return(paste0("--forcerun ",rule))
}
......@@ -151,6 +158,9 @@ force_rule <- function(force_from){
#' Event when use RULEGRAPH button
observeEvent({c(input$sidebarmenu,input$refresh_rg)}, {
if (!dir.exists(paste0(input$results_dir,"/logs"))){
dir.create(paste0(input$results_dir,"/logs"))
}
if(input$sidebarmenu=="RULEGRAPH"){
input_list <- reactiveValuesToList(input)
toggle_inputs(input_list,F,F)
......@@ -162,15 +172,15 @@ observeEvent({c(input$sidebarmenu,input$refresh_rg)}, {
system(paste0("rm ",input$results_dir,"/rulegraph*"))
outUI = tryCatch({
system(paste0("snakemake -s /workflow/Snakefile --configfile ",input$results_dir,"/params.yml -d ",input$results_dir," all --rulegraph 1> ",input$results_dir,"/rulegraph",i,".dot"),intern=T)
system(paste0("snakemake -s /workflow/Snakefile --configfile ",input$results_dir,"/params.yml -d ",input$results_dir," all --rulegraph 1> ",input$results_dir,"/rulegraph",i,".dot 2> ",input$results_dir,"/logs/rulegraph.txt"),intern=T)
system(paste0("cat ",input$results_dir,"/rulegraph",i,".dot | dot -Tsvg -Gratio=0.75 > ",input$results_dir,"/rulegraph",i,".svg"),intern=T)
tagList(img(src = paste0("results/rulegraph",i,".svg") ,alt = "Rulegraph of Snakemake jobs",style="max-width: 100%;height: auto;display: block;margin: auto"))},
error = function(e){
system(paste0("touch ",input$results_dir,"/logs/workflow_end.error"),wait = T)
return(tags$p(paste0("error : ",e$message)))},
return(tags$p(HTML(paste(readLines(paste0(input$results_dir,"/logs/rulegraph.txt"),warn=F), collapse = "<br/>"))))},
warning = function(w){
system(paste0("touch ",input$results_dir,"/logs/workflow_end.error"),wait = T)
return(tags$p(paste0("error : ",w$message)))})
return(tags$p(HTML(paste(readLines(paste0(input$results_dir,"/logs/rulegraph.txt"),warn=F), collapse = "<br/>"))))})
addResourcePath("results", input$results_dir)
output$RULEGRAPH_svg = renderUI(outUI)
toggle_inputs(input_list,T,F)
......@@ -194,6 +204,12 @@ observeEvent(input$RunPipeline, {
if (!file.exists(paste0(input$results_dir,"/logs/runlog.txt"))){
file.create(paste0(input$results_dir,"/logs/runlog.txt"))
}
if (file.exists(paste0(input$results_dir,"/logs/workflow_end.ok"))){
file.remove(paste0(input$results_dir,"/logs/workflow_end.ok"))
}
if (file.exists(paste0(input$results_dir,"/logs/workflow_end.error"))){
file.remove(paste0(input$results_dir,"/logs/workflow_end.error"))
}
system(paste0("touch ",input$results_dir,"/logs/workflow.running"),wait = T)
system(paste0("snakemake -s /workflow/Snakefile --configfile ",input$results_dir,"/params.yml -d ",input$results_dir," all --rulegraph | dot -Tpng -Gratio=0.75 > ",input$results_dir,"/Rule_graph_mqc.png"))
force = force_rule(input$force_from)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment