diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..bce81a93e3a9f13bcb09e0d20129bbce69176c06 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include README.md +include jass/swagger/swagger.yaml +recursive-include jass/static * +recursive-include celery_files * diff --git a/README.md b/README.md index 5747508cbf467bad42cbd30f50c495f063f52efa..f81e2ceacc557dc38bb45db5a2469f5b75d5cc5e 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,42 @@ # JASS -## setup +## install -The main requirement is **python 3**. To setup the server in a dedicated virtualenv (you need **virtualenv**), please execute the following from the root directory, once you have cloned the repository: +You need **python3** to install and use JASS. ``` -virtualenv venv -. venv/bin/activate -pip3 install -r requirements.txt -# you can quit the virtualenv with -deactivate +# install +pip install [TODO upload to pypi] ``` -## run +## configure and import data ``` -# activate the virtualenv -. venv/bin/activate -# run the server, [CTRL+C] to quit -python -m swagger-server -# you can quit the virtualenv with -deactivate +# configure +export JASS_DATA_DIR=/tmp/JASSDATA +# import GWAS data into JASS +python -m jass create_init_table [TODO use IMpG format] ``` -## browse - -### for end users - -TODO - -### for developers - -The Swagger UI is there: +## run a server ``` -http://localhost:8080/ui/ +# launch celery to process tasks +celery -A jass worker +# launch the web server +python -m jass serve ``` -The Swagger definition for this server's API lives here: +## use JASS on the command line ``` -http://localhost:8080/swagger.json +# list available phenotypes on the command line +python -m jass list-phenotypes +# compute joint statistics on the command line into an HDF file +python -m jass create-worktable --phenotypes z_RA_RA z_ReproGen_AME --worktable-path testwt.h5 +# create the global manhattan plot for a joint statistics file +python -m jass plot-manhattan --worktable-path testwt.h5 --plot-path testgm.png +# create the quadrant plot for a joint statistics file +python -m jass plot-quadrant --worktable-path testwt.h5 --plot-path testqd.png ``` -# tests - -To launch the integration tests, use tox: -``` -sudo pip install tox -tox -``` diff --git a/celery_files/default/celeryd b/celery_files/default/celeryd index 3885d9221097164232048bfc4a583a6b4ad53b38..6dc9b985420d0dd0258ae0d651178e9c5ce62500 100644 --- a/celery_files/default/celeryd +++ b/celery_files/default/celeryd @@ -1,6 +1,6 @@ CELERYD_NODES="worker" CELERY_BIN="/opt/jass/venv/bin/celery" -CELERY_APP="swagger_server.models.project" +CELERY_APP="jass.models.project" CELERYD_CHDIR="/opt/jass" CELERYD_OPTS="--time-limit=3000 --concurrency=1 --max-tasks-per-child=1 --executable=/opt/jass/venv/bin/python" CELERYD_LOG_FILE="/opt/jass/log/celery%N.log" diff --git a/jass.wsgi b/jass.wsgi index cd7979430951679c2ecc0799ed828c77ec256f2b..379ca1cd13351488f58f1cb8d78b58219caf4375 100644 --- a/jass.wsgi +++ b/jass.wsgi @@ -5,7 +5,7 @@ activate_this = '/opt/jass/venv/bin/activate_this.py' exec(open(activate_this).read(), dict(__file__=activate_this)) sys.path.insert(0, '/opt/jass') -from swagger_server.server import get_jass_app +from jass.server import get_jass_app app = get_jass_app() application = app.app diff --git a/jass/__init__.py b/jass/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ac600075f89fc566e6250dafbdce1883bec12ff4 --- /dev/null +++ b/jass/__init__.py @@ -0,0 +1,19 @@ +from celery import Celery +import jass.models.project + +def make_celery(app): + celery = Celery(jass.models.project) + celery.conf.update(app.config) + TaskBase = celery.Task + class ContextTask(TaskBase): + abstract = True + def __call__(self, *args, **kwargs): + with app.app_context(): + return TaskBase.__call__(self, *args, **kwargs) + celery.Task = ContextTask + return celery + +from flask import Flask + +flask_app = Flask(__name__) +celery = make_celery(flask_app) diff --git a/swagger_server/__main__.py b/jass/__main__.py similarity index 100% rename from swagger_server/__main__.py rename to jass/__main__.py diff --git a/swagger_server/config.py b/jass/config.py similarity index 89% rename from swagger_server/config.py rename to jass/config.py index 6ddad5424a1e1e918088de22ead472320681b891..3b2ee049946a04a2a3969a225bb253d66d68cbdf 100644 --- a/swagger_server/config.py +++ b/jass/config.py @@ -11,6 +11,6 @@ if 'JASS_HOST' in os.environ: if 'JASS_PORT' in os.environ: config['PORT'] = os.environ['JASS_PORT'] if 'JASS_DATA_DIR' in os.environ: - config['JASS_DATA_DIR'] = os.environ['JASS_DATA_DIR'] + config['DATA_DIR'] = os.environ['JASS_DATA_DIR'] if 'JASS_INITTABLE_CHUNKSIZE' in os.environ: config['INITTABLE_CHUNKSIZE'] = int(os.environ['JASS_INITTABLE_CHUNKSIZE']) diff --git a/swagger_server/__init__.py b/jass/controllers/__init__.py similarity index 100% rename from swagger_server/__init__.py rename to jass/controllers/__init__.py diff --git a/swagger_server/controllers/default_controller.py b/jass/controllers/default_controller.py similarity index 94% rename from swagger_server/controllers/default_controller.py rename to jass/controllers/default_controller.py index aa99e8d1e8a0ebe40ac7d7b427ee8b765284bf1c..b61aa09b691eeb028781455d821cd645f140f407 100644 --- a/swagger_server/controllers/default_controller.py +++ b/jass/controllers/default_controller.py @@ -5,9 +5,9 @@ from six import iteritems from flask import send_file, abort import connexion -from swagger_server.models.phenotype import Phenotype, get_available_phenotypes -from swagger_server.models.project import Project, create_project -from swagger_server.config import config +from jass.models.phenotype import Phenotype, get_available_phenotypes +from jass.models.project import Project, create_project +from jass.config import config PHENOTYPES = get_available_phenotypes(os.path.join(config['DATA_DIR'],'initTable.hdf5')) #FIXME part of the config def phenotypes_get(): diff --git a/swagger_server/encoder.py b/jass/encoder.py similarity index 93% rename from swagger_server/encoder.py rename to jass/encoder.py index 607595d32d7d3688d9fb16ea4262c185e31b3634..8d647c181337a7e7c2e10613a280db2f851a9120 100644 --- a/swagger_server/encoder.py +++ b/jass/encoder.py @@ -1,7 +1,7 @@ from connexion.apps.flask_app import FlaskJSONEncoder #from connexion.decorators import produces from six import iteritems -from swagger_server.models.base_model_ import Model +from jass.models.base_model_ import Model from pandas import isnull class JSONEncoder(FlaskJSONEncoder): diff --git a/swagger_server/models/__init__.py b/jass/models/__init__.py similarity index 100% rename from swagger_server/models/__init__.py rename to jass/models/__init__.py diff --git a/swagger_server/models/base_model_.py b/jass/models/base_model_.py similarity index 100% rename from swagger_server/models/base_model_.py rename to jass/models/base_model_.py diff --git a/swagger_server/models/phenotype.py b/jass/models/phenotype.py similarity index 100% rename from swagger_server/models/phenotype.py rename to jass/models/phenotype.py diff --git a/swagger_server/models/project.py b/jass/models/project.py similarity index 99% rename from swagger_server/models/project.py rename to jass/models/project.py index 80cbdc6c579b2b052e6c62e5dba8fe140d8a2510..ffe82c76eed6451d879e0a318eb3bd03f28b2ba3 100644 --- a/swagger_server/models/project.py +++ b/jass/models/project.py @@ -12,7 +12,7 @@ from .base_model_ import Model from ..util import deserialize_model from .phenotype import Phenotype from .worktable import create_worktable_file, get_worktable_summary, get_worktable_genomedata, get_worktable_local_manhattan_data, get_worktable_local_heatmap_data, create_global_plot, create_quadrant_plot -from swagger_server.config import config +from jass.config import config app = Celery('tasks', broker='pyamqp://guest@localhost//') diff --git a/swagger_server/models/worktable.py b/jass/models/worktable.py similarity index 100% rename from swagger_server/models/worktable.py rename to jass/models/worktable.py diff --git a/swagger_server/server.py b/jass/server.py similarity index 100% rename from swagger_server/server.py rename to jass/server.py diff --git a/swagger_server/static/chromo_heatmap_manhattan.html b/jass/static/chromo_heatmap_manhattan.html similarity index 100% rename from swagger_server/static/chromo_heatmap_manhattan.html rename to jass/static/chromo_heatmap_manhattan.html diff --git a/swagger_server/static/css/style.css b/jass/static/css/style.css similarity index 100% rename from swagger_server/static/css/style.css rename to jass/static/css/style.css diff --git a/swagger_server/static/data/cytoBand.txt b/jass/static/data/cytoBand.txt similarity index 100% rename from swagger_server/static/data/cytoBand.txt rename to jass/static/data/cytoBand.txt diff --git a/swagger_server/static/export.html b/jass/static/export.html similarity index 100% rename from swagger_server/static/export.html rename to jass/static/export.html diff --git a/swagger_server/static/img/bkg_part1.jpg b/jass/static/img/bkg_part1.jpg similarity index 100% rename from swagger_server/static/img/bkg_part1.jpg rename to jass/static/img/bkg_part1.jpg diff --git a/swagger_server/static/img/bkg_part2.jpg b/jass/static/img/bkg_part2.jpg similarity index 100% rename from swagger_server/static/img/bkg_part2.jpg rename to jass/static/img/bkg_part2.jpg diff --git a/swagger_server/static/img/bkg_part2_wthLabel.jpg b/jass/static/img/bkg_part2_wthLabel.jpg similarity index 100% rename from swagger_server/static/img/bkg_part2_wthLabel.jpg rename to jass/static/img/bkg_part2_wthLabel.jpg diff --git a/swagger_server/static/img/busy.gif b/jass/static/img/busy.gif similarity index 100% rename from swagger_server/static/img/busy.gif rename to jass/static/img/busy.gif diff --git a/swagger_server/static/img/jass19Avrilsmall.jpg b/jass/static/img/jass19Avrilsmall.jpg similarity index 100% rename from swagger_server/static/img/jass19Avrilsmall.jpg rename to jass/static/img/jass19Avrilsmall.jpg diff --git a/swagger_server/static/index.html b/jass/static/index.html similarity index 100% rename from swagger_server/static/index.html rename to jass/static/index.html diff --git a/swagger_server/static/js/Chromosome.js b/jass/static/js/Chromosome.js similarity index 100% rename from swagger_server/static/js/Chromosome.js rename to jass/static/js/Chromosome.js diff --git a/swagger_server/static/js/colorScale.js b/jass/static/js/colorScale.js similarity index 100% rename from swagger_server/static/js/colorScale.js rename to jass/static/js/colorScale.js diff --git a/swagger_server/static/js/jquery-ui.js b/jass/static/js/jquery-ui.js similarity index 100% rename from swagger_server/static/js/jquery-ui.js rename to jass/static/js/jquery-ui.js diff --git a/swagger_server/static/js/jquery.min.js b/jass/static/js/jquery.min.js similarity index 100% rename from swagger_server/static/js/jquery.min.js rename to jass/static/js/jquery.min.js diff --git a/swagger_server/static/js/plotly-latest.min.js b/jass/static/js/plotly-latest.min.js similarity index 100% rename from swagger_server/static/js/plotly-latest.min.js rename to jass/static/js/plotly-latest.min.js diff --git a/swagger_server/static/js/snap.svg-min.js b/jass/static/js/snap.svg-min.js similarity index 100% rename from swagger_server/static/js/snap.svg-min.js rename to jass/static/js/snap.svg-min.js diff --git a/swagger_server/static/selectPhenotypes.html b/jass/static/selectPhenotypes.html similarity index 100% rename from swagger_server/static/selectPhenotypes.html rename to jass/static/selectPhenotypes.html diff --git a/swagger_server/swagger/swagger.yaml b/jass/swagger/swagger.yaml similarity index 88% rename from swagger_server/swagger/swagger.yaml rename to jass/swagger/swagger.yaml index 380393d491e18f9d6301722149abce36e9d30736..2bab1149034952a69342b7d8ff3d6e306f4c6b60 100644 --- a/swagger_server/swagger/swagger.yaml +++ b/jass/swagger/swagger.yaml @@ -17,7 +17,7 @@ paths: title: "ArrayOfPhenotypes" items: $ref: "#/definitions/Phenotype" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects: post: description: "Create a new project from a selection of phenotypes\n" @@ -36,7 +36,7 @@ paths: description: "Project created" schema: $ref: "#/definitions/Phenotype" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}: get: description: "Retrieve a project definition\n" @@ -52,7 +52,7 @@ paths: description: "Retrieved project" schema: $ref: "#/definitions/Phenotype" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}/summary: get: description: "Retrieve summary statistics for a given project" @@ -69,7 +69,7 @@ paths: schema: type: "string" title: "Project summary statistics" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}/genome: get: description: "Retrieve whole genome data for a given project\n" @@ -88,7 +88,7 @@ paths: schema: type: "string" title: "Genome data" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}/globalmanhattan: get: description: "Retrieve global manhattan plot for a given project\n" @@ -107,7 +107,7 @@ paths: schema: type: "string" title: "Global manhattan plot" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}/quadrant: get: description: "Retrieve quadrant plot for a given project\n" @@ -127,7 +127,7 @@ paths: schema: type: "string" title: "Quadrant plot" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}/manhattan/{chromosome}/{region}: get: description: "Retrieve local manhattan data" @@ -156,7 +156,7 @@ paths: schema: type: "string" title: "Local manhattan plot data" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" /projects/{projectID}/heatmap/{chromosome}/{region}: get: description: "Retrieve local heatmap data" @@ -185,7 +185,7 @@ paths: schema: type: "string" title: "Local heatmap plot data" - x-swagger-router-controller: "swagger_server.controllers.default_controller" + x-swagger-router-controller: "jass.controllers.default_controller" definitions: Phenotype: properties: diff --git a/swagger_server/test/__init__.py b/jass/test/__init__.py similarity index 100% rename from swagger_server/test/__init__.py rename to jass/test/__init__.py diff --git a/swagger_server/test/test_default_controller.py b/jass/test/test_default_controller.py similarity index 98% rename from swagger_server/test/test_default_controller.py rename to jass/test/test_default_controller.py index 0a193be77f837a07972fc5be2f113e816201f7a0..66723eeeca9d853fe8be08fcfa7227e34f7bef6c 100644 --- a/swagger_server/test/test_default_controller.py +++ b/jass/test/test_default_controller.py @@ -2,7 +2,7 @@ from __future__ import absolute_import -from swagger_server.models.phenotype import Phenotype +from jass.models.phenotype import Phenotype from . import BaseTestCase from six import BytesIO from flask import json diff --git a/swagger_server/util.py b/jass/util.py similarity index 100% rename from swagger_server/util.py rename to jass/util.py diff --git a/run.sh b/run.sh deleted file mode 100755 index 9e28bd66f47b4f5dcb8b9358cbe40bcc3e1e29e4..0000000000000000000000000000000000000000 --- a/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/sh -. venv/bin/activate -python -m swagger_server diff --git a/setup.py b/setup.py index 1d08c48ed3fc83b61cab84bb758dcf9b7e18131f..95b388ac191329c0a352e59dcb72722bd2ca3c4f 100644 --- a/setup.py +++ b/setup.py @@ -1,33 +1,32 @@ # coding: utf-8 -import sys +import os, sys from setuptools import setup, find_packages -NAME = "swagger_server" -VERSION = "1.0.0" +NAME = "jass" +VERSION = "dev" -# To install the library, run the following -# -# python setup.py install -# -# prerequisite: setuptools -# http://pypi.python.org/pypi/setuptools +SETUP_DIR = os.path.dirname(__file__) +README = os.path.join(SETUP_DIR, 'README.md') +readme = open(README).read() -REQUIRES = ["connexion"] +REQUIRES = ["connexion", "python_dateutil", "setuptools", "pandas", "tables", "scipy", "matplotlib", "celery", "h5py"] setup( name=NAME, version=VERSION, - description="PCMAWeb API Specification", - author_email="", - url="", - keywords=["Swagger", "PCMAWeb API Specification"], - install_requires=REQUIRES, + description="JASS allows for single SNP joint analysis of multiple GWAS summary statistics", + author='Hervé Ménager and Pierre Lechat and Carla Lasry and Vincent Guillemot and Hugues Aschard', + author_email="hmenager@pasteur.fr and pierre.lechat@pasteur.fr and carla.lasry@pasteur.fr and vincent.guillemot@pasteur.fr and hugues.aschard@pasteur.fr", + url="https://gitlab.pasteur.fr/vguillem/jass", packages=find_packages(), + install_requires=REQUIRES, + license="?", + keywords=["GWAS", "Data analysis", "summary statistics"], package_data={'': ['swagger/swagger.yaml']}, include_package_data=True, long_description="""\ - No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + """ ) diff --git a/swagger_server/controllers/__init__.py b/swagger_server/controllers/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000