grnsight 4.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/.travis.yml +3 -1
  2. package/GRNsight - Beta.html +194 -0
  3. package/Gemfile.lock +259 -0
  4. package/README.md +2 -2
  5. package/_gh_pages/about.html +360 -45
  6. package/_gh_pages/assets/css/footer.css +3 -0
  7. package/_gh_pages/assets/css/main.css +28 -14
  8. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_estimation_output_binary-no-targetless-genes_sif.png +0 -0
  9. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_estimation_output_binary_sif.png +0 -0
  10. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_3-edges-and-footer.png +0 -0
  11. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_header-and-3-nodes.png +0 -0
  12. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_output_3-edges-and-footer.png +0 -0
  13. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_output_header-and-3-nodes.png +0 -0
  14. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_binary-no-targetless-genes_sif.png +0 -0
  15. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_binary_sif.png +0 -0
  16. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_concatenated-no-targetless-genes_sif.png +0 -0
  17. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_concatenated_sif.png +0 -0
  18. package/_gh_pages/assets/images/Choe-Shin_CMSI402-poster-session_20180430.jpg +0 -0
  19. package/_gh_pages/assets/images/Choe_SCCUR_2017.jpg +0 -0
  20. package/_gh_pages/assets/images/Dahlquist-Choe-Shin_CMSI402-poster-session_20180430.jpg +0 -0
  21. package/_gh_pages/assets/images/Dionisio-Dahlquist_GRNsight-shades_20170506.jpg +0 -0
  22. package/_gh_pages/assets/images/Klein_Samdarshi_TriBeta_2018_20180317.jpg +0 -0
  23. package/_gh_pages/assets/images/Shin_SCCUR_2017.jpg +0 -0
  24. package/{documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure1_zoom145_900pix-wide.png → _gh_pages/assets/images/demo-3_network-sheet.png} +0 -0
  25. package/{documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure2_zoom145_900pix-wide.png → _gh_pages/assets/images/demo-4_network-optimized-weights-sheet.png} +0 -0
  26. package/_gh_pages/assets/images/gene-pages-0.png +0 -0
  27. package/_gh_pages/assets/images/gene-pages-1.png +0 -0
  28. package/_gh_pages/assets/images/gene-pages-2.png +0 -0
  29. package/_gh_pages/assets/images/gene-pages-3.png +0 -0
  30. package/_gh_pages/assets/images/grnsight2020.png +0 -0
  31. package/_gh_pages/assets/images/v3demo2-grid+nodecoloring.png +0 -0
  32. package/_gh_pages/assets/images/v3demo2-nodecoloring.png +0 -0
  33. package/_gh_pages/assets/images/v3demo2.png +0 -0
  34. package/_gh_pages/assets/js/ga-report.js +11 -11
  35. package/_gh_pages/assets/js/iframeResizer.min.js +9 -0
  36. package/_gh_pages/assets/js/main.js +43 -43
  37. package/_gh_pages/beta.html +29 -24
  38. package/_gh_pages/contact.html +31 -31
  39. package/_gh_pages/coverage/coverage.json +1 -0
  40. package/_gh_pages/coverage/coverage.raw.json +1 -0
  41. package/_gh_pages/coverage/lcov-report/base.css +223 -0
  42. package/_gh_pages/coverage/lcov-report/block-navigation.js +63 -0
  43. package/_gh_pages/coverage/lcov-report/controllers/additional-sheet-parser.js.html +330 -0
  44. package/_gh_pages/coverage/lcov-report/controllers/constants.js.html +243 -0
  45. package/_gh_pages/coverage/lcov-report/controllers/export-controller.js.html +285 -0
  46. package/_gh_pages/coverage/lcov-report/controllers/exporters/graphml.js.html +405 -0
  47. package/_gh_pages/coverage/lcov-report/controllers/exporters/index.html +110 -0
  48. package/_gh_pages/coverage/lcov-report/controllers/exporters/sif.js.html +150 -0
  49. package/_gh_pages/coverage/lcov-report/controllers/helpers.js.html +114 -0
  50. package/_gh_pages/coverage/lcov-report/controllers/import-controller.js.html +233 -0
  51. package/_gh_pages/coverage/lcov-report/controllers/importers/graphml.js.html +716 -0
  52. package/_gh_pages/coverage/lcov-report/controllers/importers/index.html +106 -0
  53. package/_gh_pages/coverage/lcov-report/controllers/importers/sif.js.html +488 -0
  54. package/_gh_pages/coverage/lcov-report/controllers/index.html +162 -0
  55. package/_gh_pages/coverage/lcov-report/controllers/semantic-checker.js.html +810 -0
  56. package/_gh_pages/coverage/lcov-report/controllers/spreadsheet-controller.js.html +1779 -0
  57. package/_gh_pages/coverage/lcov-report/index.html +136 -0
  58. package/_gh_pages/coverage/lcov-report/prettify.css +1 -0
  59. package/_gh_pages/coverage/lcov-report/prettify.js +1 -0
  60. package/_gh_pages/coverage/lcov-report/server/controllers/additional-sheet-parser.js.html +330 -0
  61. package/_gh_pages/coverage/lcov-report/server/controllers/constants.js.html +243 -0
  62. package/_gh_pages/coverage/lcov-report/server/controllers/export-controller.js.html +285 -0
  63. package/_gh_pages/coverage/lcov-report/server/controllers/exporters/graphml.js.html +405 -0
  64. package/_gh_pages/coverage/lcov-report/server/controllers/exporters/index.html +110 -0
  65. package/_gh_pages/coverage/lcov-report/server/controllers/exporters/sif.js.html +150 -0
  66. package/_gh_pages/coverage/lcov-report/server/controllers/graphml-constants.js.html +585 -0
  67. package/_gh_pages/coverage/lcov-report/server/controllers/helpers.js.html +114 -0
  68. package/_gh_pages/coverage/lcov-report/server/controllers/import-controller.js.html +237 -0
  69. package/_gh_pages/coverage/lcov-report/server/controllers/importers/graphml.js.html +585 -0
  70. package/_gh_pages/coverage/lcov-report/server/controllers/importers/index.html +110 -0
  71. package/_gh_pages/coverage/lcov-report/server/controllers/importers/sif.js.html +492 -0
  72. package/_gh_pages/coverage/lcov-report/server/controllers/index.html +188 -0
  73. package/_gh_pages/coverage/lcov-report/server/controllers/semantic-checker.js.html +810 -0
  74. package/_gh_pages/coverage/lcov-report/server/controllers/spreadsheet-controller.js.html +1779 -0
  75. package/_gh_pages/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  76. package/_gh_pages/coverage/lcov-report/sorter.js +158 -0
  77. package/_gh_pages/coverage/lcov-report/web-client/public/js/grnstate.js.html +225 -0
  78. package/_gh_pages/coverage/lcov-report/web-client/public/js/index.html +97 -0
  79. package/_gh_pages/coverage/lcov.info +49 -0
  80. package/_gh_pages/documentation.html +998 -320
  81. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.aux +47 -0
  82. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.bbl +73 -0
  83. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.blg +52 -0
  84. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.log +1056 -0
  85. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.out +7 -0
  86. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.synctex.gz +0 -0
  87. package/_gh_pages/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised-Dondi.docx +0 -0
  88. package/_gh_pages/encryption/server.cert +21 -0
  89. package/_gh_pages/encryption/server.key +28 -0
  90. package/_gh_pages/favicon.ico +0 -0
  91. package/_gh_pages/index.html +45 -22
  92. package/_gh_pages/links.html +47 -28
  93. package/_gh_pages/news.html +103 -21
  94. package/_gh_pages/onlyfooter.html +78 -0
  95. package/_gh_pages/onlyheader.html +64 -0
  96. package/_gh_pages/onlysidebar.html +73 -0
  97. package/_gh_pages/package-lock.json +14048 -0
  98. package/_gh_pages/people.html +129 -40
  99. package/_gh_pages/privacy.html +23 -17
  100. package/_gh_pages/publications.html +75 -33
  101. package/_gh_pages/robots.txt +1 -0
  102. package/_gh_pages/sitemap.xml +87 -74
  103. package/_gh_pages/test-files/import-samples/attributes.graphml +40 -0
  104. package/_gh_pages/test-files/import-samples/port.graphml +32 -0
  105. package/_gh_pages/test-files/import-samples/simple.graphml +31 -0
  106. package/_gh_pages/web-client/public/js/grnsight.min.js +2347 -0
  107. package/_gh_pages/web-client/public/stylesheets/grnsight.css +443 -0
  108. package/coverage/coverage.json +1 -1
  109. package/coverage/lcov.info +1847 -1142
  110. package/database/README.md +1 -0
  111. package/database/network-database/README.md +44 -0
  112. package/database/network-database/schema.sql +24 -0
  113. package/database/network-database/scripts/filter_genes.py +76 -0
  114. package/database/network-database/scripts/generate_network.py +199 -0
  115. package/database/network-database/scripts/generate_sgd_network_from_yeastract_network.py +120 -0
  116. package/database/network-database/scripts/loader.py +78 -0
  117. package/package.json +20 -11
  118. package/server/app.js +7 -2
  119. package/server/config/config.js +12 -3
  120. package/server/controllers/additional-sheet-parser.js +292 -55
  121. package/server/controllers/constants.js +4 -37
  122. package/server/controllers/custom-workbook-controller.js +66 -0
  123. package/server/controllers/demo-workbooks.js +5973 -0
  124. package/server/controllers/export-constants.js +78 -0
  125. package/server/controllers/export-controller.js +4 -3
  126. package/server/controllers/exporters/graphml.js +15 -15
  127. package/server/controllers/exporters/sif.js +7 -7
  128. package/server/controllers/exporters/xlsx.js +110 -34
  129. package/server/controllers/expression-database-controller.js +19 -0
  130. package/server/controllers/expression-sheet-parser.js +170 -0
  131. package/server/controllers/graphml-constants.js +0 -17
  132. package/server/controllers/helpers.js +25 -1
  133. package/server/controllers/import-controller.js +2 -2
  134. package/server/controllers/importers/graphml.js +17 -20
  135. package/server/controllers/importers/sif.js +22 -18
  136. package/server/controllers/network-database-controller.js +18 -0
  137. package/server/controllers/network-sheet-parser.js +307 -0
  138. package/server/controllers/semantic-checker.js +30 -162
  139. package/server/controllers/sif-constants.js +36 -0
  140. package/server/controllers/spreadsheet-controller.js +277 -425
  141. package/server/controllers/workbook-constants.js +521 -0
  142. package/server/dals/expression-dal.js +122 -0
  143. package/server/dals/network-dal.js +96 -0
  144. package/test/additional-sheet-parser-tests.js +147 -38
  145. package/test/api-tests.js +3 -6
  146. package/test/errors-adjacency-matrix-modifications.js +30 -29
  147. package/test/errors-graph-tests.js +4 -4
  148. package/test/errors-sheet-modifications.js +10 -2
  149. package/test/export-tests.js +187 -60
  150. package/test/expression-data-import-tests.js +113 -0
  151. package/test/grnstate-tests.js +8 -2
  152. package/test/import-graphml-tests.js +59 -40
  153. package/test/import-sif-tests.js +50 -37
  154. package/test/test.js +554 -91
  155. package/test/warnings-adjacency-matrix-modifications.js +8 -7
  156. package/test-files/additional-sheet-test-files/optimization-diagnostics-default.xlsx +0 -0
  157. package/test-files/additional-sheet-test-files/optimization-diagnostics-extraneous-data.xlsx +0 -0
  158. package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-MSE-gene-header.xlsx +0 -0
  159. package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-MSE-header.xlsx +0 -0
  160. package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-column-headers.xlsx +0 -0
  161. package/test-files/additional-sheet-test-files/optimization-diagnostics-invalid-MSE-data.xlsx +0 -0
  162. package/test-files/additional-sheet-test-files/optimization-diagnostics-invalid-value.xlsx +0 -0
  163. package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-MSE-data.xlsx +0 -0
  164. package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-column-headers.xlsx +0 -0
  165. package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-header.xlsx +0 -0
  166. package/test-files/additional-sheet-test-files/optimization-diagnostics-unknown-parameter.xlsx +0 -0
  167. package/test-files/additional-sheet-test-files/optimization-parameters-default.xlsx +0 -0
  168. package/test-files/additional-sheet-test-files/optimization-parameters-incorrect-headers.xlsx +0 -0
  169. package/test-files/additional-sheet-test-files/optimization-parameters-invalid-optimization-parameter.xlsx +0 -0
  170. package/test-files/additional-sheet-test-files/optimization-parameters-missing-headers.xlsx +0 -0
  171. package/test-files/additional-sheet-test-files/optimization-parameters-unknown-parameter.xlsx +0 -0
  172. package/test-files/additional-sheet-test-files/two-column-sheets-extraneous-data.xlsx +0 -0
  173. package/test-files/additional-sheet-test-files/two-column-sheets-incorrect-cell-A1.xlsx +0 -0
  174. package/test-files/additional-sheet-test-files/two-column-sheets-incorrect-column-header.xlsx +0 -0
  175. package/test-files/additional-sheet-test-files/two-column-sheets-invalid-gene-length.xlsx +0 -0
  176. package/test-files/additional-sheet-test-files/two-column-sheets-invalid-gene-type.xlsx +0 -0
  177. package/test-files/additional-sheet-test-files/two-column-sheets-invalid-value.xlsx +0 -0
  178. package/test-files/additional-sheet-test-files/two-column-sheets-missing-column-header.xlsx +0 -0
  179. package/test-files/additional-sheet-test-files/two-column-sheets-special-character.xlsx +0 -0
  180. package/test-files/adjacency-matrix-modifications/asymmetric-gene-order-input.xlsx +0 -0
  181. package/test-files/adjacency-matrix-modifications/asymmetric-gene-order-output.xlsx +0 -0
  182. package/test-files/adjacency-matrix-modifications/extra-column-adjacent-input.xlsx +0 -0
  183. package/test-files/adjacency-matrix-modifications/extra-column-adjacent-output.xlsx +0 -0
  184. package/test-files/adjacency-matrix-modifications/extra-column-end-of-sheet-input.xlsx +0 -0
  185. package/test-files/adjacency-matrix-modifications/extra-column-end-of-sheet-output.xlsx +0 -0
  186. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-both-output.xlsx +0 -0
  187. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-only-input.xlsx +0 -0
  188. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-only-output.xlsx +0 -0
  189. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-optimized-only-output.xlsx +0 -0
  190. package/test-files/adjacency-matrix-modifications/extra-row-end-of-sheet-input.xlsx +0 -0
  191. package/test-files/adjacency-matrix-modifications/extra-row-end-of-sheet-output.xlsx +0 -0
  192. package/test-files/adjacency-matrix-modifications/incorrect-network-cell-A1.xlsx +0 -0
  193. package/test-files/adjacency-matrix-modifications/missing-column-end-input.xlsx +0 -0
  194. package/test-files/adjacency-matrix-modifications/missing-column-end-output.xlsx +0 -0
  195. package/test-files/adjacency-matrix-modifications/missing-data-input.xlsx +0 -0
  196. package/test-files/adjacency-matrix-modifications/missing-data-output.xlsx +0 -0
  197. package/test-files/adjacency-matrix-modifications/missing-row-end-input.xlsx +0 -0
  198. package/test-files/adjacency-matrix-modifications/missing-row-end-output.xlsx +0 -0
  199. package/test-files/adjacency-matrix-modifications/missing-row-middle-input.xlsx +0 -0
  200. package/test-files/adjacency-matrix-modifications/missing-row-middle-output.xlsx +0 -0
  201. package/test-files/adjacency-matrix-modifications/missing-value-bottom-corner-input.xlsx +0 -0
  202. package/test-files/adjacency-matrix-modifications/missing-value-bottom-corner-output.xlsx +0 -0
  203. package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-both-output.xlsx +0 -0
  204. package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-net-only-input.xlsx +0 -0
  205. package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-net-op-only-output.xlsx +0 -0
  206. package/test-files/adjacency-matrix-modifications/value-replaced/342/200/223w-spaces-net-only-output.xlsx +0 -0
  207. package/test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_estimation_output.xlsx +0 -0
  208. package/test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_input.xlsx +0 -0
  209. package/test-files/expression-data-test-sheets/expression_sheet_correct_numbering.xlsx +0 -0
  210. package/test-files/expression-data-test-sheets/expression_sheet_different_number_of_columns.xlsx +0 -0
  211. package/test-files/expression-data-test-sheets/expression_sheet_empty_column.xlsx +0 -0
  212. package/test-files/expression-data-test-sheets/expression_sheet_empty_row.xlsx +0 -0
  213. package/test-files/expression-data-test-sheets/expression_sheet_erroneous_data.xlsx +0 -0
  214. package/test-files/expression-data-test-sheets/expression_sheet_extra_gene_name.xlsx +0 -0
  215. package/test-files/expression-data-test-sheets/expression_sheet_incorrectly_ordered_time_points.xlsx +0 -0
  216. package/test-files/expression-data-test-sheets/expression_sheet_mismatched_case_gene_names.xlsx +0 -0
  217. package/test-files/expression-data-test-sheets/expression_sheet_mismatched_gene_names.xlsx +0 -0
  218. package/test-files/expression-data-test-sheets/expression_sheet_missing_column_header.xlsx +0 -0
  219. package/test-files/expression-data-test-sheets/expression_sheet_missing_data_error.xlsx +0 -0
  220. package/test-files/expression-data-test-sheets/expression_sheet_missing_data_ok.xlsx +0 -0
  221. package/test-files/expression-data-test-sheets/expression_sheet_missing_data_ok_export_exact.xlsx +0 -0
  222. package/test-files/expression-data-test-sheets/expression_sheet_missing_gene_name.xlsx +0 -0
  223. package/test-files/expression-data-test-sheets/expression_sheet_name_not_in_optparams.xlsx +0 -0
  224. package/test-files/expression-data-test-sheets/expression_sheet_name_not_present.xlsx +0 -0
  225. package/test-files/expression-data-test-sheets/expression_sheet_negative_time_points.xlsx +0 -0
  226. package/test-files/expression-data-test-sheets/expression_sheet_non_numerical_time_points.xlsx +0 -0
  227. package/test-files/expression-data-test-sheets/expression_sheet_not_existing.xlsx +0 -0
  228. package/test-files/expression-data-test-sheets/expression_sheet_wrong_id_label.xlsx +0 -0
  229. package/test-files/expression-data-test-sheets/expression_sheet_wrong_order_gene_names.xlsx +0 -0
  230. package/test-files/expression-data-test-sheets/expression_sheet_wrong_sheet_name_case.xlsx +0 -0
  231. package/test-files/expression-data-test-sheets/expression_sheet_wrong_sheet_name_convention.xlsx +0 -0
  232. package/test-files/gene-name-modifications/NaN-as-gene-name-input.xlsx +0 -0
  233. package/test-files/gene-name-modifications/NaN-as-gene-name-output.xlsx +0 -0
  234. package/test-files/gene-name-modifications/mismatched-case-related-input.xlsx +0 -0
  235. package/test-files/gene-name-modifications/mismatched-case-related-output.xlsx +0 -0
  236. package/test-files/gene-name-modifications/mismatched-case-unrelated-input.xlsx +0 -0
  237. package/test-files/gene-name-modifications/mismatched-case-unrelated-output.xlsx +0 -0
  238. package/test-files/graph-tests/different-sized-networks/{80-genes-0-edges.xlsx → 134-genes-0-edges.xlsx} +0 -0
  239. package/test-files/graph-tests/different-sized-networks/{45-genes-max-edges.xlsx → 44-source-genes-45-target-genes-max-edges.xlsx} +0 -0
  240. package/test-files/graph-tests/different-sized-networks/{1-gene-0-edges.xlsx → unused-files/1-gene-0-edges.xlsx} +0 -0
  241. package/test-files/graph-tests/different-sized-networks/{1-gene-1-edges.xlsx → unused-files/1-gene-1-edges.xlsx} +0 -0
  242. package/test-files/graph-tests/different-sized-networks/{10-genes-50-edges.xlsx → unused-files/10-genes-50-edges.xlsx} +0 -0
  243. package/test-files/graph-tests/different-sized-networks/{10-genes-90-edges.xlsx → unused-files/10-genes-90-edges.xlsx} +0 -0
  244. package/test-files/graph-tests/different-sized-networks/{100-genes-0-edges.xlsx → unused-files/100-genes-0-edges.xlsx} +0 -0
  245. package/test-files/graph-tests/different-sized-networks/{110-genes-0-edges.xlsx → unused-files/110-genes-0-edges.xlsx} +0 -0
  246. package/test-files/graph-tests/different-sized-networks/{120-genes-0-edges.xlsx → unused-files/120-genes-0-edges.xlsx} +0 -0
  247. package/test-files/graph-tests/different-sized-networks/{130-genes-0-edges.xlsx → unused-files/130-genes-0-edges.xlsx} +0 -0
  248. package/test-files/graph-tests/different-sized-networks/{140-genes-0-edges.xlsx → unused-files/140-genes-0-edges.xlsx} +0 -0
  249. package/test-files/graph-tests/different-sized-networks/{150-genes-10000-edges.xlsx → unused-files/150-genes-10000-edges.xlsx} +0 -0
  250. package/test-files/graph-tests/different-sized-networks/{150-genes-20000-edges.xlsx → unused-files/150-genes-20000-edges.xlsx} +0 -0
  251. package/test-files/graph-tests/different-sized-networks/{150-genes-max-edges.xlsx → unused-files/150-genes-max-edges.xlsx} +0 -0
  252. package/test-files/graph-tests/different-sized-networks/{160-genes-max-edges.xlsx → unused-files/160-genes-max-edges.xlsx} +0 -0
  253. package/test-files/graph-tests/different-sized-networks/{20-genes-max-edges.xlsx → unused-files/20-genes-max-edges.xlsx} +0 -0
  254. package/test-files/graph-tests/different-sized-networks/{25-genes-max-edges.xlsx → unused-files/25-genes-max-edges.xlsx} +0 -0
  255. package/test-files/graph-tests/different-sized-networks/{30-genes-max-edges.xlsx → unused-files/30-genes-max-edges.xlsx} +0 -0
  256. package/test-files/graph-tests/different-sized-networks/{34-genes-0-edges.xlsx → unused-files/34-genes-0-edges.xlsx} +0 -0
  257. package/test-files/graph-tests/different-sized-networks/{34-genes-40-edges.xlsx → unused-files/34-genes-40-edges.xlsx} +0 -0
  258. package/test-files/graph-tests/different-sized-networks/{34-genes-65-edges.xlsx → unused-files/34-genes-65-edges.xlsx} +0 -0
  259. package/test-files/graph-tests/different-sized-networks/{34-genes-90-edges.xlsx → unused-files/34-genes-90-edges.xlsx} +0 -0
  260. package/test-files/graph-tests/different-sized-networks/{5-genes-max-edges.xlsx → unused-files/5-genes-max-edges.xlsx} +0 -0
  261. package/test-files/graph-tests/different-sized-networks/{51-genes-max-edges.xlsx → unused-files/51-genes-max-edges.xlsx} +0 -0
  262. package/test-files/graph-tests/different-sized-networks/{52-genes-max-edges.xlsx → unused-files/52-genes-max-edges.xlsx} +0 -0
  263. package/test-files/graph-tests/different-sized-networks/{55-genes-0-edges.xlsx → unused-files/55-genes-0-edges.xlsx} +0 -0
  264. package/test-files/graph-tests/different-sized-networks/{55-genes-max-edges.xlsx → unused-files/55-genes-max-edges.xlsx} +0 -0
  265. package/test-files/graph-tests/different-sized-networks/{65-genes-0-edges.xlsx → unused-files/65-genes-0-edges.xlsx} +0 -0
  266. package/test-files/graph-tests/different-sized-networks/{7-genes-max-edges.xlsx → unused-files/7-genes-max-edges.xlsx} +0 -0
  267. package/test-files/graph-tests/different-sized-networks/{70-genes-0-edges.xlsx → unused-files/70-genes-0-edges.xlsx} +0 -0
  268. package/test-files/graph-tests/different-sized-networks/{9-genes-max-edges.xlsx → unused-files/9-genes-max-edges.xlsx} +0 -0
  269. package/test-files/graph-tests/different-sized-networks/{90-genes-0-edges.xlsx → unused-files/90-genes-0-edges.xlsx} +0 -0
  270. package/test-files/graph-tests/different-sized-networks/{regulation-matrix-documented-20140709-AllTF-all-targets.xlsx → unused-files/regulation-matrix-documented-20140709-AllTF-all-targets.xlsx} +0 -0
  271. package/test-files/node-tests/long-gene-name-no-spaces-first.xlsx +0 -0
  272. package/test-files/node-tests/long-gene-name-no-spaces-second.xlsx +0 -0
  273. package/test-files/node-tests/long-gene-name-spaces.xlsx +0 -0
  274. package/test-files/species-test-data/15-genes_28-edges_db5_Dahlquist-data_input_no-species.xlsx +0 -0
  275. package/test-files/species-test-data/15-genes_28-edges_db5_Dahlquist-data_input_with-species.xlsx +0 -0
  276. package/test-files/species-test-data/3-gene_7-edge_elegans.xlsx +0 -0
  277. package/test-files/species-test-data/3-gene_7-edge_melanogaster.xlsx +0 -0
  278. package/test-files/species-test-data/3-gene_7-edge_musculus.xlsx +0 -0
  279. package/test-files/species-test-data/3-gene_7-edge_sapiens.xlsx +0 -0
  280. package/test-files/species-test-data/kev-fake-data-sapiens-no-exp-data.xlsx +0 -0
  281. package/test-files/spreadsheet-controller-test-files/sheet-name-capitalized-network-optimized-weights.xlsx +0 -0
  282. package/test-files/spreadsheet-controller-test-files/sheet-name-capitalized-network.xlsx +0 -0
  283. package/web-client/app.js +1 -1
  284. package/web-client/controllers/main.js +1 -1
  285. package/web-client/public/favicon.ico +0 -0
  286. package/web-client/public/gene/api.js +76 -14
  287. package/web-client/public/gene/info.js +19 -8
  288. package/web-client/public/js/api/grnsight-api.js +124 -0
  289. package/web-client/public/js/constants.js +90 -17
  290. package/web-client/public/js/createNetwork.js +195 -0
  291. package/web-client/public/js/graph-statistics.js +7 -7
  292. package/web-client/public/js/graph.js +369 -324
  293. package/web-client/public/js/grnsight.js +2 -2
  294. package/web-client/public/js/grnsight.min.js +128 -59
  295. package/web-client/public/js/grnstate.js +54 -30
  296. package/web-client/public/js/iframe-coordination.js +55 -0
  297. package/web-client/public/js/setup-handlers.js +358 -18
  298. package/web-client/public/js/setup-load-and-import-handlers.js +105 -66
  299. package/web-client/public/js/update-app.js +483 -93
  300. package/web-client/public/js/upload.js +349 -32
  301. package/web-client/public/js/warnings.js +13 -51
  302. package/web-client/public/lib/iframeSizer.contentWindow.min.js +10 -0
  303. package/web-client/public/stylesheets/grnsight.styl +323 -28
  304. package/web-client/views/components/demo.pug +10 -0
  305. package/web-client/views/{graph.jade → graph.pug} +0 -0
  306. package/web-client/views/{info.jade → info.pug} +1 -5
  307. package/web-client/views/upload.pug +580 -0
  308. package/_gh_pages/Gemfile +0 -7
  309. package/_gh_pages/Gemfile.lock +0 -129
  310. package/documents/SDF/CMSI_402/spring_2014/Southwick_CMSI402_Spring2014_software-development-plan.md +0 -71
  311. package/documents/SDF/CMSI_402/spring_2014/Southwick_CMSI402_Spring2014_software-requirements-specification.md +0 -71
  312. package/documents/SDF/CMSI_402/spring_2014/use-case-diagram-spring-2014.jpg +0 -0
  313. package/documents/SDF/CMSI_402/spring_2017/Anguiano_402_Final_Presentation.pptx +0 -0
  314. package/documents/SDF/CMSI_402/spring_2017/Anguiano_402_Presentation_Final_Poster.pdf +0 -0
  315. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_project-proposal-presentation.pptx +0 -0
  316. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_project-proposal.docx +0 -0
  317. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_software-development-plan.docx +0 -0
  318. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_software-requirements-specification.docx +0 -0
  319. package/documents/SDF/CMSI_402/spring_2017/Design Review Presentation.pptx +0 -0
  320. package/documents/SDF/CMSI_402/spring_2018/0402report.docx +0 -0
  321. package/documents/SDF/CMSI_402/spring_2018/0409report.docx +0 -0
  322. package/documents/SDF/CMSI_402/spring_2018/402-gantt.png +0 -0
  323. package/documents/SDF/CMSI_402/spring_2018/402SRS_GRNSightFeedback01.txt +0 -28
  324. package/documents/SDF/CMSI_402/spring_2018/402_SPD.md +0 -223
  325. package/documents/SDF/CMSI_402/spring_2018/ChoeShinCMSI402_Final.pptx +0 -0
  326. package/documents/SDF/CMSI_402/spring_2018/ProjectProposal.md +0 -22
  327. package/documents/SDF/CMSI_402/spring_2018/SoftwareRequirementsSpecification.md +0 -88
  328. package/documents/SDF/CMSI_402/spring_2018/homework/choe_eileen/Choe_Eileen_CMSI 402_HW1.pdf +0 -0
  329. package/documents/SDF/CMSI_402/spring_2018/homework/choe_eileen/Choe_Eileen_CMSI402_HW2.pdf +0 -0
  330. package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/402hw2.docx +0 -0
  331. package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/Jen - 402Hw1.docx +0 -0
  332. package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/Jen - hw3.docx +0 -0
  333. package/documents/SDF/CMSI_402/spring_2018/writtenStatusReport.docx +0 -0
  334. package/documents/SDF/CMSI_402/spring_2018/writtenStatusReport4 +0 -0
  335. package/documents/abstracts/Anguiano_Varshneya_Undergraduate-Research-Symposium_2017_abstract.pdf +0 -0
  336. package/documents/abstracts/SIGGRAPH 2017 Abstract/ACM-Reference-Format.bst +0 -3478
  337. package/documents/abstracts/SIGGRAPH 2017 Abstract/Figure1_zoom100.png +0 -0
  338. package/documents/abstracts/SIGGRAPH 2017 Abstract/acmart.cls +0 -2352
  339. package/documents/abstracts/SIGGRAPH 2017 Abstract/acmart.ins +0 -29
  340. package/documents/abstracts/SIGGRAPH 2017 Abstract/always-weights.png +0 -0
  341. package/documents/abstracts/SIGGRAPH 2017 Abstract/auto.png +0 -0
  342. package/documents/abstracts/SIGGRAPH 2017 Abstract/networkA.png +0 -0
  343. package/documents/abstracts/SIGGRAPH 2017 Abstract/networkB-normalized.png +0 -0
  344. package/documents/abstracts/SIGGRAPH 2017 Abstract/networkB.png +0 -0
  345. package/documents/abstracts/SIGGRAPH 2017 Abstract/never-weights.png +0 -0
  346. package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/screenshot.jpg +0 -0
  347. package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/screenshot3x2.png +0 -0
  348. package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/withweights3x2.png +0 -0
  349. package/documents/abstracts/SIGGRAPH 2017 Abstract/screenshot-auto.png +0 -0
  350. package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.bib +0 -85
  351. package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.pdf +0 -0
  352. package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.tex +0 -235
  353. package/documents/abstracts/SWE Collegiate Competition 2017.md +0 -9
  354. package/documents/abstracts/Samdarshi_GRNsight_SoCalSysBio_Abstract_2019.docx +0 -0
  355. package/documents/abstracts/Varshneya_Samdarshi_Southern-California-Systems-Biology_2017_abstract.docx +0 -0
  356. package/documents/abstracts/~$mdarshi_SoCalSysBio_Abstract_2019.docx +0 -0
  357. package/documents/developer_documents/State Diagram.graphml +0 -3525
  358. package/documents/developer_documents/graphml/State Diagram.graphml +0 -3115
  359. package/documents/developer_documents/older_versions/GRNsight State Diagram old.png +0 -0
  360. package/documents/developer_documents/older_versions/GRNsight State Diagram.png +0 -0
  361. package/documents/developer_documents/testing_script_generator/GRNsightTestingDocument.md +0 -998
  362. package/documents/developer_documents/testing_script_generator/featureList.json +0 -496
  363. package/documents/developer_documents/testing_script_generator/testing-script-generator.js +0 -149
  364. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_conference-presentations_2016.docx +0 -0
  365. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016.docx +0 -0
  366. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_Table1.docx +0 -0
  367. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_references.rtf +0 -264
  368. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_text-only.docx +0 -0
  369. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/21-genes_31-edges_Schade-data_for-screenshots.xlsx +0 -0
  370. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.jpg +0 -0
  371. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.png +0 -0
  372. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.psd +0 -0
  373. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.jpg +0 -0
  374. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.png +0 -0
  375. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.psd +0 -0
  376. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145_900pix-wide.psd +0 -0
  377. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.jpg +0 -0
  378. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.png +0 -0
  379. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.psd +0 -0
  380. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.jpg +0 -0
  381. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.png +0 -0
  382. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.psd +0 -0
  383. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145_900pix-wide.psd +0 -0
  384. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5A.pdf +0 -0
  385. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5B.pdf +0 -0
  386. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5C.eps +0 -0
  387. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5D.pdf +0 -0
  388. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5E.pdf +0 -0
  389. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5F.eps +0 -0
  390. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5_compiled.png +0 -0
  391. package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure3_GRNsight-Architecture.pdf +0 -0
  392. package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure4_GRNsight-Screenshot.pdf +0 -0
  393. package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure5_compiled.pdf +12 -5383
  394. package/documents/manuscripts/peerj-computerscience-2016/peerj-reviewing-10823-v0.pdf +0 -0
  395. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_conference-presentations_2016_revised.docx +0 -0
  396. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter-and-response_2016.pdf +0 -0
  397. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter_2016.docx +0 -0
  398. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter_2016.pdf +0 -0
  399. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_Table1.docx +0 -0
  400. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_references_revised.rtf +0 -385
  401. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised.docx +0 -0
  402. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised_marked.docx +0 -0
  403. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_response-to-reviewers_2016.docx +0 -0
  404. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_response-to-reviewers_2016.pdf +0 -0
  405. package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure3_GRNsight-Architecture.pdf +0 -0
  406. package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure4_GRNsight-Screenshot-auto.pdf +0 -0
  407. package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure4_GRNsight-Screenshot.pdf +0 -0
  408. package/documents/manuscripts/peerj-computerscience-2016/revisions/peerj-reviewing-10823-v1.pdf +0 -0
  409. package/documents/posters/Anguiano_CMSI402_2017.pptx +0 -0
  410. package/documents/posters/Anguiano_Varshneya_LMU-Symposium_2015.pptx +0 -0
  411. package/documents/posters/Anguiano_Varshneya_SCCUR_2014.pptx +0 -0
  412. package/documents/posters/Choe_Shin_CMSI402_2018.pptx +0 -0
  413. package/documents/posters/Dahlquist-et-al_BOSC_ISMB_2016_poster.pptx +0 -0
  414. package/documents/posters/Lopez_Filler_LMU_Symposium_2019.pdf +0 -0
  415. package/documents/posters/Lopez_Filler_LMU_Symposium_2019.pptx +0 -0
  416. package/documents/posters/Samdarshi-et-al_LMU-Symposium_2017.pptx +0 -0
  417. package/documents/posters/Samdarshi-et-al_LMU-Symposium_2018.pptx +0 -0
  418. package/documents/posters/Samdarshi-et-al_SoCalSysBio_2019.pptx +0 -0
  419. package/documents/posters/Shin-et-al_SCCUR_2017.pptx +0 -0
  420. package/documents/posters/Southwick_CMSI402_2014.pptx +0 -0
  421. package/documents/posters/Varshneya_Samdarshi_LMU-Symposium_2016.pptx +0 -0
  422. package/documents/posters/Varshneya_Samdarshi_SoCalSysBio_2017.pptx +0 -0
  423. package/documents/presentations/Anguiano_402_Final_Presentation.pptx +0 -0
  424. package/documents/presentations/Choe_SWERapidFire2017_final.pptx +0 -0
  425. package/documents/presentations/Dahlquist_BOSC_20160709.pptx +0 -0
  426. package/documents/presentations/Dahlquist_ExperimentalBiology_20160404_talk.pptx +0 -0
  427. package/documents/presentations/Dahlquist_SoCalSysBio_20150131_talk.pptx +0 -0
  428. package/documents/presentations/Samdarshi_LMU-Symposium_20190323_talk.pdf +0 -0
  429. package/documents/presentations/Samdarshi_LMU-Symposium_20190323_talk.pptx +0 -0
  430. package/documents/presentations/Southwick_Anguiano_LMU-Symposium_20140329_talk.pptx +0 -0
  431. package/documents/presentations/Southwick_CMSI402_Presentation_20140508_talk.pptx +0 -0
  432. package/documents/presentations/Varshneya_Anguiano_LMU-Symposium_201703_talk.pptx +0 -0
  433. package/documents/reports/Samdarshi_Mihir_2019/Samdarshi_2019_Final.docx +0 -0
  434. package/documents/reports/Samdarshi_Mihir_2019/Samdarshi_Mihir_2019_AnnotatedBibliography.docx +0 -0
  435. package/documents/reports/Samdarshi_Mihir_2019/Samdarshi_Mihir_2019_Outline.docx +0 -0
  436. package/documents/reports/Samdarshi_Mihir_2019/~$mdarshi_2019_Draft.docx +0 -0
  437. package/documents/reports/Samdarshi_Mihir_2019/~$mdarshi_2019_Final_Paper_Draft.docx +0 -0
  438. package/documents/reports/Varshneya_Anu_2017/Varshneya-201701-AnnotatedBibliography.docx +0 -0
  439. package/documents/reports/Varshneya_Anu_2017/Varshneya-201702-Introduction.docx +0 -0
  440. package/documents/reports/Varshneya_Anu_2017/Varshneya-201702-Outline.docx +0 -0
  441. package/documents/reports/Varshneya_Anu_2017/Varshneya-201703-Discussion.docx +0 -0
  442. package/documents/reports/Varshneya_Anu_2017/Varshneya-201703-MMResults.docx +0 -0
  443. package/documents/reports/Varshneya_Anu_2017/Varshneya-201704-Draft-1.docx +0 -0
  444. package/documents/reports/Varshneya_Anu_2017/Varshneya-201704-Final.docx +0 -0
  445. package/onlysidebar.html +0 -8
  446. package/test/graph-library-tests.js +0 -165
  447. package/test-files/demo-files/21-genes_50-edges_Dahlquist-data_estimation_output.xlsx +0 -0
  448. package/test-files/demo-files/21-genes_50-edges_Dahlquist-data_input.xlsx +0 -0
  449. package/test-files/graph-tests/different-sized-networks/10-genes-max-edges.xlsx +0 -0
  450. package/test-files/graph-tests/different-sized-networks/12-genes-max-edges.xlsx +0 -0
  451. package/test-files/graph-tests/different-sized-networks/35-genes-max-edges.xlsx +0 -0
  452. package/test-files/graph-tests/different-sized-networks/40-genes-0-edges.xlsx +0 -0
  453. package/test-files/graph-tests/different-sized-networks/40-genes-max-edges.xlsx +0 -0
  454. package/test-files/graph-tests/different-sized-networks/42-genes-max-edges.xlsx +0 -0
  455. package/test-files/graph-tests/different-sized-networks/50-genes-max-edges.xlsx +0 -0
  456. package/test-files/graph-tests/different-sized-networks/75-genes-150-edges.xlsx +0 -0
  457. package/web-client/public/js/container.js +0 -121
  458. package/web-client/views/upload.jade +0 -464
