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
@@ -1,432 +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
- // ie: Cin5 is the same as cin5
291
- if (currentGene.name === undefined) {
292
- addWarning(network, warningsList.missingSourceGeneWarning(row, column));
293
- } else if (isNaN(currentGene.name) && typeof currentGene.name !== "string") {
294
- addWarning(network, warningsList.missingSourceGeneWarning(row, column));
295
- } else {
296
- // set currentGeneName to a String so toUpperCase doesn't mess up
297
- currentGene.name = currentGene.name.toString();
298
- sourceGenes.push(String(currentGene.name.toUpperCase()));
299
- genesList.push(String(currentGene.name.toUpperCase()));
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
- // set currentGeneName to a String so toUpperCase doesn't mess up
316
- currentGene.name = currentGene.name.toString();
317
- targetGenes.push(String(currentGene.name.toUpperCase()));
318
- // Here we check to see if we've already seen the gene name that we're about to store
319
- // Genes may or may not be present due to asymmetry or unorderedness
320
- // If it's in the genesList, it will return a number > 0, so we won't store it
321
- // If it's not there, it will return -1, so we add it.
322
- if (genesList.indexOf(String(currentGene.name.toUpperCase())) === -1) {
323
- genesList.push(String(currentGene.name.toUpperCase()));
324
- network.genes.push(currentGene);
325
- }
326
- }
327
- } catch (err) {
328
- sourceGene = currentSheet.data[0][column];
329
- targetGene = currentSheet.data[row][0];
330
- addError(network, errorList.corruptGeneError(row, column));
331
- return network;
332
- }
333
- } else { // If we're within the matrix and lookin' at the data...
334
- try {
335
- if (currentSheet.data[row][column] === undefined) {
336
- // SHOULD BE: addError(network, errorList.missingValueError(row, column));
337
- addWarning(network, warningsList.invalidMatrixDataWarning(row, column));
338
- } else if (isNaN(+("" + currentSheet.data[row][column])) ||
339
- typeof currentSheet.data[row][column] !== "number") {
340
- addError(network, errorList.dataTypeError(row, column));
341
- return network;
342
- } else {
343
- if (currentSheet.data[row][column] !== 0) { // We only care about non-zero values
344
- // Grab the source and target genes' names
345
- sourceGene = currentSheet.data[0][column];
346
- targetGene = currentSheet.data[row][0];
347
- if (sourceGene === undefined || targetGene === undefined) {
348
- addWarning(network, warningsList.randomDataWarning("undefined", row, column));
349
- } else if ((isNaN(sourceGene) && typeof sourceGene !== "string") ||
350
- (isNaN(targetGene) && typeof targetGene !== "string")) {
351
- addWarning(network, warningsList.randomDataWarning("NaN", row, column));
352
- } else {
353
- // Grab the source and target genes' numbers
354
- sourceGeneNumber = genesList.indexOf(sourceGene.toString().toUpperCase());
355
- targetGeneNumber = genesList.indexOf(targetGene.toString().toUpperCase());
356
- currentLink = {source: sourceGeneNumber, target: targetGeneNumber,
357
- value: currentSheet.data[row][column]};
358
- // Here we set the properties of the current link
359
- // before we push them to the network
360
- if (network.sheetType === "weighted") {
361
- if (currentLink.value > 0) {
362
- // If it's a positive number, mark it as an activator
363
- currentLink.type = "arrowhead";
364
- // GRNsight v1 magenta edge color
365
- // currentLink.stroke = "MediumVioletRed";
366
- // Node coloring-consistent red edge color
367
- currentLink.stroke = "rgb(195, 61, 61)";
368
- network.positiveWeights.push(currentLink.value);
369
- } else { // if it's a negative number, mark it as a repressor
370
- currentLink.type = "repressor";
371
- // currentLink.stroke = "DarkTurquoise"; // GRNsight v1 cyan edge color
372
- // Node coloring-consistent blue edge color
373
- currentLink.stroke = "rgb(51, 124, 183)";
374
- network.negativeWeights.push(currentLink.value);
375
- }
376
- } else if (network.sheetType === "unweighted") {
377
- currentLink.type = "arrowhead";
378
- currentLink.stroke = "black";
379
- if (currentLink.value !== 1) {
380
- addWarning(network, warningsList.incorrectlyNamedSheetWarning());
381
- currentLink.value = 1;
382
- }
383
- network.positiveWeights.push(currentLink.value);
384
- }
385
- network.links.push(currentLink);
386
- }
387
- }
388
- }
389
-
390
- } catch (err) {
391
- addError(network, errorList.missingValueError(row, column));
392
- // SHOULD BE: addError(network, errorList.unknownFileError);
393
- return network;
394
- }
395
- }
396
- column++; // Let's move on to the next column!
397
- } // Once we finish with the current row...
398
- column = 0; // let's go back to column 0 on the next row!
399
- } catch (err) {
400
- // We only get here if something goes drastically wrong. We don't want to get here.
401
- addError(network, errorList.unknownError);
402
- return network;
403
- }
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));
404
158
  }
