From 4362ca6af344f5ba82bce89d5e789adbc1f2f310 Mon Sep 17 00:00:00 2001 From: Varun Ramraj Date: Sat, 5 Nov 2016 11:48:25 +0000 Subject: [PATCH] Fixed wormtable bug for floats expressed as nan. --- web/README.md | 102 ++++++++++++++++++++++++++++++++++- web/wormtable/_wormtable.pyd | Bin 43008 -> 43008 bytes 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/web/README.md b/web/README.md index 32d46ee..4592c8e 120000 --- a/web/README.md +++ b/web/README.md @@ -1 +1,101 @@ -../README.md \ No newline at end of file +Welcome to BrowseVCF version 2.6 +================================ + +BrowseVCF is a web-based application and workflow to quickly prioritise disease-causative variants in VCF files. + +# Table of Contents +1. [Requirements and Installation](#1-requirements-and-installation) + 1. [For Windows users](#i-for-windows-users) + 2. [For GNU Linux users](#ii-for-gnu-linux-users) + 3. [For Mac OS users](#iii-for-mac-os-users) +2. [Usage as standalone web application](#2-usage-as-standalone-web-application) +3. [Usage as command line tool](#3-usage-as-command-line-tool) +4. [Contact and Contribute](#4-contact-and-contribute) +5. [License](#5-license) + +### 1. Requirements and Installation + +##### i. *For Windows users* +Download the zip file (`browseVCF_win7_vX.X.zip`) from the [release page], unzip it somewhere, and double-click on `launcher-windows.bat` in the `web` directory. + +##### ii. *For GNU Linux users* +1) The latest versions of CentOS, Fedora, Redhat and Ubuntu come with Python 2.7 out of the box. +If it's not installed, download Python from `https://www.python.org/`. + +2) Install pip +`wget https://bootstrap.pypa.io/get-pip.py` +`python get-pip.py` + +3) Install dependencies +`sudo pip install psutil` +`sudo pip install cherrypy` +`sudo pip install cherrypy-cgiserver` + +4) Install Berkeley DB +`sudo apt-get install libdb-dev` (Ubuntu/Debian) or `yum install libdb-devel` (Red Hat/Fedora) + +5) Install Wormtable +`sudo apt-get install python-dev` (Ubuntu/Debian) or `yum install python-devel` (Red Hat/Fedora) +`sudo pip install wormtable` + +6) Download BrowseVCF (substitute X.X with latest version) +`wget https://github.com/BSGOxford/BrowseVCF/archive/vX.X.tar.gz` +`tar -xvf vX.X.tar.gz` + +##### iii. *For Mac OS users* +Download the OSX-specific .tar.gz file on the [release page], unzip it somewhere, and run `launcher-osx.sh` from a Terminal within the `web` directory. This version is shipped with a stripped-down Python v2.7.11 compiled on OSX, along with pre-compiled wormtable and BerkeleyDB modules. Tested on OSX El Capitan. + +Alternatively, to compile from source, please follow the instructions below. + +1) The latest versions of Mac OS X come with Python 2.7 out of the box. +If it's not installed, download Python from `https://www.python.org/`. + +2) Install pip +`wget https://bootstrap.pypa.io/get-pip.py` +`python get-pip.py` + +3) Install dependencies +`sudo pip install psutil` +`sudo pip install cherrypy` +`sudo pip install cherrypy-cgiserver` + +4) Install Berkeley DB +`sudo port install db53` + +5) Install Wormtable +`sudo pip install wormtable` +`CFLAGS=-I/opt/local/include/db53 LDFLAGS=-L/opt/local/lib/db53/ python setup.py build` +`sudo python setup.py install` + +6) Download BrowseVCF (substitute X.X with latest version) +`wget https://github.com/BSGOxford/BrowseVCF/archive/vX.X.tar.gz` +`tar -xvf vX.X.tar.gz` + +### 2. Usage as standalone web application +BrowseVCF used as web application is composed of four steps: + +1) Upload and pre-process your input .vcf or .vcf.gz file +2) Create indexes for one or more annotation fields of interest +3) Filter variants according to different criteria/fields/cutoffs +4) Export results and query history + +A more detailed tutorial is provided as PDF from the [release page], together with a VCF sample file. The PDF tutorial shows how to apply the different filters on the VCF sample file with the most frequenctly used queries. + +### 3. Usage as command line tool +The folder "scripts" contains the key set of Python scripts that perform the same actions of the web application. To see the list of required and optional parameters of any script, simply write: + +```sh +$ python script_name.py --help +``` + +### 4. Contact and Contribute +Want to contribute? Great! Simply report a new issue on GitHub or write an email to: +- Silvia Salatino: silvia (AT) well (DOT) ox (DOT) ac (DOT) uk +- Varun Ramraj: varun (AT) well (DOT) ox (DOT) ac (DOT) uk + +### 5. License +BrowseVCF is available under the [GPL v3] license. + + [GPL v3]: http://www.gnu.org/licenses/gpl-3.0.en.html + [release page]: https://github.com/BSGOxford/BrowseVCF/releases + diff --git a/web/wormtable/_wormtable.pyd b/web/wormtable/_wormtable.pyd index 2b2a41b85d238bcab81a4baa222784262a7bf405..08d3fdd13229c84a98f06958e544f43e497b25b3 100755 GIT binary patch delta 9490 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 delta 9564 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