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.
- package/.travis.yml +3 -1
- package/GRNsight - Beta.html +194 -0
- package/Gemfile.lock +259 -0
- package/README.md +2 -2
- package/_gh_pages/about.html +360 -45
- package/_gh_pages/assets/css/footer.css +3 -0
- package/_gh_pages/assets/css/main.css +28 -14
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_estimation_output_binary-no-targetless-genes_sif.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_estimation_output_binary_sif.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_3-edges-and-footer.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_header-and-3-nodes.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_output_3-edges-and-footer.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_graphml_output_header-and-3-nodes.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_binary-no-targetless-genes_sif.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_binary_sif.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_concatenated-no-targetless-genes_sif.png +0 -0
- package/_gh_pages/assets/images/21-genes_31-edges_Schade-data_input_concatenated_sif.png +0 -0
- package/_gh_pages/assets/images/Choe-Shin_CMSI402-poster-session_20180430.jpg +0 -0
- package/_gh_pages/assets/images/Choe_SCCUR_2017.jpg +0 -0
- package/_gh_pages/assets/images/Dahlquist-Choe-Shin_CMSI402-poster-session_20180430.jpg +0 -0
- package/_gh_pages/assets/images/Dionisio-Dahlquist_GRNsight-shades_20170506.jpg +0 -0
- package/_gh_pages/assets/images/Klein_Samdarshi_TriBeta_2018_20180317.jpg +0 -0
- package/_gh_pages/assets/images/Shin_SCCUR_2017.jpg +0 -0
- 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
- 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
- package/_gh_pages/assets/images/gene-pages-0.png +0 -0
- package/_gh_pages/assets/images/gene-pages-1.png +0 -0
- package/_gh_pages/assets/images/gene-pages-2.png +0 -0
- package/_gh_pages/assets/images/gene-pages-3.png +0 -0
- package/_gh_pages/assets/images/grnsight2020.png +0 -0
- package/_gh_pages/assets/images/v3demo2-grid+nodecoloring.png +0 -0
- package/_gh_pages/assets/images/v3demo2-nodecoloring.png +0 -0
- package/_gh_pages/assets/images/v3demo2.png +0 -0
- package/_gh_pages/assets/js/ga-report.js +11 -11
- package/_gh_pages/assets/js/iframeResizer.min.js +9 -0
- package/_gh_pages/assets/js/main.js +43 -43
- package/_gh_pages/beta.html +29 -24
- package/_gh_pages/contact.html +31 -31
- package/_gh_pages/coverage/coverage.json +1 -0
- package/_gh_pages/coverage/coverage.raw.json +1 -0
- package/_gh_pages/coverage/lcov-report/base.css +223 -0
- package/_gh_pages/coverage/lcov-report/block-navigation.js +63 -0
- package/_gh_pages/coverage/lcov-report/controllers/additional-sheet-parser.js.html +330 -0
- package/_gh_pages/coverage/lcov-report/controllers/constants.js.html +243 -0
- package/_gh_pages/coverage/lcov-report/controllers/export-controller.js.html +285 -0
- package/_gh_pages/coverage/lcov-report/controllers/exporters/graphml.js.html +405 -0
- package/_gh_pages/coverage/lcov-report/controllers/exporters/index.html +110 -0
- package/_gh_pages/coverage/lcov-report/controllers/exporters/sif.js.html +150 -0
- package/_gh_pages/coverage/lcov-report/controllers/helpers.js.html +114 -0
- package/_gh_pages/coverage/lcov-report/controllers/import-controller.js.html +233 -0
- package/_gh_pages/coverage/lcov-report/controllers/importers/graphml.js.html +716 -0
- package/_gh_pages/coverage/lcov-report/controllers/importers/index.html +106 -0
- package/_gh_pages/coverage/lcov-report/controllers/importers/sif.js.html +488 -0
- package/_gh_pages/coverage/lcov-report/controllers/index.html +162 -0
- package/_gh_pages/coverage/lcov-report/controllers/semantic-checker.js.html +810 -0
- package/_gh_pages/coverage/lcov-report/controllers/spreadsheet-controller.js.html +1779 -0
- package/_gh_pages/coverage/lcov-report/index.html +136 -0
- package/_gh_pages/coverage/lcov-report/prettify.css +1 -0
- package/_gh_pages/coverage/lcov-report/prettify.js +1 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/additional-sheet-parser.js.html +330 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/constants.js.html +243 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/export-controller.js.html +285 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/exporters/graphml.js.html +405 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/exporters/index.html +110 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/exporters/sif.js.html +150 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/graphml-constants.js.html +585 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/helpers.js.html +114 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/import-controller.js.html +237 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/importers/graphml.js.html +585 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/importers/index.html +110 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/importers/sif.js.html +492 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/index.html +188 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/semantic-checker.js.html +810 -0
- package/_gh_pages/coverage/lcov-report/server/controllers/spreadsheet-controller.js.html +1779 -0
- package/_gh_pages/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/_gh_pages/coverage/lcov-report/sorter.js +158 -0
- package/_gh_pages/coverage/lcov-report/web-client/public/js/grnstate.js.html +225 -0
- package/_gh_pages/coverage/lcov-report/web-client/public/js/index.html +97 -0
- package/_gh_pages/coverage/lcov.info +49 -0
- package/_gh_pages/documentation.html +998 -320
- package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.aux +47 -0
- package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.bbl +73 -0
- package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.blg +52 -0
- package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.log +1056 -0
- package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.out +7 -0
- package/_gh_pages/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.synctex.gz +0 -0
- package/_gh_pages/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised-Dondi.docx +0 -0
- package/_gh_pages/encryption/server.cert +21 -0
- package/_gh_pages/encryption/server.key +28 -0
- package/_gh_pages/favicon.ico +0 -0
- package/_gh_pages/index.html +45 -22
- package/_gh_pages/links.html +47 -28
- package/_gh_pages/news.html +103 -21
- package/_gh_pages/onlyfooter.html +78 -0
- package/_gh_pages/onlyheader.html +64 -0
- package/_gh_pages/onlysidebar.html +73 -0
- package/_gh_pages/package-lock.json +14048 -0
- package/_gh_pages/people.html +129 -40
- package/_gh_pages/privacy.html +23 -17
- package/_gh_pages/publications.html +75 -33
- package/_gh_pages/robots.txt +1 -0
- package/_gh_pages/sitemap.xml +87 -74
- package/_gh_pages/test-files/import-samples/attributes.graphml +40 -0
- package/_gh_pages/test-files/import-samples/port.graphml +32 -0
- package/_gh_pages/test-files/import-samples/simple.graphml +31 -0
- package/_gh_pages/web-client/public/js/grnsight.min.js +2347 -0
- package/_gh_pages/web-client/public/stylesheets/grnsight.css +443 -0
- package/coverage/coverage.json +1 -1
- package/coverage/lcov.info +1847 -1142
- package/database/README.md +1 -0
- package/database/network-database/README.md +44 -0
- package/database/network-database/schema.sql +24 -0
- package/database/network-database/scripts/filter_genes.py +76 -0
- package/database/network-database/scripts/generate_network.py +199 -0
- package/database/network-database/scripts/generate_sgd_network_from_yeastract_network.py +120 -0
- package/database/network-database/scripts/loader.py +78 -0
- package/package.json +20 -11
- package/server/app.js +7 -2
- package/server/config/config.js +12 -3
- package/server/controllers/additional-sheet-parser.js +292 -55
- package/server/controllers/constants.js +4 -37
- package/server/controllers/custom-workbook-controller.js +66 -0
- package/server/controllers/demo-workbooks.js +5973 -0
- package/server/controllers/export-constants.js +78 -0
- package/server/controllers/export-controller.js +4 -3
- package/server/controllers/exporters/graphml.js +15 -15
- package/server/controllers/exporters/sif.js +7 -7
- package/server/controllers/exporters/xlsx.js +110 -34
- package/server/controllers/expression-database-controller.js +19 -0
- package/server/controllers/expression-sheet-parser.js +170 -0
- package/server/controllers/graphml-constants.js +0 -17
- package/server/controllers/helpers.js +25 -1
- package/server/controllers/import-controller.js +2 -2
- package/server/controllers/importers/graphml.js +17 -20
- package/server/controllers/importers/sif.js +22 -18
- package/server/controllers/network-database-controller.js +18 -0
- package/server/controllers/network-sheet-parser.js +307 -0
- package/server/controllers/semantic-checker.js +30 -162
- package/server/controllers/sif-constants.js +36 -0
- package/server/controllers/spreadsheet-controller.js +277 -425
- package/server/controllers/workbook-constants.js +521 -0
- package/server/dals/expression-dal.js +122 -0
- package/server/dals/network-dal.js +96 -0
- package/test/additional-sheet-parser-tests.js +147 -38
- package/test/api-tests.js +3 -6
- package/test/errors-adjacency-matrix-modifications.js +30 -29
- package/test/errors-graph-tests.js +4 -4
- package/test/errors-sheet-modifications.js +10 -2
- package/test/export-tests.js +187 -60
- package/test/expression-data-import-tests.js +113 -0
- package/test/grnstate-tests.js +8 -2
- package/test/import-graphml-tests.js +59 -40
- package/test/import-sif-tests.js +50 -37
- package/test/test.js +554 -91
- package/test/warnings-adjacency-matrix-modifications.js +8 -7
- package/test-files/additional-sheet-test-files/optimization-diagnostics-default.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-extraneous-data.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-MSE-gene-header.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-MSE-header.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-incorrect-column-headers.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-invalid-MSE-data.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-invalid-value.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-MSE-data.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-column-headers.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-missing-header.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-diagnostics-unknown-parameter.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-parameters-default.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-parameters-incorrect-headers.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-parameters-invalid-optimization-parameter.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-parameters-missing-headers.xlsx +0 -0
- package/test-files/additional-sheet-test-files/optimization-parameters-unknown-parameter.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-extraneous-data.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-incorrect-cell-A1.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-incorrect-column-header.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-invalid-gene-length.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-invalid-gene-type.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-invalid-value.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-missing-column-header.xlsx +0 -0
- package/test-files/additional-sheet-test-files/two-column-sheets-special-character.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/asymmetric-gene-order-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/asymmetric-gene-order-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-column-adjacent-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-column-adjacent-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-column-end-of-sheet-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-column-end-of-sheet-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-data-random-cell-both-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-only-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-only-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-data-random-cell-network-optimized-only-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-row-end-of-sheet-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/extra-row-end-of-sheet-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/incorrect-network-cell-A1.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-column-end-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-column-end-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-data-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-data-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-row-end-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-row-end-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-row-middle-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-row-middle-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-value-bottom-corner-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/missing-value-bottom-corner-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-both-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-net-only-input.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/value-replaced-w-spaces-net-op-only-output.xlsx +0 -0
- package/test-files/adjacency-matrix-modifications/value-replaced/342/200/223w-spaces-net-only-output.xlsx +0 -0
- package/test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_estimation_output.xlsx +0 -0
- package/test-files/demo-files/15-genes_28-edges_db5_Dahlquist-data_input.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_correct_numbering.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_different_number_of_columns.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_empty_column.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_empty_row.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_erroneous_data.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_extra_gene_name.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_incorrectly_ordered_time_points.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_mismatched_case_gene_names.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_mismatched_gene_names.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_missing_column_header.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_missing_data_error.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_missing_data_ok.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_missing_data_ok_export_exact.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_missing_gene_name.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_name_not_in_optparams.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_name_not_present.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_negative_time_points.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_non_numerical_time_points.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_not_existing.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_wrong_id_label.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_wrong_order_gene_names.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_wrong_sheet_name_case.xlsx +0 -0
- package/test-files/expression-data-test-sheets/expression_sheet_wrong_sheet_name_convention.xlsx +0 -0
- package/test-files/gene-name-modifications/NaN-as-gene-name-input.xlsx +0 -0
- package/test-files/gene-name-modifications/NaN-as-gene-name-output.xlsx +0 -0
- package/test-files/gene-name-modifications/mismatched-case-related-input.xlsx +0 -0
- package/test-files/gene-name-modifications/mismatched-case-related-output.xlsx +0 -0
- package/test-files/gene-name-modifications/mismatched-case-unrelated-input.xlsx +0 -0
- package/test-files/gene-name-modifications/mismatched-case-unrelated-output.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/{80-genes-0-edges.xlsx → 134-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{45-genes-max-edges.xlsx → 44-source-genes-45-target-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{1-gene-0-edges.xlsx → unused-files/1-gene-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{1-gene-1-edges.xlsx → unused-files/1-gene-1-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{10-genes-50-edges.xlsx → unused-files/10-genes-50-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{10-genes-90-edges.xlsx → unused-files/10-genes-90-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{100-genes-0-edges.xlsx → unused-files/100-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{110-genes-0-edges.xlsx → unused-files/110-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{120-genes-0-edges.xlsx → unused-files/120-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{130-genes-0-edges.xlsx → unused-files/130-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{140-genes-0-edges.xlsx → unused-files/140-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{150-genes-10000-edges.xlsx → unused-files/150-genes-10000-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{150-genes-20000-edges.xlsx → unused-files/150-genes-20000-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{150-genes-max-edges.xlsx → unused-files/150-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{160-genes-max-edges.xlsx → unused-files/160-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{20-genes-max-edges.xlsx → unused-files/20-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{25-genes-max-edges.xlsx → unused-files/25-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{30-genes-max-edges.xlsx → unused-files/30-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{34-genes-0-edges.xlsx → unused-files/34-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{34-genes-40-edges.xlsx → unused-files/34-genes-40-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{34-genes-65-edges.xlsx → unused-files/34-genes-65-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{34-genes-90-edges.xlsx → unused-files/34-genes-90-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{5-genes-max-edges.xlsx → unused-files/5-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{51-genes-max-edges.xlsx → unused-files/51-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{52-genes-max-edges.xlsx → unused-files/52-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{55-genes-0-edges.xlsx → unused-files/55-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{55-genes-max-edges.xlsx → unused-files/55-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{65-genes-0-edges.xlsx → unused-files/65-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{7-genes-max-edges.xlsx → unused-files/7-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{70-genes-0-edges.xlsx → unused-files/70-genes-0-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{9-genes-max-edges.xlsx → unused-files/9-genes-max-edges.xlsx} +0 -0
- package/test-files/graph-tests/different-sized-networks/{90-genes-0-edges.xlsx → unused-files/90-genes-0-edges.xlsx} +0 -0
- 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
- package/test-files/node-tests/long-gene-name-no-spaces-first.xlsx +0 -0
- package/test-files/node-tests/long-gene-name-no-spaces-second.xlsx +0 -0
- package/test-files/node-tests/long-gene-name-spaces.xlsx +0 -0
- package/test-files/species-test-data/15-genes_28-edges_db5_Dahlquist-data_input_no-species.xlsx +0 -0
- package/test-files/species-test-data/15-genes_28-edges_db5_Dahlquist-data_input_with-species.xlsx +0 -0
- package/test-files/species-test-data/3-gene_7-edge_elegans.xlsx +0 -0
- package/test-files/species-test-data/3-gene_7-edge_melanogaster.xlsx +0 -0
- package/test-files/species-test-data/3-gene_7-edge_musculus.xlsx +0 -0
- package/test-files/species-test-data/3-gene_7-edge_sapiens.xlsx +0 -0
- package/test-files/species-test-data/kev-fake-data-sapiens-no-exp-data.xlsx +0 -0
- package/test-files/spreadsheet-controller-test-files/sheet-name-capitalized-network-optimized-weights.xlsx +0 -0
- package/test-files/spreadsheet-controller-test-files/sheet-name-capitalized-network.xlsx +0 -0
- package/web-client/app.js +1 -1
- package/web-client/controllers/main.js +1 -1
- package/web-client/public/favicon.ico +0 -0
- package/web-client/public/gene/api.js +76 -14
- package/web-client/public/gene/info.js +19 -8
- package/web-client/public/js/api/grnsight-api.js +124 -0
- package/web-client/public/js/constants.js +90 -17
- package/web-client/public/js/createNetwork.js +195 -0
- package/web-client/public/js/graph-statistics.js +7 -7
- package/web-client/public/js/graph.js +369 -324
- package/web-client/public/js/grnsight.js +2 -2
- package/web-client/public/js/grnsight.min.js +128 -59
- package/web-client/public/js/grnstate.js +54 -30
- package/web-client/public/js/iframe-coordination.js +55 -0
- package/web-client/public/js/setup-handlers.js +358 -18
- package/web-client/public/js/setup-load-and-import-handlers.js +105 -66
- package/web-client/public/js/update-app.js +483 -93
- package/web-client/public/js/upload.js +349 -32
- package/web-client/public/js/warnings.js +13 -51
- package/web-client/public/lib/iframeSizer.contentWindow.min.js +10 -0
- package/web-client/public/stylesheets/grnsight.styl +323 -28
- package/web-client/views/components/demo.pug +10 -0
- package/web-client/views/{graph.jade → graph.pug} +0 -0
- package/web-client/views/{info.jade → info.pug} +1 -5
- package/web-client/views/upload.pug +580 -0
- package/_gh_pages/Gemfile +0 -7
- package/_gh_pages/Gemfile.lock +0 -129
- package/documents/SDF/CMSI_402/spring_2014/Southwick_CMSI402_Spring2014_software-development-plan.md +0 -71
- package/documents/SDF/CMSI_402/spring_2014/Southwick_CMSI402_Spring2014_software-requirements-specification.md +0 -71
- package/documents/SDF/CMSI_402/spring_2014/use-case-diagram-spring-2014.jpg +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Anguiano_402_Final_Presentation.pptx +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Anguiano_402_Presentation_Final_Poster.pdf +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_project-proposal-presentation.pptx +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_project-proposal.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_software-development-plan.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Anguiano_CMSI402_Spring2017_software-requirements-specification.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2017/Design Review Presentation.pptx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/0402report.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/0409report.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/402-gantt.png +0 -0
- package/documents/SDF/CMSI_402/spring_2018/402SRS_GRNSightFeedback01.txt +0 -28
- package/documents/SDF/CMSI_402/spring_2018/402_SPD.md +0 -223
- package/documents/SDF/CMSI_402/spring_2018/ChoeShinCMSI402_Final.pptx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/ProjectProposal.md +0 -22
- package/documents/SDF/CMSI_402/spring_2018/SoftwareRequirementsSpecification.md +0 -88
- package/documents/SDF/CMSI_402/spring_2018/homework/choe_eileen/Choe_Eileen_CMSI 402_HW1.pdf +0 -0
- package/documents/SDF/CMSI_402/spring_2018/homework/choe_eileen/Choe_Eileen_CMSI402_HW2.pdf +0 -0
- package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/402hw2.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/Jen - 402Hw1.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/homework/shin_jen/Jen - hw3.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/writtenStatusReport.docx +0 -0
- package/documents/SDF/CMSI_402/spring_2018/writtenStatusReport4 +0 -0
- package/documents/abstracts/Anguiano_Varshneya_Undergraduate-Research-Symposium_2017_abstract.pdf +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/ACM-Reference-Format.bst +0 -3478
- package/documents/abstracts/SIGGRAPH 2017 Abstract/Figure1_zoom100.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/acmart.cls +0 -2352
- package/documents/abstracts/SIGGRAPH 2017 Abstract/acmart.ins +0 -29
- package/documents/abstracts/SIGGRAPH 2017 Abstract/always-weights.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/auto.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/networkA.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/networkB-normalized.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/networkB.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/never-weights.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/screenshot.jpg +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/screenshot3x2.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/representative-image/withweights3x2.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/screenshot-auto.png +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.bib +0 -85
- package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.pdf +0 -0
- package/documents/abstracts/SIGGRAPH 2017 Abstract/siggraph-abstract-review.tex +0 -235
- package/documents/abstracts/SWE Collegiate Competition 2017.md +0 -9
- package/documents/abstracts/Samdarshi_GRNsight_SoCalSysBio_Abstract_2019.docx +0 -0
- package/documents/abstracts/Varshneya_Samdarshi_Southern-California-Systems-Biology_2017_abstract.docx +0 -0
- package/documents/abstracts/~$mdarshi_SoCalSysBio_Abstract_2019.docx +0 -0
- package/documents/developer_documents/State Diagram.graphml +0 -3525
- package/documents/developer_documents/graphml/State Diagram.graphml +0 -3115
- package/documents/developer_documents/older_versions/GRNsight State Diagram old.png +0 -0
- package/documents/developer_documents/older_versions/GRNsight State Diagram.png +0 -0
- package/documents/developer_documents/testing_script_generator/GRNsightTestingDocument.md +0 -998
- package/documents/developer_documents/testing_script_generator/featureList.json +0 -496
- package/documents/developer_documents/testing_script_generator/testing-script-generator.js +0 -149
- package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_conference-presentations_2016.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_Table1.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_references.rtf +0 -264
- package/documents/manuscripts/peerj-computerscience-2016/GRNsight_PeerJ-CS_manuscript_2016_text-only.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/21-genes_31-edges_Schade-data_for-screenshots.xlsx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.jpg +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.png +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom100.psd +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.jpg +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.png +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145.psd +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure1_zoom145_900pix-wide.psd +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.jpg +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.png +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom100.psd +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.jpg +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.png +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145.psd +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure2_zoom145_900pix-wide.psd +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5A.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5B.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5C.eps +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5D.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5E.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5F.eps +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/other-versions/Figure5_compiled.png +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure3_GRNsight-Architecture.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure4_GRNsight-Screenshot.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/figures/submitted-versions/Figure5_compiled.pdf +12 -5383
- package/documents/manuscripts/peerj-computerscience-2016/peerj-reviewing-10823-v0.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_conference-presentations_2016_revised.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter-and-response_2016.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter_2016.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_cover-letter_2016.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_Table1.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_references_revised.rtf +0 -385
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_manuscript_2016_text-only_revised_marked.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_response-to-reviewers_2016.docx +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/GRNsight_PeerJ-CS_response-to-reviewers_2016.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure3_GRNsight-Architecture.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure4_GRNsight-Screenshot-auto.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/figures/Figure4_GRNsight-Screenshot.pdf +0 -0
- package/documents/manuscripts/peerj-computerscience-2016/revisions/peerj-reviewing-10823-v1.pdf +0 -0
- package/documents/posters/Anguiano_CMSI402_2017.pptx +0 -0
- package/documents/posters/Anguiano_Varshneya_LMU-Symposium_2015.pptx +0 -0
- package/documents/posters/Anguiano_Varshneya_SCCUR_2014.pptx +0 -0
- package/documents/posters/Choe_Shin_CMSI402_2018.pptx +0 -0
- package/documents/posters/Dahlquist-et-al_BOSC_ISMB_2016_poster.pptx +0 -0
- package/documents/posters/Lopez_Filler_LMU_Symposium_2019.pdf +0 -0
- package/documents/posters/Lopez_Filler_LMU_Symposium_2019.pptx +0 -0
- package/documents/posters/Samdarshi-et-al_LMU-Symposium_2017.pptx +0 -0
- package/documents/posters/Samdarshi-et-al_LMU-Symposium_2018.pptx +0 -0
- package/documents/posters/Samdarshi-et-al_SoCalSysBio_2019.pptx +0 -0
- package/documents/posters/Shin-et-al_SCCUR_2017.pptx +0 -0
- package/documents/posters/Southwick_CMSI402_2014.pptx +0 -0
- package/documents/posters/Varshneya_Samdarshi_LMU-Symposium_2016.pptx +0 -0
- package/documents/posters/Varshneya_Samdarshi_SoCalSysBio_2017.pptx +0 -0
- package/documents/presentations/Anguiano_402_Final_Presentation.pptx +0 -0
- package/documents/presentations/Choe_SWERapidFire2017_final.pptx +0 -0
- package/documents/presentations/Dahlquist_BOSC_20160709.pptx +0 -0
- package/documents/presentations/Dahlquist_ExperimentalBiology_20160404_talk.pptx +0 -0
- package/documents/presentations/Dahlquist_SoCalSysBio_20150131_talk.pptx +0 -0
- package/documents/presentations/Samdarshi_LMU-Symposium_20190323_talk.pdf +0 -0
- package/documents/presentations/Samdarshi_LMU-Symposium_20190323_talk.pptx +0 -0
- package/documents/presentations/Southwick_Anguiano_LMU-Symposium_20140329_talk.pptx +0 -0
- package/documents/presentations/Southwick_CMSI402_Presentation_20140508_talk.pptx +0 -0
- package/documents/presentations/Varshneya_Anguiano_LMU-Symposium_201703_talk.pptx +0 -0
- package/documents/reports/Samdarshi_Mihir_2019/Samdarshi_2019_Final.docx +0 -0
- package/documents/reports/Samdarshi_Mihir_2019/Samdarshi_Mihir_2019_AnnotatedBibliography.docx +0 -0
- package/documents/reports/Samdarshi_Mihir_2019/Samdarshi_Mihir_2019_Outline.docx +0 -0
- package/documents/reports/Samdarshi_Mihir_2019/~$mdarshi_2019_Draft.docx +0 -0
- package/documents/reports/Samdarshi_Mihir_2019/~$mdarshi_2019_Final_Paper_Draft.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201701-AnnotatedBibliography.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201702-Introduction.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201702-Outline.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201703-Discussion.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201703-MMResults.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201704-Draft-1.docx +0 -0
- package/documents/reports/Varshneya_Anu_2017/Varshneya-201704-Final.docx +0 -0
- package/onlysidebar.html +0 -8
- package/test/graph-library-tests.js +0 -165
- package/test-files/demo-files/21-genes_50-edges_Dahlquist-data_estimation_output.xlsx +0 -0
- package/test-files/demo-files/21-genes_50-edges_Dahlquist-data_input.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/10-genes-max-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/12-genes-max-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/35-genes-max-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/40-genes-0-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/40-genes-max-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/42-genes-max-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/50-genes-max-edges.xlsx +0 -0
- package/test-files/graph-tests/different-sized-networks/75-genes-150-edges.xlsx +0 -0
- package/web-client/public/js/container.js +0 -121
- 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
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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 (
|
|
194
|
-
var warningsCount =
|
|
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(
|
|
54
|
+
addMessageToArray(workbook.warnings, message);
|
|
198
55
|
} else {
|
|
199
|
-
addMessageToArray(
|
|
56
|
+
addMessageToArray(workbook.errors, constants.errors.warningsCountError);
|
|
200
57
|
return false;
|
|
201
58
|
}
|
|
202
59
|
};
|
|
203
60
|
|
|
204
|
-
var addError = function (
|
|
205
|
-
var errorsCount =
|
|
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(
|
|
65
|
+
addMessageToArray(workbook.errors, message);
|
|
209
66
|
} else {
|
|
210
|
-
addMessageToArray(
|
|
67
|
+
addMessageToArray(workbook.errors, constants.errors.errorsCountError);
|
|
211
68
|
return false;
|
|
212
69
|
}
|
|
213
70
|
};
|
|
214
71
|
|
|
215
|
-
var
|
|
216
|
-
|
|
217
|
-
for (
|
|
218
|
-
if (
|
|
219
|
-
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
|
231
|
-
var
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
var
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
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
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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
|
-
|
|
416
|
-
|
|
178
|
+
if (additionalData.meta2.warnings !== undefined) {
|
|
179
|
+
additionalData.meta2.warnings.forEach(data => workbook.warnings.push(data));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
417
182
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
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
|
-
|
|
443
|
-
var additionalData = parseAdditionalSheets(sheet);
|
|
444
|
-
Object.assign(network, additionalData);
|
|
288
|
+
var workbook = crossSheetInteractions(sheet);
|
|
445
289
|
|
|
446
|
-
return
|
|
447
|
-
// If all looks well, return the
|
|
448
|
-
|
|
449
|
-
// If all does not look well, return the
|
|
450
|
-
|
|
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 (
|
|
297
|
+
var grnSightToCytoscape = function (workbook) {
|
|
454
298
|
var result = [];
|
|
455
|
-
|
|
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
|
-
|
|
464
|
-
var sourceGene =
|
|
465
|
-
var targetGene =
|
|
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(
|
|
323
|
+
var graphStatisticsReport = function(workbook) {
|
|
480
324
|
var betweennessCentrality = [];
|
|
481
325
|
var shortestPath = [];
|
|
482
|
-
var cytoscapeElements = grnSightToCytoscape(
|
|
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:
|
|
493
|
-
betweennessCentrality: bc.betweenness("#" +
|
|
334
|
+
gene: workbook.genes[i],
|
|
335
|
+
betweennessCentrality: bc.betweenness("#" + workbook.genes[i].name, null, true)
|
|
494
336
|
});
|
|
495
|
-
|
|
496
|
-
var
|
|
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:
|
|
340
|
+
source: workbook.genes[i].name,
|
|
501
341
|
pathData: {
|
|
502
|
-
target:
|
|
503
|
-
shortestPath: dijkstra.distanceTo("#" +
|
|
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
|
-
|
|
521
|
-
|
|
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(
|
|
534
|
-
|
|
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
|
-
|
|
537
|
-
using the importer under File > Import." +
|
|
538
|
-
|
|
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
|
|
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
|
|
552
|
-
|
|
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
|
|
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
|
|
561
|
-
|
|
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
|
|
416
|
+
// exporting parseNetworkSheet for use in testing. Do not remove!
|
|
566
417
|
return {
|
|
567
|
-
|
|
568
|
-
|
|
418
|
+
grnSightToCytoscape: grnSightToCytoscape,
|
|
419
|
+
processGRNmap: processGRNmap,
|
|
420
|
+
crossSheetInteractions: crossSheetInteractions,
|
|
569
421
|
};
|
|
570
422
|
};
|