405
159
  }
406
160
 
407
- // 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
+ }
408
166
 
167
+ for (let sheet in additionalData.test) {
168
+ additionalData.test[sheet].warnings.forEach(data => workbook.warnings.push(data));
169
+ }
170
+ }
409
171
 
410
- // We sort them here because gene order is not relevant before this point
411
- // Sorting them now means duplicates will be right next to each other
412
- sourceGenes.sort();
413
- 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
+ }
414
177
 
415
- // syntactic duplicate checker for both columns and rows
416
- checkDuplicates(network.errors, sourceGenes, targetGenes);
178
+ if (additionalData.meta2.warnings !== undefined) {
179
+ additionalData.meta2.warnings.forEach(data => workbook.warnings.push(data));
180
+ }
181
+ }
417
182
 
418
- // NOTE: Temporarily commented out pending resolution of #474, and other related issues
419
- // try {
420
- // network.graphStatisticsReport = graphStatisticsReport(network);
421
- // } catch (err) {
422
- // console.log ("Graph statistics report failed to be complete.");
423
- // }
424
- 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;
425
273
  };
426
274
 
427
275
  var processGRNmap = function (path, res, app) {
428
276
  var sheet;
429
- var network;
430
277
 
431
278
  helpers.attachCorsHeader(res, app);
432
279
 
@@ -437,38 +284,35 @@ var processGRNmap = function (path, res, app) {
437
284
  }
438
285
 
439
286
  helpers.attachFileHeaders(res, path);
440
- network = parseSheet(sheet);
441
287
 
442
- // Parse expression and 2-column data, then add to network object
443
- var additionalData = parseAdditionalSheets(sheet);
444
- Object.assign(network, additionalData);
288
+ var workbook = crossSheetInteractions(sheet);
445
289
 
446
- return (network.errors.length === 0) ?
447
- // If all looks well, return the network with an all clear
448
- res.json(network) :
449
- // If all does not look well, return the network with an error 400
450
- res.status(400).json(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);
451
295
  };
452
296
 
