├── .gitignore ├── BioQueue ├── __init__.py ├── settings-example.py ├── urls.py └── wsgi.py ├── LICENSE ├── QueueDB ├── __init__.py ├── admin.py ├── apps.py ├── extmodels │ ├── GoogleDrive.py │ └── __init__.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── tests.py └── views.py ├── README.md ├── _config.yml ├── accounts ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ └── __init__.py ├── models.py ├── templates │ └── accounts │ │ ├── login.html │ │ └── register.html ├── tests.py ├── urls.py └── views.py ├── config ├── bioqueue.conf ├── custom.conf └── file_support.conf ├── deploy ├── 000-default.conf.tpl ├── mysql.tpl ├── postgresql.tpl ├── prerequisites.txt ├── python_pip_non_root.sh ├── sqlite.tpl ├── status_code.md └── switch_from_MySQLdb_to_PyMySQL.py ├── init_resource.json ├── install.py ├── manage.py ├── protocol_dumps └── __init__.py ├── status_page.png ├── templates ├── admin │ └── login.html └── registration │ └── logged_out.html ├── ui ├── __init__.py ├── admin.py ├── apps.py ├── cron_jobs.py ├── cron_runner.py ├── ena.py ├── extmodels │ ├── GoogleDrive.py │ └── __init__.py ├── forms.py ├── maintenance_protocols │ ├── __init__.py │ ├── bam_index.py │ ├── bam_sort.py │ ├── compress.py │ ├── configure_make_install.py │ ├── decompress.py │ ├── download.py │ ├── fastqc.py │ ├── git.py │ ├── gunzip.py │ ├── make.py │ ├── svn.py │ ├── tarbz2.py │ ├── targz.py │ └── zip.py ├── plugins │ ├── __init__.py │ └── google_drive.py ├── static │ ├── admin │ │ ├── css │ │ │ ├── base.css │ │ │ ├── changelists.css │ │ │ ├── dashboard.css │ │ │ ├── fonts.css │ │ │ ├── forms.css │ │ │ ├── login.css │ │ │ ├── rtl.css │ │ │ └── widgets.css │ │ ├── fonts │ │ │ ├── LICENSE.txt │ │ │ ├── README.txt │ │ │ ├── Roboto-Bold-webfont.woff │ │ │ ├── Roboto-Light-webfont.woff │ │ │ └── Roboto-Regular-webfont.woff │ │ ├── img │ │ │ ├── LICENSE │ │ │ ├── README.txt │ │ │ ├── calendar-icons.svg │ │ │ ├── gis │ │ │ │ ├── move_vertex_off.svg │ │ │ │ └── move_vertex_on.svg │ │ │ ├── icon-addlink.svg │ │ │ ├── icon-alert.svg │ │ │ ├── icon-calendar.svg │ │ │ ├── icon-changelink.svg │ │ │ ├── icon-clock.svg │ │ │ ├── icon-deletelink.svg │ │ │ ├── icon-no.svg │ │ │ ├── icon-unknown-alt.svg │ │ │ ├── icon-unknown.svg │ │ │ ├── icon-yes.svg │ │ │ ├── inline-delete.svg │ │ │ ├── search.svg │ │ │ ├── selector-icons.svg │ │ │ ├── sorting-icons.svg │ │ │ ├── tooltag-add.svg │ │ │ └── tooltag-arrowright.svg │ │ └── js │ │ │ ├── SelectBox.js │ │ │ ├── SelectFilter2.js │ │ │ ├── actions.js │ │ │ ├── actions.min.js │ │ │ ├── admin │ │ │ ├── DateTimeShortcuts.js │ │ │ └── RelatedObjectLookups.js │ │ │ ├── calendar.js │ │ │ ├── cancel.js │ │ │ ├── change_form.js │ │ │ ├── collapse.js │ │ │ ├── collapse.min.js │ │ │ ├── core.js │ │ │ ├── inlines.js │ │ │ ├── inlines.min.js │ │ │ ├── jquery.init.js │ │ │ ├── popup_response.js │ │ │ ├── prepopulate.js │ │ │ ├── prepopulate.min.js │ │ │ ├── prepopulate_init.js │ │ │ ├── timeparse.js │ │ │ ├── urlify.js │ │ │ └── vendor │ │ │ ├── jquery │ │ │ ├── LICENSE-JQUERY.txt │ │ │ ├── jquery.js │ │ │ └── jquery.min.js │ │ │ └── xregexp │ │ │ ├── LICENSE-XREGEXP.txt │ │ │ ├── xregexp.js │ │ │ └── xregexp.min.js │ └── ui │ │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.css.map │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-grid.min.css.map │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.css.map │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap-reboot.min.css.map │ │ ├── bootstrap-select.css.map │ │ ├── bootstrap-select.min.css │ │ ├── bootstrap.min.css │ │ ├── bootstrap.min.css.map │ │ ├── index.html │ │ └── site.css │ │ ├── fontawesome │ │ ├── LICENSE.txt │ │ ├── css │ │ │ ├── all.min.css │ │ │ ├── brands.min.css │ │ │ ├── fontawesome.min.css │ │ │ ├── regular.min.css │ │ │ ├── solid.min.css │ │ │ ├── svg-with-js.min.css │ │ │ └── v4-shims.min.css │ │ └── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.svg │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.svg │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.svg │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ │ ├── img │ │ ├── index.html │ │ ├── logo.png │ │ ├── logoc.png │ │ └── mls │ │ │ └── index.html │ │ ├── index.html │ │ └── js │ │ ├── auto.micro.js │ │ ├── bootstrap-select.min.js │ │ ├── bootstrap-select.min.js.map │ │ ├── bootstrap.bundle.js │ │ ├── bootstrap.bundle.js.map │ │ ├── bootstrap.bundle.min.js │ │ ├── bootstrap.bundle.min.js.map │ │ ├── index.html │ │ ├── job-complete.min.js │ │ ├── jquery-3.6.0.min.js │ │ ├── jquery.cookie.js │ │ └── site.js ├── templates │ └── ui │ │ ├── 403.html │ │ ├── add_job.html │ │ ├── add_protocol.html │ │ ├── add_step.html │ │ ├── archive_table.html │ │ ├── base.html │ │ ├── create_simple_models.html │ │ ├── error.html │ │ ├── fetch_data.html │ │ ├── fetch_learning.html │ │ ├── foot.html │ │ ├── get_learning_result.html │ │ ├── import_protocol.html │ │ ├── index.html │ │ ├── install_ref.html │ │ ├── install_tool.html │ │ ├── list_protocol.html │ │ ├── manage_reference.html │ │ ├── navigation.html │ │ ├── query_job.html │ │ ├── register_sample.html │ │ ├── registered_sample_cards.html │ │ ├── settings.html │ │ ├── show_environment.html │ │ ├── show_job_folder.html │ │ ├── show_learning.html │ │ ├── show_learning_steps.html │ │ ├── show_reference.html │ │ ├── show_samples.html │ │ ├── show_steps.html │ │ ├── show_uploads.html │ │ ├── show_workspace.html │ │ ├── single.html │ │ ├── step_atom.html │ │ ├── tar_files.html │ │ ├── update_simple_models.html │ │ └── variant_hint.html ├── templatetags │ ├── __init__.py │ └── job_tags.py ├── tests.py ├── tools.py ├── urls.py ├── views.py └── views │ ├── Job.py │ ├── Misc.py │ ├── Plugins.py │ ├── Protocol.py │ ├── References.py │ ├── Samples.py │ ├── Shield.py │ └── __init__.py ├── version └── worker ├── __init__.py ├── _step.py ├── bases.py ├── bioqueue.py ├── cluster_models ├── HTCondor.py ├── HTCondor.tpl ├── LSF.py ├── LSF.tpl ├── TorquePBS.py ├── TorquePBS.tpl ├── __init__.py └── cluster_model.py ├── cluster_support.py ├── compile_tool.py ├── django_initial.py ├── feedback.py ├── integrityTools.py ├── maintenance_models ├── __init__.py └── make.py ├── ml_collector.py └── ml_container.py /.gitignore: -------------------------------------------------------------------------------- 1 | .project 2 | *.log 3 | *.lock 4 | .pydevproject 5 | *.pyc 6 | workspace/* 7 | /.idea/* 8 | worker/.idea/* 9 | BioQueue/settings.py 10 | deploy/000-default.conf 11 | deploy/prerequisites.txt 12 | worker/config.conf 13 | 14 | config/custom.conf 15 | -------------------------------------------------------------------------------- /BioQueue/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/BioQueue/__init__.py -------------------------------------------------------------------------------- /BioQueue/settings-example.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for BioQueue project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.2/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = '{SECRET_KEY}' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = ['*', ] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'QueueDB', 41 | 'accounts', 42 | 'ui', 43 | 'worker', 44 | #'django_ftpserver', 45 | ] 46 | 47 | MIDDLEWARE = [ 48 | 'django.middleware.security.SecurityMiddleware', 49 | 'django.contrib.sessions.middleware.SessionMiddleware', 50 | 'django.middleware.common.CommonMiddleware', 51 | 'django.middleware.csrf.CsrfViewMiddleware', 52 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 53 | 'django.contrib.messages.middleware.MessageMiddleware', 54 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 55 | ] 56 | 57 | ROOT_URLCONF = 'BioQueue.urls' 58 | 59 | TEMPLATES = [ 60 | { 61 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 62 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 63 | 'APP_DIRS': True, 64 | 'OPTIONS': { 65 | 'context_processors': [ 66 | 'django.template.context_processors.debug', 67 | 'django.template.context_processors.request', 68 | 'django.contrib.auth.context_processors.auth', 69 | 'django.contrib.messages.context_processors.messages', 70 | ], 71 | }, 72 | }, 73 | ] 74 | 75 | WSGI_APPLICATION = 'BioQueue.wsgi.application' 76 | 77 | 78 | # Database 79 | # https://docs.djangoproject.com/en/2.2/ref/settings/#databases 80 | 81 | DATABASES = { 82 | {DATABASE_BACKEND} 83 | } 84 | 85 | 86 | # Password validation 87 | # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 88 | 89 | AUTH_PASSWORD_VALIDATORS = [ 90 | { 91 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 92 | }, 93 | { 94 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 95 | }, 96 | { 97 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 98 | }, 99 | { 100 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 101 | }, 102 | ] 103 | 104 | 105 | # Internationalization 106 | # https://docs.djangoproject.com/en/2.2/topics/i18n/ 107 | 108 | LANGUAGE_CODE = 'en-us' 109 | 110 | TIME_ZONE = 'UTC' 111 | 112 | USE_I18N = True 113 | 114 | USE_L10N = True 115 | 116 | USE_TZ = True 117 | 118 | 119 | # Static files (CSS, JavaScript, Images) 120 | # https://docs.djangoproject.com/en/2.2/howto/static-files/ 121 | 122 | STATIC_URL = '/static/' 123 | -------------------------------------------------------------------------------- /BioQueue/urls.py: -------------------------------------------------------------------------------- 1 | """BioQueue URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.2/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include 18 | from ui.views import index 19 | 20 | urlpatterns = [ 21 | path('', index), 22 | path('admin/', admin.site.urls), 23 | path('accounts/', include('accounts.urls')), 24 | path('ui/', include('ui.urls')), 25 | ] 26 | -------------------------------------------------------------------------------- /BioQueue/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for BioQueue project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'BioQueue.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /QueueDB/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/QueueDB/__init__.py -------------------------------------------------------------------------------- /QueueDB/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /QueueDB/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class QueuedbConfig(AppConfig): 5 | default_auto_field = 'django.db.models.AutoField' 6 | name = 'QueueDB' 7 | -------------------------------------------------------------------------------- /QueueDB/extmodels/GoogleDrive.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author: Li Yao 4 | # @Date: 12/29/20 5 | # 6 | # BioQueue is free for personal use and is licensed under 7 | # the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, 9 | # or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | 15 | from django.db import models 16 | from QueueDB.models import _OwnerModel 17 | 18 | 19 | class GoogleDriveConnection(_OwnerModel): 20 | credential_pickle = models.CharField(max_length=255) 21 | folder_id = models.CharField(max_length=255) 22 | -------------------------------------------------------------------------------- /QueueDB/extmodels/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | # Created by: Li Yao (yaoli.gm@gmail.com) 4 | # Created on: 12/27/20 5 | # from .RunOnQC import * 6 | -------------------------------------------------------------------------------- /QueueDB/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/QueueDB/migrations/__init__.py -------------------------------------------------------------------------------- /QueueDB/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /QueueDB/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BioQueue 2 | [](https://bioqueue.readthedocs.io/en/latest/?badge=latest) 3 | 4 | BioQueue is a researcher-facing bioinformatic platform preferentially to improve the efficiency and robustness of analysis in bioinformatics research by estimating the system resources required by a particular job. At the same time, BioQueue also aims to promote the accessibility and reproducibility of data analysis in biomedical research. Implemented by Python **3.x**, BioQueue can work in both POSIX compatible systems (Linux, Solaris, OS X, etc.) and Windows. 5 | ## Get started 6 | 7 | `pip` is the default package manager for BioQueue, so before installing BioQueue, please make sure that you have [pip](https://pip.pypa.io/en/stable/) installed. 8 | 9 | ### Prerequisites 10 | 11 | BioQueue can store data on SQLite, which means users can set up BioQueue without an extra database software. However, to achieve a higher performance, **we suggest users to install MySQL or PostgreSQL**. If you want to set up MySQL or PostgreSQL on your machine, you can visit the wiki page. 12 | ### 1. Download and setup the BioQueue project 13 | 14 | First of all, you will need to clone the project from Github (Or you can download BioQueue by open [this link](https://github.com/liyao001/BioQueue/zipball/master)). 15 | ``` 16 | git clone https://github.com/liyao001/BioQueue.git 17 | Or 18 | wget https://github.com/liyao001/BioQueue/zipball/master 19 | ``` 20 | Then navigate to the project's directory, and run `install.py` script (All dependent python packages will be automatically installed): 21 | ``` 22 | cd BioQueue 23 | python install.py 24 | ``` 25 | When running `install.py`, this script will ask you a few questions include: 26 | 1. CPU cores: The amount of CPU to use. Default value: all cores on that machine. 27 | 2. Memory (Gb): The amount of memory to use. Default value: all physical memory on that machine. 28 | 3. Disk quota for each user(Gb, default value: all disk space on that machine). 29 | 30 | If you decide to run BioQueue with MySQL or PostgreSQL, the script will ask a few more questions: 31 | 1. Database host: If you install MySQL server on your own machine, enter `localhost` or `127.0.0.1`. 32 | 2. Database user: user name of the database. 33 | 3. Database password: password of the database. 34 | 4. Database name: Name of the data table. 35 | 5. Database port: `3306` by default for MySQL 36 | 37 | Then the script will interact with you and create a super user account for the platform. 38 | 39 | ### 2. Start the queue 40 | 41 | Run the `bioqueue.py` script in the `BioQueue/worker` folder 42 | ``` 43 | python worker/bioqueue.py 44 | ``` 45 | 46 | ### 3. Start webserver 47 | 48 | ``` 49 | python manage.py runserver 0.0.0.0:8000 50 | ``` 51 | This will start up the server on `0.0.0.0` and port `8000`, so BioQueue can be accessed over the network. If you want access BioQueue only in local environment, remove `0.0.0.0:8000`. 52 | 53 | ## Useful information 54 | 55 | * To stop the queue, the webserver or the ftp server, just hit `Ctrl-c` in the terminal from which BioQueue is running. 56 | * To get a better performance, moving the webserver to [Apache](http://bioqueue.readthedocs.io/en/latest/faq.html#use-bioqueue-with-apache-in-production-environment) or [nginx](https://nginx.org) is a good idea. 57 | 58 | ## Screenshot 59 | 60 |  61 | 62 | ## Citation 63 | 64 | 1. Yao, L., Wang, H., Song, Y. & Sui, G. BioQueue: a novel pipeline framework to accelerate bioinformatics analysis. *Bioinformatics* 33, 3286–3288 (2017). [doi:10.1093/bioinformatics/btx403](https://doi.org/doi:10.1093/bioinformatics/btx403) -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /accounts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/accounts/__init__.py -------------------------------------------------------------------------------- /accounts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /accounts/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class AccountsConfig(AppConfig): 7 | name = 'accounts' 8 | -------------------------------------------------------------------------------- /accounts/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.models import User 3 | 4 | 5 | class LoginForm(forms.Form): 6 | username = forms.CharField( 7 | required=True, 8 | label=False, 9 | error_messages={"required": "Please type username"}, 10 | widget=forms.TextInput( 11 | attrs={ 12 | "placeholder": "Username / Project name", 13 | "class": "form-control", 14 | } 15 | ), 16 | ) 17 | password = forms.CharField( 18 | required=True, 19 | label=False, 20 | error_messages={"required": "Please type your password"}, 21 | widget=forms.PasswordInput( 22 | attrs={ 23 | "placeholder": "Password", 24 | "class": "form-control", 25 | } 26 | ) 27 | ) 28 | 29 | 30 | class PasswordChangeForm(forms.Form): 31 | old_password = forms.CharField( 32 | required=True, 33 | label="Raw Password", 34 | error_messages={"required": "Please type your raw password"}, 35 | widget=forms.PasswordInput( 36 | attrs={ 37 | "placeholder": "Raw password", 38 | } 39 | ) 40 | ) 41 | new_password_1 = forms.CharField( 42 | required=True, 43 | label="New Password", 44 | error_messages={"required": "Please type your new password"}, 45 | widget=forms.PasswordInput( 46 | attrs={ 47 | "placeholder": "New password", 48 | } 49 | ) 50 | ) 51 | new_password_2 = forms.CharField( 52 | required=True, 53 | label="Confirm Password", 54 | error_messages={"required": "Please confirm new password"}, 55 | widget=forms.PasswordInput( 56 | attrs={ 57 | "placeholder": "Confirm new password", 58 | } 59 | ) 60 | ) 61 | 62 | 63 | class UserRegisterForm(forms.ModelForm): 64 | password = forms.CharField( 65 | required=True, 66 | label=False, 67 | widget=forms.PasswordInput( 68 | attrs={ 69 | "class": "form-control", 70 | "placeholder": "Password", 71 | } 72 | ) 73 | ) 74 | password_2 = forms.CharField( 75 | required=True, 76 | label=False, 77 | widget=forms.PasswordInput( 78 | attrs={ 79 | "class": 'form-control', 80 | "placeholder": "Confirm password", 81 | } 82 | ) 83 | ) 84 | 85 | class Meta: 86 | model = User 87 | fields = ("username", "first_name", "last_name", "email") 88 | widgets = { 89 | "username": forms.TextInput(attrs={"class": "form-control", "placeholder": "Username / Project name"}), 90 | "first_name": forms.TextInput(attrs={"class": "form-control", "placeholder": "First name"}), 91 | "last_name": forms.TextInput(attrs={"class": "form-control", "placeholder": "Last name"}), 92 | "email": forms.EmailInput(attrs={"class": "form-control", "placeholder": "E-mail"}), 93 | } 94 | labels = { 95 | "username": False, 96 | "first_name": False, 97 | "last_name": False, 98 | "email": False, 99 | } 100 | help_texts = { 101 | "username": False, 102 | "first_name": False, 103 | "last_name": False, 104 | } 105 | 106 | def clean_password2(self): 107 | cd = self.cleaned_data 108 | if cd["password"] != cd["password_2"]: 109 | raise forms.ValidationError('Password doesn\'t match.') 110 | return cd["password_2"] 111 | -------------------------------------------------------------------------------- /accounts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/accounts/migrations/__init__.py -------------------------------------------------------------------------------- /accounts/models.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.db import models 4 | 5 | # Create your models here. 6 | -------------------------------------------------------------------------------- /accounts/templates/accounts/login.html: -------------------------------------------------------------------------------- 1 | {% extends "ui/single.html" %} 2 | {% block title %}Sign In | BioQueue{% endblock %} 3 | {% block content %} 4 |
{% trans "Thanks for spending some quality time with the Web site today." %}
9 | 10 | 11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /ui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/ui/__init__.py -------------------------------------------------------------------------------- /ui/admin.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author: Li Yao 4 | # @Date: 12/01/16 5 | from django.contrib import admin 6 | from QueueDB.models import Job, Training, Prediction, Step, ProtocolList, VirtualEnvironment, Experiment, \ 7 | Audition, Sample, Profile, FileArchive, Reference, Workspace #, GoogleDriveConnection 8 | 9 | ''' 10 | class QueueInline(admin.StackedInline): 11 | model = ProtocolList 12 | ''' 13 | 14 | 15 | class QueueAdmin(admin.ModelAdmin): 16 | # inlines = [QueueInline] 17 | list_display = ('id', 'job_name', 'protocol', 'status', 'result', 'create_time') 18 | search_fields = ('result', 'job_name',) 19 | 20 | 21 | class TrainingAdmin(admin.ModelAdmin): 22 | list_display = ('id', 'step_name', 'input', 'output', 'mem_in_gb', 'vrt_mem_in_gb', 'cpu', 'create_time') 23 | 24 | 25 | class PredictionAdmin(admin.ModelAdmin): 26 | list_display = ('id', 'step_name', 'step_hash', 'a', 'b', 'r', 'type') 27 | 28 | 29 | class ResourceAdmin(admin.ModelAdmin): 30 | list_display = ('cpu', 'mem', 'disk', 'lock') 31 | 32 | 33 | class ProtocolAdmin(admin.ModelAdmin): 34 | list_display = ('software', 'parameter', 'specify_output', 'parent') 35 | 36 | 37 | class ProtocolListAdmin(admin.ModelAdmin): 38 | list_display = ('name', 'user_id') 39 | 40 | 41 | class FileArchiveAdmin(admin.ModelAdmin): 42 | list_display = ('protocol', 'protocol_ver', 'create_time', 'shared_with') 43 | 44 | 45 | class ReferenceAdmin(admin.ModelAdmin): 46 | list_display = ('name', 'user_id') 47 | 48 | 49 | class AuditionAdmin(admin.ModelAdmin): 50 | list_display = ('id', 'operation', 'job_name', 'create_time') 51 | readonly_fields = ['id', 'operation', 'related_job', 'job_name', 'prev_par', 52 | 'new_par', 'prev_input', 'current_input', 'protocol', 53 | 'protocol_ver', 'resume_point', 'create_time', 'user'] 54 | 55 | 56 | admin.site.register(Job, QueueAdmin) 57 | admin.site.register(Prediction, PredictionAdmin) 58 | admin.site.register(Training, TrainingAdmin) 59 | admin.site.register(ProtocolList, ProtocolListAdmin) 60 | admin.site.register(Step, ProtocolAdmin) 61 | admin.site.register(VirtualEnvironment) 62 | admin.site.register(Experiment) 63 | admin.site.register(Sample) 64 | admin.site.register(Profile) 65 | admin.site.register(FileArchive, FileArchiveAdmin) 66 | admin.site.register(Reference, ReferenceAdmin) 67 | admin.site.register(Workspace) 68 | # admin.site.register(GoogleDriveConnection) 69 | admin.site.register(Audition, AuditionAdmin) 70 | -------------------------------------------------------------------------------- /ui/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class UiConfig(AppConfig): 7 | name = 'ui' 8 | -------------------------------------------------------------------------------- /ui/cron_runner.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | # @Author: Li Yao 4 | # @Date: 01/28/20 5 | import time 6 | import threading 7 | import logging 8 | import os 9 | import sys 10 | from django.core.wsgi import get_wsgi_application 11 | 12 | sys.path.append(os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]) 13 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BioQueue.settings") 14 | 15 | application = get_wsgi_application() 16 | from ui.cron_jobs import archive_job_manager, audit_job_manager, audit_archiving_file_manager 17 | 18 | DEFAULT_PREFIX = str(os.getpid()) 19 | logging.basicConfig(format='%(name)s - %(asctime)s - %(levelname)s: %(message)s', 20 | datefmt='%d-%b-%y %H:%M:%S', 21 | level=logging.INFO, 22 | handlers=[ 23 | logging.FileHandler(os.path.join(os.getcwd(), 'cron_%s.log' % DEFAULT_PREFIX)), 24 | logging.StreamHandler() 25 | ]) 26 | logger = logging.getLogger("BioQueue - Cron") 27 | 28 | 29 | def aj_cron(logger): 30 | while True: 31 | logger.info("Cron - File archive") 32 | archive_job_manager(logger) 33 | logger.info("Cron - Done - File archive") 34 | time.sleep(300) 35 | 36 | 37 | def pv_cron(logger): 38 | while True: 39 | logger.info("Cron - Job audit") 40 | audit_job_manager(logger) 41 | logger.info("Cron - Done - Job audit") 42 | time.sleep(3000) 43 | 44 | 45 | def af_cron(logger): 46 | while True: 47 | logger.info("Cron - Archived file audit") 48 | audit_archiving_file_manager(logger) 49 | logger.info("Cron - Done - Archived file audit") 50 | time.sleep(3000) 51 | 52 | 53 | def init_cron(function, args): 54 | t = threading.Thread(target=function, args=args) 55 | t.setDaemon(True) 56 | t.start() 57 | 58 | 59 | if __name__ == "__main__": 60 | init_cron(aj_cron, (logger, )) 61 | init_cron(pv_cron, (logger, )) 62 | init_cron(af_cron, (logger, )) 63 | 64 | while True: 65 | time.sleep(30) 66 | -------------------------------------------------------------------------------- /ui/ena.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | # @Author: Li Yao 4 | # @Date: 05/01/20 5 | import requests 6 | import json 7 | 8 | 9 | def get_download_link(acc, field="fastq_ftp"): 10 | """ 11 | Get download link from EBI ENA 12 | :param acc: str 13 | :param field: str 14 | :return: 15 | """ 16 | links = list() 17 | # https://www.ebi.ac.uk/ena/submit/read-data-format 18 | if acc[2] == "A": 19 | keyword = "submission_accession" 20 | elif acc[2] == "S": 21 | keyword = "sample_accession" 22 | elif acc[2] == "P": 23 | keyword = "study_accession" 24 | elif acc[2] == "X": 25 | keyword = "experiment_accession" 26 | elif acc[2] == "R": 27 | keyword = "run_accession" 28 | else: 29 | print("Unsupported accession type %s" % acc) 30 | return [] 31 | api_bus = 'https://www.ebi.ac.uk/ena/portal/api/search?result=read_run&query="%s=%s"&fields=%s&format=json' % (keyword, acc, field) 32 | # res_data = urlopen(api_bus) 33 | # ret = res_data.read() 34 | try: 35 | response = requests.get(api_bus) 36 | if response.ok: 37 | res = response.json() 38 | for run in res: 39 | links.extend(run[field].split(";")) 40 | return links 41 | else: 42 | return [] 43 | except: 44 | return [] 45 | 46 | 47 | def get_accession(query): 48 | """ 49 | Get accession ID from EBI Search 50 | :param query: 51 | :return: 52 | """ 53 | api_bus = "http://www.ebi.ac.uk/ebisearch/ws/rest/nucleotideSequences?query=%s&fieldurl=true&viewurl=true&format=json" % query 54 | sra_list = list() 55 | try: 56 | response = requests.get(api_bus) 57 | if response.ok: 58 | res = response.json() 59 | else: 60 | return 0 61 | if res["hitCount"] == 0: 62 | return 0 63 | for entry in res["entries"]: 64 | sra_list.append(entry["id"]) 65 | return sra_list 66 | except Exception as e: 67 | print(e) 68 | return 0 69 | 70 | 71 | def query_download_link_from_ebi(query): 72 | """ 73 | Query download link from ebi 74 | :param query: str 75 | :return: list 76 | """ 77 | all_links = list() 78 | fl = get_accession(query) 79 | if type(fl) != int: 80 | for r in fl: 81 | tmp = get_download_link(r) 82 | if len(tmp) > 0: 83 | all_links.extend(tmp) 84 | ret_links = ["ftp://"+link for link in all_links] 85 | return sorted(list(set(ret_links))) 86 | else: 87 | return [] 88 | 89 | 90 | # if __name__ == "__main__": 91 | # print(query_download_link_from_ebi("GSM3318211")) 92 | -------------------------------------------------------------------------------- /ui/extmodels/GoogleDrive.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author: Li Yao 4 | # @Date: 12/29/20 5 | # 6 | # BioQueue is free for personal use and is licensed under 7 | # the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, 9 | # or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | 15 | from django.db import models 16 | from django.contrib.auth.models import User 17 | 18 | 19 | class GoogleDriveConnection(models.Model): 20 | user = models.ForeignKey(User, on_delete=models.PROTECT) 21 | credential_pickle = models.CharField(max_length=255) 22 | folder_id = models.CharField(max_length=255) 23 | -------------------------------------------------------------------------------- /ui/extmodels/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | # Created by: Li Yao (yaoli.gm@gmail.com) 4 | # Created on: 12/27/20 5 | from .RunOnQC import * 6 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/ui/maintenance_protocols/__init__.py -------------------------------------------------------------------------------- /ui/maintenance_protocols/bam_index.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 14/01/2018 01:04 AM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : bam_index.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='samtools', 12 | parameter='index {{InputFile}}.sorted.bam', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='030fdbd05e08e64d7b5df6db763a3687', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/bam_sort.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 14/01/2018 01:04 AM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : bam_sort.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='samtools', 12 | parameter='sort -@ {{ThreadN}} -o sorted.bam {{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='1c676531136f2dbd035894eb8a36e2e1', 16 | step_order=step_order_start)) 17 | steps.append(db_obj(software='samtools', 18 | parameter='index sorted.bam', 19 | parent=protocol_parent, 20 | user_id=0, 21 | hash='cb09b58adf333beb914e95e3a271fac3', 22 | step_order=step_order_start + 1)) 23 | return step_order_start+len(steps), steps 24 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/compress.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 14/01/2018 01:04 AM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : gunzip.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='gzip', 12 | parameter='{{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='fe5d52008fdd08800b24354df032b07c', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/configure_make_install.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 29/12/2017 10:05 AM 4 | # @Project : main 5 | # @Author : Li Yao 6 | # @File : configure_make_install.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='./configure', 12 | parameter='--prefix {{UserBin}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='dfca5277f71c6782e3351f6ed9ac7fcb', 16 | step_order=step_order_start)) 17 | steps.append(db_obj(software='make', 18 | parameter='', 19 | parent=protocol_parent, 20 | user_id=0, 21 | hash='099dafc678df7d266c25f95ccf6cde22', 22 | step_order=step_order_start+1)) 23 | steps.append(db_obj(software='make', 24 | parameter='install', 25 | parent=protocol_parent, 26 | user_id=0, 27 | hash='12b64827119f4815ca8d43608d228f36', 28 | step_order=step_order_start+2)) 29 | return step_order_start+len(steps), steps -------------------------------------------------------------------------------- /ui/maintenance_protocols/decompress.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 14/01/2018 01:04 AM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : gunzip.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='gunzip', 12 | parameter='{{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='541df26aff8e4d054a57c7e3717e91ca', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/download.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 02/12/2017 8:47 PM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : download.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='wget', 12 | parameter='{{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='3efb64d0fa1144993ee287d3233dde06', 16 | step_order=step_order_start, 17 | force_local=1)) 18 | return step_order_start+len(steps), steps 19 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/fastqc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 19/08/2018 03:04 PM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : fastqc.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='fastqc', 12 | parameter='-o {{Workspace}} {{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=protocol_parent.user_id, 15 | hash='3a24f9a8e2f78d22e6e310d2694c08c2', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/git.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 02/12/2017 8:56 PM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : git.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='git', 12 | parameter='clone {{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='f95d6d36a0d0cae61a03704b46f72892', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/gunzip.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 14/01/2018 01:04 AM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : gunzip.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='gunzip', 12 | parameter='{{LastOutput}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='0603ff9d39724ecd6d62be4618901b54', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/make.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 02/12/2017 11:59 PM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : zip.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='make', 12 | parameter='', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='099dafc678df7d266c25f95ccf6cde22', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/svn.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 02/12/2017 8:57 PM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : svn.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='svn', 12 | parameter='checkout {{InputFile}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='c025d53644388a50fb3704b4a81d5a93', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/maintenance_protocols/tarbz2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 04/12/2017 1:39 PM 4 | # @Project : main 5 | # @Author : Li Yao 6 | # @File : tarbz2.py 7 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 8 | steps = list() 9 | steps.append(db_obj(software='tar', 10 | parameter='-jxvf {{LastOutput}}', 11 | parent=protocol_parent, 12 | user_id=0, 13 | hash='670fb21245414e6d79b43dbd59ae1fb9', 14 | step_order=step_order_start)) 15 | return step_order_start+len(steps), steps -------------------------------------------------------------------------------- /ui/maintenance_protocols/targz.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 04/12/2017 1:39 PM 4 | # @Project : main 5 | # @Author : Li Yao 6 | # @File : targz.py 7 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 8 | steps = list() 9 | steps.append(db_obj(software='tar', 10 | parameter='-zxvf {{LastOutput}}', 11 | parent=protocol_parent, 12 | user_id=0, 13 | hash='ea8e630bc7eccdbe04343351fb6ba886', 14 | step_order=step_order_start)) 15 | return step_order_start+len(steps), steps -------------------------------------------------------------------------------- /ui/maintenance_protocols/zip.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 02/12/2017 11:40 PM 4 | # @Project : BioQueue 5 | # @Author : Li Yao 6 | # @File : zip.py 7 | 8 | 9 | def get_sub_protocol(db_obj, protocol_parent, step_order_start=1): 10 | steps = list() 11 | steps.append(db_obj(software='unzip', 12 | parameter='{{LastOutput}}', 13 | parent=protocol_parent, 14 | user_id=0, 15 | hash='728ab46516121c0215887cd60bcbb8bd', 16 | step_order=step_order_start)) 17 | return step_order_start+len(steps), steps 18 | -------------------------------------------------------------------------------- /ui/plugins/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | # Created by: Li Yao 4 | # Created on: 1/28/20 -------------------------------------------------------------------------------- /ui/plugins/google_drive.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | # Created by: Li Yao 4 | # Created on: 1/28/20 5 | import pickle 6 | import os 7 | from googleapiclient.discovery import build 8 | from google_auth_oauthlib.flow import InstalledAppFlow 9 | from google.auth.transport.requests import Request 10 | from googleapiclient.http import MediaFileUpload 11 | 12 | 13 | class GoogleDrive(object): 14 | SCOPES = ['https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive.metadata.readonly'] 15 | 16 | def __init__(self, token_file="token.pickle", app_credential="client_secret.json"): 17 | creds = None 18 | # The file token.pickle stores the user's access and refresh tokens, and is 19 | # created automatically when the authorization flow completes for the first 20 | # time. 21 | if os.path.exists(token_file): 22 | with open(token_file, 'rb') as token: 23 | creds = pickle.load(token) 24 | # If there are no (valid) credentials available, let the user log in. 25 | if not creds or not creds.valid: 26 | if creds and creds.expired and creds.refresh_token: 27 | creds.refresh(Request()) 28 | else: 29 | flow = InstalledAppFlow.from_client_secrets_file( 30 | app_credential, self.SCOPES) 31 | creds = flow.run_local_server(port=0) 32 | # Save the credentials for the next run 33 | with open(token_file, 'wb') as token: 34 | pickle.dump(creds, token) 35 | self.service = build('drive', 'v3', credentials=creds) 36 | 37 | def create_folder(self, folder_name): 38 | file_metadata = { 39 | 'name': folder_name, 40 | 'mimeType': 'application/vnd.google-apps.folder', 41 | } 42 | file = self.service.files().create(body=file_metadata, fields='id').execute() 43 | folder_id = file.get('id') 44 | return folder_id 45 | 46 | def already_folder(self, folder_name): 47 | results = self.service.files().list( 48 | q="mimeType='application/vnd.google-apps.folder' and name='" + folder_name + "'", 49 | fields="nextPageToken, files(id, name)").execute() 50 | items = results.get('files', []) 51 | if items: 52 | return True, items[-1]['id'] 53 | else: 54 | return False, "" 55 | 56 | def upload_file(self, file_name, file_path, folder_id, description='', mimetype='application/x-compressed'): 57 | file_metadata = { 58 | 'name': file_name, 59 | 'parents': [folder_id], 60 | 'description': description, 61 | 62 | } 63 | media = MediaFileUpload(file_path, 64 | mimetype=mimetype, 65 | resumable=True) 66 | file = self.service.files().create(body=file_metadata, 67 | media_body=media, 68 | fields='id').execute() 69 | file_id = file.get('id') 70 | return file_id 71 | 72 | def update_file(self, file_id, new_file, new_mimetype='application/x-compressed'): 73 | try: 74 | file = self.service.files().get(fileId=file_id).execute() 75 | file['mimeType'] = new_mimetype 76 | 77 | media_body = MediaFileUpload(new_file, mimetype=new_mimetype, resumable=True) 78 | updated_file = self.service.files().update( 79 | fileId=file_id, 80 | body=file, 81 | new_revision=True, 82 | media_body=media_body 83 | ).execute() 84 | return updated_file.get('id') 85 | except Exception as e: 86 | print(e) 87 | return None 88 | 89 | def share_with_person(self, file_id, share_with, msg='', permission='reader'): 90 | def callback(request_id, response, exception): 91 | if exception: 92 | # Handle error 93 | print(exception) 94 | else: 95 | print("Permission Id: %s" % response.get('id')) 96 | 97 | batch = self.service.new_batch_http_request(callback=callback) 98 | for user in share_with: 99 | user_permission = { 100 | 'type': 'user', 101 | 'role': permission, 102 | 'emailAddress': user 103 | } 104 | batch.add(self.service.permissions().create( 105 | fileId=file_id, 106 | body=user_permission, 107 | fields='id', 108 | emailMessage=msg, 109 | )) 110 | res = batch.execute() 111 | return res.get('id') 112 | -------------------------------------------------------------------------------- /ui/static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | } 25 | 26 | ul.actionlist li { 27 | overflow: hidden; 28 | text-overflow: ellipsis; 29 | -o-text-overflow: ellipsis; 30 | } 31 | -------------------------------------------------------------------------------- /ui/static/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /ui/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #f8f8f8; 5 | } 6 | 7 | .login #header { 8 | height: auto; 9 | padding: 5px 16px; 10 | } 11 | 12 | .login #header h1 { 13 | font-size: 18px; 14 | } 15 | 16 | .login #header h1 a { 17 | color: #fff; 18 | } 19 | 20 | .login #content { 21 | padding: 20px 20px 0; 22 | } 23 | 24 | .login #container { 25 | background: #fff; 26 | border: 1px solid #eaeaea; 27 | border-radius: 4px; 28 | overflow: hidden; 29 | width: 28em; 30 | min-width: 300px; 31 | margin: 100px auto; 32 | } 33 | 34 | .login #content-main { 35 | width: 100%; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | float: left; 41 | width: 100%; 42 | border-bottom: none; 43 | } 44 | 45 | .login .form-row label { 46 | padding-right: 0.5em; 47 | line-height: 2em; 48 | font-size: 1em; 49 | clear: both; 50 | color: #333; 51 | } 52 | 53 | .login .form-row #id_username, .login .form-row #id_password { 54 | clear: both; 55 | padding: 8px; 56 | width: 100%; 57 | -webkit-box-sizing: border-box; 58 | -moz-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | 62 | .login span.help { 63 | font-size: 10px; 64 | display: block; 65 | } 66 | 67 | .login .submit-row { 68 | clear: both; 69 | padding: 1em 0 0 9.4em; 70 | margin: 0; 71 | border: none; 72 | background: none; 73 | text-align: left; 74 | } 75 | 76 | .login .password-reset-link { 77 | text-align: center; 78 | } 79 | -------------------------------------------------------------------------------- /ui/static/admin/css/rtl.css: -------------------------------------------------------------------------------- 1 | body { 2 | direction: rtl; 3 | } 4 | 5 | /* LOGIN */ 6 | 7 | .login .form-row { 8 | float: right; 9 | } 10 | 11 | .login .form-row label { 12 | float: right; 13 | padding-left: 0.5em; 14 | padding-right: 0; 15 | text-align: left; 16 | } 17 | 18 | .login .submit-row { 19 | clear: both; 20 | padding: 1em 9.4em 0 0; 21 | } 22 | 23 | /* GLOBAL */ 24 | 25 | th { 26 | text-align: right; 27 | } 28 | 29 | .module h2, .module caption { 30 | text-align: right; 31 | } 32 | 33 | .module ul, .module ol { 34 | margin-left: 0; 35 | margin-right: 1.5em; 36 | } 37 | 38 | .addlink, .changelink { 39 | padding-left: 0; 40 | padding-right: 16px; 41 | background-position: 100% 1px; 42 | } 43 | 44 | .deletelink { 45 | padding-left: 0; 46 | padding-right: 16px; 47 | background-position: 100% 1px; 48 | } 49 | 50 | .object-tools { 51 | float: left; 52 | } 53 | 54 | thead th:first-child, 55 | tfoot td:first-child { 56 | border-left: none; 57 | } 58 | 59 | /* LAYOUT */ 60 | 61 | #user-tools { 62 | right: auto; 63 | left: 0; 64 | text-align: left; 65 | } 66 | 67 | div.breadcrumbs { 68 | text-align: right; 69 | } 70 | 71 | #content-main { 72 | float: right; 73 | } 74 | 75 | #content-related { 76 | float: left; 77 | margin-left: -300px; 78 | margin-right: auto; 79 | } 80 | 81 | .colMS { 82 | margin-left: 300px; 83 | margin-right: 0; 84 | } 85 | 86 | /* SORTABLE TABLES */ 87 | 88 | table thead th.sorted .sortoptions { 89 | float: left; 90 | } 91 | 92 | thead th.sorted .text { 93 | padding-right: 0; 94 | padding-left: 42px; 95 | } 96 | 97 | /* dashboard styles */ 98 | 99 | .dashboard .module table td a { 100 | padding-left: .6em; 101 | padding-right: 16px; 102 | } 103 | 104 | /* changelists styles */ 105 | 106 | .change-list .filtered table { 107 | border-left: none; 108 | border-right: 0px none; 109 | } 110 | 111 | #changelist-filter { 112 | right: auto; 113 | left: 0; 114 | border-left: none; 115 | border-right: none; 116 | } 117 | 118 | .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { 119 | margin-right: 0; 120 | margin-left: 280px; 121 | } 122 | 123 | #changelist-filter li.selected { 124 | border-left: none; 125 | padding-left: 10px; 126 | margin-left: 0; 127 | border-right: 5px solid #eaeaea; 128 | padding-right: 10px; 129 | margin-right: -15px; 130 | } 131 | 132 | .filtered .actions { 133 | margin-left: 280px; 134 | margin-right: 0; 135 | } 136 | 137 | #changelist table tbody td:first-child, #changelist table tbody th:first-child { 138 | border-right: none; 139 | border-left: none; 140 | } 141 | 142 | /* FORMS */ 143 | 144 | .aligned label { 145 | padding: 0 0 3px 1em; 146 | float: right; 147 | } 148 | 149 | .submit-row { 150 | text-align: left 151 | } 152 | 153 | .submit-row p.deletelink-box { 154 | float: right; 155 | } 156 | 157 | .submit-row input.default { 158 | margin-left: 0; 159 | } 160 | 161 | .vDateField, .vTimeField { 162 | margin-left: 2px; 163 | } 164 | 165 | .aligned .form-row input { 166 | margin-left: 5px; 167 | } 168 | 169 | form ul.inline li { 170 | float: right; 171 | padding-right: 0; 172 | padding-left: 7px; 173 | } 174 | 175 | input[type=submit].default, .submit-row input.default { 176 | float: left; 177 | } 178 | 179 | fieldset .field-box { 180 | float: right; 181 | margin-left: 20px; 182 | margin-right: 0; 183 | } 184 | 185 | .errorlist li { 186 | background-position: 100% 12px; 187 | padding: 0; 188 | } 189 | 190 | .errornote { 191 | background-position: 100% 12px; 192 | padding: 10px 12px; 193 | } 194 | 195 | /* WIDGETS */ 196 | 197 | .calendarnav-previous { 198 | top: 0; 199 | left: auto; 200 | right: 10px; 201 | } 202 | 203 | .calendarnav-next { 204 | top: 0; 205 | right: auto; 206 | left: 10px; 207 | } 208 | 209 | .calendar caption, .calendarbox h2 { 210 | text-align: center; 211 | } 212 | 213 | .selector { 214 | float: right; 215 | } 216 | 217 | .selector .selector-filter { 218 | text-align: right; 219 | } 220 | 221 | .inline-deletelink { 222 | float: left; 223 | } 224 | 225 | form .form-row p.datetime { 226 | overflow: hidden; 227 | } 228 | 229 | /* MISC */ 230 | 231 | .inline-related h2, .inline-group h2 { 232 | text-align: right 233 | } 234 | 235 | .inline-related h3 span.delete { 236 | padding-right: 20px; 237 | padding-left: inherit; 238 | left: 10px; 239 | right: inherit; 240 | float:left; 241 | } 242 | 243 | .inline-related h3 span.delete label { 244 | margin-left: inherit; 245 | margin-right: 2px; 246 | } 247 | 248 | /* IE7 specific bug fixes */ 249 | 250 | div.colM { 251 | position: relative; 252 | } 253 | 254 | .submit-row input { 255 | float: left; 256 | } 257 | -------------------------------------------------------------------------------- /ui/static/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | Weights used in this project: Light (300), Regular (400), Bold (700) 3 | -------------------------------------------------------------------------------- /ui/static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/ui/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /ui/static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/ui/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /ui/static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyao001/BioQueue/4a364aa745fb1fb2e14d4ad60b5e9e9966898604/ui/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /ui/static/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /ui/static/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - http://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /ui/static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /ui/static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/selector-icons.svg: -------------------------------------------------------------------------------- 1 | 35 | -------------------------------------------------------------------------------- /ui/static/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /ui/static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/static/admin/js/actions.min.js: -------------------------------------------------------------------------------- 1 | (function(a){var f;a.fn.actions=function(e){var b=a.extend({},a.fn.actions.defaults,e),g=a(this),k=!1,l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},n=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},p=function(){n(); 2 | a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},q=function(c){c?l():n();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length,d=a(".action-counter").data("actionsIcnt");a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:d},!0));a(b.allToggle).prop("checked",function(){var a;c===g.length?(a=!0,l()):(a=!1,p());return a})};a(b.counterContainer).show(); 3 | a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);h();1===a(b.acrossInput).val()&&m()});a(b.allToggle).show().click(function(){q(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);p();q(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&& 4 | a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){k=!0});a('form#changelist-form button[name="index"]').click(function(a){if(k)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))}); 5 | a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return k?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})}; 6 | a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"};a(document).ready(function(){var e=a("tr input.action-select");0{{ error_msg }}
16 | 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /ui/templates/ui/add_step.html: -------------------------------------------------------------------------------- 1 | 42 | {% include 'ui/variant_hint.html' %} 43 | -------------------------------------------------------------------------------- /ui/templates/ui/archive_table.html: -------------------------------------------------------------------------------- 1 |File | 10 |MD5 | 11 |
---|---|
{{ file }} | 16 |{{ md5 }} | 17 |
{{ page_help|safe }}
{% endif %} 8 |{{ error_msg }}
16 | 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /ui/templates/ui/fetch_data.html: -------------------------------------------------------------------------------- 1 | {% extends "ui/base.html" %} 2 | {% block title %}Fetch Data | BioQueue{% endblock %} 3 | {% block content %} 4 |a | 5 |b | 6 |r | 7 |average | 8 |
{{ step.a }} | 11 |{{ step.b }} | 12 |{{ step.r }} | 13 |{{ step.av }} | 14 |
18 | Import 19 |
20 | -------------------------------------------------------------------------------- /ui/templates/ui/foot.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/templates/ui/get_learning_result.html: -------------------------------------------------------------------------------- 1 |Resource | 26 |Slope | 27 |Intercept | 28 |r | 29 |
{{ hit.get_type_display }} | 35 |{{ hit.a }} | 36 |{{ hit.b }} | 37 |{{ hit.r }} | 38 |
Reference | 6 |Description | 7 |
---|---|
{{ ref.name }} | 13 |{{ ref.description }} | 14 |
This color indicates you need to create the reference manually. | 18 ||
This color indicates a reference in the same name has existed. So it may causing conflict. | 21 |
Sample Name | 6 |Assay | 7 |Create Time | 8 |Operation | 9 |
---|---|---|---|
{{ file_item.name }} | 15 |{{ file_item.exp }} | 16 |{{ file_item.create_time | localtime }} | 17 |
18 |
19 |
20 |
31 |
21 |
24 |
30 |
29 | |
32 |
File name: {{ file_item.raw }}
35 | {{ file_item.attribute|linebreaksbr }} |
37 |
File Name | 6 |File Size | 7 |Create Time | 8 |Operation | 9 |
---|---|---|---|
{% if file_item.is_link %}{% endif %} {{ file_item.name }} | 15 |{{ file_item.file_size | filesizeformat }} | 16 |{{ file_item.file_create }} | 17 |18 | 23 | | 24 |
ID | 12 |Protocol | 13 |
---|---|
{{ protocol.id }} | 19 |{{ protocol.name }} | 20 |
ID | 5 |Software | 6 |Import Check point | 7 |
---|---|---|
{{ step.id }} | 14 |{{ step.software }} | 15 |16 | CPU 17 | Memory 18 | Disk 19 | | 20 |
{{protocol.description}}
3 |Order | 9 |Software | 10 |Parameter | 11 |
---|---|---|
17 | 22 | | 23 |{{ step.software }} | 24 |{{ step.parameter }} | 25 |
28 |
29 |
46 |
30 |
31 |
32 |
38 |
39 |
45 |
40 |
41 |
42 |
43 |
44 | |
47 |
{{ page_help|safe }}
{% endif %} 8 |ID | 33 |Workspace | 34 |Operation | 35 |
---|---|---|
{{ obj.id }} | 41 |{{ obj.name }} | 42 |
43 | {% if obj.user is not None %}
44 |
45 |
46 |
47 |
48 | {% endif %}
49 | |
50 |
-1
if no info about it is available.
33 | -1
if no info about it is available.
38 | -1
if no info about it is available.
43 | AllOutputBefore
: All output files before this step.History:N-X
: Output file "X" in the n-th job.InputFile
: The initial input files which maps to files you provide when you create a job.InputFile:N
: The n-th file in input files.Job
: Job ID.JobName
: Job name.LastOutput
: Output files of last step.LastOutput:N
: The n-th output file of last step (in alphabetical order).Output:N-M
: The output file M produced by the n-th step (in alphabetical order).Suffix:X
: Output file(s) with a "X" suffix in last step.Suffix:N-X
: Output file(s) with a "X" suffix in the n-th step.Suffix:N-X-M
: The m-th output file with a "X" suffix in the n-th step.ThreadN
: The number of CPUs in the running node.UserBin
: Path where BioQueue will install software to for a specific user.Workspace
: Local storage path for the job.{% verbatim %}{{ThreadN}}{% endverbatim %}
.
21 |