├── .drone.yml ├── .travis.yml ├── Dockerfile ├── Drone_Plotting.ipynb ├── LICENSE ├── Shippable_Plotting.ipynb ├── Travis_Plotting.ipynb ├── Wercker_Plotting.ipynb ├── _config.yml ├── docs ├── _config.yml ├── configuration.md ├── images │ ├── continuous_analysis.png │ └── significant_genes.png └── readme.md ├── drone ├── coverage.xml ├── output │ ├── abundance.h5 │ ├── abundance.tsv │ ├── fig1.png │ ├── fig2.png │ ├── fig3.png │ ├── fig4.png │ ├── output │ │ ├── abundance.h5 │ │ ├── abundance.tsv │ │ └── run_info.json │ └── run_info.json └── tests.xml ├── readme.md ├── readme_images ├── add_webhook.png └── register_application.png ├── shippable.yml ├── shippable ├── codecoverage │ └── coverage.xml ├── output │ ├── abundance.h5 │ ├── abundance.tsv │ ├── fig1.png │ ├── fig2.png │ ├── fig3.png │ ├── fig4.png │ ├── output │ │ ├── abundance.h5 │ │ ├── abundance.tsv │ │ └── run_info.json │ └── run_info.json └── testresults │ └── tests.xml ├── simple_script.py ├── test.py ├── travis-ci ├── coverage.xml ├── output │ ├── abundance.h5 │ ├── abundance.tsv │ ├── fig1.png │ ├── fig2.png │ ├── fig3.png │ ├── fig4.png │ └── run_info.json ├── tests.xml └── travis-ci │ ├── coverage.xml │ ├── output │ ├── abundance.h5 │ ├── abundance.tsv │ ├── fig1.png │ ├── fig2.png │ ├── fig3.png │ ├── fig4.png │ └── run_info.json │ └── tests.xml ├── wercker.yml └── wercker ├── coverage.xml ├── output ├── abundance.h5 ├── abundance.tsv ├── fig1.png ├── fig2.png ├── fig3.png ├── fig4.png ├── output │ ├── abundance.h5 │ ├── abundance.tsv │ └── run_info.json └── run_info.json └── tests.xml /.drone.yml: -------------------------------------------------------------------------------- 1 | workspace: 2 | path: src/ 3 | 4 | pipeline: 5 | run_kallisto: 6 | image: brettbj/continuous_analysis_base:latest 7 | commands: 8 | - ls /drone/src 9 | - mkdir -p drone 10 | - nose2 --plugin nose2.plugins.junitxml --junit-xml test 11 | - mv nose2-junit.xml drone/tests.xml 12 | - coverage run --branch test.py 13 | - coverage xml -o drone/coverage.xml test.py 14 | 15 | # run kallisto on a few simple tests 16 | - cd /kallisto/test 17 | - kallisto index -i transcripts.idx transcripts.fasta.gz 18 | - kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz 19 | - cp -R /kallisto/test/output /drone/src/output 20 | 21 | - jupyter nbconvert --to html --execute /drone/src/Drone_Plotting.ipynb 22 | 23 | push_to_github: 24 | image: brettbj/continuous_analysis_base:latest 25 | secrets: [ git_publish_key ] 26 | commands: 27 | # plot the results from a jupyter notebook 28 | - cd /drone/src 29 | 30 | # push the results back to github 31 | - git config user.email "brettbj@gmail.com" 32 | - git config user.name "Brett Beaulieu-Jones" 33 | - git config --global push.default simple 34 | - git remote set-url origin https://brettbj:$GIT_PUBLISH_KEY@github.com/greenelab/continuous_analysis.git 35 | 36 | - git add drone/* 37 | - git commit drone/* -m "Drone output [CI SKIP] [SKIP CI] ." 38 | 39 | - git fetch 40 | - git branch --set-upstream-to=origin/master master 41 | - git pull -s recursive -X ours 42 | - git push 43 | 44 | branches: develop 45 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: bash 2 | sudo: required 3 | 4 | services: 5 | - docker 6 | 7 | before_install: 8 | - docker pull brettbj/continuous_analysis_base 9 | - docker run --name con_test -t -d brettbj/continuous_analysis_base bin/bash 10 | - docker cp test.py con_test:test.py 11 | - docker cp simple_script.py con_test:simple_script.py 12 | - docker cp Travis_Plotting.ipynb con_test:Travis_Plotting.ipynb 13 | - docker exec con_test mkdir travis-ci 14 | 15 | script: 16 | - ls 17 | - pwd 18 | - docker exec con_test pwd 19 | 20 | #Run tests 21 | - docker exec con_test nose2 --plugin nose2.plugins.junitxml --junit-xml test 22 | - docker exec con_test mv nose2-junit.xml travis-ci/tests.xml 23 | - docker exec con_test coverage run --branch test.py 24 | - docker exec con_test coverage xml -o travis-ci/coverage.xml test.py 25 | 26 | #Run kallisto 27 | - docker exec con_test kallisto index -i kallisto/test/transcripts.idx kallisto/test/transcripts.fasta.gz 28 | - docker exec con_test kallisto quant -i kallisto/test/transcripts.idx -o kallisto/test/output -b 100 kallisto/test/reads_1.fastq.gz kallisto/test/reads_2.fastq.gz 29 | 30 | #Gather output 31 | - docker exec con_test mv kallisto/test/output travis-ci/output 32 | 33 | #Plot results from a jupyter notebook 34 | - docker exec con_test jupyter nbconvert --to html --execute Travis_Plotting.ipynb 35 | 36 | #Copy output out of container 37 | - docker cp con_test:/travis-ci travis-ci 38 | 39 | #Push results back to github 40 | - git config user.email "brettbj@gmail.com" 41 | - git config user.name "Brett Beaulieu-Jones" 42 | - git config --global push.default simple 43 | - git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 44 | 45 | - git checkout master 46 | - git pull 47 | - git add travis-ci/. 48 | - git commit -a -m "Travis-CI output [CI SKIP] [SKIP CI] ." 49 | - git stash 50 | - git push 51 | 52 | after_success: 53 | - docker build -t brettbj/continuous_analysis . 54 | - docker push brettbj/continuous_analysis:latest -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Example Minimalist Base Docker Image 2 | # Start with Ubuntu base image 3 | FROM ubuntu:14.04 4 | MAINTAINER Brett Beaulieu-Jones 5 | 6 | # install python depencies for plotting 7 | RUN apt-get update && apt-get install -y \ 8 | build-essential \ 9 | git \ 10 | pkg-config \ 11 | python-matplotlib \ 12 | libpng-dev \ 13 | libfreetype6 \ 14 | libfreetype6-dev \ 15 | python3-dev \ 16 | python3-pip \ 17 | python3-numpy \ 18 | python3-scipy \ 19 | cmake \ 20 | zlib1g-dev \ 21 | libhdf5-dev 22 | 23 | RUN pip3 install seaborn && \ 24 | pip3 install jupyter && \ 25 | pip3 install nose2 && \ 26 | pip3 install coverage 27 | 28 | RUN git clone https://github.com/pachterlab/kallisto.git 29 | RUN mkdir /kallisto/build 30 | RUN cd kallisto/build && \ 31 | cmake .. && \ 32 | make && \ 33 | make install -------------------------------------------------------------------------------- /Drone_Plotting.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 53, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import seaborn as sns\n", 12 | "import pandas as pd\n", 13 | "import matplotlib.pyplot as plt\n", 14 | "import datetime\n", 15 | "#%matplotlib inline\n", 16 | "\n", 17 | "output_folder = '/drone/src/output/'\n", 18 | "abundances = pd.read_csv(output_folder + 'abundance.tsv', delimiter='\\t')" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 58, 24 | "metadata": { 25 | "collapsed": false 26 | }, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeQAAAGACAYAAAB8yxG1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8z/X///H7671lmx2cNtIqfBYWpkQiKU3Koe8niRIm\np0RI4uPQ5FSMzlE+oYOcEkkh35LQRzo4hCKTUyWxjzlt783GttfvD7+9vzvvPTs9Z7fr5eJie+/1\nfr0ej9fr/Xrf36/j27Jt2xYAAChVjtIuAAAAEMgAABiBQAYAwAAEMgAABiCQAQAwAIEMAIABCOQ8\njBs3TqGhoXn+i46OliRFREQoNDRU3bt3L+WqURzOnj2r2NjYIhvf1q1bXa+hb7/9tsjGW9g6//77\nb40dO1bh4eFq3LixOnbsqPnz52cbLj4+Xs8995xatmypm2++WT179tTOnTtzHW9KSorCw8MVGhqq\njz76KMdhPv30U3Xp0kU333yzwsPD9dJLLykpKcmtugtajyQdOXJEYWFhCg0N1bZt29yajjvzJ7/3\njDfffLPQ07jcnjN67bXXcq3x1KlTruEOHDigQYMGqWnTpmratKkGDx6sQ4cOuT0duI9AdoNlWTn+\nczgc2YbDlcW2bS1dulT33Xefjhw5UuTjL6rXTFHUefToUXXu3Fmffvqpjh8/rosXL+rIkSOaPn26\npk2blmnYJ554QsuXL9fZs2eVnJysHTt2qF+/fvrtt99yHPcbb7yhv//+O9d+33jjDY0dO1b79u1T\ncnKyjh8/rnfffVfjx493q/aC1iNJkydP1sWLF91eBnnNn6lTp7qGy+39Iv2fn5/fZU2jsMsgq4MH\nD+b7vnbgwAF1795dmzZtUmJiohITE7Vx40b16NGDUC4GBLIbqlatqm+++UabNm3K9G/jxo2qW7eu\nJGnmzJnatGmT/v3vf5dytShKW7Zs0aRJkxQXF1fapeSpKOp86623FBcXJ19fX82ePVtr1qzRHXfc\nIUlavHix/vrrL0nS119/rZ9++kmWZWnKlClasWKFgoODlZSUpFmzZmUaZ0pKiqKiojRv3rxcp7t/\n/37NmTNHlmWpW7duWrNmjfr27StJ+vzzz3X06NE86y5IPelWrVqlH374we15I+U9f5YsWeKaP1nf\nJzZt2qSOHTvKtm3deOON6tmz52VN43KXQW4OHjwoSRozZky297Vq1apJkmbMmKGEhASFhITo448/\n1qxZs+Tn56e4uLhsHxBQeASyGyzLUvXq1VWjRo1s/zw8PCRJVapUUY0aNVSlSpVSrhZFKS0trbRL\ncEtR1Pndd9/Jsix16NBBd999t0JCQvT000+7xp++O/Srr76SJNWtW1fdunVTgwYN1KtXL9m2rc2b\nN+vChQuSLr3hd+rUSR988EGeW6ErV65UWlqaqlatqkmTJrmm27lzZz3xxBO6ePFinnW7W0+6+Ph4\nvfjiiwXeO+Hu/Mn6HnHq1Cl98cUX8vDw0LRp03TVVVcVehoF7TmrCxcuuMK9fv362WpOH+aHH36Q\nZVkaMGCAGjZsqHvuuUd9+/aVbdv6/vvvdfLkyQLNQ+SNQC4iuR1D/vHHH9W9e3fddNNNatu2rT78\n8EMtX75coaGhatu2bb7Pz+nx9GNxb7zxhkaOHKmwsDC1bt1ap0+fliRt375dERERatKkiW699VYN\nHjw4226sxMRETZs2TeHh4WrUqJFatGihRx991LWi5yc6Olr9+vXTzTffrNatW+utt97Sli1bFBoa\nqhtvvDHTsBmPQTVp0kSPPfaYtm/fnmmYN998U6GhobrvvvsUExOjp556Sk2bNtVtt92mCRMm6Pz5\n85mGP378uEaOHKnbbrtNN998sx5++GGtX78+x3Hee++9WrVqlW6//XY1adJEy5cvlyTt3LlTjz/+\nuFq1aqVGjRrpjjvu0MiRI11bZCtXrtTAgQNdb9wREREKDw8vUA2SdPLkSY0cOVLNmzfXrbfeqgkT\nJigxMdGt+SxJu3btKlSd6ccFX3311Tyn88477+jtt9/OtAWXMejT77L766+/yrIshYaGuv6WvsyT\nk5N1+PBhSdLvv/+uP/74Q4GBgZo+fXqu0925c6csy1KDBg3kcDjkdDqVlpam6dOn6+mnn9Y//vGP\nPOt2t550L7/8smJjY3XTTTflOd6s3J0/WU2ZMkVpaWnq3LlzphoLM42C9JzT8j98+LBSU1MlScHB\nwYqLi8sW4mfOnFFKSookuUJakho0aOCqZe/evXn2g4LxLO0CriRZP3H/8MMPGjBggFJSUmRZlv7+\n+29NmTJFDRs2dOv5eT1uWZYWLVokp9MpSQoMDFTVqlW1efNmDR482LWySdLGjRu1detWLVmyRPXr\n15ckjR49WuvXr3eN+9y5c9q5c6eeeuopvf7667rvvvty7fPQoUPq2bOnEhISZFmWkpOT9eabb+bY\nV3R0tHr06KHExETXtH788Uft2LFDc+bMUatWrTINn5CQoJ49e+rYsWOSLq30y5Ytk6enpyZMmCBJ\niomJUbdu3RQbG+sa5y+//KKhQ4dq6tSpeuihhzKN8+TJk3r22Wdd8yQsLEyHDh1Sv379dP78edc4\nTp06pc8//1y7d+/WunXrss37jMfX3K0hISFBPXr00NGjR13DLV++XBs2bMh1/mad13379r3sOtN/\nd2drsF69eqpXr16mx1asWOH6Of3N/8SJE5KUaW9Q5cqVXT8fP35coaGh8vHxUZ8+ffT444/neXLW\nn3/+KUny8fHRyJEjtXbtWjkcDrVt21YvvPCCAgIC8qzb3Xok6eeff9by5cvl7++vMWPG6NFHH81z\n3Bm5O38y2rZtm3bt2iWHw6GBAwcW2TQK0nNOyz/j8d9+/frpr7/+kqenp9q3b6+JEyfK398/07Hu\n48ePu35O/+AvybWeomiwheyG2NjYHM9E/PTTTzMNl/UT8owZM5SSkiIfHx9Nnz5da9asUf/+/bVn\nz54cp5PbJ+ycHrdtW06nU6NGjdKaNWsUGRkp27Y1adIkpaam6qabbtKyZcv0ySefqGnTpq4tYkly\nOp36+uuvZVmWRowYoXXr1unjjz9WWFiYPD09XW/yuXnttdeUkJAgT09PjRs3TmvWrNHo0aP166+/\nZht26tSpOn/+vGrVqqUFCxZo9erVateunVJSUjR58uRsw586dUqVKlXSRx99pEWLFsnf31/SpWOJ\nGacfGxurqlWr6u2339batWtdexCioqKybX0mJSWpSZMmWrNmjWbOnKnQ0FCtWrVKSUlJqlGjhhYv\nXqx169Zp8ODBki69yRw+fFgdO3bUjBkzXPP/9ddfd50h7G4NS5YscYVxt27dtHr1ar388svZtvhz\nU9g6JbmOCz7xxBNuTTPd2rVrXeNp1KiRKyjSe6tQoYJr2Iy7YdP/3qpVK40dO9Z1PDI36R8q169f\nr7Vr10q6tFWYsde8uFtPWlqaJkyYINu2NXToUFWvXj3fceclt/mT0eLFiyVJd955p2rVqlVk03C3\nZynn5Z9+/Fi69DqyLEupqalas2aNBg4cKNu25evrqwYNGsi2bc2fP19Hjx7V0aNH9f7777uem5CQ\nUOCekDsC2Q3unGGdVWxsrPbt2yfLstSrVy898MADCgkJ0ahRowq8qyw3V199tfr376+QkBA1a9ZM\n+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\n6t69uzZt2lRUNRdaSkqKRo4cqe7du6tXr146cuRImeth9+7dioiIkKQC1Z6cnKynnnpKPXv21BNP\nPKEzZ0rvem8pcx/79u1Tz5491bt3bw0YMECnT5+WZH4fGXtIt3r1anXv3t31u+k9SJn7OH36tJ58\n8klFRESoR48eOnr0qCTz+8j6enrkkUfUs2dPRUZGuoYxuYeUlBSNHj1aPXv21MMPP6wNGzaUyfU7\npz6io6PL1PqdUw/pim39tgvoxx9/tAcNGmTbtm0nJCTYs2bNsgcNGmRv27bNtm3bnjBhgv3VV1/Z\nJ0+etO+//3774sWLdnx8vH3//ffbFy5cKOjkisX69evtp59+2rZt296yZYs9bNiwMtXDvHnz7Pvv\nv99+5JFHbNu2C1T7+++/b8+aNcu2bdv+/PPP7RdeeMGYPnr16mVHR0fbtm3bS5cutadPn258H1l7\nsG3b3rt3r/3YY4+5HjO9B9vO3sfYsWPt//3f/7Vt27Z/+OEHe9OmTcb3kbWHIUOG2P/5z39s27bt\nkSNH2hs3bjS+hxUrVtjTpk2zbdu2z507Z7dp06ZMrt859VHW1u+MPZw9e9Zu06aNbdvFu34XeAv5\n22+/Vb169fTkk09q8ODBatOmjX799Vc1a9ZMknTnnXfqu+++088//6ymTZvK09NTfn5+ql27tuta\n5tJWu3ZtpaamyrZtxcfHy9PTs0z1UKtWLb311luu3/fu3etW7dHR0dqxY4fuvPNO17Dff/99qfQg\nZe/jtddeU/369SVd+nRaoUIF4/vI2sOZM2f0+uuvZ9oiM70HKXsfP/30k06cOKG+fftqzZo1uu22\n24zvI2sPN954o86cOSPbtpWQkCBPT0/je+jQoYOGDx8uSUpNTZWHh4fb700m9+Hp6anXX3+9TK3f\nGXtIS0uTp6enzp49W6zrd4ED+cyZM9qzZ49mzpypSZMmadSoUZnube3r6yun06mEhIRM98CuWLGi\n4uPjCzq5YuHr66u//vpL7du314QJExQRESE7w+XYpvfQrl07eXh4uH53t/b0x/38/DINW1qy9hEY\nGCjpUhgsWbJEffr0yXYvddP6yNhDWlqaxo8fr7Fjx8rHx8c1jOk9SNmXxbFjx1S5cmW9//77uvrq\nqzV37lzj+8jaQ+3atTV16lR16tRJp0+fVvPmzY3vwcfHx1XT8OHDNWLEiDK5fufUR7Vq1SSVnfU7\n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\nwP8DFOB0Hor/kOIAAAAASUVORK5CYII=\n", 31 | "text/plain": [ 32 | "" 33 | ] 34 | }, 35 | "metadata": {}, 36 | "output_type": "display_data" 37 | } 38 | ], 39 | "source": [ 40 | "# Figure 1\n", 41 | "datetime_str = datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M\")\n", 42 | "generated_text = 'Figures generated at: ' + datetime_str\n", 43 | "g = sns.distplot(abundances['eff_length'], kde=False, color=\"b\")\n", 44 | "g.figure.suptitle(generated_text, fontsize=18, fontweight='bold')\n", 45 | "g.figure.savefig(output_folder + 'fig1.png', bbox_inches='tight')" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 50, 51 | "metadata": { 52 | "collapsed": false 53 | }, 54 | "outputs": [ 55 | { 56 | "data": { 57 | "text/plain": [ 58 | "" 59 | ] 60 | }, 61 | "metadata": {}, 62 | "output_type": "display_data" 63 | }, 64 | { 65 | "data": { 66 | "image/png": "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\nIkv8P71uUBXAcrOgAAAAAElFTkSuQmCC\n", 67 | "text/plain": [ 68 | "" 69 | ] 70 | }, 71 | "metadata": {}, 72 | "output_type": "display_data" 73 | } 74 | ], 75 | "source": [ 76 | "# Figure 2\n", 77 | "sns.set(style=\"darkgrid\", color_codes=True)\n", 78 | "g = sns.jointplot(\"length\", \"est_counts\", data=abundances, kind=\"reg\",\n", 79 | " xlim=(800, 2400), ylim=(0, 1000), color=\"r\", size=7)\n", 80 | "g.savefig(output_folder + 'fig2.png', bbox_inches='tight')" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 40, 86 | "metadata": { 87 | "collapsed": false 88 | }, 89 | "outputs": [ 90 | { 91 | "data": { 92 | "image/png": "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\nNkyLj/gZiA9GGYuPcvkHdTYeNTYeNTZeb33EjzUmAADANAgmAADANAgmAADANAgmAADANNiVY5CK\nigp2MhiM3SL+QZ2N53CEauBAh4KDgwMyfkxMbMDGBr6MYGKQZcXvaoA9KtDT6OOaAz2BywR1NlqH\n+wMlJV+tiCH+f6dHY/1RzZQUFxfv97GBsyGYGGSAPUqhjmGBngaAr4mIITGKjCYcAKwxAQAApkEw\nAQAApkEwAQAApkEwAQAApkEwAQAApkEwAQAApkEwAQAApkEwAQAApkEwAQAApuGXYFJdXa2kpCTV\n19d724qKilReXq6EhAS5XC6f6wsLCzV58uQe+ywrK9OsWbOUmZmpiooKSVJnZ6cWLFig22+/XXfd\ndZeampp8fvPss88qJyfHe/zjH/9YWVlZys7O1o9+9CNJUlNTk+bNm6e5c+cqJydHnZ2dkqStW7dq\n9uzZysjIUHFx8aWWAgAA9MBvd0ysVqvy8/PPaA8PD9fu3bvV3d0tSeru7lZtba0sFss5+zp27JhK\nSkq0YcMGrVixQkVFRTp16pTWrVunkSNHqrS0VDNmzNDTTz/t/c2OHTu0Y8cOn36PHDmitWvXqri4\nWM8995wk6Xe/+53S0tK0Zs0aJSQkaP369eru7tby5cu1evVqrV+/XmvXrlVzM98PAQCgt/ktmKSk\npMjhcKi0tNSnPSQkRMnJyaqqqpIkVVZWaty4cT32tWfPHo0dO1YhISGy2WwaPny49u3bp5qaGqWm\npkqSUlNTtXPnTkmfB5CNGzdqwYIF3j6OHz+uEydO6O6779btt9/uvevy9ttva8KECT59BAUF6c9/\n/rMGDRqkpqYmeTwe9evXr1fqAgAA/slvwcRiscjlcmn16tWqq6vzOTdt2jRt2bJFkrR582ZNnz69\nx75aW1tlt9u9x6GhoWptbVVbW5tsNpskadCgQWptbVV7e7sWL16sxYsXKygoSB6PR5J06tQpzZs3\nT08//bR+85vfaOnSpWpsbPTpe9CgQXK73ZKkoKAgbdu2TTNmzFBycrJCQ0N7pzAAAMDLr4tfHQ6H\n8vPzlZeX5w0IkpSYmKi9e/equblZLS0tio6O9jn/ZTabTa2trd7jtrY2hYWFyWazqa2tzdtmt9v1\nxhtv6Pjx47r33nu1dOlSvfnmm3r++ecVFRWl2267TUFBQRo8eLCuvfZaHTx40KfvL/r4wtSpU1VZ\n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\nswMAAL3N1MEkIyNDGRkZgZ4GAADwE15JDwAATINgAgAATINgAgAATINgAgAATINgAgAATINgAgAA\nTINgAgAATMPU7zH5OutwNwR6CgAAA3W4G9T02ccBG7+x/qgUGxOw8Y3CK+kNUlFRoZaW9kBPo09z\nOEKpsR9QZ+NRY+MZVeOhQ4cpODi41/u9UDExsQEd/1/11ivpCSYGamhwB3oKfVpUlJ0a+wF1Nh41\nNh41Nl5vBRPWmAAAANMgmAAAANMgmAAAANMgmAAAANMgmAAAANPgPSYGYbuw8dhi6R/U2Xh9pcZs\nnUVvIJgYZFnxuxpgjwr0NPq45kBP4DJBnY339a9xh7tBSckeRQwJzAu/GuuPaqakuLj4gIyP3kMw\nMcgAe5RCHcMCPQ0A8JuIITGKjCYY4KthjQkAADANggkAADANggkAADANggkAADANggkAADANggkA\nADANggkAADANggkAADANggkAADANvwST6upqJSUlqb6+3ttWVFSk8vJyJSQkyOVy+VxfWFioyZMn\n99hnWVmZZs2apczMTFVUVPic27Ztm3Jzc73HTqdT2dnZcjqdGj9+vJYvX+49d/LkSd1yyy2qrKyU\nJDU1NWnevHmaO3eucnJy1NnZKUl66aWXNH36dM2dO1d//OMfL6UMAADgPPx2x8RqtSo/P/+M9vDw\ncO3evVvd3d2SpO7ubtXW1spisZyzr2PHjqmkpEQbNmzQihUrVFRUpFOnTkmSlixZoieffNLn+pKS\nEhUXF+vRRx/V0KFDdc8993jPLV68WEFB/yzD7373O6WlpWnNmjVKSEjQ+vXr1dTUpKeeekqlpaUq\nKSnRpk2b9Mknn3ylegAAgDP5LZikpKTI4XCotLTUpz0kJETJycmqqqqSJFVWVmrcuHE99rVnzx6N\nHTtWISEhstlsGj58uPbv3y9JSkxMPOMOzBceffRR3XfffRo4cKAkaeXKlUpMTNQ111zjvebtt9/W\nhAkTJEmpqal644039NFHH+naa6+V3W6XxWLRt7/9bf3tb3+7pDoAAIBz81swsVgscrlcWr16terq\n6nzOTZs2TVu2bJEkbd68WdOnT++xr9bWVtntdu9xaGio3G63JOnmm28+62/279+vtrY2paSkSJJ2\n7typI0eOKD09/Zx9Dxo0SK2trYqPj9eBAwfU2NiokydPaufOnTp58uRF/PUAAOBC+PXrwg6HQ/n5\n+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\nMjMz5XQ6tXDhQnV2dkqSXnzxRWVkZGj27Nl65plnJEktLS1KSUlRdna2srOzVVJSIkl6+eWXdeut\ntyo9PV3r1q3rjbIAAIAv8dsr6a1Wq/Lz87Vy5Uqf9vDwcO3evVvd3d0KCgpSd3e3amtrZbFYztnX\nsWPHVFJSovLycnV0dGjOnDm66aab9Ic//EHjxo1Tdna2Dh06pNzcXL344otatGiR1q5dq8GDB2v5\n8uXauHGjJk6cqA0bNmjNmjXq16+ffvOb3+gf//iH3n//fU2bNk0PPfSQz5iPP/64/vznP2vAgAH6\nz//8T02bNk12u92QWgEAcLny26OclJQUORwOlZaW+rSHhIQoOTlZVVVVkqTKykqNGzeux7727Nmj\nsWPHKiQkRDabTcOHD9f+/ft1xx13KDMzU5J0+vRp9e/fX5K0Zs0aDR482Kf9jTfe0KhRo/TAAw/I\n6XQqMTFRwcHBqq2tVW1trZxOp+69914dO3ZMkpSQkKCWlhbv3ZaeghMAALg0fgsmFotFLpdLq1ev\nVl1dnc+5adOmacuWLZKkzZs3a/r06T321dra6nO3IjQ0VG63WzabTVarVQ0NDXrggQeUm5srSYqM\njJQkvfLKK6qurtaMGTPU1NSk3bt3a+nSpXrqqaf0yCOPqLW1VVdddZUWLlyokpISfe9739PixYsl\nSSNGjNCsWbOUlpam7373u7LZbL1WGwAA8Dm/Ln51OBzKz89XXl6ePB6Ptz0xMVF79+5Vc3OzWlpa\nFB0d7XP+y2w2m1pbW73HbW1tCgsLkyTt379fd955p3Jzc5WUlOS9ZtWqVVq1apV+//vfy2q1Kjw8\nXMnJyRo4cKAGDx6sq666SocOHdINN9ygG264QZI0depU7du3T/v371dFRYW2b9+u7du36/jx49q6\ndWtvlwcAgMue33flTJo0SfHx8SovL/dpT01Nlcvl0pQpU87bx+jRo1VTU6Ouri653W4dPHhQI0aM\n0IEDB3TvvffqV7/6lcaPH++9/plnntHbb7+tVatWyeFwSPo8DFVXV6urq0vt7e368MMPFRcXp4ce\nesgbOr543GO32zVw4EBZrVZZLBYNHjxYJ06c6MWqAAAAyY+LX/9VQUGBdu3a5bNOIy0tTenp6Sos\nLJTU8xqOyMhIOZ1OZWVlyePxKCcnR1arVcuXL1dXV5eWLFkij8ejsLAwLV68WL/73e/07//+75o3\n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\nbRulpaUUFRXx73//m6ZNm7oz9BvSnXfeyZYtW4Br57ZVq1bOz/m6deucU+fy0wYPHsyuXbsAt7vY\nSgAACZtJREFU2LRpEy1atFCOf4Eff/yRwYMHM3bsWPr27QtA8+bN9TmuZOXl2ZWfZT3Er5KZS67K\nAUhLS6NRo0ZujurGdPbsWZKTkzl27BhWq5WxY8cSHBzMpEmTOHv2LE2aNCE1NRWLxUJGRgZLlizB\nGMMTTzxBjx493B3+DeHo0aOMHj2axYsXc/jwYSZPnlyh3J4+fZqkpCRycnLw8fEhPT2dW265xd2H\n45EuzfHevXuZPn063t7ehIaGMm3aNAICApTjn2nGjBl8/PHHNG7cGGMMFouFiRMnkpqaqs9xJSov\nz6NGjeK5555zyWdZhYmIiIh4DJ3KEREREY+hwkREREQ8hgoTERER8RgqTERERMRjqDARERERj6HC\nRERERDyGChORG1xmZiYJCQkuHWP27Nls27YNgISEBOcNrFylvDGOHj1Ky5Yt6du3LzExMcTExNC3\nb1/effdd4MLTY7t3787zzz/PunXr6N69O2PHjr3usRMTE50/X7yZ1C/RvXt3jh079ov7uZqdO3fy\nwgsvALB8+XKSk5NdNpZIVfBydwAi8stZLBaX9p+ZmUm7du1cOkZF1K5dm+XLl5e7beXKlaSmptKh\nQwcmTJjAE088wYABA657jIt3FgauOtb1cPV7c/DgwTKPahC50akwEbmJzZ07l//93//F4XDQsWNH\nxowZw9GjRxkxYgRNmzZl37591KxZk1deeYXq1auzatUqZs+ejZ+fH3feeSfnz5/nnnvuYffu3Uya\nNInXXnsNuDA7kZaWRlFRERMnTqRr165lxv3mm2+YPn06p06dIjc3l8cee4z4+Hhee+01srOzOXz4\nMMePH6d///4MGzaM0tJSJk2axJ49ewgLCyM/P/+6jvP1119n586dTJ06lfj4eD777DM2b96MxWKh\nbdu2pKSkkJ+fj5+fH5MmTaJ58+YcO3aM5ORkTpw4gZ+fH9OnTycjIwOAgQMHsmTJEpo1a8bevXvp\n0qULH3zwATVq1KCgoICoqCjWrl3Lhg0bmD17NufPn6d+/fpMnz4du91eJrar3cNy165dpKWlcfr0\naUJCQpg2bRr16tUjISGBu+++m23btpGXl8ekSZPo1KkT2dnZjBkzhsLCQpo2bcqWLVtYuXIlr776\n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\n", 93 | "text/plain": [ 94 | "" 95 | ] 96 | }, 97 | "metadata": {}, 98 | "output_type": "display_data" 99 | } 100 | ], 101 | "source": [ 102 | "# Figure 3\n", 103 | "f, ax = plt.subplots(figsize=(8, 10))\n", 104 | "\n", 105 | "sns.set_color_codes(\"pastel\")\n", 106 | "sns.barplot(x=\"length\", y=\"target_id\", data=abundances,\n", 107 | " label=\"Length\", color=\"b\")\n", 108 | "\n", 109 | "# Plot the crashes where alcohol was involved\n", 110 | "sns.set_color_codes(\"muted\")\n", 111 | "sns.barplot(x=\"eff_length\", y=\"target_id\", data=abundances,\n", 112 | " label=\"Effective Length\", color=\"b\")\n", 113 | "\n", 114 | "\n", 115 | "ax.legend(ncol=2, loc=\"lower right\", frameon=True)\n", 116 | "ax.set(ylabel=\"\",\n", 117 | " xlabel=\"Length and Effective Length\")\n", 118 | "sns.despine(left=True, bottom=True)\n", 119 | "f.savefig(output_folder + 'fig3.png', bbox_inches='tight')" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 39, 125 | "metadata": { 126 | "collapsed": false 127 | }, 128 | "outputs": [ 129 | { 130 | "data": { 131 | "image/png": "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\nzp2rw4cPa9iwYVqzZo3+7//+T3l5ebJYLOe9hs1mk81mkySVl5fr0KFDhBUAADzIK681FxQUyN/f\n32V2JDU1Ve+9957uueceSefOnFzIV487fPiwc3alN+Hh4dq+fbvuv/9+Pf3003r22WcvYwQAAMCT\nTA4WZbjFvY+tkSSNnzBaoeHRXq4G7tZ4/JAmRJoUFWX8f+uwsCCdONHm7TLchvH1b4yv/woLC3Jr\n/x5/JHQ5ysrKtGnTJucsisPhkMlkUm5ursaOHevl6gAAgKcYOrBkZGQoIyPD22UAAAAv49P8AADA\n8AgsAADA8AgsAADA8AgsAADA8AgsAADA8AgsAADA8AgsAADA8Az9HZb+7Iu2E5Kk5r/82cuVwBOa\nGo5JkRHeLgMABiwCi5s8kz1Wra2nNWzY1+Tre2m/i9SfDBkyWM3NHd4uw20ue3yREYqIiHRfQQDw\nT47A4iZ33XXXgP29CGlg/x6GNPDHBwD9DWtYAACA4RFYAACA4RFYAACA4RFYAACA4RFYAACA4fGW\nkJscOHDgkl+LjYiIlK+vr5srAgCg/yKwuMnStZWKvjn+osc1NRzTdElRUdHuLwoAgH6KwOImIaHX\nKTScEAIAQF9gDQsAADA8AgsAADA8AgsAADA8AgsAADA8AgsAADA8AgsAADA8AgsAADA8AgsAADA8\nAgsAADA8j33ptqamRt/73ve0ZcsWXXfddZKkoqIi3XDDDfrRj36kuLg4ORwOdXd3y+FwqKioSNdf\nf/15+3I4HLLb7dq3b5/MZrMWLVqkr3/969q/f7+effZZSVJUVJQWLVokH58vM1lTU5NmzZqlTZs2\nyWw264033tD7778vk8mkU6dOqbGxUVVVVTpy5Ijsdru6u7tlNpu1ZMkSWa1WSdKZM2c0a9YsPfnk\nkxo3bpwH7hoAAJA8PMNiNpuVn59/TntISIiKi4tVUlKitWvXavr06frVr351wX5+97vfqaurS+vW\nrVNubq4WL14sSVq6dKlyc3O1Zs0aSdL27dslSVVVVZozZ45Onjzp7OO73/2uSkpKVFxcrGHDhunl\nl1+WJD377LN64oknVFJSoszMTB0+fNh5zsKFC50BCAAAeI5H//omJSXJarWqtLS01+OOHz+u4ODg\nC+6vra3V+PHjJUljx45VXV2dJOnnP/+54uPj1dXVpRMnTigoKEiS5Ovrq5UrVzpnSv7RO++8I6vV\nqjvuuEOdnZ1qamrSu+++K5vNpk8++URjxoyRJK1YsUJxcXG66aabrmjsAADgynk0sJhMJtntdq1a\ntUr19fXO9paWFmVnZ+u+++7TpEmT1NXVpblz516wn/b2dmcYkSQ/Pz/19PTIZDLp+PHjSk1NVUtL\ni2JjYyVJd9xxh6xWqxwOxzl9vfHGG/rBD37grOPzzz/XuHHjVFJSotbWVm3cuFE7duzQkSNHlJ6e\n3le3AgAAXAaPP9+wWq3Kz89XXl6eM0D87ZHQm2++qdtuu02DBg1SQEDABfuwWCzq6Ohwbvf09Dgf\n1YSHh2vr1q26//77nY+K/sZkMrlsHzhwQFarVV//+teddVgsFt12222SpIkTJ6qurk5vvvmmPv/8\nc9lsNr3//vt6+eWXtXfv3qu/GQAA4JJ4ZUHGxIkTFR0drfLycpd2k8mkhQsX6p133lFlZeUFz4+L\ni3Pu/8Mf/qCRI0dKkh599FEdOXJEkjR48OBz1pt8dYblgw8+cD5akiR/f38NHz5ctbW1kqSPPvpI\nMTEx+slPfqI1a9aopKRE48eP11NPPeWcvQEAAO7nsbeEvqqgoEA7d+48Z9bD399fhYWFys/P1+23\n365rrrnmnHOnTJmi6upqZWZmSpJzJuXhhx/WM888I7PZrICAABUWFrqc99VrHT58WMnJyS5thYWF\nWrhwoXp6enT99dfrqaeeuuqxAgCAq2NynG9hB67a/Ne3KOaW8Rc9rvH4IU2INCkqKtoDVfWdsLAg\nnTjR5u0y3GYgj28gj01ifP0d4+u/wsKCLn7QVfDaDMulWLBggfbv3++cGXE4HDKZTFq+fLnMZrOX\nqwMAAJ5i6MDy4x//2NslAAAAA+AraAAAwPAILAAAwPAILAAAwPAILAAAwPAILAAAwPAILAAAwPAI\nLAAAwPAILAAAwPAM/eG4/qylsUGNxw9d9LimhmNSZIQHKgIAoP8isLjJE7MmqLm54+IHRkYoIiLS\n/QUBANCPEVjcZMSIEQP2B64AAPA01rAAAADDI7AAAADDI7AAAADDI7AAAADDY9Gtmxw4cODS3hLy\nooiISPn6+nq7DAAALorA4iZL11Yq+uZ4b5dxQU0NxzRdUlRUtLdLAQDgoggsbhISep1CwwkDAAD0\nBdawAAAAwyOwAAAAwyOwAAAAwyOwAAAAwyOwAAAAwyOwAAAAwyOwAAAAwyOwAAAAwyOwAAAAw/NI\n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\nEVgAAIDhEVgAAIDhEVgAAIDhEVgAAIDhEVgAAIDhEVgAAIDhEVgAAIDheSSw1NTUKCEhQQ0NDc62\noqIilZeXKzY2Vna73eX4wsJCTZo0qdc+y8rKNGPGDGVmZqqiosJl37Zt25Sbm3vOOa+//rpycnKc\n2y+99JIyMzOVnp6uDRs2uBy7cuVKLVmyxLm9efNmZWRkKCsr65x6AQCAe3lshsVsNis/P/+c9pCQ\nEO3atUs9PT2SpJ6eHtXV1clkMl2wr8bGRpWUlGj9+vVavny5ioqKdPbsWUnSokWLtHTp0nPOqays\nVGVlpbPfDz/8UEePHtW6detUWlqqZcuWqa2tTZ2dnXryySe1du1a57mdnZ165ZVXtHr1aq1Zs0Zt\nbW167733rup+AACAS+exwJKUlCSr1arS0lKXdj8/PyUmJqq6ulqSVFVVpeTk5F772r17t+Lj4+Xn\n5yeLxaLhw4dr3759kqS4uLhzZkDq6+u1YcMGzZs3z9l266236vnnn3du9/T0yM/PT52dnbrvvvv0\n6KOPOveZzWatW7dOZrNZktTd3S1/f//LvwkAAOCKeCywmEwm2e12rVq1SvX19S77pk6dqi1btkj6\n8tFLWlpar321t7crKCjIuR0YGKi2tjZJ0j333ONy7OnTp7VgwQItXLhQPj4+cjgckr4MIUFBQeru\n7lZ+fr7uv/9+BQQEKDg4WMnJyc7j/lb70KFDJUklJSU6c+bMRUMVAADoOx5ddGu1WpWfn6+8vDyX\nQBAXF6c9e/aopaVFra2tCg8Pd9n/VRaLRe3t7c7tjo4OBQcHn/fY6upqnTx5Uo8//rgWL16sDz/8\nUMuWLZMktba26jvf+Y5iYmI0d+7cXmt3OBx68cUXtWPHDv385z+/nGEDAICr5PG3hCZOnKjo6GiV\nl5e7tKekpMhut2vy5MkX7WPMmDGqra1VV1eX2tradPDgQcXExJz32ClTpuitt95ScXGxCgoKlJSU\npLlz5+qLL77Qgw8+qJkzZ+qRRx656DV/9KMf6ezZs3r11Vedj4YAAIBneOW15oKCAvn7+7ssrE1N\nTdV7773nfKTT26Lb0NBQ2Ww2ZWVl6dvf/rZycnIuO0SsW7dOf/7zn1VWViabzabs7GwdO3bsvMd+\n9tln2rhxo/bt2+c89ne/+91lXQ8AAFw5k6O3Zy+4YvNf36KYW8a7tDUeP6QJkSZFRUV7qaq+ExYW\npBMn2rxdhtsM5PEN5LFJjK+/Y3z9V1hY0MUPugp+bu39KpWVlWnTpk3O2RaHwyGTyaTc3FyNHTvW\ny9UBAACuS7teAAAgAElEQVRPMXRgycjIUEZGhrfLAAAAXsan+QEAgOERWAAAgOERWAAAgOERWAAA\ngOERWAAAgOERWAAAgOERWAAAgOERWAAAgOEZ+sNx/VlLY4Majx9yaWtqOCZFRnipIgAA+i8Ci5s8\nMWuCmps7XBsjIxQREemdggAA6McILG4yYsSIAfsDVwAAeBprWAAAgOERWAAAgOERWAAAgOERWAAA\ngOERWAAAgOHxlpCbVFRUKCDAKl9fX2+XctUiIiIHxDgAAP0XgcVN7K/+TuMm3aEh1/bvD8U1NRzT\ndElRUdHeLgUA8E+MwOIm/oFDNeTaCIWG84ceAICrxRoWAABgeAQWAABgeAQWAABgeAQWAABgeAQW\nAABgeAQWAABgeAQWAABgeAQWAABgeAQWAABgeB4JLDU1NUpISFBDQ4OzraioSOXl5YqNjZXdbnc5\nvrCwUJMmTeq1z7KyMs2YMUOZmZmqqKhw2bdt2zbl5uaec87rr7+unJwc5/bGjRuVkZGhmTNn6rXX\nXpMkHT9+XA8++KBsNptsNpsOHz4sSdq+fbtmzpypzMxMbdiw4TJGDwAArpbHZljMZrPy8/PPaQ8J\nCdGuXbvU09MjSerp6VFdXZ1MJtMF+2psbFRJSYnWr1+v5cuXq6ioSGfPnpUkLVq0SEuXLj3nnMrK\nSlVWVjr7PXr0qNavX6/Vq1drw4YNOnv2rLq7u/XKK6/IZrOppKREDz/8sJYsWaLu7m698MILWrly\npfO6TU1NfXFbAADAJfBYYElKSpLValVpaalLu5+fnxITE1VdXS1JqqqqUnJycq997d69W/Hx8fLz\n85PFYtHw4cO1b98+SVJcXNw5Mzb19fXasGGD5s2b52z74IMPNHr0aD399NOy2WyKi4uTn5+fnnnm\nGU2YMEGS1N3dLbPZrAMHDigqKkoWi0WDBg1SfHy8Pvroo6u9JQAA4BJ5LLCYTCbZ7XatWrVK9fX1\nLvumTp2qLVu2SJI2b96stLS0Xvtqb29XUFCQczswMFBtbW2SpHvuucfl2NOnT2vBggVauHChfHz+\nPtzm5mbt2rVLixcv1iuvvKLnnntO7e3tCgkJka+vrw4ePKiXX35ZP/jBD8653uDBg53XAwAA7ufR\nRbdWq1X5+fnKy8uTw+FwtsfFxWnPnj1qaWlRa2urwsPDXfZ/lcViUXt7u3O7o6NDwcHB5z22urpa\nJ0+e1OOPP67Fixdr586dWrZsmUJCQpSYmKiAgAANHTpUI0aM0KFDhyRJO3fu1A9/+EO9/PLLGj58\n+GVdDwAA9D2PvyU0ceJERUdHq7y83KU9JSVFdrtdkydPvmgfY8aMUW1trbq6utTW1qaDBw8qJibm\nvMdOmTJFb731loqLi1VQUKCkpCTNnTtXcXFxqqmpUVdXl06fPu187LNz5049//zzWr58uW6++WZJ\n0ogRI3TkyBGdOnVKXV1d+uijj3TLLbdc/c0AAACXxM8bFy0oKNDOnTtdFtampqYqPT1dhYWFktTr\notvQ0FDZbDZlZWXJ4XAoJydHZrP5smoYOXKk860fSfr+97+v4OBgLV68WN3d3c5ZoBtuuEELFizQ\nM888o4ceekgOh0Pp6em69tprr2DkAADgSpgcvT17wRX75reX6P+l3a3Q8Ghvl3JVGo8f0oRIk6Ki\nXMcRFhakEycG7jqegTy+gTw2ifH1d4yv/woLC7r4QVfBKzMsl6qsrEybNm1yzrY4HA6ZTCbl5uZq\n7NixXq4OAAB4iqEDS0ZGhjIyMrxdBgAA8DI+zQ8AAAyPwAIAAAyPwAIAAAyPwAIAAAyPwAIAAAyP\nwAIAAAyPwAIAAAzP0N9h6c86Tzep+S9/9nYZV62p4ZgUGeHtMgAA/+QILG5i/95kBQRY5et74d9E\n6hciIxQREentKgAA/+QILG5y1113DdjfiwAAwNNYwwIAAAyPwAIAAAyPwAIAAAyPwAIAAAyPwAIA\nAAyPt4Tc5MCBA2pu7nBpi4iIlK+vr5cqAgCg/yKwuMnStZWKvjneud3UcEzTJUVFRXuvKAAA+ikC\ni5uEhF6n0HDCCQAAfYE1LAAAwPAILAAAwPAILAAAwPAILAAAwPAILAAAwPAILAAAwPAILAAAwPAI\nLAAAwPAILAAAwPA8ElhqamqUkJCghoYGZ1tRUZHKy8sVGxsru93ucnxhYaEmTZrUa59lZWWaMWOG\nMjMzVVFR4bJv27Ztys3NdW7bbDZlZ2fLZrNp3LhxWrJkiXPfmTNndO+996qqqkqS1NzcrDlz5mj2\n7NnKyclRZ2enJOmtt95SWlqaZs+erV//+tdXchsAAMAV8tgMi9lsVn5+/jntISEh2rVrl3p6eiRJ\n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\nAHAxHgssJpNJdrtdq1atUn19vcu+qVOnasuWLZKkzZs3Ky0trde+2tvbFRQU5NwODAxUW1ubJOme\ne+455/iYmBg98sgjmjp1qr72ta9pxIgRGjVqlN5//311d3fr6NGj2r9/v06fPq0RI0boscceU0lJ\nie6++24999xzkiQfHx9t27ZN06ZNU2JiogIDA6/qfgAAgEvn0UW3VqtV+fn5ysvLk8PhcLbHxcVp\nz549amlpUWtrq8LDw132f5XFYlF7e7tzu6OjQ8HBwec9tq2tTW+88Yb++7//W++8844iIyO1YsUK\n3XnnnUpISFB2draWLVum0aNHa8iQIbr99tt1++23S5KmTJmivXv3OvuaMmWKqqqq1NXVpbfeeutq\nbwcAALhEHn9LaOLEiYqOjlZ5eblLe0pKiux2uyZPnnzRPsaMGaPa2lp1dXWpra1NBw8eVExMzHmP\n9ff31+DBgxUQECBJCgsLU2trqw4fPqxhw4ZpzZo1+t73vicfHx9ZLBbNnz9fW7dulfTlYt3Ro0er\nvb1dNptNXV1dkqSAgIBe19gAAIC+5bFFt/+ooKBAO3fudPmjn5qaqvT0dBUWFkpSr4EgNDRUNptN\nWVlZcjgcysnJkdlsPu+xZrNZeXl5euihh+Tv76/g4GC98MIL8vf315IlS7R27Vr5+/vrxz/+sSQp\nNzdXBQUFWrt2rQIDA1VYWCiLxaK0tDTNnj1bgwYN0k033aRp06b14R0BAAC9MTl6e/aCKzb/9S2K\nuWW8x67XePyQJkSaFBUV7ZHrhYUF6cSJNo9cyxsG8vgG8tgkxtffMb7+Kyws6OIHXQWvzLBcqrKy\nMm3atMk52+JwOGQymZSbm6uxY8d6uToAAOAphg4sGRkZysjI8HYZAADAy/g0PwAAMDwCCwAAMDwC\nCwAAMDwCCwAAMDwCCwAAMDwCCwAAMDwCCwAAMDwCCwAAMDxDfziuP2tpbFDj8UMeu15TwzEpMsJj\n1wMAwJMILG7yxKwJam7u8NwFIyMUERHpuesBAOBBBBY3GTFixID9gSsAADyNNSwAAMDwCCwAAMDw\nCCwAAMDwCCwAAMDwWHTrJhUVFWptPX1O+7BhX5Ovr68XKupbp04N9uxbUB42kMc3kMcmMb7+jvF5\nTkREZL/6e2RyOBwObxcxEP3bQz/VNUFhLm1ftJ1QQuKNGnIt30sBAHhPU8MxTb8tQlFR0X3WZ1hY\n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\n", 132 | "text/plain": [ 133 | "" 134 | ] 135 | }, 136 | "metadata": {}, 137 | "output_type": "display_data" 138 | } 139 | ], 140 | "source": [ 141 | "# Figure 4\n", 142 | "f, ax = plt.subplots(figsize=(8, 10))\n", 143 | "\n", 144 | "sns.set_color_codes(\"pastel\")\n", 145 | "sns.barplot(x=\"tpm\", y=\"target_id\", data=abundances,\n", 146 | " label=\"TPM\", color=\"b\")\n", 147 | "\n", 148 | "# Plot the crashes where alcohol was involved\n", 149 | "sns.set_color_codes(\"muted\")\n", 150 | "sns.barplot(x=\"est_counts\", y=\"target_id\", data=abundances,\n", 151 | " label=\"Estimated Counts\", color=\"b\")\n", 152 | "\n", 153 | "\n", 154 | "ax.legend(ncol=2, loc=\"lower right\", frameon=True)\n", 155 | "ax.set(ylabel=\"\",\n", 156 | " xlabel=\"Counts and Transcripts Per Million\")\n", 157 | "sns.despine(left=True, bottom=True)\n", 158 | "f.savefig(output_folder + 'fig4.png', bbox_inches='tight')" 159 | ] 160 | } 161 | ], 162 | "metadata": { 163 | "kernelspec": { 164 | "display_name": "Python 3", 165 | "language": "python", 166 | "name": "python3" 167 | }, 168 | "language_info": { 169 | "codemirror_mode": { 170 | "name": "ipython", 171 | "version": 3 172 | }, 173 | "file_extension": ".py", 174 | "mimetype": "text/x-python", 175 | "name": "python", 176 | "nbconvert_exporter": "python", 177 | "pygments_lexer": "ipython3", 178 | "version": "3.5.1" 179 | } 180 | }, 181 | "nbformat": 4, 182 | "nbformat_minor": 0 183 | } 184 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2016 Trustees of the University of Pennsylvania 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions 6 | are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright 12 | notice, this list of conditions and the following disclaimer in the 13 | documentation and/or other materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its 16 | contributors may be used to endorse or promote products derived 17 | from this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 22 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 23 | COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 24 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 25 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 26 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 29 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 | POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | title: Continuous Analysis 2 | description: Computational reproducibility using Continuous Integration to produce verifiable end-to-end runs of scientific analysis. 3 | show_downloads: false 4 | google_analytics: UA-93577302-1 5 | theme: jekyll-theme-minimal 6 | -------------------------------------------------------------------------------- /docs/configuration.md: -------------------------------------------------------------------------------- 1 | We consider 3 configurations of continuous analysis: 2 | 3 | 1. Installing a personal local continuous integration service. 4 | 5 | 2. Using a full service continuous integration service. 6 | * Shippable ([Shippable](https://app.shippable.com/)) 7 | * wercker ([wercker](http://wercker.com/)) 8 | * Many other CI services are docker compatible including [Codeship](https://codeship.com/), [Travis CI](https://travis-ci.org/), [CircleCI](https://circleci.com/) and several others 9 | 10 | 3. Provisioning a personal continuous integration service in the cloud. 11 | * [Digital Ocean](https://www.digitalocean.com/) 12 | * [Amazon Web Services](http://aws.amazon.com/) 13 | * [Google Cloud Platform](https://cloud.google.com/) 14 | 15 | Using a full service continuous integration service requires the least set up time but cannot handle computational intensive work. Local continuous integration can be used at no cost, and configured to take advantage of institutional clusters or GPU computing. Continuous integration in the cloud offers elastic computing resources with the ability to scale up or down depending on the computational complexity of your work. 16 | 17 | ### .drone.yml Example Configuration 18 | 19 | Each of the local and cloud implementations uses a common .drone.yml format. See [here](https://github.com/greenelab/continuous_analysis/blob/master/.drone.yml) for a full example. 20 | 21 | ~~~ 22 | # choose the base docker image 23 | image: brettbj/continuous_analysis_base 24 | script: 25 | # run tests 26 | # perform analysis 27 | 28 | # publish results 29 | publish: 30 | docker: 31 | # docker details 32 | ~~~ 33 | 34 | ### Example 1 - Local/Private Cluster CI service 35 | 36 | [Drone](https://github.com/drone/drone) is a CI platform built on container technology. It can be used to easily run a local or private cluster based CI service. Instructions adapted from - [http://readme.drone.io/setup/overview/](http://readme.drone.io/setup/overview/) 37 | 38 | 1.) Install Docker on host machine - [Linux](https://docs.docker.com/linux/), [Mac](https://docs.docker.com/mac/), [Windows](https://docs.docker.com/windows/) 39 | 40 | 2.) Pull the drone image via docker 41 | 42 | ~~~ 43 | sudo docker pull drone/drone:0.4 44 | ~~~ 45 | 46 | 3.) Create a new application at - https://github.com/settings/developers - with your hosts ip address in the homepage URL and the authorization callback followed by /authorize/ 47 | 48 | ~~~ 49 | Homepage URL: http://YOUR-IP-HERE/ 50 | Callback URL: http://YOUR-IP-HERE/authorize/ 51 | ~~~ 52 | 53 | Drawing 54 | 55 | 4.) Add a webhook in to notify the continuous integration server of any updates pushed to the repository. 56 | 57 | Drawing 58 | 59 | The payload URL should be in the format of your-ip/api/hook/github.com/client-id 60 | 61 | 5.) Create a configuration file at (/etc/drone/dronerc), filling in the client 62 | 63 | ~~~ 64 | REMOTE_DRIVER=github 65 | REMOTE_CONFIG=https://github.com?client_id=....&client_secret=.... 66 | ~~~ 67 | 68 | 6.) Create and run your drone container 69 | 70 | ~~~ 71 | sudo docker run \ 72 | --volume /var/lib/drone:/var/lib/drone \ 73 | --volume /var/run/docker.sock:/var/run/docker.sock \ 74 | --env-file /etc/drone/dronerc \ 75 | --restart=always \ 76 | --publish=80:8000 \ 77 | --detach=true \ 78 | --name=drone \ 79 | drone/drone:0.4 80 | ~~~ 81 | 82 | 6.) Access the drone control panel - your-ip-address/login and press the github button. 83 | 84 | 85 | ### Example 2 - Full service - Shippable 86 | 87 | Shippable is the only example shown that does not rely on the [open source drone project](https://github.com/drone/drone) 88 | 89 | 1.) Sign in to [Shippable](https://app.shippable.com/) using Github 90 | 91 | 2.) Select the account owner for your repository in the Subscriptions dropdown, click the enable project button for the desired project. 92 | 93 | 3.) Add a shippable.yml file to the root of your repository 94 | * First pull in your base docker image 95 | 96 | ~~~yaml 97 | pre_ci_boot: 98 | image_name: brettbj/continuous_analysis_base 99 | image_tag: latest 100 | pull: true 101 | options: "-e HOME=/root" 102 | ~~~ 103 | 104 | 105 | * Then run any unit tests and/or integration tests you have 106 | 107 | ~~~yaml 108 | ci: 109 | - cd /root/src/github.com/greenelab/continuous_analysis 110 | - nose2 --plugin nose2.plugins.junitxml --junit-xml test 111 | - mv nose2-junit.xml shippable/testresults/tests.xml 112 | - coverage run --branch test.py 113 | - coverage xml -o shippable/codecoverage/coverage.xml test.py 114 | ~~~ 115 | 116 | * If that passes, re-run your analysis 117 | 118 | ~~~yaml 119 | # run kallisto on a few simple tests 120 | - cd /kallisto/test 121 | - kallisto index -i transcripts.idx transcripts.fasta.gz 122 | - kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz 123 | - cp -R /kallisto/test/output /root/src/github.com/greenelab/continuous_analysis/shippable/output 124 | 125 | # plot the results from a jupyter notebook 126 | - cd /root/src/github.com/greenelab/continuous_analysis 127 | - jupyter nbconvert --to html --execute ./Shippable_Plotting.ipynb 128 | ~~~ 129 | 130 | 131 | 4.) Push completed Results - 132 | 133 | * Push results back to github (create a variable $git_publish_key holding a git deploy key to perform this) - 134 | 135 | ~~~yaml 136 | - git config user.email "brettbj@gmail.com" 137 | - git config user.name "Brett Beaulieu-Jones" 138 | - git config --global push.default simple 139 | - git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 140 | 141 | - git checkout master 142 | - git pull 143 | - git add shippable/. 144 | - git commit -a -m "Shippable output [CI SKIP] [SKIP CI] ." 145 | - git stash 146 | - git push 147 | ~~~ 148 | 149 | * To push a docker image containing the completed results enable an integration with dockerhub. From your project page in shippable, go to the settings tab. In the hub integration dropdown, choose create integration and follow the instructions. Add code resembling the following to your shippable.yml file: 150 | 151 | ~~~yaml 152 | post_ci: 153 | - docker build -t brettbj/continuous_analysis . 154 | - docker push brettbj/daps:latest 155 | ~~~ 156 | 157 | 158 | 159 | ### Example 3 - Full service - wercker 160 | 161 | * Pull in docker image 162 | 163 | ~~~yaml 164 | box: brettbj/continuous_analysis_base 165 | ~~~ 166 | 167 | * Run any unit tests or integration tests you have 168 | 169 | ~~~yaml 170 | build: 171 | steps: 172 | - script: 173 | name: Run Tests + Coverage 174 | code: | 175 | nose2 --plugin nose2.plugins.junitxml --junit-xml test 176 | mkdir wercker 177 | mv nose2-junit.xml wercker/tests.xml 178 | coverage run --branch test.py 179 | coverage xml -o wercker/coverage.xml test.py 180 | ~~~ 181 | 182 | * Run analysis 183 | 184 | ~~~yaml 185 | - script: 186 | name: Run Kallisto 187 | code: | 188 | cd /kallisto/test 189 | kallisto index -i transcripts.idx transcripts.fasta.gz &>- 190 | kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz &>- 191 | cp -R /kallisto/test/output /pipeline/source/wercker/output 192 | ~~~ 193 | 194 | * Plot figures 195 | 196 | ~~~yaml 197 | - script: 198 | name: Plot Results 199 | code: | 200 | cd /pipeline/source 201 | jupyter nbconvert --to html --execute ./Wercker_Plotting.ipynb 202 | ~~~ 203 | 204 | * Create a personal access token in github (Personal settings -> Personal access tokens -> generate new token -> give it repo access) 205 | 206 | * Set an environment variable in Wercker to push results to github. Go to settings, environment variables (example used git_publish_key, the url in wercker.yml is then - https://{TOKEN}@github.com/{ACCOUNT}/{REPOSITORY}.git) 207 | 208 | * Push results to github 209 | 210 | ~~~yaml 211 | - script: 212 | name: Push Results back to github 213 | code: | 214 | git config user.email "brettbj@gmail.com" 215 | git config user.name "Brett Beaulieu-Jones" 216 | git config --global push.default simple 217 | git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 218 | 219 | git checkout master 220 | git pull 221 | git add wercker/. 222 | git commit -a -m "Wercker output [CI SKIP] [SKIP CI] ." 223 | git stash 224 | git push 225 | ~~~ 226 | 227 | 228 | ### Example 4 - Private Cloud CI service - Digital Ocean 229 | 230 | DigitalOcean provides an extremely easy way to start a cloud-based private continuous integration service. Instructions below were adapted from [here](https://www.digitalocean.com/community/tutorials/how-to-use-the-drone-one-click-application-image). 231 | 232 | 1.) Create a drone droplet, selecting Drone on Ubuntu 14.04 from the applications tab. 233 | 234 | 2.) Create a new application at - https://github.com/settings/developers - with your hosts ip address in the homepage URL and the authorization callback followed by /api/auth/github.com 235 | 236 | ~~~ 237 | Homepage URL: http://YOUR-IP-HERE/ 238 | Callback URL: http://YOUR-IP-HERE/api/auth/github.com 239 | ~~~ 240 | 241 | 3.) Take note of the Client ID and Client Secret and log into your new droplet via ssh. You'll be asked a few questions, for simplest configuration choose automatic configuration. You'll be prompted to choose your code repository and enter your Client ID and Client secret. 242 | 243 | 4.) You're ready to start by going to: http://YOUR-IP-HERE/login 244 | 245 | ### Example 5 - Private Cloud CI service - AWS 246 | 247 | Instructions adapted from [here](http://tleyden.github.io/blog/2016/02/15/setting-up-a-self-hosted-drone-dot-io-ci-server/). 248 | 249 | 1.) Log into the AWS and launch an Ubuntu image based off the Amazon provided AMI (ami-9abea4fb). 250 | 251 | 2.) SSH into the created instance - 252 | 253 | ~~~ 254 | ssh ubuntu@ 255 | ~~~ 256 | 257 | 3.) [Install Docker](https://docs.docker.com/engine/installation/linux/ubuntulinux/) 258 | 259 | 4.) Create a new application at - https://github.com/settings/developers - with the ec2 application url in the homepage URL and the authorization callback followed by /authorize/ 260 | 261 | ~~~ 262 | Homepage URL: http://YOUR-IP-HERE/ 263 | Callback URL: http://YOUR-IP-HERE/authorize/ 264 | ~~~ 265 | 266 | 5.) Create a configuration file at (/etc/drone/dronerc), filling in the client info - 267 | 268 | ~~~ 269 | REMOTE_DRIVER=github 270 | REMOTE_CONFIG=https://github.com?client_id=....&client_secret=.... 271 | ~~~ 272 | 273 | 6.) Run the Drone Docker container 274 | 275 | ~~~ 276 | sudo docker run \ 277 | --volume /var/lib/drone:/var/lib/drone \ 278 | --volume /var/run/docker.sock:/var/run/docker.sock \ 279 | --env-file /etc/drone/dronerc \ 280 | --restart=always \ 281 | --publish=80:8000 \ 282 | --detach=true \ 283 | --name=drone \ 284 | drone/drone:0.4 285 | ~~~ 286 | 287 | 7.) Adjust your EC2 AWS Security settings to allow 288 | inbound visitors. Do this by going to the instance details for your EC2 instance and clicking on the security group. Choose the inbound tab, edit and add a listener on port 80, with source 0.0.0.0. 289 | 290 | 8.) Go to your EC2 instances adddress and you should now be able to log in. 291 | 292 | 293 | ### Example 6 - Private Cloud CI service - Google 294 | 295 | 1.) Log into google cloud platform, and create a new VM instance under compute engine. 296 | 297 | 2.) SSH into the new vm instance (this can be done via the browser) 298 | 299 | 3.) [Install Docker](https://docs.docker.com/engine/installation/linux/ubuntulinux/) 300 | 301 | 4.) Create a new application at - https://github.com/settings/developers - with the compute engine instance ip in the homepage URL and the authorization callback followed by /authorize/ 302 | 303 | ~~~ 304 | Homepage URL: http://YOUR-IP-HERE/ 305 | Callback URL: http://YOUR-IP-HERE/authorize/ 306 | ~~~ 307 | 308 | 5.) Create a configuration file at (/etc/drone/dronerc), filling in the client info - 309 | 310 | ~~~ 311 | REMOTE_DRIVER=github 312 | REMOTE_CONFIG=https://github.com?client_id=....&client_secret=.... 313 | ~~~ 314 | 315 | 6.) Run the Drone Docker container 316 | 317 | ~~~ 318 | sudo docker run \ 319 | --volume /var/lib/drone:/var/lib/drone \ 320 | --volume /var/run/docker.sock:/var/run/docker.sock \ 321 | --env-file /etc/drone/dronerc \ 322 | --restart=always \ 323 | --publish=80:8000 \ 324 | --detach=true \ 325 | --name=drone \ 326 | drone/drone:0.4 327 | ~~~ 328 | -------------------------------------------------------------------------------- /docs/images/continuous_analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/docs/images/continuous_analysis.png -------------------------------------------------------------------------------- /docs/images/significant_genes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/docs/images/significant_genes.png -------------------------------------------------------------------------------- /docs/readme.md: -------------------------------------------------------------------------------- 1 | # Continuous Analysis 2 | 3 | [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) 4 | 5 | This repository presents Continuous Analysis, a process demonstrating computational reproducibility by producing verifiable end-to-end runs of computational research. The process is described in detail in: [Nature Biotechnology](http://www.nature.com/nbt/journal/vaop/ncurrent/full/nbt.3780.html) and [Biorxiv Preprint](http://dx.doi.org/10.1101/056473). 6 | 7 | * [The Problem](#problem) 8 | * [The Solution](#solution) 9 | * [Examples](#examples) 10 | * [Configuring Continuous Analysis](#configuration) 11 | * [Feedback](#feedback) 12 | * [Acknowledgements](#acknowledgements) 13 | 14 | ## The Problem 15 | 16 | Scientific Research often involves complex workflows that can be challenging to reproduce. These workflows often have many dependencies. Even when authors release source code and data, readers may have differing versions of dependencies. These differences can cause significant differences of results. 17 | 18 | Drawing 19 | 20 | ## The Solution 21 | 22 | Continuous analysis extends Docker and Continuous integration to re-run scientific analysis after any source code or data changes. Continuous Analysis generates: 23 | 24 | * A base docker container for readers to re-perform analysis on their own or perform their own analyses in a matching computational environment. 25 | * Regenerated figures are pushed back to github, providing the ability to track changes synchronized to the code that generated them over time. 26 | * Logs of the analysis performed. This provides an "audit" of exactly what was performed and can provide intermediate results even when data cannot be shared. 27 | * The final docker container for readers to examine the results or extend the analysis. 28 | 29 | Drawing 30 | 31 | ## Examples 32 | 33 | Examples and real applications of continuous analysis are available: 34 | 35 | * RNA-seq Analysis: 36 | * Using [Salmon](https://github.com/COMBINE-lab/continuous_analysis_rnaseq) (and Drone v0.5) 37 | * Using [Kallisto](https://github.com/greenelab/continuous_analysis_rnaseq) 38 | * [Phylogenetic Tree Building](https://github.com/greenelab/continuous_analysis_phylo) 39 | * [Microarray Differential Expression Analysis](https://github.com/greenelab/continuous_analysis_brainarray) - example from Continuous Analysis Paper 40 | * [EHR Imputation](https://github.com/epistasislab/imputation) 41 | * [Privacy-preserving generative deep neural networks support clinical data sharing](https://github.com/greenelab/SPRINT_gan) 42 | * [Denoising Autoencoders for Phenotype Stratification](https://github.com/greenelab/DAPS) 43 | 44 | ## Configuration 45 | 46 | We consider 3 configurations of continuous analysis: 47 | 48 | 1. Installing a personal local continuous integration service. 49 | 50 | 2. Using a full service continuous integration service. 51 | * Shippable ([Shippable](https://app.shippable.com/)) 52 | * wercker ([wercker](http://wercker.com/)) 53 | * Many other CI services are docker compatible including [Codeship](https://codeship.com/), [Travis CI](https://travis-ci.org/), [CircleCI](https://circleci.com/) and several others 54 | 55 | 3. Provisioning a personal continuous integration service in the cloud. 56 | * [Digital Ocean](https://www.digitalocean.com/) 57 | * [Amazon Web Services](http://aws.amazon.com/) 58 | * [Google Cloud Platform](https://cloud.google.com/) 59 | 60 | Using a full service continuous integration service requires the least set up time but cannot handle computational intensive work. Local continuous integration can be used at no cost, and configured to take advantage of institutional clusters or GPU computing. Continuous integration in the cloud offers elastic computing resources with the ability to scale up or down depending on the computational complexity of your work. 61 | 62 | ### .drone.yml Example Configuration 63 | 64 | Each of the local and cloud implementations uses a common .drone.yml format. See [here](https://github.com/greenelab/continuous_analysis/blob/master/.drone.yml) for a full example. 65 | 66 | ~~~ 67 | # choose the base docker image 68 | image: brettbj/continuous_analysis_base 69 | script: 70 | # run tests 71 | # perform analysis 72 | 73 | # publish results 74 | publish: 75 | docker: 76 | # docker details 77 | ~~~ 78 | 79 | ### Example 1 - Local/Private Cluster CI service 80 | 81 | [Drone](https://github.com/drone/drone) is a CI platform built on container technology. It can be used to easily run a local or private cluster based CI service. Instructions adapted from - [http://readme.drone.io/setup/overview/](http://readme.drone.io/setup/overview/) 82 | 83 | 1.) Install Docker on host machine - [Linux](https://docs.docker.com/linux/), [Mac](https://docs.docker.com/mac/), [Windows](https://docs.docker.com/windows/) 84 | 85 | 2.) Pull the drone image via docker 86 | 87 | ~~~ 88 | sudo docker pull drone/drone:0.4 89 | ~~~ 90 | 91 | 3.) Create a new application at - https://github.com/settings/developers - with your hosts ip address in the homepage URL and the authorization callback followed by /authorize/ 92 | 93 | ~~~ 94 | Homepage URL: http://YOUR-IP-HERE/ 95 | Callback URL: http://YOUR-IP-HERE/authorize/ 96 | ~~~ 97 | 98 | 99 | 100 | 4.) Add a webhook in to notify the continuous integration server of any updates pushed to the repository. 101 | 102 | Drawing 103 | 104 | The payload URL should be in the format of your-ip/api/hook/github.com/client-id 105 | 106 | 5.) Create a configuration file at (/etc/drone/dronerc), filling in the client 107 | 108 | ~~~ 109 | REMOTE_DRIVER=github 110 | REMOTE_CONFIG=https://github.com?client_id=....&client_secret=.... 111 | ~~~ 112 | 113 | 6.) Create and run your drone container 114 | 115 | ~~~ 116 | sudo docker run \ 117 | --volume /var/lib/drone:/var/lib/drone \ 118 | --volume /var/run/docker.sock:/var/run/docker.sock \ 119 | --env-file /etc/drone/dronerc \ 120 | --restart=always \ 121 | --publish=80:8000 \ 122 | --detach=true \ 123 | --name=drone \ 124 | drone/drone:0.4 125 | ~~~ 126 | 127 | 6.) Access the drone control panel - your-ip-address/login and press the github button. 128 | 129 | 130 | ### Example 2 - Full service - Shippable 131 | 132 | Shippable is the only example shown that does not rely on the [open source drone project](https://github.com/drone/drone) 133 | 134 | 1.) Sign in to [Shippable](https://app.shippable.com/) using Github 135 | 136 | 2.) Select the account owner for your repository in the Subscriptions dropdown, click the enable project button for the desired project. 137 | 138 | 3.) Add a shippable.yml file to the root of your repository 139 | * First pull in your base docker image 140 | 141 | ~~~yaml 142 | pre_ci_boot: 143 | image_name: brettbj/continuous_analysis_base 144 | image_tag: latest 145 | pull: true 146 | options: "-e HOME=/root" 147 | ~~~ 148 | 149 | 150 | * Then run any unit tests and/or integration tests you have 151 | 152 | ~~~yaml 153 | ci: 154 | - cd /root/src/github.com/greenelab/continuous_analysis 155 | - nose2 --plugin nose2.plugins.junitxml --junit-xml test 156 | - mv nose2-junit.xml shippable/testresults/tests.xml 157 | - coverage run --branch test.py 158 | - coverage xml -o shippable/codecoverage/coverage.xml test.py 159 | ~~~ 160 | 161 | * If that passes, re-run your analysis 162 | 163 | ~~~yaml 164 | # run kallisto on a few simple tests 165 | - cd /kallisto/test 166 | - kallisto index -i transcripts.idx transcripts.fasta.gz 167 | - kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz 168 | - cp -R /kallisto/test/output /root/src/github.com/greenelab/continuous_analysis/shippable/output 169 | 170 | # plot the results from a jupyter notebook 171 | - cd /root/src/github.com/greenelab/continuous_analysis 172 | - jupyter nbconvert --to html --execute ./Shippable_Plotting.ipynb 173 | ~~~ 174 | 175 | 176 | 4.) Push completed Results - 177 | 178 | * Push results back to github (create a variable $git_publish_key holding a git deploy key to perform this) - 179 | 180 | ~~~yaml 181 | - git config user.email "brettbj@gmail.com" 182 | - git config user.name "Brett Beaulieu-Jones" 183 | - git config --global push.default simple 184 | - git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 185 | 186 | - git checkout master 187 | - git pull 188 | - git add shippable/. 189 | - git commit -a -m "Shippable output [CI SKIP] [SKIP CI] ." 190 | - git stash 191 | - git push 192 | ~~~ 193 | 194 | * To push a docker image containing the completed results enable an integration with dockerhub. From your project page in shippable, go to the settings tab. In the hub integration dropdown, choose create integration and follow the instructions. Add code resembling the following to your shippable.yml file: 195 | 196 | ~~~yaml 197 | post_ci: 198 | - docker build -t brettbj/continuous_analysis . 199 | - docker push brettbj/daps:latest 200 | ~~~ 201 | 202 | 203 | 204 | ### Example 3 - Full service - wercker 205 | 206 | * Pull in docker image 207 | 208 | ~~~yaml 209 | box: brettbj/continuous_analysis_base 210 | ~~~ 211 | 212 | * Run any unit tests or integration tests you have 213 | 214 | ~~~yaml 215 | build: 216 | steps: 217 | - script: 218 | name: Run Tests + Coverage 219 | code: | 220 | nose2 --plugin nose2.plugins.junitxml --junit-xml test 221 | mkdir wercker 222 | mv nose2-junit.xml wercker/tests.xml 223 | coverage run --branch test.py 224 | coverage xml -o wercker/coverage.xml test.py 225 | ~~~ 226 | 227 | * Run analysis 228 | 229 | ~~~yaml 230 | - script: 231 | name: Run Kallisto 232 | code: | 233 | cd /kallisto/test 234 | kallisto index -i transcripts.idx transcripts.fasta.gz &>- 235 | kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz &>- 236 | cp -R /kallisto/test/output /pipeline/source/wercker/output 237 | ~~~ 238 | 239 | * Plot figures 240 | 241 | ~~~yaml 242 | - script: 243 | name: Plot Results 244 | code: | 245 | cd /pipeline/source 246 | jupyter nbconvert --to html --execute ./Wercker_Plotting.ipynb 247 | ~~~ 248 | 249 | * Create a personal access token in github (Personal settings -> Personal access tokens -> generate new token -> give it repo access) 250 | 251 | * Set an environment variable in Wercker to push results to github. Go to settings, environment variables (example used git_publish_key, the url in wercker.yml is then - https://{TOKEN}@github.com/{ACCOUNT}/{REPOSITORY}.git) 252 | 253 | * Push results to github 254 | 255 | ~~~yaml 256 | - script: 257 | name: Push Results back to github 258 | code: | 259 | git config user.email "brettbj@gmail.com" 260 | git config user.name "Brett Beaulieu-Jones" 261 | git config --global push.default simple 262 | git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 263 | 264 | git checkout master 265 | git pull 266 | git add wercker/. 267 | git commit -a -m "Wercker output [CI SKIP] [SKIP CI] ." 268 | git stash 269 | git push 270 | ~~~ 271 | 272 | 273 | ### Example 4 - Private Cloud CI service - Digital Ocean 274 | 275 | DigitalOcean provides an extremely easy way to start a cloud-based private continuous integration service. Instructions below were adapted from [here](https://www.digitalocean.com/community/tutorials/how-to-use-the-drone-one-click-application-image). 276 | 277 | 1.) Create a drone droplet, selecting Drone on Ubuntu 14.04 from the applications tab. 278 | 279 | 2.) Create a new application at - https://github.com/settings/developers - with your hosts ip address in the homepage URL and the authorization callback followed by /api/auth/github.com 280 | 281 | ~~~ 282 | Homepage URL: http://YOUR-IP-HERE/ 283 | Callback URL: http://YOUR-IP-HERE/api/auth/github.com 284 | ~~~ 285 | 286 | 3.) Take note of the Client ID and Client Secret and log into your new droplet via ssh. You'll be asked a few questions, for simplest configuration choose automatic configuration. You'll be prompted to choose your code repository and enter your Client ID and Client secret. 287 | 288 | 4.) You're ready to start by going to: http://YOUR-IP-HERE/login 289 | 290 | ### Example 5 - Private Cloud CI service - AWS 291 | 292 | Instructions adapted from [here](http://tleyden.github.io/blog/2016/02/15/setting-up-a-self-hosted-drone-dot-io-ci-server/). 293 | 294 | 1.) Log into the AWS and launch an Ubuntu image based off the Amazon provided AMI (ami-9abea4fb). 295 | 296 | 2.) SSH into the created instance - 297 | 298 | ~~~ 299 | ssh ubuntu@ 300 | ~~~ 301 | 302 | 3.) [Install Docker](https://docs.docker.com/engine/installation/linux/ubuntulinux/) 303 | 304 | 4.) Create a new application at - https://github.com/settings/developers - with the ec2 application url in the homepage URL and the authorization callback followed by /authorize/ 305 | 306 | ~~~ 307 | Homepage URL: http://YOUR-IP-HERE/ 308 | Callback URL: http://YOUR-IP-HERE/authorize/ 309 | ~~~ 310 | 311 | 5.) Create a configuration file at (/etc/drone/dronerc), filling in the client info - 312 | 313 | ~~~ 314 | REMOTE_DRIVER=github 315 | REMOTE_CONFIG=https://github.com?client_id=....&client_secret=.... 316 | ~~~ 317 | 318 | 6.) Run the Drone Docker container 319 | 320 | ~~~ 321 | sudo docker run \ 322 | --volume /var/lib/drone:/var/lib/drone \ 323 | --volume /var/run/docker.sock:/var/run/docker.sock \ 324 | --env-file /etc/drone/dronerc \ 325 | --restart=always \ 326 | --publish=80:8000 \ 327 | --detach=true \ 328 | --name=drone \ 329 | drone/drone:0.4 330 | ~~~ 331 | 332 | 7.) Adjust your EC2 AWS Security settings to allow 333 | inbound visitors. Do this by going to the instance details for your EC2 instance and clicking on the security group. Choose the inbound tab, edit and add a listener on port 80, with source 0.0.0.0. 334 | 335 | 8.) Go to your EC2 instances adddress and you should now be able to log in. 336 | 337 | 338 | ### Example 6 - Private Cloud CI service - Google 339 | 340 | 1.) Log into google cloud platform, and create a new VM instance under compute engine. 341 | 342 | 2.) SSH into the new vm instance (this can be done via the browser) 343 | 344 | 3.) [Install Docker](https://docs.docker.com/engine/installation/linux/ubuntulinux/) 345 | 346 | 4.) Create a new application at - https://github.com/settings/developers - with the compute engine instance ip in the homepage URL and the authorization callback followed by /authorize/ 347 | 348 | ~~~ 349 | Homepage URL: http://YOUR-IP-HERE/ 350 | Callback URL: http://YOUR-IP-HERE/authorize/ 351 | ~~~ 352 | 353 | 5.) Create a configuration file at (/etc/drone/dronerc), filling in the client info - 354 | 355 | ~~~ 356 | REMOTE_DRIVER=github 357 | REMOTE_CONFIG=https://github.com?client_id=....&client_secret=.... 358 | ~~~ 359 | 360 | 6.) Run the Drone Docker container 361 | 362 | ~~~ 363 | sudo docker run \ 364 | --volume /var/lib/drone:/var/lib/drone \ 365 | --volume /var/run/docker.sock:/var/run/docker.sock \ 366 | --env-file /etc/drone/dronerc \ 367 | --restart=always \ 368 | --publish=80:8000 \ 369 | --detach=true \ 370 | --name=drone \ 371 | drone/drone:0.4 372 | ~~~ 373 | 374 | ## Feedback 375 | 376 | Please feel free to email me - (brettbe) at med.upenn.edu with any feedback or raise a github issue with any comments or questions. We also encourage you to send examples of your own usage of continuous analysis to be included in the examples section. 377 | 378 | ## Acknowledgements 379 | This work is supported by the Gordon and Betty Moore Foundation's Data-Driven Discovery Initiative through Grant GBMF4552 to C.S.G. as well as NIH grants AI116794 and LM010098 and the Commonwealth Universal Research Enhancement (CURE) Program grant from the Pennsylvania Department of Health 380 | to Jason Moore. 381 | -------------------------------------------------------------------------------- /drone/coverage.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | /drone/src 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /drone/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/drone/output/abundance.h5 -------------------------------------------------------------------------------- /drone/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /drone/output/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/drone/output/fig1.png -------------------------------------------------------------------------------- /drone/output/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/drone/output/fig2.png -------------------------------------------------------------------------------- /drone/output/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/drone/output/fig3.png -------------------------------------------------------------------------------- /drone/output/fig4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/drone/output/fig4.png -------------------------------------------------------------------------------- /drone/output/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/drone/output/output/abundance.h5 -------------------------------------------------------------------------------- /drone/output/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /drone/output/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Fri Jul 1 15:11:27 2016", 8 | "call": "kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /drone/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Thu Apr 28 01:29:44 2016", 8 | "call": "kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /drone/tests.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Continuous Analysis 2 | 3 | [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) 4 | 5 | This repository presents [Continuous Analysis](http://greenelab.github.io/continuous_analysis/), a process demonstrating computational reproducibility by producing verifiable end-to-end runs of computational research. The process is described in detail in: [Nature Biotechnology](https://www.nature.com/articles/nbt.3780) and [Biorxiv Preprint](http://dx.doi.org/10.1101/056473). 6 | 7 | We encourage additions and improvements, please create an issue or better yet, implement it and create a pull request. Please let us know if you run into any difficulty implementing continuous analysis on your own. 8 | 9 | ## Examples 10 | 11 | Examples and real applications of continuous analysis are available: 12 | 13 | * RNA-seq Analysis: 14 | * Using [Salmon](https://github.com/COMBINE-lab/continuous_analysis_rnaseq) (and Drone v0.5) 15 | * Using [Kallisto](https://github.com/greenelab/continuous_analysis_rnaseq) 16 | * [Phylogenetic Tree Building](https://github.com/greenelab/continuous_analysis_phylo) 17 | * [Microarray Differential Expression Analysis](https://github.com/greenelab/continuous_analysis_brainarray) - example from Continuous Analysis Paper 18 | * [EHR Imputation](https://github.com/epistasislab/imputation) 19 | * [Privacy-preserving generative deep neural networks support clinical data sharing](https://github.com/greenelab/SPRINT_gan) 20 | * [Denoising Autoencoders for Phenotype Stratification](https://github.com/greenelab/DAPS) 21 | 22 | This repository shows example configurations with a locally hosted [Drone](https://github.com/drone/drone) installation as well as [Shippable](https://app.shippable.com/), [wercker](http://wercker.com/) and [Travis CI](https://travis-ci.org/). It uses a small test run of [Kallisto](https://github.com/pachterlab/kallisto) as an example. The figures below are re-generated with each commit. 23 | 24 | ![Fig1](https://github.com/greenelab/continuous_analysis/blob/master/drone/output/fig1.png?raw=true) 25 | 26 | ![Fig2](https://github.com/greenelab/continuous_analysis/blob/master/drone/output/fig2.png?raw=true) 27 | 28 | ![Fig3](https://github.com/greenelab/continuous_analysis/blob/master/drone/output/fig3.png?raw=true) 29 | 30 | ## Configuration 31 | 32 | Configuration instructions can be found [here](http://greenelab.github.io/continuous_analysis/). 33 | 34 | ## Feedback 35 | 36 | Please feel free to email me - (brettbe) at med.upenn.edu with any feedback or raise a github issue with any comments or questions. We also encourage you to send examples of your own usage of continuous analysis to be included in the examples section. 37 | 38 | ## Acknowledgements 39 | This work is supported by the Gordon and Betty Moore Foundation's Data-Driven Discovery Initiative through Grant GBMF4552 to C.S.G. as well as NIH grants AI116794 and LM010098 and the Commonwealth Universal Research Enhancement (CURE) Program grant from the Pennsylvania Department of Health 40 | to Jason Moore. 41 | -------------------------------------------------------------------------------- /readme_images/add_webhook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/readme_images/add_webhook.png -------------------------------------------------------------------------------- /readme_images/register_application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/readme_images/register_application.png -------------------------------------------------------------------------------- /shippable.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | notifications: 3 | email: false 4 | archive: true 5 | 6 | env: 7 | - secure: bMjk/u1ANHX7uJIPU5ZwKseWuftRdu6rmmUvmf0/dCnb1k3IiHSHP0Wv0ESf9JiNtzRxo1V+nzTpWwDL64hC4cuBHj7sOtBPnBqiDCDuE3mq5tVKDVQSo2og3O+j/0o2PsvFhAP0hzOzM2QXLCtgb6NQTemAEhsNCpMBCKepddpfD7ZN1xRcagZLUTmsBYO9+r95Z10/6pw8PI2wCTa22gSd49+bqMo96NpUEFgyaVZS9Lo+EOlcgS+8aCfbpyXDDL+ls/3TE0FaYTRRtuOCGuHNIItrrnrMmiUFpqCuJaVDVaKbJPK+Wk2EnioJUQPoc6BgI5enqIiJjpV2VEDp5Q== 8 | 9 | build: 10 | pre_ci_boot: 11 | image_name: brettbj/continuous_analysis_base 12 | image_tag: latest 13 | pull: true 14 | options: "-e HOME=/root" 15 | 16 | ci: 17 | - cd /root/src/github.com/greenelab/continuous_analysis 18 | - nose2 --plugin nose2.plugins.junitxml --junit-xml test 19 | - mv nose2-junit.xml shippable/testresults/tests.xml 20 | - coverage run --branch test.py 21 | - coverage xml -o shippable/codecoverage/coverage.xml test.py 22 | 23 | # run kallisto on a few simple tests 24 | - cd /kallisto/test 25 | - kallisto index -i transcripts.idx transcripts.fasta.gz 26 | - kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz 27 | - cp -R /kallisto/test/output /root/src/github.com/greenelab/continuous_analysis/shippable/output 28 | 29 | # plot the results from a jupyter notebook 30 | - cd /root/src/github.com/greenelab/continuous_analysis 31 | - jupyter nbconvert --to html --execute ./Shippable_Plotting.ipynb 32 | 33 | # push the results back to github 34 | - git config user.email "brettbj@gmail.com" 35 | - git config user.name "Brett Beaulieu-Jones" 36 | - git config --global push.default simple 37 | - git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 38 | 39 | - git checkout master 40 | - git pull 41 | - git add shippable/. 42 | - git commit -a -m "Shippable output [CI SKIP] [SKIP CI] ." 43 | - git stash 44 | - git push 45 | 46 | post_ci: 47 | - docker build -t brettbj/continuous_analysis . 48 | - docker push brettbj/continuous_analysis:latest 49 | 50 | integrations: 51 | hub: 52 | - integrationName: brettbj/continuous_analysis 53 | type: docker -------------------------------------------------------------------------------- /shippable/codecoverage/coverage.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | /root/src/github.com/greenelab/continuous_analysis 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /shippable/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/shippable/output/abundance.h5 -------------------------------------------------------------------------------- /shippable/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /shippable/output/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/shippable/output/fig1.png -------------------------------------------------------------------------------- /shippable/output/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/shippable/output/fig2.png -------------------------------------------------------------------------------- /shippable/output/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/shippable/output/fig3.png -------------------------------------------------------------------------------- /shippable/output/fig4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/shippable/output/fig4.png -------------------------------------------------------------------------------- /shippable/output/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/shippable/output/output/abundance.h5 -------------------------------------------------------------------------------- /shippable/output/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /shippable/output/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Fri Jul 1 15:12:37 2016", 8 | "call": "kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /shippable/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Thu Apr 28 03:44:42 2016", 8 | "call": "kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /shippable/testresults/tests.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /simple_script.py: -------------------------------------------------------------------------------- 1 | def add(a, b): 2 | return a + b 3 | 4 | def subtract(a, b): 5 | return a - b 6 | 7 | def multiply(a, b): 8 | return a * b 9 | 10 | def divide(a, b): 11 | return a / b -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import simple_script as ss 3 | 4 | 5 | class SimpleTest(unittest.TestCase): 6 | 7 | def testAdd(self): 8 | self.assertTrue(ss.add(1, 1) == 2) 9 | self.assertTrue(ss.add(2, 2) == 4) 10 | 11 | def testSubtract(self): 12 | self.assertTrue(ss.subtract(2, 1) == 1) 13 | 14 | def testMultiply(self): 15 | self.assertTrue(ss.multiply(2, 3) == 6) 16 | 17 | # Commented out to test coverage 18 | # def testDivide(self): 19 | # self.assertTrue(ss.divide(4, 2) == 2) 20 | 21 | if __name__ == '__main__': 22 | unittest.main() -------------------------------------------------------------------------------- /travis-ci/coverage.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /travis-ci/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/output/abundance.h5 -------------------------------------------------------------------------------- /travis-ci/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /travis-ci/output/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/output/fig1.png -------------------------------------------------------------------------------- /travis-ci/output/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/output/fig2.png -------------------------------------------------------------------------------- /travis-ci/output/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/output/fig3.png -------------------------------------------------------------------------------- /travis-ci/output/fig4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/output/fig4.png -------------------------------------------------------------------------------- /travis-ci/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Wed Jul 20 07:12:04 2016", 8 | "call": "kallisto quant -i kallisto/test/transcripts.idx -o kallisto/test/output -b 100 kallisto/test/reads_1.fastq.gz kallisto/test/reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /travis-ci/tests.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /travis-ci/travis-ci/coverage.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/travis-ci/output/abundance.h5 -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/travis-ci/output/fig1.png -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/travis-ci/output/fig2.png -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/travis-ci/output/fig3.png -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/fig4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/travis-ci/travis-ci/output/fig4.png -------------------------------------------------------------------------------- /travis-ci/travis-ci/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Wed Jul 20 07:21:47 2016", 8 | "call": "kallisto quant -i kallisto/test/transcripts.idx -o kallisto/test/output -b 100 kallisto/test/reads_1.fastq.gz kallisto/test/reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /travis-ci/travis-ci/tests.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /wercker.yml: -------------------------------------------------------------------------------- 1 | box: brettbj/continuous_analysis_base 2 | build: 3 | steps: 4 | - script: 5 | name: Run Tests + Coverage 6 | code: | 7 | nose2 --plugin nose2.plugins.junitxml --junit-xml test 8 | mv nose2-junit.xml wercker/tests.xml 9 | coverage run --branch test.py 10 | coverage xml -o wercker/coverage.xml test.py 11 | 12 | - script: 13 | name: Run Kallisto 14 | code: | 15 | cd /kallisto/test 16 | kallisto index -i transcripts.idx transcripts.fasta.gz &>- 17 | kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz &>- 18 | cp -R /kallisto/test/output /pipeline/source/wercker/output 19 | - script: 20 | name: Plot Results 21 | code: | 22 | cd /pipeline/source 23 | jupyter nbconvert --to html --execute ./Wercker_Plotting.ipynb 24 | - script: 25 | name: Push Results back to github 26 | code: | 27 | git config user.email "brettbj@gmail.com" 28 | git config user.name "Brett Beaulieu-Jones" 29 | git config --global push.default simple 30 | git remote set-url origin https://brettbj:$git_publish_key@github.com/greenelab/continuous_analysis.git 31 | git checkout master 32 | git pull 33 | git add wercker/. 34 | git commit -a -m "Wercker output [CI SKIP] [SKIP CI] ." 35 | git stash 36 | git push -------------------------------------------------------------------------------- /wercker/coverage.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | /pipeline/source 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /wercker/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/wercker/output/abundance.h5 -------------------------------------------------------------------------------- /wercker/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /wercker/output/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/wercker/output/fig1.png -------------------------------------------------------------------------------- /wercker/output/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/wercker/output/fig2.png -------------------------------------------------------------------------------- /wercker/output/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/wercker/output/fig3.png -------------------------------------------------------------------------------- /wercker/output/fig4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/wercker/output/fig4.png -------------------------------------------------------------------------------- /wercker/output/output/abundance.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greenelab/continuous_analysis/11d9de27e6b256aafe1f92623983d04a02da70a6/wercker/output/output/abundance.h5 -------------------------------------------------------------------------------- /wercker/output/output/abundance.tsv: -------------------------------------------------------------------------------- 1 | target_id length eff_length est_counts tpm 2 | NM_001168316 2283 2105.9 160.606 12581 3 | NM_174914 2385 2207.9 1500.72 112128 4 | NR_031764 1853 1675.9 102.671 10106.2 5 | NM_004503 1681 1503.9 331.118 36320.7 6 | NM_006897 1541 1363.9 664 80311.3 7 | NM_014212 2037 1859.9 55 4878.25 8 | NM_014620 2300 2122.9 591.166 45937.9 9 | NM_017409 1959 1781.9 47 4351.17 10 | NM_017410 2396 2218.9 42 3122.5 11 | NM_018953 1612 1434.9 227.999 26212.1 12 | NM_022658 2288 2110.9 4881 381446 13 | NM_153633 1666 1488.9 361.044 40002.4 14 | NM_153693 2072 1894.9 73.6719 6413.67 15 | NM_173860 849 671.903 962 236189 16 | NR_003084 1640 1462.9 0.00164208 0.18517 17 | -------------------------------------------------------------------------------- /wercker/output/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Sun Mar 12 18:21:32 2017", 8 | "call": "kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /wercker/output/run_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "n_targets": 15, 3 | "n_bootstraps": 100, 4 | "n_processed": 10000, 5 | "kallisto_version": "0.42.5", 6 | "index_version": 10, 7 | "start_time": "Thu Apr 28 04:10:45 2016", 8 | "call": "kallisto quant -i transcripts.idx -o output -b 100 reads_1.fastq.gz reads_2.fastq.gz" 9 | } 10 | -------------------------------------------------------------------------------- /wercker/tests.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | --------------------------------------------------------------------------------