453
- var grnSightToCytoscape = function (network) {
297
+ var grnSightToCytoscape = function (workbook) {
454
298
  var result = [];
455
- network.genes.forEach(function (gene) {
299
+ workbook.genes.forEach(function (gene) {
456
300
  result.push({
457
301
  data: {
458
- id: gene.name
459
- }
302
+ id: gene.name,
303
+ },
460
304
  });
461
305
  });
462
306
 
463
- network.links.forEach(function (link) {
464
- var sourceGene = network.genes[link.source];
465
- 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];
466
310
  result.push({
467
311
  data: {
468
312
  id: sourceGene.name + targetGene.name,
469
313
  source: sourceGene.name,
470
- target: targetGene.name
471
- }
314
+ target: targetGene.name,
315
+ },
472
316
  });
473
317
  });
474
318
 
@@ -476,31 +320,27 @@ var grnSightToCytoscape = function (network) {
476
320
  };
477
321
 
478
322
  /* NOTE: See above. Commented out until resolution of #474
479
- var graphStatisticsReport = function(network) {
323
+ var graphStatisticsReport = function(workbook) {
480
324
  var betweennessCentrality = [];
481
325
  var shortestPath = [];
482
- var cytoscapeElements = grnSightToCytoscape(network);
483
-
326
+ var cytoscapeElements = grnSightToCytoscape(workbook);
484
327
  var cy = cytoscape({
485
328
  headless: true,
486
329
  elements: cytoscapeElements
487
330
  });
488
-
489
- for (var i = 0; i < network.genes.length; i++) {
331
+ for (var i = 0; i < workbook.genes.length; i++) {
490
332
  var bc = cy.$().bc();
491
333
  betweennessCentrality.push({
492
- gene: network.genes[i],
493
- betweennessCentrality: bc.betweenness("#" + network.genes[i].name, null, true)
334
+ gene: workbook.genes[i],
335
+ betweennessCentrality: bc.betweenness("#" + workbook.genes[i].name, null, true)
494
336
  });
495
-
496
- var dijkstra = cy.elements().dijkstra("#" + network.genes[i].name, null, true);
497
-
498
- 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++) {
499
339
  shortestPath.push({
500
- source: network.genes[i].name,
340
+ source: workbook.genes[i].name,
501
341
  pathData: {
502
- target: network.genes[j].name,
503
- 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)
504
344
  }
505
345
  });
506
346
  }
@@ -514,11 +354,10 @@ var graphStatisticsReport = function(network) {
514
354
 
515
355
  module.exports = function (app) {
516
356
  if (app) {
517
-
518
- // 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.
519
358
  app.post("/upload", function (req, res) {
520
- // TODO: Add file validation
521
- (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) {
522
361
  if (err) {
523
362
  return res.json(400, "There was a problem uploading your file. Please try again.");
524
363
  }
@@ -530,41 +369,54 @@ module.exports = function (app) {
530
369
  }
531
370
 
532
371
  if (path.extname(input) !== ".xlsx") {
533
- return res.json(400, "This file cannot be loaded because:<br><br> The file is \
534
- 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 \
535
377
  (.xlsx) file. Note that Excel 97-2003 Workbook (.xls) files are not " +
536
- " able to be read by GRNsight. <br><br>SIF and GraphML files can be loaded \
537
- using the importer under File > Import." + " Additional information about file \
538
- 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
+ );
539
383
  }
540
384
 
385
+ // input.meta holds the species and taxon data
541
386
  return processGRNmap(input, res, app);
542
387
  });
543
388
  });
544
389
 
545
390
  // Load the demos
546
391
  app.get("/demo/unweighted", function (req, res) {
547
- 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);
548
393
  });
549
394
 
550
395
  app.get("/demo/weighted", function (req, res) {
551
- return processGRNmap("test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_estimation_output.xlsx",
552
- 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
+ );
553
401
  });
554
402
 
555
403
  app.get("/demo/schadeInput", function (req, res) {
556
- 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);
557
405
  });
558
406
 
559
407
  app.get("/demo/schadeOutput", function (req, res) {
560
- return processGRNmap("test-files/demo-files/21-genes_31-edges_Schade-data_estimation_output.xlsx",
561
- res, app);
408
+ return demoWorkbooks(
409
+ "test-files/demo-files/21-genes_31-edges_Schade-data_estimation_output.xlsx",
410
+ res,
411
+ app
412
+ );
562
413
  });
563
414
  }
564
415
 
565
- // exporting parseSheet for use in testing. Do not remove!
416
+ // exporting parseNetworkSheet for use in testing. Do not remove!
566
417
  return {
567
- parseSheet: parseSheet,
568
- grnSightToCytoscape: grnSightToCytoscape
418
+ grnSightToCytoscape: grnSightToCytoscape,
419
+ processGRNmap: processGRNmap,
420
+ crossSheetInteractions: crossSheetInteractions,
569
421
  };
570
422
  };