You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

603 lines
26 KiB

;; Bioinformatics module
(define-module (gn packages genenetwork)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (guix download)
#:use-module (guix git-download)
#:use-module (guix build-system cargo)
#:use-module (guix build-system gnu)
#:use-module (guix build-system python)
#:use-module (guix build-system trivial)
#:use-module (guix graph)
#:use-module (guix scripts graph)
#:use-module (guix store)
#:use-module (guix gexp)
#:use-module (gnu packages)
#:use-module (gnu packages base)
#:use-module (gnu packages bioconductor)
#:use-module (gnu packages bioinformatics)
#:use-module (gnu packages check)
#:use-module (gnu packages cran)
#:use-module (gnu packages crates-io)
#:use-module (gnu packages compression)
#:use-module (gnu packages databases)
#:use-module (gnu packages ghostscript)
#:use-module (gnu packages golang)
#:use-module (gnu packages graph)
#:use-module (gnu packages graphviz)
#:use-module (gnu packages parallel)
#:use-module (gnu packages python)
#:use-module (gnu packages python-check)
#:use-module (gnu packages python-crypto)
#:use-module (gnu packages python-science)
#:use-module (gnu packages python-web)
#:use-module (gnu packages python-xyz)
#:use-module (gnu packages rdf)
#:use-module (gnu packages rust)
#:use-module (gnu packages scheme)
#:use-module (gnu packages statistics)
#:use-module (gnu packages version-control)
; #:use-module (gnu packages vim)
#:use-module (gnu packages web)
; #:use-module (gnu packages wget)
#:use-module (gnu packages xml)
#:use-module (gn packages bioinformatics)
#:use-module (gn packages gemma)
#:use-module (gn packages javascript)
#:use-module (gn packages python)
#:use-module (gn packages statistics)
#:use-module (gn packages twint)
#:use-module (gn packages web)
#:use-module (srfi srfi-1))
(define-public rust-qtlreaper
(let ((commit "2e7fed6d45b0b602d80fa2a55835f96ef1cba9e3")
(revision "1"))
(package
(name "rust-qtlreaper")
(version "0.1.4")
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/chfi/rust-qtlreaper.git")
(commit commit)))
(file-name (git-file-name name version))
(sha256
(base32
"0h70aalsplmc6xn1w7ha102n3bsi3gqkbnbrjvjm2za37c07gv0g"))))
(build-system cargo-build-system)
(arguments
`(#:cargo-inputs
(("rust-rand" ,rust-rand-0.6)
("rust-structopt" ,rust-structopt-0.2)
("rust-rayon" ,rust-rayon-1)
("rust-serde" ,rust-serde-1)
("rust-serde-json" ,rust-serde-json-1)
("rust-ndarray" ,rust-ndarray-0.12))
#:phases
(modify-phases %standard-phases
;; Test results vary based on the machine running them.
(replace 'check
(lambda _
(or (assoc-ref %standard-phases 'check)
(begin
(substitute* "src/geneobject.rs"
;; array![Genotype::Unk, Genotype::Unk, Genotype::Pat]
(("0.3421367343627405") "0.3421367343627406")
;; array![Genotype::Unk, Genotype::Unk, Genotype::Unk]
(("-0.3223330030526561") "-0.32233300305265566"))
(assoc-ref %standard-phases 'check)))
#t)))))
(home-page "https://github.com/chfi/rust-qtlreaper")
(synopsis "Reimplementation of genenetwork/QTLReaper in Rust")
(description "Reimplementation of genenetwork/QTLReaper in Rust")
(license #f))))
(define-public genenetwork3
(let ((commit "77c274b79c3ec01de60e90db3299763cb58f715b"))
(package
(name "genenetwork3")
(version (string-append "0.0.1-guix-" (string-take commit 7)))
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/genenetwork/genenetwork3.git")
(commit commit)))
(file-name (git-file-name name version))
(sha256
(base32
"0ha70ibr7dqz0kzmgccx5l6nrmmf2a2mj7scg6jllx232crjby72"))))
(propagated-inputs `(("coreutils" ,coreutils)
("gemma-wrapper" ,gemma-wrapper)
("csvdiff" ,go-github-com-aswinkarthik-csvdiff)
("python" ,python-wrapper)
("python-bcrypt" ,python-bcrypt)
("python-flask" ,python-flask)
("python-flask-cors" ,python-flask-cors)
("python-ipfshttpclient" ,python-ipfshttpclient)
("python-mypy" ,python-mypy)
("python-mypy-extensions" ,python-mypy-extensions)
("python-mysqlclient" ,python-mysqlclient)
("python-numpy" ,python-numpy)
("python-pylint" ,python-pylint)
("python-redis" ,python-redis)
("python-requests" ,python-requests)
("python-scipy" ,python-scipy)
("python-plotly" ,python-plotly)
("python-sqlalchemy-stubs"
,python-sqlalchemy-stubs)
("r-optparse" ,r-optparse)
("r-qtl" ,r-qtl)
("r-stringi" ,r-stringi)
("r-wgcna" ,r-wgcna)
("r-rjson" ,r-rjson)))
(build-system python-build-system)
(home-page "https://github.com/genenetwork/genenetwork3")
(synopsis "GeneNetwork3 API for data science and machine learning.")
(description "GeneNetwork3 API for data science and machine learning.")
(license license:agpl3+))))
(define-public genenetwork2
(let ((commit "fe345c9f2e99be748511f6889420d6560a553a37"))
(package
(name "genenetwork2")
(version (string-append "3.11-guix-" (string-take commit 7) ))
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/genenetwork/genenetwork2.git")
(commit commit)))
(file-name (string-append name "-" version))
(sha256
(base32
"1y6psmxpm3qn78dx6xfc11rdpf22vf807qb7grnp82gl19q6408w"))))
(native-inputs
`(("graphviz" ,graphviz)
;; And the graphs
;("genenetwork-graph" ,genenetwork-graph)
;("dag-svg-file" ,dag-svg-file)
))
(propagated-inputs
`(("genenetwork3" ,genenetwork3)
("parallel" ,parallel) ;; GNU parallel
("coreutils" ,coreutils)
("git" ,git)
("which" ,which)
("grep" ,grep)
("r" ,r)
("r-ctl" ,r-ctl)
; ("r-phewas" ,r-phewas)
("r-qtl" ,r-qtl)
("r-wgcna" ,r-wgcna)
("redis" ,redis)
("mariadb" ,mariadb)
("gemma" ,gemma-gn2)
("gemma-wrapper" ,gemma-wrapper)
; ("genenetwork2-files-small" ,genenetwork2-files-small)
("plink-ng-gn" ,plink-ng-gn)
; ("pylmm-gn2" ,pylmm-gn2)
("rust-qtlreaper" ,rust-qtlreaper)
("glibc-utf8-locales" ,glibc-utf8-locales)
("nginx" ,nginx)
("python" ,python-wrapper)
("python-pillow" ,python-pillow)
("python-coverage" ,python-coverage)
("python-configparser" ,python-configparser) ;; maintenance/scripts
("python-flask" ,python-flask)
("gunicorn" ,gunicorn)
("python-autopep8" ,python-autopep8)
("python-cssselect" ,python-cssselect)
("python-flask-debugtoolbar" ,python-flask-debugtoolbar)
("python-elasticsearch" ,python-elasticsearch)
("python-htmlgen" ,python-htmlgen)
("python-jinja2" ,python-jinja2)
("python-sqlalchemy" ,python-sqlalchemy)
("python-flask-sqlalchemy" ,python-flask-sqlalchemy)
("python-setuptools" ,python-setuptools)
("python-scipy" ,python-scipy)
("python-lxml" ,python-lxml)
("python-mechanize" ,python-mechanize)
("python-mysqlclient" ,python-mysqlclient)
("python-mypy" ,python-mypy)
("python-numpy" ,python-numpy)
("python-pandas" ,python-pandas)
("python-parameterized" ,python-parameterized)
("python-passlib" ,python-passlib)
("python-pylint" ,python-pylint)
("python-redis" ,python-redis)
("python-requests" ,python-requests)
("python-simplejson" ,python-simplejson)
("python-pyyaml" ,python-pyyaml)
("python-markdown" ,python-markdown)
("python-rdflib" ,python-rdflib)
("python-twint" ,python-twint)
("python-unittest2" ,python-unittest2)
;; TODO: Get rid of Python R bindings
("python-rpy2" ,python-rpy2-next)
("python-beautifulsoup4" ,python-beautifulsoup4)
;; Disable for now. Build fails on Penguin2
;; ("python-flask-socketio" ,python-flask-socketio)
("python-xlsxwriter" ,python-xlsxwriter)
;; All the external js dependencies
("javascript-twitter-post-fetcher" ,javascript-twitter-post-fetcher)
("javascript-cytoscape" ,javascript-cytoscape)
("javascript-panzoom" ,javascript-cytoscape-panzoom)
("javascript-qtip" ,javascript-cytoscape-qtip)
("javascript-chroma" ,javascript-chroma)
("javascript-d3-tip" ,javascript-d3-tip)
("javascript-jscolor" ,javascript-jscolor)
("javascript-colorbox" ,javascript-colorbox)
("javascript-jszip" ,javascript-jszip)
("js-jstat" ,js-jstat)
("js-md5" ,js-md5)
("js-parsley" ,js-parsley)
("javascript-plotly" ,javascript-plotly)
("javascript-typeahead" ,javascript-typeahead)
("js-underscore" ,js-underscore)
("js-smart-time-ago" ,js-smart-time-ago)
("javascript-nouislider" ,javascript-nouislider)
("javascript-purescript-genome-browser" ,javascript-purescript-genome-browser)
("javascript-ckeditor" ,javascript-ckeditor)
("javascript-datatables" ,javascript-datatables)
("javascript-datatables-scroller" ,javascript-datatables-scroller)
("javascript-datatables-buttons" ,javascript-datatables-buttons)
("javascript-datatables-buttons-bootstrap" ,javascript-datatables-buttons-bootstrap)
("javascript-datatables-plugins" ,javascript-datatables-plugins)
("javascript-datatables-col-reorder" ,javascript-datatables-col-reorder)
("javascript-datatables-col-resize" ,javascript-datatables-col-resize)
("javascript-datatables-buttons-styles" ,javascript-datatables-buttons-styles)
("javascript-shapiro-wilk" ,javascript-shapiro-wilk)
("javascript-underscore-string" ,javascript-underscore-string)
("javascript-qtip2" ,javascript-qtip2)
("javascript-d3js" ,javascript-d3js)
("javascript-nvd3" ,javascript-nvd3)
("javascript-bootstrap" ,javascript-bootstrap)
("javascript-jquery" ,javascript-jquery)
("javascript-zxcvbn" ,javascript-zxcvbn)
("javascript-jquery-ui" ,javascript-jquery-ui)
("javascript-jquery-cookie" ,javascript-jquery-cookie)
("javascript-font-awesome" ,javascript-font-awesome)))
(inputs
`(("javascript-colorbox" ,(package-source javascript-colorbox))))
(build-system python-build-system)
(arguments
`(#:tests? #f ; no 'setup.py test'
#:phases
(modify-phases %standard-phases
(delete 'reset-gzip-timestamps)
(add-after 'unpack 'fix-paths-scripts
(lambda _
(substitute* "bin/genenetwork2"
(("/usr/bin/env") (which "env"))
(("python ") (string-append (which "python3") " "))
(("readlink") (which "readlink"))
(("dirname") (which "dirname"))
(("basename") (which "basename"))
(("cat") (which "cat"))
(("echo") (which "echo"))
(("redis-server") (which "redis-server"))
(("git") (which "git"))
(("grep") (which "grep"))
(("rm") (which "rm"))
(("which") (which "which")))
#t))
; (add-after 'unpack 'patch-javascript
; (lambda* (#:key inputs #:allow-other-keys)
; (let ((colorbox (assoc-ref inputs "javascript-colorbox"))
; (gn2 "/share/genenetwork2/javascript/"))
; (delete-file-recursively "wqflask/wqflask/static/packages/colorbox")
; (copy-recursively colorbox "wqflask/wqflask/static/packages/colorbox")
; #t)))
(add-before 'install 'fix-paths
(lambda* (#:key inputs #:allow-other-keys)
(let* (
; (datafiles (string-append (assoc-ref inputs "genenetwork2-files-small") "/share/genenetwork2"))
; (pylmmcmd (string-append (assoc-ref inputs "pylmm-gn2") "/bin/pylmm_redis"))
(plink2cmd (string-append (assoc-ref inputs "plink-ng-gn") "/bin/plink2"))
(gemmacmd (string-append (assoc-ref inputs "gemma") "/bin/gemma"))
)
(substitute* '("etc/default_settings.py")
; (("^GENENETWORK_FILES +=.*") (string-append "GENENETWORK_FILES = \"" datafiles "\"\n" ))
; (("^PYLMM_COMMAND =.*") (string-append "PYLMM_COMMAND = \"" pylmmcmd "\"\n" ))
(("^PLINK_COMMAND =.*") (string-append "PLINK_COMMAND = \"" plink2cmd "\"\n" ))
(("^GEMMA_COMMAND =.*") (string-append "GEMMA_COMMAND = \"" gemmacmd "\"\n" ))
)
)))
; (add-after 'install 'generate-graph
; (lambda* (#:key inputs outputs #:allow-other-keys)
; (call-with-output-file
; (string-append
; (assoc-ref outputs "out")
; "/lib/python"
; (python-version (assoc-ref inputs "python"))
; "/site-packages"
; "/wqflask/dependency-graph.html")
; (lambda (port)
; (format
; port "~a"
; ,(call-with-output-string
; (lambda (p)
; (with-output-to-port p
; (lambda ()
; (run-with-store
; (open-connection)
; (export-graph
; (list this-package)
; p
; #:node-type %package-node-type
; #:backend %d3js-backend)))))))))))
;(add-after 'install 'generate-dag-svg-file
; (lambda* (#:key inputs outputs #:allow-other-keys)
; (let* ((output-dir
; (string-append
; (assoc-ref outputs "out")
; "/lib/python"
; (python-version (assoc-ref inputs "python"))
; "/site-packages/wqflask/"))
; (dot-file
; (string-append
; output-dir
; "dependency-graph.dot"))
; (svg-file
; (string-append
; output-dir
; "dependency-graph.svg")))
; (begin
; (call-with-output-file
; dot-file
; (lambda (port)
; (format
; port "~a"
; ,(call-with-output-string
; (lambda (p)
; (with-output-to-port p
; (lambda ()
; (run-with-store
; (open-connection)
; (export-graph
; (list this-package)
; p
; #:node-type %package-node-type
; #:backend %graphviz-backend)))))))))
; (invoke "dot" "-Tsvg" "-o" svg-file dot-file)))))
;; TODO: Use this to replace the two previous phases.
;(add-after 'install 'install-generated-files
; (lambda* (#:key inputs outputs #:allow-other-keys)
; (let ((output-dir
; (string-append
; (assoc-ref outputs "out")
; "/lib/python"
; (python-version (assoc-ref inputs "python"))
; "/site-packages/wqflask/")))
; (install-file (string-append %dag-svg-file "/dependency-graph.dot") output-dir)
; (install-file (string-append %dag-svg-file "/dependency-graph.svg") output-dir)
; (install-file (string-append %genenetwork-graph "/dependency-graph.html") output-dir)
; #t)))
(add-after 'install 'generate-dependency-file
(lambda* (#:key inputs outputs #:allow-other-keys)
(call-with-output-file
(string-append
(assoc-ref outputs "out")
"/lib/python"
(python-version (assoc-ref inputs "python"))
"/site-packages"
"/wqflask/DEPENDENCIES.md")
(lambda (port)
(format
port "
#### System Inputs (generated from ~a package defined in ~a)
|Name | Description |
|-----|-------------|
~a
"
,(package-name this-package)
(string-append
"[genenetwork.scm]"
"(http://git.genenetwork.org/"
"guix-bioinformatics/guix-bioinformatics"
"/src/branch/master/gn/packages/"
"genenetwork.scm)")
,(apply
string-append
(map
(lambda (input)
(let* ((pkg (cadr input))
(name (package-name pkg))
(version (package-version pkg))
(home-page (package-home-page pkg))
(description (package-synopsis pkg)))
(string-append
"| **[" name "](" home-page ")** v"
version"| "
description " |\n")))
(package-propagated-inputs this-package)))))))))))
(home-page "http://genenetwork.org/")
(synopsis "Full genenetwork services")
(description "Genenetwork installation sumo.")
(license license:agpl3+))))
;; ./pre-inst-env guix download http://files.genenetwork.org/raw_database/db_webqtl_s.zip
;; 0sscjh0wml2lx0mb43vf4chg9gpbfi7abpjxb34n3kyny9ll557x
(define-public genenetwork2-files-small
(let ((pfff "xx"))
(package
(name "genenetwork2-files-small")
(version "1.0")
(source
(origin
(method url-fetch)
(uri "http://files.genenetwork.org/data_files/gn2_data_s-20160303-C9E672ECED1F51B915DE419B5B2C524E.tar.lz4")
(file-name (string-append name "-" pfff))
(sha256
(base32 "058ymx3af6abdhdxyxj0i9qfvb6v7j091frjpp6jh4ahks7r23lj"))))
(build-system trivial-build-system)
(native-inputs `(("lz4" ,lz4)
("tar" ,tar)
("source" ,source)))
(arguments
`(#:modules ((guix build utils))
#:builder
(let* ((out (assoc-ref %outputs "out"))
(name "gn2_data_s")
(tarfn (string-append name ".tar"))
(targetdir (string-append out "/share/genenetwork2/")))
(begin
(use-modules (guix build utils))
(let ((source (assoc-ref %build-inputs "source"))
(lz4unpack (string-append (assoc-ref %build-inputs "lz4") "/bin/lz4"))
(tar (string-append (assoc-ref %build-inputs "tar") "/bin/tar")))
(and
(zero? (system* lz4unpack source "-d" tarfn))
(zero? (system* tar "xf" tarfn))
(mkdir-p targetdir)
(copy-recursively name targetdir)))))))
(home-page "http://genenetwork.org/")
(synopsis "Small file archive to run on genenetwork")
(description "Genenetwork genotype and mapping files.")
(license license:agpl3+))))
(define-public genenetwork2-database-small
(let ((md5 "93e745e9c"))
(package
(name "genenetwork2-database-small")
(version "1.0")
(source
(origin
(method url-fetch)
(uri "http://files.genenetwork.org/raw_database/db_webqtl_s.zip")
(file-name (string-append name "-" md5))
(sha256
(base32 "0sscjh0wml2lx0mb43vf4chg9gpbfi7abpjxb34n3kyny9ll557x"))))
(build-system trivial-build-system)
(native-inputs `(("unzip" ,unzip)
("source" ,source)))
(arguments
`(#:modules ((guix build utils))
#:builder (begin
(use-modules (guix build utils))
(let ((source (assoc-ref %build-inputs "source"))
(unzip (string-append (assoc-ref %build-inputs "unzip") "/bin/unzip")))
(and (mkdir "db")
(zero? (system* unzip source "-d" "db"))
(chdir "db"))))))
(home-page "http://genenetwork.org/")
(synopsis "Small database to run on genenetwork")
(description "Genenetwork installation + database.")
(license license:agpl3+))))
(define (genenetwork-graph)
(with-imported-modules '((guix build utils))
(gexp->derivation "genenetwork-graph"
#~(begin
(use-modules (guix build utils)
(srfi srfi-1))
(define (python-version package)
(let* ((version (last (string-split
package
#\-)))
(components (string-split version #\.))
(major+minor (take components 2)))
(string-join major+minor ".")))
(let ((html-file (string-append #$output
"/lib/python"
(python-version #$python)
"/site-packages/wqflask"
"/dependency-graph.html")))
(mkdir-p (dirname html-file))
(call-with-output-file html-file
(lambda (port)
(format
port "~a"
#$(call-with-output-string
(lambda (p)
(with-output-to-port p
(lambda ()
(run-with-store
(open-connection)
(export-graph
(list genenetwork2)
p
#:node-type %package-node-type
#:backend %d3js-backend))))))))))))))
;(define (computed-genenetwork-graph)
; (with-imported-modules '((guix build utils))
; (computed-file "genenetwork-graph"
; #~(begin
; (use-modules (guix build utils))
; (call-with-output-file #$output
; (lambda (port)
; (format
; port "~a"
; #$(call-with-output-string
; (lambda (p)
; (with-output-to-port p
; (lambda ()
; (run-with-store
; (open-connection)
; (export-graph
; (list genenetwork1)
; p
; #:node-type %package-node-type
; #:backend %d3js-backend)))))))))))))
(define (dag-svg-file)
(with-imported-modules '((guix build utils))
(gexp->derivation "dag-svg-file"
#~(begin
(use-modules (guix build utils)
(srfi srfi-1))
(define (python-version package)
(let* ((version (last (string-split
package
#\-)))
(components (string-split version #\.))
(major+minor (take components 2)))
(string-join major+minor ".")))
(let* ((dest-dir (string-append #$output
"/lib/python"
(python-version #$python)
"/site-packages/wqflask"))
(dot-file (string-append dest-dir "/dependency-graph.dot"))
(svg-file (string-append dest-dir "/dependency-graph.svg")))
(mkdir-p dest-dir)
(call-with-output-file dot-file
(lambda (port)
(format
port "~a"
#$(call-with-output-string
(lambda (p)
(with-output-to-port p
(lambda ()
(run-with-store
(open-connection)
(export-graph
(list genenetwork2)
p
#:node-type %package-node-type
#:backend %graphviz-backend)))))))))
(invoke #+(file-append graphviz "/bin/dot")
"-Tsvg" "-o" svg-file dot-file))))))
;(define-public genenetwork2-combined
; (directory-union
; "genenetwork2"
; (list genenetwork2 genenetwork-graph dag-svg-file)))