plexora 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plexora-0.0.1/LICENSE +207 -0
- plexora-0.0.1/MANIFEST.in +16 -0
- plexora-0.0.1/PKG-INFO +341 -0
- plexora-0.0.1/README.md +300 -0
- plexora-0.0.1/plexora/__init__.py +129 -0
- plexora-0.0.1/plexora/__main__.py +15 -0
- plexora-0.0.1/plexora/_url.py +105 -0
- plexora-0.0.1/plexora/api/__init__.py +55 -0
- plexora-0.0.1/plexora/api/dataset.py +398 -0
- plexora-0.0.1/plexora/api/http.py +19 -0
- plexora-0.0.1/plexora/api/plugin.py +541 -0
- plexora-0.0.1/plexora/api/store.py +221 -0
- plexora-0.0.1/plexora/cli.py +777 -0
- plexora-0.0.1/plexora/client/dist/354_bundle.js +2 -0
- plexora-0.0.1/plexora/client/dist/354_bundle.js.LICENSE.txt +20 -0
- plexora-0.0.1/plexora/client/dist/418_bundle.js +2 -0
- plexora-0.0.1/plexora/client/dist/418_bundle.js.LICENSE.txt +1 -0
- plexora-0.0.1/plexora/client/dist/693b935cb1f907814be9c6199a68c217.svg +19 -0
- plexora-0.0.1/plexora/client/dist/713c134ff47cd328a5b711526f151082.svg +18 -0
- plexora-0.0.1/plexora/client/dist/770_bundle.js +1 -0
- plexora-0.0.1/plexora/client/dist/ff743f408972e0e96ca9153ed5ae4c83.svg +23 -0
- plexora-0.0.1/plexora/client/dist/vendor_bundle.js +2 -0
- plexora-0.0.1/plexora/client/dist/vendor_bundle.js.LICENSE.txt +308 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/LICENSE.txt +28 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/canvas-overlay-hd.js +140 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/changelog.txt +501 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/.gitattributes +17 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/LICENSE.txt +116 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/Toolbar.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/fullpage.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/home.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/next.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/previous.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateleft.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateright.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/zoom.psd +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/README.md +9 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_grouphover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_hover.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_pressed.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_rest.png +0 -0
- plexora-0.0.1/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-scalebar.js +562 -0
- plexora-0.0.1/plexora/client/src/css/import.css +474 -0
- plexora-0.0.1/plexora/client/src/css/main.css +903 -0
- plexora-0.0.1/plexora/client/src/css/openProject.css +363 -0
- plexora-0.0.1/plexora/client/src/css/quickView.css +166 -0
- plexora-0.0.1/plexora/client/src/css/tokens.css +51 -0
- plexora-0.0.1/plexora/client/src/css/viewer.css +1655 -0
- plexora-0.0.1/plexora/client/src/img/apple-touch-icon.png +0 -0
- plexora-0.0.1/plexora/client/src/img/favicon.ico +0 -0
- plexora-0.0.1/plexora/client/src/img/logo.ai +8892 -33
- plexora-0.0.1/plexora/client/src/img/logo.svg +1 -0
- plexora-0.0.1/plexora/client/src/img/logo_with_text.ai +9011 -34
- plexora-0.0.1/plexora/client/src/img/logo_with_text.svg +1 -0
- plexora-0.0.1/plexora/client/src/js/main.js +704 -0
- plexora-0.0.1/plexora/client/src/js/pluginRegistry.js +108 -0
- plexora-0.0.1/plexora/client/src/js/services/appStatus.js +286 -0
- plexora-0.0.1/plexora/client/src/js/services/browsePicker.js +73 -0
- plexora-0.0.1/plexora/client/src/js/services/dataLayer.js +400 -0
- plexora-0.0.1/plexora/client/src/js/services/datasetContext.js +143 -0
- plexora-0.0.1/plexora/client/src/js/services/glRenderer.js +143 -0
- plexora-0.0.1/plexora/client/src/js/services/importFormValidation.js +257 -0
- plexora-0.0.1/plexora/client/src/js/services/numericData.js +100 -0
- plexora-0.0.1/plexora/client/src/js/services/passVariablesToFrontend.js +20 -0
- plexora-0.0.1/plexora/client/src/js/services/simpleEventHandler.js +25 -0
- plexora-0.0.1/plexora/client/src/js/vendor.js +29 -0
- plexora-0.0.1/plexora/client/src/js/views/channelList.js +663 -0
- plexora-0.0.1/plexora/client/src/js/views/colorSwatchPicker.js +202 -0
- plexora-0.0.1/plexora/client/src/js/views/columnClassifier.js +146 -0
- plexora-0.0.1/plexora/client/src/js/views/coordinateField.js +133 -0
- plexora-0.0.1/plexora/client/src/js/views/dataSourceField.js +276 -0
- plexora-0.0.1/plexora/client/src/js/views/imageViewer.js +3306 -0
- plexora-0.0.1/plexora/client/src/js/views/miniMap.js +787 -0
- plexora-0.0.1/plexora/client/src/js/views/navbarControls.js +178 -0
- plexora-0.0.1/plexora/client/src/js/views/openProjectPage.js +239 -0
- plexora-0.0.1/plexora/client/src/js/views/projectEdit.js +335 -0
- plexora-0.0.1/plexora/client/src/js/views/quickViewLanding.js +136 -0
- plexora-0.0.1/plexora/client/src/js/views/rainbow.js +326 -0
- plexora-0.0.1/plexora/client/src/js/views/requirementsModal.js +572 -0
- plexora-0.0.1/plexora/client/src/js/views/rgbImageViewer.js +115 -0
- plexora-0.0.1/plexora/client/src/js/views/searchableSelect.js +411 -0
- plexora-0.0.1/plexora/client/src/js/views/segmentationProgress.js +122 -0
- plexora-0.0.1/plexora/client/src/js/views/toolLoader.js +747 -0
- plexora-0.0.1/plexora/client/src/js/views/viewerControls.js +689 -0
- plexora-0.0.1/plexora/client/src/js/views/viewerManager.js +434 -0
- plexora-0.0.1/plexora/client/src/js/views/viewerSidebar.js +1117 -0
- plexora-0.0.1/plexora/client/src/js/workers/tileDecoder.js +130 -0
- plexora-0.0.1/plexora/client/src/shaders/frag.glsl +528 -0
- plexora-0.0.1/plexora/client/src/shaders/vert.glsl +12 -0
- plexora-0.0.1/plexora/client/templates/base.html +212 -0
- plexora-0.0.1/plexora/client/templates/index.html +238 -0
- plexora-0.0.1/plexora/client/templates/open_project.html +96 -0
- plexora-0.0.1/plexora/client/templates/project_columns.html +86 -0
- plexora-0.0.1/plexora/client/templates/project_edit.html +196 -0
- plexora-0.0.1/plexora/client/templates/upload.html +118 -0
- plexora-0.0.1/plexora/connect.py +528 -0
- plexora-0.0.1/plexora/datasource.py +782 -0
- plexora-0.0.1/plexora/jupyter.py +406 -0
- plexora-0.0.1/plexora/notebook_env.py +232 -0
- plexora-0.0.1/plexora/paths.py +486 -0
- plexora-0.0.1/plexora/plugins/__init__.py +12 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/__init__.py +100 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/server/__init__.py +11 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/server/routes.py +167 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/server/state.py +281 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/server/values.py +145 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/server/variables.py +367 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerApi.js +158 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerColors.js +316 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerContinuous.js +403 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerFigureBridge.js +133 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerLegend.js +188 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerRoiBridge.js +822 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerSidebarController.js +826 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cellExplorerState.js +372 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/static/cell_explorer.css +752 -0
- plexora-0.0.1/plexora/plugins/cell_explorer/templates/cell_explorer/panel.html +137 -0
- plexora-0.0.1/plexora/plugins/figure_builder/__init__.py +125 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/__init__.py +7 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/compose.py +365 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/export.py +784 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/export_jobs.py +148 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/operations.py +556 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/pixels.py +142 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/provenance.py +174 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/render.py +278 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/repository.py +701 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/routes.py +594 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/schema.py +1023 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/sources.py +120 -0
- plexora-0.0.1/plexora/plugins/figure_builder/server/textmetrics.py +155 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureActions.js +363 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureBuilderApi.js +255 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureCanvas.js +2362 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureCaptureBoxes.js +369 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureCaptureDock.js +466 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureCaptureTool.js +1034 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureConfirm.js +136 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureContextBar.js +1193 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureContextMenu.js +253 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureDocumentState.js +275 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureExportUi.js +174 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureLibrary.js +247 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureQuickEdit.js +628 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureRichText.js +634 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureSceneSnapshot.js +361 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureSchema.js +218 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureSidebarController.js +1159 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureTextEditor.js +503 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureTextPanel.js +491 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureViewOptions.js +273 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figureWorkspace.js +2030 -0
- plexora-0.0.1/plexora/plugins/figure_builder/static/figure_builder.css +3292 -0
- plexora-0.0.1/plexora/plugins/figure_builder/templates/figure_builder/library.html +74 -0
- plexora-0.0.1/plexora/plugins/figure_builder/templates/figure_builder/workspace.html +27 -0
- plexora-0.0.1/plexora/plugins/figure_builder/templates/figure_builder/workspace_body.html +458 -0
- plexora-0.0.1/plexora/plugins/gating/__init__.py +76 -0
- plexora-0.0.1/plexora/plugins/gating/server/__init__.py +0 -0
- plexora-0.0.1/plexora/plugins/gating/server/anndata_gates.py +367 -0
- plexora-0.0.1/plexora/plugins/gating/server/database.py +16 -0
- plexora-0.0.1/plexora/plugins/gating/server/model.py +320 -0
- plexora-0.0.1/plexora/plugins/gating/server/routes.py +235 -0
- plexora-0.0.1/plexora/plugins/gating/static/csvGatingList.js +947 -0
- plexora-0.0.1/plexora/plugins/gating/static/gating.css +289 -0
- plexora-0.0.1/plexora/plugins/gating/static/gatingApi.js +221 -0
- plexora-0.0.1/plexora/plugins/gating/static/gatingSidebarController.js +513 -0
- plexora-0.0.1/plexora/plugins/gating/templates/gating/legacy.html +26 -0
- plexora-0.0.1/plexora/plugins/gating/templates/gating/panel.html +69 -0
- plexora-0.0.1/plexora/plugins/roi/__init__.py +95 -0
- plexora-0.0.1/plexora/plugins/roi/server/__init__.py +8 -0
- plexora-0.0.1/plexora/plugins/roi/server/adapters.py +655 -0
- plexora-0.0.1/plexora/plugins/roi/server/geojson.py +267 -0
- plexora-0.0.1/plexora/plugins/roi/server/geometry.py +181 -0
- plexora-0.0.1/plexora/plugins/roi/server/mapping.py +169 -0
- plexora-0.0.1/plexora/plugins/roi/server/operations.py +293 -0
- plexora-0.0.1/plexora/plugins/roi/server/repository.py +215 -0
- plexora-0.0.1/plexora/plugins/roi/server/routes.py +409 -0
- plexora-0.0.1/plexora/plugins/roi/server/schema.py +323 -0
- plexora-0.0.1/plexora/plugins/roi/static/roi.css +583 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiApi.js +177 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiFigureBridge.js +107 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiGeometry.js +350 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiRenderer.js +278 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiSidebarController.js +1038 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiState.js +518 -0
- plexora-0.0.1/plexora/plugins/roi/static/roiTools.js +993 -0
- plexora-0.0.1/plexora/plugins/roi/templates/roi/panel.html +240 -0
- plexora-0.0.1/plexora/proxy.py +57 -0
- plexora-0.0.1/plexora/server/models/adapters/__init__.py +94 -0
- plexora-0.0.1/plexora/server/models/adapters/anndata_adapter.py +388 -0
- plexora-0.0.1/plexora/server/models/adapters/base.py +93 -0
- plexora-0.0.1/plexora/server/models/adapters/classify.py +192 -0
- plexora-0.0.1/plexora/server/models/adapters/csv_adapter.py +105 -0
- plexora-0.0.1/plexora/server/models/adapters/inspection.py +265 -0
- plexora-0.0.1/plexora/server/models/adapters/spatialdata_adapter.py +248 -0
- plexora-0.0.1/plexora/server/models/centroid_tiles.py +305 -0
- plexora-0.0.1/plexora/server/models/data_model.py +1659 -0
- plexora-0.0.1/plexora/server/models/database_model.py +169 -0
- plexora-0.0.1/plexora/server/models/project.py +1270 -0
- plexora-0.0.1/plexora/server/plugins.py +199 -0
- plexora-0.0.1/plexora/server/routes/browse_routes.py +41 -0
- plexora-0.0.1/plexora/server/routes/data_routes.py +294 -0
- plexora-0.0.1/plexora/server/routes/import_routes.py +603 -0
- plexora-0.0.1/plexora/server/routes/page_routes.py +139 -0
- plexora-0.0.1/plexora/server/routes/project_routes.py +438 -0
- plexora-0.0.1/plexora/server/routes/quick_view_routes.py +62 -0
- plexora-0.0.1/plexora/server/routes/system_routes.py +39 -0
- plexora-0.0.1/plexora/server/routes/tool_routes.py +418 -0
- plexora-0.0.1/plexora/server/utils/addHEColumns.py +11 -0
- plexora-0.0.1/plexora/server/utils/fast_png.py +97 -0
- plexora-0.0.1/plexora/server/utils/fullConversion.py +50 -0
- plexora-0.0.1/plexora/server/utils/native_dialog.py +168 -0
- plexora-0.0.1/plexora/server/utils/pre_normalization.py +47 -0
- plexora-0.0.1/plexora/server/utils/segmentation_pyramid.py +598 -0
- plexora-0.0.1/plexora/server/utils/smallestenclosingcircle.py +126 -0
- plexora-0.0.1/plexora/server/utils/tiffsurgeon.py +372 -0
- plexora-0.0.1/plexora/server_cli.py +48 -0
- plexora-0.0.1/plexora/test.py +0 -0
- plexora-0.0.1/plexora.egg-info/PKG-INFO +341 -0
- plexora-0.0.1/plexora.egg-info/SOURCES.txt +303 -0
- plexora-0.0.1/plexora.egg-info/dependency_links.txt +1 -0
- plexora-0.0.1/plexora.egg-info/entry_points.txt +12 -0
- plexora-0.0.1/plexora.egg-info/requires.txt +33 -0
- plexora-0.0.1/plexora.egg-info/top_level.txt +1 -0
- plexora-0.0.1/pyproject.toml +125 -0
- plexora-0.0.1/setup.cfg +4 -0
- plexora-0.0.1/tests/test_anndata_adapter.py +521 -0
- plexora-0.0.1/tests/test_api_dataset.py +160 -0
- plexora-0.0.1/tests/test_api_store.py +221 -0
- plexora-0.0.1/tests/test_browse_routes.py +97 -0
- plexora-0.0.1/tests/test_cell_color_layer.py +130 -0
- plexora-0.0.1/tests/test_cell_mode_control.py +250 -0
- plexora-0.0.1/tests/test_centroid_tiles.py +165 -0
- plexora-0.0.1/tests/test_channel_overview.py +204 -0
- plexora-0.0.1/tests/test_classify_columns.py +142 -0
- plexora-0.0.1/tests/test_cli.py +443 -0
- plexora-0.0.1/tests/test_config_store.py +158 -0
- plexora-0.0.1/tests/test_connect.py +371 -0
- plexora-0.0.1/tests/test_csv_adapter.py +98 -0
- plexora-0.0.1/tests/test_database_model.py +100 -0
- plexora-0.0.1/tests/test_datalayer_requests.py +168 -0
- plexora-0.0.1/tests/test_derive_anndata_channel_names.py +157 -0
- plexora-0.0.1/tests/test_detect_data_type.py +71 -0
- plexora-0.0.1/tests/test_icon_names.py +125 -0
- plexora-0.0.1/tests/test_jupyter_viewer.py +337 -0
- plexora-0.0.1/tests/test_label_outlines.py +40 -0
- plexora-0.0.1/tests/test_label_tile_lifecycle.py +95 -0
- plexora-0.0.1/tests/test_marker_split.py +229 -0
- plexora-0.0.1/tests/test_metadata_columns.py +299 -0
- plexora-0.0.1/tests/test_mini_map.py +305 -0
- plexora-0.0.1/tests/test_notebook_env.py +238 -0
- plexora-0.0.1/tests/test_notebook_mode.py +108 -0
- plexora-0.0.1/tests/test_optional_segmentation.py +62 -0
- plexora-0.0.1/tests/test_page_assets.py +115 -0
- plexora-0.0.1/tests/test_page_routes.py +138 -0
- plexora-0.0.1/tests/test_paths.py +281 -0
- plexora-0.0.1/tests/test_plugin_boundary.py +443 -0
- plexora-0.0.1/tests/test_plugin_css_boundary.py +198 -0
- plexora-0.0.1/tests/test_plugins.py +421 -0
- plexora-0.0.1/tests/test_project_edit_routes.py +889 -0
- plexora-0.0.1/tests/test_project_record.py +568 -0
- plexora-0.0.1/tests/test_quick_view_routes.py +111 -0
- plexora-0.0.1/tests/test_refresh_dataset.py +46 -0
- plexora-0.0.1/tests/test_register_anndata_datasource.py +94 -0
- plexora-0.0.1/tests/test_register_image_datasource.py +226 -0
- plexora-0.0.1/tests/test_rename_channels.py +139 -0
- plexora-0.0.1/tests/test_requirements_routes.py +729 -0
- plexora-0.0.1/tests/test_segmentation_mapping.py +540 -0
- plexora-0.0.1/tests/test_segmentation_mode_routes.py +198 -0
- plexora-0.0.1/tests/test_segmentation_pyramid.py +341 -0
- plexora-0.0.1/tests/test_shared_roots.py +225 -0
- plexora-0.0.1/tests/test_spatialdata_adapter.py +252 -0
- plexora-0.0.1/tests/test_tool_assets.py +182 -0
- plexora-0.0.1/tests/test_tool_cards.py +144 -0
- plexora-0.0.1/tests/test_tool_coexistence.py +96 -0
- plexora-0.0.1/tests/test_tool_switching.py +131 -0
- plexora-0.0.1/tests/test_url_helpers.py +135 -0
plexora-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
Plexora Academic License 1.0
|
|
2
|
+
SPDX-License-Identifier: LicenseRef-Plexora-Academic-1.0
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2026 Nirmal Lab. All rights reserved.
|
|
5
|
+
|
|
6
|
+
Plexora is free to use for academic research, teaching, and other
|
|
7
|
+
noncommercial purposes. Commercial use requires a separate paid license.
|
|
8
|
+
Plugins are welcome: you may build and distribute them freely, and you own
|
|
9
|
+
what you write. What you may not do is publish a modified copy or fork of
|
|
10
|
+
Plexora itself.
|
|
11
|
+
|
|
12
|
+
For a commercial license, contact Ajit Johnson Nirmal
|
|
13
|
+
<ajitjohnson.n@gmail.com>.
|
|
14
|
+
|
|
15
|
+
The summary above is for orientation only. The terms below are what govern.
|
|
16
|
+
|
|
17
|
+
--------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
1. DEFINITIONS
|
|
20
|
+
|
|
21
|
+
"Software" means Plexora, including its source code, object code,
|
|
22
|
+
documentation, and bundled assets, as made available by the Licensor,
|
|
23
|
+
excluding Third-Party Components (Section 8).
|
|
24
|
+
|
|
25
|
+
"Licensor" means Nirmal Lab.
|
|
26
|
+
|
|
27
|
+
"You" means the individual or legal entity exercising rights under this
|
|
28
|
+
License. If you are acting in the course of your employment or
|
|
29
|
+
engagement, "You" includes your employer or the entity engaging you.
|
|
30
|
+
|
|
31
|
+
"Noncommercial Purpose" means any use that is not a Commercial Use,
|
|
32
|
+
including academic research, classroom and educational use, personal
|
|
33
|
+
study, and use by a nonprofit research institute, public research
|
|
34
|
+
organization, charitable organization, or government body. Use by such
|
|
35
|
+
an organization is a Noncommercial Purpose regardless of the source of
|
|
36
|
+
its funding, including funding from a commercial entity, provided the
|
|
37
|
+
use itself is not a Commercial Use.
|
|
38
|
+
|
|
39
|
+
"Commercial Use" means use of the Software that is directed toward
|
|
40
|
+
commercial advantage or monetary compensation, including without
|
|
41
|
+
limitation: use by or on behalf of a for-profit entity in its business
|
|
42
|
+
operations; use to provide services to third parties for a fee; use to
|
|
43
|
+
develop, test, manufacture, validate, or support a product or service
|
|
44
|
+
that is sold or licensed for a fee; use in fee-for-service contract
|
|
45
|
+
research; and incorporating the Software or its output into a commercial
|
|
46
|
+
product or offering.
|
|
47
|
+
|
|
48
|
+
"Plugin" means software that extends the Software solely through the
|
|
49
|
+
Software's documented extension interfaces -- the `plexora.plugins`
|
|
50
|
+
entry point group and the public API exposed by the `plexora.api`
|
|
51
|
+
package -- and that does not include, embed, or require any modification
|
|
52
|
+
to the Software.
|
|
53
|
+
|
|
54
|
+
"Modified Version" means any copy of the Software in which any file has
|
|
55
|
+
been added, removed, altered, renamed, or replaced, and any work that is
|
|
56
|
+
a derivative work of the Software under copyright law. A Plugin is not
|
|
57
|
+
a Modified Version.
|
|
58
|
+
|
|
59
|
+
2. GRANT FOR NONCOMMERCIAL USE
|
|
60
|
+
|
|
61
|
+
Subject to your compliance with this License, the Licensor grants you a
|
|
62
|
+
worldwide, royalty-free, non-exclusive, non-transferable, non-
|
|
63
|
+
sublicensable license to:
|
|
64
|
+
|
|
65
|
+
(a) install, run, and use the Software for any Noncommercial Purpose;
|
|
66
|
+
|
|
67
|
+
(b) reproduce and distribute verbatim, unmodified copies of the
|
|
68
|
+
Software, provided that each copy retains this License in full and
|
|
69
|
+
all copyright and attribution notices; and
|
|
70
|
+
|
|
71
|
+
(c) make modifications to your own copy of the Software, solely for your
|
|
72
|
+
own internal Noncommercial use -- for example to fix a bug, resolve
|
|
73
|
+
a compatibility problem in your environment, or debug an issue --
|
|
74
|
+
subject to Section 3.
|
|
75
|
+
|
|
76
|
+
No fee may be charged for the Software itself under this grant. Recovery
|
|
77
|
+
of actual media or bandwidth costs for distributing a verbatim copy is
|
|
78
|
+
permitted.
|
|
79
|
+
|
|
80
|
+
3. NO DISTRIBUTION OF MODIFIED VERSIONS
|
|
81
|
+
|
|
82
|
+
You may not distribute, publish, share, host, sell, sublicense, or
|
|
83
|
+
otherwise make available to any third party any Modified Version, in
|
|
84
|
+
source or object form, in whole or in part. This includes publishing a
|
|
85
|
+
public fork of the Software's repository, distributing patched builds or
|
|
86
|
+
container images, redistributing the Software under a different name,
|
|
87
|
+
and making a Modified Version available to third parties as a hosted or
|
|
88
|
+
network-accessible service.
|
|
89
|
+
|
|
90
|
+
Modifications you make under Section 2(c) must remain within your own
|
|
91
|
+
organization. You are encouraged, but not required, to submit them to
|
|
92
|
+
the Licensor for possible inclusion upstream.
|
|
93
|
+
|
|
94
|
+
Nothing in this Section restricts your distribution of Plugins, which is
|
|
95
|
+
governed by Section 4.
|
|
96
|
+
|
|
97
|
+
4. PLUGINS
|
|
98
|
+
|
|
99
|
+
You may write, use, distribute, sell, and license Plugins without
|
|
100
|
+
restriction under this License, and without needing the Licensor's
|
|
101
|
+
permission.
|
|
102
|
+
|
|
103
|
+
You own the Plugins you write and may license them on any terms you
|
|
104
|
+
choose, including commercial terms. A Plugin is not a Modified Version
|
|
105
|
+
and is not subject to Section 3 or to the noncommercial limitation in
|
|
106
|
+
Section 2, whether or not it is distributed together with the Software.
|
|
107
|
+
|
|
108
|
+
For the avoidance of doubt: linking to, importing, calling, subclassing,
|
|
109
|
+
or registering against the Software's documented extension interfaces
|
|
110
|
+
does not by itself make your Plugin a derivative work of the Software
|
|
111
|
+
for the purposes of this License.
|
|
112
|
+
|
|
113
|
+
Distributing the Software itself alongside your Plugin remains subject
|
|
114
|
+
to Section 2(b) -- the copy of the Software must be verbatim.
|
|
115
|
+
|
|
116
|
+
5. COMMERCIAL USE
|
|
117
|
+
|
|
118
|
+
This License grants no rights for Commercial Use. Any Commercial Use
|
|
119
|
+
requires a separate written license from the Licensor. To obtain one,
|
|
120
|
+
contact Ajit Johnson Nirmal <ajitjohnson.n@gmail.com>.
|
|
121
|
+
|
|
122
|
+
6. RESERVATION OF RIGHTS; NO TRADEMARK LICENSE
|
|
123
|
+
|
|
124
|
+
All rights not expressly granted are reserved by the Licensor. This
|
|
125
|
+
License does not grant permission to use the trade names, trademarks,
|
|
126
|
+
service marks, product names, or logos of the Licensor, including the
|
|
127
|
+
name "Plexora", except as required for reasonable and customary
|
|
128
|
+
descriptive use in reproducing the notices required by this License.
|
|
129
|
+
|
|
130
|
+
This License grants no patent rights.
|
|
131
|
+
|
|
132
|
+
7. ATTRIBUTION AND NOTICES
|
|
133
|
+
|
|
134
|
+
Any copy of the Software you distribute, and any publication or
|
|
135
|
+
presentation reporting results obtained using the Software, must retain
|
|
136
|
+
or provide, as applicable, the copyright notice above and a reference to
|
|
137
|
+
this License. Academic users are asked to cite the Software in
|
|
138
|
+
accordance with the citation information provided with it.
|
|
139
|
+
|
|
140
|
+
8. THIRD-PARTY COMPONENTS
|
|
141
|
+
|
|
142
|
+
The Software is distributed with components authored by third parties
|
|
143
|
+
and licensed under their own terms. Those components remain governed
|
|
144
|
+
exclusively by their own licenses, which are unaffected by this License;
|
|
145
|
+
in particular, nothing in Section 3 restricts any right you hold in a
|
|
146
|
+
Third-Party Component under that component's own license. Known
|
|
147
|
+
Third-Party Components include:
|
|
148
|
+
|
|
149
|
+
- plexora/server/utils/smallestenclosingcircle.py -- Copyright (c) 2020
|
|
150
|
+
Project Nayuki, LGPL-3.0-or-later.
|
|
151
|
+
- the contents of plexora/client/external/ -- see the notices in that
|
|
152
|
+
directory.
|
|
153
|
+
- third-party Python and JavaScript dependencies installed alongside the
|
|
154
|
+
Software, each under its own license.
|
|
155
|
+
|
|
156
|
+
Where a Third-Party Component's license conflicts with a term of this
|
|
157
|
+
License as applied to that component, that component's license controls
|
|
158
|
+
for that component.
|
|
159
|
+
|
|
160
|
+
9. FAIR USE AND MANDATORY RIGHTS
|
|
161
|
+
|
|
162
|
+
This License does not limit any right you have under applicable law that
|
|
163
|
+
cannot be limited by agreement, including fair use, fair dealing, and
|
|
164
|
+
any statutory right to decompile or modify the Software for
|
|
165
|
+
interoperability or error correction.
|
|
166
|
+
|
|
167
|
+
10. TERM AND TERMINATION
|
|
168
|
+
|
|
169
|
+
This License applies for as long as you comply with it. If you breach
|
|
170
|
+
any term, your rights under this License terminate automatically.
|
|
171
|
+
|
|
172
|
+
If the breach is your first and you cure it in full, and take
|
|
173
|
+
reasonable steps to correct its effects, within 30 days of receiving
|
|
174
|
+
written notice from the Licensor, your rights are reinstated as of the
|
|
175
|
+
date of cure.
|
|
176
|
+
|
|
177
|
+
On termination you must cease all use of the Software and destroy all
|
|
178
|
+
copies in your possession or control. Sections 3, 6, 8, 11, and 12
|
|
179
|
+
survive termination. Termination does not affect any license you or
|
|
180
|
+
anyone else holds in a Plugin.
|
|
181
|
+
|
|
182
|
+
11. NO WARRANTY
|
|
183
|
+
|
|
184
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
185
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
186
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
|
|
187
|
+
NONINFRINGEMENT.
|
|
188
|
+
|
|
189
|
+
THE SOFTWARE IS A RESEARCH TOOL. IT IS NOT A MEDICAL DEVICE AND IS NOT
|
|
190
|
+
INTENDED, VALIDATED, OR APPROVED FOR CLINICAL DIAGNOSIS, TREATMENT, OR
|
|
191
|
+
ANY OTHER USE INVOLVING PATIENT CARE.
|
|
192
|
+
|
|
193
|
+
12. LIMITATION OF LIABILITY
|
|
194
|
+
|
|
195
|
+
TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL THE LICENSOR
|
|
196
|
+
OR ANY CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY,
|
|
197
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT
|
|
198
|
+
OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
199
|
+
THE SOFTWARE, INCLUDING ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
200
|
+
CONSEQUENTIAL DAMAGES, OR ANY LOSS OF DATA, PROFITS, OR RESEARCH
|
|
201
|
+
RESULTS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
202
|
+
|
|
203
|
+
13. SEVERABILITY
|
|
204
|
+
|
|
205
|
+
If any provision of this License is held unenforceable, that provision
|
|
206
|
+
shall be enforced to the maximum extent permissible and the remaining
|
|
207
|
+
provisions shall remain in full force and effect.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
recursive-include plexora/client/templates *.html
|
|
2
|
+
recursive-include plexora/client/dist *
|
|
3
|
+
recursive-include plexora/client/src/css *.css
|
|
4
|
+
recursive-include plexora/client/src/img *
|
|
5
|
+
recursive-include plexora/client/src/js *.js
|
|
6
|
+
recursive-include plexora/client/src/shaders *.glsl
|
|
7
|
+
recursive-include plexora/client/external *
|
|
8
|
+
recursive-include plexora/plugins *.html
|
|
9
|
+
# Per plugin rather than a plugins/*/static glob: MANIFEST.in has no such glob,
|
|
10
|
+
# so every bundled plugin's assets need a line of their own here or they are
|
|
11
|
+
# simply absent from an sdist -- which builds and installs fine, then serves a
|
|
12
|
+
# tool with no client.
|
|
13
|
+
recursive-include plexora/plugins/cell_explorer/static *
|
|
14
|
+
recursive-include plexora/plugins/figure_builder/static *
|
|
15
|
+
recursive-include plexora/plugins/gating/static *
|
|
16
|
+
recursive-include plexora/plugins/roi/static *
|
plexora-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: plexora
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: OpenSeadragon-based cellular image viewing and analysis tool.
|
|
5
|
+
License-Expression: LicenseRef-Plexora-Academic-1.0
|
|
6
|
+
Requires-Python: <3.14,>=3.12
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: anndata>=0.10
|
|
10
|
+
Requires-Dist: Flask>=3.1
|
|
11
|
+
Requires-Dist: h5py>=3.16.0
|
|
12
|
+
Requires-Dist: imagecodecs
|
|
13
|
+
Requires-Dist: itsdangerous>=2.2
|
|
14
|
+
Requires-Dist: Jinja2>=3.1
|
|
15
|
+
Requires-Dist: numpy>=2.0
|
|
16
|
+
Requires-Dist: ome-types>=0.6.3
|
|
17
|
+
Requires-Dist: orjson>=3.11
|
|
18
|
+
Requires-Dist: pandas>=3.0.5
|
|
19
|
+
Requires-Dist: Pillow>=10.4
|
|
20
|
+
Requires-Dist: platformdirs>=4
|
|
21
|
+
Requires-Dist: polars>=1.43
|
|
22
|
+
Requires-Dist: pydantic<2.14,>=2.13
|
|
23
|
+
Requires-Dist: reportlab>=5.0.1
|
|
24
|
+
Requires-Dist: scikit-image
|
|
25
|
+
Requires-Dist: scikit-learn>=1.9
|
|
26
|
+
Requires-Dist: scipy
|
|
27
|
+
Requires-Dist: shapely>=2.1.2
|
|
28
|
+
Requires-Dist: spatialdata>=0.8.0
|
|
29
|
+
Requires-Dist: threadpoolctl>=3.6.0
|
|
30
|
+
Requires-Dist: tifffile>=2026.7.31
|
|
31
|
+
Requires-Dist: waitress
|
|
32
|
+
Requires-Dist: Werkzeug>=3.1
|
|
33
|
+
Requires-Dist: zarr>=3
|
|
34
|
+
Provides-Extra: jupyter
|
|
35
|
+
Requires-Dist: ipython; extra == "jupyter"
|
|
36
|
+
Requires-Dist: jupyter-server-proxy; extra == "jupyter"
|
|
37
|
+
Provides-Extra: dev
|
|
38
|
+
Requires-Dist: pytest; extra == "dev"
|
|
39
|
+
Requires-Dist: pytest-randomly>=4.1.0; extra == "dev"
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
|
|
42
|
+
# Plexora
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
## About
|
|
47
|
+
This is an [openseadragon](https://openseadragon.github.io/) based **Cellular Image Viewing and Analysis Tool**.
|
|
48
|
+
It is built with a python [Flask](http://flask.pocoo.org/) backend and a [Node.js](https://nodejs.org/en/) javascript frontend.
|
|
49
|
+
|
|
50
|
+
## Install (for Users)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install plexora
|
|
54
|
+
plexora
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
That is the whole setup. `plexora` starts the server, prints the URL, and opens
|
|
58
|
+
a browser when the environment looks interactive. On the first run it also
|
|
59
|
+
prints where it will keep your projects.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
plexora my_dataset # open a project straight away
|
|
63
|
+
plexora --port 9000 # a specific port (8000 is the default; if it is
|
|
64
|
+
# busy, Plexora moves to a free one and says so)
|
|
65
|
+
plexora --version
|
|
66
|
+
python -m plexora # same thing, when the console script is not on PATH
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
There are four ways to run Plexora, all of which end in the same viewer:
|
|
70
|
+
|
|
71
|
+
| Where you are | What to run |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| Your own machine, a terminal | `plexora` |
|
|
74
|
+
| Your own machine, a notebook | `plexora.view("my_dataset")` |
|
|
75
|
+
| A remote machine you can ssh into | `plexora connect user@host` — or `plexora --remote` on the host |
|
|
76
|
+
| A hosted notebook (JupyterHub, Open OnDemand, Colab) | `plexora.view("my_dataset")` — the proxy is detected for you |
|
|
77
|
+
|
|
78
|
+
**[DEPLOYMENT.md](DEPLOYMENT.md) walks through all of them in detail**, from a
|
|
79
|
+
fresh conda environment to HPC job submission, with the real output of each
|
|
80
|
+
command. The rest of this README is the short version.
|
|
81
|
+
|
|
82
|
+
### Where your data lives
|
|
83
|
+
|
|
84
|
+
Plexora keeps projects, figures and settings in one directory, chosen in this
|
|
85
|
+
order:
|
|
86
|
+
|
|
87
|
+
| Rule | Location |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `--data-dir` / `PLEXORA_DATA_PATH` | whatever you pass |
|
|
90
|
+
| a recorded setting | `plexora config set data-dir <path>` |
|
|
91
|
+
| default | `%LOCALAPPDATA%\plexora`, `~/Library/Application Support/plexora`, or `~/.local/share/plexora` |
|
|
92
|
+
|
|
93
|
+
It never depends on the directory you started from, and never lives inside the
|
|
94
|
+
installed package.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
plexora where # which directory, and which rule chose it
|
|
98
|
+
plexora config set data-dir /scratch/me/plexora
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Moving it matters on HPC and on Windows machines with a small system drive:
|
|
102
|
+
derived image pyramids are large, and the default sits on your home or system
|
|
103
|
+
volume. `plexora config set data-dir` records the choice permanently; the
|
|
104
|
+
environment variable overrides it for one run.
|
|
105
|
+
|
|
106
|
+
### Shared projects
|
|
107
|
+
|
|
108
|
+
Several people on one workstation or login node can share a directory of common
|
|
109
|
+
datasets while keeping their own work private:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
export PLEXORA_SHARED_PATH=/srv/plexora/common # or: plexora config set shared-dirs ...
|
|
113
|
+
plexora
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Shared projects appear in Open Project marked *Shared*. They can be opened and
|
|
117
|
+
explored but not edited or deleted, and everything you produce while exploring
|
|
118
|
+
one — gates, ROIs, figures, cached results — is written to **your** data
|
|
119
|
+
directory, not the shared one. A project of your own with the same name takes
|
|
120
|
+
precedence over the shared copy.
|
|
121
|
+
|
|
122
|
+
Plexora has no user accounts and no authentication. For a multi-user
|
|
123
|
+
deployment, run one process per user behind a reverse proxy that maps the
|
|
124
|
+
authenticated user to their own `--data-dir`, and keep the server bound to
|
|
125
|
+
loopback (the default).
|
|
126
|
+
|
|
127
|
+
## Running on a remote machine over SSH
|
|
128
|
+
|
|
129
|
+
Plexora binds to loopback and has no authentication, so the way to reach one
|
|
130
|
+
running on a server is an SSH tunnel rather than an open port. There are two
|
|
131
|
+
ways to get one, and they do the same thing.
|
|
132
|
+
|
|
133
|
+
**Have Plexora set it up.** Run this on *your own* computer:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
plexora connect user@server.lab.edu # starts, tunnels, opens a browser
|
|
137
|
+
plexora connect user@server.lab.edu my_dataset # …straight into a project
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
It stays in the foreground; Ctrl+C closes the tunnel and stops the remote
|
|
141
|
+
server. It uses your system `ssh`, so whatever `~/.ssh/config`, an agent, a
|
|
142
|
+
ProxyJump or a hardware token already do for `ssh user@host` happens here too.
|
|
143
|
+
|
|
144
|
+
If the remote `plexora` is not on a non-interactive `PATH` — which is common
|
|
145
|
+
with conda — name it explicitly:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
plexora connect user@server.lab.edu --remote-command "conda run -n imaging plexora"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Or do it by hand.** On the remote machine:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
plexora --remote
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
It prints the exact `ssh -N -L …` command to paste into a terminal on your own
|
|
158
|
+
computer, and the `http://localhost:<port>/` address to open afterwards.
|
|
159
|
+
|
|
160
|
+
### HPC clusters with compute nodes
|
|
161
|
+
|
|
162
|
+
On a cluster you usually may not run anything heavy on the login node, so
|
|
163
|
+
Plexora belongs in a job. `--srun` submits one and tunnels to whichever node
|
|
164
|
+
the scheduler grants — the target is the *login* node:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
plexora connect user@o2.hms.harvard.edu --srun "-p interactive -t 4:00:00 --mem 16G"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Allocation may queue; it says so while it waits. Ctrl+C ends the job.
|
|
171
|
+
|
|
172
|
+
By hand, the same thing is two steps: start an interactive job
|
|
173
|
+
(`srun --pty -p interactive -t 4:00:00 --mem 16G bash`), then run
|
|
174
|
+
`plexora --remote` inside it. It detects the job, works out which compute node
|
|
175
|
+
it is on and which login node you came through, and prints the two-hop
|
|
176
|
+
`ssh -J` command for it.
|
|
177
|
+
|
|
178
|
+
Some sites refuse SSH into a compute node. Add `--bind-node` at either end for
|
|
179
|
+
a login-node forward instead — note that this makes the port reachable from
|
|
180
|
+
the cluster's internal network while it runs.
|
|
181
|
+
|
|
182
|
+
A lab's shared reference data pairs naturally with this: point
|
|
183
|
+
`PLEXORA_SHARED_PATH` (or `plexora config set shared-dirs`) at a read-only
|
|
184
|
+
directory on the cluster filesystem, and `--data-dir` or
|
|
185
|
+
`plexora config set data-dir` at your own scratch space.
|
|
186
|
+
|
|
187
|
+
## Running as a Docker container
|
|
188
|
+
**Note:** When running on an ARM machine (e.g. M1 Macbook), build the image with `docker build --platform linux/amd64 -t plexora .`
|
|
189
|
+
* Build image: `docker build -t plexora .`
|
|
190
|
+
* Run image with mounted path: `docker run --rm -dp 8000:8000 -v [source path]:/[target path] plexora`
|
|
191
|
+
|
|
192
|
+
where
|
|
193
|
+
* `--rm` cleans up the container after it finishes executing
|
|
194
|
+
* `-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.
|
|
195
|
+
* `-dp` forwards the port 8000
|
|
196
|
+
|
|
197
|
+
Once the container is running, go to `http://localhost:8000/` in your web browser.
|
|
198
|
+
To import your imaging files in the import gui type in the mounted `/data/..`
|
|
199
|
+
|
|
200
|
+
Inside the image, projects are written to `/app/data` (`PLEXORA_DATA_PATH`), so
|
|
201
|
+
mount a volume there to keep them between runs:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
docker run --rm -dp 8000:8000 -v ~/plexora-data:/app/data -v /my/images:/data plexora
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The image also sets `PLEXORA_HOST=0.0.0.0` — published ports would never reach
|
|
208
|
+
it otherwise — and `PLEXORA_DOCKER=1`, which switches the import page to
|
|
209
|
+
container-shaped path hints.
|
|
210
|
+
|
|
211
|
+
## Clone and Run Codebase (for Developers)
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
git clone https://github.com/nirmallab/plexora.git
|
|
215
|
+
cd plexora
|
|
216
|
+
python -m venv .venv && source .venv/bin/activate # or conda create -n plexora python=3.13
|
|
217
|
+
pip install -e ".[dev,jupyter]"
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Any Python 3.12 or 3.13 environment works — conda, venv, uv, whatever you
|
|
221
|
+
already use. The editable install pulls every runtime dependency plus the test
|
|
222
|
+
and notebook extras; there is no separate environment file to keep in sync.
|
|
223
|
+
|
|
224
|
+
Then start the server with `python run.py` (or `plexora`) and open
|
|
225
|
+
`http://localhost:8000/`.
|
|
226
|
+
|
|
227
|
+
## Running in Jupyter notebooks
|
|
228
|
+
|
|
229
|
+
Install the package into the same environment as Jupyter:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
pip install "plexora[jupyter]"
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Then, in a cell:
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
import plexora
|
|
239
|
+
|
|
240
|
+
plexora.view("my_dataset")
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
That is the whole thing, in every kind of notebook. Plexora starts a small
|
|
244
|
+
server beside your kernel and shows it in the cell.
|
|
245
|
+
|
|
246
|
+
`data_dir` is optional everywhere below: leaving it out uses the same directory
|
|
247
|
+
`plexora where` reports, so a notebook and a terminal see the same projects.
|
|
248
|
+
Pass it to work against a different one.
|
|
249
|
+
|
|
250
|
+
### Hosted notebooks — JupyterHub, Open OnDemand, Colab
|
|
251
|
+
|
|
252
|
+
The same call. When your kernel is not on the machine with your browser, a
|
|
253
|
+
`127.0.0.1` address would point at your own laptop, so Plexora detects the
|
|
254
|
+
situation and builds the proxied URL your host actually serves it on.
|
|
255
|
+
|
|
256
|
+
On a JupyterHub or Open OnDemand server, this needs `jupyter-server-proxy`
|
|
257
|
+
installed **in the environment running the Jupyter server** (not necessarily
|
|
258
|
+
the one running your kernel):
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
pip install jupyter-server-proxy
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Colab needs nothing extra. Neither does local Jupyter or VS Code Remote, which
|
|
265
|
+
keep the direct localhost address they always used.
|
|
266
|
+
|
|
267
|
+
Override the detection if you need to:
|
|
268
|
+
|
|
269
|
+
```python
|
|
270
|
+
plexora.view("my_dataset", proxy=True) # always proxy
|
|
271
|
+
plexora.view("my_dataset", proxy=False) # always use 127.0.0.1
|
|
272
|
+
plexora.view("my_dataset", base_url="/user/me/") # name the prefix yourself
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
On a hub, `viewer.url` is a path rather than a full address — open it under
|
|
276
|
+
your notebook server's own address, which is where your session is
|
|
277
|
+
authenticated.
|
|
278
|
+
|
|
279
|
+
Datasets can also be registered directly from notebook-visible files:
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
from plexora.jupyter import PlexoraViewer
|
|
283
|
+
|
|
284
|
+
viewer = PlexoraViewer.from_files(
|
|
285
|
+
name="my_dataset",
|
|
286
|
+
image="/path/to/image.ome.tif",
|
|
287
|
+
segmentation="/path/to/segmentation.ome.tif",
|
|
288
|
+
features="/path/to/cells.csv",
|
|
289
|
+
x="X_centroid",
|
|
290
|
+
y="Y_centroid",
|
|
291
|
+
id_column="CellID",
|
|
292
|
+
)
|
|
293
|
+
viewer
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Baseline smoke test
|
|
297
|
+
|
|
298
|
+
Before upgrading dependencies or changing the viewer/server boundary, run the local `orion2` baseline:
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
python -m tests.baseline_orion2
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
The test checks Flask app import, `/config`, the viewer page, metadata JSON, channel metadata, and one image tile plus one segmentation tile. It skips with a clear message if the local `orion2` datasource or exemplar files are not available.
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
#### (4. Node.js installation and packages)
|
|
308
|
+
This step is only needed when you plan to edit js code. The codebase already included bundled js files.
|
|
309
|
+
* Install [Node.js](https://nodejs.org/en/), then navigate to `/plexora/client` and run `npm install` to install all packages listed in package.json.
|
|
310
|
+
* Run `npm run start` to package the Javascript, or run `npm run watch` if you plan on editing dependencies
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
## Packaging/Bundling Code as Executable (for Developers)
|
|
314
|
+
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.
|
|
315
|
+
|
|
316
|
+
Tagging Conventions: All release tags should look like `v{version_number}_{branch_name}`.
|
|
317
|
+
|
|
318
|
+
## License
|
|
319
|
+
|
|
320
|
+
Plexora is released under the **Plexora Academic License 1.0** (see [LICENSE](./LICENSE)).
|
|
321
|
+
It is **not** an open source license. In short:
|
|
322
|
+
|
|
323
|
+
| | |
|
|
324
|
+
|---|---|
|
|
325
|
+
| Academic research, teaching, personal study | ✅ Free |
|
|
326
|
+
| Use by a nonprofit or government research institution | ✅ Free (whatever the funding source) |
|
|
327
|
+
| Redistributing Plexora unmodified, with the license attached | ✅ Allowed |
|
|
328
|
+
| Patching your own copy to fix a bug or a compatibility problem | ✅ Allowed |
|
|
329
|
+
| Publishing a fork, a patched build, or a renamed version | ❌ Not allowed |
|
|
330
|
+
| Commercial use of any kind | ❌ Requires a paid license |
|
|
331
|
+
|
|
332
|
+
**Plugins are a deliberate exception.** Anything you build against the documented
|
|
333
|
+
extension interfaces — the `plexora.plugins` entry point group and the `plexora.api`
|
|
334
|
+
package — is yours. You may distribute and sell your plugin under whatever license
|
|
335
|
+
you like, and you do not need our permission. Extending Plexora through the plugin
|
|
336
|
+
API is the supported way to change what it does; editing its source is not.
|
|
337
|
+
|
|
338
|
+
For a commercial license, contact Ajit Johnson Nirmal <ajitjohnson.n@gmail.com>.
|
|
339
|
+
|
|
340
|
+
Some bundled components carry their own licenses, which are unaffected by the above —
|
|
341
|
+
see section 8 of [LICENSE](./LICENSE).
|