{"id":31077613,"url":"https://github.com/nadeemlab/smprofiler","last_synced_at":"2025-09-16T07:38:05.648Z","repository":{"id":37603812,"uuid":"370750418","full_name":"nadeemlab/smprofiler","owner":"nadeemlab","description":"Spatial Multiomics Profiler for Spatial Characterization of Tissue Microenvironment (https://smprofiler.io)","archived":false,"fork":false,"pushed_at":"2025-09-10T22:35:54.000Z","size":57262,"stargazers_count":22,"open_issues_count":6,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-09-11T01:33:35.506Z","etag":null,"topics":["biomarker-discovery","clinical-workflow","deeplearning-ai","histology-images","image-analysis","multiplexed-imaging","python","single-cell-analysis","spatial-analysis","spatial-data","spatial-proteomics","spatial-transcriptomics","tumor-microenvironment"],"latest_commit_sha":null,"homepage":"https://smprofiler.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nadeemlab.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-05-25T15:57:33.000Z","updated_at":"2025-09-03T13:54:41.000Z","dependencies_parsed_at":"2024-08-09T00:22:45.515Z","dependency_job_id":"5672cca7-c809-41b7-98fd-bed9f960b7d2","html_url":"https://github.com/nadeemlab/smprofiler","commit_stats":{"total_commits":2120,"total_committers":10,"mean_commits":212.0,"dds":"0.42688679245283023","last_synced_commit":"aad6fd914329b473078db043b8d3b0c751540b68"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/nadeemlab/smprofiler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nadeemlab%2Fsmprofiler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nadeemlab%2Fsmprofiler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nadeemlab%2Fsmprofiler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nadeemlab%2Fsmprofiler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nadeemlab","download_url":"https://codeload.github.com/nadeemlab/smprofiler/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nadeemlab%2Fsmprofiler/sbom","scorecard":{"id":390284,"data":{"date":"2025-08-11","repo":{"name":"github.com/nadeemlab/SPT","commit":"213125dc4789971eb7bad10186be77d09d3014a6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/26 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":9,"reason":"8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing shell code: not a valid arithmetic operator: testing: build/build_scripts/poll_container_readiness.sh:0","Warn: containerImage not pinned by hash: build/apiserver/Dockerfile:1: pin your Docker image by updating python:3.13-slim to python:3.13-slim@sha256:4d55aff3915a8622fdb8e6ab3645992de771bd97c3dd1279860cd5e18bcd7582","Warn: containerImage not pinned by hash: build/build_scripts/development.Dockerfile:1","Warn: containerImage not pinned by hash: build/build_scripts/development_prereqs.Dockerfile:1: pin your Docker image by updating ubuntu:24.04 to ubuntu:24.04@sha256:7c06e91f61fa88c08cc74f7e1b7c69ae24910d745357e0dfe1d2c0322aaf20f9","Warn: containerImage not pinned by hash: build/db/Dockerfile:1: pin your Docker image by updating postgres:17.2 to postgres:17.2@sha256:3267c505060a0052e5aa6e5175a7b41ab6b04da2f8c4540fc6e98a37210aa2d3","Warn: containerImage not pinned by hash: build/ondemand/Dockerfile:1: pin your Docker image by updating python:3.13-slim to python:3.13-slim@sha256:4d55aff3915a8622fdb8e6ab3645992de771bd97c3dd1279860cd5e18bcd7582","Warn: containerImage not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:1: pin your Docker image by updating pytorch/pytorch:2.1.2-cuda11.8-cudnn8-runtime to pytorch/pytorch:2.1.2-cuda11.8-cudnn8-runtime@sha256:971fbeae82c0a5a7a970a264a8b8ce1c3426aa79df7111004ad2bc2640f7d89c","Warn: containerImage not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:2: pin your Docker image by updating python:3.11-slim-buster to python:3.11-slim-buster@sha256:c46b0ae5728c2247b99903098ade3176a58e274d9c7d2efeaaab3e0621a53935","Warn: containerImage not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:1: pin your Docker image by updating pytorch/pytorch:2.1.2-cuda11.8-cudnn8-runtime to pytorch/pytorch:2.1.2-cuda11.8-cudnn8-runtime@sha256:971fbeae82c0a5a7a970a264a8b8ce1c3426aa79df7111004ad2bc2640f7d89c","Warn: containerImage not pinned by hash: plugin/graph_processing/template/Dockerfile:2: pin your Docker image by updating python:3.11-slim-buster to python:3.11-slim-buster@sha256:c46b0ae5728c2247b99903098ade3176a58e274d9c7d2efeaaab3e0621a53935","Warn: pipCommand not pinned by hash: build/apiserver/Dockerfile:20","Warn: pipCommand not pinned by hash: build/build_scripts/development.Dockerfile:8","Warn: downloadThenRun not pinned by hash: build/build_scripts/development_prereqs.Dockerfile:15","Warn: downloadThenRun not pinned by hash: build/build_scripts/development_prereqs.Dockerfile:27","Warn: pipCommand not pinned by hash: build/build_scripts/development_prereqs.Dockerfile:28","Warn: pipCommand not pinned by hash: build/build_scripts/development_prereqs.Dockerfile:37","Warn: pipCommand not pinned by hash: build/build_scripts/development_prereqs.Dockerfile:38","Warn: pipCommand not pinned by hash: build/ondemand/Dockerfile:22","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:17","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:18","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:19","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:20","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:21","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn-cuda.dockerfile:23","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:18","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:19","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:20","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:21","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:22","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:23","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/cg-gnn.dockerfile:25","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:22","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:23","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:24","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:25","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:26","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:27","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:28","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:29","Warn: pipCommand not pinned by hash: build/plugins/graph_processing/graph-transformer.dockerfile:30","Warn: pipCommand not pinned by hash: plugin/graph_processing/template/Dockerfile:12","Warn: pipCommand not pinned by hash: plugin/graph_processing/template/Dockerfile:13","Warn: pipCommand not pinned by hash: plugin/graph_processing/template/Dockerfile:14","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_batch_operation.sh:12","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_cell_level_data.sh:47","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_phenotype_criteria.sh:14","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_proximity_batch.sh:16","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_proximity_batch.sh:21","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_request_channels.sh:3","Warn: downloadThenRun not pinned by hash: test/apiserver/module_tests/test_study_summary_retrieval.sh:14","Warn: downloadThenRun not pinned by hash: test/apiserver/unit_tests/test_phenotype_symbols.sh:12","Warn: downloadThenRun not pinned by hash: test/apiserver/unit_tests/test_study_names.sh:12","Warn: downloadThenRun not pinned by hash: test/apiserver/unit_tests/test_sync_annotations.sh:5","Warn: downloadThenRun not pinned by hash: test/apiserver/unit_tests/test_sync_annotations.sh:16","Warn: downloadThenRun not pinned by hash: test/apiserver/unit_tests/test_versions.sh:12","Info:   0 out of   9 containerImage dependencies pinned","Info:   0 out of  31 pipCommand dependencies pinned","Info:   0 out of  14 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-18T17:38:15.800Z","repository_id":37603812,"created_at":"2025-08-18T17:38:15.800Z","updated_at":"2025-08-18T17:38:15.800Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275383545,"owners_count":25454883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-16T02:00:10.229Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biomarker-discovery","clinical-workflow","deeplearning-ai","histology-images","image-analysis","multiplexed-imaging","python","single-cell-analysis","spatial-analysis","spatial-data","spatial-proteomics","spatial-transcriptomics","tumor-microenvironment"],"created_at":"2025-09-16T07:38:03.198Z","updated_at":"2025-09-16T07:38:05.631Z","avatar_url":"https://github.com/nadeemlab.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"docs/image_assets/SMProfiler_logo_blue_on_transparent.png\" width=\"400\"/\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n- [What do cell profiles tell us about biology and disease?](#what-do-cell-profiles-tell-us-about-biology-and-disease)\n- [User tutorial](#user-tutorial)\n  - [Example: Exploratory data analysis of immunotherapy response in melanoma](#example-exploratory-data-analysis-of-immunotherapy-response-in-melanoma)\n  - [Spatially-informed metrics](#spatially-informed-metrics)\n- [Data management](#data-management)\n- [CLI command reference](#cli-command-reference)\n  - [Dataset uploader](#dataset-uploader)\n- [API reference](#api-reference)\n- [Development and maintenance](#development-and-maintenance)\n- [Deployment options](#deployment-options)\n  - [License](#license)\n\n# What do cell profiles tell us about biology and disease?\n\nBy studying microscopic images of specimens of tissue, like skin or organ resections, pathologists and basic scientists can draw inferences about the way that cells coordinate to set biological processes in motion, and how these processes are disrupted in the course of disease.\n\nThe taxonomy of cell types and their functional states is surprisingly diverse, and modeling biological processes at the cellular level is consequently a rich source of new insights. Imaging methods are needed that capture some of this diversity, by measuring multiple channels of information at the same time for each cell, to provide empirical data that ensures these models make sense in realistic scenarios.\n\nMultiple-channel imaging technology, capable of measuring several dozen protein targets, is reaching maturity. Multiplexed immunofluoresence, imaging mass cytometry, and their variants measure data similar to what is measured by flow cytometry or single-cell RNA-seq, since this is also at the single-cell level and involves multiple quantitative features, but with the crucial advantage that cell positions are also observed -- spatial context.\n\nThe Spatial Multiomics Profiler (SMProfiler) project is about making the most of this informative data source using quality software. The guiding principles are:\n\n|       |                      |         |\n|-------|----------------------|---------|\n| :zap: | **High availability** | Datasets should be available for analysis immediately with the widest range of tools. Preprocessing and indexing should be done in advance as much as possible.|\n| :repeat: | **Reproducible analysis** | Results and findings should be based on analyses that others can easily recreate in their entirety. |\n| :computer: | **No code** | The tools should be usable by investigators without doing any programming and without the need for specialized knowledge of computer systems. |\n| :white_check_mark: | **Uniform data management** | Datasets should be organized with high semantic integrity, to ensure that analysis can be performed on them in a consistent way and that the conclusions drawn are valid. |\n\nSMProfiler is available to the public at [smprofiler.io](https://smprofiler.io).\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"docs/image_assets/diagram_medium_res.png\"\u003e\n\u003cimg src=\"docs/image_assets/diagram_low_res.png\"/\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n# User tutorial\n\n## Example: Exploratory data analysis of immunotherapy response in melanoma\n\nOn the main page, select **Melanoma CyTOF ICI**. This brings up a dataset that was collected and published by Moldoveanu et al.[^1].\n\nYou'll see a summary of this dataset, including the numbers of samples, cells, and channels, links to relevant publications, classification of the samples, and highlighted findings that can be observed by using the SMProfiler application. In this case the study collected samples from patients treated with immune-checkpoint inhibitor therapy, and the patients either responded favorably or poorly to this treatment.\n\n![alt](docs/image_assets/f1.png)\n\nOn the next page you can choose which cell phenotypes you want to focus on. Click one of the pre-defined phenotypes, or define a custom phenotype by indicating positive and negative markers from among the channels which were imaged.\n\n![alt](docs/image_assets/f2.png)\n\nWe select five custom phenotypes. The first phenotype, for example, was defined by clicking the **+** beside **CD3+**, then clicking **Add to selection**. This generally indicates the T cells. The second phenotype is **CD3+ CD4+**, the markers of T helper cells. We also include: **CD3+ CD8A+**, **CD3+ CD4+ FOXP3+**, and **CD20+ CD3-**. We are ascertaining the rough profile of lymphocytes in the dataset.\n\n![alt](docs/image_assets/f3.png)\n\nThe next page shows the cell population breakdown with respect to the phenotypes we've just selected. Each phenotype is shown with the fraction of cells expressing that phenotype across all samples, for example 54.02% are indicated as T cells.\n\nIn the grid, each *pair* of phenotypes is shown with the fraction of cells expressing *both* phenotypes. For example, the fraction of cells that are both **CD3+ CD4+ FOXP3+** and **CD3+** is 16.53%, the same as the fraction of cells that are **CD3+ CD4+ FOXP3+**, as expected since **CD3+** is part of the signature of this phenotype (the T regulatory cells).\n\n\u003e [!NOTE]\n\u003e :bar_chart: You could use this technique to make a standard heat map for assessment of clusters, by selecting all single-channel phenotypes. Depending on the size of the samples, since these metrics are computed live, this could take up to 1 minute per computed value, and sometimes longer.\n\n![alt](docs/image_assets/f4.png)\n\nTo continue with a finer analysis, click one of the \"tiles\", either for one phenotype (the tiles on the left) or two phenotypes (the grid on the right).\n\nWe choose the tile at row **CD3+ CD4+ FOXP3+** (Treg) and column **CD3+ CD8A+** (Tc). The table below populates with the size of the population of cells expressing both signatures, broken down by sample. Note that in reality there are generally few cells expressing both of these two specific suites of markers, and the few cells occuring here are probably the result of an imperfect stain intensity dichotomization (thresholding, gating). So this tool can be used to do basic quality control in case some logical or illogical marker combinations are known in advance.\n\nWe also selected the single-phenotype tiles **CD3+ CD4+ FOXP3+** and **CD3+ CD8A**.\n\n![alt](docs/image_assets/f5.png)\n\nClick on the column header **CD3+ CD8A+** (it becomes underlined to indicate that it is selected). Then select the two cohorts by clicking one of the **1** values and one of the **2** values. A \"verbalization\" appears which states that the trend, according to a t-test, is that the fraction of Tc cells is increased about 1.5 times in the non-responder cohort compared to the responders, with statistical significance value p=0.1.\n\n![alt](docs/image_assets/f6.png)\n\nWe click on column **CD3+ CD4+ FOXP3+**, in addition to the prior selection. A similar assessment appears, this time with respect to the ratio of the number of **CD3+ CD8A+** (the first selection) to **CD3+ CD4+ FOXP3+** (the second selection).\n\n![alt](docs/image_assets/f7.png)\n\nLet's focus our attention on one of the samples that exhibited a large fraction of Tc cells. Click **31RD**.\n\n![alt](docs/image_assets/f8.png)\n\nThe \"virtual slide viewer\" opens. Choose a few phenotypes, and the corresponding cells will become highlighted. The fraction and count of the cells for each phenotype are shown.\n\n![alt](docs/image_assets/f9.png)\n\nA UMAP dimensional reduction of the cell set across the whole data collection is available in this case. Click **UMAP**.\n\n\u003e [!NOTE]\n\u003e :mag: You can zoom and pan the view using scroll and click-and-drag.\n\nWe spot a region that looks \"saturated\" with Tc cells. Select it by clicking and dragging the mouse while holding either the **Ctrl** key or (on Mac) **CMD**.\n\nThe new cell count for each phenotype is now shown, together with the new percentage, relative to the selection. In this case the Tc fraction approximately doubled, to **6996** cells (shown in green). This increase is assessed using the Fisher test (the entire contingency table is also shown, for reference). The test verifies that the increase is highly statistically significant in this case, as expected.\n\n\u003e [!NOTE]\n\u003e By careful use of the selection tool, noting enrichments in each virtual region, you can account for most of the cell types present and hone the focus of study.\n\n![alt](docs/image_assets/f10.png)\n\n## Spatially-informed metrics\n\nLet's see an example of quantification over samples that makes use of the spatial arrangement of cells.\n\nChoose the phenotypes **Naive cytoxic T cell** and **T helper cell antigen-experienced**. Select the tile with row **T helper cell antigen-experienced** and column **Naive cytoxic T cell**, representing the pair of phenotypes.\n\nIn the column header that appears, click `\u003e`. The **spatial metrics** dropdown appears. Click `v` to show the available metrics. Choose **cell-to-cell proximity**. After the metric is finished computing, click the column header **cell-to-cell proximity** and the two cohorts **1** and **2** to perform a univariate comparison.\n\nThis metric is the average number of **Naive cytotoxic T cells** appearing within a specified radius of given **T helper antigen-experienced** cells. It measures generally how common it is to find cells of one phenotype in close proximity to those of another phenotype. There are several other metrics available, of various degrees of statistical sophistication, many computed using the [Squidpy](https://squidpy.readthedocs.io/en/stable/) package. These are explained in more detail in the [API documentation](#api-reference).\n\n![alt](docs/image_assets/f11.png)\n\n![alt](docs/image_assets/f12.png)\n\n\u003e [!NOTE]\n\u003e :clipboard: You can **save results like this for later** by copying the URL in the address bar. In fact, this result is highlighted on the study summary page. Try reproducing it by following the first link as shown below.\n\n![alt](docs/image_assets/f13.png)\n\n# Data management\nTo support this project's semantic integrity goals, we designed a general data model and ontology for cell-resolved measurement studies, using a schema-authoring system we call the Application Data Interface (ADI) framework.\n\nThe schema is called `scstudies` and it is documented in detail [here](https://adiframework.com/docs_site/scstudies_quick_reference.html#).\n\nIn our implementation, we sought to strike an effective balance between the completeness of annotation demanded by accurate record-keeping, on the one hand, and practical computational efficiency on the other. Much of the application is organized around a SQL database with a schema that conforms tightly to the formal `scstudies` data model, but we also make liberal use of derivative data artifacts to improve speed and performance. For example, a highly-compressed [binary format](docs/cells.md) is adopted for transmission of a given sample's cell-feature matrix.\n\nSimilarly, datasets that we have curated for uniform data import are stored in a simple tabular file format which does not generally support all the features of the `scstudies` model. This intermediary format is designed for ease of creation and it is not entirely formalized. For an example, see [data_curation/](data_curation/).\n\n# CLI command reference\nThe Python package `smprofiler` is released on [PyPI](https://pypi.org/project/smprofiler/), so it can be installed with\n\n```sh\npython -m pip install smprofiler\n```\n\nInstallation makes several commands available in the shell. List them with `smprofiler`:\n\n```sh\n$ smprofiler\n...\n\nsmprofiler apiserver dump-schema\n\nsmprofiler graphs create-specimen-graphs\nsmprofiler graphs explore-classes\nsmprofiler graphs extract\nsmprofiler graphs finalize-graphs\nsmprofiler graphs generate-graphs\nsmprofiler graphs plot-importance-fractions\nsmprofiler graphs plot-interactives\nsmprofiler graphs prepare-graph-creation\nsmprofiler graphs upload-importances\n\nsmprofiler db collection\nsmprofiler db delete-feature\nsmprofiler db do-fractions-tests\nsmprofiler db drop\nsmprofiler db drop-ondemand-computations\nsmprofiler db guess-channels-from-object-files\nsmprofiler db interactive-uploader\nsmprofiler db list-studies\nsmprofiler db load-query\nsmprofiler db retrieve-feature-matrices\nsmprofiler db status\nsmprofiler db upload-sync-small\n\nsmprofiler ondemand cache-expressions-data-array\nsmprofiler ondemand start\n\nsmprofiler workflow aggregate-core-results\nsmprofiler workflow configure\nsmprofiler workflow core-job\nsmprofiler workflow generate-run-information\nsmprofiler workflow initialize\nsmprofiler workflow merge-performance-reports\nsmprofiler workflow report-on-logs\nsmprofiler workflow report-run-configuration\nsmprofiler workflow tail-logs\n```\n\nEach command will print documentation by providing the `--help` option.\n\nSeveral commands are mainly for use internal to the application components.\n\nSome others are TUIs (Terminal User Interfaces) meant to make common tasks, like uploading datasets or inspecting cache or metadata, more reliable.\n\n## Dataset uploader\n`smprofiler db interactive-uploader` is a TUI that automatically determines available data sources and targets after you have created or located source datasets (format: [data_curation/](data_curation/)). It looks for [database configuration files](smprofiler//workflow/assets/.smprofiler_db.config.template) named `~/.smprofiler_db.config.*`, checks the environment variable `SMProfiler_S3_BUCKET`, and searches recursively for datasets in the current working directory named `generated_artifacts`. It presents available options and initiates the upload process.\n\nExample usage is shown below.\n\n![alt](docs/image_assets/uploader_example.png)\n\nThe ETL (Extract/Transform/Load) process includes a number of data integrity checks and the creation of several intermediate data artifacts.\n\n# API reference\nThe SMProfiler application is supported by a web API, which provides fine-grained access to specific components of a given dataset. The API is documented [here](https://smprofiler.io/api/redoc).\n\n# Development and maintenance\nSee [docs/maintenance.md](docs/maintenance.md).\n\n# Deployment options\nFor assistance setting up a deployment of the SMProfiler application for your institution or lab, write to us at [nadeems@mskcc.org](nadeems@mskcc.org).\n\nThe application can be deployed in several ways:\n\n- As manually-managed services on a single server\n- Using Docker compose\n- On a Kubernetes cluster using a cloud provider\n\n\n[^1]: Moldoveanu et al. [*Spatially mapping the immune landscape of melanoma using imaging mass cytometry*](https://doi.org/10.1126/sciimmunol.abi5072)\n\n## License\n© [Nadeem Lab](https://nadeemlab.org/) - SMProfiler code is distributed under **Apache 2.0 with Commons Clause** license, and is available for non-commercial academic purposes. \n\n## Funding\nThis work is funded by the 7-year NIH/NCI R37 MERIT Award ([R37CA295658](https://reporter.nih.gov/search/5dgSOlHosEKepkZEAS5_kQ/project-details/11018883#description)).\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnadeemlab%2Fsmprofiler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnadeemlab%2Fsmprofiler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnadeemlab%2Fsmprofiler/lists"}