grnsight 3.0.0 → 5.1.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 (489) hide show
  1. package/.eslintignore +1 -0
  2. package/.travis.yml +1 -1
  3. package/GRNsight - Beta.html +194 -0
  4. package/Gemfile.lock +259 -0
  5. package/README.md +1 -1
  6. package/_gh_pages/about.html +360 -45
  7. package/_gh_pages/assets/css/footer.css +3 -0
  8. package/_gh_pages/assets/css/main.css +28 -14
  9. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_estimation_output_binary-no-targetless-genes_sif.png +0 -0
  10. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_estimation_output_binary_sif.png +0 -0
  11. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_3-edges-and-footer.png +0 -0
  12. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_header-and-3-nodes.png +0 -0
  13. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_output_3-edges-and-footer.png +0 -0
  14. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_output_header-and-3-nodes.png +0 -0
  15. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_binary-no-targetless-genes_sif.png +0 -0
  16. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_binary_sif.png +0 -0
  17. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_concatenated-no-targetless-genes_sif.png +0 -0
  18. package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_concatenated_sif.png +0 -0
  19. package/_gh_pages/assets/images/Choe-Shin_CMSI402-poster-session_20180430.jpg +0 -0
  20. package/_gh_pages/assets/images/Choe_SCCUR_2017.jpg +0 -0
  21. package/_gh_pages/assets/images/Dahlquist-Choe-Shin_CMSI402-poster-session_20180430.jpg +0 -0
  22. package/_gh_pages/assets/images/Dionisio-Dahlquist_GRNsight-shades_20170506.jpg +0 -0
  23. package/_gh_pages/assets/images/Klein_Samdarshi_TriBeta_2018_20180317.jpg +0 -0
  24. package/_gh_pages/assets/images/Shin_SCCUR_2017.jpg +0 -0
  25. 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
  26. 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
  27. package/_gh_pages/assets/images/gene-pages-0.png +0 -0
  28. package/_gh_pages/assets/images/gene-pages-1.png +0 -0
  29. package/_gh_pages/assets/images/gene-pages-2.png +0 -0
  30. package/_gh_pages/assets/images/gene-pages-3.png +0 -0
  31. package/_gh_pages/assets/images/grnsight2020.png +0 -0
  32. package/_gh_pages/assets/images/v3demo2-grid+nodecoloring.png +0 -0
  33. package/_gh_pages/assets/images/v3demo2-nodecoloring.png +0 -0
  34. package/_gh_pages/assets/images/v3demo2.png +0 -0
  35. package/_gh_pages/assets/js/ga-report.js +11 -11
  36. package/_gh_pages/assets/js/iframeResizer.min.js +9 -0
  37. package/_gh_pages/assets/js/main.js +43 -43
  38. package/_gh_pages/beta.html +29 -24
  39. package/_gh_pages/contact.html +31 -31
  40. package/_gh_pages/coverage/coverage.json +1 -0
  41. package/_gh_pages/coverage/coverage.raw.json +1 -0
  42. package/_gh_pages/coverage/lcov-report/base.css +223 -0
  43. package/_gh_pages/coverage/lcov-report/block-navigation.js +63 -0
  44. package/_gh_pages/coverage/lcov-report/controllers/additional-sheet-parser.js.html +330 -0
  45. package/_gh_pages/coverage/lcov-report/controllers/constants.js.html +243 -0
  46. package/_gh_pages/coverage/lcov-report/controllers/export-controller.js.html +285 -0
  47. package/_gh_pages/coverage/lcov-report/controllers/exporters/graphml.js.html +405 -0
  48. package/_gh_pages/coverage/lcov-report/controllers/exporters/index.html +110 -0
  49. package/_gh_pages/coverage/lcov-report/controllers/exporters/sif.js.html +150 -0
  50. package/_gh_pages/coverage/lcov-report/controllers/helpers.js.html +114 -0
  51. package/_gh_pages/coverage/lcov-report/controllers/import-controller.js.html +233 -0
  52. package/_gh_pages/coverage/lcov-report/controllers/importers/graphml.js.html +716 -0
  53. package/_gh_pages/coverage/lcov-report/controllers/importers/index.html +106 -0
  54. package/_gh_pages/coverage/lcov-report/controllers/importers/sif.js.html +488 -0
  55. package/_gh_pages/coverage/lcov-report/controllers/index.html +162 -0
  56. package/_gh_pages/coverage/lcov-report/controllers/semantic-checker.js.html +810 -0
  57. package/_gh_pages/coverage/lcov-report/controllers/spreadsheet-controller.js.html +1779 -0
  58. package/_gh_pages/coverage/lcov-report/index.html +136 -0
  59. package/_gh_pages/coverage/lcov-report/prettify.css +1 -0
  60. package/_gh_pages/coverage/lcov-report/prettify.js +1 -0
  61. package/_gh_pages/coverage/lcov-report/server/controllers/additional-sheet-parser.js.html +330 -0
  62. package/_gh_pages/coverage/lcov-report/server/controllers/constants.js.html +243 -0
  63. package/_gh_pages/coverage/lcov-report/server/controllers/export-controller.js.html +285 -0
  64. package/_gh_pages/coverage/lcov-report/server/controllers/exporters/graphml.js.html +405 -0
  65. package/_gh_pages/coverage/lcov-report/server/controllers/exporters/index.html +110 -0
  66. package/_gh_pages/coverage/lcov-report/server/controllers/exporters/sif.js.html +150 -0
  67. package/_gh_pages/coverage/lcov-report/server/controllers/graphml-constants.js.html +585 -0
  68. package/_gh_pages/coverage/lcov-report/server/controllers/helpers.js.html +114 -0
  69. package/_gh_pages/coverage/lcov-report/server/controllers/import-controller.js.html +237 -0
  70. package/_gh_pages/coverage/lcov-report/server/controllers/importers/graphml.js.html +585 -0
  71. package/_gh_pages/coverage/lcov-report/server/controllers/importers/index.html +110 -0
  72. package/_gh_pages/coverage/lcov-report/server/controllers/importers/sif.js.html +492 -0
  73. package/_gh_pages/coverage/lcov-report/server/controllers/index.html +188 -0
  74. package/_gh_pages/coverage/lcov-report/server/controllers/semantic-checker.js.html +810 -0
  75. package/_gh_pages/coverage/lcov-report/server/controllers/spreadsheet-controller.js.html +1779 -0
  76. package/_gh_pages/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  77. package/_gh_pages/coverage/lcov-report/sorter.js +158 -0
  78. package/_gh_pages/coverage/lcov-report/web-client/public/js/grnstate.js.html +225 -0
  79. package/_gh_pages/coverage/lcov-report/web-client/public/js/index.html +97 -0
  80. package/_gh_pages/coverage/lcov.info +49 -0
  81. package/_gh_pages/documentation.html +998 -320
  82. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.aux +47 -0
  83. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.bbl +73 -0
  84. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.blg +52 -0
  85. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.log +1056 -0
  86. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.out +7 -0
  87. package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.synctex.gz +0 -0
  88. package/_gh_pages/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised-Dondi.docx +0 -0
  89. package/_gh_pages/encryption/server.cert +21 -0
  90. package/_gh_pages/encryption/server.key +28 -0
  91. package/_gh_pages/favicon.ico +0 -0
  92. package/_gh_pages/index.html +45 -22
  93. package/_gh_pages/links.html +47 -28
  94. package/_gh_pages/news.html +103 -21
  95. package/_gh_pages/onlyfooter.html +78 -0
  96. package/_gh_pages/onlyheader.html +64 -0
  97. package/_gh_pages/onlysidebar.html +73 -0
  98. package/_gh_pages/package-lock.json +14048 -0
  99. package/_gh_pages/people.html +129 -40
  100. package/_gh_pages/privacy.html +23 -17
  101. package/_gh_pages/publications.html +75 -33
  102. package/_gh_pages/robots.txt +1 -0
  103. package/_gh_pages/sitemap.xml +87 -74
  104. package/_gh_pages/test-files/import-samples/attributes.graphml +40 -0
  105. package/_gh_pages/test-files/import-samples/port.graphml +32 -0
  106. package/_gh_pages/test-files/import-samples/simple.graphml +31 -0
  107. package/_gh_pages/web-client/public/js/grnsight.min.js +2347 -0
  108. package/_gh_pages/web-client/public/stylesheets/grnsight.css +443 -0
  109. package/coverage/coverage.json +1 -1
  110. package/coverage/coverage.raw.json +1 -0
  111. package/coverage/lcov-report/base.css +18 -8
  112. package/coverage/lcov-report/block-navigation.js +63 -0
  113. package/coverage/lcov-report/controllers/additional-sheet-parser.js.html +330 -0
  114. package/coverage/lcov-report/controllers/constants.js.html +65 -61
  115. package/coverage/lcov-report/controllers/export-controller.js.html +96 -92
  116. package/coverage/lcov-report/controllers/exporters/graphml.js.html +168 -164
  117. package/coverage/lcov-report/controllers/exporters/index.html +36 -32
  118. package/coverage/lcov-report/controllers/exporters/sif.js.html +65 -61
  119. package/coverage/lcov-report/controllers/helpers.js.html +25 -21
  120. package/coverage/lcov-report/controllers/index.html +49 -45
  121. package/coverage/lcov-report/controllers/semantic-checker.js.html +403 -396
  122. package/coverage/lcov-report/controllers/spreadsheet-controller.js.html +973 -879
  123. package/coverage/lcov-report/index.html +45 -28
  124. package/coverage/lcov-report/server/controllers/additional-sheet-parser.js.html +330 -0
  125. package/coverage/lcov-report/server/controllers/constants.js.html +243 -0
  126. package/coverage/lcov-report/server/controllers/export-controller.js.html +285 -0
  127. package/coverage/lcov-report/server/controllers/exporters/graphml.js.html +405 -0
  128. package/coverage/lcov-report/server/controllers/exporters/index.html +110 -0
  129. package/coverage/lcov-report/server/controllers/exporters/sif.js.html +150 -0
  130. package/coverage/lcov-report/server/controllers/graphml-constants.js.html +585 -0
  131. package/coverage/lcov-report/server/controllers/helpers.js.html +114 -0
  132. package/coverage/lcov-report/server/controllers/import-controller.js.html +237 -0
  133. package/coverage/lcov-report/server/controllers/importers/graphml.js.html +585 -0
  134. package/coverage/lcov-report/server/controllers/importers/index.html +110 -0
  135. package/coverage/lcov-report/server/controllers/importers/sif.js.html +492 -0
  136. package/coverage/lcov-report/server/controllers/index.html +188 -0
  137. package/coverage/lcov-report/server/controllers/semantic-checker.js.html +810 -0
  138. package/coverage/lcov-report/server/controllers/spreadsheet-controller.js.html +1779 -0
  139. package/coverage/lcov-report/web-client/public/js/grnstate.js.html +225 -0
  140. package/coverage/lcov-report/web-client/public/js/index.html +97 -0
  141. package/coverage/lcov.info +1758 -876
  142. package/encryption/server.cert +21 -0
  143. package/encryption/server.key +28 -0
  144. package/package.json +46 -22
  145. package/server/app.js +6 -2
  146. package/server/config/config.js +16 -7
  147. package/server/controllers/additional-sheet-parser.js +292 -55
  148. package/server/controllers/api-controllers.js +36 -0
  149. package/server/controllers/constants.js +4 -37
  150. package/server/controllers/database-controller.js +129 -0
  151. package/server/controllers/demo-workbooks.js +5973 -0
  152. package/server/controllers/export-constants.js +78 -0
  153. package/server/controllers/export-controller.js +25 -3
  154. package/server/controllers/exporters/graphml.js +15 -15
  155. package/server/controllers/exporters/sif.js +7 -7
  156. package/server/controllers/exporters/xlsx.js +183 -0
  157. package/server/controllers/expression-sheet-parser.js +170 -0
  158. package/server/controllers/ga-controller.js +1 -1
  159. package/server/controllers/graphml-constants.js +0 -17
  160. package/server/controllers/helpers.js +25 -1
  161. package/server/controllers/import-controller.js +2 -2
  162. package/server/controllers/importers/graphml.js +17 -20
  163. package/server/controllers/importers/sif.js +22 -18
  164. package/server/controllers/network-sheet-parser.js +307 -0
  165. package/server/controllers/semantic-checker.js +30 -162
  166. package/server/controllers/sif-constants.js +36 -0
  167. package/server/controllers/spreadsheet-controller.js +277 -424
  168. package/server/controllers/workbook-constants.js +521 -0
  169. package/test/additional-sheet-parser-tests.js +147 -38
  170. package/test/api-tests.js +245 -0
  171. package/test/errors-adjacency-matrix-modifications.js +30 -29
  172. package/test/errors-gene-name-modifications.js +9 -0
  173. package/test/errors-graph-tests.js +4 -4
  174. package/test/errors-sheet-modifications.js +10 -2
  175. package/test/export-tests.js +431 -24
  176. package/test/expression-data-import-tests.js +113 -0
  177. package/test/grnstate-tests.js +29 -0
  178. package/test/import-graphml-tests.js +59 -40
  179. package/test/import-sif-tests.js +50 -37
  180. package/test/test.js +557 -93
  181. package/test/warnings-adjacency-matrix-modifications.js +8 -7
  182. package/test-files/additional-sheet-test-files/optimization-diagnostics-default.xlsx +0 -0
  183. package/test-files/additional-sheet-test-files/optimization-diagnostics-extraneous-data.xlsx +0 -0
  184. package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-MSE-gene-header.xlsx +0 -0
  185. package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-MSE-header.xlsx +0 -0
  186. package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-column-headers.xlsx +0 -0
  187. package/test-files/additional-sheet-test-files/optimization-diagnostics-invalid-MSE-data.xlsx +0 -0
  188. package/test-files/additional-sheet-test-files/optimization-diagnostics-invalid-value.xlsx +0 -0
  189. package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-MSE-data.xlsx +0 -0
  190. package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-column-headers.xlsx +0 -0
  191. package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-header.xlsx +0 -0
  192. package/test-files/additional-sheet-test-files/optimization-diagnostics-unknown-parameter.xlsx +0 -0
  193. package/test-files/additional-sheet-test-files/optimization-parameters-default.xlsx +0 -0
  194. package/test-files/additional-sheet-test-files/optimization-parameters-incorrect-headers.xlsx +0 -0
  195. package/test-files/additional-sheet-test-files/optimization-parameters-invalid-optimization-parameter.xlsx +0 -0
  196. package/test-files/additional-sheet-test-files/optimization-parameters-missing-headers.xlsx +0 -0
  197. package/test-files/additional-sheet-test-files/optimization-parameters-unknown-parameter.xlsx +0 -0
  198. package/test-files/additional-sheet-test-files/two-column-sheets-extraneous-data.xlsx +0 -0
  199. package/test-files/additional-sheet-test-files/two-column-sheets-incorrect-cell-A1.xlsx +0 -0
  200. package/test-files/additional-sheet-test-files/two-column-sheets-incorrect-column-header.xlsx +0 -0
  201. package/test-files/additional-sheet-test-files/two-column-sheets-invalid-gene-length.xlsx +0 -0
  202. package/test-files/additional-sheet-test-files/two-column-sheets-invalid-gene-type.xlsx +0 -0
  203. package/test-files/additional-sheet-test-files/two-column-sheets-invalid-value.xlsx +0 -0
  204. package/test-files/additional-sheet-test-files/two-column-sheets-missing-column-header.xlsx +0 -0
  205. package/test-files/additional-sheet-test-files/two-column-sheets-special-character.xlsx +0 -0
  206. package/test-files/adjacency-matrix-modifications/asymmetric-gene-order-input.xlsx +0 -0
  207. package/test-files/adjacency-matrix-modifications/asymmetric-gene-order-output.xlsx +0 -0
  208. package/test-files/adjacency-matrix-modifications/extra-column-adjacent-input.xlsx +0 -0
  209. package/test-files/adjacency-matrix-modifications/extra-column-adjacent-output.xlsx +0 -0
  210. package/test-files/adjacency-matrix-modifications/extra-column-end-of-sheet-input.xlsx +0 -0
  211. package/test-files/adjacency-matrix-modifications/extra-column-end-of-sheet-output.xlsx +0 -0
  212. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-both-output.xlsx +0 -0
  213. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-only-input.xlsx +0 -0
  214. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-only-output.xlsx +0 -0
  215. package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-optimized-only-output.xlsx +0 -0
  216. package/test-files/adjacency-matrix-modifications/extra-row-end-of-sheet-input.xlsx +0 -0
  217. package/test-files/adjacency-matrix-modifications/extra-row-end-of-sheet-output.xlsx +0 -0
  218. package/test-files/adjacency-matrix-modifications/incorrect-network-cell-A1.xlsx +0 -0
  219. package/test-files/adjacency-matrix-modifications/missing-column-end-input.xlsx +0 -0
  220. package/test-files/adjacency-matrix-modifications/missing-column-end-output.xlsx +0 -0
  221. package/test-files/adjacency-matrix-modifications/missing-data-input.xlsx +0 -0
  222. package/test-files/adjacency-matrix-modifications/missing-data-output.xlsx +0 -0
  223. package/test-files/adjacency-matrix-modifications/missing-row-end-input.xlsx +0 -0
  224. package/test-files/adjacency-matrix-modifications/missing-row-end-output.xlsx +0 -0
  225. package/test-files/adjacency-matrix-modifications/missing-row-middle-input.xlsx +0 -0
  226. package/test-files/adjacency-matrix-modifications/missing-row-middle-output.xlsx +0 -0
  227. package/test-files/adjacency-matrix-modifications/missing-value-bottom-corner-input.xlsx +0 -0
  228. package/test-files/adjacency-matrix-modifications/missing-value-bottom-corner-output.xlsx +0 -0
  229. package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-both-output.xlsx +0 -0
  230. package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-net-only-input.xlsx +0 -0
  231. package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-net-op-only-output.xlsx +0 -0
  232. package/test-files/adjacency-matrix-modifications/value-replaced/342/200/223w-spaces-net-only-output.xlsx +0 -0
  233. package/test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_estimation_output.xlsx +0 -0
  234. package/test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_input.xlsx +0 -0
  235. package/test-files/expression-data-test-sheets/expression_sheet_correct_numbering.xlsx +0 -0
  236. package/test-files/expression-data-test-sheets/expression_sheet_different_number_of_columns.xlsx +0 -0
  237. package/test-files/expression-data-test-sheets/expression_sheet_empty_column.xlsx +0 -0
  238. package/test-files/expression-data-test-sheets/expression_sheet_empty_row.xlsx +0 -0
  239. package/test-files/expression-data-test-sheets/expression_sheet_erroneous_data.xlsx +0 -0
  240. package/test-files/expression-data-test-sheets/expression_sheet_extra_gene_name.xlsx +0 -0
  241. package/test-files/expression-data-test-sheets/expression_sheet_incorrectly_ordered_time_points.xlsx +0 -0
  242. package/test-files/expression-data-test-sheets/expression_sheet_mismatched_case_gene_names.xlsx +0 -0
  243. package/test-files/expression-data-test-sheets/expression_sheet_mismatched_gene_names.xlsx +0 -0
  244. package/test-files/expression-data-test-sheets/expression_sheet_missing_column_header.xlsx +0 -0
  245. package/test-files/expression-data-test-sheets/expression_sheet_missing_data_error.xlsx +0 -0
  246. package/test-files/expression-data-test-sheets/expression_sheet_missing_data_ok.xlsx +0 -0
  247. package/test-files/expression-data-test-sheets/expression_sheet_missing_data_ok_export_exact.xlsx +0 -0
  248. package/test-files/expression-data-test-sheets/expression_sheet_missing_gene_name.xlsx +0 -0
  249. package/test-files/expression-data-test-sheets/expression_sheet_name_not_in_optparams.xlsx +0 -0
  250. package/test-files/expression-data-test-sheets/expression_sheet_name_not_present.xlsx +0 -0
  251. package/test-files/expression-data-test-sheets/expression_sheet_negative_time_points.xlsx +0 -0
  252. package/test-files/expression-data-test-sheets/expression_sheet_non_numerical_time_points.xlsx +0 -0
  253. package/test-files/expression-data-test-sheets/expression_sheet_not_existing.xlsx +0 -0
  254. package/test-files/expression-data-test-sheets/expression_sheet_wrong_id_label.xlsx +0 -0
  255. package/test-files/expression-data-test-sheets/expression_sheet_wrong_order_gene_names.xlsx +0 -0
  256. package/test-files/expression-data-test-sheets/expression_sheet_wrong_sheet_name_case.xlsx +0 -0
  257. package/test-files/expression-data-test-sheets/expression_sheet_wrong_sheet_name_convention.xlsx +0 -0
  258. package/test-files/gene-name-modifications/NaN-as-gene-name-input.xlsx +0 -0
  259. package/test-files/gene-name-modifications/NaN-as-gene-name-output.xlsx +0 -0
  260. package/test-files/gene-name-modifications/mismatched-case-related-input.xlsx +0 -0
  261. package/test-files/gene-name-modifications/mismatched-case-related-output.xlsx +0 -0
  262. package/test-files/gene-name-modifications/mismatched-case-unrelated-input.xlsx +0 -0
  263. package/test-files/gene-name-modifications/mismatched-case-unrelated-output.xlsx +0 -0
  264. package/test-files/gene-name-modifications/numbers-as-gene-name-related-input.xlsx +0 -0
  265. package/test-files/gene-name-modifications/numbers-as-gene-name-related-output.xlsx +0 -0
  266. package/test-files/gene-name-modifications/numbers-as-gene-name-unrelated-input.xlsx +0 -0
  267. package/test-files/gene-name-modifications/numbers-as-gene-name-unrelated-output.xlsx +0 -0
  268. package/test-files/graph-tests/different-sized-networks/{80-genes-0-edges.xlsx → 134-genes-0-edges.xlsx} +0 -0
  269. package/test-files/graph-tests/different-sized-networks/{45-genes-max-edges.xlsx → 44-source-genes-45-target-genes-max-edges.xlsx} +0 -0
  270. package/test-files/graph-tests/different-sized-networks/{1-gene-0-edges.xlsx → unused-files/1-gene-0-edges.xlsx} +0 -0
  271. package/test-files/graph-tests/different-sized-networks/{1-gene-1-edges.xlsx → unused-files/1-gene-1-edges.xlsx} +0 -0
  272. package/test-files/graph-tests/different-sized-networks/{10-genes-50-edges.xlsx → unused-files/10-genes-50-edges.xlsx} +0 -0
  273. package/test-files/graph-tests/different-sized-networks/{10-genes-90-edges.xlsx → unused-files/10-genes-90-edges.xlsx} +0 -0
  274. package/test-files/graph-tests/different-sized-networks/{100-genes-0-edges.xlsx → unused-files/100-genes-0-edges.xlsx} +0 -0
  275. package/test-files/graph-tests/different-sized-networks/{110-genes-0-edges.xlsx → unused-files/110-genes-0-edges.xlsx} +0 -0
  276. package/test-files/graph-tests/different-sized-networks/{120-genes-0-edges.xlsx → unused-files/120-genes-0-edges.xlsx} +0 -0
  277. package/test-files/graph-tests/different-sized-networks/{130-genes-0-edges.xlsx → unused-files/130-genes-0-edges.xlsx} +0 -0
  278. package/test-files/graph-tests/different-sized-networks/{140-genes-0-edges.xlsx → unused-files/140-genes-0-edges.xlsx} +0 -0
  279. package/test-files/graph-tests/different-sized-networks/{150-genes-10000-edges.xlsx → unused-files/150-genes-10000-edges.xlsx} +0 -0
  280. package/test-files/graph-tests/different-sized-networks/{150-genes-20000-edges.xlsx → unused-files/150-genes-20000-edges.xlsx} +0 -0
  281. package/test-files/graph-tests/different-sized-networks/{150-genes-max-edges.xlsx → unused-files/150-genes-max-edges.xlsx} +0 -0
  282. package/test-files/graph-tests/different-sized-networks/{160-genes-max-edges.xlsx → unused-files/160-genes-max-edges.xlsx} +0 -0
  283. package/test-files/graph-tests/different-sized-networks/{20-genes-max-edges.xlsx → unused-files/20-genes-max-edges.xlsx} +0 -0
  284. package/test-files/graph-tests/different-sized-networks/{25-genes-max-edges.xlsx → unused-files/25-genes-max-edges.xlsx} +0 -0
  285. package/test-files/graph-tests/different-sized-networks/{30-genes-max-edges.xlsx → unused-files/30-genes-max-edges.xlsx} +0 -0
  286. package/test-files/graph-tests/different-sized-networks/{34-genes-0-edges.xlsx → unused-files/34-genes-0-edges.xlsx} +0 -0
  287. package/test-files/graph-tests/different-sized-networks/{34-genes-40-edges.xlsx → unused-files/34-genes-40-edges.xlsx} +0 -0
  288. package/test-files/graph-tests/different-sized-networks/{34-genes-65-edges.xlsx → unused-files/34-genes-65-edges.xlsx} +0 -0
  289. package/test-files/graph-tests/different-sized-networks/{34-genes-90-edges.xlsx → unused-files/34-genes-90-edges.xlsx} +0 -0
  290. package/test-files/graph-tests/different-sized-networks/{5-genes-max-edges.xlsx → unused-files/5-genes-max-edges.xlsx} +0 -0
  291. package/test-files/graph-tests/different-sized-networks/{51-genes-max-edges.xlsx → unused-files/51-genes-max-edges.xlsx} +0 -0
  292. package/test-files/graph-tests/different-sized-networks/{52-genes-max-edges.xlsx → unused-files/52-genes-max-edges.xlsx} +0 -0
  293. package/test-files/graph-tests/different-sized-networks/{55-genes-0-edges.xlsx → unused-files/55-genes-0-edges.xlsx} +0 -0
  294. package/test-files/graph-tests/different-sized-networks/{55-genes-max-edges.xlsx → unused-files/55-genes-max-edges.xlsx} +0 -0
  295. package/test-files/graph-tests/different-sized-networks/{65-genes-0-edges.xlsx → unused-files/65-genes-0-edges.xlsx} +0 -0
  296. package/test-files/graph-tests/different-sized-networks/{7-genes-max-edges.xlsx → unused-files/7-genes-max-edges.xlsx} +0 -0
  297. package/test-files/graph-tests/different-sized-networks/{70-genes-0-edges.xlsx → unused-files/70-genes-0-edges.xlsx} +0 -0
  298. package/test-files/graph-tests/different-sized-networks/{9-genes-max-edges.xlsx → unused-files/9-genes-max-edges.xlsx} +0 -0
  299. package/test-files/graph-tests/different-sized-networks/{90-genes-0-edges.xlsx → unused-files/90-genes-0-edges.xlsx} +0 -0
  300. 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
  301. package/test-files/node-tests/long-gene-name-no-spaces-first.xlsx +0 -0
  302. package/test-files/node-tests/long-gene-name-no-spaces-second.xlsx +0 -0
  303. package/test-files/node-tests/long-gene-name-spaces.xlsx +0 -0
  304. package/test-files/species-test-data/15-genes_28-edges_db5_Dahlquist-data_input_no-species.xlsx +0 -0
  305. package/test-files/species-test-data/15-genes_28-edges_db5_Dahlquist-data_input_with-species.xlsx +0 -0
  306. package/test-files/species-test-data/3-gene_7-edge_elegans.xlsx +0 -0
  307. package/test-files/species-test-data/3-gene_7-edge_melanogaster.xlsx +0 -0
  308. package/test-files/species-test-data/3-gene_7-edge_musculus.xlsx +0 -0
  309. package/test-files/species-test-data/3-gene_7-edge_sapiens.xlsx +0 -0
  310. package/test-files/species-test-data/kev-fake-data-sapiens-no-exp-data.xlsx +0 -0
  311. package/test-files/spreadsheet-controller-test-files/sheet-name-capitalized-network-optimized-weights.xlsx +0 -0
  312. package/test-files/spreadsheet-controller-test-files/sheet-name-capitalized-network.xlsx +0 -0
  313. package/web-client/app.js +1 -1
  314. package/web-client/config/config.js +5 -5
  315. package/web-client/controllers/main.js +5 -1
  316. package/web-client/public/favicon.ico +0 -0
  317. package/web-client/public/gene/GRNSight.svg +689 -0
  318. package/web-client/public/gene/PageDesignREADME.md +1 -0
  319. package/web-client/public/gene/api.js +442 -0
  320. package/web-client/public/gene/info.css +181 -0
  321. package/web-client/public/gene/info.js +334 -0
  322. package/web-client/public/gene/integrationREADME.md +52 -0
  323. package/web-client/public/js/constants.js +182 -0
  324. package/web-client/public/js/getGeneInformationREADME.md +4 -0
  325. package/web-client/public/js/graph-statistics.js +7 -7
  326. package/web-client/public/js/graph.js +480 -476
  327. package/web-client/public/js/grnsight.js +10 -9
  328. package/web-client/public/js/grnsight.min.js +2335 -0
  329. package/web-client/public/js/grnstate.js +147 -0
  330. package/web-client/public/js/iframe-coordination.js +55 -0
  331. package/web-client/public/js/setup-handlers.js +617 -0
  332. package/web-client/public/js/setup-load-and-import-handlers.js +180 -0
  333. package/web-client/public/js/update-app.js +980 -0
  334. package/web-client/public/js/upload.js +352 -578
  335. package/web-client/public/js/warnings.js +60 -0
  336. package/web-client/public/lib/iframeSizer.contentWindow.min.js +10 -0
  337. package/{documents/SDF/CMSI_402/spring_2018/writtenStatusReport4 → web-client/public/lib/jaspar-front.html} +0 -0
  338. package/web-client/public/stylesheets/grnsight.styl +176 -26
  339. package/web-client/public/stylesheets/print.styl +10 -4
  340. package/web-client/views/{graph.jade → graph.pug} +1 -3
  341. package/web-client/views/info.pug +215 -0
  342. package/web-client/views/upload.pug +587 -0
  343. package/_gh_pages/Gemfile +0 -7
  344. package/_gh_pages/Gemfile.lock +0 -129
  345. package/documents/SDF/CMSI_402/spring_2014/Southwick_CMSI402_Spring2014_software-development-plan.md +0 -71
  346. package/documents/SDF/CMSI_402/spring_2014/Southwick_CMSI402_Spring2014_software-requirements-specification.md +0 -71
  347. package/documents/SDF/CMSI_402/spring_2014/use-case-diagram-spring-2014.jpg +0 -0
  348. package/documents/SDF/CMSI_402/spring_2017/Anguiano_402_Final_Presentation.pptx +0 -0
  349. package/documents/SDF/CMSI_402/spring_2017/Anguiano_402_Presentation_Final_Poster.pdf +0 -0
  350. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_project-proposal-presentation.pptx +0 -0
  351. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_project-proposal.docx +0 -0
  352. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_software-development-plan.docx +0 -0
  353. package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_software-requirements-specification.docx +0 -0
  354. package/documents/SDF/CMSI_402/spring_2017/Design Review Presentation.pptx +0 -0
  355. package/documents/SDF/CMSI_402/spring_2018/0402report.docx +0 -0
  356. package/documents/SDF/CMSI_402/spring_2018/0409report.docx +0 -0
  357. package/documents/SDF/CMSI_402/spring_2018/402-gantt.png +0 -0
  358. package/documents/SDF/CMSI_402/spring_2018/402SRS_GRNSightFeedback01.txt +0 -28
  359. package/documents/SDF/CMSI_402/spring_2018/402_SPD.md +0 -223
  360. package/documents/SDF/CMSI_402/spring_2018/ChoeShinCMSI402_Final.pptx +0 -0
  361. package/documents/SDF/CMSI_402/spring_2018/ProjectProposal.md +0 -22
  362. package/documents/SDF/CMSI_402/spring_2018/SoftwareRequirementsSpecification.md +0 -88
  363. package/documents/SDF/CMSI_402/spring_2018/homework/choe_eileen/Choe_Eileen_CMSI 402_HW1.pdf +0 -0
  364. package/documents/SDF/CMSI_402/spring_2018/homework/choe_eileen/Choe_Eileen_CMSI402_HW2.pdf +0 -0
  365. package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/402hw2.docx +0 -0
  366. package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/Jen - 402Hw1.docx +0 -0
  367. package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/Jen - hw3.docx +0 -0
  368. package/documents/SDF/CMSI_402/spring_2018/writtenStatusReport.docx +0 -0
  369. package/documents/Varshneya_Samdarshi_LMU_Symposium_2016.pptx +0 -0
  370. package/documents/abstracts/Anguiano_Varshneya_Undergraduate-Research-Symposium_2017_abstract.pdf +0 -0
  371. package/documents/abstracts/SIGGRAPH 2017 Abstract/ACM-Reference-Format.bst +0 -3478
  372. package/documents/abstracts/SIGGRAPH 2017 Abstract/Figure1_zoom100.png +0 -0
  373. package/documents/abstracts/SIGGRAPH 2017 Abstract/acmart.cls +0 -2352
  374. package/documents/abstracts/SIGGRAPH 2017 Abstract/acmart.ins +0 -29
  375. package/documents/abstracts/SIGGRAPH 2017 Abstract/always-weights.png +0 -0
  376. package/documents/abstracts/SIGGRAPH 2017 Abstract/auto.png +0 -0
  377. package/documents/abstracts/SIGGRAPH 2017 Abstract/networkA.png +0 -0
  378. package/documents/abstracts/SIGGRAPH 2017 Abstract/networkB-normalized.png +0 -0
  379. package/documents/abstracts/SIGGRAPH 2017 Abstract/networkB.png +0 -0
  380. package/documents/abstracts/SIGGRAPH 2017 Abstract/never-weights.png +0 -0
  381. package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/screenshot.jpg +0 -0
  382. package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/screenshot3x2.png +0 -0
  383. package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/withweights3x2.png +0 -0
  384. package/documents/abstracts/SIGGRAPH 2017 Abstract/screenshot-auto.png +0 -0
  385. package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.bib +0 -85
  386. package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.pdf +0 -0
  387. package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.tex +0 -235
  388. package/documents/abstracts/SWE Collegiate Competition 2017.md +0 -9
  389. package/documents/abstracts/Varshneya_Samdarshi_Southern-California-Systems-Biology_2017_abstract.docx +0 -0
  390. package/documents/developer_documents/State Diagram.graphml +0 -3525
  391. package/documents/developer_documents/graphml/State Diagram.graphml +0 -3115
  392. package/documents/developer_documents/older_versions/GRNsight State Diagram old.png +0 -0
  393. package/documents/developer_documents/older_versions/GRNsight State Diagram.png +0 -0
  394. package/documents/developer_documents/testing_script_generator/GRNsightTestingDocument.md +0 -998
  395. package/documents/developer_documents/testing_script_generator/featureList.json +0 -486
  396. package/documents/developer_documents/testing_script_generator/testing-script-generator.js +0 -149
  397. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_conference-presentations_2016.docx +0 -0
  398. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016.docx +0 -0
  399. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_Table1.docx +0 -0
  400. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_references.rtf +0 -264
  401. package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_text-only.docx +0 -0
  402. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/21-genes_31-edges_Schade-data_for-screenshots.xlsx +0 -0
  403. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.jpg +0 -0
  404. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.png +0 -0
  405. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.psd +0 -0
  406. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.jpg +0 -0
  407. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.png +0 -0
  408. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.psd +0 -0
  409. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145_900pix-wide.psd +0 -0
  410. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.jpg +0 -0
  411. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.png +0 -0
  412. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.psd +0 -0
  413. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.jpg +0 -0
  414. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.png +0 -0
  415. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.psd +0 -0
  416. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145_900pix-wide.psd +0 -0
  417. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5A.pdf +0 -0
  418. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5B.pdf +0 -0
  419. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5C.eps +0 -0
  420. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5D.pdf +0 -0
  421. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5E.pdf +0 -0
  422. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5F.eps +0 -0
  423. package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5_compiled.png +0 -0
  424. package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure3_GRNsight-Architecture.pdf +0 -0
  425. package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure4_GRNsight-Screenshot.pdf +0 -0
  426. package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure5_compiled.pdf +12 -5383
  427. package/documents/manuscripts/peerj-computerscience-2016/peerj-reviewing-10823-v0.pdf +0 -0
  428. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_conference-presentations_2016_revised.docx +0 -0
  429. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter-and-response_2016.pdf +0 -0
  430. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter_2016.docx +0 -0
  431. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter_2016.pdf +0 -0
  432. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_Table1.docx +0 -0
  433. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_references_revised.rtf +0 -385
  434. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised.docx +0 -0
  435. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised_marked.docx +0 -0
  436. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_response-to-reviewers_2016.docx +0 -0
  437. package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_response-to-reviewers_2016.pdf +0 -0
  438. package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure3_GRNsight-Architecture.pdf +0 -0
  439. package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure4_GRNsight-Screenshot-auto.pdf +0 -0
  440. package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure4_GRNsight-Screenshot.pdf +0 -0
  441. package/documents/manuscripts/peerj-computerscience-2016/revisions/peerj-reviewing-10823-v1.pdf +0 -0
  442. package/documents/posters/Anguiano_402_Presentation_Draft_Poster.pdf +0 -0
  443. package/documents/posters/Anguiano_402_Presentation_Draft_Poster.pptx +0 -0
  444. package/documents/posters/Anguiano_Varshneya_LMU-Symposium_2015_poster.pptx +0 -0
  445. package/documents/posters/Anguiano_Varshneya_SCCUR-Poster_20141122_poster.pptx +0 -0
  446. package/documents/posters/ChoeShinCMSI402-2.pptx +0 -0
  447. package/documents/posters/ChoeShinCMSI402.pptx +0 -0
  448. package/documents/posters/ChoeShinCMSI402Final.pptx +0 -0
  449. package/documents/posters/Dahlquist-et-al_BOSC_ISMB_2016_poster.pptx +0 -0
  450. package/documents/posters/Samdarshi et al. LMU Symposium 2017-finalDraft.pptx +0 -0
  451. package/documents/posters/Samdarshi et al. LMU Symposium 2018-firstDraft.pptx +0 -0
  452. package/documents/posters/Shin et al. SCCUR 2017 FinalDraft.pptx +0 -0
  453. package/documents/posters/Southwick_CMSI402_2014_poster.pptx +0 -0
  454. package/documents/posters/Varshneya_Samdarshi_LMU-Symposium_2016_poster.pptx +0 -0
  455. package/documents/posters/Varshneya_Samdarshi_Southern-California-Systems-Biology-Conference_2017_poster.pptx +0 -0
  456. package/documents/posters/~$Samdarshi et al. LMU Symposium 2018-firstDraft.pptx +0 -0
  457. package/documents/presentations/Anguiano_402_Final_Presentation.pptx +0 -0
  458. package/documents/presentations/Choe_SCCUR2017.pptx +0 -0
  459. package/documents/presentations/Choe_SWERapidFire2017_final.pptx +0 -0
  460. package/documents/presentations/Dahlquist_BOSC_20160709.pptx +0 -0
  461. package/documents/presentations/Dahlquist_ExperimentalBiology_20160404_talk.pptx +0 -0
  462. package/documents/presentations/Dahlquist_SoCalSysBio_20150131_talk.pptx +0 -0
  463. package/documents/presentations/Samdarshi et al. LMU Symposium 2017-draft.pptx +0 -0
  464. package/documents/presentations/Southwick_Anguiano_LMU-Symposium_20140329_talk.pptx +0 -0
  465. package/documents/presentations/Southwick_CMSI402_Presentation_20140508_talk.pptx +0 -0
  466. package/documents/presentations/Varshneya-Anguiano-LMU Symposium-201703.pptx +0 -0
  467. package/documents/presentations/~$Choe_SWERapidFire2017_final.pptx +0 -0
  468. package/documents/reports/Varshneya-201701-AnnotatedBibliography.docx +0 -0
  469. package/documents/reports/Varshneya-201702-Introduction.docx +0 -0
  470. package/documents/reports/Varshneya-201702-Outline.docx +0 -0
  471. package/documents/reports/Varshneya-201703-Discussion.docx +0 -0
  472. package/documents/reports/Varshneya-201703-MMResults.docx +0 -0
  473. package/documents/reports/Varshneya-201704-Draft-1.docx +0 -0
  474. package/documents/reports/Varshneya-201704-Final.docx +0 -0
  475. package/test/graph-library-tests.js +0 -165
  476. package/test-files/demo-files/21-genes_50-edges_Dahlquist-data_estimation_output.xlsx +0 -0
  477. package/test-files/demo-files/21-genes_50-edges_Dahlquist-data_input.xlsx +0 -0
  478. package/test-files/graph-tests/different-sized-networks/10-genes-max-edges.xlsx +0 -0
  479. package/test-files/graph-tests/different-sized-networks/12-genes-max-edges.xlsx +0 -0
  480. package/test-files/graph-tests/different-sized-networks/35-genes-max-edges.xlsx +0 -0
  481. package/test-files/graph-tests/different-sized-networks/40-genes-0-edges.xlsx +0 -0
  482. package/test-files/graph-tests/different-sized-networks/40-genes-max-edges.xlsx +0 -0
  483. package/test-files/graph-tests/different-sized-networks/42-genes-max-edges.xlsx +0 -0
  484. package/test-files/graph-tests/different-sized-networks/50-genes-max-edges.xlsx +0 -0
  485. package/test-files/graph-tests/different-sized-networks/75-genes-150-edges.xlsx +0 -0
  486. package/web-client/public/js/container.js +0 -121
  487. package/web-client/public/js/node-coloring.js +0 -306
  488. package/web-client/public/js/sliders.js +0 -197
  489. package/web-client/views/upload.jade +0 -458
