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,87 +1,324 @@
1
- // Parses "optimization_paramters," expression data sheets, and 2-column sheets
1
+ // Parses "optimization_paramters" and 2-column sheets
2
2
  // from GRNmap input or output workbook
3
3
 
4
- var TWO_COL_SHEET_NAMES = [
4
+ var constants = require(__dirname + "/workbook-constants");
5
+
6
+ const getSheetHeader = (sheetName, column, row) => {
7
+ if (row === 0) {
8
+ if (sheetName === "production_rates" || sheetName === "optimized_production_rates") {
9
+ return "production_rate";
10
+ } else if (sheetName === "degradation_rates") {
11
+ return "degradation_rate";
12
+ } else if (sheetName === "threshold_b" || sheetName === "optimized_threshold_b") {
13
+ return "threshold_b";
14
+ } else if (sheetName === "optimization_parameters") {
15
+ return (column === 0) ? "optimization_parameter" : "value";
16
+ } else if (sheetName === "optimization_diagnostics") {
17
+ return (column === 0) ? "Parameter" : "Value";
18
+ }
19
+ }
20
+ };
21
+
22
+ const optimizationParametersTypeKey = {
23
+ alpha: "number", "kk_max": "number", MaxIter: "number", TolFun: "number", MaxFunEval: "number",
24
+ TolX: "number", "production_function": "string", "L_curve": "number", "estimate_params": "number",
25
+ "make_graphs": "number", "fix_P": "number", "fix_b": "number", "expression_timepoints": "object",
26
+ Strain: "object", species: "string", "taxon_id": "number", "simulation_timepoints": "object", "b_or_tau" : "number"
27
+
28
+ };
29
+
30
+ const optimizationDiagnosticsParameters = ["LSE", "Penalty", "min LSE", "iteration count"];
31
+
32
+ const optimizationParametersObectKey = {
33
+ "expression_timepoints": "number", Strain: "string", "simulation_timepoints": "number"
34
+ };
35
+
36
+ const addWarning = (workbook, message) => {
37
+ let warningsCount;
38
+ if (!Object.keys(workbook).includes("warnings")) {
39
+ warningsCount = 0;
40
+ workbook.warnings = [];
41
+ } else {
42
+ warningsCount = workbook.warnings.length;
43
+ }
44
+ const MAX_WARNINGS = 75;
45
+ if (warningsCount < MAX_WARNINGS) {
46
+ workbook.warnings.push(message);
47
+ } else {
48
+ workbook.errors.push(constants.errors.warningsCountError);
49
+ return false;
50
+ }
51
+ };
52
+
53
+ const addError = (output, message) => {
54
+ const errorsCount = output.errors.length;
55
+ const MAX_ERRORS = 20;
56
+ if (errorsCount < MAX_ERRORS) {
57
+ output.errors.push(message);
58
+ } else {
59
+ output.errors.push(constants.errors.errorsCountError);
60
+ return false;
61
+ }
62
+ };
63
+
64
+ const TWO_COL_SHEET_NAMES = [
5
65
  "production_rates",
6
66
  "degradation_rates",
7
67
  "threshold_b",
8
68
  "optimized_production_rates",
9
- "optimized_threshold_b"];
10
-
11
- var EXPRESSION_SHEET_SUFFIXES = ["_expression", "_optimized_expression", "_sigmas"];
12
-
13
- var isExpressionSheet = function (sheetName) {
14
- return EXPRESSION_SHEET_SUFFIXES.some(function (suffix) {
15
- return sheetName.includes(suffix);
16
- });
17
- };
69
+ "optimized_threshold_b"
70
+ ];
18
71
 
