diff --git a/.github/workflows/docker_base.yml b/.github/workflows/docker_base.yml index 6aa856c..0bf10f2 100644 --- a/.github/workflows/docker_base.yml +++ b/.github/workflows/docker_base.yml @@ -1,4 +1,4 @@ -name: Docker Container (Base) +name: Container build (Base) on: push: @@ -8,25 +8,20 @@ on: jobs: push_to_registry: - name: Push Docker image to GitHub Packages + name: Push to quay.io runs-on: ubuntu-latest steps: - name: Check out the repo uses: actions/checkout@v2 - - name: Push to Docker Hub - uses: docker/build-push-action@v1 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASSWORD }} - repository: beckerlab/aradeepopsis-base - path: containers/base - tag_with_ref: true - - name: Push to GitHub Packages - uses: docker/build-push-action@v1 - with: - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - registry: docker.pkg.github.com - repository: gregor-mendel-institute/aradeepopsis/aradeepopsis-base - path: containers/base - tag_with_ref: true \ No newline at end of file + + - name: Login to quay.io + env: + QUAY_USER: ${{ secrets.REGISTRY_USER }} + QUAY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} + run: podman login -u ${QUAY_USER} -p ${QUAY_PASSWORD} quay.io + + - name: Build container + run: podman build --tag beckerlab/aradeepopsis-base containers/base + + - name: Push container + run: podman push beckerlab/aradeepopsis-base docker://quay.io/beckerlab/aradeepopsis-base:${GITHUB_REF##*/} \ No newline at end of file diff --git a/.github/workflows/docker_dpp.yml b/.github/workflows/docker_dpp.yml index fb106fd..4f56524 100644 --- a/.github/workflows/docker_dpp.yml +++ b/.github/workflows/docker_dpp.yml @@ -1,4 +1,4 @@ -name: Docker Container (DPP) +name: Container build (DPP) on: push: @@ -8,25 +8,20 @@ on: jobs: push_to_registry: - name: Push Docker image to GitHub Packages + name: Push to quay.io runs-on: ubuntu-latest steps: - name: Check out the repo uses: actions/checkout@v2 - - name: Push to Docker Hub - uses: docker/build-push-action@v1 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASSWORD }} - repository: beckerlab/aradeepopsis-dpp - path: containers/addons/dpp - tag_with_ref: true - - name: Push to GitHub Packages - uses: docker/build-push-action@v1 - with: - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - registry: docker.pkg.github.com - repository: gregor-mendel-institute/aradeepopsis/aradeepopsis-dpp - path: containers/addons/dpp - tag_with_ref: true \ No newline at end of file + + - name: Login to quay.io + env: + QUAY_USER: ${{ secrets.REGISTRY_USER }} + QUAY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} + run: podman login -u ${QUAY_USER} -p ${QUAY_PASSWORD} quay.io + + - name: Build container + run: podman build --tag beckerlab/aradeepopsis-dpp containers/addons/dpp + + - name: Push container + run: podman push beckerlab/aradeepopsis-dpp docker://quay.io/beckerlab/aradeepopsis-dpp:${GITHUB_REF##*/} \ No newline at end of file diff --git a/.github/workflows/docker_shiny.yml b/.github/workflows/docker_shiny.yml index 27656a3..eca5602 100644 --- a/.github/workflows/docker_shiny.yml +++ b/.github/workflows/docker_shiny.yml @@ -1,4 +1,4 @@ -name: Docker Container (Shiny) +name: Container build (Shiny) on: push: @@ -8,25 +8,20 @@ on: jobs: push_to_registry: - name: Push Docker image to GitHub Packages + name: Push to quay.io runs-on: ubuntu-latest steps: - name: Check out the repo uses: actions/checkout@v2 - - name: Push to Docker Hub - uses: docker/build-push-action@v1 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASSWORD }} - repository: beckerlab/aradeepopsis-shiny - path: containers/shiny - tag_with_ref: true - - name: Push to GitHub Packages - uses: docker/build-push-action@v1 - with: - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - registry: docker.pkg.github.com - repository: gregor-mendel-institute/aradeepopsis/aradeepopsis-shiny - path: containers/shiny - tag_with_ref: true \ No newline at end of file + + - name: Login to quay.io + env: + QUAY_USER: ${{ secrets.REGISTRY_USER }} + QUAY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} + run: podman login -u ${QUAY_USER} -p ${QUAY_PASSWORD} quay.io + + - name: Build container + run: podman build --tag beckerlab/aradeepopsis-shiny containers/shiny + + - name: Push container + run: podman push beckerlab/aradeepopsis-shiny docker://quay.io/beckerlab/aradeepopsis-shiny:${GITHUB_REF##*/} \ No newline at end of file diff --git a/.github/workflows/minimal_test.yml b/.github/workflows/minimal_test.yml index 2cf72df..fc1c5fe 100644 --- a/.github/workflows/minimal_test.yml +++ b/.github/workflows/minimal_test.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - nxf_ver: ["20.01.0", ""] + nxf_ver: ["20.07.1", ""] steps: - uses: actions/checkout@v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index c051220..5adfb0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [v1.3](https://github.com/Gregor-Mendel-Institute/aradeepopsis/releases/tag/v1.3) - 2021-01-11 + +* changed container registry from docker.io to quay.io +* improved image visualization and plot rendering in Shiny app (see [#54](https://github.com/Gregor-Mendel-Institute/aradeepopsis/issues/54)) thanks @dschneiderch for input +* updated `scikit-image` `0.17.2` > `0.18.1` +* updated `imagemagick` dependency `7.0.10_23` > `7.0.10_28` +* updated `shinycssloaders` dependency `0.3` > `1.0.0` +* updated `slickr` dependency `0.4.9` > `0.5.0` +* added publication doi to pipeline manifest +* changed (back) download links in pipeline to fetch pretrained models from Dropbox instead of Zenodo ([#53](https://github.com/Gregor-Mendel-Institute/aradeepopsis/issues/53#issue-779431868)) +* added charliecloud profile (needs nextflow >= 20.12.0-edge) +* fixed plotting of leaf states over time in Shiny app (when appropriate metadata are provided) +* added config for LRZ coolmuc2 + ## [v1.2.1](https://github.com/Gregor-Mendel-Institute/aradeepopsis/releases/tag/v1.2.1) - 2020-07-23 * updated pipeline to fetch trained models from the deposited [Zenodo record](https://doi.org/10.5281/zenodo.3946321) instead of Dropbox @@ -30,4 +44,4 @@ ## [v1.0](https://github.com/Gregor-Mendel-Institute/aradeepopsis/releases/tag/v1.0) - 2020-04-02 -Initial pipeline release \ No newline at end of file +Initial pipeline release diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 408d8c5..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,3 +0,0 @@ -buildDockerImage([imageName: "aradeepopsis", - pushRegistryNamespace: "becker", - pushBranches:["master","dev","next"]]) diff --git a/README.md b/README.md index cd53180..cd6975b 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,9 @@ ![Latest Release](https://img.shields.io/github/v/release/Gregor-Mendel-Institute/aradeepopsis?sort=semver) ![License](https://img.shields.io/github/license/Gregor-Mendel-Institute/aradeepopsis) [![DOI](https://zenodo.org/badge/240287274.svg)](https://zenodo.org/badge/latestdoi/240287274) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.01.0-important.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.07.1-important.svg)](https://www.nextflow.io/) [![conda](https://img.shields.io/badge/install%20with-conda-brightgreen.svg)](https://conda.io/) -| Container | Image size | Pulls | Latest version | -| :---: | :---: | :---: | :---: | -| ![Docker Container (Base)](https://github.com/Gregor-Mendel-Institute/aradeepopsis/workflows/Docker%20Container%20(Base)/badge.svg?branch=master) | ![Docker Size (Base)](https://img.shields.io/docker/image-size/beckerlab/aradeepopsis-base?sort=semver) | ![Pulls](https://img.shields.io/docker/pulls/beckerlab/aradeepopsis-base) | ![Image Tag](https://img.shields.io/docker/v/beckerlab/aradeepopsis-base?sort=semver) | -| ![Docker Container (Shiny)](https://github.com/Gregor-Mendel-Institute/aradeepopsis/workflows/Docker%20Container%20(Shiny)/badge.svg?branch=master) | ![Docker Size (Shiny)](https://img.shields.io/docker/image-size/beckerlab/aradeepopsis-shiny?sort=semver) | ![Pulls](https://img.shields.io/docker/pulls/beckerlab/aradeepopsis-shiny) | ![Image Tag](https://img.shields.io/docker/v/beckerlab/aradeepopsis-shiny?sort=semver) | -| ![Docker Docker (DPP)](https://github.com/Gregor-Mendel-Institute/aradeepopsis/workflows/Docker%20Container%20(DPP)/badge.svg?branch=master) | ![Docker Size (DPP)](https://img.shields.io/docker/image-size/beckerlab/aradeepopsis-dpp?sort=semver) | ![Pulls](https://img.shields.io/docker/pulls/beckerlab/aradeepopsis-dpp) | ![Image Tag](https://img.shields.io/docker/v/beckerlab/aradeepopsis-base?sort=semver) | - - # Introduction `ARADEEPOPSIS` is a software tool that enables plant researchers to non-invasively score plant growth, biomass accumulation and senescence from image data in a highly parallelized, high throughput, yet easy to use manner. diff --git a/assets/shiny/app.R b/assets/shiny/app.R index c500ed4..828f171 100755 --- a/assets/shiny/app.R +++ b/assets/shiny/app.R @@ -1,18 +1,18 @@ -# Copyright (C) 2019-2020 Patrick Hüther +# Copyright (C) 2019-2021 Patrick Hüther # -# This file is part of araDeepopsis. -# araDeepopsis free software: you can redistribute it and/or modify +# This file is part of ARADEEPOPSIS. +# ARADEEPOPSIS 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. # -# araDeepopsis is distributed in the hope that it will be useful, +# ARADEEPOPSIS 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 araDeepopsis. If not, see . +# along with ARADEEPOPSIS. If not, see . library(shiny) library(slickR) @@ -42,10 +42,10 @@ traitcount <- ncol(data) - 2 # exclude filename and suffix imagecount <- nrow(data) # Define UI -ui <- navbarPage(title="aradeepopsis", id="nav", theme = shinytheme("flatly"), +ui <- navbarPage(title=a("aradeepopsis", href="https://github.com/Gregor-Mendel-Institute/aradeepopsis", target="_blank"), windowTitle = "ARADEEPOPSIS", id="nav", theme = shinytheme("flatly"), collapsible=TRUE, tabPanel("Rosette Carousel", sliderInput("chunk", label = "Select chunk:", min = 1, max = ceiling(imagecount/60), value = 1, width = '100%', step = 1), - slickROutput("slickr",width='100%',height='400px') %>% withSpinner() + slickROutput("slickr", width='auto', height='auto') %>% withSpinner() ), tabPanel("Rosette Explorer", sidebarPanel( @@ -92,7 +92,7 @@ ui <- navbarPage(title="aradeepopsis", id="nav", theme = shinytheme("flatly"), div(style = "overflow-x:scroll;", tableOutput("meta")), varSelectizeInput("file","Select column containing the filename", data = NULL), varSelectizeInput("date","Select column containing the timestamp", data = NULL), - textInput("date_format","Enter timestamp format",value="%y-%m-%d"), + textInput("date_format",HTML('Enter timestamp format'),value="%y-%m-%d"), varSelectizeInput("groupvar","Select column to group by", data = NULL), actionButton("merge_data", "Analyze!"), conditionalPanel( @@ -129,18 +129,18 @@ server <- function(input, output, session) { updateSelectizeInput(session, "explorer_files", choices = c(imagenames), server = TRUE) output$mask <- renderImage(deleteFile=FALSE,{ - list(src = glue::glue("diagnostics/mask/mask_{input$explorer_files}.png"),width=400,height=400) + list(src = glue::glue("diagnostics/mask/mask_{input$explorer_files}.png"),width=600,height="auto") }) output$hull <- renderImage(deleteFile=FALSE,{ - list(src = glue::glue("diagnostics/convex_hull/hull_{input$explorer_files}.png"),width=400,height=400) + list(src = glue::glue("diagnostics/convex_hull/hull_{input$explorer_files}.png"),width=600,height="auto") }) output$rosette <- renderImage(deleteFile=FALSE,{ - list(src = glue::glue("diagnostics/crop/crop_{input$explorer_files}.jpeg"),width=400,height=400) + list(src = glue::glue("diagnostics/crop/crop_{input$explorer_files}.jpeg"),width=600,height="auto") }) output$overlay <- renderImage(deleteFile=FALSE,{ - list(src = glue::glue("diagnostics/overlay/overlay_{input$explorer_files}.jpeg"),width=400,height=400) + list(src = glue::glue("diagnostics/overlay/overlay_{input$explorer_files}.jpeg"),width=600,height="auto") }) - output$color <- renderPlot({ + output$color <- renderPlot(width=600,height=600,{ img <- readJPEG(glue::glue("diagnostics/crop/crop_{input$explorer_files}.jpeg")) r <- img[,,1] %>% as_tibble() %>% pivot_longer(everything()) %>% mutate(name=1) @@ -214,26 +214,27 @@ server <- function(input, output, session) { joined() %>% select(dateVar,groupVar,trait := !!input$exp_traits) %>% ggplot(aes(x=dateVar,y=trait,colour=groupVar)) + - stat_summary(geom="line") + + stat_summary(geom="line", size=1.5) + stat_summary(geom="pointrange") + - scale_color_viridis_d(option="A") + + scale_color_viridis_d(option="A", end=0.9) + labs(x="time",y="trait value",colour=element_blank()) + theme_bw() }) output$leafstates <- renderPlot({ joined() %>% - select(file_name,groupVar,dateVar,matches("norm_area|antho_area|senesc_area")) %>% + select(file,groupVar,dateVar,matches("norm_area|antho_area|senesc_area")) %>% pivot_longer(starts_with("class_"),names_to = "state") %>% - group_by(groupVar,dateVar,file_name) %>% + group_by(groupVar,dateVar,file) %>% mutate(relativeFrac=value/sum(value)) %>% ggplot(aes(x = dateVar, y = relativeFrac, colour=state)) + - stat_summary(geom="line") + + stat_summary(geom="line", size=1.5) + stat_summary(geom="pointrange") + scale_color_manual(values = c("class_norm_area" = rgb(31,158,137, maxColorValue = 255), "class_antho_area" = rgb(72,40,120, maxColorValue = 255), "class_senesc_area" = rgb(253,231,37, maxColorValue = 255))) + scale_y_continuous(labels = scales::percent) + labs(x="time",y="% of plant area",colour=element_blank()) + + facet_wrap(~groupVar) + theme_bw() }) # show a description if Rosette Experiment is selected @@ -243,12 +244,14 @@ server <- function(input, output, session) { modalDialog( title="Experimental feature!", HTML("This feature is meant to add metadata to the pipeline result, allowing to visualize traits over time.
- It requires a table with metadata in csv format.
- Such metadata has to contain one row per input image and columns with the following information:
- - filename of the original image
- - timestamp when the image was recorded
- - format of the timestamp
- - variable by which the result should be grouped (such as a genotype ID)") + It requires a csv table with metadata that is then joined with the pipeline result.
+
+ Such metadata has to contain one row per input image and the following columns:
+ - Filenames of the original images
+ - Timestamps when the images were recorded
+ - Variable(s) by which the result should be grouped (such as genotype or accession ID)
+
+ Note: If the 'file' column of aradeepopsis_traits.csv is used to extract such metadata, trait columns should be removed before uploading") ) ) } @@ -262,7 +265,7 @@ server <- function(input, output, session) { # this drastically improves page loading time chunks <- if (imagecount > 60) split(imagenames$file, ceiling(seq_along(imagenames$file)/60)) else split(imagenames$file, 1) - opts <- settings(slidesToShow = 6, slidesToScroll = 6) + opts <- settings(slidesToShow=6, slidesToScroll=6, responsive=htmlwidgets::JS("[{breakpoint: 1440,settings: {slidesToShow: 3,slidesToScroll: 3}},{breakpoint: 680,settings: {slidesToShow: 1,slidesToScroll: 1}}]")) overlay <- slickR(glue::glue("diagnostics/overlay/overlay_{chunks[[input$chunk]]}.jpeg"), height = 200) + opts mask <- slickR(glue::glue("diagnostics/mask/mask_{chunks[[input$chunk]]}.png"), height = 200) + opts + settings(arrows = F) diff --git a/bin/data_record.py b/bin/data_record.py index e50d0b2..a151b01 100644 --- a/bin/data_record.py +++ b/bin/data_record.py @@ -2,19 +2,19 @@ # Copyright (C) 2019-2020 Patrick Hüther # -# This file is part of araDeepopsis. -# araDeepopsis free software: you can redistribute it and/or modify +# This file is part of ARADEEPOPSIS. +# ARADEEPOPSIS 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. # -# araDeepopsis is distributed in the hope that it will be useful, +# ARADEEPOPSIS 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 araDeepopsis. If not, see . +# along with ARADEEPOPSIS. If not, see . import tensorflow as tf diff --git a/bin/frozen_graph.py b/bin/frozen_graph.py index a8a266d..ed36e31 100644 --- a/bin/frozen_graph.py +++ b/bin/frozen_graph.py @@ -2,19 +2,19 @@ # Copyright (C) 2019-2020 Patrick Hüther # -# This file is part of araDeepopsis. -# araDeepopsis free software: you can redistribute it and/or modify +# This file is part of ARADEEPOPSIS. +# ARADEEPOPSIS 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. # -# araDeepopsis is distributed in the hope that it will be useful, +# ARADEEPOPSIS 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 araDeepopsis. If not, see . +# along with ARADEEPOPSIS. If not, see . # ====================================================================== # Portions of this code are modifications based on work created and # shared by Google and used according to terms described in the diff --git a/bin/traits.py b/bin/traits.py index 356b485..6bd4ec6 100644 --- a/bin/traits.py +++ b/bin/traits.py @@ -2,19 +2,19 @@ # Copyright (C) 2019-2020 Patrick Hüther # -# This file is part of araDeepopsis. -# araDeepopsis free software: you can redistribute it and/or modify +# This file is part of ARADEEPOPSIS. +# ARADEEPOPSIS 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. # -# araDeepopsis is distributed in the hope that it will be useful, +# ARADEEPOPSIS 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 araDeepopsis. If not, see . +# along with ARADEEPOPSIS. If not, see . import csv import os diff --git a/conf/base.config b/conf/base.config index 3ddaf0a..eca612d 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,23 +1,23 @@ /* Copyright (C) 2019-2020 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ /* ------------------------------------------------- - * Nextflow config file for araDeepopsis + * Nextflow config file for ARADEEPOPSIS * ------------------------------------------------- */ @@ -28,36 +28,36 @@ env { process { withName: build_records { - container = 'beckerlab/aradeepopsis-base:1.2.1' + container = 'quay.io/beckerlab/aradeepopsis-base:1.3' cpus = 1 memory = 2.GB time = 1.h } withName: run_predictions { - container = 'beckerlab/aradeepopsis-base:1.2.1' + container = 'quay.io/beckerlab/aradeepopsis-base:1.3' cpus = 2 memory = params.multiscale ? 12.GB : 6.GB time = 4.h } withName: run_predictions_DPP { - container = 'beckerlab/aradeepopsis-dpp:1.2.1' + container = 'quay.io/beckerlab/aradeepopsis-dpp:1.3' cpus = 2 memory = 2.GB time = 4.h } withName: extract_traits { - container = 'beckerlab/aradeepopsis-base:1.2.1' + container = 'quay.io/beckerlab/aradeepopsis-base:1.3' cpus = 1 memory = 2.GB time = 1.h } withName: draw_diagnostics { - container = 'beckerlab/aradeepopsis-base:1.2.1' + container = 'quay.io/beckerlab/aradeepopsis-base:1.3' cpus = 1 memory = 2.GB time = 1.h } withName: launch_shiny { - container = 'beckerlab/aradeepopsis-shiny:1.2.1' + container = 'quay.io/beckerlab/aradeepopsis-shiny:1.3' } } diff --git a/conf/cbe.config b/conf/cbe.config index 0eb739e..1a75520 100644 --- a/conf/cbe.config +++ b/conf/cbe.config @@ -1,19 +1,19 @@ /* Copyright (C) 2019-2020 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ /* ------------------------------------------------- diff --git a/conf/charliecloud.config b/conf/charliecloud.config new file mode 100644 index 0000000..2f9af09 --- /dev/null +++ b/conf/charliecloud.config @@ -0,0 +1,35 @@ +/* +Copyright (C) 2019-2021 Patrick Hüther + +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. + +ARADEEPOPSIS 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 ARADEEPOPSIS. If not, see . +*/ + +/* ------------------------------------------------- + * Nextflow config file for ARADEEPOPSIS + * ------------------------------------------------- + */ + +env { + //for charliecloud, the PATH environment within the Docker image needs to be passed explicitly + PATH = "/opt/conda/envs/aradeepopsis-dpp-v1.3/bin:/opt/conda/envs/aradeepopsis-shiny-v1.3/bin:/opt/conda/envs/aradeepopsis-base-v1.3/bin:$PATH" +} + +charliecloud { + enabled = true +} + +manifest { + nextflowVersion = '>=20.12.0-edge' +} \ No newline at end of file diff --git a/conf/conda.config b/conf/conda.config index 3335b5d..6b828b8 100644 --- a/conf/conda.config +++ b/conf/conda.config @@ -1,23 +1,23 @@ /* Copyright (C) 2019-2020 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ /* ------------------------------------------------- - * Nextflow config file for araDeepopsis + * Nextflow config file for ARADEEPOPSIS * ------------------------------------------------- */ diff --git a/conf/lrz.config b/conf/lrz.config new file mode 100644 index 0000000..56dfd4c --- /dev/null +++ b/conf/lrz.config @@ -0,0 +1,57 @@ +/* +Copyright (C) 2019-2020 Patrick Hüther, Niklas Schandry + +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. + +ARADEEPOPSIS 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 ARADEEPOPSIS. If not, see . +*/ + +/* ------------------------------------------------- + * Nextflow config file for LRZ Linux Cluster (CM2) + * ------------------------------------------------- + */ + +process { + executor = 'slurm' + queue = 'cm2_std' + queueSize = 50 + clusterOptions = "--clusters cm2 --qos cm2_std" + errorStrategy = { task.exitStatus in [104,134,135,137,139,140,143] ? 'retry' : 'finish' } + maxRetries = 3 + + withName: build_records { + cpus = { 1 * task.attempt } + memory = { 1.GB * task.attempt } + time = { 1.h * task.attempt } + } + withName: run_predictions { + cpus = { 4 * task.attempt } + memory = { 12.GB * task.attempt } + time = { 4.h * task.attempt } + } + withName: run_predictions_DPP { + cpus = { 4 * task.attempt } + memory = { 16.GB * task.attempt } + time = { 2.h * task.attempt } + } + withName: extract_traits { + cpus = { 1 * task.attempt } + memory = { 1.GB * task.attempt } + time = { 1.h * task.attempt } + } + withName: draw_diagnostics { + cpus = { 1 * task.attempt } + memory = { 2.GB * task.attempt } + time = { 1.h * task.attempt } + } +} diff --git a/conf/test.config b/conf/test.config index 5933a7e..785c4a6 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,19 +1,19 @@ /* Copyright (C) 2019-2020 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ /* ------------------------------------------------- diff --git a/containers/addons/dpp/Dockerfile b/containers/addons/dpp/Dockerfile index c0f51c9..0bb85cc 100644 --- a/containers/addons/dpp/Dockerfile +++ b/containers/addons/dpp/Dockerfile @@ -1,9 +1,8 @@ FROM continuumio/miniconda3 -MAINTAINER Patrick Hüther LABEL authors="patrick.huether@gmi.oeaw.ac.at" \ - description="Container image containing DPP dependencies for araDeepopsis" + description="Container image containing DPP dependencies for ARADEEPOPSIS" COPY environment.yml / RUN apt-get update && apt-get install -y procps graphviz && apt-get clean -y RUN conda env create -f /environment.yml && conda clean -afy -ENV PATH /opt/conda/envs/aradeepopsis-dpp-v1.2.1/bin:$PATH +ENV PATH /opt/conda/envs/aradeepopsis-dpp-v1.3/bin:$PATH diff --git a/containers/addons/dpp/environment.yml b/containers/addons/dpp/environment.yml index 2022c67..71b1279 100644 --- a/containers/addons/dpp/environment.yml +++ b/containers/addons/dpp/environment.yml @@ -1,4 +1,4 @@ -name: aradeepopsis-dpp-v1.2.1 +name: aradeepopsis-dpp-v1.3 channels: - conda-forge - defaults diff --git a/containers/base/Dockerfile b/containers/base/Dockerfile index 30ae3d4..496ba4f 100644 --- a/containers/base/Dockerfile +++ b/containers/base/Dockerfile @@ -1,9 +1,8 @@ FROM continuumio/miniconda3 -MAINTAINER Patrick Hüther LABEL authors="patrick.huether@gmi.oeaw.ac.at" \ - description="Container image containing base dependencies for araDeepopsis" + description="Container image containing base dependencies for ARADEEPOPSIS" COPY environment.yml / RUN apt-get update && apt-get install -y procps graphviz && apt-get clean -y RUN conda env create -f /environment.yml && conda clean -afy -ENV PATH /opt/conda/envs/aradeepopsis-base-v1.2.1/bin:$PATH \ No newline at end of file +ENV PATH /opt/conda/envs/aradeepopsis-base-v1.3/bin:$PATH diff --git a/containers/base/environment.yml b/containers/base/environment.yml index 66414fa..ee0d468 100644 --- a/containers/base/environment.yml +++ b/containers/base/environment.yml @@ -1,9 +1,9 @@ -name: aradeepopsis-base-v1.2.1 +name: aradeepopsis-base-v1.3 channels: - conda-forge - defaults dependencies: - anaconda::tensorflow-base=2.0.0 - anaconda::tensorflow-estimator=2.0.0 - - conda-forge::scikit-image=0.17.2 - - conda-forge::imagemagick=7.0.10_23 + - conda-forge::scikit-image=0.18.1 + - conda-forge::imagemagick=7.0.10_28 diff --git a/containers/shiny/Dockerfile b/containers/shiny/Dockerfile index 2dbd0e1..d1e14fc 100644 --- a/containers/shiny/Dockerfile +++ b/containers/shiny/Dockerfile @@ -1,11 +1,10 @@ FROM continuumio/miniconda3 -MAINTAINER Patrick Hüther LABEL authors="patrick.huether@gmi.oeaw.ac.at" \ - description="Container image containing shiny dependencies for araDeepopsis" + description="Container image containing shiny dependencies for ARADEEPOPSIS" COPY environment.yml / RUN apt-get update && apt-get install -y procps graphviz && apt-get clean -y RUN conda env create -f /environment.yml && conda clean -afy -ENV PATH /opt/conda/envs/aradeepopsis-shiny-v1.2.1/bin:$PATH +ENV PATH /opt/conda/envs/aradeepopsis-shiny-v1.3/bin:$PATH EXPOSE 44333 \ No newline at end of file diff --git a/containers/shiny/environment.yml b/containers/shiny/environment.yml index ea30a9c..fc0e5fe 100644 --- a/containers/shiny/environment.yml +++ b/containers/shiny/environment.yml @@ -1,4 +1,4 @@ -name: aradeepopsis-shiny-v1.2.1 +name: aradeepopsis-shiny-v1.3 channels: - conda-forge - r @@ -7,8 +7,8 @@ dependencies: - conda-forge::r-tidyverse=1.3.0 - conda-forge::r-shiny=1.5.0 - conda-forge::r-shinythemes=1.1.2 - - conda-forge::r-shinycssloaders=0.3 - - conda-forge::r-slickr=0.4.9 + - conda-forge::r-shinycssloaders=1.0.0 + - conda-forge::r-slickr=0.5.0 - conda-forge::r-corrplot=0.84 - conda-forge::r-jpeg=0.1_8.1 - r::r-radarchart=0.3.1 diff --git a/docs/parameters.md b/docs/parameters.md index 8cdf697..037d425 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -132,6 +132,6 @@ Launch a [Shiny](https://shiny.rstudio.com/) app as the last step of the pipelin > R -e "shiny::runApp('app.R', port=44333)" > > # if using the container image -> {docker|podman} run -v $(pwd):/mnt/shiny -p 44333:44333 beckerlab/aradeepopsis-shiny:1.2.1 R -e "shiny::runApp('/mnt/shiny/app.R', port=44333, host='0.0.0.0')" +> {docker|podman} run -v $(pwd):/mnt/shiny -p 44333:44333 quay.io/beckerlab/aradeepopsis-shiny:1.3 R -e "shiny::runApp('/mnt/shiny/app.R', port=44333, host='0.0.0.0')" > ``` > The shiny app can then be opened in a browser by typing localhost:44333 in the address bar. It will terminate when the browser window is closed. diff --git a/lib/ParameterChecks.groovy b/lib/ParameterChecks.groovy index 1572646..2a26730 100644 --- a/lib/ParameterChecks.groovy +++ b/lib/ParameterChecks.groovy @@ -1,19 +1,19 @@ /* Copyright (C) 2019-2020 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ class ParameterChecks { diff --git a/main.nf b/main.nf index 3ac7211..18848c9 100644 --- a/main.nf +++ b/main.nf @@ -1,21 +1,21 @@ #!/usr/bin/env nextflow /* -Copyright (C) 2019-2020 Patrick Hüther +Copyright (C) 2019-2021 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ /* @@ -110,19 +110,19 @@ Pipeline parameters switch(params.model) { case 'A': - model = "https://zenodo.org/record/3946618/files/1_class_${params.multiscale ? 'multiscale' : 'singlescale'}.pb" + model = params.multiscale ? 'https://www.dropbox.com/s/19eeq3yog975otz/1_class_multiscale.pb?dl=1' : 'https://www.dropbox.com/s/ejpkgnvsv9p9s5d/1_class_singlescale.pb?dl=1' labels = "class_background=0,class_norm=1" ignore_label = "None" max_dimension = 602 break case 'B': - model = "https://zenodo.org/record/3946618/files/2_class_${params.multiscale ? 'multiscale' : 'singlescale'}.pb" + model = params.multiscale ? 'https://www.dropbox.com/s/9m4wy990ajv7cmg/2_class_multiscale.pb?dl=1' : 'https://www.dropbox.com/s/s808kcq9jgiyko9/2_class_singlescale.pb?dl=1' labels = "class_background=0,class_norm=1,class_senesc=2" ignore_label = params.ignore_senescence ? "2" : "None" max_dimension = 602 break case 'C': - model = "https://zenodo.org/record/3946618/files/3_class_${params.multiscale ? 'multiscale' : 'singlescale'}.pb" + model = params.multiscale ? 'https://www.dropbox.com/s/xwnqytcf6xzdumq/3_class_multiscale.pb?dl=1' : 'https://www.dropbox.com/s/1axmww7cqor6i7x/3_class_singlescale.pb?dl=1' labels = "class_background=0,class_norm=1,class_senesc=2,class_antho=3" ignore_label = params.ignore_senescence ? "2" : "None" max_dimension = 602 @@ -457,7 +457,7 @@ ch_results .set {ch_resultfile} process launch_shiny { - containerOptions { workflow.profile.contains('singularity') ? '' : '-p 44333:44333' } + containerOptions { workflow.profile.contains('singularity') || workflow.profile.contains('charliecloud') ? '' : '-p 44333:44333' } executor 'local' cache false @@ -487,4 +487,4 @@ workflow.onError { The current pipeline configuration requires at least ${params.multiscale ? '12GB' : '6GB'} of RAM. """.stripIndent() } -} \ No newline at end of file +} diff --git a/nextflow.config b/nextflow.config index b27056e..fb2b69e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,24 +1,24 @@ /* -Copyright (C) 2019-2020 Patrick Hüther +Copyright (C) 2019-2021 Patrick Hüther -This file is part of araDeepopsis. -araDeepopsis free software: you can redistribute it and/or modify +This file is part of ARADEEPOPSIS. +ARADEEPOPSIS 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. -araDeepopsis is distributed in the hope that it will be useful, +ARADEEPOPSIS 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 araDeepopsis. If not, see . +along with ARADEEPOPSIS. If not, see . */ /* * ------------------------------------------------- - * araDeepopsis Nextflow config file + * ARADEEPOPSIS Nextflow config file * ------------------------------------------------- * Default config options for all environments. */ @@ -67,19 +67,22 @@ profiles { docker { docker.enabled = true } podman { podman.enabled = true } singularity { singularity.enabled = true } + charliecloud { includeConfig 'conf/charliecloud.config' } conda { includeConfig 'conf/conda.config' } test { includeConfig 'conf/test.config' } // cluster specific profiles cbe { includeConfig 'conf/cbe.config' } + lrzcm2 { includeConfig 'conf/lrz.config' } } manifest { homePage = 'https://github.com/Gregor-Mendel-Institute/aradeepopsis' description = "Nextflow pipeline to run semantic segmentation on plant rosette images with DeepLab V3+" name = 'aradeepopsis' - version = '1.2.1' + version = '1.3' mainScript = 'main.nf' - nextflowVersion = '>=20.01.0' + nextflowVersion = '>=20.07.1' + doi = '10.1105/tpc.20.00318' } timeline {