@@ -1,431 +1,279 @@
1
1
  var multiparty = require("multiparty");
2
2
  var xlsx = require("node-xlsx");
3
- // var util = require("util");
4
3
  var path = require("path");
5
4
  var parseAdditionalSheets = require(__dirname + "/additional-sheet-parser");
5
+ var parseExpressionSheets = require(__dirname + "/expression-sheet-parser");
6
+ var parseNetworkSheet = require(__dirname + "/network-sheet-parser");
7
+ var demoWorkbooks = require(__dirname + "/demo-workbooks");
8
+ var constants = require(__dirname + "/workbook-constants");
6
9
  // var cytoscape = require("cytoscape"); //NOTE: Commented out for issue #474
7
10
 
8
11
  var helpers = require(__dirname + "/helpers");
9
12
 
10
- var semanticChecker = require(__dirname + "/semantic-checker");
11
-
12
- // Currently only going to number 76 because currently the network errors out at 75+ genes.
13
- var numbersToLetters = {0:"A", 1:"B", 2:"C", 3:"D", 4:"E", 5:"F", 6:"G", 7:"H", 8: "I", 9:"J", 10:"K", 11:"L",
14
- 12:"M", 13:"N", 14:"O", 15:"P", 16:"Q", 17:"R", 18:"S", 19:"T", 20:"U", 21:"V", 22:"W", 23:"X", 24:"Y",
15
- 25:"Z", 26:"AA", 27:"AB", 28:"AC", 29:"AD", 30:"AE", 31:"AF", 32:"AG", 33:"AH", 34:"AI", 35:"AJ", 36:"AK",
16
- 37:"AL", 38:"AM", 39:"AN", 40:"AO", 41:"AP", 42:"AQ", 43:"AR", 44:"AS", 45:"AT", 46:"AU", 47:"AV", 48:"AW",
17
- 49:"AX", 51:"AY", 52:"AZ", 53:"BA", 54:"BB", 55:"BC", 56:"BD", 57:"BE", 58:"BF", 59:"BG", 60:"BH", 61:"BI",
18
- 62:"BJ", 63:"BK", 64:"BL", 65:"BM", 66:"BN", 67:"BO", 68:"BP", 69:"BQ", 70:"BR", 71:"BS", 72:"BT", 73:"BU",
19
- 74:"BV", 75:"BW", 76:"BX"};
20
-
21
- // TODO: Put this and the warnings list into helpers.
22
- // This is the massive list of errors. Yay!
23
- // The graph will not load if an error is detected.
24
- var errorList = {
25
- missingNetworkError: {
26
- errorCode: "MISSING_NETWORK",
27
- possibleCause: "This file does not have a 'network' sheet or a 'network_optimized_weights' sheet.",
28
- suggestedFix: "Please select another file, or rename the sheet containing the adjacency matrix accordingly. \
29
- Please refer to the " + "<a href='http://dondi.github.io/GRNsight/documentation.html#section1' \
30
- target='_blank'>Documentation page</a> for more information."
31
- },
32
-
33
- corruptGeneError: function (row, column) {
34
- var colLetter = numbersToLetters[column];
35
- var rowNum = row + 1;
36
- return {
37
- errorCode: "CORRUPT_GENE",
38
- possibleCause: "The gene name in cell " + colLetter + rowNum + " appears to be invalid.",
39
- suggestedFix: "Please fix the error and try uploading again."
40
- };
41
- },
42
-
43
- missingValueError: function (row, column) {
44
- var colLetter = numbersToLetters[column];
45
- var rowNum = row + 1;
46
- return {
47
- errorCode: "MISSING_VALUE",
48
- possibleCause: "The value in the cell " + colLetter + rowNum +
49
- " in the adjacency matrix appears to have a missing value.",
50
- suggestedFix: "Please ensure that all cells have a value, then upload the file again."
51
- };
52
- },
53
-
54
- duplicateGeneError: function (geneType, geneName) {
55
- return {
56
- errorCode: "DUPLICATE_GENE",
57
- possibleCause: "There exists a duplicate for " + geneType + " gene " + geneName + ".",
58
- suggestedFix: "Please remove the duplicate gene and submit again."
59
- };
60
- },
61
-
62
- dataTypeError: function (row, column) {
63
- var colLetter = numbersToLetters[column];
64
- var rowNum = row + 1;
65
- return {
66
- errorCode: "INVALID_CELL_DATA_TYPE",
67
- possibleCause: "The value in cell " + colLetter + rowNum + " is not a number.",
68
- suggestedFix: "Please ensure all values in the data matrix are numbers and try again."
69
- };
70
- },
71
-
72
- emptyRowError: function (row) {
73
- var rowNum = row + 1;
74
- return {
75
- errorCode: "EMPTY_ROW",
76
- possibleCause: "Row " + rowNum + " does not contain any data.",
77
- suggestedFix: "Please ensure all rows contain data and all empty rows are removed. " +
78
- "Also, please ensure that no extraneous data is outside of the matrix, " +
79
- "as this may cause this error."
80
- };
81
- },
82
-
83
- outsideCellError: function (row, column) {
84
- var colLetter = numbersToLetters[column];
85
- var rowNum = row + 1;
86
- return {
87
- errorCode: "EMPTY_CELL",
88
- possibleCause: "The cell at " + colLetter + rowNum + " contains data that is outside the matrix.",
89
- suggestedFix: "Please remove all extraneous data from outside the matrix and ensure" +
90
- " the matrix is "
91
- };
92
- },
93
-
94
- errorsCountError: {
95
- errorCode: "ERRORS_OVERLOAD",
96
- possibleCause: "This network has over 20 errors.",
97
- suggestedFix: "Please check the format of your spreadsheet with the guidlines outlined on the" +
98
- "Documentation page and try again. If you fix these errors and try to upload again, there may be " +
99
- "further errors detected. As a general approach for fixing the errors, consider copying and " +
100
- "pasting just your adjacency matrix into a fresh Excel Workbook and saving it."
101
- },
102
-
103
- warningsCountError: {
104
- errorCode: "WARNINGS_OVERLOAD",
105
- possibleCause: "This network has over 75 warnings.",
106
- suggestedFix: "Please check the format of your spreadsheet with the guidlines outlined on the" +
107
- " Documentation page and try again. If you fix these errors and try to upload again, there may be " +
108
- " further errors detected. As a general approach for fixing the errors, consider copying and " +
109
- " pasting just your adjacency matrix into a fresh Excel Workbook and saving it."
110
- },
111
-
112
- unknownError: {
113
- errorCode: "UNKNOWN_ERROR",
114
- possibleCause: "An unexpected error occurred.",
115
- suggestedFix: "Please contact the GRNsight team at kdahlquist@lmu.edu, \
116
- and attach the spreadsheet you attempted to upload."
117
- }
13
+ var EXPRESSION_SHEET_SUFFIXES = ["_expression", "_optimized_expression", "_sigmas"];
118
14
 
119
- };
15
+ var SPECIES = [
16
+ "Arabidopsis thaliana",
17
+ "Caenorhabditis elegans",
18
+ "Drosophila melanogaster",
19
+ "Homo sapiens",
20
+ "Mus musculus",
21
+ "Saccharomyces cerevisiae",
22
+ ];
23
+
24
+ var TAXON_ID = ["3702", "6293", "7227", "9606", "10090", "4932", "559292"];
120
25
 
