aboutsummaryrefslogtreecommitdiff
Error: user-error ("Unable to resolve link: \"introduction\"") mapbacktrace(#f(compiled-function (evald func args flags) #)) debug-early-backtrace() debug-early(error (user-error "Unable to resolve link: \"introduction\"")) signal(user-error ("Unable to resolve link: \"introduction\"")) user-error("Unable to resolve link: %S" "introduction") org-export-data((link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #126))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #172) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #175))) #126 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #177))) :mode nil :granularity nil :parent #172) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #177) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #180) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #183))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #178))) :mode nil :granularity nil :parent #172) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #178) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #181) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #184)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #184) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #188))) #(").\n" 0 3 (:parent #184))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #181) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #185)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #185)) #(").\n" 0 3 (:parent #185))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #181) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #186))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #181) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #187)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #187)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #187))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #181) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #188))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #181) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #189)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #189)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #189))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #179))) :mode nil :granularity nil :parent #172) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #179) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #182) #("The main " 0 9 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #185) #("GN2 webserver" 0 13 (:parent #189))) #("is built on " 0 12 (:parent #185)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #185) #("Python flask" 0 12 (:parent #191))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #185) #("github" 0 6 (:parent #193))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #185) #("views.py" 0 8 (:parent #195))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #185) #("index" 0 5 (:parent #197)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #197) #("page.html" 0 9 (:parent #201)))) #("in the " 0 7 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #185) #("templates" 0 9 (:parent #199))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #185) #("data" 0 4 (:parent #201)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #201) #("select" 0 6 (:parent #205))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #201) #("menu.js" 0 7 (:parent #206)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #185) #("gen" 0 3 (:parent #203)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #203) #("select" 0 6 (:parent #207))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #203) #("dataset.py" 0 10 (:parent #208)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #185)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #185) #("server" 0 6 (:parent #205))) #("in the latest version, see " 0 27 (:parent #185)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #185) #("GnServer (REST)" 0 15 (:parent #207))) #(".\n" 0 2 (:parent #185))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #182) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #186)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #186) #("M2" 0 2 (:parent #190))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #186) #("0606" 0 4 (:parent #191))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #186) #("P" 0 1 (:parent #192))) #("&search" 0 7 (:parent #186)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #186) #("terms" 0 5 (:parent #194))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #186) #("or" 0 2 (:parent #195))) #("=&search" 0 8 (:parent #186)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #186) #("terms" 0 5 (:parent #197))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #186) #("and" 0 3 (:parent #198))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #186)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #186) #("server" 0 6 (:parent #200))) #("). The logic is in\nsearch" 0 25 (:parent #186)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #186) #("result.py" 0 9 (:parent #202))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #186) #("search" 0 6 (:parent #204)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #204) #("result" 0 6 (:parent #208))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #204) #("page.html" 0 9 (:parent #209)))) #(".\n" 0 2 (:parent #186))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #182) #("For what happens at the database level see " 0 43 (:parent #187)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #187)) #(".\n" 0 2 (:parent #187))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #182) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #188)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #188) #("search" 0 6 (:parent #192)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #192) #("result" 0 6 (:parent #196))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #192) #("page.html" 0 9 (:parent #197)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #188)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #188) #("DataTable container" 0 19 (:parent #194))) #(".\n" 0 2 (:parent #188))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #180))) :mode nil :granularity nil :parent #172) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #180) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #183) #("The " 0 4 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #186) #("GnServer REST API" 0 17 (:parent #190))) #("is built on high performance " 0 29 (:parent #186)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #186) #("Elixir" 0 6 (:parent #192))) #("with " 0 5 (:parent #186)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #186) #("Maru" 0 4 (:parent #194))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #186))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #183)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #183) #("(json2yaml.rb is in the gn" 0 26 (:parent #188)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #188) #("server" 0 6 (:parent #192))) #("repo). For the current API definition\nsee " 0 42 (:parent #188)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #188) #("GnServer REST API" 0 17 (:parent #194))) #("documentation.\n" 0 15 (:parent #188))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #181))) :mode nil :granularity nil :parent #172) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #181) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #184) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #187))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #182))) :mode nil :granularity nil :parent #172) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #185))) :mode section :granularity nil :parent #182) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #185) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #188) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #191)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #191)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #191)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #191) #("instructions" 0 12 (:parent #197))) #(".\n" 0 2 (:parent #191))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #186))) :mode nil :granularity nil :parent #182) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #186) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #189) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #192)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #192) #("instructions" 0 12 (:parent #196))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #192)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #192) #("R/qtl2 formats" 0 14 (:parent #198))) #(".\n" 0 2 (:parent #192))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #189) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #193))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #189)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #189) #("and, for example, in the method run" 0 35 (:parent #195)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #195) #("rqtl" 0 4 (:parent #199))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #195) #("geno" 0 4 (:parent #200))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #195)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #195) #("extra" 0 5 (:parent #202))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #195))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #189)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #189) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #197))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #189))))))) #102)) #78)) #46 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #82) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #85) #("Reproducibility and interoperability" 0 36 (:parent #88))) #("\n" 0 1 (:parent #85)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #83) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #86) #("Webserver" 0 9 (:parent #89))) #("\n" 0 1 (:parent #86)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #84) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #87) #("GnServer (REST)" 0 15 (:parent #90))) #("\n" 0 1 (:parent #87)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #85) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #88) #("GnExec" 0 6 (:parent #91))) #("\n" 0 1 (:parent #88)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #86) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #89) #("Database" 0 8 (:parent #92))) #("\n" 0 1 (:parent #89))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #86) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #90) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #93) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #96) #("Phenotypes" 0 10 (:parent #99))) #("\n" 0 1 (:parent #96)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #90) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #94) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #97) #("Genotypes" 0 9 (:parent #100))) #("\n" 0 1 (:parent #97)))))))) #26)) #0 #("\n" 0 1 (:parent #26)))) #("Introduction" 0 12 (:parent #0))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) #f(compiled-function (element) #)((link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #126))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #172) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #175))) #126 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #177))) :mode nil :granularity nil :parent #172) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #177) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #180) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #183))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #178))) :mode nil :granularity nil :parent #172) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #178) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #181) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #184)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #184) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #188))) #(").\n" 0 3 (:parent #184))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #181) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #185)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #185)) #(").\n" 0 3 (:parent #185))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #181) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #186))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #181) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #187)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #187)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #187))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #181) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #188))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #181) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #189)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #189)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #189))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #179))) :mode nil :granularity nil :parent #172) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #179) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #182) #("The main " 0 9 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #185) #("GN2 webserver" 0 13 (:parent #189))) #("is built on " 0 12 (:parent #185)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #185) #("Python flask" 0 12 (:parent #191))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #185) #("github" 0 6 (:parent #193))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #185) #("views.py" 0 8 (:parent #195))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #185) #("index" 0 5 (:parent #197)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #197) #("page.html" 0 9 (:parent #201)))) #("in the " 0 7 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #185) #("templates" 0 9 (:parent #199))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #185) #("data" 0 4 (:parent #201)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #201) #("select" 0 6 (:parent #205))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #201) #("menu.js" 0 7 (:parent #206)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #185)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #185) #("gen" 0 3 (:parent #203)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #203) #("select" 0 6 (:parent #207))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #203) #("dataset.py" 0 10 (:parent #208)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #185)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #185) #("server" 0 6 (:parent #205))) #("in the latest version, see " 0 27 (:parent #185)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #185) #("GnServer (REST)" 0 15 (:parent #207))) #(".\n" 0 2 (:parent #185))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #182) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #186)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #186) #("M2" 0 2 (:parent #190))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #186) #("0606" 0 4 (:parent #191))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #186) #("P" 0 1 (:parent #192))) #("&search" 0 7 (:parent #186)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #186) #("terms" 0 5 (:parent #194))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #186) #("or" 0 2 (:parent #195))) #("=&search" 0 8 (:parent #186)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #186) #("terms" 0 5 (:parent #197))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #186) #("and" 0 3 (:parent #198))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #186)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #186) #("server" 0 6 (:parent #200))) #("). The logic is in\nsearch" 0 25 (:parent #186)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #186) #("result.py" 0 9 (:parent #202))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #186) #("search" 0 6 (:parent #204)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #204) #("result" 0 6 (:parent #208))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #204) #("page.html" 0 9 (:parent #209)))) #(".\n" 0 2 (:parent #186))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #182) #("For what happens at the database level see " 0 43 (:parent #187)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #187)) #(".\n" 0 2 (:parent #187))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #182) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #188)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #188) #("search" 0 6 (:parent #192)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #192) #("result" 0 6 (:parent #196))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #192) #("page.html" 0 9 (:parent #197)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #188)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #188) #("DataTable container" 0 19 (:parent #194))) #(".\n" 0 2 (:parent #188))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #180))) :mode nil :granularity nil :parent #172) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #180) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #183) #("The " 0 4 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #186) #("GnServer REST API" 0 17 (:parent #190))) #("is built on high performance " 0 29 (:parent #186)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #186) #("Elixir" 0 6 (:parent #192))) #("with " 0 5 (:parent #186)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #186) #("Maru" 0 4 (:parent #194))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #186))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #183)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #183) #("(json2yaml.rb is in the gn" 0 26 (:parent #188)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #188) #("server" 0 6 (:parent #192))) #("repo). For the current API definition\nsee " 0 42 (:parent #188)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #188) #("GnServer REST API" 0 17 (:parent #194))) #("documentation.\n" 0 15 (:parent #188))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #181))) :mode nil :granularity nil :parent #172) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #181) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #184) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #187))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #182))) :mode nil :granularity nil :parent #172) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #185))) :mode section :granularity nil :parent #182) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #185) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #188) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #191)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #191)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #191)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #191) #("instructions" 0 12 (:parent #197))) #(".\n" 0 2 (:parent #191))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #186))) :mode nil :granularity nil :parent #182) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #186) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #189) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #192)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #192) #("instructions" 0 12 (:parent #196))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #192)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #192) #("R/qtl2 formats" 0 14 (:parent #198))) #(".\n" 0 2 (:parent #192))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #189) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #193))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #189)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #189) #("and, for example, in the method run" 0 35 (:parent #195)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #195) #("rqtl" 0 4 (:parent #199))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #195) #("geno" 0 4 (:parent #200))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #195)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #195) #("extra" 0 5 (:parent #202))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #195))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #189)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #189) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #197))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #189))))))) #102)) #78)) #46 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #82) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #85) #("Reproducibility and interoperability" 0 36 (:parent #88))) #("\n" 0 1 (:parent #85)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #83) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #86) #("Webserver" 0 9 (:parent #89))) #("\n" 0 1 (:parent #86)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #84) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #87) #("GnServer (REST)" 0 15 (:parent #90))) #("\n" 0 1 (:parent #87)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #85) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #88) #("GnExec" 0 6 (:parent #91))) #("\n" 0 1 (:parent #88)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #78) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #86) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #89) #("Database" 0 8 (:parent #92))) #("\n" 0 1 (:parent #89))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #86) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #90) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #93) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #96) #("Phenotypes" 0 10 (:parent #99))) #("\n" 0 1 (:parent #96)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #90) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #94) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #97) #("Genotypes" 0 9 (:parent #100))) #("\n" 0 1 (:parent #97)))))))) #26)) #0 #("\n" 0 1 (:parent #26)))) #("Introduction" 0 12 (:parent #0)))) mapconcat(#f(compiled-function (element) #) ((link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #127))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #173) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #176))) #127 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #178))) :mode nil :granularity nil :parent #173) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #178) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #181) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #184))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #179))) :mode nil :granularity nil :parent #173) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #179) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #182) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #185)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #185) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #189))) #(").\n" 0 3 (:parent #185))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #182) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #186)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #186)) #(").\n" 0 3 (:parent #186))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #182) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #187))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #182) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #188)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #188)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #188))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #182) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #189))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #182) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #190)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #190)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #190))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #180))) :mode nil :granularity nil :parent #173) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #180) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #183) #("The main " 0 9 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #186) #("GN2 webserver" 0 13 (:parent #190))) #("is built on " 0 12 (:parent #186)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #186) #("Python flask" 0 12 (:parent #192))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #186) #("github" 0 6 (:parent #194))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #186) #("views.py" 0 8 (:parent #196))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #186) #("index" 0 5 (:parent #198)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #198) #("page.html" 0 9 (:parent #202)))) #("in the " 0 7 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #186) #("templates" 0 9 (:parent #200))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #186) #("data" 0 4 (:parent #202)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #202) #("select" 0 6 (:parent #206))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #202) #("menu.js" 0 7 (:parent #207)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #186)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #186) #("gen" 0 3 (:parent #204)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #204) #("select" 0 6 (:parent #208))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #204) #("dataset.py" 0 10 (:parent #209)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #186)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #186) #("server" 0 6 (:parent #206))) #("in the latest version, see " 0 27 (:parent #186)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #186) #("GnServer (REST)" 0 15 (:parent #208))) #(".\n" 0 2 (:parent #186))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #183) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #187)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #187) #("M2" 0 2 (:parent #191))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #187) #("0606" 0 4 (:parent #192))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #187) #("P" 0 1 (:parent #193))) #("&search" 0 7 (:parent #187)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #187) #("terms" 0 5 (:parent #195))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #187) #("or" 0 2 (:parent #196))) #("=&search" 0 8 (:parent #187)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #187) #("terms" 0 5 (:parent #198))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #187) #("and" 0 3 (:parent #199))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #187)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #187) #("server" 0 6 (:parent #201))) #("). The logic is in\nsearch" 0 25 (:parent #187)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #187) #("result.py" 0 9 (:parent #203))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #187)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #187) #("search" 0 6 (:parent #205)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #205) #("result" 0 6 (:parent #209))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #205) #("page.html" 0 9 (:parent #210)))) #(".\n" 0 2 (:parent #187))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #183) #("For what happens at the database level see " 0 43 (:parent #188)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #188)) #(".\n" 0 2 (:parent #188))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #183) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #189)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #189) #("search" 0 6 (:parent #193)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #193) #("result" 0 6 (:parent #197))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #193) #("page.html" 0 9 (:parent #198)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #189)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #189) #("DataTable container" 0 19 (:parent #195))) #(".\n" 0 2 (:parent #189))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #181))) :mode nil :granularity nil :parent #173) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #181) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #184) #("The " 0 4 (:parent #187)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #187) #("GnServer REST API" 0 17 (:parent #191))) #("is built on high performance " 0 29 (:parent #187)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #187) #("Elixir" 0 6 (:parent #193))) #("with " 0 5 (:parent #187)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #187) #("Maru" 0 4 (:parent #195))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #187))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #184)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #184) #("(json2yaml.rb is in the gn" 0 26 (:parent #189)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #189) #("server" 0 6 (:parent #193))) #("repo). For the current API definition\nsee " 0 42 (:parent #189)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #189) #("GnServer REST API" 0 17 (:parent #195))) #("documentation.\n" 0 15 (:parent #189))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #182))) :mode nil :granularity nil :parent #173) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #182) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #185) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #188))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #183))) :mode nil :granularity nil :parent #173) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #186))) :mode section :granularity nil :parent #183) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #186) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #189) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #192)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #192)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #192)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #192) #("instructions" 0 12 (:parent #198))) #(".\n" 0 2 (:parent #192))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #187))) :mode nil :granularity nil :parent #183) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #187) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #190) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #193)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #193) #("instructions" 0 12 (:parent #197))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #193)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #193) #("R/qtl2 formats" 0 14 (:parent #199))) #(".\n" 0 2 (:parent #193))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #190) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #194))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #190)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #190) #("and, for example, in the method run" 0 35 (:parent #196)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #196) #("rqtl" 0 4 (:parent #200))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #196) #("geno" 0 4 (:parent #201))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #196)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #196) #("extra" 0 5 (:parent #203))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #196))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #190)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #190) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #198))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #190))))))) #103)) #79)) #47 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #79) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #83) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #86) #("Reproducibility and interoperability" 0 36 (:parent #89))) #("\n" 0 1 (:parent #86)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #79) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #84) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #87) #("Webserver" 0 9 (:parent #90))) #("\n" 0 1 (:parent #87)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #79) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #85) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #88) #("GnServer (REST)" 0 15 (:parent #91))) #("\n" 0 1 (:parent #88)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #79) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #86) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #89) #("GnExec" 0 6 (:parent #92))) #("\n" 0 1 (:parent #89)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #79) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #87) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #90) #("Database" 0 8 (:parent #93))) #("\n" 0 1 (:parent #90))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #87) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #91) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #94) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #97) #("Phenotypes" 0 10 (:parent #100))) #("\n" 0 1 (:parent #97)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #91) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #95) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #98) #("Genotypes" 0 9 (:parent #101))) #("\n" 0 1 (:parent #98)))))))) #27)) . #0)) #("Introduction" 0 12 (:parent #1))) #("\n" 0 1 (:parent (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #105))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #151) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #154))) #105 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #156))) :mode nil :granularity nil :parent #151) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #156) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #159) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #162))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #157))) :mode nil :granularity nil :parent #151) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #157) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #160) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #163)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #163) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #167))) #(").\n" 0 3 (:parent #163))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #160) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #164)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #164)) #(").\n" 0 3 (:parent #164))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #160) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #165))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #160) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #166)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #166)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #166))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #160) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #167))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #160) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #168)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #168)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #168))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #158))) :mode nil :granularity nil :parent #151) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #158) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #161) #("The main " 0 9 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #164) #("GN2 webserver" 0 13 (:parent #168))) #("is built on " 0 12 (:parent #164)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #164) #("Python flask" 0 12 (:parent #170))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #164) #("github" 0 6 (:parent #172))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #164) #("views.py" 0 8 (:parent #174))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #164) #("index" 0 5 (:parent #176)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #176) #("page.html" 0 9 (:parent #180)))) #("in the " 0 7 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #164) #("templates" 0 9 (:parent #178))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #164) #("data" 0 4 (:parent #180)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #180) #("select" 0 6 (:parent #184))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #180) #("menu.js" 0 7 (:parent #185)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #164)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #164) #("gen" 0 3 (:parent #182)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #182) #("select" 0 6 (:parent #186))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #182) #("dataset.py" 0 10 (:parent #187)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #164)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #164) #("server" 0 6 (:parent #184))) #("in the latest version, see " 0 27 (:parent #164)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #164) #("GnServer (REST)" 0 15 (:parent #186))) #(".\n" 0 2 (:parent #164))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #161) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #165)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #165) #("M2" 0 2 (:parent #169))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #165) #("0606" 0 4 (:parent #170))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #165) #("P" 0 1 (:parent #171))) #("&search" 0 7 (:parent #165)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #165) #("terms" 0 5 (:parent #173))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #165) #("or" 0 2 (:parent #174))) #("=&search" 0 8 (:parent #165)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #165) #("terms" 0 5 (:parent #176))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #165) #("and" 0 3 (:parent #177))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #165)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #165) #("server" 0 6 (:parent #179))) #("). The logic is in\nsearch" 0 25 (:parent #165)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #165) #("result.py" 0 9 (:parent #181))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #165)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #165) #("search" 0 6 (:parent #183)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #183) #("result" 0 6 (:parent #187))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #183) #("page.html" 0 9 (:parent #188)))) #(".\n" 0 2 (:parent #165))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #161) #("For what happens at the database level see " 0 43 (:parent #166)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #166)) #(".\n" 0 2 (:parent #166))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #161) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #167)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #167) #("search" 0 6 (:parent #171)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #171) #("result" 0 6 (:parent #175))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #171) #("page.html" 0 9 (:parent #176)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #167)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #167) #("DataTable container" 0 19 (:parent #173))) #(".\n" 0 2 (:parent #167))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #159))) :mode nil :granularity nil :parent #151) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #159) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #162) #("The " 0 4 (:parent #165)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #165) #("GnServer REST API" 0 17 (:parent #169))) #("is built on high performance " 0 29 (:parent #165)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #165) #("Elixir" 0 6 (:parent #171))) #("with " 0 5 (:parent #165)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #165) #("Maru" 0 4 (:parent #173))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #165))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #162)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #162) #("(json2yaml.rb is in the gn" 0 26 (:parent #167)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #167) #("server" 0 6 (:parent #171))) #("repo). For the current API definition\nsee " 0 42 (:parent #167)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #167) #("GnServer REST API" 0 17 (:parent #173))) #("documentation.\n" 0 15 (:parent #167))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #160))) :mode nil :granularity nil :parent #151) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #160) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #163) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #166))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #161))) :mode nil :granularity nil :parent #151) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #164))) :mode section :granularity nil :parent #161) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #164) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #167) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #170)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #170)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #170)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #170) #("instructions" 0 12 (:parent #176))) #(".\n" 0 2 (:parent #170))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #165))) :mode nil :granularity nil :parent #161) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #165) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #168) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #171)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #171) #("instructions" 0 12 (:parent #175))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #171)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #171) #("R/qtl2 formats" 0 14 (:parent #177))) #(".\n" 0 2 (:parent #171))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #168) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #172))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #168)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #168) #("and, for example, in the method run" 0 35 (:parent #174)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #174) #("rqtl" 0 4 (:parent #178))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #174) #("geno" 0 4 (:parent #179))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #174)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #174) #("extra" 0 5 (:parent #181))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #174))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #168)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #168) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #176))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #168))))))) #81)) #57)) #25 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #57) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #61) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #64) #("Reproducibility and interoperability" 0 36 (:parent #67))) #("\n" 0 1 (:parent #64)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #57) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #62) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #65) #("Webserver" 0 9 (:parent #68))) #("\n" 0 1 (:parent #65)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #57) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #63) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #66) #("GnServer (REST)" 0 15 (:parent #69))) #("\n" 0 1 (:parent #66)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #57) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #64) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #67) #("GnExec" 0 6 (:parent #70))) #("\n" 0 1 (:parent #67)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #57) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #65) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #68) #("Database" 0 8 (:parent #71))) #("\n" 0 1 (:parent #68))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #65) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #69) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #72) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #75) #("Phenotypes" 0 10 (:parent #78))) #("\n" 0 1 (:parent #75)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #69) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #73) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #76) #("Genotypes" 0 9 (:parent #79))) #("\n" 0 1 (:parent #76)))))))) #5)) . #0)))) "") org-export-data((paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #100))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #146) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #149))) #100 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #151))) :mode nil :granularity nil :parent #146) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #151) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #154) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #157))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #152))) :mode nil :granularity nil :parent #146) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #152) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #155) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #158)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #158) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #162))) #(").\n" 0 3 (:parent #158))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #155) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #159)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #159)) #(").\n" 0 3 (:parent #159))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #155) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #160))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #155) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #161)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #161)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #161))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #155) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #162))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #155) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #163)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #163)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #163))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #153))) :mode nil :granularity nil :parent #146) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #153) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #156) #("The main " 0 9 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #159) #("GN2 webserver" 0 13 (:parent #163))) #("is built on " 0 12 (:parent #159)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #159) #("Python flask" 0 12 (:parent #165))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #159) #("github" 0 6 (:parent #167))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #159) #("views.py" 0 8 (:parent #169))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #159) #("index" 0 5 (:parent #171)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #171) #("page.html" 0 9 (:parent #175)))) #("in the " 0 7 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #159) #("templates" 0 9 (:parent #173))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #159) #("data" 0 4 (:parent #175)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #175) #("select" 0 6 (:parent #179))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #175) #("menu.js" 0 7 (:parent #180)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #159) #("gen" 0 3 (:parent #177)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #177) #("select" 0 6 (:parent #181))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #177) #("dataset.py" 0 10 (:parent #182)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #159)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #159) #("server" 0 6 (:parent #179))) #("in the latest version, see " 0 27 (:parent #159)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #159) #("GnServer (REST)" 0 15 (:parent #181))) #(".\n" 0 2 (:parent #159))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #156) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #160)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #160) #("M2" 0 2 (:parent #164))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #160) #("0606" 0 4 (:parent #165))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #160) #("P" 0 1 (:parent #166))) #("&search" 0 7 (:parent #160)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #160) #("terms" 0 5 (:parent #168))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #160) #("or" 0 2 (:parent #169))) #("=&search" 0 8 (:parent #160)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #160) #("terms" 0 5 (:parent #171))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #160) #("and" 0 3 (:parent #172))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #160)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #160) #("server" 0 6 (:parent #174))) #("). The logic is in\nsearch" 0 25 (:parent #160)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #160) #("result.py" 0 9 (:parent #176))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #160) #("search" 0 6 (:parent #178)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #178) #("result" 0 6 (:parent #182))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #178) #("page.html" 0 9 (:parent #183)))) #(".\n" 0 2 (:parent #160))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #156) #("For what happens at the database level see " 0 43 (:parent #161)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #161)) #(".\n" 0 2 (:parent #161))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #156) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #162)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #162) #("search" 0 6 (:parent #166)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #166) #("result" 0 6 (:parent #170))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #166) #("page.html" 0 9 (:parent #171)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #162)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #162) #("DataTable container" 0 19 (:parent #168))) #(".\n" 0 2 (:parent #162))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #154))) :mode nil :granularity nil :parent #146) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #154) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #157) #("The " 0 4 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #160) #("GnServer REST API" 0 17 (:parent #164))) #("is built on high performance " 0 29 (:parent #160)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #160) #("Elixir" 0 6 (:parent #166))) #("with " 0 5 (:parent #160)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #160) #("Maru" 0 4 (:parent #168))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #160))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #157)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #157) #("(json2yaml.rb is in the gn" 0 26 (:parent #162)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #162) #("server" 0 6 (:parent #166))) #("repo). For the current API definition\nsee " 0 42 (:parent #162)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #162) #("GnServer REST API" 0 17 (:parent #168))) #("documentation.\n" 0 15 (:parent #162))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #155))) :mode nil :granularity nil :parent #146) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #155) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #158) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #161))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #156))) :mode nil :granularity nil :parent #146) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #159))) :mode section :granularity nil :parent #156) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #159) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #162) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #165)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #165)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #165)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #165) #("instructions" 0 12 (:parent #171))) #(".\n" 0 2 (:parent #165))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #160))) :mode nil :granularity nil :parent #156) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #160) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #163) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #166)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #166) #("instructions" 0 12 (:parent #170))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #166)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #166) #("R/qtl2 formats" 0 14 (:parent #172))) #(".\n" 0 2 (:parent #166))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #163) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #167))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #163)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #163) #("and, for example, in the method run" 0 35 (:parent #169)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #169) #("rqtl" 0 4 (:parent #173))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #169) #("geno" 0 4 (:parent #174))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #169)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #169) #("extra" 0 5 (:parent #176))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #169))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #163)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #163) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #171))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #163))))))) #76)) #52)) #20 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #56) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #59) #("Reproducibility and interoperability" 0 36 (:parent #62))) #("\n" 0 1 (:parent #59)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #57) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #60) #("Webserver" 0 9 (:parent #63))) #("\n" 0 1 (:parent #60)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #58) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #61) #("GnServer (REST)" 0 15 (:parent #64))) #("\n" 0 1 (:parent #61)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #59) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #62) #("GnExec" 0 6 (:parent #65))) #("\n" 0 1 (:parent #62)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #60) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #63) #("Database" 0 8 (:parent #66))) #("\n" 0 1 (:parent #63))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #60) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #64) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #67) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #70) #("Phenotypes" 0 10 (:parent #73))) #("\n" 0 1 (:parent #70)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #64) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #68) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #71) #("Genotypes" 0 9 (:parent #74))) #("\n" 0 1 (:parent #71)))))))) #0)) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #0) #("Introduction" 0 12 (:parent #3))) #("\n" 0 1 (:parent #0))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) #f(compiled-function (element) #)((paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #100))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #146) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #149))) #100 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #151))) :mode nil :granularity nil :parent #146) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #151) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #154) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #157))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #152))) :mode nil :granularity nil :parent #146) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #152) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #155) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #158)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #158) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #162))) #(").\n" 0 3 (:parent #158))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #155) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #159)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #159)) #(").\n" 0 3 (:parent #159))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #155) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #160))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #155) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #161)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #161)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #161))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #155) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #162))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #155) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #163)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #163)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #163))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #153))) :mode nil :granularity nil :parent #146) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #153) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #156) #("The main " 0 9 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #159) #("GN2 webserver" 0 13 (:parent #163))) #("is built on " 0 12 (:parent #159)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #159) #("Python flask" 0 12 (:parent #165))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #159) #("github" 0 6 (:parent #167))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #159) #("views.py" 0 8 (:parent #169))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #159) #("index" 0 5 (:parent #171)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #171) #("page.html" 0 9 (:parent #175)))) #("in the " 0 7 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #159) #("templates" 0 9 (:parent #173))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #159) #("data" 0 4 (:parent #175)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #175) #("select" 0 6 (:parent #179))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #175) #("menu.js" 0 7 (:parent #180)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #159)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #159) #("gen" 0 3 (:parent #177)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #177) #("select" 0 6 (:parent #181))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #177) #("dataset.py" 0 10 (:parent #182)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #159)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #159) #("server" 0 6 (:parent #179))) #("in the latest version, see " 0 27 (:parent #159)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #159) #("GnServer (REST)" 0 15 (:parent #181))) #(".\n" 0 2 (:parent #159))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #156) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #160)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #160) #("M2" 0 2 (:parent #164))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #160) #("0606" 0 4 (:parent #165))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #160) #("P" 0 1 (:parent #166))) #("&search" 0 7 (:parent #160)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #160) #("terms" 0 5 (:parent #168))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #160) #("or" 0 2 (:parent #169))) #("=&search" 0 8 (:parent #160)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #160) #("terms" 0 5 (:parent #171))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #160) #("and" 0 3 (:parent #172))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #160)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #160) #("server" 0 6 (:parent #174))) #("). The logic is in\nsearch" 0 25 (:parent #160)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #160) #("result.py" 0 9 (:parent #176))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #160) #("search" 0 6 (:parent #178)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #178) #("result" 0 6 (:parent #182))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #178) #("page.html" 0 9 (:parent #183)))) #(".\n" 0 2 (:parent #160))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #156) #("For what happens at the database level see " 0 43 (:parent #161)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #161)) #(".\n" 0 2 (:parent #161))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #156) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #162)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #162) #("search" 0 6 (:parent #166)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #166) #("result" 0 6 (:parent #170))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #166) #("page.html" 0 9 (:parent #171)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #162)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #162) #("DataTable container" 0 19 (:parent #168))) #(".\n" 0 2 (:parent #162))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #154))) :mode nil :granularity nil :parent #146) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #154) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #157) #("The " 0 4 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #160) #("GnServer REST API" 0 17 (:parent #164))) #("is built on high performance " 0 29 (:parent #160)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #160) #("Elixir" 0 6 (:parent #166))) #("with " 0 5 (:parent #160)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #160) #("Maru" 0 4 (:parent #168))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #160))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #157)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #157) #("(json2yaml.rb is in the gn" 0 26 (:parent #162)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #162) #("server" 0 6 (:parent #166))) #("repo). For the current API definition\nsee " 0 42 (:parent #162)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #162) #("GnServer REST API" 0 17 (:parent #168))) #("documentation.\n" 0 15 (:parent #162))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #155))) :mode nil :granularity nil :parent #146) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #155) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #158) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #161))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #156))) :mode nil :granularity nil :parent #146) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #159))) :mode section :granularity nil :parent #156) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #159) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #162) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #165)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #165)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #165)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #165) #("instructions" 0 12 (:parent #171))) #(".\n" 0 2 (:parent #165))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #160))) :mode nil :granularity nil :parent #156) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #160) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #163) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #166)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #166) #("instructions" 0 12 (:parent #170))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #166)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #166) #("R/qtl2 formats" 0 14 (:parent #172))) #(".\n" 0 2 (:parent #166))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #163) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #167))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #163)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #163) #("and, for example, in the method run" 0 35 (:parent #169)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #169) #("rqtl" 0 4 (:parent #173))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #169) #("geno" 0 4 (:parent #174))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #169)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #169) #("extra" 0 5 (:parent #176))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #169))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #163)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #163) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #171))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #163))))))) #76)) #52)) #20 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #56) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #59) #("Reproducibility and interoperability" 0 36 (:parent #62))) #("\n" 0 1 (:parent #59)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #57) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #60) #("Webserver" 0 9 (:parent #63))) #("\n" 0 1 (:parent #60)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #58) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #61) #("GnServer (REST)" 0 15 (:parent #64))) #("\n" 0 1 (:parent #61)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #59) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #62) #("GnExec" 0 6 (:parent #65))) #("\n" 0 1 (:parent #62)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #52) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #60) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #63) #("Database" 0 8 (:parent #66))) #("\n" 0 1 (:parent #63))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #60) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #64) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #67) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #70) #("Phenotypes" 0 10 (:parent #73))) #("\n" 0 1 (:parent #70)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #64) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #68) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #71) #("Genotypes" 0 9 (:parent #74))) #("\n" 0 1 (:parent #71)))))))) #0)) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #0) #("Introduction" 0 12 (:parent #3))) #("\n" 0 1 (:parent #0)))) mapconcat(#f(compiled-function (element) #) ((paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #101))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #147) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #150))) #101 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #152))) :mode nil :granularity nil :parent #147) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #152) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #155) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #158))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #153))) :mode nil :granularity nil :parent #147) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #153) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #156) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #159)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #159) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #163))) #(").\n" 0 3 (:parent #159))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #156) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #160)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #160)) #(").\n" 0 3 (:parent #160))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #156) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #161))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #156) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #162)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #162)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #162))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #156) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #163))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #156) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #164)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #164)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #164))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #154))) :mode nil :granularity nil :parent #147) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #154) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #157) #("The main " 0 9 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #160) #("GN2 webserver" 0 13 (:parent #164))) #("is built on " 0 12 (:parent #160)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #160) #("Python flask" 0 12 (:parent #166))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #160) #("github" 0 6 (:parent #168))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #160) #("views.py" 0 8 (:parent #170))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #160) #("index" 0 5 (:parent #172)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #172) #("page.html" 0 9 (:parent #176)))) #("in the " 0 7 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #160) #("templates" 0 9 (:parent #174))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #160) #("data" 0 4 (:parent #176)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #176) #("select" 0 6 (:parent #180))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #176) #("menu.js" 0 7 (:parent #181)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #160)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #160) #("gen" 0 3 (:parent #178)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #178) #("select" 0 6 (:parent #182))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #178) #("dataset.py" 0 10 (:parent #183)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #160)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #160) #("server" 0 6 (:parent #180))) #("in the latest version, see " 0 27 (:parent #160)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #160) #("GnServer (REST)" 0 15 (:parent #182))) #(".\n" 0 2 (:parent #160))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #157) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #161)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #161) #("M2" 0 2 (:parent #165))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #161) #("0606" 0 4 (:parent #166))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #161) #("P" 0 1 (:parent #167))) #("&search" 0 7 (:parent #161)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #161) #("terms" 0 5 (:parent #169))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #161) #("or" 0 2 (:parent #170))) #("=&search" 0 8 (:parent #161)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #161) #("terms" 0 5 (:parent #172))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #161) #("and" 0 3 (:parent #173))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #161)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #161) #("server" 0 6 (:parent #175))) #("). The logic is in\nsearch" 0 25 (:parent #161)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #161) #("result.py" 0 9 (:parent #177))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #161)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #161) #("search" 0 6 (:parent #179)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #179) #("result" 0 6 (:parent #183))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #179) #("page.html" 0 9 (:parent #184)))) #(".\n" 0 2 (:parent #161))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #157) #("For what happens at the database level see " 0 43 (:parent #162)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #162)) #(".\n" 0 2 (:parent #162))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #157) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #163)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #163) #("search" 0 6 (:parent #167)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #167) #("result" 0 6 (:parent #171))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #167) #("page.html" 0 9 (:parent #172)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #163)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #163) #("DataTable container" 0 19 (:parent #169))) #(".\n" 0 2 (:parent #163))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #155))) :mode nil :granularity nil :parent #147) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #155) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #158) #("The " 0 4 (:parent #161)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #161) #("GnServer REST API" 0 17 (:parent #165))) #("is built on high performance " 0 29 (:parent #161)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #161) #("Elixir" 0 6 (:parent #167))) #("with " 0 5 (:parent #161)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #161) #("Maru" 0 4 (:parent #169))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #161))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #158)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #158) #("(json2yaml.rb is in the gn" 0 26 (:parent #163)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #163) #("server" 0 6 (:parent #167))) #("repo). For the current API definition\nsee " 0 42 (:parent #163)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #163) #("GnServer REST API" 0 17 (:parent #169))) #("documentation.\n" 0 15 (:parent #163))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #156))) :mode nil :granularity nil :parent #147) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #156) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #159) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #162))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #157))) :mode nil :granularity nil :parent #147) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #160))) :mode section :granularity nil :parent #157) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #160) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #163) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #166)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #166)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #166)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #166) #("instructions" 0 12 (:parent #172))) #(".\n" 0 2 (:parent #166))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #161))) :mode nil :granularity nil :parent #157) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #161) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #164) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #167)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #167) #("instructions" 0 12 (:parent #171))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #167)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #167) #("R/qtl2 formats" 0 14 (:parent #173))) #(".\n" 0 2 (:parent #167))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #164) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #168))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #164)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #164) #("and, for example, in the method run" 0 35 (:parent #170)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #170) #("rqtl" 0 4 (:parent #174))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #170) #("geno" 0 4 (:parent #175))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #170)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #170) #("extra" 0 5 (:parent #177))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #170))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #164)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #164) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #172))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #164))))))) #77)) #53)) #21 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #53) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #57) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #60) #("Reproducibility and interoperability" 0 36 (:parent #63))) #("\n" 0 1 (:parent #60)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #53) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #58) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #61) #("Webserver" 0 9 (:parent #64))) #("\n" 0 1 (:parent #61)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #53) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #59) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #62) #("GnServer (REST)" 0 15 (:parent #65))) #("\n" 0 1 (:parent #62)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #53) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #60) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #63) #("GnExec" 0 6 (:parent #66))) #("\n" 0 1 (:parent #63)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #53) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #61) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #64) #("Database" 0 8 (:parent #67))) #("\n" 0 1 (:parent #64))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #61) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #65) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #68) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #71) #("Phenotypes" 0 10 (:parent #74))) #("\n" 0 1 (:parent #71)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #65) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #69) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #72) #("Genotypes" 0 9 (:parent #75))) #("\n" 0 1 (:parent #72)))))))) . #0)) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #1) #("Introduction" 0 12 (:parent #4))) #("\n" 0 1 (:parent #1)))) "") org-export-data((item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #80))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #126) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #129))) #80 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #131))) :mode nil :granularity nil :parent #126) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #131) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #134) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #137))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #132))) :mode nil :granularity nil :parent #126) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #132) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #135) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #138)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #138) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #142))) #(").\n" 0 3 (:parent #138))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #135) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #139)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #139)) #(").\n" 0 3 (:parent #139))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #135) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #140))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #135) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #141)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #141))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #135) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #142))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #135) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #143)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #143)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #143))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #133))) :mode nil :granularity nil :parent #126) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #133) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #136) #("The main " 0 9 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #139) #("GN2 webserver" 0 13 (:parent #143))) #("is built on " 0 12 (:parent #139)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #139) #("Python flask" 0 12 (:parent #145))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #139) #("github" 0 6 (:parent #147))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #139) #("views.py" 0 8 (:parent #149))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #139) #("index" 0 5 (:parent #151)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #151) #("page.html" 0 9 (:parent #155)))) #("in the " 0 7 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #139) #("templates" 0 9 (:parent #153))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #139) #("data" 0 4 (:parent #155)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #155) #("select" 0 6 (:parent #159))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #155) #("menu.js" 0 7 (:parent #160)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #139) #("gen" 0 3 (:parent #157)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #157) #("select" 0 6 (:parent #161))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #157) #("dataset.py" 0 10 (:parent #162)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #139)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #139) #("server" 0 6 (:parent #159))) #("in the latest version, see " 0 27 (:parent #139)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #139) #("GnServer (REST)" 0 15 (:parent #161))) #(".\n" 0 2 (:parent #139))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #136) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #140)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #140) #("M2" 0 2 (:parent #144))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #140) #("0606" 0 4 (:parent #145))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #140) #("P" 0 1 (:parent #146))) #("&search" 0 7 (:parent #140)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #140) #("terms" 0 5 (:parent #148))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #140) #("or" 0 2 (:parent #149))) #("=&search" 0 8 (:parent #140)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #140) #("terms" 0 5 (:parent #151))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #140) #("and" 0 3 (:parent #152))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #140)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #140) #("server" 0 6 (:parent #154))) #("). The logic is in\nsearch" 0 25 (:parent #140)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #140) #("result.py" 0 9 (:parent #156))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #140) #("search" 0 6 (:parent #158)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #158) #("result" 0 6 (:parent #162))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #158) #("page.html" 0 9 (:parent #163)))) #(".\n" 0 2 (:parent #140))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #136) #("For what happens at the database level see " 0 43 (:parent #141)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #141)) #(".\n" 0 2 (:parent #141))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #136) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #142) #("search" 0 6 (:parent #146)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #146) #("result" 0 6 (:parent #150))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #146) #("page.html" 0 9 (:parent #151)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #142)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #142) #("DataTable container" 0 19 (:parent #148))) #(".\n" 0 2 (:parent #142))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #134))) :mode nil :granularity nil :parent #126) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #134) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #137) #("The " 0 4 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #140) #("GnServer REST API" 0 17 (:parent #144))) #("is built on high performance " 0 29 (:parent #140)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #140) #("Elixir" 0 6 (:parent #146))) #("with " 0 5 (:parent #140)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #140) #("Maru" 0 4 (:parent #148))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #140))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #137)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #137) #("(json2yaml.rb is in the gn" 0 26 (:parent #142)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #142) #("server" 0 6 (:parent #146))) #("repo). For the current API definition\nsee " 0 42 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #142) #("GnServer REST API" 0 17 (:parent #148))) #("documentation.\n" 0 15 (:parent #142))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #135))) :mode nil :granularity nil :parent #126) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #135) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #138) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #141))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #136))) :mode nil :granularity nil :parent #126) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #139))) :mode section :granularity nil :parent #136) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #139) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #142) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #145)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #145)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #145)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #145) #("instructions" 0 12 (:parent #151))) #(".\n" 0 2 (:parent #145))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #140))) :mode nil :granularity nil :parent #136) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #140) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #143) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #146)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #146) #("instructions" 0 12 (:parent #150))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #146)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #146) #("R/qtl2 formats" 0 14 (:parent #152))) #(".\n" 0 2 (:parent #146))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #143) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #147))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #143)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #143) #("and, for example, in the method run" 0 35 (:parent #149)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #149) #("rqtl" 0 4 (:parent #153))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #149) #("geno" 0 4 (:parent #154))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #149)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #149) #("extra" 0 5 (:parent #156))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #149))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #143)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #143) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #151))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #143))))))) #56)) #32)) #0 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #36) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #39) #("Reproducibility and interoperability" 0 36 (:parent #42))) #("\n" 0 1 (:parent #39)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #37) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #40) #("Webserver" 0 9 (:parent #43))) #("\n" 0 1 (:parent #40)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #38) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #41) #("GnServer (REST)" 0 15 (:parent #44))) #("\n" 0 1 (:parent #41)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #39) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #42) #("GnExec" 0 6 (:parent #45))) #("\n" 0 1 (:parent #42)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #40) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #43) #("Database" 0 8 (:parent #46))) #("\n" 0 1 (:parent #43))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #40) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #44) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #47) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #50) #("Phenotypes" 0 10 (:parent #53))) #("\n" 0 1 (:parent #50)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #44) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #48) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #51) #("Genotypes" 0 9 (:parent #54))) #("\n" 0 1 (:parent #51)))))))) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #0) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #3) #("Introduction" 0 12 (:parent #6))) #("\n" 0 1 (:parent #3)))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) #f(compiled-function (element) #)((item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #80))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #126) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #129))) #80 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #131))) :mode nil :granularity nil :parent #126) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #131) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #134) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #137))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #132))) :mode nil :granularity nil :parent #126) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #132) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #135) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #138)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #138) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #142))) #(").\n" 0 3 (:parent #138))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #135) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #139)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #139)) #(").\n" 0 3 (:parent #139))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #135) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #140))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #135) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #141)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #141))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #135) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #142))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #135) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #143)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #143)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #143))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #133))) :mode nil :granularity nil :parent #126) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #133) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #136) #("The main " 0 9 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #139) #("GN2 webserver" 0 13 (:parent #143))) #("is built on " 0 12 (:parent #139)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #139) #("Python flask" 0 12 (:parent #145))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #139) #("github" 0 6 (:parent #147))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #139) #("views.py" 0 8 (:parent #149))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #139) #("index" 0 5 (:parent #151)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #151) #("page.html" 0 9 (:parent #155)))) #("in the " 0 7 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #139) #("templates" 0 9 (:parent #153))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #139) #("data" 0 4 (:parent #155)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #155) #("select" 0 6 (:parent #159))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #155) #("menu.js" 0 7 (:parent #160)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #139)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #139) #("gen" 0 3 (:parent #157)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #157) #("select" 0 6 (:parent #161))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #157) #("dataset.py" 0 10 (:parent #162)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #139)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #139) #("server" 0 6 (:parent #159))) #("in the latest version, see " 0 27 (:parent #139)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #139) #("GnServer (REST)" 0 15 (:parent #161))) #(".\n" 0 2 (:parent #139))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #136) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #140)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #140) #("M2" 0 2 (:parent #144))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #140) #("0606" 0 4 (:parent #145))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #140) #("P" 0 1 (:parent #146))) #("&search" 0 7 (:parent #140)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #140) #("terms" 0 5 (:parent #148))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #140) #("or" 0 2 (:parent #149))) #("=&search" 0 8 (:parent #140)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #140) #("terms" 0 5 (:parent #151))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #140) #("and" 0 3 (:parent #152))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #140)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #140) #("server" 0 6 (:parent #154))) #("). The logic is in\nsearch" 0 25 (:parent #140)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #140) #("result.py" 0 9 (:parent #156))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #140) #("search" 0 6 (:parent #158)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #158) #("result" 0 6 (:parent #162))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #158) #("page.html" 0 9 (:parent #163)))) #(".\n" 0 2 (:parent #140))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #136) #("For what happens at the database level see " 0 43 (:parent #141)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #141)) #(".\n" 0 2 (:parent #141))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #136) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #142) #("search" 0 6 (:parent #146)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #146) #("result" 0 6 (:parent #150))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #146) #("page.html" 0 9 (:parent #151)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #142)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #142) #("DataTable container" 0 19 (:parent #148))) #(".\n" 0 2 (:parent #142))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #134))) :mode nil :granularity nil :parent #126) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #134) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #137) #("The " 0 4 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #140) #("GnServer REST API" 0 17 (:parent #144))) #("is built on high performance " 0 29 (:parent #140)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #140) #("Elixir" 0 6 (:parent #146))) #("with " 0 5 (:parent #140)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #140) #("Maru" 0 4 (:parent #148))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #140))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #137)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #137) #("(json2yaml.rb is in the gn" 0 26 (:parent #142)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #142) #("server" 0 6 (:parent #146))) #("repo). For the current API definition\nsee " 0 42 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #142) #("GnServer REST API" 0 17 (:parent #148))) #("documentation.\n" 0 15 (:parent #142))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #135))) :mode nil :granularity nil :parent #126) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #135) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #138) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #141))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #136))) :mode nil :granularity nil :parent #126) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #139))) :mode section :granularity nil :parent #136) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #139) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #142) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #145)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #145)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #145)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #145) #("instructions" 0 12 (:parent #151))) #(".\n" 0 2 (:parent #145))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #140))) :mode nil :granularity nil :parent #136) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #140) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #143) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #146)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #146) #("instructions" 0 12 (:parent #150))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #146)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #146) #("R/qtl2 formats" 0 14 (:parent #152))) #(".\n" 0 2 (:parent #146))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #143) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #147))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #143)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #143) #("and, for example, in the method run" 0 35 (:parent #149)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #149) #("rqtl" 0 4 (:parent #153))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #149) #("geno" 0 4 (:parent #154))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #149)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #149) #("extra" 0 5 (:parent #156))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #149))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #143)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #143) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #151))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #143))))))) #56)) #32)) #0 (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #36) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #39) #("Reproducibility and interoperability" 0 36 (:parent #42))) #("\n" 0 1 (:parent #39)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #37) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #40) #("Webserver" 0 9 (:parent #43))) #("\n" 0 1 (:parent #40)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #38) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #41) #("GnServer (REST)" 0 15 (:parent #44))) #("\n" 0 1 (:parent #41)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #39) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #42) #("GnExec" 0 6 (:parent #45))) #("\n" 0 1 (:parent #42)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #32) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #40) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #43) #("Database" 0 8 (:parent #46))) #("\n" 0 1 (:parent #43))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #40) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #44) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #47) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #50) #("Phenotypes" 0 10 (:parent #53))) #("\n" 0 1 (:parent #50)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #44) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #48) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #51) #("Genotypes" 0 9 (:parent #54))) #("\n" 0 1 (:parent #51)))))))) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #0) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #3) #("Introduction" 0 12 (:parent #6))) #("\n" 0 1 (:parent #3))))) mapconcat(#f(compiled-function (element) #) ((item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #81))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #127) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #130))) #81 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #132))) :mode nil :granularity nil :parent #127) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #132) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #135) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #138))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #133))) :mode nil :granularity nil :parent #127) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #133) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #136) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #139)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #139) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #143))) #(").\n" 0 3 (:parent #139))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #136) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #140)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #140)) #(").\n" 0 3 (:parent #140))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #136) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #141))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #136) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #142)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #142))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #136) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #143))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #136) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #144)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #144)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #144))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #134))) :mode nil :granularity nil :parent #127) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #134) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #137) #("The main " 0 9 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #140) #("GN2 webserver" 0 13 (:parent #144))) #("is built on " 0 12 (:parent #140)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #140) #("Python flask" 0 12 (:parent #146))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #140) #("github" 0 6 (:parent #148))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #140) #("views.py" 0 8 (:parent #150))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #140) #("index" 0 5 (:parent #152)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #152) #("page.html" 0 9 (:parent #156)))) #("in the " 0 7 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #140) #("templates" 0 9 (:parent #154))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #140) #("data" 0 4 (:parent #156)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #156) #("select" 0 6 (:parent #160))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #156) #("menu.js" 0 7 (:parent #161)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #140)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #140) #("gen" 0 3 (:parent #158)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #158) #("select" 0 6 (:parent #162))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #158) #("dataset.py" 0 10 (:parent #163)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #140)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #140) #("server" 0 6 (:parent #160))) #("in the latest version, see " 0 27 (:parent #140)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #140) #("GnServer (REST)" 0 15 (:parent #162))) #(".\n" 0 2 (:parent #140))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #137) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #141)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #141) #("M2" 0 2 (:parent #145))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #141) #("0606" 0 4 (:parent #146))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #141) #("P" 0 1 (:parent #147))) #("&search" 0 7 (:parent #141)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #141) #("terms" 0 5 (:parent #149))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #141) #("or" 0 2 (:parent #150))) #("=&search" 0 8 (:parent #141)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #141) #("terms" 0 5 (:parent #152))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #141) #("and" 0 3 (:parent #153))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #141)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #141) #("server" 0 6 (:parent #155))) #("). The logic is in\nsearch" 0 25 (:parent #141)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #141) #("result.py" 0 9 (:parent #157))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #141) #("search" 0 6 (:parent #159)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #159) #("result" 0 6 (:parent #163))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #159) #("page.html" 0 9 (:parent #164)))) #(".\n" 0 2 (:parent #141))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #137) #("For what happens at the database level see " 0 43 (:parent #142)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #142)) #(".\n" 0 2 (:parent #142))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #137) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #143) #("search" 0 6 (:parent #147)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #147) #("result" 0 6 (:parent #151))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #147) #("page.html" 0 9 (:parent #152)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #143)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #143) #("DataTable container" 0 19 (:parent #149))) #(".\n" 0 2 (:parent #143))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #135))) :mode nil :granularity nil :parent #127) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #135) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #138) #("The " 0 4 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #141) #("GnServer REST API" 0 17 (:parent #145))) #("is built on high performance " 0 29 (:parent #141)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #141) #("Elixir" 0 6 (:parent #147))) #("with " 0 5 (:parent #141)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #141) #("Maru" 0 4 (:parent #149))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #141))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #138)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #138) #("(json2yaml.rb is in the gn" 0 26 (:parent #143)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #143) #("server" 0 6 (:parent #147))) #("repo). For the current API definition\nsee " 0 42 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #143) #("GnServer REST API" 0 17 (:parent #149))) #("documentation.\n" 0 15 (:parent #143))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #136))) :mode nil :granularity nil :parent #127) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #136) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #139) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #142))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #137))) :mode nil :granularity nil :parent #127) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #140))) :mode section :granularity nil :parent #137) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #140) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #143) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #146)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #146)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #146)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #146) #("instructions" 0 12 (:parent #152))) #(".\n" 0 2 (:parent #146))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #141))) :mode nil :granularity nil :parent #137) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #141) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #144) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #147)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #147) #("instructions" 0 12 (:parent #151))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #147)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #147) #("R/qtl2 formats" 0 14 (:parent #153))) #(".\n" 0 2 (:parent #147))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #144) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #148))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #144)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #144) #("and, for example, in the method run" 0 35 (:parent #150)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #150) #("rqtl" 0 4 (:parent #154))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #150) #("geno" 0 4 (:parent #155))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #150)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #150) #("extra" 0 5 (:parent #157))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #150))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #144)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #144) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #152))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #144))))))) #57)) #33)) . #0)) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #1) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #4) #("Introduction" 0 12 (:parent #7))) #("\n" 0 1 (:parent #4)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #82))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #128) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #131))) #82 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #133))) :mode nil :granularity nil :parent #128) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #133) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #136) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #139))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #134))) :mode nil :granularity nil :parent #128) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #134) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #137) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #140)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #140) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #144))) #(").\n" 0 3 (:parent #140))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #137) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #141)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #141)) #(").\n" 0 3 (:parent #141))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #137) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #142))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #137) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #143)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #143))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #137) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #144))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #137) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #145)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #145)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #145))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #135))) :mode nil :granularity nil :parent #128) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #135) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #138) #("The main " 0 9 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #141) #("GN2 webserver" 0 13 (:parent #145))) #("is built on " 0 12 (:parent #141)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #141) #("Python flask" 0 12 (:parent #147))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #141) #("github" 0 6 (:parent #149))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #141) #("views.py" 0 8 (:parent #151))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #141) #("index" 0 5 (:parent #153)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #153) #("page.html" 0 9 (:parent #157)))) #("in the " 0 7 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #141) #("templates" 0 9 (:parent #155))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #141) #("data" 0 4 (:parent #157)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #157) #("select" 0 6 (:parent #161))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #157) #("menu.js" 0 7 (:parent #162)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #141)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #141) #("gen" 0 3 (:parent #159)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #159) #("select" 0 6 (:parent #163))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #159) #("dataset.py" 0 10 (:parent #164)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #141)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #141) #("server" 0 6 (:parent #161))) #("in the latest version, see " 0 27 (:parent #141)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #141) #("GnServer (REST)" 0 15 (:parent #163))) #(".\n" 0 2 (:parent #141))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #138) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #142)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #142) #("M2" 0 2 (:parent #146))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #142) #("0606" 0 4 (:parent #147))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #142) #("P" 0 1 (:parent #148))) #("&search" 0 7 (:parent #142)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #142) #("terms" 0 5 (:parent #150))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #142) #("or" 0 2 (:parent #151))) #("=&search" 0 8 (:parent #142)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #142) #("terms" 0 5 (:parent #153))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #142) #("and" 0 3 (:parent #154))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #142)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #142) #("server" 0 6 (:parent #156))) #("). The logic is in\nsearch" 0 25 (:parent #142)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #142) #("result.py" 0 9 (:parent #158))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #142) #("search" 0 6 (:parent #160)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #160) #("result" 0 6 (:parent #164))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #160) #("page.html" 0 9 (:parent #165)))) #(".\n" 0 2 (:parent #142))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #138) #("For what happens at the database level see " 0 43 (:parent #143)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #143)) #(".\n" 0 2 (:parent #143))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #138) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #144) #("search" 0 6 (:parent #148)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #148) #("result" 0 6 (:parent #152))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #148) #("page.html" 0 9 (:parent #153)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #144)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #144) #("DataTable container" 0 19 (:parent #150))) #(".\n" 0 2 (:parent #144))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #136))) :mode nil :granularity nil :parent #128) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #136) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #139) #("The " 0 4 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #142) #("GnServer REST API" 0 17 (:parent #146))) #("is built on high performance " 0 29 (:parent #142)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #142) #("Elixir" 0 6 (:parent #148))) #("with " 0 5 (:parent #142)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #142) #("Maru" 0 4 (:parent #150))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #142))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #139)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #139) #("(json2yaml.rb is in the gn" 0 26 (:parent #144)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #144) #("server" 0 6 (:parent #148))) #("repo). For the current API definition\nsee " 0 42 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #144) #("GnServer REST API" 0 17 (:parent #150))) #("documentation.\n" 0 15 (:parent #144))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #137))) :mode nil :granularity nil :parent #128) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #137) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #140) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #143))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #138))) :mode nil :granularity nil :parent #128) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #141))) :mode section :granularity nil :parent #138) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #141) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #144) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #147)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #147)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #147)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #147) #("instructions" 0 12 (:parent #153))) #(".\n" 0 2 (:parent #147))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #142))) :mode nil :granularity nil :parent #138) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #142) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #145) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #148)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #148) #("instructions" 0 12 (:parent #152))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #148)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #148) #("R/qtl2 formats" 0 14 (:parent #154))) #(".\n" 0 2 (:parent #148))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #145) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #149))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #145)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #145) #("and, for example, in the method run" 0 35 (:parent #151)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #151) #("rqtl" 0 4 (:parent #155))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #151) #("geno" 0 4 (:parent #156))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #151)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #151) #("extra" 0 5 (:parent #158))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #151))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #145)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #145) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #153))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #145))))))) #58)) #34)) . #0)) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #2) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #5) #("Reproducibility and interoperability" 0 36 (:parent #8))) #("\n" 0 1 (:parent #5)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #83))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #129) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #132))) #83 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #134))) :mode nil :granularity nil :parent #129) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #134) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #137) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #140))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #135))) :mode nil :granularity nil :parent #129) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #135) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #138) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #141)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #141) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #145))) #(").\n" 0 3 (:parent #141))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #138) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #142)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #142)) #(").\n" 0 3 (:parent #142))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #138) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #143))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #138) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #144)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #144))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #138) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #145))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #138) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #146)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #146)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #146))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #136))) :mode nil :granularity nil :parent #129) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #136) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #139) #("The main " 0 9 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #142) #("GN2 webserver" 0 13 (:parent #146))) #("is built on " 0 12 (:parent #142)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #142) #("Python flask" 0 12 (:parent #148))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #142) #("github" 0 6 (:parent #150))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #142) #("views.py" 0 8 (:parent #152))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #142) #("index" 0 5 (:parent #154)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #154) #("page.html" 0 9 (:parent #158)))) #("in the " 0 7 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #142) #("templates" 0 9 (:parent #156))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #142) #("data" 0 4 (:parent #158)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #158) #("select" 0 6 (:parent #162))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #158) #("menu.js" 0 7 (:parent #163)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #142)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #142) #("gen" 0 3 (:parent #160)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #160) #("select" 0 6 (:parent #164))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #160) #("dataset.py" 0 10 (:parent #165)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #142)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #142) #("server" 0 6 (:parent #162))) #("in the latest version, see " 0 27 (:parent #142)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #142) #("GnServer (REST)" 0 15 (:parent #164))) #(".\n" 0 2 (:parent #142))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #139) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #143)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #143) #("M2" 0 2 (:parent #147))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #143) #("0606" 0 4 (:parent #148))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #143) #("P" 0 1 (:parent #149))) #("&search" 0 7 (:parent #143)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #143) #("terms" 0 5 (:parent #151))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #143) #("or" 0 2 (:parent #152))) #("=&search" 0 8 (:parent #143)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #143) #("terms" 0 5 (:parent #154))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #143) #("and" 0 3 (:parent #155))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #143)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #143) #("server" 0 6 (:parent #157))) #("). The logic is in\nsearch" 0 25 (:parent #143)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #143) #("result.py" 0 9 (:parent #159))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #143) #("search" 0 6 (:parent #161)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #161) #("result" 0 6 (:parent #165))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #161) #("page.html" 0 9 (:parent #166)))) #(".\n" 0 2 (:parent #143))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #139) #("For what happens at the database level see " 0 43 (:parent #144)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #144)) #(".\n" 0 2 (:parent #144))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #139) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #145) #("search" 0 6 (:parent #149)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #149) #("result" 0 6 (:parent #153))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #149) #("page.html" 0 9 (:parent #154)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #145)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #145) #("DataTable container" 0 19 (:parent #151))) #(".\n" 0 2 (:parent #145))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #137))) :mode nil :granularity nil :parent #129) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #137) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #140) #("The " 0 4 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #143) #("GnServer REST API" 0 17 (:parent #147))) #("is built on high performance " 0 29 (:parent #143)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #143) #("Elixir" 0 6 (:parent #149))) #("with " 0 5 (:parent #143)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #143) #("Maru" 0 4 (:parent #151))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #143))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #140)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #140) #("(json2yaml.rb is in the gn" 0 26 (:parent #145)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #145) #("server" 0 6 (:parent #149))) #("repo). For the current API definition\nsee " 0 42 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #145) #("GnServer REST API" 0 17 (:parent #151))) #("documentation.\n" 0 15 (:parent #145))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #138))) :mode nil :granularity nil :parent #129) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #138) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #141) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #144))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #139))) :mode nil :granularity nil :parent #129) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #142))) :mode section :granularity nil :parent #139) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #142) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #145) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #148)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #148)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #148)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #148) #("instructions" 0 12 (:parent #154))) #(".\n" 0 2 (:parent #148))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #143))) :mode nil :granularity nil :parent #139) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #143) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #146) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #149)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #149) #("instructions" 0 12 (:parent #153))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #149)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #149) #("R/qtl2 formats" 0 14 (:parent #155))) #(".\n" 0 2 (:parent #149))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #146) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #150))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #146)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #146) #("and, for example, in the method run" 0 35 (:parent #152)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #152) #("rqtl" 0 4 (:parent #156))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #152) #("geno" 0 4 (:parent #157))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #152)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #152) #("extra" 0 5 (:parent #159))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #152))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #146)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #146) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #154))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #146))))))) #59)) #35)) . #0)) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #3) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #6) #("Webserver" 0 9 (:parent #9))) #("\n" 0 1 (:parent #6)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #84))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #130) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #133))) #84 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #135))) :mode nil :granularity nil :parent #130) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #135) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #138) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #141))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #136))) :mode nil :granularity nil :parent #130) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #136) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #139) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #142)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #142) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #146))) #(").\n" 0 3 (:parent #142))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #139) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #143)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #143)) #(").\n" 0 3 (:parent #143))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #139) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #144))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #139) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #145)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #145))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #139) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #146))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #139) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #147)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #147)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #147))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #137))) :mode nil :granularity nil :parent #130) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #137) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #140) #("The main " 0 9 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #143) #("GN2 webserver" 0 13 (:parent #147))) #("is built on " 0 12 (:parent #143)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #143) #("Python flask" 0 12 (:parent #149))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #143) #("github" 0 6 (:parent #151))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #143) #("views.py" 0 8 (:parent #153))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #143) #("index" 0 5 (:parent #155)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #155) #("page.html" 0 9 (:parent #159)))) #("in the " 0 7 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #143) #("templates" 0 9 (:parent #157))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #143) #("data" 0 4 (:parent #159)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #159) #("select" 0 6 (:parent #163))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #159) #("menu.js" 0 7 (:parent #164)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #143)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #143) #("gen" 0 3 (:parent #161)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #161) #("select" 0 6 (:parent #165))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #161) #("dataset.py" 0 10 (:parent #166)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #143)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #143) #("server" 0 6 (:parent #163))) #("in the latest version, see " 0 27 (:parent #143)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #143) #("GnServer (REST)" 0 15 (:parent #165))) #(".\n" 0 2 (:parent #143))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #140) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #144)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #144) #("M2" 0 2 (:parent #148))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #144) #("0606" 0 4 (:parent #149))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #144) #("P" 0 1 (:parent #150))) #("&search" 0 7 (:parent #144)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #144) #("terms" 0 5 (:parent #152))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #144) #("or" 0 2 (:parent #153))) #("=&search" 0 8 (:parent #144)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #144) #("terms" 0 5 (:parent #155))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #144) #("and" 0 3 (:parent #156))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #144)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #144) #("server" 0 6 (:parent #158))) #("). The logic is in\nsearch" 0 25 (:parent #144)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #144) #("result.py" 0 9 (:parent #160))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #144) #("search" 0 6 (:parent #162)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #162) #("result" 0 6 (:parent #166))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #162) #("page.html" 0 9 (:parent #167)))) #(".\n" 0 2 (:parent #144))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #140) #("For what happens at the database level see " 0 43 (:parent #145)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #145)) #(".\n" 0 2 (:parent #145))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #140) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #146)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #146) #("search" 0 6 (:parent #150)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #150) #("result" 0 6 (:parent #154))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #150) #("page.html" 0 9 (:parent #155)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #146)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #146) #("DataTable container" 0 19 (:parent #152))) #(".\n" 0 2 (:parent #146))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #138))) :mode nil :granularity nil :parent #130) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #138) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #141) #("The " 0 4 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #144) #("GnServer REST API" 0 17 (:parent #148))) #("is built on high performance " 0 29 (:parent #144)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #144) #("Elixir" 0 6 (:parent #150))) #("with " 0 5 (:parent #144)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #144) #("Maru" 0 4 (:parent #152))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #144))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #141)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #141) #("(json2yaml.rb is in the gn" 0 26 (:parent #146)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #146) #("server" 0 6 (:parent #150))) #("repo). For the current API definition\nsee " 0 42 (:parent #146)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #146) #("GnServer REST API" 0 17 (:parent #152))) #("documentation.\n" 0 15 (:parent #146))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #139))) :mode nil :granularity nil :parent #130) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #139) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #142) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #145))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #140))) :mode nil :granularity nil :parent #130) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #143))) :mode section :granularity nil :parent #140) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #143) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #146) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #149)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #149)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #149)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #149) #("instructions" 0 12 (:parent #155))) #(".\n" 0 2 (:parent #149))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #144))) :mode nil :granularity nil :parent #140) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #144) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #147) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #150)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #150) #("instructions" 0 12 (:parent #154))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #150)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #150) #("R/qtl2 formats" 0 14 (:parent #156))) #(".\n" 0 2 (:parent #150))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #147) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #151))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #147)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #147) #("and, for example, in the method run" 0 35 (:parent #153)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #153) #("rqtl" 0 4 (:parent #157))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #153) #("geno" 0 4 (:parent #158))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #153)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #153) #("extra" 0 5 (:parent #160))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #153))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #147)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #147) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #155))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #147))))))) #60)) #36)) . #0)) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #4) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #7) #("GnServer (REST)" 0 15 (:parent #10))) #("\n" 0 1 (:parent #7)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #85))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #131) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #134))) #85 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #136))) :mode nil :granularity nil :parent #131) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #136) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #139) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #142))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #137))) :mode nil :granularity nil :parent #131) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #137) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #140) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #143)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #143) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #147))) #(").\n" 0 3 (:parent #143))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #140) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #144)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #144)) #(").\n" 0 3 (:parent #144))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #140) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #145))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #140) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #146)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #146)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #146))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #140) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #147))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #140) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #148)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #148)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #148))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #138))) :mode nil :granularity nil :parent #131) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #138) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #141) #("The main " 0 9 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #144) #("GN2 webserver" 0 13 (:parent #148))) #("is built on " 0 12 (:parent #144)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #144) #("Python flask" 0 12 (:parent #150))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #144) #("github" 0 6 (:parent #152))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #144) #("views.py" 0 8 (:parent #154))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #144) #("index" 0 5 (:parent #156)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #156) #("page.html" 0 9 (:parent #160)))) #("in the " 0 7 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #144) #("templates" 0 9 (:parent #158))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #144) #("data" 0 4 (:parent #160)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #160) #("select" 0 6 (:parent #164))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #160) #("menu.js" 0 7 (:parent #165)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #144)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #144) #("gen" 0 3 (:parent #162)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #162) #("select" 0 6 (:parent #166))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #162) #("dataset.py" 0 10 (:parent #167)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #144)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #144) #("server" 0 6 (:parent #164))) #("in the latest version, see " 0 27 (:parent #144)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #144) #("GnServer (REST)" 0 15 (:parent #166))) #(".\n" 0 2 (:parent #144))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #141) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #145)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #145) #("M2" 0 2 (:parent #149))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #145) #("0606" 0 4 (:parent #150))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #145) #("P" 0 1 (:parent #151))) #("&search" 0 7 (:parent #145)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #145) #("terms" 0 5 (:parent #153))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #145) #("or" 0 2 (:parent #154))) #("=&search" 0 8 (:parent #145)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #145) #("terms" 0 5 (:parent #156))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #145) #("and" 0 3 (:parent #157))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #145)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #145) #("server" 0 6 (:parent #159))) #("). The logic is in\nsearch" 0 25 (:parent #145)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #145) #("result.py" 0 9 (:parent #161))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #145) #("search" 0 6 (:parent #163)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #163) #("result" 0 6 (:parent #167))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #163) #("page.html" 0 9 (:parent #168)))) #(".\n" 0 2 (:parent #145))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #141) #("For what happens at the database level see " 0 43 (:parent #146)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #146)) #(".\n" 0 2 (:parent #146))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #141) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #147)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #147) #("search" 0 6 (:parent #151)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #151) #("result" 0 6 (:parent #155))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #151) #("page.html" 0 9 (:parent #156)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #147)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #147) #("DataTable container" 0 19 (:parent #153))) #(".\n" 0 2 (:parent #147))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #139))) :mode nil :granularity nil :parent #131) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #139) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #142) #("The " 0 4 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #145) #("GnServer REST API" 0 17 (:parent #149))) #("is built on high performance " 0 29 (:parent #145)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #145) #("Elixir" 0 6 (:parent #151))) #("with " 0 5 (:parent #145)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #145) #("Maru" 0 4 (:parent #153))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #145))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #142)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #142) #("(json2yaml.rb is in the gn" 0 26 (:parent #147)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #147) #("server" 0 6 (:parent #151))) #("repo). For the current API definition\nsee " 0 42 (:parent #147)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #147) #("GnServer REST API" 0 17 (:parent #153))) #("documentation.\n" 0 15 (:parent #147))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #140))) :mode nil :granularity nil :parent #131) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #140) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #143) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #146))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #141))) :mode nil :granularity nil :parent #131) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #144))) :mode section :granularity nil :parent #141) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #144) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #147) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #150)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #150)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #150)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #150) #("instructions" 0 12 (:parent #156))) #(".\n" 0 2 (:parent #150))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #145))) :mode nil :granularity nil :parent #141) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #145) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #148) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #151)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #151) #("instructions" 0 12 (:parent #155))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #151)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #151) #("R/qtl2 formats" 0 14 (:parent #157))) #(".\n" 0 2 (:parent #151))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #148) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #152))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #148)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #148) #("and, for example, in the method run" 0 35 (:parent #154)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #154) #("rqtl" 0 4 (:parent #158))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #154) #("geno" 0 4 (:parent #159))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #154)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #154) #("extra" 0 5 (:parent #161))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #154))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #148)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #148) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #156))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #148))))))) #61)) #37)) . #0)) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #5) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #8) #("GnExec" 0 6 (:parent #11))) #("\n" 0 1 (:parent #8)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #86))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #132) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #135))) #86 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #137))) :mode nil :granularity nil :parent #132) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #137) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #140) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #143))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #138))) :mode nil :granularity nil :parent #132) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #138) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #141) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #144)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #144) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #148))) #(").\n" 0 3 (:parent #144))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #141) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #145)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #145)) #(").\n" 0 3 (:parent #145))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #141) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #146))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #141) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #147)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #147)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #147))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #141) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #148))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #141) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #149)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #149)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #149))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #139))) :mode nil :granularity nil :parent #132) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #139) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #142) #("The main " 0 9 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #145) #("GN2 webserver" 0 13 (:parent #149))) #("is built on " 0 12 (:parent #145)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #145) #("Python flask" 0 12 (:parent #151))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #145) #("github" 0 6 (:parent #153))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #145) #("views.py" 0 8 (:parent #155))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #145) #("index" 0 5 (:parent #157)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #157) #("page.html" 0 9 (:parent #161)))) #("in the " 0 7 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #145) #("templates" 0 9 (:parent #159))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #145) #("data" 0 4 (:parent #161)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #161) #("select" 0 6 (:parent #165))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #161) #("menu.js" 0 7 (:parent #166)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #145)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #145) #("gen" 0 3 (:parent #163)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #163) #("select" 0 6 (:parent #167))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #163) #("dataset.py" 0 10 (:parent #168)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #145)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #145) #("server" 0 6 (:parent #165))) #("in the latest version, see " 0 27 (:parent #145)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #145) #("GnServer (REST)" 0 15 (:parent #167))) #(".\n" 0 2 (:parent #145))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #142) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #146)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #146) #("M2" 0 2 (:parent #150))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #146) #("0606" 0 4 (:parent #151))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #146) #("P" 0 1 (:parent #152))) #("&search" 0 7 (:parent #146)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #146) #("terms" 0 5 (:parent #154))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #146) #("or" 0 2 (:parent #155))) #("=&search" 0 8 (:parent #146)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #146) #("terms" 0 5 (:parent #157))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #146) #("and" 0 3 (:parent #158))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #146)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #146) #("server" 0 6 (:parent #160))) #("). The logic is in\nsearch" 0 25 (:parent #146)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #146) #("result.py" 0 9 (:parent #162))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #146)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #146) #("search" 0 6 (:parent #164)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #164) #("result" 0 6 (:parent #168))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #164) #("page.html" 0 9 (:parent #169)))) #(".\n" 0 2 (:parent #146))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #142) #("For what happens at the database level see " 0 43 (:parent #147)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #147)) #(".\n" 0 2 (:parent #147))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #142) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #148)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #148) #("search" 0 6 (:parent #152)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #152) #("result" 0 6 (:parent #156))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #152) #("page.html" 0 9 (:parent #157)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #148)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #148) #("DataTable container" 0 19 (:parent #154))) #(".\n" 0 2 (:parent #148))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #140))) :mode nil :granularity nil :parent #132) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #140) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #143) #("The " 0 4 (:parent #146)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #146) #("GnServer REST API" 0 17 (:parent #150))) #("is built on high performance " 0 29 (:parent #146)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #146) #("Elixir" 0 6 (:parent #152))) #("with " 0 5 (:parent #146)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #146) #("Maru" 0 4 (:parent #154))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #146))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #143)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #143) #("(json2yaml.rb is in the gn" 0 26 (:parent #148)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #148) #("server" 0 6 (:parent #152))) #("repo). For the current API definition\nsee " 0 42 (:parent #148)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #148) #("GnServer REST API" 0 17 (:parent #154))) #("documentation.\n" 0 15 (:parent #148))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #141))) :mode nil :granularity nil :parent #132) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #141) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #144) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #147))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #142))) :mode nil :granularity nil :parent #132) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #145))) :mode section :granularity nil :parent #142) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #145) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #148) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #151)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #151)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #151)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #151) #("instructions" 0 12 (:parent #157))) #(".\n" 0 2 (:parent #151))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #146))) :mode nil :granularity nil :parent #142) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #146) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #149) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #152)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #152) #("instructions" 0 12 (:parent #156))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #152)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #152) #("R/qtl2 formats" 0 14 (:parent #158))) #(".\n" 0 2 (:parent #152))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #149) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #153))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #149)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #149) #("and, for example, in the method run" 0 35 (:parent #155)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #155) #("rqtl" 0 4 (:parent #159))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #155) #("geno" 0 4 (:parent #160))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #155)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #155) #("extra" 0 5 (:parent #162))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #155))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #149)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #149) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #157))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #149))))))) #62)) #38)) . #0)) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #6) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #9) #("Database" 0 8 (:parent #12))) #("\n" 0 1 (:parent #9))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #6) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #13) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #16) #("Phenotypes" 0 10 (:parent #19))) #("\n" 0 1 (:parent #16)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #14) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #17) #("Genotypes" 0 9 (:parent #20))) #("\n" 0 1 (:parent #17))))))) "") org-export-data((plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #48))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #94) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #97))) #48 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #99))) :mode nil :granularity nil :parent #94) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #99) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #102) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #105))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #100))) :mode nil :granularity nil :parent #94) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #100) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #103) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #106)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #106) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #110))) #(").\n" 0 3 (:parent #106))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #103) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #107)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #107)) #(").\n" 0 3 (:parent #107))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #103) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #108))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #103) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #109)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #109)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #109))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #103) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #110))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #103) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #111)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #111)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #111))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #101))) :mode nil :granularity nil :parent #94) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #101) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #104) #("The main " 0 9 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #107) #("GN2 webserver" 0 13 (:parent #111))) #("is built on " 0 12 (:parent #107)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #107) #("Python flask" 0 12 (:parent #113))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #107) #("github" 0 6 (:parent #115))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #107) #("views.py" 0 8 (:parent #117))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #107) #("index" 0 5 (:parent #119)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #119) #("page.html" 0 9 (:parent #123)))) #("in the " 0 7 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #107) #("templates" 0 9 (:parent #121))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #107) #("data" 0 4 (:parent #123)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #123) #("select" 0 6 (:parent #127))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #123) #("menu.js" 0 7 (:parent #128)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #107) #("gen" 0 3 (:parent #125)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #125) #("select" 0 6 (:parent #129))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #125) #("dataset.py" 0 10 (:parent #130)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #107)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #107) #("server" 0 6 (:parent #127))) #("in the latest version, see " 0 27 (:parent #107)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #107) #("GnServer (REST)" 0 15 (:parent #129))) #(".\n" 0 2 (:parent #107))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #104) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #108)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #108) #("M2" 0 2 (:parent #112))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #108) #("0606" 0 4 (:parent #113))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #108) #("P" 0 1 (:parent #114))) #("&search" 0 7 (:parent #108)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #108) #("terms" 0 5 (:parent #116))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #108) #("or" 0 2 (:parent #117))) #("=&search" 0 8 (:parent #108)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #108) #("terms" 0 5 (:parent #119))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #108) #("and" 0 3 (:parent #120))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #108)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #108) #("server" 0 6 (:parent #122))) #("). The logic is in\nsearch" 0 25 (:parent #108)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #108) #("result.py" 0 9 (:parent #124))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #108) #("search" 0 6 (:parent #126)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #126) #("result" 0 6 (:parent #130))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #126) #("page.html" 0 9 (:parent #131)))) #(".\n" 0 2 (:parent #108))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #104) #("For what happens at the database level see " 0 43 (:parent #109)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #109)) #(".\n" 0 2 (:parent #109))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #104) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #110)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #110) #("search" 0 6 (:parent #114)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #114) #("result" 0 6 (:parent #118))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #114) #("page.html" 0 9 (:parent #119)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #110)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #110) #("DataTable container" 0 19 (:parent #116))) #(".\n" 0 2 (:parent #110))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #102))) :mode nil :granularity nil :parent #94) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #102) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #105) #("The " 0 4 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #108) #("GnServer REST API" 0 17 (:parent #112))) #("is built on high performance " 0 29 (:parent #108)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #108) #("Elixir" 0 6 (:parent #114))) #("with " 0 5 (:parent #108)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #108) #("Maru" 0 4 (:parent #116))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #108))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #105)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #105) #("(json2yaml.rb is in the gn" 0 26 (:parent #110)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #110) #("server" 0 6 (:parent #114))) #("repo). For the current API definition\nsee " 0 42 (:parent #110)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #110) #("GnServer REST API" 0 17 (:parent #116))) #("documentation.\n" 0 15 (:parent #110))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #103))) :mode nil :granularity nil :parent #94) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #103) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #106) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #109))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #104))) :mode nil :granularity nil :parent #94) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #107))) :mode section :granularity nil :parent #104) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #107) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #110) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #113)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #113)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #113)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #113) #("instructions" 0 12 (:parent #119))) #(".\n" 0 2 (:parent #113))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #108))) :mode nil :granularity nil :parent #104) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #108) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #111) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #114)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #114) #("instructions" 0 12 (:parent #118))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #114)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #114) #("R/qtl2 formats" 0 14 (:parent #120))) #(".\n" 0 2 (:parent #114))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #111) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #115))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #111)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #111) #("and, for example, in the method run" 0 35 (:parent #117)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #117) #("rqtl" 0 4 (:parent #121))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #117) #("geno" 0 4 (:parent #122))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #117)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #117) #("extra" 0 5 (:parent #124))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #117))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #111)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #111) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #119))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #111))))))) #24)) #0)) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #3) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #6) #("Introduction" 0 12 (:parent #9))) #("\n" 0 1 (:parent #6)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #4) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #7) #("Reproducibility and interoperability" 0 36 (:parent #10))) #("\n" 0 1 (:parent #7)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #5) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #8) #("Webserver" 0 9 (:parent #11))) #("\n" 0 1 (:parent #8)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #6) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #9) #("GnServer (REST)" 0 15 (:parent #12))) #("\n" 0 1 (:parent #9)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #7) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #10) #("GnExec" 0 6 (:parent #13))) #("\n" 0 1 (:parent #10)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #8) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #11) #("Database" 0 8 (:parent #14))) #("\n" 0 1 (:parent #11))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #8) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #12) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #15) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #18) #("Phenotypes" 0 10 (:parent #21))) #("\n" 0 1 (:parent #18)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #12) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #16) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #19) #("Genotypes" 0 9 (:parent #22))) #("\n" 0 1 (:parent #19))))))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) #f(compiled-function (element) #)((plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #48))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #94) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #97))) #48 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #99))) :mode nil :granularity nil :parent #94) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #99) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #102) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #105))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #100))) :mode nil :granularity nil :parent #94) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #100) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #103) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #106)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #106) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #110))) #(").\n" 0 3 (:parent #106))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #103) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #107)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #107)) #(").\n" 0 3 (:parent #107))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #103) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #108))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #103) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #109)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #109)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #109))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #103) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #110))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #103) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #111)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #111)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #111))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #101))) :mode nil :granularity nil :parent #94) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #101) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #104) #("The main " 0 9 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #107) #("GN2 webserver" 0 13 (:parent #111))) #("is built on " 0 12 (:parent #107)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #107) #("Python flask" 0 12 (:parent #113))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #107) #("github" 0 6 (:parent #115))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #107) #("views.py" 0 8 (:parent #117))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #107) #("index" 0 5 (:parent #119)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #119) #("page.html" 0 9 (:parent #123)))) #("in the " 0 7 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #107) #("templates" 0 9 (:parent #121))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #107) #("data" 0 4 (:parent #123)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #123) #("select" 0 6 (:parent #127))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #123) #("menu.js" 0 7 (:parent #128)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #107)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #107) #("gen" 0 3 (:parent #125)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #125) #("select" 0 6 (:parent #129))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #125) #("dataset.py" 0 10 (:parent #130)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #107)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #107) #("server" 0 6 (:parent #127))) #("in the latest version, see " 0 27 (:parent #107)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #107) #("GnServer (REST)" 0 15 (:parent #129))) #(".\n" 0 2 (:parent #107))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #104) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #108)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #108) #("M2" 0 2 (:parent #112))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #108) #("0606" 0 4 (:parent #113))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #108) #("P" 0 1 (:parent #114))) #("&search" 0 7 (:parent #108)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #108) #("terms" 0 5 (:parent #116))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #108) #("or" 0 2 (:parent #117))) #("=&search" 0 8 (:parent #108)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #108) #("terms" 0 5 (:parent #119))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #108) #("and" 0 3 (:parent #120))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #108)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #108) #("server" 0 6 (:parent #122))) #("). The logic is in\nsearch" 0 25 (:parent #108)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #108) #("result.py" 0 9 (:parent #124))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #108) #("search" 0 6 (:parent #126)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #126) #("result" 0 6 (:parent #130))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #126) #("page.html" 0 9 (:parent #131)))) #(".\n" 0 2 (:parent #108))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #104) #("For what happens at the database level see " 0 43 (:parent #109)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #109)) #(".\n" 0 2 (:parent #109))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #104) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #110)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #110) #("search" 0 6 (:parent #114)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #114) #("result" 0 6 (:parent #118))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #114) #("page.html" 0 9 (:parent #119)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #110)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #110) #("DataTable container" 0 19 (:parent #116))) #(".\n" 0 2 (:parent #110))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #102))) :mode nil :granularity nil :parent #94) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #102) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #105) #("The " 0 4 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #108) #("GnServer REST API" 0 17 (:parent #112))) #("is built on high performance " 0 29 (:parent #108)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #108) #("Elixir" 0 6 (:parent #114))) #("with " 0 5 (:parent #108)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #108) #("Maru" 0 4 (:parent #116))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #108))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #105)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #105) #("(json2yaml.rb is in the gn" 0 26 (:parent #110)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #110) #("server" 0 6 (:parent #114))) #("repo). For the current API definition\nsee " 0 42 (:parent #110)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #110) #("GnServer REST API" 0 17 (:parent #116))) #("documentation.\n" 0 15 (:parent #110))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #103))) :mode nil :granularity nil :parent #94) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #103) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #106) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #109))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #104))) :mode nil :granularity nil :parent #94) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #107))) :mode section :granularity nil :parent #104) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #107) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #110) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #113)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #113)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #113)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #113) #("instructions" 0 12 (:parent #119))) #(".\n" 0 2 (:parent #113))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #108))) :mode nil :granularity nil :parent #104) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #108) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #111) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #114)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #114) #("instructions" 0 12 (:parent #118))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #114)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #114) #("R/qtl2 formats" 0 14 (:parent #120))) #(".\n" 0 2 (:parent #114))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #111) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #115))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #111)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #111) #("and, for example, in the method run" 0 35 (:parent #117)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #117) #("rqtl" 0 4 (:parent #121))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #117) #("geno" 0 4 (:parent #122))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #117)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #117) #("extra" 0 5 (:parent #124))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #117))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #111)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #111) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #119))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #111))))))) #24)) #0)) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #3) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #6) #("Introduction" 0 12 (:parent #9))) #("\n" 0 1 (:parent #6)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #4) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #7) #("Reproducibility and interoperability" 0 36 (:parent #10))) #("\n" 0 1 (:parent #7)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #5) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #8) #("Webserver" 0 9 (:parent #11))) #("\n" 0 1 (:parent #8)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #6) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #9) #("GnServer (REST)" 0 15 (:parent #12))) #("\n" 0 1 (:parent #9)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #7) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #10) #("GnExec" 0 6 (:parent #13))) #("\n" 0 1 (:parent #10)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #0) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #8) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #11) #("Database" 0 8 (:parent #14))) #("\n" 0 1 (:parent #11))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #8) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #12) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #15) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #18) #("Phenotypes" 0 10 (:parent #21))) #("\n" 0 1 (:parent #18)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #12) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #16) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #19) #("Genotypes" 0 9 (:parent #22))) #("\n" 0 1 (:parent #19)))))))) mapconcat(#f(compiled-function (element) #) ((plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #49))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #95) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #98))) #49 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #100))) :mode nil :granularity nil :parent #95) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #100) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #103) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #106))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #101))) :mode nil :granularity nil :parent #95) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #101) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #104) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #107)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #107) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #111))) #(").\n" 0 3 (:parent #107))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #104) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #108)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #108)) #(").\n" 0 3 (:parent #108))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #104) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #109))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #104) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #110)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #110)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #110))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #104) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #111))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #104) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #112)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #112)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #112))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #102))) :mode nil :granularity nil :parent #95) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #102) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #105) #("The main " 0 9 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #108) #("GN2 webserver" 0 13 (:parent #112))) #("is built on " 0 12 (:parent #108)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #108) #("Python flask" 0 12 (:parent #114))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #108) #("github" 0 6 (:parent #116))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #108) #("views.py" 0 8 (:parent #118))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #108) #("index" 0 5 (:parent #120)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #120) #("page.html" 0 9 (:parent #124)))) #("in the " 0 7 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #108) #("templates" 0 9 (:parent #122))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #108) #("data" 0 4 (:parent #124)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #124) #("select" 0 6 (:parent #128))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #124) #("menu.js" 0 7 (:parent #129)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #108)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #108) #("gen" 0 3 (:parent #126)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #126) #("select" 0 6 (:parent #130))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #126) #("dataset.py" 0 10 (:parent #131)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #108)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #108) #("server" 0 6 (:parent #128))) #("in the latest version, see " 0 27 (:parent #108)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #108) #("GnServer (REST)" 0 15 (:parent #130))) #(".\n" 0 2 (:parent #108))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #105) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #109)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #109) #("M2" 0 2 (:parent #113))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #109) #("0606" 0 4 (:parent #114))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #109) #("P" 0 1 (:parent #115))) #("&search" 0 7 (:parent #109)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #109) #("terms" 0 5 (:parent #117))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #109) #("or" 0 2 (:parent #118))) #("=&search" 0 8 (:parent #109)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #109) #("terms" 0 5 (:parent #120))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #109) #("and" 0 3 (:parent #121))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #109)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #109) #("server" 0 6 (:parent #123))) #("). The logic is in\nsearch" 0 25 (:parent #109)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #109) #("result.py" 0 9 (:parent #125))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #109)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #109) #("search" 0 6 (:parent #127)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #127) #("result" 0 6 (:parent #131))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #127) #("page.html" 0 9 (:parent #132)))) #(".\n" 0 2 (:parent #109))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #105) #("For what happens at the database level see " 0 43 (:parent #110)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #110)) #(".\n" 0 2 (:parent #110))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #105) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #111)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #111) #("search" 0 6 (:parent #115)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #115) #("result" 0 6 (:parent #119))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #115) #("page.html" 0 9 (:parent #120)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #111)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #111) #("DataTable container" 0 19 (:parent #117))) #(".\n" 0 2 (:parent #111))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #103))) :mode nil :granularity nil :parent #95) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #103) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #106) #("The " 0 4 (:parent #109)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #109) #("GnServer REST API" 0 17 (:parent #113))) #("is built on high performance " 0 29 (:parent #109)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #109) #("Elixir" 0 6 (:parent #115))) #("with " 0 5 (:parent #109)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #109) #("Maru" 0 4 (:parent #117))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #109))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #106)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #106) #("(json2yaml.rb is in the gn" 0 26 (:parent #111)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #111) #("server" 0 6 (:parent #115))) #("repo). For the current API definition\nsee " 0 42 (:parent #111)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #111) #("GnServer REST API" 0 17 (:parent #117))) #("documentation.\n" 0 15 (:parent #111))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #104))) :mode nil :granularity nil :parent #95) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #104) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #107) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #110))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #105))) :mode nil :granularity nil :parent #95) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #108))) :mode section :granularity nil :parent #105) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #108) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #111) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #114)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #114)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #114)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #114) #("instructions" 0 12 (:parent #120))) #(".\n" 0 2 (:parent #114))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #109))) :mode nil :granularity nil :parent #105) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #109) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #112) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #115)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #115) #("instructions" 0 12 (:parent #119))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #115)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #115) #("R/qtl2 formats" 0 14 (:parent #121))) #(".\n" 0 2 (:parent #115))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #112) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #116))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #112)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #112) #("and, for example, in the method run" 0 35 (:parent #118)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #118) #("rqtl" 0 4 (:parent #122))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #118) #("geno" 0 4 (:parent #123))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #118)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #118) #("extra" 0 5 (:parent #125))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #118))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #112)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #112) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #120))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #112))))))) #25)) . #0)) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #1) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #4) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #7) #("Introduction" 0 12 (:parent #10))) #("\n" 0 1 (:parent #7)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #1) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #5) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #8) #("Reproducibility and interoperability" 0 36 (:parent #11))) #("\n" 0 1 (:parent #8)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #1) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #6) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #9) #("Webserver" 0 9 (:parent #12))) #("\n" 0 1 (:parent #9)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #1) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #7) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #10) #("GnServer (REST)" 0 15 (:parent #13))) #("\n" 0 1 (:parent #10)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #1) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #8) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #11) #("GnExec" 0 6 (:parent #14))) #("\n" 0 1 (:parent #11)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #1) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #9) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #12) #("Database" 0 8 (:parent #15))) #("\n" 0 1 (:parent #12))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #9) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #13) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #16) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #19) #("Phenotypes" 0 10 (:parent #22))) #("\n" 0 1 (:parent #19)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #13) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #17) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #20) #("Genotypes" 0 9 (:parent #23))) #("\n" 0 1 (:parent #20)))))))) "") org-export-data((section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #24))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #70) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #73))) #24 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #75))) :mode nil :granularity nil :parent #70) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #75) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #78) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #81))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #76))) :mode nil :granularity nil :parent #70) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #76) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #79) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #82)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #82) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #86))) #(").\n" 0 3 (:parent #82))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #79) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #83)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #83)) #(").\n" 0 3 (:parent #83))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #79) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #84))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #79) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #85)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #85)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #85))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #79) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #86))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #79) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #87)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #87)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #87))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #77))) :mode nil :granularity nil :parent #70) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #77) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #80) #("The main " 0 9 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #83) #("GN2 webserver" 0 13 (:parent #87))) #("is built on " 0 12 (:parent #83)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #83) #("Python flask" 0 12 (:parent #89))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #83) #("github" 0 6 (:parent #91))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #83) #("views.py" 0 8 (:parent #93))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #83) #("index" 0 5 (:parent #95)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #95) #("page.html" 0 9 (:parent #99)))) #("in the " 0 7 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #83) #("templates" 0 9 (:parent #97))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #83) #("data" 0 4 (:parent #99)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #99) #("select" 0 6 (:parent #103))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #99) #("menu.js" 0 7 (:parent #104)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #83) #("gen" 0 3 (:parent #101)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #101) #("select" 0 6 (:parent #105))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #101) #("dataset.py" 0 10 (:parent #106)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #83)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #83) #("server" 0 6 (:parent #103))) #("in the latest version, see " 0 27 (:parent #83)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #83) #("GnServer (REST)" 0 15 (:parent #105))) #(".\n" 0 2 (:parent #83))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #80) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #84)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #84) #("M2" 0 2 (:parent #88))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #84) #("0606" 0 4 (:parent #89))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #84) #("P" 0 1 (:parent #90))) #("&search" 0 7 (:parent #84)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #84) #("terms" 0 5 (:parent #92))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #84) #("or" 0 2 (:parent #93))) #("=&search" 0 8 (:parent #84)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #84) #("terms" 0 5 (:parent #95))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #84) #("and" 0 3 (:parent #96))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #84)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #84) #("server" 0 6 (:parent #98))) #("). The logic is in\nsearch" 0 25 (:parent #84)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #84) #("result.py" 0 9 (:parent #100))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #84) #("search" 0 6 (:parent #102)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #102) #("result" 0 6 (:parent #106))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #102) #("page.html" 0 9 (:parent #107)))) #(".\n" 0 2 (:parent #84))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #80) #("For what happens at the database level see " 0 43 (:parent #85)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #85)) #(".\n" 0 2 (:parent #85))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #80) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #86)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #86) #("search" 0 6 (:parent #90)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #90) #("result" 0 6 (:parent #94))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #90) #("page.html" 0 9 (:parent #95)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #86)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #86) #("DataTable container" 0 19 (:parent #92))) #(".\n" 0 2 (:parent #86))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #78))) :mode nil :granularity nil :parent #70) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #78) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #81) #("The " 0 4 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #84) #("GnServer REST API" 0 17 (:parent #88))) #("is built on high performance " 0 29 (:parent #84)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #84) #("Elixir" 0 6 (:parent #90))) #("with " 0 5 (:parent #84)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #84) #("Maru" 0 4 (:parent #92))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #84))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #81)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #81) #("(json2yaml.rb is in the gn" 0 26 (:parent #86)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #86) #("server" 0 6 (:parent #90))) #("repo). For the current API definition\nsee " 0 42 (:parent #86)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #86) #("GnServer REST API" 0 17 (:parent #92))) #("documentation.\n" 0 15 (:parent #86))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #79))) :mode nil :granularity nil :parent #70) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #79) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #82) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #85))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #80))) :mode nil :granularity nil :parent #70) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #83))) :mode section :granularity nil :parent #80) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #83) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #86) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #89)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #89)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #89)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #89) #("instructions" 0 12 (:parent #95))) #(".\n" 0 2 (:parent #89))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #84))) :mode nil :granularity nil :parent #80) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #84) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #87) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #90)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #90) #("instructions" 0 12 (:parent #94))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #90)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #90) #("R/qtl2 formats" 0 14 (:parent #96))) #(".\n" 0 2 (:parent #90))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #87) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #91))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #87)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #87) #("and, for example, in the method run" 0 35 (:parent #93)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #93) #("rqtl" 0 4 (:parent #97))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #93) #("geno" 0 4 (:parent #98))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #93)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #93) #("extra" 0 5 (:parent #100))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #93))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #87)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #87) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #95))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #87))))))) #0)) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #0) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #6) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #9) #("Introduction" 0 12 (:parent #12))) #("\n" 0 1 (:parent #9)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #7) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #10) #("Reproducibility and interoperability" 0 36 (:parent #13))) #("\n" 0 1 (:parent #10)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #8) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #11) #("Webserver" 0 9 (:parent #14))) #("\n" 0 1 (:parent #11)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #9) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #12) #("GnServer (REST)" 0 15 (:parent #15))) #("\n" 0 1 (:parent #12)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #10) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #13) #("GnExec" 0 6 (:parent #16))) #("\n" 0 1 (:parent #13)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #11) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #14) #("Database" 0 8 (:parent #17))) #("\n" 0 1 (:parent #14))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #11) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #15) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #18) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #21) #("Phenotypes" 0 10 (:parent #24))) #("\n" 0 1 (:parent #21)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #15) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #19) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #22) #("Genotypes" 0 9 (:parent #25))) #("\n" 0 1 (:parent #22)))))))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) #f(compiled-function (element) #)((section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #24))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #70) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #73))) #24 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #75))) :mode nil :granularity nil :parent #70) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #75) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #78) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #81))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #76))) :mode nil :granularity nil :parent #70) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #76) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #79) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #82)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #82) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #86))) #(").\n" 0 3 (:parent #82))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #79) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #83)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #83)) #(").\n" 0 3 (:parent #83))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #79) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #84))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #79) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #85)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #85)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #85))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #79) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #86))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #79) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #87)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #87)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #87))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #77))) :mode nil :granularity nil :parent #70) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #77) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #80) #("The main " 0 9 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #83) #("GN2 webserver" 0 13 (:parent #87))) #("is built on " 0 12 (:parent #83)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #83) #("Python flask" 0 12 (:parent #89))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #83) #("github" 0 6 (:parent #91))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #83) #("views.py" 0 8 (:parent #93))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #83) #("index" 0 5 (:parent #95)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #95) #("page.html" 0 9 (:parent #99)))) #("in the " 0 7 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #83) #("templates" 0 9 (:parent #97))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #83) #("data" 0 4 (:parent #99)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #99) #("select" 0 6 (:parent #103))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #99) #("menu.js" 0 7 (:parent #104)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #83)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #83) #("gen" 0 3 (:parent #101)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #101) #("select" 0 6 (:parent #105))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #101) #("dataset.py" 0 10 (:parent #106)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #83)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #83) #("server" 0 6 (:parent #103))) #("in the latest version, see " 0 27 (:parent #83)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #83) #("GnServer (REST)" 0 15 (:parent #105))) #(".\n" 0 2 (:parent #83))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #80) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #84)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #84) #("M2" 0 2 (:parent #88))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #84) #("0606" 0 4 (:parent #89))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #84) #("P" 0 1 (:parent #90))) #("&search" 0 7 (:parent #84)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #84) #("terms" 0 5 (:parent #92))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #84) #("or" 0 2 (:parent #93))) #("=&search" 0 8 (:parent #84)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #84) #("terms" 0 5 (:parent #95))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #84) #("and" 0 3 (:parent #96))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #84)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #84) #("server" 0 6 (:parent #98))) #("). The logic is in\nsearch" 0 25 (:parent #84)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #84) #("result.py" 0 9 (:parent #100))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #84) #("search" 0 6 (:parent #102)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #102) #("result" 0 6 (:parent #106))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #102) #("page.html" 0 9 (:parent #107)))) #(".\n" 0 2 (:parent #84))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #80) #("For what happens at the database level see " 0 43 (:parent #85)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #85)) #(".\n" 0 2 (:parent #85))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #80) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #86)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #86) #("search" 0 6 (:parent #90)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #90) #("result" 0 6 (:parent #94))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #90) #("page.html" 0 9 (:parent #95)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #86)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #86) #("DataTable container" 0 19 (:parent #92))) #(".\n" 0 2 (:parent #86))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #78))) :mode nil :granularity nil :parent #70) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #78) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #81) #("The " 0 4 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #84) #("GnServer REST API" 0 17 (:parent #88))) #("is built on high performance " 0 29 (:parent #84)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #84) #("Elixir" 0 6 (:parent #90))) #("with " 0 5 (:parent #84)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #84) #("Maru" 0 4 (:parent #92))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #84))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #81)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #81) #("(json2yaml.rb is in the gn" 0 26 (:parent #86)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #86) #("server" 0 6 (:parent #90))) #("repo). For the current API definition\nsee " 0 42 (:parent #86)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #86) #("GnServer REST API" 0 17 (:parent #92))) #("documentation.\n" 0 15 (:parent #86))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #79))) :mode nil :granularity nil :parent #70) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #79) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #82) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #85))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #80))) :mode nil :granularity nil :parent #70) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #83))) :mode section :granularity nil :parent #80) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #83) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #86) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #89)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #89)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #89)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #89) #("instructions" 0 12 (:parent #95))) #(".\n" 0 2 (:parent #89))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #84))) :mode nil :granularity nil :parent #80) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #84) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #87) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #90)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #90) #("instructions" 0 12 (:parent #94))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #90)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #90) #("R/qtl2 formats" 0 14 (:parent #96))) #(".\n" 0 2 (:parent #90))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #87) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #91))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #87)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #87) #("and, for example, in the method run" 0 35 (:parent #93)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #93) #("rqtl" 0 4 (:parent #97))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #93) #("geno" 0 4 (:parent #98))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #93)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #93) #("extra" 0 5 (:parent #100))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #93))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #87)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #87) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #95))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #87))))))) #0)) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #0) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #6) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #9) #("Introduction" 0 12 (:parent #12))) #("\n" 0 1 (:parent #9)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #7) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #10) #("Reproducibility and interoperability" 0 36 (:parent #13))) #("\n" 0 1 (:parent #10)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #8) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #11) #("Webserver" 0 9 (:parent #14))) #("\n" 0 1 (:parent #11)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #9) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #12) #("GnServer (REST)" 0 15 (:parent #15))) #("\n" 0 1 (:parent #12)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #10) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #13) #("GnExec" 0 6 (:parent #16))) #("\n" 0 1 (:parent #13)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #3) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #11) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #14) #("Database" 0 8 (:parent #17))) #("\n" 0 1 (:parent #14))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #11) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #15) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #18) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #21) #("Phenotypes" 0 10 (:parent #24))) #("\n" 0 1 (:parent #21)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #15) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #19) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #22) #("Genotypes" 0 9 (:parent #25))) #("\n" 0 1 (:parent #22))))))))) mapconcat(#f(compiled-function (element) #) ((section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #25))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #71) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #74))) #25 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #76))) :mode nil :granularity nil :parent #71) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #76) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #79) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #82))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #77))) :mode nil :granularity nil :parent #71) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #77) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #80) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #83)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #83) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #87))) #(").\n" 0 3 (:parent #83))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #80) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #84)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #84)) #(").\n" 0 3 (:parent #84))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #80) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #85))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #80) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #86)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #86)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #86))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #80) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #87))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #80) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #88)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #88)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #88))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #78))) :mode nil :granularity nil :parent #71) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #78) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #81) #("The main " 0 9 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #84) #("GN2 webserver" 0 13 (:parent #88))) #("is built on " 0 12 (:parent #84)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #84) #("Python flask" 0 12 (:parent #90))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #84) #("github" 0 6 (:parent #92))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #84) #("views.py" 0 8 (:parent #94))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #84) #("index" 0 5 (:parent #96)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #96) #("page.html" 0 9 (:parent #100)))) #("in the " 0 7 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #84) #("templates" 0 9 (:parent #98))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #84) #("data" 0 4 (:parent #100)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #100) #("select" 0 6 (:parent #104))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #100) #("menu.js" 0 7 (:parent #105)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #84)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #84) #("gen" 0 3 (:parent #102)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #102) #("select" 0 6 (:parent #106))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #102) #("dataset.py" 0 10 (:parent #107)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #84)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #84) #("server" 0 6 (:parent #104))) #("in the latest version, see " 0 27 (:parent #84)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #84) #("GnServer (REST)" 0 15 (:parent #106))) #(".\n" 0 2 (:parent #84))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #81) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #85)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #85) #("M2" 0 2 (:parent #89))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #85) #("0606" 0 4 (:parent #90))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #85) #("P" 0 1 (:parent #91))) #("&search" 0 7 (:parent #85)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #85) #("terms" 0 5 (:parent #93))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #85) #("or" 0 2 (:parent #94))) #("=&search" 0 8 (:parent #85)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #85) #("terms" 0 5 (:parent #96))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #85) #("and" 0 3 (:parent #97))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #85)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #85) #("server" 0 6 (:parent #99))) #("). The logic is in\nsearch" 0 25 (:parent #85)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #85) #("result.py" 0 9 (:parent #101))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #85)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #85) #("search" 0 6 (:parent #103)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #103) #("result" 0 6 (:parent #107))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #103) #("page.html" 0 9 (:parent #108)))) #(".\n" 0 2 (:parent #85))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #81) #("For what happens at the database level see " 0 43 (:parent #86)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #86)) #(".\n" 0 2 (:parent #86))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #81) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #87)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #87) #("search" 0 6 (:parent #91)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #91) #("result" 0 6 (:parent #95))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #91) #("page.html" 0 9 (:parent #96)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #87)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #87) #("DataTable container" 0 19 (:parent #93))) #(".\n" 0 2 (:parent #87))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #79))) :mode nil :granularity nil :parent #71) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #79) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #82) #("The " 0 4 (:parent #85)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #85) #("GnServer REST API" 0 17 (:parent #89))) #("is built on high performance " 0 29 (:parent #85)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #85) #("Elixir" 0 6 (:parent #91))) #("with " 0 5 (:parent #85)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #85) #("Maru" 0 4 (:parent #93))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #85))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #82)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #82) #("(json2yaml.rb is in the gn" 0 26 (:parent #87)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #87) #("server" 0 6 (:parent #91))) #("repo). For the current API definition\nsee " 0 42 (:parent #87)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #87) #("GnServer REST API" 0 17 (:parent #93))) #("documentation.\n" 0 15 (:parent #87))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #80))) :mode nil :granularity nil :parent #71) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #80) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #83) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #86))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #81))) :mode nil :granularity nil :parent #71) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #84))) :mode section :granularity nil :parent #81) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #84) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #87) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #90)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #90)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #90)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #90) #("instructions" 0 12 (:parent #96))) #(".\n" 0 2 (:parent #90))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #85))) :mode nil :granularity nil :parent #81) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #85) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #88) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #91)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #91) #("instructions" 0 12 (:parent #95))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #91)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #91) #("R/qtl2 formats" 0 14 (:parent #97))) #(".\n" 0 2 (:parent #91))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #88) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #92))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #88)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #88) #("and, for example, in the method run" 0 35 (:parent #94)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #94) #("rqtl" 0 4 (:parent #98))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #94) #("geno" 0 4 (:parent #99))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #94)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #94) #("extra" 0 5 (:parent #101))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #94))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #88)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #88) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #96))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #88))))))) . #0)) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #1) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #4) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #7) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #10) #("Introduction" 0 12 (:parent #13))) #("\n" 0 1 (:parent #10)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #4) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #8) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #11) #("Reproducibility and interoperability" 0 36 (:parent #14))) #("\n" 0 1 (:parent #11)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #4) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #9) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #12) #("Webserver" 0 9 (:parent #15))) #("\n" 0 1 (:parent #12)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #4) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #10) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #13) #("GnServer (REST)" 0 15 (:parent #16))) #("\n" 0 1 (:parent #13)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #4) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #11) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #14) #("GnExec" 0 6 (:parent #17))) #("\n" 0 1 (:parent #14)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #4) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #12) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #15) #("Database" 0 8 (:parent #18))) #("\n" 0 1 (:parent #15))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #12) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #16) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #19) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #22) #("Phenotypes" 0 10 (:parent #25))) #("\n" 0 1 (:parent #22)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #16) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #20) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #23) #("Genotypes" 0 9 (:parent #26))) #("\n" 0 1 (:parent #23))))))))) "") org-export-data((headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #0))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #46) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #49))) #0 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #51))) :mode nil :granularity nil :parent #46) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #51) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #54) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #57))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #52))) :mode nil :granularity nil :parent #46) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #52) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #55) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #58)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #58) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #62))) #(").\n" 0 3 (:parent #58))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #55) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #59)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #59)) #(").\n" 0 3 (:parent #59))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #55) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #60))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #55) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #61)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #61)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #61))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #55) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #62))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #55) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #63)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #63)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #63))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #53))) :mode nil :granularity nil :parent #46) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #53) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #56) #("The main " 0 9 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #59) #("GN2 webserver" 0 13 (:parent #63))) #("is built on " 0 12 (:parent #59)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #59) #("Python flask" 0 12 (:parent #65))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #59) #("github" 0 6 (:parent #67))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #59) #("views.py" 0 8 (:parent #69))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #59) #("index" 0 5 (:parent #71)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #71) #("page.html" 0 9 (:parent #75)))) #("in the " 0 7 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #59) #("templates" 0 9 (:parent #73))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #59) #("data" 0 4 (:parent #75)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #75) #("select" 0 6 (:parent #79))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #75) #("menu.js" 0 7 (:parent #80)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #59) #("gen" 0 3 (:parent #77)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #77) #("select" 0 6 (:parent #81))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #77) #("dataset.py" 0 10 (:parent #82)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #59)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #59) #("server" 0 6 (:parent #79))) #("in the latest version, see " 0 27 (:parent #59)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #59) #("GnServer (REST)" 0 15 (:parent #81))) #(".\n" 0 2 (:parent #59))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #56) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #60)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #60) #("M2" 0 2 (:parent #64))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #60) #("0606" 0 4 (:parent #65))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #60) #("P" 0 1 (:parent #66))) #("&search" 0 7 (:parent #60)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #60) #("terms" 0 5 (:parent #68))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #60) #("or" 0 2 (:parent #69))) #("=&search" 0 8 (:parent #60)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #60) #("terms" 0 5 (:parent #71))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #60) #("and" 0 3 (:parent #72))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #60)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #60) #("server" 0 6 (:parent #74))) #("). The logic is in\nsearch" 0 25 (:parent #60)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #60) #("result.py" 0 9 (:parent #76))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #60)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #60) #("search" 0 6 (:parent #78)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #78) #("result" 0 6 (:parent #82))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #78) #("page.html" 0 9 (:parent #83)))) #(".\n" 0 2 (:parent #60))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #56) #("For what happens at the database level see " 0 43 (:parent #61)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #61)) #(".\n" 0 2 (:parent #61))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #56) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #62)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #62) #("search" 0 6 (:parent #66)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #66) #("result" 0 6 (:parent #70))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #66) #("page.html" 0 9 (:parent #71)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #62)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #62) #("DataTable container" 0 19 (:parent #68))) #(".\n" 0 2 (:parent #62))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #54))) :mode nil :granularity nil :parent #46) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #54) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #57) #("The " 0 4 (:parent #60)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #60) #("GnServer REST API" 0 17 (:parent #64))) #("is built on high performance " 0 29 (:parent #60)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #60) #("Elixir" 0 6 (:parent #66))) #("with " 0 5 (:parent #60)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #60) #("Maru" 0 4 (:parent #68))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #60))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #57)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #57) #("(json2yaml.rb is in the gn" 0 26 (:parent #62)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #62) #("server" 0 6 (:parent #66))) #("repo). For the current API definition\nsee " 0 42 (:parent #62)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #62) #("GnServer REST API" 0 17 (:parent #68))) #("documentation.\n" 0 15 (:parent #62))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #55))) :mode nil :granularity nil :parent #46) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #55) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #58) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #61))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #56))) :mode nil :granularity nil :parent #46) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #59))) :mode section :granularity nil :parent #56) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #59) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #62) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #65)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #65)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #65)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #65) #("instructions" 0 12 (:parent #71))) #(".\n" 0 2 (:parent #65))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #60))) :mode nil :granularity nil :parent #56) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #60) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #63) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #66)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #66) #("instructions" 0 12 (:parent #70))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #66)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #66) #("R/qtl2 formats" 0 14 (:parent #72))) #(".\n" 0 2 (:parent #66))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #63) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #67))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #63)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #63) #("and, for example, in the method run" 0 35 (:parent #69)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #69) #("rqtl" 0 4 (:parent #73))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #69) #("geno" 0 4 (:parent #74))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #69)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #69) #("extra" 0 5 (:parent #76))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #69))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #63)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #63) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #71))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #63))))))) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #0) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #3) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #9) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #12) #("Introduction" 0 12 (:parent #15))) #("\n" 0 1 (:parent #12)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #10) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #13) #("Reproducibility and interoperability" 0 36 (:parent #16))) #("\n" 0 1 (:parent #13)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #11) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #14) #("Webserver" 0 9 (:parent #17))) #("\n" 0 1 (:parent #14)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #12) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #15) #("GnServer (REST)" 0 15 (:parent #18))) #("\n" 0 1 (:parent #15)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #13) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #16) #("GnExec" 0 6 (:parent #19))) #("\n" 0 1 (:parent #16)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #14) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #17) #("Database" 0 8 (:parent #20))) #("\n" 0 1 (:parent #17))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #14) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #18) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #21) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #24) #("Phenotypes" 0 10 (:parent #27))) #("\n" 0 1 (:parent #24)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #18) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #22) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #25) #("Genotypes" 0 9 (:parent #28))) #("\n" 0 1 (:parent #25))))))))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) #f(compiled-function (element) #)((headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #0))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #46) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #49))) #0 (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #51))) :mode nil :granularity nil :parent #46) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #51) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #54) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #57))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #52))) :mode nil :granularity nil :parent #46) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #52) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #55) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #58)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #58) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #62))) #(").\n" 0 3 (:parent #58))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #55) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #59)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #59)) #(").\n" 0 3 (:parent #59))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #55) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #60))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #55) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #61)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #61)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #61))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #55) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #62))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #55) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #63)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #63)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #63))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #53))) :mode nil :granularity nil :parent #46) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #53) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #56) #("The main " 0 9 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #59) #("GN2 webserver" 0 13 (:parent #63))) #("is built on " 0 12 (:parent #59)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #59) #("Python flask" 0 12 (:parent #65))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #59) #("github" 0 6 (:parent #67))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #59) #("views.py" 0 8 (:parent #69))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #59) #("index" 0 5 (:parent #71)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #71) #("page.html" 0 9 (:parent #75)))) #("in the " 0 7 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #59) #("templates" 0 9 (:parent #73))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #59) #("data" 0 4 (:parent #75)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #75) #("select" 0 6 (:parent #79))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #75) #("menu.js" 0 7 (:parent #80)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #59)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #59) #("gen" 0 3 (:parent #77)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #77) #("select" 0 6 (:parent #81))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #77) #("dataset.py" 0 10 (:parent #82)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #59)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #59) #("server" 0 6 (:parent #79))) #("in the latest version, see " 0 27 (:parent #59)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #59) #("GnServer (REST)" 0 15 (:parent #81))) #(".\n" 0 2 (:parent #59))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #56) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #60)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #60) #("M2" 0 2 (:parent #64))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #60) #("0606" 0 4 (:parent #65))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #60) #("P" 0 1 (:parent #66))) #("&search" 0 7 (:parent #60)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #60) #("terms" 0 5 (:parent #68))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #60) #("or" 0 2 (:parent #69))) #("=&search" 0 8 (:parent #60)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #60) #("terms" 0 5 (:parent #71))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #60) #("and" 0 3 (:parent #72))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #60)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #60) #("server" 0 6 (:parent #74))) #("). The logic is in\nsearch" 0 25 (:parent #60)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #60) #("result.py" 0 9 (:parent #76))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #60)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #60) #("search" 0 6 (:parent #78)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #78) #("result" 0 6 (:parent #82))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #78) #("page.html" 0 9 (:parent #83)))) #(".\n" 0 2 (:parent #60))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #56) #("For what happens at the database level see " 0 43 (:parent #61)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #61)) #(".\n" 0 2 (:parent #61))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #56) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #62)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #62) #("search" 0 6 (:parent #66)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #66) #("result" 0 6 (:parent #70))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #66) #("page.html" 0 9 (:parent #71)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #62)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #62) #("DataTable container" 0 19 (:parent #68))) #(".\n" 0 2 (:parent #62))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #54))) :mode nil :granularity nil :parent #46) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #54) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #57) #("The " 0 4 (:parent #60)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #60) #("GnServer REST API" 0 17 (:parent #64))) #("is built on high performance " 0 29 (:parent #60)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #60) #("Elixir" 0 6 (:parent #66))) #("with " 0 5 (:parent #60)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #60) #("Maru" 0 4 (:parent #68))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #60))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #57)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #57) #("(json2yaml.rb is in the gn" 0 26 (:parent #62)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #62) #("server" 0 6 (:parent #66))) #("repo). For the current API definition\nsee " 0 42 (:parent #62)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #62) #("GnServer REST API" 0 17 (:parent #68))) #("documentation.\n" 0 15 (:parent #62))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #55))) :mode nil :granularity nil :parent #46) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #55) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #58) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #61))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #56))) :mode nil :granularity nil :parent #46) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #59))) :mode section :granularity nil :parent #56) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #59) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #62) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #65)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #65)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #65)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #65) #("instructions" 0 12 (:parent #71))) #(".\n" 0 2 (:parent #65))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #60))) :mode nil :granularity nil :parent #56) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #60) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #63) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #66)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #66) #("instructions" 0 12 (:parent #70))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #66)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #66) #("R/qtl2 formats" 0 14 (:parent #72))) #(".\n" 0 2 (:parent #66))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #63) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #67))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #63)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #63) #("and, for example, in the method run" 0 35 (:parent #69)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #69) #("rqtl" 0 4 (:parent #73))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #69) #("geno" 0 4 (:parent #74))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #69)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #69) #("extra" 0 5 (:parent #76))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #69))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #63)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #63) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #71))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #63))))))) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #0) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #3) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #9) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #12) #("Introduction" 0 12 (:parent #15))) #("\n" 0 1 (:parent #12)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #10) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #13) #("Reproducibility and interoperability" 0 36 (:parent #16))) #("\n" 0 1 (:parent #13)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #11) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #14) #("Webserver" 0 9 (:parent #17))) #("\n" 0 1 (:parent #14)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #12) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #15) #("GnServer (REST)" 0 15 (:parent #18))) #("\n" 0 1 (:parent #15)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #13) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #16) #("GnExec" 0 6 (:parent #19))) #("\n" 0 1 (:parent #16)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #6) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #14) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #17) #("Database" 0 8 (:parent #20))) #("\n" 0 1 (:parent #17))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #14) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #18) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #21) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #24) #("Phenotypes" 0 10 (:parent #27))) #("\n" 0 1 (:parent #24)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #18) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #22) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #25) #("Genotypes" 0 9 (:parent #28))) #("\n" 0 1 (:parent #25)))))))))) mapconcat(#f(compiled-function (element) #) ((section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #1))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #2))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #2) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #5) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #8) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #11) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #14) #("Introduction" 0 12 (:parent #17))) #("\n" 0 1 (:parent #14)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #8) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #12) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #15) #("Reproducibility and interoperability" 0 36 (:parent #18))) #("\n" 0 1 (:parent #15)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #8) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #13) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #16) #("Webserver" 0 9 (:parent #19))) #("\n" 0 1 (:parent #16)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #8) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #14) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #17) #("GnServer (REST)" 0 15 (:parent #20))) #("\n" 0 1 (:parent #17)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #8) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #15) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #18) #("GnExec" 0 6 (:parent #21))) #("\n" 0 1 (:parent #18)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #8) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #16) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #19) #("Database" 0 8 (:parent #22))) #("\n" 0 1 (:parent #19))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #16) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #20) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #23) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #26) #("Phenotypes" 0 10 (:parent #29))) #("\n" 0 1 (:parent #26)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #20) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #24) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #27) #("Genotypes" 0 9 (:parent #30))) #("\n" 0 1 (:parent #27))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #3))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #3) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #6) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #9))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #4))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #4) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #7) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #10)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #10) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #14))) #(").\n" 0 3 (:parent #10))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #7) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #11)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #11)) #(").\n" 0 3 (:parent #11))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #7) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #12))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #7) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #13)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #13))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #7) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #14))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #7) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #15)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #15)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #15))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #5))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #5) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #8) #("The main " 0 9 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #11) #("GN2 webserver" 0 13 (:parent #15))) #("is built on " 0 12 (:parent #11)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #11) #("Python flask" 0 12 (:parent #17))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #11) #("github" 0 6 (:parent #19))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #11) #("views.py" 0 8 (:parent #21))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #11) #("index" 0 5 (:parent #23)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #23) #("page.html" 0 9 (:parent #27)))) #("in the " 0 7 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #11) #("templates" 0 9 (:parent #25))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #11) #("data" 0 4 (:parent #27)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #27) #("select" 0 6 (:parent #31))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #27) #("menu.js" 0 7 (:parent #32)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #11)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #11) #("gen" 0 3 (:parent #29)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #29) #("select" 0 6 (:parent #33))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #29) #("dataset.py" 0 10 (:parent #34)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #11)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #11) #("server" 0 6 (:parent #31))) #("in the latest version, see " 0 27 (:parent #11)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #11) #("GnServer (REST)" 0 15 (:parent #33))) #(".\n" 0 2 (:parent #11))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #8) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #12)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #12) #("M2" 0 2 (:parent #16))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #12) #("0606" 0 4 (:parent #17))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #12) #("P" 0 1 (:parent #18))) #("&search" 0 7 (:parent #12)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #12) #("terms" 0 5 (:parent #20))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #12) #("or" 0 2 (:parent #21))) #("=&search" 0 8 (:parent #12)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #12) #("terms" 0 5 (:parent #23))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #12) #("and" 0 3 (:parent #24))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #12)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #12) #("server" 0 6 (:parent #26))) #("). The logic is in\nsearch" 0 25 (:parent #12)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #12) #("result.py" 0 9 (:parent #28))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #12)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #12) #("search" 0 6 (:parent #30)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #30) #("result" 0 6 (:parent #34))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #30) #("page.html" 0 9 (:parent #35)))) #(".\n" 0 2 (:parent #12))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #8) #("For what happens at the database level see " 0 43 (:parent #13)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #13)) #(".\n" 0 2 (:parent #13))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #8) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #14)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #14) #("search" 0 6 (:parent #18)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #18) #("result" 0 6 (:parent #22))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #18) #("page.html" 0 9 (:parent #23)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #14)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #14) #("DataTable container" 0 19 (:parent #20))) #(".\n" 0 2 (:parent #14))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #6))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #6) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #9) #("The " 0 4 (:parent #12)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #12) #("GnServer REST API" 0 17 (:parent #16))) #("is built on high performance " 0 29 (:parent #12)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #12) #("Elixir" 0 6 (:parent #18))) #("with " 0 5 (:parent #12)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #12) #("Maru" 0 4 (:parent #20))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #12))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #9)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #9) #("(json2yaml.rb is in the gn" 0 26 (:parent #14)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #14) #("server" 0 6 (:parent #18))) #("repo). For the current API definition\nsee " 0 42 (:parent #14)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #14) #("GnServer REST API" 0 17 (:parent #20))) #("documentation.\n" 0 15 (:parent #14))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #7))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #7) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #10) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #13))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #8))) :mode nil :granularity nil :parent (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) . #0)) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #11))) :mode section :granularity nil :parent #8) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #11) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #14) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #17)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #17)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #17)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #17) #("instructions" 0 12 (:parent #23))) #(".\n" 0 2 (:parent #17))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #12))) :mode nil :granularity nil :parent #8) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #12) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #15) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #18)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #18) #("instructions" 0 12 (:parent #22))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #18)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #18) #("R/qtl2 formats" 0 14 (:parent #24))) #(".\n" 0 2 (:parent #18))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #15) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #19))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #15)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #15) #("and, for example, in the method run" 0 35 (:parent #21)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #21) #("rqtl" 0 4 (:parent #25))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #21) #("geno" 0 4 (:parent #26))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #21)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #21) #("extra" 0 5 (:parent #28))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #21))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #15)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #15) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #23))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #15)))))) "") org-export-data((org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #0) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #3))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #4))) :mode nil :granularity nil :parent #0) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #4) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #7) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #13) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #16) #("Introduction" 0 12 (:parent #19))) #("\n" 0 1 (:parent #16)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #14) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #17) #("Reproducibility and interoperability" 0 36 (:parent #20))) #("\n" 0 1 (:parent #17)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #15) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #18) #("Webserver" 0 9 (:parent #21))) #("\n" 0 1 (:parent #18)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #16) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #19) #("GnServer (REST)" 0 15 (:parent #22))) #("\n" 0 1 (:parent #19)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #17) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #20) #("GnExec" 0 6 (:parent #23))) #("\n" 0 1 (:parent #20)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #10) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #18) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #21) #("Database" 0 8 (:parent #24))) #("\n" 0 1 (:parent #21))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #18) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #22) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #25) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #28) #("Phenotypes" 0 10 (:parent #31))) #("\n" 0 1 (:parent #28)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #22) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #26) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #29) #("Genotypes" 0 9 (:parent #32))) #("\n" 0 1 (:parent #29))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #5))) :mode nil :granularity nil :parent #0) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #5) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #8) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #11))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #6))) :mode nil :granularity nil :parent #0) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #6) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #9) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #12)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #12) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #16))) #(").\n" 0 3 (:parent #12))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #9) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #13)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #13)) #(").\n" 0 3 (:parent #13))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #9) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #14))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #9) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #15)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #15)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #15))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #9) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #16))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #9) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #17)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #17)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #17))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #7))) :mode nil :granularity nil :parent #0) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #7) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #10) #("The main " 0 9 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #13) #("GN2 webserver" 0 13 (:parent #17))) #("is built on " 0 12 (:parent #13)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #13) #("Python flask" 0 12 (:parent #19))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #13) #("github" 0 6 (:parent #21))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #13) #("views.py" 0 8 (:parent #23))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #13) #("index" 0 5 (:parent #25)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #25) #("page.html" 0 9 (:parent #29)))) #("in the " 0 7 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #13) #("templates" 0 9 (:parent #27))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #13) #("data" 0 4 (:parent #29)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #29) #("select" 0 6 (:parent #33))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #29) #("menu.js" 0 7 (:parent #34)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #13)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #13) #("gen" 0 3 (:parent #31)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #31) #("select" 0 6 (:parent #35))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #31) #("dataset.py" 0 10 (:parent #36)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #13)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #13) #("server" 0 6 (:parent #33))) #("in the latest version, see " 0 27 (:parent #13)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #13) #("GnServer (REST)" 0 15 (:parent #35))) #(".\n" 0 2 (:parent #13))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #10) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #14)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #14) #("M2" 0 2 (:parent #18))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #14) #("0606" 0 4 (:parent #19))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #14) #("P" 0 1 (:parent #20))) #("&search" 0 7 (:parent #14)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #14) #("terms" 0 5 (:parent #22))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #14) #("or" 0 2 (:parent #23))) #("=&search" 0 8 (:parent #14)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #14) #("terms" 0 5 (:parent #25))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #14) #("and" 0 3 (:parent #26))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #14)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #14) #("server" 0 6 (:parent #28))) #("). The logic is in\nsearch" 0 25 (:parent #14)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #14) #("result.py" 0 9 (:parent #30))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #14)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #14) #("search" 0 6 (:parent #32)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #32) #("result" 0 6 (:parent #36))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #32) #("page.html" 0 9 (:parent #37)))) #(".\n" 0 2 (:parent #14))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #10) #("For what happens at the database level see " 0 43 (:parent #15)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #15)) #(".\n" 0 2 (:parent #15))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #10) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #16)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #16) #("search" 0 6 (:parent #20)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #20) #("result" 0 6 (:parent #24))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #20) #("page.html" 0 9 (:parent #25)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #16)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #16) #("DataTable container" 0 19 (:parent #22))) #(".\n" 0 2 (:parent #16))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #8))) :mode nil :granularity nil :parent #0) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #8) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #11) #("The " 0 4 (:parent #14)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #14) #("GnServer REST API" 0 17 (:parent #18))) #("is built on high performance " 0 29 (:parent #14)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #14) #("Elixir" 0 6 (:parent #20))) #("with " 0 5 (:parent #14)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #14) #("Maru" 0 4 (:parent #22))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #14))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #11)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #11) #("(json2yaml.rb is in the gn" 0 26 (:parent #16)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #16) #("server" 0 6 (:parent #20))) #("repo). For the current API definition\nsee " 0 42 (:parent #16)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #16) #("GnServer REST API" 0 17 (:parent #22))) #("documentation.\n" 0 15 (:parent #16))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #9))) :mode nil :granularity nil :parent #0) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #9) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #12) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #15))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #10))) :mode nil :granularity nil :parent #0) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #13))) :mode section :granularity nil :parent #10) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #13) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #16) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #19)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #19)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #19)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #19) #("instructions" 0 12 (:parent #25))) #(".\n" 0 2 (:parent #19))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #14))) :mode nil :granularity nil :parent #10) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #14) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #17) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #20)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #20) #("instructions" 0 12 (:parent #24))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #20)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #20) #("R/qtl2 formats" 0 14 (:parent #26))) #(".\n" 0 2 (:parent #20))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #17) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #21))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #17)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #17) #("and, for example, in the method run" 0 35 (:parent #23)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #23) #("rqtl" 0 4 (:parent #27))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #23) #("geno" 0 4 (:parent #28))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #23)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #23) #("extra" 0 5 (:parent #30))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #23))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #17)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #17) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #25))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #17)))))) (:export-options (body-only) :back-end #s(org-export-backend :name html :parent nil :transcoders ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :options ((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) (:html-container "HTML_CONTAINER" nil org-html-container-element) (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) (:description "DESCRIPTION" nil nil newline) (:keywords "KEYWORDS" nil nil space) (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) (:html-link-up "HTML_LINK_UP" nil org-html-link-up) (:html-mathjax "HTML_MATHJAX" nil "" space) (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) (:html-postamble nil "html-postamble" org-html-postamble) (:html-preamble nil "html-preamble" org-html-preamble) (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) (:html-divs nil nil org-html-divs) (:html-checkbox-type nil nil org-html-checkbox-type) (:html-extension nil nil org-html-extension) (:html-footnote-format nil nil org-html-footnote-format) (:html-footnote-separator nil nil org-html-footnote-separator) (:html-footnotes-section nil nil org-html-footnotes-section) (:html-format-drawer-function nil nil org-html-format-drawer-function) (:html-format-headline-function nil nil org-html-format-headline-function) (:html-format-inlinetask-function nil nil org-html-format-inlinetask-function) (:html-home/up-format nil nil org-html-home/up-format) (:html-indent nil nil org-html-indent) (:html-infojs-options nil nil org-html-infojs-options) (:html-infojs-template nil nil org-html-infojs-template) (:html-inline-image-rules nil nil org-html-inline-image-rules) (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) (:html-table-data-tags nil nil org-html-table-data-tags) (:html-table-header-tags nil nil org-html-table-header-tags) (:html-table-use-header-tags-for-first-column nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) (:infojs-opt "INFOJS_OPT" nil nil) (:creator "CREATOR" nil org-html-creator-string) (:with-latex nil "tex" org-html-with-latex) (:latex-header "LATEX_HEADER" nil nil newline)) :filters ((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) (:filter-final-output . org-html-final-function)) :blocks nil :menu (104 "Export to HTML" ((72 "As HTML buffer" org-html-export-as-html) (104 "As HTML file" org-html-export-to-html) (111 "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) (org-open-file (org-html-export-to-html nil s v b)))))))) :translate-alist ((bold . org-html-bold) (center-block . org-html-center-block) (clock . org-html-clock) (code . org-html-code) (drawer . org-html-drawer) (dynamic-block . org-html-dynamic-block) (entity . org-html-entity) (example-block . org-html-example-block) (export-block . org-html-export-block) (export-snippet . org-html-export-snippet) (fixed-width . org-html-fixed-width) (footnote-reference . org-html-footnote-reference) (headline . org-html-headline) (horizontal-rule . org-html-horizontal-rule) (inline-src-block . org-html-inline-src-block) (inlinetask . org-html-inlinetask) (inner-template . org-html-inner-template) (italic . org-html-italic) (item . org-html-item) (keyword . org-html-keyword) (latex-environment . org-html-latex-environment) (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) (node-property . org-html-node-property) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) (planning . org-html-planning) (property-drawer . org-html-property-drawer) (quote-block . org-html-quote-block) (radio-target . org-html-radio-target) (section . org-html-section) (special-block . org-html-special-block) (src-block . org-html-src-block) (statistics-cookie . org-html-statistics-cookie) (strike-through . org-html-strike-through) (subscript . org-html-subscript) (superscript . org-html-superscript) (table . org-html-table) (table-cell . org-html-table-cell) (table-row . org-html-table-row) (target . org-html-target) (template . org-html-template) (timestamp . org-html-timestamp) (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) :exported-data # :input-buffer " *temp*" :input-file nil :html-doctype "xhtml-strict" :html-container "div" :html-content-class "content" :description nil :keywords nil :html-html5-fancy nil :html-link-use-abs-url nil :html-link-home "" :html-link-up "" :html-mathjax "" :html-equation-reference-format "\\eqref{%s}" :html-postamble auto :html-preamble t :html-head "" :html-head-extra "" :subtitle nil :html-head-include-default-style t :html-head-include-scripts nil :html-allow-name-attribute-in-anchors nil :html-divs ((preamble "div" "preamble") (content "div" "content") (postamble "div" "postamble")) :html-checkbox-type ascii :html-extension "html" :html-footnote-format "%s" :html-footnote-separator ", " :html-footnotes-section "
\n

%s:

\n
\n%s\n
\n
" :html-format-drawer-function #f(compiled-function (name contents) #) :html-format-headline-function org-html-format-headline-default-function :html-format-inlinetask-function org-html-format-inlinetask-default-function :html-home/up-format "
\n UP \n |\n HOME \n
" :html-indent nil :html-infojs-options ((path . "https://orgmode.org/org-info.js") (view . "info") (toc . :with-toc) (ftoc . "0") (tdepth . "max") (sdepth . "max") (mouse . "underline") (buttons . "0") (ltoc . "1") (up . :html-link-up) (home . :html-link-home)) :html-infojs-template "\n\n" :html-inline-image-rules (("file" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("http" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)") ("https" . "\\(?:\\.\\(?:gif\\|jp\\(?:e?g\\)\\|png\\|svg\\|webp\\)\\)")) :html-link-org-files-as-html t :html-mathjax-options ((path "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") (scale 1.0) (align "center") (font "mathjax-modern") (overflow "overflow") (tags "ams") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right")) :html-mathjax-template "\n\n\n" :html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" :html-postamble-format (("en" "

Author: %a (%e)

\n

Date: %d

\n

%c

\n

%v

")) :html-preamble-format (("en" "")) :html-prefer-user-labels nil :html-self-link-headlines nil :html-table-align-individual-fields t :html-table-caption-above t :html-table-data-tags ("" . "") :html-table-header-tags ("" . "") :html-table-use-header-tags-for-first-column nil :html-tag-class-prefix "" :html-text-markup-alist ((bold . "%s") (code . "%s") (italic . "%s") (strike-through . "%s") (underline . "%s") (verbatim . "%s")) :html-todo-kwd-class-prefix "" :html-toplevel-hlevel 2 :html-use-infojs when-configured :html-validation-link "Validate" :html-viewport ((width "device-width") (initial-scale "1") (minimum-scale "") (maximum-scale "") (user-scalable "")) :html-inline-images t :html-table-attributes (:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") :html-table-row-open-tag "" :html-table-row-close-tag "" :html-xml-declaration (("html" . "") ("php" . "\"; ?>")) :html-wrap-src-lines nil :html-klipsify-src nil :html-klipse-css "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" :html-klipse-js "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" :html-klipse-selection-script "window.klipse_settings = {selector_eval_html: '.src-html',\n selector_eval_js: '.src-js',\n selector_eval_python_client: '.src-python',\n selector_eval_scheme: '.src-scheme',\n selector: '.src-clojure',\n selector_eval_ruby: '.src-ruby'};" :infojs-opt nil :creator "Emacs 29.4 (Org mode 9.6.15)" :with-latex t :latex-header nil :title (#("Installing GeneNetwork services" 0 31 (:parent #148))) :date nil :author (#("unknown" 0 7 (:parent #152))) :email "unknown@genenetwork-development" :language "en" :select-tags ("export") :exclude-tags ("noexport") :headline-levels 3 :preserve-breaks nil :section-numbers nil :time-stamp-file t :with-archived-trees headline :with-author t :with-broken-links nil :with-clocks nil :with-creator nil :with-date t :with-drawers (not "LOGBOOK") :with-email nil :with-emphasize t :with-entities t :with-fixed-width t :with-footnotes t :with-inlinetasks t :with-planning nil :with-priority nil :with-properties nil :with-smart-quotes nil :with-special-strings t :with-statistics-cookies t :with-sub-superscript t :with-toc nil :with-tables t :with-tags t :with-tasks t :with-timestamps t :with-title t :with-todo-keywords t :cite-export (basic nil nil) :bibliography nil :filter-body nil :filter-bold nil :filter-babel-call nil :filter-center-block nil :filter-clock nil :filter-code nil :filter-diary-sexp nil :filter-drawer nil :filter-dynamic-block nil :filter-entity nil :filter-example-block nil :filter-export-block nil :filter-export-snippet nil :filter-final-output (org-html-final-function) :filter-fixed-width nil :filter-footnote-definition nil :filter-footnote-reference nil :filter-headline nil :filter-horizontal-rule nil :filter-inline-babel-call nil :filter-inline-src-block nil :filter-inlinetask nil :filter-italic nil :filter-item nil :filter-keyword nil :filter-latex-environment nil :filter-latex-fragment nil :filter-line-break nil :filter-link nil :filter-node-property nil :filter-options (org-html-infojs-install-script) :filter-paragraph nil :filter-parse-tree (org-html-image-link-filter) :filter-plain-list nil :filter-plain-text nil :filter-planning nil :filter-property-drawer nil :filter-quote-block nil :filter-radio-target nil :filter-section nil :filter-special-block nil :filter-src-block nil :filter-statistics-cookie nil :filter-strike-through nil :filter-subscript nil :filter-superscript nil :filter-table nil :filter-table-cell nil :filter-table-row nil :filter-target nil :filter-timestamp nil :filter-underline nil :filter-verbatim nil :filter-verse-block nil :ignore-list nil :parse-tree (org-data (:begin 1 :contents-begin 1 :contents-end 12638 :end 12638 :robust-begin 3 :robust-end 12636 :post-blank 0 :post-affiliated 1 :path nil :mode org-data :CATEGORY nil :granularity nil) (section (:begin 1 :end 43 :contents-begin 1 :contents-end 42 :robust-begin 1 :robust-end 40 :post-blank 1 :post-affiliated 1 :mode first-section :granularity nil :parent #338) (keyword (:key "TITLE" :value "Installing GeneNetwork services" :begin 1 :end 42 :post-blank 0 :post-affiliated 1 :mode top-comment :granularity nil :parent #341))) (headline (:raw-value "Table of Contents" :begin 43 :end 422 :pre-blank 0 :contents-begin 121 :contents-end 421 :robust-begin 123 :robust-end 419 :level 1 :priority nil :tags ("TOC") :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 43 :title (#("Table of Contents" 0 17 (:parent #342))) :mode nil :granularity nil :parent #338) (section (:begin 121 :end 422 :contents-begin 121 :contents-end 421 :robust-begin 121 :robust-end 419 :post-blank 1 :post-affiliated 121 :mode section :granularity nil :parent #342) (plain-list (:type unordered :begin 121 :end 421 :contents-begin 121 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 121 :mode planning :granularity nil :parent #345) (item (:bullet "- " :begin 121 :end 156 :contents-begin 124 :contents-end 156 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 121 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 124 :end 156 :contents-begin 124 :contents-end 156 :post-blank 0 :post-affiliated 124 :mode nil :granularity nil :parent #351) (link (:type "custom-id" :path "introduction" :format bracket :raw-link "#introduction" :application nil :search-option nil :begin 124 :end 155 :contents-begin 141 :contents-end 153 :post-blank 0 :parent #354) #("Introduction" 0 12 (:parent #357))) #("\n" 0 1 (:parent #354)))) (item (:bullet "- " :begin 156 :end 239 :contents-begin 159 :contents-end 239 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 156 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 159 :end 239 :contents-begin 159 :contents-end 239 :post-blank 0 :post-affiliated 159 :mode nil :granularity nil :parent #352) (link (:type "custom-id" :path "reproducibility-and-interoperability" :format bracket :raw-link "#reproducibility-and-interoperability" :application nil :search-option nil :begin 159 :end 238 :contents-begin 200 :contents-end 236 :post-blank 0 :parent #355) #("Reproducibility and interoperability" 0 36 (:parent #358))) #("\n" 0 1 (:parent #355)))) (item (:bullet "- " :begin 239 :end 268 :contents-begin 242 :contents-end 268 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 239 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 242 :end 268 :contents-begin 242 :contents-end 268 :post-blank 0 :post-affiliated 242 :mode nil :granularity nil :parent #353) (link (:type "custom-id" :path "webserver" :format bracket :raw-link "#webserver" :application nil :search-option nil :begin 242 :end 267 :contents-begin 256 :contents-end 265 :post-blank 0 :parent #356) #("Webserver" 0 9 (:parent #359))) #("\n" 0 1 (:parent #356)))) (item (:bullet "- " :begin 268 :end 307 :contents-begin 271 :contents-end 307 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 268 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 271 :end 307 :contents-begin 271 :contents-end 307 :post-blank 0 :post-affiliated 271 :mode nil :granularity nil :parent #354) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 271 :end 306 :contents-begin 289 :contents-end 304 :post-blank 0 :parent #357) #("GnServer (REST)" 0 15 (:parent #360))) #("\n" 0 1 (:parent #357)))) (item (:bullet "- " :begin 307 :end 330 :contents-begin 310 :contents-end 330 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 307 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 310 :end 330 :contents-begin 310 :contents-end 330 :post-blank 0 :post-affiliated 310 :mode nil :granularity nil :parent #355) (link (:type "custom-id" :path "gnexec" :format bracket :raw-link "#gnexec" :application nil :search-option nil :begin 310 :end 329 :contents-begin 321 :contents-end 327 :post-blank 0 :parent #358) #("GnExec" 0 6 (:parent #361))) #("\n" 0 1 (:parent #358)))) (item (:bullet "- " :begin 330 :end 421 :contents-begin 333 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 330 :tag nil :mode item :granularity nil :parent #348) (paragraph (:begin 333 :end 357 :contents-begin 333 :contents-end 357 :post-blank 0 :post-affiliated 333 :mode nil :granularity nil :parent #356) (link (:type "custom-id" :path "database" :format bracket :raw-link "#database" :application nil :search-option nil :begin 333 :end 356 :contents-begin 346 :contents-end 354 :post-blank 0 :parent #359) #("Database" 0 8 (:parent #362))) #("\n" 0 1 (:parent #359))) (plain-list (:type unordered :begin 357 :end 421 :contents-begin 357 :contents-end 421 :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :post-blank 0 :post-affiliated 357 :mode nil :granularity nil :parent #356) (item (:bullet "- " :begin 357 :end 390 :contents-begin 362 :contents-end 390 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 357 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 362 :end 390 :contents-begin 362 :contents-end 390 :post-blank 0 :post-affiliated 362 :mode nil :granularity nil :parent #363) (link (:type "custom-id" :path "phenotypes" :format bracket :raw-link "#phenotypes" :application nil :search-option nil :begin 362 :end 389 :contents-begin 377 :contents-end 387 :post-blank 0 :parent #366) #("Phenotypes" 0 10 (:parent #369))) #("\n" 0 1 (:parent #366)))) (item (:bullet "- " :begin 390 :end 421 :contents-begin 395 :contents-end 421 :checkbox nil :counter nil :structure ((121 1 "- " nil nil nil 156) (156 1 "- " nil nil nil 239) (239 1 "- " nil nil nil 268) (268 1 "- " nil nil nil 307) (307 1 "- " nil nil nil 330) (330 1 "- " nil nil nil 421) (357 3 "- " nil nil nil 390) (390 3 "- " nil nil nil 421)) :pre-blank 0 :post-blank 0 :post-affiliated 390 :tag nil :mode item :granularity nil :parent #360) (paragraph (:begin 395 :end 421 :contents-begin 395 :contents-end 421 :post-blank 0 :post-affiliated 395 :mode nil :granularity nil :parent #364) (link (:type "custom-id" :path "genotypes" :format bracket :raw-link "#genotypes" :application nil :search-option nil :begin 395 :end 420 :contents-begin 409 :contents-end 418 :post-blank 0 :parent #367) #("Genotypes" 0 9 (:parent #370))) #("\n" 0 1 (:parent #367))))))))) (headline (:raw-value "Introduction" :begin 422 :end 555 :pre-blank 1 :contents-begin 438 :contents-end 554 :robust-begin 440 :robust-end 552 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 422 :title (#("Introduction" 0 12 (:parent #343))) :mode nil :granularity nil :parent #338) (section (:begin 438 :end 555 :contents-begin 438 :contents-end 554 :robust-begin 438 :robust-end 552 :post-blank 1 :post-affiliated 438 :mode section :granularity nil :parent #343) (paragraph (:begin 438 :end 554 :contents-begin 438 :contents-end 554 :post-blank 0 :post-affiliated 438 :mode planning :granularity nil :parent #346) #("This document describes the architecture of GN2. Because GN2 is\nevolving, only a high-level overview is given here.\n" 0 116 (:parent #349))))) (headline (:raw-value "Reproducibility and interoperability" :begin 555 :end 3925 :pre-blank 1 :contents-begin 595 :contents-end 3924 :robust-begin 597 :robust-end 3922 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 555 :title (#("Reproducibility and interoperability" 0 36 (:parent #344))) :mode nil :granularity nil :parent #338) (section (:begin 595 :end 3925 :contents-begin 595 :contents-end 3924 :robust-begin 595 :robust-end 3922 :post-blank 1 :post-affiliated 595 :mode section :granularity nil :parent #344) (paragraph (:begin 595 :end 1142 :contents-begin 595 :contents-end 1141 :post-blank 1 :post-affiliated 595 :mode planning :granularity nil :parent #347) #("Reproducible data analysis and software interoperability should be key\ngoals for any system that aims to bring research groups\ntogether. These goals are increasingly relevant with growing data\nsizes and increasingly complex analysis pipelines. Rigor,\nreproducibility, and robustness starts with data that should abide by\nFindable, Accessible, Interoperable, and Re-usable (FAIR) principles\n(see the Wilkinson Nature paper on " 0 425 (:parent #350)) (link (:type "http" :path "//www.nature.com/articles/sdata201618" :format bracket :raw-link "http://www.nature.com/articles/sdata201618" :application nil :search-option nil :begin 1020 :end 1138 :contents-begin 1066 :contents-end 1136 :post-blank 0 :parent #350) #("FAIR Guiding Principles for\nscientific data management and stewardship" 0 70 (:parent #354))) #(").\n" 0 3 (:parent #350))) (paragraph (:begin 1142 :end 1615 :contents-begin 1142 :contents-end 1614 :post-blank 1 :post-affiliated 1142 :mode nil :granularity nil :parent #347) #("GeneNetwork (GN2) solves this by assigning unique identifiers\n(cryptographic HASH values calculated over immutable data content),\nincluding these values in file or directory names, and making them\navailable through web interfaces (e.g., through a through a REST\nAPI). This means that at any point in the future the exact same data\ncan be retrieved using a known non-changeable identifier (see also\n" 0 398 (:parent #351)) (link (:type "https" :path "//github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :format plain :raw-link "https://github.com/pjotrp/genenetwork2/blob/staging/doc/submit-data.org" :application nil :search-option nil :begin 1540 :end 1611 :contents-begin nil :contents-end nil :post-blank 0 :parent #351)) #(").\n" 0 3 (:parent #351))) (paragraph (:begin 1615 :end 1950 :contents-begin 1615 :contents-end 1949 :post-blank 1 :post-affiliated 1615 :mode nil :granularity nil :parent #347) #("Synchronisation, integrity checking and backups become trivial using\nthese HASH values, even for very large datasets. Since everything is\nmanaged at the file system level we can also use Unix authorisation\nsystems. HIPAA compliancy is achieved by using HASH references and\nbringing the software into the controlled HIPAA environment.\n" 0 334 (:parent #352))) (paragraph (:begin 1950 :end 2420 :contents-begin 1950 :contents-end 2419 :post-blank 1 :post-affiliated 1950 :mode nil :granularity nil :parent #347) #("In the context of GeneNetwork we are using git for version control of\nsoftware source code (" 0 92 (:parent #353)) (link (:type "https" :path "//github.com/genenetwork/" :format plain :raw-link "https://github.com/genenetwork/" :application nil :search-option nil :begin 2042 :end 2073 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #("). Software can\nbe treated just like data, i.e., git uses HASH identifiers to retrieve\nspecific versions of source. I.e., versions of source code are\nidentifiable and retrievable and can be matched with data into an\nanalysis pipeline. The combination of software and data, again, makes\na unique HASH value which identifies the analysis pipeline.\n" 0 346 (:parent #353))) (paragraph (:begin 2420 :end 3232 :contents-begin 2420 :contents-end 3231 :post-blank 1 :post-affiliated 2420 :mode nil :granularity nil :parent #347) #("For combining runnable software and data into an analysis pipeline we\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\nuse GNU Guix which, yet again, turns everything into a unique HASH\nvalue which allows for exact retrieval and reproducibility. Not only\nthat, GNU Guix gives control of the software and all its dependencies,\ncalculating a HASH value for all dependencies, all the way down to\nversions of R, BLAS and glibc. This way of packaging software\nascertains that identical software pipelines are easily setup on\ndifferent system or in the Cloud. Meaning that everyone ends up using\nthe exact same combination of software versions in a pipeline.\n" 0 811 (:parent #354))) (paragraph (:begin 3232 :end 3924 :contents-begin 3232 :contents-end 3924 :post-blank 0 :post-affiliated 3232 :mode nil :granularity nil :parent #347) #("For software development we use GNU Guix for integration testing and\ndeployment (described in JOSS paper). We also use automated test tools\n(Ruby mechanize) for integration testing of the web services and we\nuse unit testing of all backend services. All our software source code\nis published as `free and open source software' (FOSS) which means\nthat anyone can view code on github, comment on, or even contribute\nto. GeneNetwork is becoming increasingly modular and has a growing\nnumber of contributers who subscribe to the principles of THE SMALL\nTOOLS MANIFESTO FOR BIOINFORMATICS\n(" 0 585 (:parent #355)) (link (:type "https" :path "//github.com/pjotrp/bioinformatics" :format plain :raw-link "https://github.com/pjotrp/bioinformatics" :application nil :search-option nil :begin 3817 :end 3857 :contents-begin nil :contents-end nil :post-blank 0 :parent #355)) #(") which we drew up and was\nsigned by over fifty bioinformaticians.\n" 0 67 (:parent #355))))) (headline (:raw-value "Webserver" :begin 3925 :end 6564 :pre-blank 1 :contents-begin 3938 :contents-end 6563 :robust-begin 3940 :robust-end 6561 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 3925 :title (#("Webserver" 0 9 (:parent #345))) :mode nil :granularity nil :parent #338) (section (:begin 3938 :end 6564 :contents-begin 3938 :contents-end 6563 :robust-begin 3938 :robust-end 6561 :post-blank 1 :post-affiliated 3938 :mode section :granularity nil :parent #345) (paragraph (:begin 3938 :end 5190 :contents-begin 3938 :contents-end 5189 :post-blank 1 :post-affiliated 3938 :mode planning :granularity nil :parent #348) #("The main " 0 9 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2" :application nil :search-option nil :begin 3947 :end 4010 :contents-begin 3994 :contents-end 4007 :post-blank 1 :parent #351) #("GN2 webserver" 0 13 (:parent #355))) #("is built on " 0 12 (:parent #351)) (link (:type "http" :path "//flask.pocoo.org/" :format bracket :raw-link "http://flask.pocoo.org/" :application nil :search-option nil :begin 4022 :end 4064 :contents-begin 4049 :contents-end 4061 :post-blank 1 :parent #351) #("Python flask" 0 12 (:parent #357))) #("and this GN2 source\ncode can be found on " 0 41 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask" :application nil :search-option nil :begin 4105 :end 4189 :contents-begin 4180 :contents-end 4186 :post-blank 1 :parent #351) #("github" 0 6 (:parent #359))) #("in the wqflask directory. The routing\ntables are defined in " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/views.py" :application nil :search-option nil :begin 4249 :end 4343 :contents-begin 4333 :contents-end 4341 :post-blank 0 :parent #351) #("views.py" 0 8 (:parent #361))) #(". For example the main page is loaded\nfrom a template named " 0 60 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/index_page.htm" :application nil :search-option nil :begin 4403 :end 4521 :contents-begin 4503 :contents-end 4518 :post-blank 1 :parent #351) #("index" 0 5 (:parent #363)) (subscript (:begin 4508 :end 4518 :use-brackets-p nil :contents-begin 4509 :contents-end 4518 :post-blank 0 :parent #363) #("page.html" 0 9 (:parent #367)))) #("in the " 0 7 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/tree/master/wqflask/wqflask/templates" :application nil :search-option nil :begin 4528 :end 4625 :contents-begin 4613 :contents-end 4622 :post-blank 1 :parent #351) #("templates" 0 9 (:parent #365))) #("directory. In\nthe template you can find get the form gets filled by a Javascript\nroutine defined in " 0 100 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/static/new/javascript/dataset_select_menu.js" :application nil :search-option nil :begin 4725 :end 4867 :contents-begin 4845 :contents-end 4864 :post-blank 1 :parent #351) #("data" 0 4 (:parent #367)) (subscript (:begin 4849 :end 4856 :use-brackets-p nil :contents-begin 4850 :contents-end 4856 :post-blank 0 :parent #367) #("select" 0 6 (:parent #371))) (subscript (:begin 4856 :end 4864 :use-brackets-p nil :contents-begin 4857 :contents-end 4864 :post-blank 0 :parent #367) #("menu.js" 0 7 (:parent #372)))) #("which picks up a static JSON\nfile for the menu. This static file is generated with\n" 0 83 (:parent #351)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/maintenance/gen_select_dataset.py" :application nil :search-option nil :begin 4950 :end 5074 :contents-begin 5051 :contents-end 5072 :post-blank 0 :parent #351) #("gen" 0 3 (:parent #369)) (subscript (:begin 5054 :end 5061 :use-brackets-p nil :contents-begin 5055 :contents-end 5061 :post-blank 0 :parent #369) #("select" 0 6 (:parent #373))) (subscript (:begin 5061 :end 5072 :use-brackets-p nil :contents-begin 5062 :contents-end 5072 :post-blank 0 :parent #369) #("dataset.py" 0 10 (:parent #374)))) #(". Note that this JSON data is served by\ngn" 0 43 (:parent #351)) (subscript (:begin 5117 :end 5125 :use-brackets-p nil :contents-begin 5118 :contents-end 5124 :post-blank 1 :parent #351) #("server" 0 6 (:parent #371))) #("in the latest version, see " 0 27 (:parent #351)) (link (:type "custom-id" :path "gnserver-rest" :format bracket :raw-link "#gnserver-rest" :application nil :search-option nil :begin 5152 :end 5187 :contents-begin 5170 :contents-end 5185 :post-blank 0 :parent #351) #("GnServer (REST)" 0 15 (:parent #373))) #(".\n" 0 2 (:parent #351))) (paragraph (:begin 5190 :end 5896 :contents-begin 5190 :contents-end 5895 :post-blank 1 :post-affiliated 5190 :mode nil :granularity nil :parent #348) #("When you hit a search with, for example,\n'http://localhost:5003/search?species=mouse&group=BXD&type=Hippocampus+mRNA&dataset=HC" 0 127 (:parent #352)) (subscript (:begin 5317 :end 5320 :use-brackets-p nil :contents-begin 5318 :contents-end 5320 :post-blank 0 :parent #352) #("M2" 0 2 (:parent #356))) (subscript (:begin 5320 :end 5325 :use-brackets-p nil :contents-begin 5321 :contents-end 5325 :post-blank 0 :parent #352) #("0606" 0 4 (:parent #357))) (subscript (:begin 5325 :end 5327 :use-brackets-p nil :contents-begin 5326 :contents-end 5327 :post-blank 0 :parent #352) #("P" 0 1 (:parent #358))) #("&search" 0 7 (:parent #352)) (subscript (:begin 5334 :end 5340 :use-brackets-p nil :contents-begin 5335 :contents-end 5340 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #360))) (subscript (:begin 5340 :end 5343 :use-brackets-p nil :contents-begin 5341 :contents-end 5343 :post-blank 0 :parent #352) #("or" 0 2 (:parent #361))) #("=&search" 0 8 (:parent #352)) (subscript (:begin 5351 :end 5357 :use-brackets-p nil :contents-begin 5352 :contents-end 5357 :post-blank 0 :parent #352) #("terms" 0 5 (:parent #363))) (subscript (:begin 5357 :end 5361 :use-brackets-p nil :contents-begin 5358 :contents-end 5361 :post-blank 0 :parent #352) #("and" 0 3 (:parent #364))) #("=MEAN%3D%2815+16%29+LRS%3D%2823+46%29+&FormID=searchResult'\nit has the menu items as parameters. According to the routing table,\nthe search is executed and Redis caching is used (we'll probably\nchange that to the level of the gn" 0 228 (:parent #352)) (subscript (:begin 5589 :end 5596 :use-brackets-p nil :contents-begin 5590 :contents-end 5596 :post-blank 0 :parent #352) #("server" 0 6 (:parent #366))) #("). The logic is in\nsearch" 0 25 (:parent #352)) (subscript (:begin 5621 :end 5632 :use-brackets-p nil :contents-begin 5622 :contents-end 5631 :post-blank 1 :parent #352) #("result.py" 0 9 (:parent #368))) #("which invokes database functions in\nwqflask/dbFunction/webqtlDatabaseFunction.py, for example. The\nreceiving template lives at " 0 127 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 5759 :end 5893 :contents-begin 5868 :contents-end 5891 :post-blank 0 :parent #352) #("search" 0 6 (:parent #370)) (subscript (:begin 5874 :end 5881 :use-brackets-p nil :contents-begin 5875 :contents-end 5881 :post-blank 0 :parent #370) #("result" 0 6 (:parent #374))) (subscript (:begin 5881 :end 5891 :use-brackets-p nil :contents-begin 5882 :contents-end 5891 :post-blank 0 :parent #370) #("page.html" 0 9 (:parent #375)))) #(".\n" 0 2 (:parent #352))) (paragraph (:begin 5896 :end 5958 :contents-begin 5896 :contents-end 5957 :post-blank 1 :post-affiliated 5896 :mode nil :granularity nil :parent #348) #("For what happens at the database level see " 0 43 (:parent #353)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 5939 :end 5955 :contents-begin nil :contents-end nil :post-blank 0 :parent #353)) #(".\n" 0 2 (:parent #353))) (paragraph (:begin 5958 :end 6563 :contents-begin 5958 :contents-end 6563 :post-blank 0 :post-affiliated 5958 :mode nil :granularity nil :parent #348) #("A view consists of an HTML template with JS libraries for managing\nmenus, tables etc. For example, for the search results see the\n" 0 130 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :format bracket :raw-link "https://github.com/genenetwork/genenetwork2/blob/master/wqflask/wqflask/templates/search_result_page.html" :application nil :search-option nil :begin 6088 :end 6223 :contents-begin 6197 :contents-end 6220 :post-blank 1 :parent #354) #("search" 0 6 (:parent #358)) (subscript (:begin 6203 :end 6210 :use-brackets-p nil :contents-begin 6204 :contents-end 6210 :post-blank 0 :parent #358) #("result" 0 6 (:parent #362))) (subscript (:begin 6210 :end 6220 :use-brackets-p nil :contents-begin 6211 :contents-end 6220 :post-blank 0 :parent #358) #("page.html" 0 9 (:parent #363)))) #("which is a Flask template. The first section\nputs the search in plain English, e.g. 'We searched Hippocampus\nConsortium M430v2 (Jun06) PDNN to find all records with MEAN between\n15 and 16 and with LRS between 23 and 46.'. Then the results are added\nto a table which is displayed using a JS " 0 290 (:parent #354)) (link (:type "https" :path "//datatables.net/" :format bracket :raw-link "https://datatables.net/" :application nil :search-option nil :begin 6513 :end 6561 :contents-begin 6540 :contents-end 6559 :post-blank 0 :parent #354) #("DataTable container" 0 19 (:parent #360))) #(".\n" 0 2 (:parent #354))))) (headline (:raw-value "GnServer (REST)" :begin 6564 :end 7139 :pre-blank 1 :contents-begin 6583 :contents-end 7138 :robust-begin 6585 :robust-end 7136 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 6564 :title (#("GnServer (REST)" 0 15 (:parent #346))) :mode nil :granularity nil :parent #338) (section (:begin 6583 :end 7139 :contents-begin 6583 :contents-end 7138 :robust-begin 6583 :robust-end 7136 :post-blank 1 :post-affiliated 6583 :mode section :granularity nil :parent #346) (paragraph (:begin 6583 :end 6906 :contents-begin 6583 :contents-end 6905 :post-blank 1 :post-affiliated 6583 :mode planning :granularity nil :parent #349) #("The " 0 4 (:parent #352)) (link (:type "https" :path "//github.com/genenetwork/gn_server" :format bracket :raw-link "https://github.com/genenetwork/gn_server" :application nil :search-option nil :begin 6587 :end 6651 :contents-begin 6631 :contents-end 6648 :post-blank 1 :parent #352) #("GnServer REST API" 0 17 (:parent #356))) #("is built on high performance " 0 29 (:parent #352)) (link (:type "http" :path "//elixir-lang.org/" :format bracket :raw-link "http://elixir-lang.org/" :application nil :search-option nil :begin 6680 :end 6716 :contents-begin 6707 :contents-end 6713 :post-blank 1 :parent #352) #("Elixir" 0 6 (:parent #358))) #("with " 0 5 (:parent #352)) (link (:type "https" :path "//github.com/falood/maru" :format bracket :raw-link "https://github.com/falood/maru" :application nil :search-option nil :begin 6721 :end 6761 :contents-begin 6755 :contents-end 6759 :post-blank 0 :parent #352) #("Maru" 0 4 (:parent #360))) #(".\nMainly the GnServer serves JSON requests, for example to fetch data\nfrom the database. To get the menu data in YAML you can do something like\n" 0 144 (:parent #352))) (fixed-width (:begin 6906 :end 6972 :value "curl localhost:8880/int/menu/main.json|ruby extra/json2yaml.rb" :post-blank 2 :post-affiliated 6906 :mode nil :granularity nil :parent #349)) (paragraph (:begin 6972 :end 7138 :contents-begin 6972 :contents-end 7138 :post-blank 0 :post-affiliated 6972 :mode nil :granularity nil :parent #349) #("(json2yaml.rb is in the gn" 0 26 (:parent #354)) (subscript (:begin 6998 :end 7006 :use-brackets-p nil :contents-begin 6999 :contents-end 7005 :post-blank 1 :parent #354) #("server" 0 6 (:parent #358))) #("repo). For the current API definition\nsee " 0 42 (:parent #354)) (link (:type "https" :path "//github.com/genenetwork/gn_server/doc/API.md" :format bracket :raw-link "https://github.com/genenetwork/gn_server/doc/API.md" :application nil :search-option nil :begin 7048 :end 7123 :contents-begin 7103 :contents-end 7120 :post-blank 1 :parent #354) #("GnServer REST API" 0 17 (:parent #360))) #("documentation.\n" 0 15 (:parent #354))))) (headline (:raw-value "GnExec" :begin 7139 :end 7225 :pre-blank 1 :contents-begin 7149 :contents-end 7224 :robust-begin 7151 :robust-end 7222 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7139 :title (#("GnExec" 0 6 (:parent #347))) :mode nil :granularity nil :parent #338) (section (:begin 7149 :end 7225 :contents-begin 7149 :contents-end 7224 :robust-begin 7149 :robust-end 7222 :post-blank 1 :post-affiliated 7149 :mode section :granularity nil :parent #347) (paragraph (:begin 7149 :end 7224 :contents-begin 7149 :contents-end 7224 :post-blank 0 :post-affiliated 7149 :mode planning :granularity nil :parent #350) #("GnExec, also written in Elixir, executes commands using a separate\ndaemon.\n" 0 75 (:parent #353))))) (headline (:raw-value "Database" :begin 7225 :end 12638 :pre-blank 0 :contents-begin 7236 :contents-end 12638 :robust-begin 7238 :robust-end 12636 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7225 :title (#("Database" 0 8 (:parent #348))) :mode nil :granularity nil :parent #338) (headline (:raw-value "Phenotypes" :begin 7236 :end 7446 :pre-blank 1 :contents-begin 7251 :contents-end 7445 :robust-begin 7253 :robust-end 7443 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7236 :title (#("Phenotypes" 0 10 (:parent #351))) :mode section :granularity nil :parent #348) (section (:begin 7251 :end 7446 :contents-begin 7251 :contents-end 7445 :robust-begin 7251 :robust-end 7443 :post-blank 1 :post-affiliated 7251 :mode section :granularity nil :parent #351) (paragraph (:begin 7251 :end 7445 :contents-begin 7251 :contents-end 7445 :post-blank 0 :post-affiliated 7251 :mode planning :granularity nil :parent #354) #("Phenotypes are stored in the SQL database. For what happens at the\ndatabase level see " 0 87 (:parent #357)) (link (:type "fuzzy" :path "database.org" :format bracket :raw-link "database.org" :application nil :search-option nil :begin 7338 :end 7354 :contents-begin nil :contents-end nil :post-blank 0 :parent #357)) #(". A test database can be downloaded -\nsee the installation " 0 59 (:parent #357)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7413 :end 7443 :contents-begin 7429 :contents-end 7441 :post-blank 0 :parent #357) #("instructions" 0 12 (:parent #363))) #(".\n" 0 2 (:parent #357))))) (headline (:raw-value "Genotypes" :begin 7446 :end 12638 :pre-blank 1 :contents-begin 7460 :contents-end 12638 :robust-begin 7462 :robust-end 12636 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 7446 :title (#("Genotypes" 0 9 (:parent #352))) :mode nil :granularity nil :parent #348) (section (:begin 7460 :end 12638 :contents-begin 7460 :contents-end 12638 :robust-begin 7460 :robust-end 12636 :post-blank 0 :post-affiliated 7460 :mode section :granularity nil :parent #352) (paragraph (:begin 7460 :end 7739 :contents-begin 7460 :contents-end 7738 :post-blank 1 :post-affiliated 7460 :mode planning :granularity nil :parent #355) #("Genotypes are stored in genotype files. These are part of the GNU Guix\ndistribution, see the installation " 0 106 (:parent #358)) (link (:type "file" :path "./README.org" :format bracket :raw-link "./README.org" :application nil :search-option nil :begin 7566 :end 7596 :contents-begin 7582 :contents-end 7594 :post-blank 0 :parent #358) #("instructions" 0 12 (:parent #362))) #(". Genotype files are\ncurrently in GN1 format, and will be aligned with the " 0 75 (:parent #358)) (link (:type "http" :path "//kbroman.org/qtl2/pages/sampledata.html" :format bracket :raw-link "http://kbroman.org/qtl2/pages/sampledata.html" :application nil :search-option nil :begin 7671 :end 7736 :contents-begin 7720 :contents-end 7734 :post-blank 0 :parent #358) #("R/qtl2 formats" 0 14 (:parent #364))) #(".\n" 0 2 (:parent #358))) (paragraph (:begin 7739 :end 7800 :contents-begin 7739 :contents-end 7799 :post-blank 1 :post-affiliated 7739 :mode nil :granularity nil :parent #355) #("GN1-style (still default GN2) for the stored file BXD.geno:\n" 0 60 (:parent #359))) (src-block (:language "js" :switches nil :parameters nil :begin 7800 :end 8895 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "@name:BXD\n@type:riset\n@mat:B\n@pat:D\n@het:H\n@unk:U\nChr Locus cM Mb BXD1 BXD2 BXD5 BXD6 BXD8 BXD9 BXD11 BXD12 BXD13 BXD14 BX\nD15 BXD16 BXD18 BXD19 BXD20 BXD21 BXD22 BXD23 BXD24a BXD24 BXD25 BXD27 BXD28 BX\nD29 BXD30 BXD31 BXD32 BXD33 BXD34 BXD35 BXD36 BXD37 BXD38 BXD39 BXD40 BXD41 BXD4\n2 BXD43 BXD44 BXD45 BXD48 BXD49 BXD50 BXD51 BXD52 BXD53 BXD54 BXD55 BXD56 BXD59\nBXD60 BXD61 BXD62 BXD63 BXD64 BXD65 BXD66 BXD67 BXD68 BXD69 BXD70 BXD71 BXD72 BX\nD73 BXD74 BXD75 BXD76 BXD77 BXD78 BXD79 BXD80 BXD81 BXD83 BXD84 BXD85 BXD86 BXD8\n7 BXD88 BXD89 BXD90 BXD91 BXD92 BXD93 BXD94 BXD95 BXD96 BXD97 BXD98 BXD99 BXD100\n BXD101 BXD102 BXD103\n1 rs6269442 0.0 3.482275 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B B D\n1 rs6365999 0.0 4.811062 B B D D D B B D B B D D B D D D D B B B D B D D B B B\nB B B B B B D B D B B D B B H H B D B B H H B B D D D D D B B H B B B B D B D B\nD D D D D H B D D B D B B D D B D D B B B B B B U D\n...\n" :post-blank 1 :post-affiliated 7800 :mode nil :granularity nil :parent #355)) (paragraph (:begin 8895 :end 9195 :contents-begin 8895 :contents-end 9194 :post-blank 1 :post-affiliated 8895 :mode nil :granularity nil :parent #355) #("and, for example, in the method run" 0 35 (:parent #361)) (subscript (:begin 8930 :end 8935 :use-brackets-p nil :contents-begin 8931 :contents-end 8935 :post-blank 0 :parent #361) #("rqtl" 0 4 (:parent #365))) (subscript (:begin 8935 :end 8941 :use-brackets-p nil :contents-begin 8936 :contents-end 8940 :post-blank 1 :parent #361) #("geno" 0 4 (:parent #366))) #("this file gets\nloaded. For GnServer, however, we only want to deal with standardized\nR/qtl formatted data, so with gn" 0 117 (:parent #361)) (subscript (:begin 9058 :end 9065 :use-brackets-p nil :contents-begin 9059 :contents-end 9064 :post-blank 1 :parent #361) #("extra" 0 5 (:parent #368))) #("we convert the original format\ninto R/qtl format with geno2rqtl with one adaptation: the geno table\nis transposed so now becomes\n" 0 129 (:parent #361))) (src-block (:language "js" :switches nil :parameters nil :begin 9195 :end 12455 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\n1,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\n2,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n3,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n...\n#+end_src js\n\ni.e. individuals are columns and markers are rows. Alternatively it could look like\n\n#+begin_src js\nmarker,BXD1,BXD2,BXD5,BXD6,BXD8,BXD9,BXD11,BXD12,BXD13,BXD14,BXD15,BXD16,BXD18,BXD19,BXD20,BXD21,BXD22,BXD23,BXD24a,BXD24,BXD25,BXD27,BXD28,BXD29,BXD30,BXD31,BXD32,BXD33,BXD34,BXD35,BXD36,BXD37,BXD38,BXD39,BXD40,BXD41,BXD42,BXD43,BXD44,BXD45,BXD48,BXD49,BXD50,BXD51,BXD52,BXD53,BXD54,BXD55,BXD56,BXD59,BXD60,BXD61,BXD62,BXD63,BXD64,BXD65,BXD66,BXD67,BXD68,BXD69,BXD70,BXD71,BXD72,BXD73,BXD74,BXD75,BXD76,BXD77,BXD78,BXD79,BXD80,BXD81,BXD83,BXD84,BXD85,BXD86,BXD87,BXD88,BXD89,BXD90,BXD91,BXD92,BXD93,BXD94,BXD95,BXD96,BXD97,BXD98,BXD99,BXD100,BXD101,BXD102,BXD103\nrs6269442,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,B,D\nrs6365999,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,B,D,B,B,H,H,B,D,B,B,H,H,B,B,D,D,D,D,D,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\nrs6376963,B,B,D,D,D,B,B,D,B,B,D,D,B,D,D,D,D,B,B,B,D,B,D,D,B,B,B,B,B,B,B,B,B,D,B,D,B,D,D,B,B,H,H,B,B,B,B,H,H,B,B,D,D,D,D,B,B,B,H,B,B,B,B,D,B,D,B,D,D,D,D,D,H,B,D,D,B,D,B,B,D,D,B,D,D,B,B,B,B,B,B,U,D\n#+end_src js\n\nThis is also the format provided by R/qtl in\nhttps://github.com/rqtl/qtl2data/tree/master/DO_Recla which we will\nuse as the base line for the REST server. In the meta json file the\ngenotype data is tagged as transposed:\n\n#+begin_src js\n{\n\"description\": \"DO data from Recla et al. (2014) Mamm Genome 25:211-222\",\n\"crosstype\": \"do\",\n\"geno\": \"recla_geno.csv\",\n\"geno_transposed\": true,\n\"founder_geno\": \"recla_foundergeno.csv\",\n\"founder_geno_transposed\": true,\n\"genotypes\": {\n \"1\": \"1\",\n \"2\": \"2\",\n \"3\": \"3\"\n},\n\"pheno\": \"recla_pheno.csv\",\n\"pheno_transposed\": false,\n\"covar\": \"recla_covar.csv\",\n\"sex\": {\n \"covar\": \"Sex\",\n \"female\": \"female\",\n \"male\": \"male\"\n},\n\"x_chr\": \"X\",\n\"cross_info\": {\n \"covar\": \"ngen\"\n},\n\"gmap\": \"recla_gmap.csv\",\n\"pmap\": \"recla_pmap.csv\",\n\"alleles\": [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\"]\n}\n" :post-blank 1 :post-affiliated 9195 :mode nil :granularity nil :parent #355)) (paragraph (:begin 12455 :end 12491 :contents-begin 12455 :contents-end 12490 :post-blank 1 :post-affiliated 12455 :mode nil :granularity nil :parent #355) #("Meanwhile the gmap file looks like\n" 0 35 (:parent #363))) (src-block (:language "js" :switches nil :parameters nil :begin 12491 :end 12638 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "marker,chr,pos,Mb\nrs6269442,1,0.0,3.482275\nrs6365999,1,0.0,4.811062\nrs6376963,1,0.895,5.008089\nrs3677817,1,1.185,5.176058\n" :post-blank 0 :post-affiliated 12491 :mode nil :granularity nil :parent #355)))))) :headline-offset 0 :headline-numbering nil :id-alist nil :citations nil :id-local-cache #)) org-export-as(html nil nil t nil) org-export-to-buffer(html "*Org HTML Export*" nil nil nil t nil #f(compiled-function () #)) org-html-export-as-html(nil nil nil t) (progn (pipe-stdin-into-current-buffer) (org-html-export-as-html nil nil nil t) (princ (buffer-string))) (unwind-protect (progn (pipe-stdin-into-current-buffer) (org-html-export-as-html nil nil nil t) (princ (buffer-string))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (pipe-stdin-into-current-buffer) (org-html-export-as-html nil nil nil t) (princ (buffer-string))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))) (let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (pipe-stdin-into-current-buffer) (org-html-export-as-html nil nil nil t) (princ (buffer-string))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))) eval-buffer(# nil "/gnu/store/0h55qvzlzmvwgigk6nrzcc6s2g30ddm0-org2html.el" nil t) #f(compiled-function (buffer file) #)(# "/gnu/store/0h55qvzlzmvwgigk6nrzcc6s2g30ddm0-org2html.el") load-with-code-conversion("/gnu/store/0h55qvzlzmvwgigk6nrzcc6s2g30ddm0-org2html.el" "/gnu/store/0h55qvzlzmvwgigk6nrzcc6s2g30ddm0-org2html.el" nil t #f(compiled-function (buffer file) #)) command-line--load-script("/gnu/store/0h55qvzlzmvwgigk6nrzcc6s2g30ddm0-org2html.el") command-line-1(("-scriptload" "/gnu/store/0h55qvzlzmvwgigk6nrzcc6s2g30ddm0-org2html.el")) command-line() normal-top-level()