├── .Rhistory ├── minerva_analysis ├── test.py ├── client │ ├── .gitignore │ ├── src │ │ ├── js │ │ │ ├── services │ │ │ │ ├── passVariablesToFrontend.js │ │ │ │ ├── simpleEventHandler.js │ │ │ │ ├── colorScheme.js │ │ │ │ └── numericData.js │ │ │ ├── vendor.js │ │ │ ├── views │ │ │ │ └── lensingFilters │ │ │ │ │ ├── lfDataColors.js │ │ │ │ │ └── lfSegmentationOutlines.js │ │ │ └── main.js │ │ ├── img │ │ │ ├── logl.ai │ │ │ ├── logo_with_text.ai │ │ │ ├── logo.svg │ │ │ └── logo_with_text.svg │ │ ├── shaders │ │ │ └── vert.glsl │ │ └── css │ │ │ ├── lensing.css │ │ │ ├── gating.css │ │ │ └── viewer.css │ ├── test │ │ ├── fixtures │ │ │ ├── passVariablesToFrontend.js │ │ │ ├── context.html │ │ │ └── main.html │ │ ├── data │ │ │ ├── 1024x1024_logo.png │ │ │ ├── 1024x1024_clear.png │ │ │ ├── cell_hoechst.bin.gz │ │ │ ├── 1024x1024_not_clear.png │ │ │ ├── cell_id_center.bin.gz │ │ │ ├── get_channel_names │ │ │ │ └── short.json │ │ │ ├── formData │ │ │ │ ├── download_channels.json │ │ │ │ ├── gated_cell_encodings.json │ │ │ │ └── gated_channel_ranges.json │ │ │ ├── get_gating_gmm │ │ │ │ └── Hoechst0.json │ │ │ ├── config.json │ │ │ └── get_channel_gmm │ │ │ │ └── Hoechst0.json │ │ ├── tsconfig.json │ │ └── globals │ │ │ └── set_globals.js │ ├── external │ │ └── openseadragon-bin-2.4.0 │ │ │ ├── images │ │ │ ├── flip_rest.png │ │ │ ├── home_rest.png │ │ │ ├── next_rest.png │ │ │ ├── button_rest.png │ │ │ ├── flip_hover.png │ │ │ ├── home_hover.png │ │ │ ├── next_hover.png │ │ │ ├── zoomin_rest.png │ │ │ ├── button_hover.png │ │ │ ├── button_pressed.png │ │ │ ├── flip_pressed.png │ │ │ ├── fullpage_hover.png │ │ │ ├── fullpage_rest.png │ │ │ ├── home_pressed.png │ │ │ ├── next_pressed.png │ │ │ ├── previous_hover.png │ │ │ ├── previous_rest.png │ │ │ ├── zoomin_hover.png │ │ │ ├── zoomin_pressed.png │ │ │ ├── zoomout_hover.png │ │ │ ├── zoomout_rest.png │ │ │ ├── flip_grouphover.png │ │ │ ├── fullpage_pressed.png │ │ │ ├── home_grouphover.png │ │ │ ├── next_grouphover.png │ │ │ ├── previous_pressed.png │ │ │ ├── rotateleft_hover.png │ │ │ ├── rotateleft_rest.png │ │ │ ├── rotateright_rest.png │ │ │ ├── zoomout_pressed.png │ │ │ ├── button_grouphover.png │ │ │ ├── fullpage_grouphover.png │ │ │ ├── previous_grouphover.png │ │ │ ├── rotateleft_pressed.png │ │ │ ├── rotateright_hover.png │ │ │ ├── rotateright_pressed.png │ │ │ ├── zoomin_grouphover.png │ │ │ ├── zoomout_grouphover.png │ │ │ ├── rotateleft_grouphover.png │ │ │ └── rotateright_grouphover.png │ │ │ ├── openseadragon-flat-toolbar-icons-master │ │ │ ├── Photoshop │ │ │ │ ├── home.psd │ │ │ │ ├── next.psd │ │ │ │ ├── zoom.psd │ │ │ │ ├── Toolbar.png │ │ │ │ ├── fullpage.psd │ │ │ │ ├── previous.psd │ │ │ │ ├── rotateleft.psd │ │ │ │ └── rotateright.psd │ │ │ ├── images │ │ │ │ ├── home_rest.png │ │ │ │ ├── next_rest.png │ │ │ │ ├── home_hover.png │ │ │ │ ├── next_hover.png │ │ │ │ ├── zoomin_rest.png │ │ │ │ ├── fullpage_hover.png │ │ │ │ ├── fullpage_rest.png │ │ │ │ ├── home_pressed.png │ │ │ │ ├── next_pressed.png │ │ │ │ ├── previous_hover.png │ │ │ │ ├── previous_rest.png │ │ │ │ ├── zoomin_hover.png │ │ │ │ ├── zoomin_pressed.png │ │ │ │ ├── zoomout_hover.png │ │ │ │ ├── zoomout_rest.png │ │ │ │ ├── fullpage_pressed.png │ │ │ │ ├── home_grouphover.png │ │ │ │ ├── next_grouphover.png │ │ │ │ ├── previous_pressed.png │ │ │ │ ├── rotateleft_hover.png │ │ │ │ ├── rotateleft_rest.png │ │ │ │ ├── rotateright_rest.png │ │ │ │ ├── zoomout_pressed.png │ │ │ │ ├── fullpage_grouphover.png │ │ │ │ ├── previous_grouphover.png │ │ │ │ ├── rotateleft_pressed.png │ │ │ │ ├── rotateright_hover.png │ │ │ │ ├── rotateright_pressed.png │ │ │ │ ├── zoomin_grouphover.png │ │ │ │ ├── zoomout_grouphover.png │ │ │ │ ├── rotateleft_grouphover.png │ │ │ │ └── rotateright_grouphover.png │ │ │ ├── .gitattributes │ │ │ ├── README.md │ │ │ └── LICENSE.txt │ │ │ ├── openseadragonrgb.js │ │ │ ├── LICENSE.txt │ │ │ ├── openseadragon-svg-overlay.js │ │ │ ├── openSeadragonGL.js │ │ │ ├── canvas-overlay-hd.js │ │ │ └── viaWebGL.js │ ├── dist │ │ ├── 713c134ff47cd328a5b711526f151082.svg │ │ ├── 693b935cb1f907814be9c6199a68c217.svg │ │ └── ff743f408972e0e96ca9153ed5ae4c83.svg │ ├── webpack.config.js │ ├── package.json │ ├── templates │ │ ├── channel_match.html │ │ ├── base.html │ │ ├── index.html │ │ └── upload.html │ └── karma.conf.js ├── server │ ├── utils │ │ ├── addHEColumns.py │ │ ├── mostFrequentLongestSubstring.py │ │ ├── fullConversion.py │ │ ├── pre_normalization.py │ │ ├── smallestenclosingcircle.py │ │ └── pyramid_upgrade.py │ ├── routes │ │ └── page_routes.py │ └── models │ │ └── database_model.py └── __init__.py ├── .flaskenv ├── icon.ico ├── requirements.yml ├── package_win.bat ├── Dockerfile ├── package_mac.sh ├── .gitignore ├── run.py ├── LICENSE ├── .github └── workflows │ ├── dockerhub.yml │ └── release.yml ├── minerva_analysis_mac.spec └── README.md /.Rhistory: -------------------------------------------------------------------------------- 1 | q() 2 | -------------------------------------------------------------------------------- /minerva_analysis/test.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.flaskenv: -------------------------------------------------------------------------------- 1 | FLASK_APP=app.py 2 | FLASK_ENV=development 3 | FLASK_RUN_PORT=5005 -------------------------------------------------------------------------------- /icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/icon.ico -------------------------------------------------------------------------------- /minerva_analysis/client/.gitignore: -------------------------------------------------------------------------------- 1 | coverage/ 2 | .editorconfig 3 | .eslintignore 4 | .eslintrc.json 5 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/services/passVariablesToFrontend.js: -------------------------------------------------------------------------------- 1 | function passVariablesToFrontend(vars) { 2 | return vars 3 | } -------------------------------------------------------------------------------- /minerva_analysis/client/test/fixtures/passVariablesToFrontend.js: -------------------------------------------------------------------------------- 1 | const flaskVariables = { 2 | datasource: "karma-test" 3 | } 4 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/img/logl.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/src/img/logl.ai -------------------------------------------------------------------------------- /minerva_analysis/client/src/img/logo_with_text.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/src/img/logo_with_text.ai -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/1024x1024_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/test/data/1024x1024_logo.png -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/1024x1024_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/test/data/1024x1024_clear.png -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/cell_hoechst.bin.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/test/data/cell_hoechst.bin.gz -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/1024x1024_not_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/test/data/1024x1024_not_clear.png -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/cell_id_center.bin.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/test/data/cell_id_center.bin.gz -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/flip_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/home_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/next_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/button_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/fullpage_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/previous_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomin_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/zoomout_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateleft_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/images/rotateright_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/home.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/home.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/next.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/next.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/zoom.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/zoom.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/Toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/Toolbar.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/fullpage.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/fullpage.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/previous.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/previous.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/src/shaders/vert.glsl: -------------------------------------------------------------------------------- 1 | #version 300 es 2 | in vec2 a_uv; 3 | out vec2 uv; 4 | 5 | void main() { 6 | // Texture coordinates 7 | uv = a_uv; 8 | 9 | // Clip coordinates 10 | vec2 full_pos = 2. * a_uv - 1.; 11 | gl_Position = vec4(full_pos, 0., 1.); 12 | } 13 | -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateleft.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateleft.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateright.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateright.psd -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_rest.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_hover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_pressed.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_grouphover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/labsyspharm/minerva_analysis/HEAD/minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_grouphover.png -------------------------------------------------------------------------------- /minerva_analysis/client/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "target": "es6", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "noImplicitAny": false, 8 | "module": "commonjs", 9 | "strict": false, 10 | "noEmit": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /minerva_analysis/server/utils/addHEColumns.py: -------------------------------------------------------------------------------- 1 | #%% 2 | import pandas as pd 3 | 4 | data = pd.read_csv('./unmicst-WD-76845-097-ij_subtracted_50.csv', encoding="utf-8-sig") 5 | data.head() 6 | #%% 7 | data['HE_r'] = 0 8 | data['HE_g'] = 0 9 | data['HE_b'] = 0 10 | data.columns 11 | #%% 12 | data.to_csv('./unmicst-WD-76845-097-ij_subtracted_50-jj.csv', index=False) 13 | #%% 14 | -------------------------------------------------------------------------------- /minerva_analysis/client/test/globals/set_globals.js: -------------------------------------------------------------------------------- 1 | /* 2 | * This is an annendum to ../../src/js/main.js 3 | * This reassigns all defined global variables 4 | */ 5 | //EVENTHANDLER 6 | window.eventHandler = eventHandler; 7 | window.datasource = datasource; 8 | //VIEWS 9 | window.__minervaAnalysis = __minervaAnalysis; 10 | //DATA MANAGEMENT 11 | window.dataSrcIndex = dataSrcIndex; 12 | //CHANNELS 13 | window.imageChannels = imageChannels; 14 | window.imageChannelsIdx = imageChannelsIdx; 15 | -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/get_channel_names/short.json: -------------------------------------------------------------------------------- 1 | ["Hoechst0","AF488","AF555","AF647","Hoechst1","AF488","A555","A647","Hoechst2","anti_CD3","anti_NaKATPase","anti_CD45RO","Hoechst3","Ki67_488","Keratin_570","aSMA_660","Hoechst4","CD4_488","CD45_PE","PD1_647","Hoechst5","CD20_488","CD68_555","CD8a_660","Hoechst6","CD163_488","FOXP3_570","PDL1_647","Hoechst7","Ecad_488","Vimentin_555","CDX2_647","Hoechst8","LaminABC_488","Desmin_555","CD31_647","Hoechst9","PCNA_488","Ki67_570","CollagenIV_647","HE_r","HE_g","HE_b"] 2 | -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/README.md: -------------------------------------------------------------------------------- 1 | # OpenSeadragon Flat Toolbar Icons 2 | Simple, flat design toolbar icons for OpenSeadragon 3 | [https://github.com/openseadragon/openseadragon](https://github.com/openseadragon/openseadragon) 4 | 5 | Demo: 6 | [http://droneservices.getyournet.ch/beispiele-luftaufnahmen-mit-drohne](http://droneservices.getyournet.ch/beispiele-luftaufnahmen-mit-drohne) 7 | 8 |  9 | 10 | -------------------------------------------------------------------------------- /requirements.yml: -------------------------------------------------------------------------------- 1 | name: minerva_analysis 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | - appdirs 6 | - flask=2.2.2 7 | - flask-sqlalchemy=3.0.2 8 | - itsdangerous=2.1.2 9 | - jinja2 10 | - matplotlib 11 | - numpy 12 | - ome-types 13 | - orjson 14 | - pandas 15 | - pillow=8.1 16 | - pip 17 | - pyinstaller 18 | - python=3.9.15 19 | - requests 20 | - scikit-image 21 | - scikit-learn 22 | - scipy 23 | - tifffile=2021.4.8 24 | - waitress 25 | - werkzeug=2.2.2 26 | - zarr=2.10 27 | 28 | - pip: 29 | - opencv-python==4.7.0.68 30 | 31 | 32 | -------------------------------------------------------------------------------- /package_win.bat: -------------------------------------------------------------------------------- 1 | pyinstaller -F --paths $env:CONDA_PREFIX --add-data "minerva_analysis/client;minerva_analysis/client" --add-data "minerva_analysis/server;minerva_analysis/server" --add-data "%CONDA_PREFIX%/Lib/site-packages/xmlschema/schemas;xmlschema/schemas" --add-data "%CONDA_PREFIX%/Lib/site-packages/ome_types;ome_types" --hidden-import "scipy.spatial.transform._rotation_groups" --hidden-import cmath --hidden-import="sqlalchemy.sql.default_comparator" --hidden-import="sklearn.utils._typedefs" --hidden-import="sklearn.neighbors._partition_nodes" --hidden-import="sklearn.neighbors.ball_tree" --icon icon.ico --name minerva_analysis_windows run.py 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.7 2 | 3 | RUN apt-get update && \ 4 | apt-get install -y python3-opencv && \ 5 | rm -rf /var/lib/apt/lists/* 6 | 7 | RUN python -m pip install \ 8 | Flask==1.1.2 \ 9 | jinja2==3.0.3 \ 10 | werkzeug==2.0.3 \ 11 | itsdangerous==2.0.1 \ 12 | flask-sqlalchemy \ 13 | numpy \ 14 | opencv-python \ 15 | orjson \ 16 | pandas \ 17 | pillow==8.1.1 \ 18 | requests \ 19 | scikit-learn \ 20 | scikit-image \ 21 | scipy \ 22 | tifffile==2021.4.8 \ 23 | waitress \ 24 | zarr==2.10.3 \ 25 | ome-types \ 26 | opencv-python==4.5.3.56 27 | 28 | COPY . /app 29 | 30 | CMD ["python", "/app/run.py"] 31 | -------------------------------------------------------------------------------- /package_mac.sh: -------------------------------------------------------------------------------- 1 | pyinstaller -F --paths $CONDA_PREFIX --add-data "minerva_analysis/client:minerva_analysis/client" --add-data "minerva_analysis/__init__.py:minerva_analysis/" --add-data "minerva_analysis/server:minerva_analysis/server" --add-data "$CONDA_PREFIX/lib/python3.7/site-packages/xmlschema/schemas:xmlschema/schemas" --add-data "$CONDA_PREFIX/lib/python3.7/site-packages/ome_types:ome_types" --hidden-import "scipy.spatial.transform._rotation_groups" --hidden-import "sqlalchemy.sql.default_comparator" --hidden-import "sklearn.neighbors._partition_nodes" --hidden-import "sklearn.neighbors.ball_tree" --hidden-import "sklearn.utils._typedefs" --hidden-import cmath --name minerva_analysis_mac run.py 2 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/services/simpleEventHandler.js: -------------------------------------------------------------------------------- 1 | 2 | class SimpleEventHandler { 3 | 4 | constructor(subject) { 5 | this.subject = subject; 6 | this.eventListeners = []; 7 | } 8 | 9 | bind(eventNames, eventFunction) { 10 | for (const eventName of eventNames.split(' ')) { 11 | this.eventListeners.push({eventName, eventFunction}); 12 | const eventFunctionWrap = e => eventFunction(e.detail, e); 13 | this.subject.addEventListener(eventName, eventFunctionWrap, false); 14 | } 15 | } 16 | 17 | getListeners() { 18 | return this.eventListeners; 19 | } 20 | 21 | trigger(eventName, detail) { 22 | this.subject.dispatchEvent(new CustomEvent(eventName, {detail})); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | */node_modules 6 | static/frontend/node_modules 7 | minerva_analysis/client/node_modules/ 8 | /.pnp 9 | .pnp.js 10 | *.sqlite3 11 | */.ipynb_checkpoints/ 12 | minerva_analysis/data/ 13 | # testing 14 | /coverage 15 | /dist 16 | 17 | # production 18 | /build 19 | 20 | # misc 21 | .DS_Store 22 | .env.local 23 | .env.development.local 24 | .env.test.local 25 | .env.production.local 26 | 27 | npm-debug.log* 28 | yarn-debug.log* 29 | yarn-error.log* 30 | .idea/ 31 | /data 32 | /data/ 33 | minerva_analysis/data 34 | 35 | /minerva_analysis//data 36 | /static/data 37 | /static/data/ 38 | /__pycache__/ 39 | /__pycache__/* 40 | */__pycache__/* 41 | *__pycache__* 42 | *.pyc 43 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from waitress import serve 4 | 5 | from minerva_analysis import app 6 | 7 | if __name__ == '__main__': 8 | # use port 8000 if no port is specified via command line argument 9 | port = 8000 if len(sys.argv) < 2 or not str.isdigit(sys.argv[1]) else sys.argv[1] 10 | 11 | 12 | def str2bool(v): 13 | return v.lower() in ("yes", "true", "t", "1") 14 | 15 | 16 | if len(sys.argv) > 2 and str2bool(sys.argv[2]): 17 | is_docker = True 18 | else: 19 | is_docker = False 20 | app.config['IS_DOCKER'] = is_docker 21 | 22 | print('Serving on 0.0.0.0:' + str(port) + ' or http://localhost:' + str(port)) 23 | serve(app, host='0.0.0.0', port=port, max_request_body_size=1073741824000000, 24 | max_request_header_size=85899345920000) 25 | -------------------------------------------------------------------------------- /minerva_analysis/client/dist/713c134ff47cd328a5b711526f151082.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 18 | 19 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/services/colorScheme.js: -------------------------------------------------------------------------------- 1 | class ColorScheme { 2 | constructor(dataLayer) { 3 | this.dataLayer = dataLayer; 4 | this.colorMap = {}; 5 | } 6 | 7 | async init() { 8 | await this.getColorScheme(false); 9 | } 10 | 11 | async getColorScheme(refresh) { 12 | try { 13 | this.colorMap = await this.dataLayer.getColorScheme(refresh); 14 | // console.log("Loaded Color Scheme"); 15 | } catch (e) { 16 | console.log("Error Getting Color Palette", e) 17 | 18 | } 19 | } 20 | } 21 | 22 | // colorScheme.classColors = { 23 | // '-': '#ffa500', 24 | // 0: '#1f78b4', 25 | // 1: '#e31a1c', 26 | // 2: '#33a02c', 27 | // 3: '#6a3d9a', 28 | // 4: '#b15928', 29 | // 5: '#ffff99', 30 | // 6: '#a6cee3', 31 | // 7: '#b2df8a', 32 | // 8: '#fb9a99', 33 | // 9: '#cab2d6' 34 | // } 35 | // 36 | // colorScheme. 37 | // //colorScheme.classrColors = {'-' : [255,165,0], "0" : [141,211,199], "1" : [255,255,179], "2" : [190,186,218], "3": [251,128,114] } 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /minerva_analysis/client/dist/693b935cb1f907814be9c6199a68c217.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/vendor.js: -------------------------------------------------------------------------------- 1 | import {Buffer} from 'buffer/'; 2 | import {PNG} from 'pngjs' 3 | import 'popper.js' 4 | import 'jquery' 5 | import 'bootstrap' 6 | import 'bootstrap/dist/css/bootstrap.min.css'; 7 | import 'pngjs' 8 | import {regeneratorRuntime} from "regenerator-runtime"; 9 | import * as d3 from 'd3'; 10 | import {sliderBottom} from 'd3-simple-slider'; 11 | import 'lodash' 12 | import 'jquery-form' 13 | import '@fortawesome/fontawesome-free/js/all' 14 | import Sortable from 'sortablejs'; 15 | import Mark from 'mark.js' 16 | import $ from 'jquery' 17 | import 'node-fetch' 18 | import convert from 'color-convert' 19 | import 'viawebgl' 20 | import * as viaWebGL from 'viawebgl'; 21 | import {ViewerManager} from './views/viewerManager'; 22 | import Dropzone from 'dropzone'; 23 | 24 | window.convert = convert; 25 | window.$ = $; 26 | window.d3 = d3; 27 | window.d3.sliderBottom = sliderBottom; 28 | window.PNG = PNG; 29 | window.Buffer = Buffer; 30 | window.Sortable = Sortable; 31 | window.Mark = Mark; 32 | window.OpenSeadragon = viaWebGL.OpenSeadragon; 33 | window.Dropzone = Dropzone; 34 | window.viaWebGL = viaWebGL; 35 | window.ViewerManager = ViewerManager; 36 | 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Laboratory of Systems Pharmacology, Harvard Medical School 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /minerva_analysis/server/utils/mostFrequentLongestSubstring.py: -------------------------------------------------------------------------------- 1 | from itertools import combinations 2 | from difflib import SequenceMatcher 3 | 4 | 5 | def find_substring(header_list): 6 | substring_frequencies = {} 7 | for combo in combinations(header_list, 2): 8 | substring = longest_substring(combo[0], combo[1]) 9 | if substring in substring_frequencies: 10 | substring_frequencies[substring] += 1 11 | else: 12 | substring_frequencies[substring] = 1 13 | # return the most frequent substring between evey combination of strings 14 | return max(substring_frequencies, key=substring_frequencies.get) 15 | 16 | 17 | # via geeksforgeeks 18 | def longest_substring(str1, str2): 19 | # initialize SequenceMatcher object with 20 | # input string 21 | seqMatch = SequenceMatcher(None, str1, str2) 22 | 23 | # find match of longest sub-string 24 | # output will be like Match(a=0, b=0, size=5) 25 | match = seqMatch.find_longest_match(0, len(str1), 0, len(str2)) 26 | 27 | # print longest substring 28 | if (match.size != 0): 29 | return (str1[match.a: match.a + match.size]) 30 | else: 31 | return '' 32 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/css/lensing.css: -------------------------------------------------------------------------------- 1 | 2 | /* Bootstrap Overrides */ 3 | #topBar { 4 | padding: 0 16px; 5 | } 6 | 7 | #title { 8 | font-size: 16px; 9 | } 10 | 11 | #navbarDropdown, #navbarUpload { 12 | font-size: 16px; 13 | } 14 | 15 | #boxHeading1, #boxHeading2 { 16 | font-size: 13px; 17 | } 18 | 19 | #boxChannels1A, #boxChannels1B { 20 | font-size: 10px; 21 | } 22 | 23 | #container, #row, #lowRow, #lowRow div, #channel_list_wrapper, #openseadragon_wrapper { 24 | border: 0; 25 | box-sizing: border-box; 26 | margin: 0; 27 | padding: 0; 28 | } 29 | 30 | #container { 31 | width: 100vw; 32 | max-width: 100vw; 33 | } 34 | 35 | #row { 36 | padding: 0 16px; 37 | width: 100%; 38 | } 39 | 40 | #channel_list_wrapper, #openseadragon_wrapper { 41 | height: 87.5vh; 42 | min-height: 570px; 43 | } 44 | 45 | #channel_list_wrapper { 46 | padding: 0 6px 0 0; 47 | max-width: 20%; 48 | min-width: 20%; 49 | width: 20%; 50 | } 51 | 52 | #openseadragon_wrapper { 53 | padding: 0 0 0 6px; 54 | max-width: 80%; 55 | min-width: 80%; 56 | width: 80%; 57 | } 58 | 59 | #openseadragon, #channel_list { 60 | height: 100%; 61 | width: 100%; 62 | } -------------------------------------------------------------------------------- /minerva_analysis/server/routes/page_routes.py: -------------------------------------------------------------------------------- 1 | from minerva_analysis import app, get_config_names 2 | from flask import render_template, send_from_directory 3 | from pathlib import Path 4 | import json 5 | import os 6 | 7 | 8 | @app.route("/") 9 | def my_index(): 10 | return render_template("index.html", data={'datasource': '', 'datasources': get_config_names(), 11 | 'is_docker': app.config['IS_DOCKER']}) 12 | 13 | 14 | @app.route('/') 15 | def image_viewer(datasource): 16 | datasources = get_config_names() 17 | if datasource not in datasources: 18 | datasource = '' 19 | return render_template('index.html', data={'datasource': datasource, 'datasources': datasources, 20 | 'is_docker': app.config['IS_DOCKER']}) 21 | 22 | 23 | 24 | @app.route("/upload_page") 25 | def upload_page(): 26 | return render_template("upload.html", data={'datasource': '', 'datasources': get_config_names(), 27 | 'is_docker': app.config['IS_DOCKER']}) 28 | 29 | 30 | 31 | 32 | @app.route('/client/') 33 | def serveClient(filename): 34 | return send_from_directory(app.config['CLIENT_PATH'], filename, conditional=True) 35 | -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragonrgb.js: -------------------------------------------------------------------------------- 1 | !function(e){"use strict";function t(e){this.onCanvasHover(this.getValueAt(e.position))}if(!e.version||e.version.major<2)throw new Error("This version of OpenSeadragonRGB requires OpenSeadragon version 2.0.0+");e.Viewer.prototype.rgb=function(t){return(!this.rgbInstance||t)&&(t=t||{},t.viewer=this,this.rgbInstance=new e.RGB(t)),this.rgbInstance},e.RGB=function(n){e.extend(!0,this,{viewer:null,onCanvasHover:null},n),this.onCanvasHover&&(this.tracker=new e.MouseTracker({element:this.viewer.canvas,moveHandler:e.delegate(this,t)}))},e.extend(e.RGB.prototype,e.ControlDock.prototype,{getValueAt:function(t,n){var r=1===arguments.length?t:new e.Point(t,n),o=this.viewer,i=o.drawer.getRgbAt(r);if(i)for(var a,s,g,v=0;v=0&&s.y>=0&&s.x<=g.x&&s.y<=g.y&&(i.image=a,i.imageCoordinates=s);return i}}),e.Drawer.prototype.getRgbAt=function(t){if(!this.useCanvas)return!1;var n=e.pixelDensityRatio,r=this._getContext().getImageData(t.x*n,t.y*n,1,1).data;return{r:r[0],g:r[1],b:r[2],a:r[3]}}}(OpenSeadragon); 2 | //# sourceMappingURL=openseadragonrgb.js.map 3 | -------------------------------------------------------------------------------- /.github/workflows/dockerhub.yml: -------------------------------------------------------------------------------- 1 | name: dockerhub 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | jobs: 9 | docker: 10 | if: github.repository != 'labsyspharm/minerva_analysis' 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Branch name 14 | id: branch_name 15 | run: | 16 | echo ::set-output name=SOURCE_BRANCH::${GITHUB_REF#refs/heads/} 17 | echo ::set-output name=SOURCE_TAG::${GITHUB_REF#refs/tags/} 18 | - name: Clean up the release tag test 19 | id: cleantag 20 | run: | 21 | tag=$(echo ${{ steps.branch_name.outputs.SOURCE_TAG }} | tr -d v) 22 | echo "::set-output name=tag::${{ github.repository }}:${tag%"_gating"}" 23 | - name: Set up QEMU 24 | uses: docker/setup-qemu-action@v1 25 | - name: Set up Docker Buildx 26 | uses: docker/setup-buildx-action@v1 27 | - name: Login to DockerHub 28 | uses: docker/login-action@v1 29 | with: 30 | username: ${{ secrets.DOCKERHUB_USERNAME }} 31 | password: ${{ secrets.DOCKERHUB_TOKEN }} 32 | - name: Build and push 33 | id: docker_build 34 | uses: docker/build-push-action@v2 35 | with: 36 | push: true 37 | tags: ${{steps.cleantag.outputs.tag}} 38 | - name: Image digest 39 | run: echo ${{ steps.docker_build.outputs.digest }} -------------------------------------------------------------------------------- /minerva_analysis_mac.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | 4 | block_cipher = None 5 | 6 | 7 | a = Analysis(['run.py'], 8 | pathex=['/opt/homebrew/anaconda3/envs/viewer', '/Users/swarchol/Research/minerva_analysis'], 9 | binaries=[], 10 | datas=[('minerva_analysis/client', 'minerva_analysis/client'), ('minerva_analysis/__init__.py', 'minerva_analysis/'), ('minerva_analysis/server', 'minerva_analysis/server'), ('/opt/homebrew/anaconda3/envs/viewer/lib/python3.7/site-packages/xmlschema/schemas', 'xmlschema/schemas')], 11 | hiddenimports=['scipy.spatial.transform._rotation_groups', 'sqlalchemy.sql.default_comparator', 'cmath'], 12 | hookspath=[], 13 | hooksconfig={}, 14 | runtime_hooks=[], 15 | excludes=[], 16 | win_no_prefer_redirects=False, 17 | win_private_assemblies=False, 18 | cipher=block_cipher, 19 | noarchive=False) 20 | pyz = PYZ(a.pure, a.zipped_data, 21 | cipher=block_cipher) 22 | 23 | exe = EXE(pyz, 24 | a.scripts, 25 | a.binaries, 26 | a.zipfiles, 27 | a.datas, 28 | [], 29 | name='minerva_analysis_mac', 30 | debug=False, 31 | bootloader_ignore_signals=False, 32 | strip=False, 33 | upx=True, 34 | upx_exclude=[], 35 | runtime_tmpdir=None, 36 | console=True, 37 | disable_windowed_traceback=False, 38 | target_arch=None, 39 | codesign_identity=None, 40 | entitlements_file=None ) 41 | -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) 2009 CodePlex Foundation 2 | Copyright (C) 2010-2013 OpenSeadragon contributors 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | - Redistributions of source code must retain the above copyright notice, 8 | this list of conditions and the following disclaimer. 9 | 10 | - Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | - Neither the name of CodePlex Foundation nor the names of its contributors 15 | may be used to endorse or promote products derived from this software 16 | without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. 29 | -------------------------------------------------------------------------------- /minerva_analysis/client/dist/ff743f408972e0e96ca9153ed5ae4c83.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 12 | 13 | 14 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/css/gating.css: -------------------------------------------------------------------------------- 1 | #csv_gating_list { 2 | width: 100%; 3 | height: 80vh; 4 | font-size: 10pt; 5 | overflow-y: auto; 6 | overflow-x: hidden; 7 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 8 | 9 | } 10 | 11 | .input{ 12 | font-size:8px; 13 | width:35px; 14 | margin-top:15px; 15 | border: 1px solid gray; 16 | box-sizing: border-box; 17 | } 18 | 19 | #csv_gating_list .list-group-item { 20 | padding: .20rem 0.5rem; 21 | border: 0; 22 | } 23 | 24 | #csv_gating_list .active { 25 | background-color: rgba(0, 0, 0, 0.75); 26 | border-top: 1px solid rgba(255, 255, 255, 0.5); 27 | border-right: none; 28 | border-bottom: 1px solid rgba(255, 255, 255, 0.5); 29 | border-left: none; 30 | height: 90px; 31 | } 32 | 33 | #csv_gating_list .list-group { 34 | border-radius: 0rem; 35 | } 36 | 37 | #openseadragon_loader, #channel_list_loader, #csv_gating_list_loader { 38 | margin-left: 33px; 39 | } 40 | 41 | .auto-btn { 42 | float: right; 43 | padding-top: 0; 44 | padding-bottom: 0; 45 | border: 1px; 46 | } 47 | 48 | .distribution_line { 49 | stroke: rgba(130, 130, 130, 0.5); 50 | stroke-width: 4px; 51 | fill: none; 52 | } 53 | 54 | .gmm_line { 55 | stroke-width: 1px; 56 | stroke-opacity: 0.75; 57 | fill: none; 58 | } 59 | 60 | line.track { 61 | stroke-width: 4px !important; 62 | } 63 | 64 | 65 | #drag-and-drop-text { 66 | font-size: 30pt; 67 | text-align: center; 68 | } 69 | 70 | #drag-and-drop-info { 71 | display: none; 72 | } 73 | 74 | .dz-preview, .dz-file-preview { 75 | display: none; 76 | } 77 | 78 | #channels_arrow-upload-form, #channels_arrow-upload-form * { 79 | display: none 80 | } 81 | 82 | #arrow-upload-form, #arrow-upload-form * { 83 | display: none 84 | } 85 | -------------------------------------------------------------------------------- /minerva_analysis/client/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | 3 | module.exports = { 4 | mode: 'development', 5 | entry: { 6 | vendor: './src/js/vendor.js' 7 | }, 8 | output: { 9 | filename: '[name]_bundle.js' 10 | }, 11 | node: { 12 | fs: 'empty' 13 | }, 14 | module: { 15 | rules: [ 16 | { 17 | test: /\.css$/, 18 | use: [ 19 | 'style-loader', 20 | 'css-loader' 21 | ] 22 | }, 23 | { 24 | test: /\.(png|svg|jpg|gif|dzi)$/, 25 | use: [ 26 | 'file-loader', 27 | ], 28 | }, 29 | { 30 | test: /\.ts$/, 31 | exclude: /(node_modules|bower_components)/, 32 | use: { 33 | loader: 'babel-loader', 34 | options: { 35 | "presets": [ 36 | "@babel/typescript" 37 | ], 38 | "plugins": [ 39 | "dynamic-import-node" 40 | ], 41 | } 42 | } 43 | }, 44 | { 45 | test: /\.m?js$/, 46 | exclude: /(node_modules|bower_components)/, 47 | use: { 48 | loader: 'babel-loader', 49 | options: { 50 | plugins: [ 51 | ["@babel/plugin-transform-runtime", { "corejs": 2 }], 52 | '@babel/plugin-proposal-class-properties' 53 | ], 54 | presets: ['@babel/preset-env'] 55 | } 56 | } 57 | }, 58 | ], 59 | } 60 | }; 61 | -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/formData/download_channels.json: -------------------------------------------------------------------------------- 1 | { 2 | "active_channels": "{}", 3 | "datasource": "karma-test", 4 | "filename": "karma-test_channel_list", 5 | "list_channels": "{\"Hoechst0\":[765,41036],\"AF488\":[758,32538],\"AF555\":[387,59399],\"AF647\":[667,15105],\"Hoechst1\":[827,59065],\"A555\":[320,10263],\"A647\":[743,3897],\"Hoechst2\":[904,61968],\"anti_CD3\":[1185,46565],\"anti_NaKATPase\":[694,25379],\"anti_CD45RO\":[546,45152],\"Hoechst3\":[650,59040],\"Ki67_488\":[1287,17472],\"Keratin_570\":[480,64311],\"aSMA_660\":[566,42751],\"Hoechst4\":[1131,65536],\"CD4_488\":[1346,13776],\"CD45_PE\":[643,13262],\"PD1_647\":[951,7954],\"Hoechst5\":[931,65535],\"CD20_488\":[1999,57991],\"CD68_555\":[509,20277],\"CD8a_660\":[1190,35372],\"Hoechst6\":[1084,65536],\"CD163_488\":[1256,64032],\"FOXP3_570\":[619,25318],\"PDL1_647\":[1977,7351],\"Hoechst7\":[1098,65536],\"Ecad_488\":[1300,38672],\"Vimentin_555\":[749,9849],\"CDX2_647\":[2817,65434],\"Hoechst8\":[772,65536],\"LaminABC_488\":[1956,34295],\"Desmin_555\":[530,52665],\"CD31_647\":[766,50352],\"Hoechst9\":[880,65536],\"PCNA_488\":[1296,42317],\"Ki67_570\":[893,12404],\"CollagenIV_647\":[533,61923],\"HE_r\":[2558,65535],\"HE_g\":[1042,65535],\"HE_b\":[13158,65535]}", 6 | "map_channels": "{\"1\":\"Hoechst0\",\"2\":\"AF488\",\"3\":\"AF555\",\"4\":\"AF647\",\"5\":\"Hoechst1\",\"6\":\"AF488\",\"7\":\"A555\",\"8\":\"A647\",\"9\":\"Hoechst2\",\"10\":\"anti_CD3\",\"11\":\"anti_NaKATPase\",\"12\":\"anti_CD45RO\",\"13\":\"Hoechst3\",\"14\":\"Ki67_488\",\"15\":\"Keratin_570\",\"16\":\"aSMA_660\",\"17\":\"Hoechst4\",\"18\":\"CD4_488\",\"19\":\"CD45_PE\",\"20\":\"PD1_647\",\"21\":\"Hoechst5\",\"22\":\"CD20_488\",\"23\":\"CD68_555\",\"24\":\"CD8a_660\",\"25\":\"Hoechst6\",\"26\":\"CD163_488\",\"27\":\"FOXP3_570\",\"28\":\"PDL1_647\",\"29\":\"Hoechst7\",\"30\":\"Ecad_488\",\"31\":\"Vimentin_555\",\"32\":\"CDX2_647\",\"33\":\"Hoechst8\",\"34\":\"LaminABC_488\",\"35\":\"Desmin_555\",\"36\":\"CD31_647\",\"37\":\"Hoechst9\",\"38\":\"PCNA_488\",\"39\":\"Ki67_570\",\"40\":\"CollagenIV_647\",\"41\":\"HE_r\",\"42\":\"HE_g\",\"43\":\"HE_b\"}", 7 | "list_colors": "{}", 8 | "list_ranges": "{}" 9 | } 10 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/views/lensingFilters/lfDataColors.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @class LfDataColors 3 | */ 4 | export class LfDataColors { 5 | 6 | // Class vars 7 | data = []; 8 | load = []; 9 | 10 | /** 11 | * @constructor 12 | */ 13 | constructor() { 14 | 15 | // Init 16 | this.init() 17 | } 18 | 19 | 20 | /** 21 | * @function init 22 | * 23 | * @return void 24 | */ 25 | init() { 26 | 27 | this.data = [ 28 | { 29 | index: 0, 30 | name: 'black', 31 | r: 0, 32 | g: 0, 33 | b: 0 34 | }, 35 | { 36 | index: 1, 37 | name: 'white', 38 | r: 255, 39 | g: 255, 40 | b: 255 41 | }, 42 | { 43 | index: 2, 44 | name: 'red', 45 | r: 255, 46 | g: 0, 47 | b: 0 48 | }, 49 | { 50 | index: 3, 51 | name: 'green', 52 | r: 0, 53 | g: 255, 54 | b: 0 55 | }, 56 | { 57 | index: 4, 58 | name: 'blue', 59 | r: 0, 60 | g: 0, 61 | b: 255 62 | }, 63 | { 64 | index: 5, 65 | name: 'light red', 66 | r: 255, 67 | g: 128, 68 | b: 128 69 | }, 70 | { 71 | index: 6, 72 | name: 'light green', 73 | r: 128, 74 | g: 255, 75 | b: 128 76 | }, 77 | { 78 | index: 7, 79 | name: 'light blue', 80 | r: 128, 81 | g: 128, 82 | b: 255 83 | }, 84 | ]; 85 | 86 | this.load = { 87 | data: this.data, 88 | config: { 89 | type: 'color-index', 90 | filter: 'fil_data_rgb' 91 | } 92 | } 93 | 94 | } 95 | 96 | } -------------------------------------------------------------------------------- /minerva_analysis/client/test/fixtures/context.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 47 | 48 | 49 | 50 | 51 | 57 | %SCRIPTS% 58 | 61 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/formData/gated_cell_encodings.json: -------------------------------------------------------------------------------- 1 | { 2 | "filename": "{{ data.datasource }}_gated_cell_encodings.csv", 3 | "fullCsv": "true", 4 | "encoding": "binary", 5 | "filter": "{}", 6 | "channels": "{\"Area\":[25,385],\"Hoechst0\":[7.913521017283895,10.677038913891868],\"AF488\":[6.089044875446846,10.630432112679363],\"AF555\":[4.875197323201151,10.21159705705293],\"AF647\":[4.07753744390572,9.08839870117094],\"Hoechst1\":[7.80994708647679,10.9073861501318],\"A555\":[4.007333185232471,7.623153068476902],\"A647\":[4.31748811353631,7.591861714889934],\"Hoechst2\":[7.830425617820331,10.904266480855474],\"anti_CD3\":[4.919980925828125,10.82808369877337],\"anti_NaKATPase\":[4.30406509320417,9.833815879286808],\"anti_CD45RO\":[4.477336814478207,10.783197284147285],\"Hoechst3\":[7.63433723562832,10.647351611387782],\"Ki67_488\":[5.017279836814924,9.56500329315396],\"Keratin_570\":[4.23410650459726,10.976234875009183],\"aSMA_660\":[4.007333185232471,10.479342202122597],\"Hoechst4\":[8.237214703349489,10.99807508606562],\"CD4_488\":[5.181783550292085,9.33034316437088],\"CD45_PE\":[3.871201010907891,9.529303064460995],\"PD1_647\":[4.875197323201151,8.980801413573113],\"Hoechst5\":[7.963807953231451,10.84271325569278],\"CD20_488\":[4.624972813284271,10.902905460984163],\"CD68_555\":[4.189654742026425,9.899730503658416],\"CD8a_660\":[4.663439094112067,10.602691354678605],\"Hoechst6\":[8.000684784514748,11.019825148966754],\"CD163_488\":[4.691347882229144,8.490849216076635],\"FOXP3_570\":[4.31748811353631,9.834726796965336],\"PDL1_647\":[4.875197323201151,8.085794701281568],\"Hoechst7\":[8.09040229659332,11.015542416900727],\"Ecad_488\":[4.770684624465665,10.12470925828764],\"Vimentin_555\":[4.30406509320417,8.081475040137052],\"CDX2_647\":[6.333279628139691,10.809889551659912],\"Hoechst8\":[7.473637108496206,10.786759101953049],\"LaminABC_488\":[5.971261839790462,10.416790106177013],\"Desmin_555\":[4.3694478524670215,10.389272253058634],\"CD31_647\":[4.248495242049359,10.657518144952888],\"Hoechst9\":[7.448333860897476,10.9408802507624],\"PCNA_488\":[4.700480365792417,10.523526261275435],\"Ki67_570\":[4.406719247264253,8.445482343862237],\"CollagenIV_647\":[3.9889840465642745,10.35685354062884],\"HE_r\":[0,0],\"HE_g\":[0,0],\"HE_b\":[0,0]}", 7 | "datasource": "karma-test" 8 | } 9 | -------------------------------------------------------------------------------- /minerva_analysis/client/test/data/formData/gated_channel_ranges.json: -------------------------------------------------------------------------------- 1 | { 2 | "filename": "{{ data.datasource }}_gated_channel_ranges.csv", 3 | "fullCsv": "false", 4 | "encoding": "binary", 5 | "filter": "{}", 6 | "channels": "{\"Area\":[25,385],\"Hoechst0\":[7.913521017283895,10.677038913891868],\"AF488\":[6.089044875446846,10.630432112679363],\"AF555\":[4.875197323201151,10.21159705705293],\"AF647\":[4.07753744390572,9.08839870117094],\"Hoechst1\":[7.80994708647679,10.9073861501318],\"A555\":[4.007333185232471,7.623153068476902],\"A647\":[4.31748811353631,7.591861714889934],\"Hoechst2\":[7.830425617820331,10.904266480855474],\"anti_CD3\":[4.919980925828125,10.82808369877337],\"anti_NaKATPase\":[4.30406509320417,9.833815879286808],\"anti_CD45RO\":[4.477336814478207,10.783197284147285],\"Hoechst3\":[7.63433723562832,10.647351611387782],\"Ki67_488\":[5.017279836814924,9.56500329315396],\"Keratin_570\":[4.23410650459726,10.976234875009183],\"aSMA_660\":[4.007333185232471,10.479342202122597],\"Hoechst4\":[8.237214703349489,10.99807508606562],\"CD4_488\":[5.181783550292085,9.33034316437088],\"CD45_PE\":[3.871201010907891,9.529303064460995],\"PD1_647\":[4.875197323201151,8.980801413573113],\"Hoechst5\":[7.963807953231451,10.84271325569278],\"CD20_488\":[4.624972813284271,10.902905460984163],\"CD68_555\":[4.189654742026425,9.899730503658416],\"CD8a_660\":[4.663439094112067,10.602691354678605],\"Hoechst6\":[8.000684784514748,11.019825148966754],\"CD163_488\":[4.691347882229144,8.490849216076635],\"FOXP3_570\":[4.31748811353631,9.834726796965336],\"PDL1_647\":[4.875197323201151,8.085794701281568],\"Hoechst7\":[8.09040229659332,11.015542416900727],\"Ecad_488\":[4.770684624465665,10.12470925828764],\"Vimentin_555\":[4.30406509320417,8.081475040137052],\"CDX2_647\":[6.333279628139691,10.809889551659912],\"Hoechst8\":[7.473637108496206,10.786759101953049],\"LaminABC_488\":[5.971261839790462,10.416790106177013],\"Desmin_555\":[4.3694478524670215,10.389272253058634],\"CD31_647\":[4.248495242049359,10.657518144952888],\"Hoechst9\":[7.448333860897476,10.9408802507624],\"PCNA_488\":[4.700480365792417,10.523526261275435],\"Ki67_570\":[4.406719247264253,8.445482343862237],\"CollagenIV_647\":[3.9889840465642745,10.35685354062884],\"HE_r\":[0,0],\"HE_g\":[0,0],\"HE_b\":[0,0]}", 7 | "datasource": "karma-test" 8 | } 9 | -------------------------------------------------------------------------------- /minerva_analysis/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from pathlib import Path 3 | from flask_sqlalchemy import SQLAlchemy 4 | from appdirs import user_data_dir 5 | 6 | from numcodecs import compat_ext # Needed for pyinstaller 7 | from numcodecs import blosc # Needed for pyinstaller 8 | import xmlschema # Needed for pyinstaller 9 | 10 | import os 11 | import json 12 | import sys 13 | import multiprocessing 14 | 15 | # If you're running the pyinstaller version of the code, create a 16 | # new directory for the data (this will be at ~/ on mac) 17 | 18 | #centralizing path across app 19 | cwd_path = Path.cwd() 20 | 21 | ## uncomment block if not on O2 22 | if getattr(sys, 'frozen', False): 23 | data_path = Path(Path(sys.executable).parent / 'data') 24 | multiprocessing.freeze_support() 25 | else: 26 | data_path = Path("minerva_analysis/data").resolve() 27 | 28 | ## uncomment block if on O2 29 | # appname = "minerva_analysis" 30 | # appauthor = "lsp" 31 | # data_path = Path(user_data_dir(appname, appauthor)+'/data').resolve() 32 | # if getattr(sys, 'frozen', False): 33 | # multiprocessing.freeze_support() 34 | 35 | # print('Data Path', str(data_path), str((data_path).resolve())) 36 | # Make the Data Path 37 | data_path.mkdir(parents=True, exist_ok=True) 38 | app = Flask(__name__, template_folder=Path('client/templates'), static_folder='data') 39 | app.config['TEMPLATES_AUTO_RELOAD'] = True 40 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + str(data_path) + '/db.sqlite3' 41 | app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 42 | app.config['CLIENT_PATH'] = app.root_path + '/client/' 43 | config_json_path = data_path / "config.json" 44 | db = SQLAlchemy(app) 45 | 46 | 47 | def get_config(): 48 | if not Path.is_dir(data_path): 49 | Path.mkdir(data_path) 50 | 51 | if not Path.is_file(config_json_path): 52 | with open(config_json_path, 'w') as f: 53 | json.dump({}, f) 54 | return [] 55 | else: 56 | with open(config_json_path, 'r+') as f: 57 | data = json.load(f) 58 | return data 59 | 60 | 61 | def get_config_names(): 62 | data = get_config() 63 | try: 64 | return [key for key in data.keys()] 65 | except AttributeError: 66 | return [] 67 | 68 | 69 | from minerva_analysis.server.routes import page_routes, data_routes, import_routes 70 | from minerva_analysis.server.models import data_model, database_model 71 | -------------------------------------------------------------------------------- /minerva_analysis/server/utils/fullConversion.py: -------------------------------------------------------------------------------- 1 | import os 2 | # set Libvips path for windows. If mac, please run `brew install vips` 3 | if os.name == 'nt': 4 | vipshome = os.path.dirname(os.path.abspath(__file__)) + r"\..\static\external\vips-dev-8.10\bin" 5 | os.environ['PATH'] = vipshome + ';' + os.environ['PATH'] 6 | 7 | from PIL import Image 8 | 9 | Image.MAX_IMAGE_PIXELS = 1000000000 10 | 11 | # def convertTifToPyramid(channel_img, destFile, isLabelImg): 12 | # img_dim = channel_img.shape[:2] 13 | # print('img shape', img_dim, channel_img.dtype) 14 | # channel_img = channel_img.astype('uint32') 15 | # imgR = ((channel_img >> 16) % 256).astype('uint8') 16 | # imgG = ((channel_img >> 8) % 256).astype('uint8') # high bits 17 | # imgB = (channel_img % 256).astype('uint8') # low bits 18 | # channel_img = cv2.merge((imgB, imgG, imgR)) 19 | # 20 | # if channel_img is not None: 21 | # print('Destfile', destFile) 22 | # cv2.imwrite(destFile + '.png', channel_img) # [cv2.IMWRITE_PNG_COMPRESSION, 9] 23 | # image = pyvips.Image.new_from_file(destFile + '.png', access='sequential') 24 | # # Remove any existing directory with the name of the channel 25 | # if os.path.exists(destFile): 26 | # shutil.rmtree(destFile) 27 | # if not isLabelImg: 28 | # image.dzsave(destFile, tile_size=128, overlap=2, suffix='.png') 29 | # else: 30 | # image.dzsave(destFile, tile_size=128, overlap=2, region_shrink='nearest', suffix='.png') 31 | 32 | # 33 | # def convertOmeTiff(filePath, fileName, isLabelImg=False): 34 | # channelNames = [] 35 | # file_path = str(Path(filePath) / fileName) 36 | # ome = tf.imread(file_path, is_ome=True) 37 | # for channel in range(np.shape(ome)[0]): 38 | # img = ome[channel, :, :] 39 | # channelName = re.sub(r'\.ome|\.tiff|\.tif|\.png', '', fileName) + "_" + str(channel) 40 | # channel_path = str(Path(filePath) / channelName) 41 | # convertTifToPyramid(img, channel_path, isLabelImg) 42 | # channelNames.append(channelName) 43 | # return channelNames 44 | 45 | # 46 | # def convertChannel(filePath, isLabelImg): 47 | # channel_img = imread(filePath) 48 | # channel_img = np.squeeze(channel_img) # Remove any unnecessary single dimensions 49 | # channelPath = re.sub(r'\.ome|\.tiff|\.tif|\.png', '', filePath) 50 | # convertTifToPyramid(channel_img, channelPath, isLabelImg) 51 | -------------------------------------------------------------------------------- /minerva_analysis/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "webpack", 7 | "watch": "webpack --watch", 8 | "test:test": "tsc --project test/tsconfig.json", 9 | "test:src": "mockttp -c karma start karma.conf.js", 10 | "test": "npm run test:test && npm run test:src" 11 | }, 12 | "license": "MIT", 13 | "dependencies": { 14 | "@fortawesome/fontawesome-free": "^5.14.0", 15 | "bootstrap": "^4.5.0", 16 | "buffer": "^5.6.0", 17 | "chai-spies": "^1.0.0", 18 | "color-convert": "^2.0.1", 19 | "css-loader": "^3.6.0", 20 | "d3": "^6.2.0", 21 | "d3-simple-slider": "latest", 22 | "dropzone": "^5.7.2", 23 | "expose-loader": "^1.0.0", 24 | "file-loader": "^6.0.0", 25 | "install": "^0.13.0", 26 | "jquery": "^3.5.1", 27 | "jquery-form": "^4.3.0", 28 | "karma-sourcemap-loader": "^0.3.8", 29 | "lensing": "^1.0.17", 30 | "lodash": "^4.17.19", 31 | "mark.js": "^8.11.1", 32 | "node-fetch": "^2.6.1", 33 | "pngjs": "^5.0.0", 34 | "popper.js": "^1.16.1", 35 | "regenerator-runtime": "^0.13.7", 36 | "sortablejs": "^1.10.2", 37 | "style-loader": "^1.2.1", 38 | "viawebgl": "github:thejohnhoffer/viaWebGL#webgl2" 39 | }, 40 | "devDependencies": { 41 | "@babel/core": "^7.17.12", 42 | "@babel/plugin-transform-runtime": "^7.12.1", 43 | "@babel/preset-env": "^7.17.12", 44 | "@babel/preset-typescript": "^7.17.12", 45 | "@babel/runtime": "^7.17.9", 46 | "@babel/runtime-corejs2": "^7.17.11", 47 | "@babel/plugin-proposal-class-properties": "latest", 48 | "@httptoolkit/proxy-agent": "^5.0.1-socks-lookup-fix.0", 49 | "@types/chai": "^4.3.1", 50 | "@types/jquery": "^3.5.14", 51 | "@types/karma-fixture": "^0.2.5", 52 | "@types/mocha": "^9.1.1", 53 | "@types/openseadragon": "^3.0.3", 54 | "babel-loader": "^8.1.0", 55 | "chai": "^4.3.6", 56 | "karma": "^6.3.19", 57 | "karma-chai": "^0.1.0", 58 | "karma-chrome-launcher": "^3.1.1", 59 | "karma-fixture": "^0.2.6", 60 | "karma-html2js-preprocessor": "^1.1.0", 61 | "karma-jquery": "^0.2.4", 62 | "karma-json-fixtures-preprocessor": "0.0.6", 63 | "karma-mocha": "^2.0.1", 64 | "karma-sinon-chai": "^2.0.2", 65 | "karma-webpack": "^4.0.0", 66 | "mocha": "^10.0.0", 67 | "mockttp": "^3.0.0", 68 | "sinon": "^14.0.0", 69 | "sinon-chai": "^3.7.0", 70 | "typescript": "^4.6.4", 71 | "webpack": "^4.44.2", 72 | "webpack-cli": "^3.3.12" 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/services/numericData.js: -------------------------------------------------------------------------------- 1 | class NumericData { 2 | /** 3 | * Constructor for NumericDataLayer. 4 | * 5 | * @param config - the cinfiguration file (json) 6 | * @param dataLayer - the data layer (stub) that executes server requests and holds client side data 7 | */ 8 | constructor(config, dataLayer) { 9 | this.features = config.featureData[0]; 10 | this.dataLayer = dataLayer; 11 | } 12 | 13 | /* 14 | * Load cell segmentation data 15 | */ 16 | async loadCells() { 17 | const { idField, xCoordinate, yCoordinate } = this.features; 18 | const fields = [ idField, xCoordinate, yCoordinate ]; 19 | const idsCenters = await this.getAllUInt32Entries(fields); 20 | const isCenter = (_, i) => !!(i % fields.length); 21 | const centers = idsCenters.filter(isCenter); 22 | const isId = (_, i) => !(i % fields.length); 23 | const ids = idsCenters.filter(isId); 24 | return { ids, centers }; 25 | } 26 | 27 | /* 28 | * Access DataLayer bitrange as floating point. 29 | */ 30 | get floatRange() { 31 | return this.dataLayer.getImageBitRange(true); 32 | } 33 | 34 | /* 35 | * Access DataLayer bitrange as an integer. 36 | */ 37 | get intRange() { 38 | return this.dataLayer.getImageBitRange(false); 39 | } 40 | 41 | /* 42 | * @function getNearestCell - return nearest cell to point 43 | * 44 | * @param x - cell x position in image coordinates 45 | * @param y - cell y position in image coordinates 46 | */ 47 | getNearestCell(x, y) { 48 | return this.dataLayer.getNearestCell(x, y); 49 | } 50 | 51 | /* 52 | * @function getAllFloat32Ids - all integer entries 53 | * @param keys - list of keys to access 54 | */ 55 | async getAllFloat32Entries(keys) { 56 | return this.getAllEntries(keys, false); 57 | } 58 | 59 | /* 60 | * @function getAllUInt32Ids - all integer entries 61 | * @param keys - list of keys to access 62 | */ 63 | async getAllUInt32Entries(keys) { 64 | return this.getAllEntries(keys, true); 65 | } 66 | 67 | /* 68 | * @function getAllEntries - all cell entries by keys 69 | * @param keys - list of keys to access 70 | * @param useInt - whether requesting integers 71 | */ 72 | async getAllEntries(keys, useInt) { 73 | if (!keys.length) { 74 | return []; 75 | } 76 | const { dataLayer } = this; 77 | const arr = await dataLayer.getAllCells(keys, useInt); 78 | if (useInt) { 79 | return new Uint32Array(arr); 80 | } 81 | return new Float32Array(arr); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /minerva_analysis/server/utils/pre_normalization.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def preNormalize(input_csvPath, output_csvPath, skip_columns=[]): 5 | RAW_DATA = np.genfromtxt(input_csvPath, names=True, dtype=float, delimiter=',') 6 | marker_list = RAW_DATA.dtype.names 7 | norm_data = RAW_DATA.view((np.float, len(marker_list))) 8 | 9 | # A list of markers to skip normalization 10 | # markers_notToNorm = ['Field_Row', 'Field_Col', 'CellID', 'X_position','Y_position','Percent_Touching','Number_Neighbors','Neighbor_1','Neighbor_2','Neighbor_3','Neighbor_4','Neighbor_5', 'Eccentricity', 'Solidity', 'Extent', 'EulerNumber', 'Perimeter', 'MajorAxisLength', 'MinorAxisLength', 'Orientation', 'X_position', 'Y_position'] 11 | # A list of markers to skip log10 transform 12 | # markers_notToLog = ['DAPI1', 'A488b1', 'A555b1'] # skip 'DAPI1', 'A488b1', 'A555b1' 13 | markers_notToLog = [] # nothing to skip 14 | 15 | for marker_id in range(norm_data.shape[1]): 16 | if marker_list[marker_id] in skip_columns: 17 | continue 18 | if marker_list[marker_id] in markers_notToLog: 19 | # Log10 transform 20 | norm_data[:, marker_id] = np.log10(norm_data[:, marker_id] + 1) 21 | print(marker_list[marker_id], 'with log10 transform') 22 | else: 23 | print(marker_list[marker_id], 'without log10 transform') 24 | # Percentile normalization by mapping [0.1%, 99.9%] into [0, 1] 25 | min_tile, max_tile = np.percentile(norm_data[:, marker_id], [0.1, 99.9]) 26 | 27 | # norm_data[:, marker_id] =(norm_data[:, marker_id] - min_tile) * (max_tile - min_tile) / (max_tile - min_tile) + min_tile 28 | norm_data[:, marker_id] = (norm_data[:, marker_id] - min_tile) / (max_tile - min_tile) 29 | norm_data[:, marker_id] = np.minimum(norm_data[:, marker_id], 1) 30 | norm_data[:, marker_id] = np.maximum(norm_data[:, marker_id], 0) 31 | 32 | with open(output_csvPath, 'w') as f: 33 | for marker_id, marker_name in enumerate(marker_list): 34 | f.write(marker_name) 35 | if marker_id != (len(marker_list) - 1): 36 | f.write(',') 37 | f.write('\n') 38 | for norm_row in norm_data: 39 | for elem_id, norm_elem in enumerate(norm_row): 40 | f.write(str(norm_elem)) 41 | if elem_id != (norm_row.shape[0] - 1): 42 | f.write(',') 43 | f.write('\n') 44 | 45 | # input_csvPath = 'Sample_23.csv' 46 | # output_csvPath = 'Sample_23_norm2.csv' 47 | # preNormalize(input_csvPath, output_csvPath) 48 | -------------------------------------------------------------------------------- /minerva_analysis/server/models/database_model.py: -------------------------------------------------------------------------------- 1 | from minerva_analysis import app, db 2 | from sqlalchemy.orm import relationship 3 | from sqlalchemy import func 4 | 5 | import io 6 | import numpy as np 7 | 8 | 9 | # Via https://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create 10 | def create(model, **kwargs): 11 | instance = model(**kwargs) 12 | db.session.add(instance) 13 | db.session.commit() 14 | return instance 15 | 16 | 17 | def get(model, **kwargs): 18 | return db.session.query(model).filter_by(**kwargs).one_or_none() 19 | 20 | 21 | def edit(model, id, edit_field, edit_value): 22 | instance = get(model, id=id) 23 | instance.__setattr__(edit_field, edit_value) 24 | db.session.commit() 25 | 26 | 27 | def get_all(model, **kwargs): 28 | return db.session.query(model).filter_by(is_deleted=False, **kwargs).order_by(model.id).all() 29 | 30 | 31 | def get_or_create(model, **kwargs): 32 | if 'cells' in kwargs: 33 | cells = kwargs['cells'] 34 | del kwargs['cells'] 35 | instance = db.session.query(model).filter_by(**kwargs).one_or_none() 36 | if instance: 37 | return instance 38 | else: 39 | instance = model(cells=cells, **kwargs) 40 | db.session.add(instance) 41 | db.session.commit() 42 | return instance 43 | 44 | 45 | def save_list(model, **kwargs): 46 | if 'cells' in kwargs: 47 | cells = kwargs['cells'] 48 | del kwargs['cells'] 49 | 50 | instance = db.session.query(model).filter_by(**kwargs).one_or_none() 51 | if instance: 52 | instance.__setattr__('cells', cells) 53 | db.session.commit() 54 | return instance 55 | else: 56 | instance = model(cells=cells, **kwargs) 57 | db.session.add(instance) 58 | db.session.commit() 59 | return instance 60 | 61 | 62 | class ChannelList(db.Model): 63 | __tablename__ = 'channelList' 64 | id = db.Column(db.Integer, primary_key=True) 65 | datasource = db.Column(db.String(80), unique=False, nullable=False) 66 | cells = db.Column(db.LargeBinary, default={}, nullable=False) 67 | is_deleted = db.Column(db.Boolean, default=False, nullable=False) 68 | 69 | 70 | class GatingList(db.Model): 71 | __tablename__ = 'gatinglist' 72 | id = db.Column(db.Integer, primary_key=True) 73 | datasource = db.Column(db.String(80), unique=False, nullable=False) 74 | cells = db.Column(db.LargeBinary, default={}, nullable=False) 75 | is_deleted = db.Column(db.Boolean, default=False, nullable=False) 76 | 77 | 78 | with app.app_context(): 79 | db.create_all() 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Minerva Analysis 2 | 3 | 4 | ## About 5 | This is an [openseadragon](https://openseadragon.github.io/) based **Cellular Image Viewing and Analysis Tool**. 6 | It is built with a python [Flask](http://flask.pocoo.org/) backend and a [Node.js](https://nodejs.org/en/) javascript frontend. 7 | 8 | ## Executables (for Users) 9 | Releases can be found here: 10 | https://github.com/labsyspharm/minerva_analysis/releases 11 | These are executables for Windows and MacOS that can be run locally without any installations. 12 | 13 | 14 | ## Running as a Docker container 15 | 16 | * Build image: `docker build -t gating .` 17 | * Run image with mounted path: `docker run --rm -dp 8000:8000 -v [source path]:/[target path] gating` 18 | 19 | where 20 | * `--rm` cleans up the container after it finishes executing 21 | * `-v` mounts the "present working directory" (containing your data) to be `/data` inside the container. This is necessary in order to import your data via the import page. 22 | * `-dp` forwards the port 8000 23 | 24 | Once the container is running, go to `http://localhost:8000/` in your web browser. 25 | To import your imaging files in the import gui type in the mounted `/data/..` 26 | 27 | ## Clone and Run Codebase (for Developers) 28 | #### 1. Checkout Project 29 | `git clone https://github.com/labsyspharm/minerva_analysis.git` 30 | #### 2. Checkout Necessary Branch 31 | * **For Gating, run** `git checkout gating` 32 | * Run `git pull` to make sure everything is up to date 33 | 34 | 35 | 36 | #### 3. Conda Install Instructions. 37 | ##### Install Conda 38 | * Install [miniconda](https://conda.io/miniconda.html) or [conda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/download.html). 39 | * Create env: `conda env create -f requirements.yml` 40 | 41 | ##### Activate Environment 42 | * Active environment: `conda activate minerva_analysis` 43 | 44 | 45 | ##### Start the Server 46 | 47 | * `python run.py` - Runs the webserver 48 | ##### Start the Server 49 | 50 | * Access the tool via `http://localhost:8000/` 51 | 52 | 53 | #### (4. Node.js installation and packages) 54 | This step is only needed when you plan to edit js code. The codebase already included bundled js files. 55 | * Install [Node.js](https://nodejs.org/en/), then navigate to `/minerva_analysis/client` and run `npm install` to install all packages listed in package.json. 56 | * Run `npm run start` to package the Javascript, or run `npm run watch` if you plan on editing dependencies 57 | 58 | 59 | ## Packaging/Bundling Code as Executable (for Developers) 60 | Any tagged commit to a branch will trigger a build, where `tag == commit message`. This will appear under releases. Note building may take ~10 min. 61 | 62 | Tagging Conventions: All release tags should look like `v{version_number}_{branch_name}`. 63 | -------------------------------------------------------------------------------- /minerva_analysis/client/templates/channel_match.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | 4 | {% block content %} 5 | Minerva Analysis - Channel Match 6 | 7 | 8 | 9 | 10 | {{ data.datasetName }}: Config 11 | 12 | 13 | Save Config 14 | 15 | 16 | 17 | 18 | Log1p Transform Data 19 | 20 | 21 | 22 | 23 | 24 | Destination 25 | 26 | 27 | 28 | 29 | 30 | CSV Header 31 | 32 | 33 | 34 | Remove Text from Display 35 | Name 36 | 37 | 38 | Drag Elements Into Order 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 59 | {% endblock %} 60 | 61 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - '*' 6 | jobs: 7 | build: 8 | strategy: 9 | matrix: 10 | os: [ macos-latest, windows-latest ] 11 | node-version: [ 12.x ] 12 | runs-on: ${{ matrix.os }} 13 | steps: 14 | - uses: actions/checkout@v2 15 | with: 16 | fetch-depth: 0 17 | - name: Get Branch 18 | shell: bash -l {0} 19 | run: | 20 | raw=$(git branch -r --contains ${{ github.ref }}) 21 | branch=${raw##*/} 22 | echo "BRANCH=$branch" >> $GITHUB_ENV 23 | - run: echo ${{ env.BRANCH }} 24 | - name: Creating Private Key 25 | uses: webfactory/ssh-agent@v0.5.3 26 | with: 27 | ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} 28 | - name: Create Repository Dispatch 29 | if: startsWith(matrix.os,'mac') 30 | uses: peter-evans/repository-dispatch@v2 31 | with: 32 | token: ${{ secrets.GATING_PAT }} 33 | repository: labsyspharm/gater 34 | event-type: merge 35 | client-payload: '{"ref": "${{ github.ref }}"}' 36 | - name: Use Node.js ${{ matrix.node-version }} 37 | uses: actions/setup-node@v2 38 | with: 39 | node-version: ${{ matrix.node-version }} 40 | - name: Node and Webpack 41 | run: | 42 | cd minerva_analysis 43 | cd client 44 | npm ci 45 | npm run start 46 | rm -r node_modules/ 47 | cd .. 48 | cd .. 49 | - uses: conda-incubator/setup-miniconda@v2 50 | with: 51 | python-version: 3.7 52 | environment-file: requirements.yml 53 | activate-environment: minerva_analysis 54 | - name: Package Windows 55 | if: startsWith(matrix.os,'windows') 56 | shell: cmd /C CALL {0} 57 | run: | 58 | package_win.bat 59 | - name: Rename Windows 60 | if: startsWith(matrix.os,'windows') 61 | shell: bash -l {0} 62 | run: | 63 | ls dist/ 64 | mv dist/minerva_analysis_windows.exe "dist/minerva_analysis_windows_${{ env.BRANCH }}.exe" 65 | ls dist/ 66 | - name: Package Mac 67 | if: startsWith(matrix.os,'mac') 68 | shell: bash -l {0} 69 | run: | 70 | ./package_mac.sh 71 | - name: Rename Mac 72 | if: startsWith(matrix.os,'mac') 73 | shell: bash -l {0} 74 | run: | 75 | mv dist/minerva_analysis_mac "dist/minerva_analysis_mac_${{ env.BRANCH }}" 76 | cd dist 77 | zip "minerva_analysis_mac_${{ env.BRANCH }}.zip" "minerva_analysis_mac_${{ env.BRANCH }}" 78 | rm "minerva_analysis_mac_${{ env.BRANCH }}" 79 | - name: Release 80 | uses: softprops/action-gh-release@v1 81 | if: startsWith(github.ref, 'refs/tags/') 82 | with: 83 | files: | 84 | dist/* 85 | env: 86 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 87 | -------------------------------------------------------------------------------- /minerva_analysis/client/src/js/views/lensingFilters/lfSegmentationOutlines.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @class LfSegmentationOutlines 3 | * Note - useful template implementation for viewfinder functionality without viewerfinder visibility 4 | */ 5 | export class LfSegmentationOutlines { 6 | 7 | // Class vars (and chart 'vars') 8 | data = []; 9 | load = []; 10 | vars = {}; 11 | 12 | /** 13 | * @constructor 14 | */ 15 | constructor(_imageViewer) { 16 | this.image_viewer = _imageViewer; 17 | const { dataLayer, channelList } = __minervaAnalysis; 18 | 19 | // From global vars 20 | this.data_layer = dataLayer; 21 | this.channel_list = channelList; 22 | 23 | // Init 24 | this.init() 25 | } 26 | 27 | 28 | /** 29 | * @function init 30 | * 31 | * @return void 32 | */ 33 | init() { 34 | 35 | this.data = []; 36 | this.load = { 37 | data: [], 38 | config: { 39 | type: 'object-single', 40 | filter: 'fil_data_custom', 41 | vf_ref: 'vis_data_custom', 42 | filterCode: { 43 | data: [], 44 | name: 'fil_data_segmentation_outlines', 45 | vis_name: 'Data Segmentation Outlines', 46 | settings: { 47 | active: 1, 48 | async: false, 49 | default: 1, 50 | loading: false, 51 | max: 1, 52 | min: 0, 53 | step: 1, 54 | vf: true, 55 | vf_setup: 'vis_data_segmentation_outlines', 56 | iter: 'px' 57 | }, 58 | set_pixel: () => { 59 | 60 | }, 61 | update: (i, index) => { 62 | 63 | // Magnify (simply pass through after filter) 64 | this.image_viewer.viewer.lensing.lenses.selections.magnifier.update(i, index); 65 | }, 66 | fill: 'rgba(255, 255, 255, 0)', 67 | stroke: 'rgba(0, 0, 0, 1)' 68 | }, 69 | get_vf_setup: () => { 70 | return { 71 | name: 'vis_data_segmentation_outlines', 72 | init: () => { 73 | 74 | // Hide vf 75 | const vf = this.image_viewer.viewer.lensing.viewfinder; 76 | vf.els.svg.attr('opacity', 0); 77 | 78 | // Trigger channel list data request 79 | this.channel_list.triggerChannelSelect(); 80 | 81 | // Show outlines 82 | this.image_viewer.viewerManagerVAuxi.show_sel = true; 83 | this.image_viewer.viewerManagerVAuxi.force_repaint(); 84 | 85 | }, 86 | wrangle: () => { 87 | 88 | }, 89 | render: () => { 90 | 91 | }, 92 | destroy: () => { 93 | 94 | // Show vf 95 | const vf = this.image_viewer.viewer.lensing.viewfinder; 96 | vf.els.svg.attr('opacity', 1); 97 | 98 | // Show outlines 99 | this.image_viewer.viewerManagerVAuxi.show_sel = false; 100 | this.image_viewer.viewerManagerVAuxi.force_repaint(); 101 | 102 | } 103 | } 104 | }, 105 | }, 106 | }; 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /minerva_analysis/client/external/openseadragon-bin-2.4.0/openseadragon-svg-overlay.js: -------------------------------------------------------------------------------- 1 | // OpenSeadragon SVG Overlay plugin 0.0.5 2 | 3 | (function() { 4 | 5 | var $ = window.OpenSeadragon; 6 | 7 | if (!$) { 8 | $ = require('openseadragon'); 9 | if (!$) { 10 | throw new Error('OpenSeadragon is missing.'); 11 | } 12 | } 13 | 14 | var svgNS = 'http://www.w3.org/2000/svg'; 15 | 16 | // ---------- 17 | $.Viewer.prototype.svgOverlay = function() { 18 | if (this._svgOverlayInfo) { 19 | return this._svgOverlayInfo; 20 | } 21 | 22 | this._svgOverlayInfo = new Overlay(this); 23 | return this._svgOverlayInfo; 24 | }; 25 | 26 | // ---------- 27 | var Overlay = function(viewer) { 28 | var self = this; 29 | 30 | this._viewer = viewer; 31 | this._containerWidth = 0; 32 | this._containerHeight = 0; 33 | 34 | this._svg = document.createElementNS(svgNS, 'svg'); 35 | this._svg.id = "svgOverlay"; 36 | this._svg.style.position = 'absolute'; 37 | this._svg.style.left = 0; 38 | this._svg.style.top = 0; 39 | this._svg.style.width = '100%'; 40 | this._svg.style.height = '100%'; 41 | this._viewer.canvas.appendChild(this._svg); 42 | 43 | this._node = document.createElementNS(svgNS, 'g'); 44 | this._svg.appendChild(this._node); 45 | 46 | this._viewer.addHandler('animation', function() { 47 | self.resize(); 48 | }); 49 | 50 | this._viewer.addHandler('open', function() { 51 | self.resize(); 52 | }); 53 | 54 | this._viewer.addHandler('rotate', function(evt) { 55 | self.resize(); 56 | }); 57 | 58 | this._viewer.addHandler('resize', function() { 59 | self.resize(); 60 | }); 61 | 62 | this.resize(); 63 | }; 64 | 65 | // ---------- 66 | Overlay.prototype = { 67 | // ---------- 68 | node: function() { 69 | return this._node; 70 | }, 71 | 72 | // ---------- 73 | resize: function() { 74 | if (this._containerWidth !== this._viewer.container.clientWidth) { 75 | this._containerWidth = this._viewer.container.clientWidth; 76 | this._svg.setAttribute('width', this._containerWidth); 77 | } 78 | 79 | if (this._containerHeight !== this._viewer.container.clientHeight) { 80 | this._containerHeight = this._viewer.container.clientHeight; 81 | this._svg.setAttribute('height', this._containerHeight); 82 | } 83 | 84 | var p = this._viewer.viewport.pixelFromPoint(new $.Point(0, 0), true); 85 | var zoom = this._viewer.viewport.getZoom(true); 86 | var rotation = this._viewer.viewport.getRotation(); 87 | // TODO: Expose an accessor for _containerInnerSize in the OSD API so we don't have to use the private variable. 88 | var scale = this._viewer.viewport._containerInnerSize.x * zoom; 89 | this._node.setAttribute('transform', 90 | 'translate(' + p.x + ',' + p.y + ') scale(' + scale + ') rotate(' + rotation + ')'); 91 | }, 92 | 93 | // ---------- 94 | onClick: function(node, handler) { 95 | // TODO: Fast click for mobile browsers 96 | 97 | new $.MouseTracker({ 98 | element: node, 99 | clickHandler: handler 100 | }).setTracking(true); 101 | }, 102 | 103 | 104 | onDrag: function(node, handler){ 105 | new $.MouseTracker({ 106 | element: node, 107 | dragHandler: function(event) { 108 | // Move node by event.delta 109 | } 110 | }).setTracking(true); 111 | } 112 | 113 | 114 | 115 | }; 116 | 117 | })(); 118 | -------------------------------------------------------------------------------- /minerva_analysis/client/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% block title %}{% endblock %} 4 | 5 | 6 | 7 | {% block style %}{% endblock %} 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | Gater 46 | 47 | 48 | 49 | 51 | Data Sources 52 | 53 | 54 | {% for datasource in data.datasources %} 55 | 56 | 57 | 58 | 59 | 60 | 61 | 63 | 64 | 65 | 66 | 67 | 68 | {{ datasource }} 69 | 70 | 71 | {% endfor %} 72 | 73 | 74 | 75 | {% if data.is_docker %} 76 | Upload 77 | {% else %} 78 | Upload 79 | {% endif %} 80 | 81 | 82 | 83 | 84 | 85 | {% block content %}{% endblock %} 86 | 87 | 88 |