26
+ var isExpressionSheet = function (sheetName) {
27
+ return EXPRESSION_SHEET_SUFFIXES.some(function (suffix) {
28
+ return sheetName.includes(suffix);
29
+ });
30
+ };
121
31
 
122
- // This is the list of warnings.
123
- // The graph will still load if warnings are detected, but these will be reported to the user.
124
- var warningsList = {
125
- missingSourceGeneWarning: function (row, column) {
126
- var colLetter = numbersToLetters[column];
127
- var rowNum = row + 1;
128
- return {
129
- warningCode: "MISSING_SOURCE",
130
- errorDescription: "A source gene name is missing in cell " + colLetter + rowNum + "."
131
- };
132
- },
133
-
134
- missingTargetGeneWarning: function (row, column) {
135
- var colLetter = numbersToLetters[column];
136
- var rowNum = row + 1;
137
- return {
138
- warningCode: "MISSING_TARGET",
139
- errorDescription: "A target gene name is missing in cell " + colLetter + rowNum + "."
140
- };
141
- },
142
-
143
- invalidMatrixDataWarning: function (row, column) {
144
- var colLetter = numbersToLetters[column];
145
- var rowNum = row + 1;
146
- return {
147
- warningCode: "INVALID_DATA",
148
- errorDescription: "The value in cell " + colLetter + rowNum + ", is undefined."
149
- };
150
- },
151
-
152
- randomDataWarning: function (type, row, column) {
153
- var colLetter = numbersToLetters[column];
154
- var rowNum = row + 1;
155
- return {
156
- warningCode: "RANDOM_DATA",
157
- errorDescription: "The value in cell " + colLetter + rowNum +
158
- ", has a corresponding source and/or target gene that is detected as " + type + "."
159
- };
160
- },
161
-
162
- emptyRowWarning: function (row) {
163
- var rowNum = row + 1;
164
- return {
165
- warningCode: "EMPTY_ROW",
166
- errorDescription: "Row " + rowNum + " was found to contain no data."
167
- };
168
- },
169
-
170
- networkSizeWarning: function (genesLength, edgesLength) {
171
- return {
172
- warningCode: "INVALID_NETWORK_SIZE",
173
- errorDescription: "Your network has " + genesLength + " genes, and " + edgesLength +
174
- " edges. Please note that networks are recommended to have less than 50 genes and 100 edges."
175
- };
176
- },
177
-
178
- incorrectlyNamedSheetWarning: function () {
179
- return {
180
- warningCode: "INCORRECTLY_NAMED_SHEET",
181
- errorDescription: "The uploaded file appears to contain a weighted network, but contains no \
182
- 'network_optimized_weights' sheet. A weighted network must be contained in a sheet called \
183
- 'network_optimized_weights' in order to be drawn as a weighted graph. \
184
- Please check if the sheet(s) in the uploaded spreadsheet have been named properly."
185
- };
32
+ var doesSpeciesExist = function (speciesInfo) {
33
+ for (var s in SPECIES) {
34
+ if (SPECIES[s] === speciesInfo) {
35
+ return true;
36
+ }
37
+ }
38
+ for (var t in TAXON_ID) {
39
+ if (TAXON_ID[t] === speciesInfo) {
40
+ return true;
41
+ }
186
42
  }
43
+ return false;
187
44
  };
188
45
 
189
46
  var addMessageToArray = function (messageArray, message) {
190
47
  messageArray.push(message);
191
48
  };
192
49
 
193
- var addWarning = function (network, message) {
194
- var warningsCount = network.warnings.length;
50
+ var addWarning = function (workbook, message) {
51
+ var warningsCount = workbook.warnings.length;
195
52
  var MAX_WARNINGS = 75;
196
53
  if (warningsCount < MAX_WARNINGS) {
197
- addMessageToArray(network.warnings, message);
54
+ addMessageToArray(workbook.warnings, message);
198
55
  } else {
199
- addMessageToArray(network.errors, errorList.warningsCountError);
56
+ addMessageToArray(workbook.errors, constants.errors.warningsCountError);
200
57
  return false;
201
58
  }
202
59
  };
203
60
 
204
- var addError = function (network, message) {
205
- var errorsCount = network.errors.length;
61
+ var addError = function (workbook, message) {
62
+ var errorsCount = workbook.errors.length;
206
63
  var MAX_ERRORS = 20;
207
64
  if (errorsCount < MAX_ERRORS) {
208
- addMessageToArray(network.errors, message);
65
+ addMessageToArray(workbook.errors, message);
209
66
  } else {
210
- addMessageToArray(network.errors, errorList.errorsCountError);
67
+ addMessageToArray(workbook.errors, constants.errors.errorsCountError);
211
68
  return false;
212
69
  }
213
70
  };
214
71
 
215
- var checkDuplicates = function (errorArray, sourceGenes, targetGenes) {
216
- // Run through the source genes and check if the gene in slot i is the same as the one next to it
217
- for (var i = 0; i < sourceGenes.length - 1; i++) {
218
- if (sourceGenes[i] === sourceGenes[i + 1]) {
219
- errorArray.push(errorList.duplicateGeneError("source", sourceGenes[i]));
72
+ var difference = function (setA, setB) {
73
+ let _difference = new Set(setA);
74
+ for (let elemB of setB) {
75
+ if (_difference.has(elemB)) {
76
+ _difference.delete(elemB);
220
77
  }
221
78
  }
222
- // Run through the target genes and check if the gene in slot j is the same as the one next to it
223
- for (var j = 0; j < targetGenes.length - 1; j++) {
224
- if (targetGenes[j] === targetGenes[j + 1]) {
225
- errorArray.push(errorList.duplicateGeneError("target", targetGenes[j]));
79
+ return _difference;
80
+ };
81
+
82
+ var deepClone = function (object, isArray) {
83
+ var clone = isArray ? [] : {};
84
+ if (isArray) {
85
+ for (let i of object) {
86
+ if (i !== null && typeof i === "object") {
87
+ clone.push(deepClone(i, Array.isArray(i)));
88
+ } else {
89
+ clone.push(i);
90
+ }
91
+ }
92
+ } else {
93
+ for (let i in object) {
94
+ if (object[i] !== null && typeof (object[i]) === "object") {
95
+ clone[i] = deepClone(object[i], Array.isArray(object[i]));
96
+ } else {
97
+ clone[i] = object[i];
98
+ }
226
99
  }
227
100
  }
101
+ return clone;
228
102
  };
229
103
 
230
- var parseSheet = function (sheet) {
231
- var currentSheet;
232
- var network = {
233
- genes: [],
234
- links: [],
235
- errors: [],
236
- warnings: [],
237
- positiveWeights: [],
238
- negativeWeights: [],
239
- sheetType: "unweighted",
240
- };
241
- var currentLink;
242
- var currentGene;
243
- var sourceGene;
244
- var targetGene;
245
- var sourceGeneNumber;
246
- var targetGeneNumber;
247
- var genesList = []; // This will contain all of the genes in upper case for use in error checking
248
- var sourceGenes = [];
249
- var targetGenes = [];
250
-
251
- // Look for the worksheet containing the network data
252
- for (var i = 0; i < sheet.length; i++) {
253
- if (sheet[i].name === "network") {
254
- // Here we have found a sheet containing simple data. We keep looking
255
- // in case there is also a sheet with optimized weights
256
- currentSheet = sheet[i];
257
- } else if (sheet[i].name === "network_optimized_weights") {
258
- // We found a sheet with optimized weights, which is the ideal data source.
259
- // So we stop looking.
260
- currentSheet = sheet[i];
261
- network.sheetType = "weighted";
262
- break;
104
+ var crossSheetInteractions = function (workbookFile) {
105
+ var workbook = {};
106
+
107
+ // Refactored the parseNetworkSheet function to preserve all network type sheets including "network",
108
+ // "network_optimized_weights",and "network_weights" restructuring workbook object as a result
109
+ var networks = parseNetworkSheet(workbookFile);
110
+
111
+ // Parse expression and 2-column data, then add to workbook object
112
+ // Eventually, will split this up into parsing for each type of sheet.
113
+ var additionalData = parseAdditionalSheets(workbookFile);
114
+
115
+ var expressionData = parseExpressionSheets(workbookFile);
116
+
117
+ if (networks &&
118
+ networks.networkOptimizedWeights &&
119
+ typeof networks.networkOptimizedWeights === "object" &&
120
+ Object.keys(networks.networkOptimizedWeights).length > 0) {
121
+ // Base workbook is a clone of the prefered Optimized weights sheet
122
+ workbook = deepClone(networks.networkOptimizedWeights, false);
123
+ // Add errors from network sheet if it exists
124
+ if (networks.network && typeof networks.network === "object" && Object.keys(networks.network).length > 0) {
125
+ if (networks.network.errors !== undefined) {
126
+ networks.network.errors.forEach(data => workbook.errors.push(data));
127
+ }
128
+
129
+ if (networks.network.warnings !== undefined) {
130
+ networks.network.warnings.forEach(data => workbook.warnings.push(data));
131
+ }
263
132
  }
133
+ } else {
134
+ // Set base workbook to a deep copy of the default network if network optimized weights does not exist
135
+ workbook = deepClone(networks.network, false);
264
136
  }
137
+ // Add errors and warnings from network weights to preserve the sheet
138
+ if (networks.networkWeights &&
139
+ typeof networks.networkWeights === "object" &&
140
+ Object.keys(networks.networkWeights).length > 0) {
141
+ if (networks.networkWeights.errors !== undefined) {
142
+ networks.networkWeights.errors.forEach(data => workbook.errors.push(data));
143
+ }
265
144
 
266
- // If it didn't find a network/network_optimized_weights sheet
267
- // TODO For expediency, we are wrapping every `return network` statement in `semanticChecker`.
268
- // Some refactoring may be desirable to prevent excessive repetition.
269
- if (currentSheet === undefined) {
270
- addError(network, errorList.missingNetworkError);
271
- return network;
145
+ if (networks.networkWeights.warnings !== undefined) {
146
+ networks.networkWeights.warnings.forEach(data => workbook.warnings.push(data));
147
+ }
272
148
  }
273
149
 
274
- for (var row = 0, column = 1; row < currentSheet.data.length; row++) {
275
- if (currentSheet.data[row].length === 0) { // if the current row is empty
276
- if (addError(network, errorList.emptyRowError(row)) === false) {
277
- return network;
278
- }
279
- } else { // if the row has data...
280
- // Genes found when row = 0 are targets. Genes found when column = 0 are source genes.
281
- // We set column = 1 in the for loop so it skips row 0 column 0, since that contains no matrix data.
282
- // Yes, the rows and columns use array numbering. That is, they start at 0, not 1.
283
- try { // This prevents the server from crashing if something goes wrong anywhere in here
284
- while (column < currentSheet.data[row].length) {
285
- // While we haven't gone through all of the columns in this row...
286
- if (row === 0) { // If we are at the top of a new column...
287
- // These genes are the source genes
288
- try {
289
- currentGene = {name: currentSheet.data[0][column]};
290
- // Set genes to upper case so case doesn't matter in error checking;
291
- // ie: Cin5 is the same as cin5
292
- if (currentGene.name === undefined) {
293
- addWarning(network, warningsList.missingSourceGeneWarning(row, column));
294
- } else if (isNaN(currentGene.name) && typeof currentGene.name !== "string") {
295
- addWarning(network, warningsList.missingSourceGeneWarning(row, column));
296
- } else {
297
- sourceGenes.push(String(currentGene.name.toUpperCase()));
298
- genesList.push(String(currentGene.name.toUpperCase()));
299
- currentGene.name = currentGene.name;
300
- network.genes.push(currentGene);
301
- }
302
- } catch (err) {
303
- addError(network, errorList.corruptGeneError(row, column));
304
- return network;
305
- }
306
- } else if (column === 0) { // If we are at the far left of a new row...
307
- // These genes are the target genes
308
- try {
309
- currentGene = {name: currentSheet.data[row][0]};
310
- if (currentGene.name === undefined) {
311
- addWarning(network, warningsList.missingTargetGeneWarning(row, column));
312
- } else if (isNaN(currentGene.name) && typeof currentGene.name !== "string") {
313
- addWarning(network, warningsList.missingTargetGeneWarning(row, column));
314
- } else {
315
- targetGenes.push(String(currentGene.name.toUpperCase()));
316
- // Here we check to see if we've already seen the gene name that we're about to store
317
- // Genes may or may not be present due to asymmetry or unorderedness
318
- // If it's in the genesList, it will return a number > 0, so we won't store it
319
- // If it's not there, it will return -1, so we add it.
320
- if (genesList.indexOf(String(currentGene.name.toUpperCase())) === -1) {
321
- genesList.push(String(currentGene.name.toUpperCase()));
322
- currentGene.name = currentGene.name;
323
- network.genes.push(currentGene);
324
- }
325
- }
326
- } catch (err) {
327
- sourceGene = currentSheet.data[0][column];
328
- targetGene = currentSheet.data[row][0];
329
- addError(network, errorList.corruptGeneError(row, column));
330
- return network;
331
- }
332
- } else { // If we're within the matrix and lookin' at the data...
333
- try {
334
- if (currentSheet.data[row][column] === undefined) {
335
- // SHOULD BE: addError(network, errorList.missingValueError(row, column));
336
- addWarning(network, warningsList.invalidMatrixDataWarning(row, column));
337
- } else if (isNaN(+("" + currentSheet.data[row][column])) ||
338
- typeof currentSheet.data[row][column] !== "number") {
339
- addError(network, errorList.dataTypeError(row, column));
340
- return network;
341
- } else {
342
- if (currentSheet.data[row][column] !== 0) { // We only care about non-zero values
343
- // Grab the source and target genes' names
344
- sourceGene = currentSheet.data[0][column];
345
- targetGene = currentSheet.data[row][0];
346
- if (sourceGene === undefined || targetGene === undefined) {
347
- addWarning(network, warningsList.randomDataWarning("undefined", row, column));
348
- } else if ((isNaN(sourceGene) && typeof sourceGene !== "string") ||
349
- (isNaN(targetGene) && typeof targetGene !== "string")) {
350
- addWarning(network, warningsList.randomDataWarning("NaN", row, column));
351
- } else {
352
- // Grab the source and target genes' numbers
353
- sourceGeneNumber = genesList.indexOf(sourceGene.toUpperCase());
354
- targetGeneNumber = genesList.indexOf(targetGene.toUpperCase());
355
- currentLink = {source: sourceGeneNumber, target: targetGeneNumber,
356
- value: currentSheet.data[row][column]};
357
- // Here we set the properties of the current link
358
- // before we push them to the network
359
- if (network.sheetType === "weighted") {
360
- if (currentLink.value > 0) {
361
- // If it's a positive number, mark it as an activator
362
- currentLink.type = "arrowhead";
363
- // GRNsight v1 magenta edge color
364
- // currentLink.stroke = "MediumVioletRed";
365
- // Node coloring-consistent red edge color
366
- currentLink.stroke = "rgb(195, 61, 61)";
367
- network.positiveWeights.push(currentLink.value);
368
- } else { // if it's a negative number, mark it as a repressor
369
- currentLink.type = "repressor";
370
- // currentLink.stroke = "DarkTurquoise"; // GRNsight v1 cyan edge color
371
- // Node coloring-consistent blue edge color
372
- currentLink.stroke = "rgb(51, 124, 183)";
373
- network.negativeWeights.push(currentLink.value);
374
- }
375
- } else if (network.sheetType === "unweighted") {
376
- currentLink.type = "arrowhead";
377
- currentLink.stroke = "black";
378
- if (currentLink.value !== 1) {
379
- addWarning(network, warningsList.incorrectlyNamedSheetWarning());
380
- currentLink.value = 1;
381
- }
382
- network.positiveWeights.push(currentLink.value);
383
- }
384
- network.links.push(currentLink);
385
- }
386
- }
387
- }
388
-
389
- } catch (err) {
390
- addError(network, errorList.missingValueError(row, column));
391
- // SHOULD BE: addError(network, errorList.unknownFileError);
392
- return network;
393
- }
394
- }
395
- column++; // Let's move on to the next column!
396
- } // Once we finish with the current row...
397
- column = 0; // let's go back to column 0 on the next row!
398
- } catch (err) {
399
- // We only get here if something goes drastically wrong. We don't want to get here.
400
- addError(network, errorList.unknownError);
401
- return network;
402
- }
150
+ // Add errors and warnings from meta sheets
151
+ if (additionalData && additionalData.meta) {
152
+ if (additionalData.meta.errors !== undefined) {
153
+ additionalData.meta.errors.forEach(data => workbook.errors.push(data));
154
+ }
155
+
156
+ if (additionalData.meta.warnings !== undefined) {
157
+ additionalData.meta.warnings.forEach(data => workbook.warnings.push(data));
403
158
  }
404
159
  }
405
160
 
406
- // Move on to semanticChecker.
161
+ if (additionalData && additionalData.test) {
162
+ // Add errors and warnings from test sheets
163
+ for (let sheet in additionalData.test) {
164
+ additionalData.test[sheet].errors.forEach(data => workbook.errors.push(data));
165
+ }
407
166
 
167
+ for (let sheet in additionalData.test) {
168
+ additionalData.test[sheet].warnings.forEach(data => workbook.warnings.push(data));
169
+ }
170
+ }
408
171
 
409
- // We sort them here because gene order is not relevant before this point
410
- // Sorting them now means duplicates will be right next to each other
411
- sourceGenes.sort();
412
- targetGenes.sort();
172
+ if (additionalData && additionalData.meta2) {
173
+ // Add errors and warnings from test sheets
174
+ if (additionalData.meta2.errors !== undefined) {
175
+ additionalData.meta2.errors.forEach(data => workbook.errors.push(data));
176
+ }
413
177
 
414
- // syntactic duplicate checker for both columns and rows
415
- checkDuplicates(network.errors, sourceGenes, targetGenes);
178
+ if (additionalData.meta2.warnings !== undefined) {
179
+ additionalData.meta2.warnings.forEach(data => workbook.warnings.push(data));
180
+ }
181
+ }
416
182
 
417
- // NOTE: Temporarily commented out pending resolution of #474, and other related issues
418
- // try {
419
- // network.graphStatisticsReport = graphStatisticsReport(network);
420
- // } catch (err) {
421
- // console.log ("Graph statistics report failed to be complete.");
422
- // }
423
- return semanticChecker(network);
183
+ if (additionalData.meta.data.species === undefined && additionalData.meta.data.taxon_id === undefined) {
184
+ addWarning(workbook, constants.warnings.noSpeciesInformationDetected);
185
+ additionalData.meta.data.species = "Saccharomyces cerevisiae";
186
+ additionalData.meta.data["taxon_id"] = "559292";
187
+ } else if (
188
+ !doesSpeciesExist(additionalData.meta.data.species) &&
189
+ !doesSpeciesExist(additionalData.meta.data.taxon_id)
190
+ ) {
191
+ addWarning(
192
+ workbook,
193
+ constants.warnings.unknownSpeciesDetected(
194
+ additionalData.meta.data.species,
195
+ additionalData.meta.data.taxon_id
196
+ )
197
+ );
198
+ additionalData.meta.data.species = "Saccharomyces cerevisiae";
199
+ additionalData.meta.data["taxon_id"] = 559292;
200
+ }
201
+
202
+ // Add errors and warnings from expression sheets
203
+ // FUTURE IMPROVEMENT: not all expression sheets are specifically named 'wt_log2_expression.'
204
+ // We need to account for all the different possible expression sheet names.
205
+ if (expressionData) {
206
+ if (expressionData.errors !== undefined) {
207
+ expressionData.errors.forEach(data => workbook.errors.push(data));
208
+ }
209
+ if (expressionData.warnings !== undefined) {
210
+ expressionData.warnings.forEach(data => workbook.warnings.push(data));
211
+ }
212
+ }
213
+
214
+ if (expressionData && expressionData.expression) {
215
+ if (expressionData.expression.errors !== undefined) {
216
+ expressionData.expression.errors.forEach(data => workbook.errors.push(data));
217
+ }
218
+
219
+ if (expressionData.expression.warnings !== undefined) {
220
+ expressionData.expression.warnings.forEach(data => workbook.warnings.push(data));
221
+ }
222
+ }
223
+
224
+ if (expressionData && expressionData.expression && expressionData.expression.wt_log2_expression) {
225
+ if (expressionData.expression.wt_log2_expression.errors !== undefined) {
226
+ expressionData.expression.wt_log2_expression.errors.forEach(data => workbook.errors.push(data));
227
+ }
228
+
229
+ if (expressionData.expression.wt_log2_expression.warnings !== undefined) {
230
+ expressionData.expression.wt_log2_expression.warnings.forEach(data => workbook.warnings.push(data));
231
+ }
232
+ }
233
+
234
+ // Gene Mismatch and Label Error Tests
235
+
236
+ workbookFile.forEach(function (sheet) {
237
+ if (isExpressionSheet(sheet.name)) {
238
+ var tempWorkbookGenes = new Set();
239
+ for (let i = 0; i < workbook.genes.length; i++) {
240
+ tempWorkbookGenes.add(workbook.genes[i].name);
241
+ }
242
+ var tempExpressionGenes = new Set(expressionData.expression[sheet.name].columnGeneNames);
243
+ var extraExpressionGenes = difference(tempExpressionGenes, tempWorkbookGenes);
244
+ var extraWorkbookGenes = difference(tempWorkbookGenes, tempExpressionGenes);
245
+
246
+ if (extraExpressionGenes.size === 0 && extraWorkbookGenes.size === 0) {
247
+ for (var i = 0; i < workbook.genes.length; i++) {
248
+ if (workbook.genes[i].name !== expressionData.expression[sheet.name].columnGeneNames[i]) {
249
+ addError(workbook, constants.errors.geneMismatchError(sheet.name));
250
+ break;
251
+ }
252
+ }
253
+ } else {
254
+ if (extraWorkbookGenes.size > 0) {
255
+ addError(workbook, constants.errors.missingGeneNamesError(sheet.name));
256
+ }
257
+ if (extraExpressionGenes.size > 0) {
258
+ addError(workbook, constants.errors.extraGeneNamesError(sheet.name));
259
+ }
260
+ }
261
+ }
262
+ });
263
+
264
+ // Integrate the desired properties from the other objects.
265
+ workbook.network = networks.network;
266
+ workbook.networkOptimizedWeights = networks.networkOptimizedWeights;
267
+ workbook.networkWeights = networks.networkWeights;
268
+ workbook.meta = additionalData.meta;
269
+ workbook.test = additionalData.test;
270
+ workbook.meta2 = additionalData.meta2;
271
+ workbook.expression = expressionData.expression;
272
+ return workbook;
424
273
  };
425
274
 
426
275
  var processGRNmap = function (path, res, app) {
427
276
  var sheet;
428
- var network;
429
277
 
430
278
  helpers.attachCorsHeader(res, app);
431
279
 
@@ -436,38 +284,35 @@ var processGRNmap = function (path, res, app) {
436
284
  }
437
285
 
438
286
  helpers.attachFileHeaders(res, path);
439
- network = parseSheet(sheet);
440
287
 
441
- // Parse expression and 2-column data, then add to network object
442
- var additionalData = parseAdditionalSheets(sheet);
443
- Object.assign(network, additionalData);
288
+ var workbook = crossSheetInteractions(sheet);
444
289
 
445
- return (network.errors.length === 0) ?
446
- // If all looks well, return the network with an all clear
447
- res.json(network) :
448
- // If all does not look well, return the network with an error 400
449
- res.json(400, network);
290
+ return workbook.errors.length === 0
291
+ ? // If all looks well, return the workbook with an all clear
292
+ res.json(workbook)
293
+ : // If all does not look well, return the workbook with an error 400
294
+ res.status(400).json(workbook);
450
295
  };
451
296
 
452
- var grnSightToCytoscape = function (network) {
297
+ var grnSightToCytoscape = function (workbook) {
453
298
  var result = [];
454
- network.genes.forEach(function (gene) {
299
+ workbook.genes.forEach(function (gene) {
455
300
  result.push({
456
301
  data: {
457
- id: gene.name
458
- }
302
+ id: gene.name,
303
+ },
459
304
  });
460
305
  });
461
306
 
462
- network.links.forEach(function (link) {
463
- var sourceGene = network.genes[link.source];
464
- var targetGene = network.genes[link.target];
307
+ workbook.links.forEach(function (link) {
308
+ var sourceGene = workbook.genes[link.source];
309
+ var targetGene = workbook.genes[link.target];
465
310
  result.push({
466
311
  data: {
467
312
  id: sourceGene.name + targetGene.name,
468
313
  source: sourceGene.name,
469
- target: targetGene.name
470
- }
314
+ target: targetGene.name,
315
+ },
471
316
  });
472
317
  });
473
318
 
@@ -475,31 +320,27 @@ var grnSightToCytoscape = function (network) {
475
320
  };
476
321
 
477
322
  /* NOTE: See above. Commented out until resolution of #474
478
- var graphStatisticsReport = function(network) {
323
+ var graphStatisticsReport = function(workbook) {
479
324
  var betweennessCentrality = [];
480
325
  var shortestPath = [];
481
- var cytoscapeElements = grnSightToCytoscape(network);
482
-
326
+ var cytoscapeElements = grnSightToCytoscape(workbook);
483
327
  var cy = cytoscape({
484
328
  headless: true,
485
329
  elements: cytoscapeElements
486
330
  });
487
-
488
- for (var i = 0; i < network.genes.length; i++) {
331
+ for (var i = 0; i < workbook.genes.length; i++) {
489
332
  var bc = cy.$().bc();
490
333
  betweennessCentrality.push({
491
- gene: network.genes[i],
492
- betweennessCentrality: bc.betweenness("#" + network.genes[i].name, null, true)
334
+ gene: workbook.genes[i],
335
+ betweennessCentrality: bc.betweenness("#" + workbook.genes[i].name, null, true)
493
336
  });
494
-
495
- var dijkstra = cy.elements().dijkstra("#" + network.genes[i].name, null, true);
496
-
497
- for (var j = 0; j < network.genes.length; j++) {
337
+ var dijkstra = cy.elements().dijkstra("#" + workbook.genes[i].name, null, true);
338
+ for (var j = 0; j < workbook.genes.length; j++) {
498
339
  shortestPath.push({
499
- source: network.genes[i].name,
340
+ source: workbook.genes[i].name,
500
341
  pathData: {
501
- target: network.genes[j].name,
502
- shortestPath: dijkstra.distanceTo("#" + network.genes[j].name, null, true)
342
+ target: workbook.genes[j].name,
343
+ shortestPath: dijkstra.distanceTo("#" + workbook.genes[j].name, null, true)
503
344
  }
504
345
  });
505
346
  }
@@ -513,11 +354,10 @@ var graphStatisticsReport = function(network) {
513
354
 
514
355
  module.exports = function (app) {
515
356
  if (app) {
516
-
517
- // parse the incoming form data, then parse the spreadsheet. Finally, send back json.
357
+ // parse the incoming form data, then parse the spreadsheet. Finally, send back json.
518
358
  app.post("/upload", function (req, res) {
519
- // TODO: Add file validation
520
- (new multiparty.Form()).parse(req, function (err, fields, files) {
359
+ // TODO: Add file validation (make sure that file is an Excel file)
360
+ new multiparty.Form().parse(req, function (err, fields, files) {
521
361
  if (err) {
522
362
  return res.json(400, "There was a problem uploading your file. Please try again.");
523
363
  }
@@ -529,41 +369,54 @@ module.exports = function (app) {
529
369
  }
530
370
 
531
371
  if (path.extname(input) !== ".xlsx") {
532
- return res.json(400, "This file cannot be loaded because:<br><br> The file is \
533
- not in a format GRNsight can read." + "<br>Please select an Excel Workbook \
372
+ return res.json(
373
+ 400,
374
+ "This file cannot be loaded because:<br><br> The file is \
375
+ not in a format GRNsight can read." +
376
+ "<br>Please select an Excel Workbook \
534
377
  (.xlsx) file. Note that Excel 97-2003 Workbook (.xls) files are not " +
535
- " able to be read by GRNsight. <br><br>SIF and GraphML files can be loaded \
536
- using the importer under File > Import." + " Additional information about file \
537
- types that GRNsight supports is in the Documentation.");
378
+ " able to be read by GRNsight. <br><br>SIF and GraphML files can be loaded \
379
+ using the importer under File > Import." +
380
+ " Additional information about file \
381
+ types that GRNsight supports is in the Documentation."
382
+ );
538
383
  }
539
384
 
385
+ // input.meta holds the species and taxon data
540
386
  return processGRNmap(input, res, app);
541
387
  });
542
388
  });
543
389
 
544
390
  // Load the demos
545
391
  app.get("/demo/unweighted", function (req, res) {
546
- return processGRNmap("test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_input.xlsx", res, app);
392
+ return demoWorkbooks("test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_input.xlsx", res, app);
547
393
  });
548
394
 
549
395
  app.get("/demo/weighted", function (req, res) {
550
- return processGRNmap("test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_estimation_output.xlsx",
551
- res, app);
396
+ return demoWorkbooks(
397
+ "test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_estimation_output.xlsx",
398
+ res,
399
+ app
400
+ );
552
401
  });
553
402
 
554
403
  app.get("/demo/schadeInput", function (req, res) {
555
- return processGRNmap("test-files/demo-files/21-genes_31-edges_Schade-data_input.xlsx", res, app);
404
+ return demoWorkbooks("test-files/demo-files/21-genes_31-edges_Schade-data_input.xlsx", res, app);
556
405
  });
557
406
 
558
407
  app.get("/demo/schadeOutput", function (req, res) {
559
- return processGRNmap("test-files/demo-files/21-genes_31-edges_Schade-data_estimation_output.xlsx",
560
- res, app);
408
+ return demoWorkbooks(
409
+ "test-files/demo-files/21-genes_31-edges_Schade-data_estimation_output.xlsx",
410
+ res,
411
+ app
412
+ );
561
413
  });
562
414
  }
563
415
 
564
- // exporting parseSheet for use in testing. Do not remove!
416
+ // exporting parseNetworkSheet for use in testing. Do not remove!
565
417
  return {
566
- parseSheet: parseSheet,
567
- grnSightToCytoscape: grnSightToCytoscape
418
+ grnSightToCytoscape: grnSightToCytoscape,
419
+ processGRNmap: processGRNmap,
420
+ crossSheetInteractions: crossSheetInteractions,
568
421
  };
569
422
  };