Source: https://docs.nygen.io/CyteArc/tutorials/tea-seq/ Revision: fccee7b6e0c167e47ce605c8d292fba5b567ebfe Structured page: https://docs.nygen.io/CyteArc/tutorials.tea-seq.json Add a third modality with TEA-seq TEA-seq measures RNA, chromatin accessibility, and surface proteins in the same cells. After the two-modality example in Read RNA and protein together with CITE-seq , we now ask whether a joint map retains recognizable populations and how much each modality contributes locally. Open the prepared result The data come from Swanson et al. (2021) . The prepared store contains 7,069 cells from the GSM5123951 Seurat object . We use the 6,194 cells whose barcodes match the publication’s Figure 4 labels. Of the 6,333 labeled well-W3 cells, 139 are absent from this source object. # Open count stores and run CyteArc analyses. import cytearc # Select explicit fields and display options for plots. from cytearc.plotting import CellField, FeatureRef # Keep routine logs and progress bars out of the results. cytearc.configure_output(level="WARNING", progress=False) # Download the prepared example store. dataset = cytearc.cytebase.connect("cytearc_docs").download_dataset( "swanson_7K_pbmc_teaseq", destination="cytearc_datasets", zarr=True, ) # Open the count store for this analysis. ds = cytearc.DataStore(f"{dataset}/data.zarr", default_assay="RNA", nthreads=4) # Inspect the opened store's cells and features. ds DataStore has 6194 (7069) cells with 3 assays: ADT ATAC RNA Cell metadata: 'I', 'ids', 'names', 'ADT_UMAP1', 'ADT_UMAP2', 'ADT_leiden_cluster', 'ADT_nCounts', 'ADT_nFeatures', 'ATAC_UMAP1', 'ATAC_UMAP2', 'ATAC_leiden_cluster', 'ATAC_nCounts', 'ATAC_nFeatures', 'DoubletEnrichment', 'DoubletScore', 'RNA+ATAC+ADT_UMAP1', 'RNA+ATAC+ADT_UMAP2', 'RNA+ATAC+ADT_leiden_cluster', 'RNA+ATAC+ADT_wnn_UMAP1', 'RNA+ATAC+ADT_wnn_UMAP2', 'RNA+ATAC+ADT_wnn_leiden_cluster', 'RNA_UMAP1', 'RNA_UMAP2', 'RNA_leiden_cluster', 'RNA_nCounts', 'RNA_nFeatures', 'TSSEnrichment', 'altius_count', 'altius_frac', 'barcodes', 'batch_id', 'cell_name', 'chip_id', 'gene_bodies_count', 'gene_bodies_frac', 'nCount_ADT', 'nCount_ATAC', 'nCount_RNA', 'nFeature_ADT', 'nFeature_ATAC', 'nFeature_RNA', 'n_duplicate', 'n_fragments', 'n_mito', 'n_unique', 'orig.ident', 'original_barcodes', 'pbmc_sample_id', 'peaks_count', 'peaks_frac', 'publication_barcode', 'tea_cell_type', 'tea_cell_type_color', 'tea_predicted_cell_type', 'tea_prediction_score', 'tss_count', 'tss_frac', 'well_id' ADT assay has 46 features and following metadata: 'I', 'ids', 'names', 'dropOuts', 'nCells' ATAC assay has 240122 features and following metadata: 'I', 'ids', 'names', 'dropOuts', 'nCells' RNA assay has 36601 features and following metadata: 'I', 'ids', 'names', 'dropOuts', 'nCells' Import and preprocessing are already complete. RNA uses log-transformed library-size normalization, ATAC uses TF-IDF, and ADT uses CLR normalization. All three neighbor results describe the same selected cells. Compare the separate views First look for the labeled populations in each modality. Independent UMAPs can rotate and rearrange, so compare population neighborhoods rather than absolute positions or island sizes. A population’s labels and cell count are the same in all three panels. # Inspect the RNA, ATAC, and protein views in turn. for assay in ("RNA", "ATAC", "ADT"): # Select the saved layout for this assay; require exactly one match. layout = ds.artifacts.find("embedding", from_assay=assay, method="umap") # Name the modality on its UMAP and color cells by the publication labels. ds.plots.embedding( layout=layout, color_by=CellField("tea_cell_type", label=f"{assay}: publication cell type"), ) RNA UMAP of the selected TEA-seq cells coloured by publication cell types, showing B-cell, monocyte, NK-cell, and T-cell populations. Image: https://docs.nygen.io/CyteArc/build/0cc44e0cef3660b8cc4ee3891389ac64.png ATAC UMAP of the same TEA-seq cells coloured by publication cell types. T-cell labels occupy overlapping parts of the main population, with B cells and monocytes separated. Image: https://docs.nygen.io/CyteArc/build/c998c96af38148f88c84554b10bc40c8.png ADT protein UMAP of the same TEA-seq cells coloured by publication cell types, showing distinct B-cell, monocyte, NK-cell, and T-cell regions. Image: https://docs.nygen.io/CyteArc/build/7c944a57c3039b6a2d66007bcafa934d.png Differences between these views may reflect complementary measurements or technical noise. A more compact population is not, by itself, evidence of a better analysis. Inspect the joint WNN map Select the saved WNN graph and the UMAP made from it: # Select the saved WNN graph; require exactly one match. wnn_graph = ds.artifacts.find("graph", method="wnn") # Select the saved WNN layout; require exactly one match. wnn_layout = ds.artifacts.find("embedding", graph=wnn_graph, method="umap") # Inspect the selected WNN graph and its matching layout. {"WNN graph": wnn_graph, "WNN layout": wnn_layout} {'WNN graph': ArtifactRef(datastore, kind='integrated_graph', artifact_id='1e41216fedf4...'), 'WNN layout': ArtifactRef(datastore, kind='embedding', artifact_id='e7a6491edd86...')} Now compare the publication labels with four measured protein markers on the joint map. # Compare publication labels with four protein markers on the WNN map. ds.plots.embedding( layout=wnn_layout, color_by=[ CellField("tea_cell_type", label="Publication cell type"), FeatureRef("CD3", assay="ADT"), FeatureRef("CD19", assay="ADT"), FeatureRef("CD14", assay="ADT"), FeatureRef("CD56", assay="ADT"), ], n_columns=3, sort_values=True, ) Joint TEA-seq WNN UMAP shown with publication labels and CD3, CD19, CD14, and CD56 protein signals, supporting the locations of T-cell, B-cell, monocyte, and NK-like regions. Image: https://docs.nygen.io/CyteArc/build/183d307b452ce1e723cbdcf3f3e8e3bf.png CD3, CD19, CD14, and CD56 support T-cell, B-cell, monocyte, and NK-like regions, respectively. Agreement with the publication labels is useful evidence, but does not validate every neighborhood. This UMAP is a CyteArc analysis, not a reproduction of the publication’s layout. See which modality contributes locally # Show how much each modality contributes across the joint map. ds.plots.modality_weights(graph=wnn_graph, layout=wnn_layout) Three joint TEA-seq UMAP panels show RNA, ATAC, and ADT weights on zero-to-one scales. Different regions receive different relative contributions from the three modalities. Image: https://docs.nygen.io/CyteArc/build/b797f255c6494395ef87a9eb7ca20e67.png A high weight means a modality contributes more to that cell’s WNN neighborhood under these preprocessing choices. It does not measure molecular abundance, overall assay quality, or a cause of cell identity. Look for regions where the weights differ, then return to the marker and single-modality maps to interpret those differences. To check how sensitive the result is to integration choices, continue to Compare multimodal integration methods . The weighting equations and differences from Seurat are covered in Integration and metrics API reference . References¶ Swanson, E., Lord, C., Reading, J., Heubeck, A. T., Genge, P. C., Thomson, Z., Weiss, M. D., Li, X., Savage, A. K., Green, R. R., Torgerson, T. R., Bumol, T. F., Graybuck, L. T., & Skene, P. J. (2021). Simultaneous trimodal single-cell measurement of transcripts, epitopes, and chromatin accessibility using TEA-seq. eLife, 10. 10.7554/elife.63632