19
- var fillArray = function (value, array, length) { // mutator
20
- while (array.length < length) {
21
- array.push(value);
72
+ const validGeneName = (output, sheetName, gene, row) => {
73
+ var maxGeneLength = 12;
74
+ var regex = /[^a-z0-9\_\-]/gi;
75
+ if (typeof gene !== "string") {
76
+ addError(output, constants.errors.invalidGeneTypeError(sheetName, gene, row));
77
+ return false;
78
+ } else if (gene.length > maxGeneLength) {
79
+ addError(output, constants.errors.invalidGeneLengthError(sheetName, gene, row));
80
+ return false;
81
+ } else if (gene.match(regex) !== null) {
82
+ addError(output, constants.errors.specialCharacterError(sheetName, gene, row));
83
+ return false;
22
84
  }
23
- return array;
85
+ return true;
24
86
  };
87
+ // Optimization Parameters Parser
88
+ const parseMetaDataSheet = (sheet) => {
89
+ let meta = {
90
+ data: {},
91
+ errors: [],
92
+ warnings: []
93
+ };
94
+ let paramType;
95
+ if (sheet.data[0][0] === undefined) {
96
+ addError(meta, constants.errors.missingColumnHeaderError(sheet.name, constants.numbersToLetters[0],
97
+ getSheetHeader(sheet.name, 0, 0)));
98
+ } else if (sheet.data[0][0] !== getSheetHeader(sheet.name, 0, 0)) {
99
+ addError(meta, constants.errors.incorrectColumnHeaderError(sheet.name, constants.numbersToLetters[0],
100
+ getSheetHeader(sheet.name, 0, 0)));
101
+ }
102
+ if (sheet.data[0][1] === undefined) {
103
+ addError(meta, constants.errors.missingColumnHeaderError(sheet.name, constants.numbersToLetters[1],
104
+ getSheetHeader(sheet.name, 1, 0)));
105
+ } else if (sheet.data[0][1] !== getSheetHeader(sheet.name, 1, 0)) {
106
+ addError(meta, constants.errors.incorrectColumnHeaderError(sheet.name, constants.numbersToLetters[1],
107
+ getSheetHeader(sheet.name, 1, 0)));
108
+ }
25
109
 
26
- var parseMetaDataSheet = function (sheet) {
27
- var meta = {};
28
110
  sheet.data.forEach(function (element, index) {
29
111
  if (index !== 0) {
30
- var value = element.slice(1);
112
+ const value = element.slice(1);
31
113
  // Extract element from array if array contains only 1 value
32
- meta[element[0]] = value.length > 1 ? value : value[0];
114
+ meta.data[element[0]] = value.length > 1 ? value : value[0];
33
115
  }
34
116
  });
117
+ for (let key in meta.data) {
118
+ paramType = optimizationParametersTypeKey[key];
119
+ if (paramType === "object") {
120
+ paramType = `list of ${optimizationParametersObectKey[key]}s`;
121
+ }
122
+ if (meta.data[key] === undefined) {
123
+ addWarning(meta, constants.warnings.unknownOptimizationParameter(sheet.name, key));
124
+ } else if (typeof meta.data[key] !== optimizationParametersTypeKey[key]) {
125
+ if (optimizationParametersTypeKey[key] !== "object" ||
126
+ typeof meta.data[key] !== optimizationParametersObectKey[key]) {
127
+ addWarning(meta, constants.warnings.invalidOptimizationParameter(sheet.name, key, paramType));
128
+ }
129
+ } else if (optimizationParametersTypeKey[key] === "object") {
130
+ for (let val of meta.data[key]) {
131
+ if (typeof val !== optimizationParametersObectKey[key]) {
132
+ // throw error once per object. Makes sure that errors list is not flooded
133
+ addWarning(meta, constants.warnings.invalidOptimizationParameter(sheet.name, key, paramType));
134
+ break;
135
+ }
136
+ }
137
+ }
138
+ }
35
139
  return meta;
36
140
  };
37
141
 
38
- var parseTwoColumnSheet = function (sheet) {
39
- var data = {};
40
- sheet.data.forEach(function (element, index) {
41
- if (index !== 0) {
42
- data[element[0]] = element[1];
142
+ const parseOptimizationDiagnosticsSheet = (sheet) => {
143
+ let output = {
144
+ data: {
145
+ Parameters: {},
146
+ MSE: {
147
+ "column-headers": [],
148
+ Genes: {}
149
+ },
150
+ },
151
+ errors: [],
152
+ warnings: [],
153
+ };
154
+ let currentParameter;
155
+ let currentValue;
156
+ let currentGene;
157
+ let currentMSE = [];
158
+ // Check Headers
159
+ if (sheet.data[0].length > 1) {
160
+ if (sheet.data[0][0] !== getSheetHeader(sheet.name, 0, 0)) {
161
+ addError(output, constants.errors.incorrectColumnHeaderError(sheet.name, constants.numbersToLetters[0],
162
+ getSheetHeader(sheet.name, 0, 0)));
43
163
  }
44
- });
45
- return data;
164
+ if (sheet.data[0][1] !== getSheetHeader(sheet.name, 1, 0)) {
165
+ addError(output, constants.errors.incorrectColumnHeaderError(sheet.name, constants.numbersToLetters[1],
166
+ getSheetHeader(sheet.name, 1, 0)));
167
+ }
168
+ } else {
169
+ // seems a bit sus, but we'll see if this works properly during testing :\
170
+ for (let col = 1; col >= sheet.data[0].length; col--) {
171
+ addError(output, constants.errors.missingColumnHeaderError(sheet.name, constants.numbersToLetters[col],
172
+ getSheetHeader(sheet.name, col, 0)));
173
+ }
174
+ }
175
+ // Check Parameter Section
176
+ let row = 1;
177
+ // a missing row is the indicator to move onto the MSE
178
+ while (sheet.data[row].length > 0) {
179
+ currentParameter = sheet.data[row][0];
180
+ currentValue = sheet.data[row][1];
181
+ if (currentParameter === undefined || currentParameter.replace(/\s+/g, "") === "") {
182
+ if (currentValue === undefined || currentValue.replace(/\s+/g, "") === "") {
183
+ // if there is no parameter or value assume that its time to move on
184
+ row++;
185
+ break;
186
+ }
187
+ }
188
+ if (sheet.data[row].length > 2) {
189
+ addWarning(output, constants.warnings.extraneousDataWarning(sheet.name, row + 1));
190
+ }
191
+ if (! optimizationDiagnosticsParameters.includes(currentParameter)) {
192
+ if (currentParameter === "Gene") {
193
+ row--;
194
+ break;
195
+ }
196
+ addWarning(output, constants.warnings.unknownOptimizationDiagnosticsParameter(sheet.name,
197
+ currentParameter));
198
+ } else if (typeof currentValue !== "number") {
199
+ addWarning(output, constants.warnings.invalidOptimizationDiagnosticsValue(sheet.name, currentParameter));
200
+ } else {
201
+ output.data.Parameters[currentParameter] = currentValue;
202
+ }
203
+ row++;
204
+ }
205
+ // Skip until Gene section
206
+ while (sheet.data[row] !== undefined && sheet.data[row].length < 1) {
207
+ row++;
208
+ }
209
+ // Check Gene section MSE's
210
+ if (sheet.data[row].length > 1) {
211
+ if (sheet.data[row][0] !== "Gene") {
212
+ addWarning(output, constants.warnings.incorrectMSEGeneHeaderWarning(sheet.name, row + 1));
213
+ }
214
+ for (let col = 1; col < sheet.data[row].length; col++) {
215
+ if (!sheet.data[row][col].includes("MSE")) {
216
+ addWarning(output, constants.warnings.incorrectMSEHeaderWarning(sheet.name, sheet.data[row][col],
217
+ row + 1, constants.numbersToLetters[col]));
218
+ }
219
+ // we still push the header (even tho it's sus) because the gene MSE's are
220
+ // dependent on the order of the column headers
221
+ output.data.MSE["column-headers"].push(sheet.data[row][col]);
222
+ }
223
+ row++;
224
+ // on to the actual genes
225
+ while (row < sheet.data.length) {
226
+ if (sheet.data[row].length > output.data.MSE["column-headers"].length + 1) {
227
+ addWarning(output, constants.warnings.extraneousDataWarning(sheet.name, row + 1));
228
+ }
229
+ currentGene = sheet.data[row][0];
230
+ // if it's a valid gene set the key = MSE value
231
+ if (validGeneName(output, sheet.name, currentGene, row)) {
232
+ for (let col = 1; col <= output.data.MSE["column-headers"].length; col++) {
233
+ if (typeof sheet.data[row][col] === "number") {
234
+ currentMSE.push(sheet.data[row][col]);
235
+ } else if (sheet.data[row][col] === undefined) {
236
+ addWarning(output, constants.warnings.missingMSEDataWarning(sheet.name, row + 1,
237
+ constants.numbersToLetters[col]));
238
+ } else {
239
+ addWarning(output, constants.warnings.invalidMSEDataWarning(sheet.name, row + 1,
240
+ constants.numbersToLetters[col]));
241
+ }
242
+ }
243
+ output.data.MSE.Genes[currentGene] = currentMSE;
244
+ currentMSE = [];
245
+ }
246
+ row++;
247
+ }
248
+ }
249
+ return output;
46
250
  };
47
251
 
48
- var parseExpressionSheet = function (sheet) {
49
- var expressionData = {};
50
- var geneData = {};
51
- expressionData["time_points"] = sheet.data[0].slice(1);
52
- var numberOfDataPoints = expressionData["time_points"].length;
53
- sheet.data.forEach(function (sheet) {
54
- var geneName = sheet[0];
55
- if (geneName) {
56
- var rowData = sheet.slice(1);
57
- // Sometimes, missing data is at the end of the row. In this case, pad the
58
- // array with nulls
59
- if (rowData.length < numberOfDataPoints) {
60
- fillArray(null, rowData, numberOfDataPoints);
252
+ const parseTwoColumnSheet = (sheet) => {
253
+ let output = {
254
+ data : {},
255
+ errors: [],
256
+ warnings: [],
257
+ };
258
+
259
+ let currentGene;
260
+ let currentValue;
261
+
262
+ // check to see if the genes are strings and the values are numbers
263
+
264
+ for (let row = 0; row < sheet.data.length; row++) {
265
+ if (sheet.data[row].length > 2) {
266
+ addWarning(output, constants.warnings.extraneousDataWarning(sheet.name, row + 1));
267
+ }
268
+ if (row === 0) {
269
+ if (sheet.data[row].length > 0) {
270
+ if (sheet.data[row][0] !== "id") {
271
+ addError(output, constants.errors.idLabelError(sheet.name));
272
+ }
273
+ }
274
+ if (sheet.data[row].length > 1) {
275
+ if (sheet.data[row][1] !== getSheetHeader(sheet.name, 1, row)) {
276
+ addError(output, constants.errors.incorrectColumnHeaderError(sheet.name,
277
+ constants.numbersToLetters[1],
278
+ getSheetHeader(sheet.name, 1, row)));
279
+ }
280
+ } else {
281
+ addError(output, constants.errors.missingColumnHeaderError(sheet.name, constants.numbersToLetters[1],
282
+ getSheetHeader(sheet.name, 1, row)));
283
+ }
284
+ } else {
285
+ currentGene = sheet.data[row][0];
286
+ currentValue = sheet.data[row][1];
287
+
288
+ if (validGeneName(output, sheet.name, currentGene, row + 1)) {
289
+ if (typeof currentValue === "number") {
290
+ output.data[currentGene] = currentValue;
291
+ } else {
292
+ addError(output, constants.errors.invalidValueError(sheet.name, currentValue, row + 1,
293
+ getSheetHeader(sheet.name, 1, row)));
294
+ }
61
295
  }
62
- geneData[geneName] = rowData;
63
296
  }
64
- });
65
- expressionData["data"] = geneData;
66
- return expressionData;
297
+ }
298
+
299
+ return output;
67
300
  };
68
301
 
69
- module.exports = function (workbook) {
70
- var output = {
71
- expression: {}, // expression data
72
- meta: {},
73
- test: {} // 2-column data
302
+ module.exports = function (workbookFile) {
303
+ let output = {
304
+ meta: {
305
+ data: {},
306
+ errors: [],
307
+ warnings: []
308
+ }, // optimization_parameters only
309
+ test: {}, // 2-column data
310
+ meta2: {} // optimation_diagnostics only //temporary until where it goes is decided
74
311
  };
75
- workbook.forEach(function (sheet) {
312
+ workbookFile.forEach(function (sheet) {
76
313
  if (sheet.name === "optimization_parameters") {
77
- output["meta"] = parseMetaDataSheet(sheet);
78
- // Parse 2-column sheets
314
+ output.meta = parseMetaDataSheet(sheet);
315
+ // above line creates an object from the optimization paramerters sheet
316
+ // these are part of the "meta" property
79
317
  } else if (TWO_COL_SHEET_NAMES.includes(sheet.name)) {
80
318
  output["test"][sheet.name] = parseTwoColumnSheet(sheet);
81
- // Parse expression sheets
82
- } else if (isExpressionSheet(sheet.name)) {
83
- output["expression"][sheet.name] = parseExpressionSheet(sheet);
319
+ } else if (sheet.name === "optimization_diagnostics") {
320
+ output.meta2 = parseOptimizationDiagnosticsSheet(sheet);
84
321
  }
85
322
  });
86
323
  return output;
87
- };
324
+ };
@@ -11,48 +11,15 @@ module.exports = {
11
11
  EDGES_WITHOUT_WEIGHTS: {
12
12
  warningCode: "EDGES_WITHOUT_WEIGHTS",
13
13
  errorDescription: "GRNsight has detected that one or more edges in your network are missing numerical" +
14
- " weight values. Because the algorithm GRNsight uses for determining the arrowhead type and the color and" +
15
- " thickness of the edges requires numerical weight values, your graph will display as an unweighted graph" +
16
- " with black edges and pointed arrowheads. If you want to display the network as a weighted graph, please" +
17
- " modify your input file to include weight values for all edges."
14
+ " weight values. Because the algorithm GRNsight uses for determining the arrowhead type and the" +
15
+ " color and thickness of the edges requires numerical weight values, your graph will display as" +
16
+ " an unweighted graph with black edges and pointed arrowheads. If you want to display the network" +
17
+ " as a weighted graph, please modify your input file to include weight values for all edges."
18
18
  },
19
19
 
20
20
  EDGE_DEFAULT_NOT_DIRECTED: {
21
21
  warningCode: "EDGE_DEFAULT_NOT_DIRECTED",
22
22
  errorDescription: "GRNsight interprets the graph as directed unconditionally."
23
23
  },
24
-
25
- SIF_FORMAT_WARNING: {
26
- warningCode: "SIF_FORMAT_WARNING",
27
- errorDescription: " GRNsight has detected that there are no tabs in your file. The GRNsight specification" +
28
- " for SIF files states that data must be delimited by tabs. Please review your data. This warning may" +
29
- " suggest that your SIF file has comma separated data or contains no data at all. Additionally, valid" +
30
- " networks which consist of single source nodes may also trigger this warning."
31
- }
32
24
  },
33
-
34
- errors: {
35
- SIF_UNWEIGHTED_RELATIONSHIP_TYPE_ERROR: {
36
- errorCode: "SIF_UNWEIGHTED_RELATIONSHIP_TYPE_ERROR",
37
- possibleCause: "The SIF importer detects an unweighted network with an unsupported relationship type.",
38
- suggestedFix: "SIF files accepted by GRNsight must use 'pd' as the text string for the relationship type" +
39
- " in unweighted networks. Please review the SIF input documentation. Additionally, this error may be have" +
40
- " been caused by missing data in your file, which caused the importer to incorrectly interpret a source" +
41
- " or target as the relationship."
42
- },
43
-
44
- SIF_MISSING_DATA_ERROR: {
45
- errorCode: "SIF_MISSING_DATA_ERROR",
46
- possibleCause: "GRNsight has detected that your SIF file contains missing data. ",
47
- suggestedFix: "Please review the data. In a SIF file, each entry must have a source node, relationship" +
48
- " type, and at least one target node, separated by tabs. An entry with a single source node is also" +
49
- " allowed."
50
- },
51
-
52
- SIF_STRAY_DATA_ERROR: {
53
- errorCode: "SIF_STRAY_DATA_ERROR",
54
- possibleCause: "GRNsight has detected stray data and/or extraneous blank rows in your SIF file. ",
55
- suggestedFix: "Please review the data and delete extraneous data from the file."
56
- }
57
- }
58
25
  };
@@ -0,0 +1,66 @@
1
+ /* eslint-disable camelcase */
2
+ var helpers = require(__dirname + "/helpers");
3
+
4
+ var processCustomWorkbook = function (path, res, app, workbook) {
5
+ helpers.attachCorsHeader(res, app);
6
+ helpers.attachFileHeaders(res, path);
7
+ return workbook.errors.length === 0
8
+ ? // If all looks well, return the workbook with an all clear
9
+ res.json(workbook)
10
+ : // If all does not look well, return the workbook with an error 400
11
+ res.status(400).json(workbook);
12
+ };
13
+
14
+ const createCustomWorkbook = (genesString, linksString) => {
15
+ let genes = genesString.split(",").map(gene => {
16
+ return {name: gene};
17
+ });
18
+ let links = linksString.split(",").map( link => {
19
+ link = link.split("->");
20
+ return {
21
+ source: parseInt(link[0]),
22
+ target: parseInt(link[1]),
23
+ value:1,
24
+ type:"arrowhead",
25
+ stroke: "black"
26
+ };
27
+ });
28
+ let positiveWeights = Array(links.length).fill(1);
29
+ return {
30
+ genes,
31
+ links,
32
+ errors: [],
33
+ warnings: [],
34
+ positiveWeights,
35
+ negativeWeights: [],
36
+ sheetType: "unweighted",
37
+ network: {
38
+ genes,
39
+ links,
40
+ errors: [],
41
+ warnings: [],
42
+ positiveWeights,
43
+ },
44
+ meta: {
45
+ data: {
46
+ species: "Saccharomyces cerevisiae",
47
+ taxon_id: 559292
48
+ }
49
+ },
50
+ test: {
51
+ },
52
+ expression: {
53
+ }
54
+ };
55
+ };
56
+
57
+ module.exports = function (app) {
58
+ if (app) {
59
+
60
+ // Load Custom Workbook
61
+ app.get("/upload-custom-workbook", function (req, res) {
62
+ let workbook = createCustomWorkbook(req.query.genes, req.query.links);
63
+ return processCustomWorkbook(req.query.name, res, app, workbook);
64
+ });
65
+ }
66
+ };