@@ -5,6 +5,7 @@ import { max } from "d3-array";
5
5
  import { grnState } from "./grnstate";
6
6
 
7
7
  import {
8
+ HOST_SITE,
8
9
  FORCE_GRAPH,
9
10
  GRID_LAYOUT,
10
11
  GREY_EDGES_DASHED_MENU,
@@ -26,8 +27,8 @@ import {
26
27
  SHOW_WEIGHTS_MOUSEOVER,
27
28
  SHOW_ALL_WEIGHTS,
28
29
  HIDE_ALL_WEIGHTS,
29
- COLOR_EDGES,
30
- BLACK_EDGES,
30
+ COLOR_EDGES_MENU,
31
+ COLOR_EDGES_SIDEBAR,
31
32
  ACTIVE_COLOR_OPTION,
32
33
  GRAVITY_LENGTH_WITHOUT_ZERO,
33
34
  LOCK_SLIDERS_MENU,
@@ -44,12 +45,15 @@ import {
44
45
  CHARGE_SLIDER_SIDEBAR,
45
46
  CHARGE_MENU,
46
47
  CHARGE_VALUE,
47
- GRID_LAYOUT_BUTTON,
48
- GRID_LAYOUT_CLASS,
49
- FORCE_GRAPH_CLASS,
48
+ GRID_LAYOUT_MENU,
49
+ FORCE_GRAPH_MENU,
50
+ LAYOUT_SIDEBAR_PANEL,
50
51
  NODE_COLORING_MENU,
51
52
  NODE_COLORING_TOGGLE_MENU,
52
53
  NODE_COLORING_MENU_CLASS,
54
+ NODE_COLORING_SIDEBAR_BODY,
55
+ NODE_COLORING_SIDEBAR_PANEL,
56
+ NODE_COLORING_SIDEBAR_HEADER_LINK,
53
57
  NODE_COLORING_TOGGLE_SIDEBAR,
54
58
  AVG_REPLICATE_VALS_TOP_MENU,
55
59
  AVG_REPLICATE_VALS_TOP_SIDEBAR,
@@ -65,28 +69,61 @@ import {
65
69
  BOTTOM_DATASET_SELECTION_SIDEBAR,
66
70
  BOTTOM_DATASET_SELECTION_MENU,
67
71
  LOG_FOLD_CHANGE_MAX_VALUE_CLASS,
72
+ LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON,
73
+ LOG_FOLD_CHANGE_MAX_VALUE_HEADER,
68
74
  MAX_NUM_CHARACTERS_DROPDOWN,
69
75
  ENDS_IN_EXPRESSION_REGEXP,
70
- ZOOM_CONTROL
76
+ ZOOM_CONTROL,
77
+ ZOOM_DISPLAY_MIDDLE,
78
+ ZOOM_ADAPTIVE_MAX_SCALE,
79
+ ZOOM_INPUT,
80
+ ZOOM_SLIDER,
81
+ EXPORT_WEIGHTED_CLASS,
82
+ EDGE_WEIGHT_MENU_CLASS,
83
+ EDGE_WEIGHT_SIDEBAR,
84
+ EDGE_WEIGHT_SIDEBAR_HEADER_LINK,
85
+ SPECIES_DISPLAY,
86
+ EXPRESSION_DB_LOADER,
87
+ EXPRESSION_DB_LOADER_TEXT,
88
+ SPECIES_BUTTON_CRESS,
89
+ SPECIES_BUTTON_FLY,
90
+ SPECIES_BUTTON_HUMAN,
91
+ SPECIES_BUTTON_MOUSE,
92
+ SPECIES_BUTTON_NEMATODE,
93
+ SPECIES_BUTTON_YEAST,
94
+ VIEWPORT_FIT,
95
+ VIEWPORT_S,
96
+ VIEWPORT_M,
97
+ VIEWPORT_L,
98
+ VIEWPORT_SIZE_S_DROPDOWN,
99
+ VIEWPORT_SIZE_M_DROPDOWN,
100
+ VIEWPORT_SIZE_L_DROPDOWN,
101
+ VIEWPORT_SIZE_FIT_DROPDOWN,
102
+ VIEWPORT_SIZE_S_SIDEBAR,
103
+ VIEWPORT_SIZE_M_SIDEBAR,
104
+ VIEWPORT_SIZE_L_SIDEBAR,
105
+ VIEWPORT_SIZE_FIT_SIDEBAR,
106
+ VIEWPORT_INIT,
107
+ // EXPRESSION_SOURCE,
71
108
  } from "./constants";
72
109
 
110
+ import { queryExpressionDatabase } from "./api/grnsight-api.js";
111
+
73
112
  // In this transitory state, updateApp might get called before things are completely set up, so for now
74
113
  // we define this wrapper function that guards against uninitialized values.
75
114
  const refreshApp = () => {
76
- if (uploadState && uploadState.currentNetwork) {
77
- drawGraph(uploadState.currentNetwork);
115
+ if (uploadState && uploadState.currentWorkbook) {
116
+ drawGraph(uploadState.currentWorkbook);
78
117
  }
79
118
  };
80
119
 
81
- const displayNetwork = (network, name) => {
82
- $(ZOOM_CONTROL).prop({ disabled: false });
83
-
84
- uploadState.currentNetwork = network;
85
- console.log("Network: ", network); // Display the network in the console
86
- $("#graph-metadata").html(network.genes.length + " nodes<br>" + network.links.length + " edges");
120
+ const displayworkbook = (workbook, name) => {
121
+ uploadState.currentWorkbook = workbook;
122
+ // console.log("workbook: ", workbook); // Display the workbook in the console
123
+ $("#graph-metadata").html(workbook.genes.length + " nodes<br>" + workbook.links.length + " edges");
87
124
 
88
- if (network.warnings.length > 0) {
89
- displayWarnings(network.warnings);
125
+ if (workbook.warnings.length > 0) {
126
+ displayWarnings(workbook.warnings);
90
127
  }
91
128
 
92
129
  $("#fileName").text(name); // Set the name of the file to display in the top bar
@@ -125,15 +162,28 @@ const logFoldChangeMaxValueInputValidation = value => {
125
162
  }
126
163
  };
127
164
 
128
- //
165
+ // Weight Visualization Function
166
+ const showEdgeWeightOptions = () => {
167
+ $(EDGE_WEIGHT_MENU_CLASS).removeClass("disabled");
168
+ $(EXPORT_WEIGHTED_CLASS).removeClass("startDisabled").removeClass("disabled");
169
+ $(EDGE_WEIGHT_SIDEBAR).removeClass("disabled");
170
+ $(EDGE_WEIGHT_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse");
171
+ };
172
+
173
+ const hideEdgeWeightOptions = () => {
174
+ $(EDGE_WEIGHT_MENU_CLASS).addClass("disabled");
175
+ $(EXPORT_WEIGHTED_CLASS).removeClass("startDisabled").addClass("disabled");
176
+ $(EDGE_WEIGHT_SIDEBAR).addClass("disabled");
177
+ $(EDGE_WEIGHT_SIDEBAR_HEADER_LINK).attr("data-toggle", "");
178
+ };
179
+
129
180
  const synchronizeGrayEdgeValues = value => {
130
181
  var validatedInput = grayEdgeInputValidator(value);
131
- $(GREY_EDGE_THRESHOLD_TEXT_SIDEBAR).text(validatedInput + "%");
132
182
  $(GREY_EDGE_THRESHOLD_MENU).val(validatedInput);
183
+ $(GREY_EDGE_THRESHOLD_TEXT_SIDEBAR).text(validatedInput + "%");
133
184
  $(GREY_EDGE_THRESHOLD_SLIDER_SIDEBAR).val(validatedInput / 100);
134
185
  };
135
186
 
136
- // Weight Visualization Functions
137
187
  const synchronizeShowWeightsMouseover = () => {
138
188
  $(WEIGHTS_SHOW_MOUSE_OVER_MENU + " span").addClass("glyphicon-ok");
139
189
  $(WEIGHTS_SHOW_ALWAYS_MENU + " span").removeClass("glyphicon-ok");
@@ -176,32 +226,172 @@ const synchronizeHideAllWeights = () => {
176
226
  $(WEIGHTS_HIDE_CLASS).addClass("selected");
177
227
  };
178
228
 
179
- // Toggle Weighted Functions
180
- const enableColorOptimal = () => {
181
- $(BLACK_EDGES).removeClass(ACTIVE_COLOR_OPTION);
182
- $(BLACK_EDGES + ">span").removeClass("glyphicon-ok");
183
- $(COLOR_EDGES).addClass(ACTIVE_COLOR_OPTION);
184
- $(COLOR_EDGES + ">span").addClass("glyphicon-ok");
229
+ // Viewport
230
+ const synchronizeViewportSizeSmall = () => {
231
+ $(VIEWPORT_SIZE_S_DROPDOWN + " span").removeClass("glyphicon-ok");
232
+ $(VIEWPORT_SIZE_M_DROPDOWN + " span").removeClass("glyphicon-ok");
233
+ $(VIEWPORT_SIZE_L_DROPDOWN + " span").removeClass("glyphicon-ok");
234
+ $(VIEWPORT_SIZE_FIT_DROPDOWN + " span").removeClass("glyphicon-ok");
235
+
236
+ $(VIEWPORT_SIZE_S_SIDEBAR).removeProp("checked");
237
+ $(VIEWPORT_SIZE_M_SIDEBAR).removeProp("checked");
238
+ $(VIEWPORT_SIZE_L_SIDEBAR).removeProp("checked");
239
+ $(VIEWPORT_SIZE_FIT_SIDEBAR).removeProp("checked");
240
+
241
+ $(VIEWPORT_SIZE_S_SIDEBAR).prop("checked", "checked");
242
+ $(VIEWPORT_SIZE_S_DROPDOWN + " span").addClass("glyphicon-ok");
185
243
  };
186
244
 
187
- const disableColorOptimal = () => {
188
- $(COLOR_EDGES).removeClass(ACTIVE_COLOR_OPTION);
189
- $(COLOR_EDGES + ">span").removeClass("glyphicon-ok");
190
- $(BLACK_EDGES).addClass(ACTIVE_COLOR_OPTION);
191
- $(BLACK_EDGES + ">span").addClass("glyphicon-ok");
245
+ const synchronizeViewportSizeMedium = () => {
246
+ $(VIEWPORT_SIZE_S_DROPDOWN + " span").removeClass("glyphicon-ok");
247
+ $(VIEWPORT_SIZE_M_DROPDOWN + " span").removeClass("glyphicon-ok");
248
+ $(VIEWPORT_SIZE_L_DROPDOWN + " span").removeClass("glyphicon-ok");
249
+ $(VIEWPORT_SIZE_FIT_DROPDOWN + " span").removeClass("glyphicon-ok");
250
+
251
+ $(VIEWPORT_SIZE_S_SIDEBAR).removeProp("checked");
252
+ $(VIEWPORT_SIZE_M_SIDEBAR).removeProp("checked");
253
+ $(VIEWPORT_SIZE_L_SIDEBAR).removeProp("checked");
254
+ $(VIEWPORT_SIZE_FIT_SIDEBAR).removeProp("checked");
255
+
256
+ $(VIEWPORT_SIZE_M_SIDEBAR).prop("checked", "checked");
257
+ $(VIEWPORT_SIZE_M_DROPDOWN + " span").addClass("glyphicon-ok");
192
258
  };
193
259
 
194
- // Sliders Functions
195
- export const modifyChargeParameter = (value) => {
196
- grnState.simulation.force("charge").strength(value);
197
- grnState.simulation.alpha(1);
260
+ const synchronizeViewportSizeLarge = () => {
261
+ $(VIEWPORT_SIZE_S_DROPDOWN + " span").removeClass("glyphicon-ok");
262
+ $(VIEWPORT_SIZE_M_DROPDOWN + " span").removeClass("glyphicon-ok");
263
+ $(VIEWPORT_SIZE_L_DROPDOWN + " span").removeClass("glyphicon-ok");
264
+ $(VIEWPORT_SIZE_FIT_DROPDOWN + " span").removeClass("glyphicon-ok");
265
+
266
+ $(VIEWPORT_SIZE_S_SIDEBAR).removeProp("checked");
267
+ $(VIEWPORT_SIZE_M_SIDEBAR).removeProp("checked");
268
+ $(VIEWPORT_SIZE_L_SIDEBAR).removeProp("checked");
269
+ $(VIEWPORT_SIZE_FIT_SIDEBAR).removeProp("checked");
270
+
271
+ $(VIEWPORT_SIZE_L_SIDEBAR).prop("checked", "checked");
272
+ $(VIEWPORT_SIZE_L_DROPDOWN + " span").addClass("glyphicon-ok");
198
273
  };
199
274
 
200
- export const modifyLinkDistanceParameter = (value) => {
201
- grnState.simulation.force("link").distance(value);
202
- grnState.simulation.alpha(1);
275
+ const synchronizeViewportSizeFit = () => {
276
+ $(VIEWPORT_SIZE_S_DROPDOWN + " span").removeClass("glyphicon-ok");
277
+ $(VIEWPORT_SIZE_M_DROPDOWN + " span").removeClass("glyphicon-ok");
278
+ $(VIEWPORT_SIZE_L_DROPDOWN + " span").removeClass("glyphicon-ok");
279
+ $(VIEWPORT_SIZE_FIT_DROPDOWN + " span").removeClass("glyphicon-ok");
280
+
281
+ $(VIEWPORT_SIZE_S_SIDEBAR).removeProp("checked");
282
+ $(VIEWPORT_SIZE_M_SIDEBAR).removeProp("checked");
283
+ $(VIEWPORT_SIZE_L_SIDEBAR).removeProp("checked");
284
+ $(VIEWPORT_SIZE_FIT_SIDEBAR).removeProp("checked");
285
+
286
+ $(VIEWPORT_SIZE_FIT_SIDEBAR).prop("checked", "checked");
287
+ $(VIEWPORT_SIZE_FIT_DROPDOWN + " span").addClass("glyphicon-ok");
203
288
  };
204
289
 
290
+ const updateViewportSize = (currentValue) => {
291
+ // These values are bound to the layout dimensions of the GRNsight website.
292
+ const WIDTH_OFFSET = 250;
293
+ const HEIGHT_OFFSET = 53;
294
+
295
+ let container = $(".grnsight-container");
296
+
297
+ // from jquery
298
+ const fitContainer = dimensions => {
299
+ if (!dimensions) {
300
+ return; // First call; the next one should have dimensions filled in.
301
+ }
302
+
303
+ const fitWidth = dimensions.width - WIDTH_OFFSET;
304
+ const fitHeight = dimensions.height - dimensions.top - HEIGHT_OFFSET;
305
+ if (fitWidth !== container.width() || fitHeight !== container.height()) {
306
+ container.css({
307
+ width: fitWidth,
308
+ height: fitHeight
309
+ });
310
+ }
311
+ };
312
+
313
+ const fitContainerToWindow = () => {
314
+ fitContainer({
315
+ width: $(window).width(),
316
+ height: $(window).height(),
317
+ top: 0
318
+ });
319
+ };
320
+
321
+ const requestWindowDimensions = () => {
322
+ // We send a message if we are in an iframe, and manipulate directly if we aren’t.
323
+ if (window === window.top) {
324
+ fitContainerToWindow();
325
+ } else {
326
+ window.top.postMessage("dimensions", HOST_SITE);
327
+ }
328
+ };
329
+
330
+ let grnsightContainerClass = `grnsight-container ${currentValue}`;
331
+ if (!container.hasClass(currentValue)) {
332
+ container.attr("class", grnsightContainerClass);
333
+ if (currentValue === VIEWPORT_FIT) {
334
+ requestWindowDimensions();
335
+ } else {
336
+ container.css({ width: "", height: "" });
337
+ }
338
+ }
339
+
340
+ // Added synchronization
341
+ if (currentValue === VIEWPORT_S) {
342
+ synchronizeViewportSizeSmall();
343
+ } else if (currentValue === VIEWPORT_M) {
344
+ synchronizeViewportSizeMedium();
345
+ } else if (currentValue === VIEWPORT_L) {
346
+ synchronizeViewportSizeLarge();
347
+ } else if (currentValue === VIEWPORT_FIT) {
348
+ fitContainer(grnState.dimensions);
349
+ synchronizeViewportSizeFit();
350
+ } else if (currentValue === VIEWPORT_INIT) {
351
+ // First time around: initialize.
352
+ requestWindowDimensions();
353
+ }
354
+ };
355
+
356
+
357
+ // Expression DB Functions
358
+ const startLoadingIcon = function () {
359
+ $(EXPRESSION_DB_LOADER).css("display", "block");
360
+ $(EXPRESSION_DB_LOADER_TEXT).css("display", "block");
361
+ };
362
+ const stopLoadingIcon = function () {
363
+ $(EXPRESSION_DB_LOADER).css("display", "none");
364
+ $(EXPRESSION_DB_LOADER_TEXT).css("display", "none");
365
+ };
366
+ const enableNodeColoringUI = function () {
367
+ grnState.nodeColoring.nodeColoringEnabled = true;
368
+ $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).removeClass("hidden");
369
+ $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).removeClass("hidden");
370
+ $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).removeClass("hidden");
371
+ };
372
+ const loadExpressionDatabase = function (isTopDataset) {
373
+ startLoadingIcon();
374
+ queryExpressionDatabase({
375
+ dataset: isTopDataset ? grnState.nodeColoring.topDataset : grnState.nodeColoring.bottomDataset,
376
+ genes : grnState.workbook.genes
377
+ }).then(function (response) {
378
+ if (isTopDataset) {
379
+ grnState.workbook.expression[grnState.nodeColoring.topDataset] = response;
380
+ } else {
381
+ grnState.workbook.expression[grnState.nodeColoring.bottomDataset] = response;
382
+ }
383
+ enableNodeColoringUI();
384
+ stopLoadingIcon();
385
+ updaters.renderNodeColoring();
386
+ }).catch(function (error) {
387
+ console.log(error.stack);
388
+ console.log(error.name);
389
+ console.log(error.message);
390
+ });
391
+ };
392
+
393
+
394
+ // Sliders Functions
205
395
  const updateSliderState = slidersLocked => {
206
396
  const forceGraphDisabled = grnState.graphLayout === GRID_LAYOUT || slidersLocked;
207
397
  if (forceGraphDisabled) {
@@ -228,27 +418,45 @@ const updateSliderState = slidersLocked => {
228
418
  }
229
419
  };
230
420
 
421
+ export const modifyChargeParameter = (value) => {
422
+ grnState.simulation.force("charge").strength(value);
423
+ grnState.simulation.alpha(1);
424
+ };
425
+
426
+ export const modifyLinkDistanceParameter = (value) => {
427
+ grnState.simulation.force("link").distance(value);
428
+ grnState.simulation.alpha(1);
429
+ };
430
+
231
431
  const updateChargeSliderValues = () => {
232
- modifyChargeParameter(grnState.chargeSlider.currentVal);
432
+ if (grnState.workbook !== null) {
433
+ modifyChargeParameter(grnState.chargeSlider.currentVal);
434
+ }
233
435
  $(CHARGE_VALUE).text(grnState.chargeSlider.currentVal);
234
436
  $(CHARGE_MENU).val(grnState.chargeSlider.currentVal);
235
437
  $(CHARGE_SLIDER_SIDEBAR).val(grnState.chargeSlider.currentVal);
236
438
  $(CHARGE_SLIDER_SIDEBAR).html(grnState.chargeSlider.currentVal +
237
- ((grnState.chargeSlider.needsAppendedZeros
238
- && grnState.chargeSlider.currentVal.toString().length === GRAVITY_LENGTH_WITHOUT_ZERO) ? "0" : ""));
439
+ ((grnState.chargeSlider.needsAppendedZeros &&
440
+ grnState.chargeSlider.currentVal.toString().length === GRAVITY_LENGTH_WITHOUT_ZERO) ? "0" : ""));
239
441
  };
240
442
 
241
443
  const updateLinkDistanceSliderValues = () => {
242
- modifyLinkDistanceParameter(grnState.linkDistanceSlider.currentVal);
444
+ if (grnState.workbook !== null) {
445
+ modifyLinkDistanceParameter(grnState.linkDistanceSlider.currentVal);
446
+ }
243
447
  $(LINK_DIST_VALUE).text(grnState.linkDistanceSlider.currentVal);
244
448
  $(LINK_DIST_MENU).val(grnState.linkDistanceSlider.currentVal);
245
449
  $(LINK_DIST_SLIDER_SIDEBAR).val(grnState.linkDistanceSlider.currentVal);
246
450
  $(LINK_DIST_SLIDER_SIDEBAR).html(grnState.linkDistanceSlider.currentVal +
247
- ((grnState.linkDistanceSlider.needsAppendedZeros
248
- && grnState.linkDistanceSlider.currentVal.toString().length === GRAVITY_LENGTH_WITHOUT_ZERO) ? "0" : ""));
451
+ ((grnState.linkDistanceSlider.needsAppendedZeros &&
452
+ grnState.linkDistanceSlider.currentVal.toString().length === GRAVITY_LENGTH_WITHOUT_ZERO) ? "0" : ""));
249
453
  };
250
454
 
251
455
  // Grid Layout Functions
456
+ const expandLayoutSidebar = () => {
457
+ $(LAYOUT_SIDEBAR_PANEL).addClass("in");
458
+ };
459
+
252
460
  const toggleLayout = (on, off) => {
253
461
  if (!$(on).prop("checked")) {
254
462
  $(on).prop("checked", true);
@@ -259,32 +467,30 @@ const toggleLayout = (on, off) => {
259
467
  };
260
468
 
261
469
  const updatetoForceGraph = () => {
262
- $(GRID_LAYOUT_BUTTON).val("Use Grid Layout");
263
470
  $(LOCK_SLIDERS_BUTTON).removeAttr("disabled");
264
- toggleLayout(FORCE_GRAPH_CLASS, GRID_LAYOUT_CLASS);
265
- updaters.setNodesToForceGraph();
471
+ toggleLayout(FORCE_GRAPH_MENU, GRID_LAYOUT_MENU);
266
472
  };
267
473
 
268
474
  const updatetoGridLayout = () => {
269
- $(GRID_LAYOUT_BUTTON).val("Use Force Graph");
270
475
  $(LOCK_SLIDERS_BUTTON).attr("disabled", true);
271
- toggleLayout(GRID_LAYOUT_CLASS, FORCE_GRAPH_CLASS);
272
- updaters.setNodesToGrid();
476
+ toggleLayout(GRID_LAYOUT_MENU, FORCE_GRAPH_MENU);
273
477
  };
274
478
 
275
479
  // Node Coloring Functions
276
480
  const showNodeColoringMenus = () => {
277
- if ($(NODE_COLORING_MENU).hasClass("hidden")) {
278
- $(NODE_COLORING_MENU).removeClass("hidden");
279
- }
280
- if ($(NODE_COLORING_MENU_CLASS).hasClass("disabled")) {
281
- $(NODE_COLORING_MENU_CLASS).removeClass("disabled");
282
- }
481
+ $(NODE_COLORING_SIDEBAR_PANEL).removeClass("disabled");
482
+ $(NODE_COLORING_SIDEBAR_PANEL).addClass("in");
483
+ $(NODE_COLORING_MENU).removeClass("disabled");
484
+ $(NODE_COLORING_MENU_CLASS).removeClass("disabled");
485
+ $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse");
283
486
  };
284
487
 
285
488
  const disableNodeColoringMenus = () => {
286
- $(NODE_COLORING_MENU).addClass("hidden");
489
+ $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled");
490
+ $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in");
491
+ $(NODE_COLORING_MENU).addClass("disabled");
287
492
  $(NODE_COLORING_MENU_CLASS).addClass("disabled");
493
+ $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "");
288
494
  };
289
495
 
290
496
  const isNewWorkbook = (name) => {
@@ -299,11 +505,90 @@ const shortenExpressionSheetName = (name) => {
299
505
  const hasExpressionData = (sheets) => {
300
506
  for (var property in sheets) {
301
507
  if (property.match(ENDS_IN_EXPRESSION_REGEXP)) {
302
- grnState.nodeColoring.showMenu = true;
303
508
  return true;
304
509
  }
305
510
  }
306
- grnState.nodeColoring.showMenu = false;
511
+ return false;
512
+ };
513
+
514
+ const updateSpeciesMenu = () => {
515
+ $(SPECIES_DISPLAY).val(grnState.genePageData.species);
516
+ $(SPECIES_BUTTON_CRESS + " span").removeClass("glyphicon-ok");
517
+ $(SPECIES_BUTTON_FLY + " span").removeClass("glyphicon-ok");
518
+ $(SPECIES_BUTTON_HUMAN + " span").removeClass("glyphicon-ok");
519
+ $(SPECIES_BUTTON_YEAST + " span").removeClass("glyphicon-ok");
520
+ $(SPECIES_BUTTON_NEMATODE + " span").removeClass("glyphicon-ok");
521
+ $(SPECIES_BUTTON_MOUSE + " span").removeClass("glyphicon-ok");
522
+ if ($(SPECIES_DISPLAY).val() === "Arabidopsis_thaliana") {
523
+ $(SPECIES_BUTTON_CRESS + " span").addClass("glyphicon-ok");
524
+ }
525
+ if ($(SPECIES_DISPLAY).val() === "Drosophila_melanogaster") {
526
+ $(SPECIES_BUTTON_FLY + " span").addClass("glyphicon-ok");
527
+ }
528
+ if ($(SPECIES_DISPLAY).val() === "Caenorhabditis_elegans") {
529
+ $(SPECIES_BUTTON_NEMATODE + " span").addClass("glyphicon-ok");
530
+ }
531
+ if ($(SPECIES_DISPLAY).val() === "Homo_sapiens") {
532
+ $(SPECIES_BUTTON_HUMAN + " span").addClass("glyphicon-ok");
533
+ }
534
+ if ($(SPECIES_DISPLAY).val() === "Mus_musculus") {
535
+ $(SPECIES_BUTTON_MOUSE + " span").addClass("glyphicon-ok");
536
+ }
537
+ if ($(SPECIES_DISPLAY).val() === "Saccharomyces_cerevisiae") {
538
+ $(SPECIES_BUTTON_YEAST + " span").addClass("glyphicon-ok");
539
+ }
540
+ };
541
+
542
+ // helper method to check if the given data, a taxon id or a species name
543
+ // is contained within the identified species, if it exists at all.
544
+ export const identifySpeciesMenu = (data) => {
545
+ var nameTax = grnState.nameToTaxon;
546
+ for (var n in nameTax) {
547
+ if (Object.values(nameTax[n]).includes(data.toString())) {
548
+ grnState.genePageData.commonName = n;
549
+ grnState.genePageData.species = nameTax[n].spec;
550
+ grnState.genePageData.taxonJaspar = nameTax[n].jaspar;
551
+ grnState.genePageData.taxonUniprot = nameTax[n].uniprot;
552
+ grnState.genePageData.ensembl = nameTax[n].ensembl;
553
+ grnState.genePageData.mine = nameTax[n].mine;
554
+ $(SPECIES_DISPLAY).val(grnState.genePageData.species);
555
+ updateSpeciesMenu();
556
+ return grnState.genePageData.identified;
557
+ }
558
+ }
559
+ return false;
560
+ };
561
+
562
+ const identifySpeciesOrTaxon = (data) => {
563
+ var nameTax = grnState.nameToTaxon;
564
+ for (var n in nameTax) {
565
+ if (n === data) { // <-- change if to work
566
+ grnState.genePageData.commonName = n;
567
+ grnState.genePageData.species = nameTax[n].spec;
568
+ grnState.genePageData.taxonJaspar = nameTax[n].jaspar.toString();
569
+ grnState.genePageData.taxonUniprot = nameTax[n].uniprot.toString();
570
+ grnState.genePageData.identified = true;
571
+ grnState.genePageData.ensembl = nameTax[n].ensembl;
572
+ grnState.genePageData.mine = nameTax[n].mine;
573
+ $(SPECIES_DISPLAY).val(grnState.genePageData.species);
574
+ updateSpeciesMenu();
575
+ return grnState.genePageData.identified;
576
+ }
577
+ for (var t in Object.values(nameTax[n])) {
578
+ if (Object.values(nameTax[n])[t] === data) {
579
+ grnState.genePageData.commonName = n;
580
+ grnState.genePageData.species = nameTax[n].spec;
581
+ grnState.genePageData.taxonJaspar = nameTax[n].jaspar.toString();
582
+ grnState.genePageData.taxonUniprot = nameTax[n].uniprot.toString();
583
+ grnState.genePageData.identified = true;
584
+ grnState.genePageData.ensembl = nameTax[n].ensembl;
585
+ grnState.genePageData.mine = nameTax[n].mine;
586
+ $(SPECIES_DISPLAY).val(grnState.genePageData.species);
587
+ updateSpeciesMenu();
588
+ return grnState.genePageData.identified;
589
+ }
590
+ }
591
+ }
307
592
  return false;
308
593
  };
309
594
 
@@ -314,7 +599,11 @@ const clearDropdownMenus = () => {
314
599
  $(BOTTOM_DATASET_SELECTION_SIDEBAR).html("");
315
600
  };
316
601
 
317
- const resetDatasetDropdownMenus = (network) => {
602
+ const expressionDBDatasets = ["Barreto_2012_wt", "Dahlquist_2018_dcin5",
603
+ "Dahlquist_2018_dgln3", "Dahlquist_2018_dhap4", "Dahlquist_2018_dzap1",
604
+ "Dahlquist_2018_wt", "Kitagawa_2002_wt", "Thorsen_2007_wt"];
605
+
606
+ const resetDatasetDropdownMenus = (workbook) => {
318
607
  clearDropdownMenus();
319
608
  $(".dataset-option").remove(); // clear all menu dataset options
320
609
 
@@ -328,17 +617,23 @@ const resetDatasetDropdownMenus = (network) => {
328
617
  </li>`;
329
618
  };
330
619
 
331
- for (var property in network.expression) {
620
+ grnState.nodeColoring.nodeColoringOptions = [];
621
+ for (var property in workbook.expression) {
332
622
  if (property.match(ENDS_IN_EXPRESSION_REGEXP)) {
333
623
  grnState.nodeColoring.nodeColoringOptions.push({value: property});
334
624
  }
335
625
  }
336
626
 
627
+ // Add expression database options
628
+ expressionDBDatasets.forEach(option => grnState.nodeColoring.nodeColoringOptions.push({value: [option]}));
629
+
337
630
  $(BOTTOM_DATASET_SELECTION_SIDEBAR).append($("<option>")
338
631
  .attr("value", "Same as Top Dataset").text("Same as Top Dataset"));
339
632
 
340
633
  $(BOTTOM_DATASET_SELECTION_MENU).append(createHTMLforDataset("Same as Top Dataset"));
341
634
 
635
+ // $(DATA_SET_SELECT).append($("<option>").attr("value", "Dahlquist").text("Dahlquist"));
636
+
342
637
  grnState.nodeColoring.nodeColoringOptions.forEach(function (option) {
343
638
  var shortenedSheetName = shortenExpressionSheetName(option.value);
344
639
  $(TOP_DATASET_SELECTION_SIDEBAR).append($("<option>")
@@ -377,7 +672,6 @@ const updateTopDataset = () => {
377
672
  removeAllChecksFromMenuDatasetOptions(TOP_DATASET_SELECTION_MENU);
378
673
  $(`${TOP_DATASET_SELECTION_MENU} li[value='${grnState.nodeColoring.topDataset}'] a span`).addClass("glyphicon-ok");
379
674
  updaters.renderNodeColoring();
380
- // TO DO: If bottomDataSameAsTop make bottom selction "Same As Top"
381
675
  };
382
676
 
383
677
  const updateBottomDataset = () => {
@@ -393,18 +687,37 @@ const updateBottomDataset = () => {
393
687
  .addClass("glyphicon-ok");
394
688
  /* eslint-enable max-len */
395
689
  }
690
+
396
691
  updaters.renderNodeColoring();
397
692
  };
398
693
 
399
- export const updateApp = grnState => {
694
+ if (!grnState.genePageData.identified) {
695
+ $(SPECIES_DISPLAY).val(grnState.genePageData.species);
696
+ }
400
697
 
401
- if (grnState.newNetwork) {
402
- grnState.normalizationMax = max(grnState.network.positiveWeights.concat(grnState.network.negativeWeights));
403
- displayNetwork(grnState.network, grnState.name);
698
+ export const updateApp = grnState => {
699
+ if (grnState.newWorkbook) {
700
+ grnState.normalizationMax = max(grnState.workbook.positiveWeights.concat(grnState.workbook.negativeWeights));
701
+ displayworkbook(grnState.workbook, grnState.name);
702
+ expandLayoutSidebar();
404
703
  clearDropdownMenus();
405
- if (hasExpressionData(grnState.network.expression)) {
406
- resetDatasetDropdownMenus(grnState.network);
407
- grnState.nodeColoring.nodeColoringEnabled = true;
704
+ // check if the species has been identified yet, if not try to identify it
705
+ // also checks if the areas have been populated at all
706
+ var workbookSpecies = grnState.workbook.meta.species;
707
+ var workbookTaxon = grnState.workbook.meta.taxon_id;
708
+ if (identifySpeciesOrTaxon(workbookSpecies) || identifySpeciesOrTaxon(workbookTaxon)) {
709
+ identifySpeciesOrTaxon(workbookSpecies);
710
+ identifySpeciesOrTaxon(workbookTaxon);
711
+ }
712
+
713
+ // nodeColoringEnabled will only be set the very first time; because otherwise the user will have
714
+ // made a choice and we will let the choice stick.
715
+ if (hasExpressionData(grnState.workbook.expression)) {
716
+ resetDatasetDropdownMenus(grnState.workbook);
717
+ if (grnState.nodeColoring.nodeColoringEnabled === undefined) {
718
+ grnState.nodeColoring.nodeColoringEnabled = true;
719
+ }
720
+
408
721
  if (isNewWorkbook(name)) {
409
722
  grnState.nodeColoring.showMenu = true;
410
723
  grnState.nodeColoring.lastDataset = name;
@@ -420,13 +733,15 @@ export const updateApp = grnState => {
420
733
  grnState.nodeColoring.bottomDataSameAsTop = false;
421
734
  }
422
735
  } else {
423
- grnState.nodeColoringEnabled = false;
736
+ if (grnState.nodeColoring.nodeColoringEnabled === undefined) {
737
+ grnState.nodeColoringEnabled = false;
738
+ }
424
739
  }
425
740
  refreshApp();
426
741
 
427
- // Rare exception to the MVC cycle: right now we have no way of knowing whether the network has changed
428
- // (which is what necessitates displayNetwork), so we mark the model here.
429
- grnState.newNetwork = false;
742
+ // Rare exception to the MVC cycle: right now we have no way of knowing whether the workbook has changed
743
+ // (which is what necessitates displayworkbook), so we mark the model here.
744
+ grnState.newWorkbook = false;
430
745
  }
431
746
 
432
747
  synchronizeNormalizationValues(grnState.normalizationMax);
@@ -437,12 +752,10 @@ export const updateApp = grnState => {
437
752
  $(GREY_EDGES_DASHED_MENU + " span").addClass("glyphicon-ok");
438
753
  $(GREY_EDGES_DASHED_MENU).prop("checked", "checked");
439
754
  $(GREY_EDGES_DASHED_SIDEBAR).prop("checked", "checked");
440
- refreshApp();
441
755
  } else {
442
756
  $(GREY_EDGES_DASHED_MENU + " span").removeClass("glyphicon-ok");
443
757
  $(GREY_EDGES_DASHED_MENU).removeProp("checked");
444
758
  $(GREY_EDGES_DASHED_SIDEBAR).removeProp("checked");
445
- refreshApp();
446
759
  }
447
760
 
448
761
  // Weights functions
@@ -455,11 +768,10 @@ export const updateApp = grnState => {
455
768
  }
456
769
 
457
770
  // Enable/Disable Colored edges
458
- if (grnState.colorOptimal) {
459
- enableColorOptimal();
460
- } else {
461
- disableColorOptimal();
462
- }
771
+ $(COLOR_EDGES_SIDEBAR).prop("checked", grnState.colorOptimal);
772
+ const classFunction = `${grnState.colorOptimal ? "add" : "remove"}Class`;
773
+ $(COLOR_EDGES_MENU)[classFunction](ACTIVE_COLOR_OPTION);
774
+ $(`${COLOR_EDGES_MENU}>span`)[classFunction]("glyphicon-ok");
463
775
 
464
776
  // Graph Layout
465
777
  if (grnState.graphLayout === FORCE_GRAPH) {
@@ -468,19 +780,87 @@ export const updateApp = grnState => {
468
780
  updatetoGridLayout();
469
781
  }
470
782
 
471
- // Node Coloring
472
- if (grnState.network !== null && grnState.nodeColoring.nodeColoringEnabled
473
- && hasExpressionData(grnState.network.expression)) {
783
+ // Viewport
784
+ updateViewportSize(grnState.viewportSize);
785
+
786
+ // Node Coloring
787
+ if (grnState.workbook !== null && grnState.nodeColoring.nodeColoringEnabled
788
+ && hasExpressionData(grnState.workbook.expression)) {
789
+ grnState.nodeColoring.showMenu = true;
474
790
  $(AVG_REPLICATE_VALS_TOP_SIDEBAR).prop("checked", true);
475
791
  $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", true);
476
- $(NODE_COLORING_TOGGLE_MENU + " span").removeClass("glyphicon-ok");
477
- $(NODE_COLORING_TOGGLE_SIDEBAR).val("Disable Node Coloring");
792
+ $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok");
793
+ $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true);
478
794
  $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE);
479
- updaters.renderNodeColoring();
795
+ $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden");
796
+ if (expressionDBDatasets.includes(grnState.nodeColoring.topDataset) &&
797
+ grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) {
798
+ if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) {
799
+ loadExpressionDatabase(true);
800
+ }
801
+ } else if (expressionDBDatasets.includes(grnState.nodeColoring.bottomDataset) &&
802
+ !grnState.nodeColoring.bottomDataSameAsTop &&
803
+ grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) {
804
+ if (!grnState.nodeColoring.bottomDataSameAsTop) {
805
+ loadExpressionDatabase(false);
806
+ }
807
+ } else {
808
+ updaters.renderNodeColoring();
809
+ }
810
+ } else if (grnState.workbook !== null && !hasExpressionData(grnState.workbook.expression)
811
+ && grnState.nodeColoring.nodeColoringEnabled) {
812
+ if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) ||
813
+ (!grnState.nodeColoring.bottomDataSameAsTop &&
814
+ grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) {
815
+ updaters.removeNodeColoring();
816
+ resetDatasetDropdownMenus(grnState.workbook);
817
+ }
818
+ grnState.nodeColoring.showMenu = true;
819
+ grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ?
820
+ grnState.nodeColoring.topDataset : "Barreto_2012_wt";
821
+ grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ?
822
+ grnState.nodeColoring.bottomDataset : "Barreto_2012_wt";
823
+ $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).addClass("hidden");
824
+ $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).addClass("hidden");
825
+ $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).addClass("hidden");
826
+ if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) {
827
+ if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) {
828
+ loadExpressionDatabase(true);
829
+ } else if (!grnState.nodeColoring.bottomDataSameAsTop &&
830
+ grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) {
831
+ loadExpressionDatabase(false);
832
+ } else {
833
+ enableNodeColoringUI();
834
+ // There is as problem here! When a dataset from the database is used to do node coloring,
835
+ // but then the layout of the graph is changed (force graph to grid layout, for instance),
836
+ // node coloring goes away, seemingly inexplicably.
837
+ // !!!!! TEMPORARY WORKAROUND:
838
+ // Calling `updaters.renderNodeColoring()` inline does not succeed; instead, a delay
839
+ // has to take place, done here via `setTimeout`.
840
+ //
841
+ // The delay is built-in to the cases where a query has to happen first.
842
+ //
843
+ // For some reason, calling updates.renderNodeColoring() _synchronously_ does not
844
+ // actually perform the node coloring.
845
+ //
846
+ // Investigate why a timeout is required in order for node coloring to take place
847
+ // successfully in this case.
848
+ setTimeout(() => updaters.renderNodeColoring(), 250);
849
+
850
+ }
851
+ }
852
+ } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) {
853
+ $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden");
854
+ $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok");
855
+ $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false);
856
+ }
857
+
858
+ if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") {
859
+ showEdgeWeightOptions();
860
+ } else if (grnState.workbook !== null && grnState.workbook.sheetType === "unweighted") {
861
+ hideEdgeWeightOptions();
480
862
  } else {
481
- $(NODE_COLORING_TOGGLE_MENU + " span").addClass("glyphicon-ok");
482
- $(NODE_COLORING_TOGGLE_SIDEBAR).val("Enable Node Coloring");
483
- updaters.removeNodeColoring();
863
+ hideEdgeWeightOptions();
484
864
  }
485
865
 
486
866
  if (grnState.nodeColoring.averageTopDataset) {
@@ -499,11 +879,13 @@ export const updateApp = grnState => {
499
879
  $(AVG_REPLICATE_VALS_BOTTOM_MENU + " span").addClass("glyphicon-ok");
500
880
  $(AVG_REPLICATE_VALS_BOTTOM_MENU).prop("checked", "checked");
501
881
  $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", "checked");
882
+
502
883
  updaters.renderNodeColoring();
503
884
  } else {
504
885
  $(AVG_REPLICATE_VALS_BOTTOM_MENU + " span").removeClass("glyphicon-ok");
505
886
  $(AVG_REPLICATE_VALS_BOTTOM_MENU).removeProp("checked");
506
887
  $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).removeProp("checked");
888
+
507
889
  updaters.renderNodeColoring();
508
890
  }
509
891
 
@@ -526,11 +908,19 @@ export const updateApp = grnState => {
526
908
  $(UNDO_SLIDERS_RESET_MENU).parent().addClass("disabled");
527
909
  }
528
910
 
529
- if (grnState.network !== null) {
530
- updateChargeSliderValues();
531
- updateLinkDistanceSliderValues();
532
- }
911
+ updateChargeSliderValues();
912
+ updateLinkDistanceSliderValues();
533
913
 
534
- // Refresh graph
914
+ $(ZOOM_CONTROL).prop({ disabled: !grnState.workbook });
915
+ if (!grnState.workbook) {
916
+ // Set initial values when there is no workbook: this is necessarily explicit because Firefox
917
+ // preserves these values even upon a browser reload.
918
+ $(ZOOM_INPUT).val(ZOOM_DISPLAY_MIDDLE);
919
+ $(ZOOM_SLIDER).val(ZOOM_ADAPTIVE_MAX_SCALE);
920
+ }
535
921
  refreshApp();
922
+
536
923
  };
924
+
925
+
926
+ export { stopLoadingIcon, startLoadingIcon};