Celltype auto annotation with SCSA¶
Single-cell transcriptomics allows the analysis of thousands of cells in a single experiment and the identification of novel cell types, states and dynamics in a variety of tissues and organisms. Standard experimental protocols and analytical workflows have been developed to create single-cell transcriptomic maps from tissues.
This tutorial focuses on how to interpret this data to identify cell types, states, and other biologically relevant patterns with the goal of creating annotated cell maps.
Paper: SCSA: A Cell Type Annotation Tool for Single-Cell RNA-seq Data
Code: https://github.com/bioinfo-ibms-pumc/SCSA
Colab_Reproducibility:https://colab.research.google.com/drive/1BC6hPS0CyBhNu0BYk8evu57-ua1bAS0T?usp=sharing
Note
The annotation with SCSA can't be used in rare celltype annotations
import omicverse as ov
print(f'omicverse version:{ov.__version__}')
import scanpy as sc
print(f'scanpy version:{sc.__version__}')
ov.ov_plot_set()
omicverse version:1.5.1 scanpy version:1.7.2
# !mkdir data
# !wget http://cf.10xgenomics.com/samples/cell-exp/1.1.0/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz -O data/pbmc3k_filtered_gene_bc_matrices.tar.gz
# !cd data; tar -xzf pbmc3k_filtered_gene_bc_matrices.tar.gz
# !mkdir write
Read in the count matrix into an AnnData object, which holds many slots for annotations and different representations of the data. It also comes with its own HDF5-based file format: .h5ad
.
adata = sc.read_10x_mtx(
'data/filtered_gene_bc_matrices/hg19/', # the directory with the `.mtx` file
var_names='gene_symbols', # use gene symbols for the variable names (variables-axis index)
cache=True) # write a cache file for faster subsequent reading
... reading from cache file cache/data-filtered_gene_bc_matrices-hg19-matrix.h5ad
Data preprocessing¶
Here, we use ov.single.scanpy_lazy
to preprocess the raw data of scRNA-seq, it included filter the doublets cells, normalizing counts per cell, log1p, extracting highly variable genes, and cluster of cells calculation.
But if you want to experience step-by-step preprocessing, we also provide more detailed preprocessing steps here, please refer to our preprocess chapter for a detailed explanation.
We stored the raw counts in count
layers, and the raw data in adata.raw.to_adata()
.
#adata=ov.single.scanpy_lazy(adata)
#quantity control
adata=ov.pp.qc(adata,
tresh={'mito_perc': 0.05, 'nUMIs': 500, 'detected_genes': 250})
#normalize and high variable genes (HVGs) calculated
adata=ov.pp.preprocess(adata,mode='shiftlog|pearson',n_HVGs=2000,)
#save the whole genes and filter the non-HVGs
adata.raw = adata
adata = adata[:, adata.var.highly_variable_features]
#scale the adata.X
ov.pp.scale(adata)
#Dimensionality Reduction
ov.pp.pca(adata,layer='scaled',n_pcs=50)
#Neighbourhood graph construction
sc.pp.neighbors(adata, n_neighbors=15, n_pcs=50,
use_rep='scaled|original|X_pca')
#clusters
sc.tl.leiden(adata)
#Dimensionality Reduction for visualization(X_mde=X_umap+GPU)
adata.obsm["X_mde"] = ov.utils.mde(adata.obsm["scaled|original|X_pca"])
adata
Calculate QC metrics End calculation of QC metrics. Original cell number: 2700 Begin of post doublets removal and QC plot Running Scrublet filtered out 19024 genes that are detected in less than 3 cells normalizing counts per cell finished (0:00:00) extracting highly variable genes finished (0:00:00) --> added 'highly_variable', boolean vector (adata.var) 'means', float vector (adata.var) 'dispersions', float vector (adata.var) 'dispersions_norm', float vector (adata.var) normalizing counts per cell finished (0:00:00) normalizing counts per cell finished (0:00:00) Embedding transcriptomes using PCA... Automatically set threshold at doublet score = 0.31 Detected doublet rate = 1.4% Estimated detectable doublet fraction = 35.1% Overall doublet rate: Expected = 5.0% Estimated = 4.0% Scrublet finished (0:00:02) Cells retained after scrublet: 2662, 38 removed. End of post doublets removal and QC plots. Filters application (seurat or mads) Lower treshold, nUMIs: 500; filtered-out-cells: 0 Lower treshold, n genes: 250; filtered-out-cells: 3 Lower treshold, mito %: 0.05; filtered-out-cells: 56 Filters applicated. Total cell filtered out with this last --mode seurat QC (and its chosen options): 59 Cells retained after scrublet and seurat filtering: 2603, 97 removed. filtered out 19107 genes that are detected in less than 3 cells Begin robust gene identification After filtration, 13631/13631 genes are kept. Among 13631 genes, 13631 genes are robust. End of robust gene identification. Begin size normalization: shiftlog and HVGs selection pearson normalizing counts per cell The following highly-expressed genes are not considered during normalization factor computation: [] finished (0:00:00) extracting highly variable genes --> added 'highly_variable', boolean vector (adata.var) 'highly_variable_rank', float vector (adata.var) 'highly_variable_nbatches', int vector (adata.var) 'highly_variable_intersection', boolean vector (adata.var) 'means', float vector (adata.var) 'variances', float vector (adata.var) 'residual_variances', float vector (adata.var) End of size normalization: shiftlog and HVGs selection pearson ... as `zero_center=True`, sparse input is densified and may lead to large memory consumption computing neighbors
OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.
finished: added to `.uns['neighbors']` `.obsp['distances']`, distances for each pair of neighbors `.obsp['connectivities']`, weighted adjacency matrix (0:00:01) running Leiden clustering finished: found 11 clusters and added 'leiden', the cluster labels (adata.obs, categorical) (0:00:00)
AnnData object with n_obs × n_vars = 2603 × 2000 obs: 'nUMIs', 'mito_perc', 'detected_genes', 'cell_complexity', 'doublet_score', 'predicted_doublet', 'passing_mt', 'passing_nUMIs', 'passing_ngenes', 'n_genes', 'leiden' var: 'gene_ids', 'mt', 'n_cells', 'percent_cells', 'robust', 'mean', 'var', 'residual_variances', 'highly_variable_rank', 'highly_variable_features' uns: 'scrublet', 'log1p', 'hvg', 'scaled|original|pca_var_ratios', 'scaled|original|cum_sum_eigenvalues', 'neighbors', 'leiden' obsm: 'scaled|original|X_pca', 'X_mde' varm: 'scaled|original|pca_loadings' layers: 'counts', 'scaled', 'lognorm' obsp: 'distances', 'connectivities'
Cell annotate automatically¶
We create a pySCSA object from the adata
, and we need to set some parameter to annotate correctly.
In normal annotate, we set celltype
='normal'
and target
='cellmarker'
or 'panglaodb'
to perform the cell annotate.
But in cancer annotate, we need to set the celltype
='cancer'
and target
='cancersea'
to perform the cell annotate.
Note
The annotation with SCSA need to download the database at first. It can be downloaded automatically. But sometimes you will have problems with network errors.
The database can be downloaded from figshare or Google Drive. And you need to set parameter model_path
='path'
scsa=ov.single.pySCSA(adata=adata,
foldchange=1.5,
pvalue=0.01,
celltype='normal',
target='cellmarker',
tissue='All',
model_path='temp/pySCSA_2023_v2_plus.db'
)
In the previous cell clustering we used the leiden algorithm, so here we specify that the type is set to leiden. if you are using louvain, please change it. And, we will annotate all clusters, if you only want to annotate a few of the classes, please follow '[1]'
, '[1,2,3]'
, '[...]'
Enter in the format.
rank_rep
means the sc.tl.rank_genes_groups(adata, clustertype, method='wilcoxon')
, if we provided the rank_genes_groups
in adata.uns, rank_rep
can be set as False
anno=scsa.cell_anno(clustertype='leiden',
cluster='all',rank_rep=True)
ranking genes finished (0:00:01) ...Auto annotate cell Version V2.1 [2023/06/27] DB load: GO_items:47347,Human_GO:3,Mouse_GO:3, CellMarkers:82887,CancerSEA:1574,PanglaoDB:24223 Ensembl_HGNC:61541,Ensembl_Mouse:55414 <omicverse.single._SCSA.Annotator object at 0x2c89d0220> Version V2.1 [2023/06/27] DB load: GO_items:47347,Human_GO:3,Mouse_GO:3, CellMarkers:82887,CancerSEA:1574,PanglaoDB:24223 Ensembl_HGNC:61541,Ensembl_Mouse:55414 load markers: 70276 Cluster 0 Gene number: 75 Other Gene number: 1583 Cluster 1 Gene number: 144 Other Gene number: 1540 Cluster 10 Gene number: 123 Other Gene number: 1568 Cluster 2 Gene number: 515 Other Gene number: 1532 Cluster 3 Gene number: 129 Other Gene number: 1544 Cluster 4 Gene number: 82 Other Gene number: 1595 Cluster 5 Gene number: 931 Other Gene number: 1286 Cluster 6 Gene number: 243 Other Gene number: 1508 Cluster 7 Gene number: 5 Other Gene number: 1612 Cluster 8 Gene number: 67 Other Gene number: 1612 Cluster 9 Gene number: 587 Other Gene number: 1401 #Cluster Type Celltype Score Times ['0', '?', 'T cell|Naive CD8+ T cell', '8.725245970272397|5.338571100473261', 1.6343785267744977] ['1', 'Good', 'T cell', 12.961656351257975, 2.0373902200167624] ['10', 'Good', 'Megakaryocyte', 10.334739958943498, 2.0291785860088662] ['2', '?', 'Monocyte|Macrophage', '14.746713096982123|8.75641509612364', 1.6841039323855624] ['3', 'Good', 'B cell', 13.796626908885715, 4.003778697849947] ['4', '?', 'Natural killer cell|T cell', '8.660190824133249|8.051187833952175', 1.0756413839474572] ['5', '?', 'Monocyte|Macrophage', '13.971414830833528|9.949917068151382', 1.4041739981486407] ['6', 'Good', 'Natural killer cell', 15.59399546035418, 3.656175399110041] ['7', '?', 'T cell|CD8+ T cell', '5.397246597412726|4.148101678034799', 1.3011365237242019] ['8', 'Good', 'Monocyte', 10.95996648839431, 2.170437446718487] ['9', '?', 'Dendritic cell|Monocyte', '8.685332489648657|7.353020857529042', 1.1811924184541662]
We can query only the better annotated results
scsa.cell_auto_anno(adata,key='scsa_celltype_cellmarker')
...cell type added to scsa_celltype_cellmarker on obs of anndata
We can also use panglaodb
as target to annotate the celltype
scsa=ov.single.pySCSA(adata=adata,
foldchange=1.5,
pvalue=0.01,
celltype='normal',
target='panglaodb',
tissue='All',
model_path='temp/pySCSA_2023_v2_plus.db'
)
res=scsa.cell_anno(clustertype='leiden',
cluster='all',rank_rep=True)
ranking genes finished (0:00:01) ...Auto annotate cell Version V2.1 [2023/06/27] DB load: GO_items:47347,Human_GO:3,Mouse_GO:3, CellMarkers:82887,CancerSEA:1574,PanglaoDB:24223 Ensembl_HGNC:61541,Ensembl_Mouse:55414 <omicverse.single._SCSA.Annotator object at 0x2c89d0250> Version V2.1 [2023/06/27] DB load: GO_items:47347,Human_GO:3,Mouse_GO:3, CellMarkers:82887,CancerSEA:1574,PanglaoDB:24223 Ensembl_HGNC:61541,Ensembl_Mouse:55414 load markers: 70276 Cluster 0 Gene number: 75 Other Gene number: 701 Cluster 1 Gene number: 144 Other Gene number: 672 Cluster 10 Gene number: 123 Other Gene number: 675 Cluster 2 Gene number: 515 Other Gene number: 667 Cluster 3 Gene number: 129 Other Gene number: 664 Cluster 4 Gene number: 82 Other Gene number: 701 Cluster 5 Gene number: 931 Other Gene number: 612 Cluster 6 Gene number: 243 Other Gene number: 663 Cluster 7 Gene number: 5 Other Gene number: 712 Cluster 8 Gene number: 67 Other Gene number: 712 Cluster 9 Gene number: 587 Other Gene number: 670 #Cluster Type Celltype Score Times ['0', '?', 'T Cells|T Memory Cells', '3.7178236936447595|3.363511285637478', 1.1053400384057666] ['1', '?', 'T Cells|T Memory Cells', '3.531461316580769|3.117745502299072', 1.1326971088488835] ['10', 'Good', 'Platelets', 7.432982147841601, 2.4362620739591723] ['2', '?', 'Monocytes|Alveolar Macrophages', '3.6455690759322272|2.922079559631339', 1.2475940512694892] ['3', '?', 'B Cells Naive|B Cells Memory', '4.328429443730031|3.9545790694449328', 1.0945360726691886] ['4', '?', 'NK Cells|T Cells', '2.96702571977588|2.680719557955109', 1.1068019819421802] ['5', '?', 'Monocytes|Macrophages', '3.774802905873644|2.8442136919017464', 1.327186813220659] ['6', '?', 'NK Cells|Decidual Cells', '4.137392815321161|2.880539867188994', 1.4363254827501069] ['7', '?', 'Decidual Cells|NK Cells', '1.6543443520623498|1.6543443520623498', 1.0] ['8', '?', 'Monocytes|Alveolar Macrophages', '2.7222000722461677|2.1616279260313114', 1.2593286936499064] ['9', '?', 'Dendritic Cells|Langerhans Cells', '4.146171305699119|3.728571260268892', 1.1120000172398774]
We can query only the better annotated results
scsa.cell_anno_print()
Cluster:0 Cell_type:T Cells|T Memory Cells Z-score:3.718|3.364 Cluster:1 Cell_type:T Cells|T Memory Cells Z-score:3.531|3.118 Cluster:2 Cell_type:Monocytes|Alveolar Macrophages Z-score:3.646|2.922 Cluster:3 Cell_type:B Cells Naive|B Cells Memory Z-score:4.328|3.955 Cluster:4 Cell_type:NK Cells|T Cells Z-score:2.967|2.681 Cluster:5 Cell_type:Monocytes|Macrophages Z-score:3.775|2.844 Cluster:6 Cell_type:NK Cells|Decidual Cells Z-score:4.137|2.881 Cluster:7 Cell_type:Decidual Cells|NK Cells Z-score:1.654|1.654 Cluster:8 Cell_type:Monocytes|Alveolar Macrophages Z-score:2.722|2.162 Cluster:9 Cell_type:Dendritic Cells|Langerhans Cells Z-score:4.146|3.729 Nice:Cluster:10 Cell_type:Platelets Z-score:7.433
scsa.cell_auto_anno(adata,key='scsa_celltype_panglaodb')
...cell type added to scsa_celltype_panglaodb on obs of anndata
Here, we introduce the dimensionality reduction visualisation function ov.utils.embedding
, which is similar to scanpy.pl.embedding
, except that when we set frameon='small'
, we scale the axes to the bottom-left corner and scale the colourbar to the bottom-right corner.
- adata: the anndata object
- basis: the visualized embedding stored in adata.obsm
- color: the visualized obs/var
- legend_loc: the location of legend, if you set None, it will be visualized in right.
- frameon: it can be set
small
, False or None - legend_fontoutline: the outline in the text of legend.
- palette: Different categories of colours, we have a number of different colours preset in omicverse, including
ov.utils.palette()
,ov.utils.red_color
,ov.utils.blue_color
,ov.utils.green_color
,ov. utils.orange_color
. The preset colours can help you achieve a more beautiful visualisation.
ov.utils.embedding(adata,
basis='X_mde',
color=['leiden','scsa_celltype_cellmarker','scsa_celltype_panglaodb'],
legend_loc='on data',
frameon='small',
legend_fontoutline=2,
palette=ov.utils.palette()[14:],
)
If you want to draw stacked histograms of cell type proportions, you first need to colour the groups you intend to draw using ov.utils.embedding
. Then use ov.utils.plot_cellproportion
to specify the groups you want to plot, and you can see a plot of cell proportions in the different groups
#Randomly designate the first 1000 cells as group B and the rest as group A
adata.obs['group']='A'
adata.obs.loc[adata.obs.index[:1000],'group']='B'
#Colored
ov.utils.embedding(adata,
basis='X_mde',
color=['group'],
frameon='small',legend_fontoutline=2,
palette=ov.utils.red_color,
)
ov.utils.plot_cellproportion(adata=adata,celltype_clusters='scsa_celltype_cellmarker',
visual_clusters='group',
visual_name='group',figsize=(2,4))
Of course, we also provide another downscaled visualisation of the graph using ov.utils.plot_embedding_celltype
ov.utils.plot_embedding_celltype(adata,figsize=None,basis='X_mde',
celltype_key='scsa_celltype_cellmarker',
title=' Cell type',
celltype_range=(2,6),
embedding_range=(4,10),)
We calculated the ratio of observed to expected cell numbers (Ro/e) for each cluster in different tissues to quantify the tissue preference of each cluster (Guo et al., 2018; Zhang et al., 2018). The expected cell num- bers for each combination of cell clusters and tissues were obtained from the chi-square test. One cluster was identified as being enriched in a specific tissue if Ro/e>1.
The Ro/e function was wrote by Haihao Zhang
.
roe=ov.utils.roe(adata,sample_key='group',cell_type_key='scsa_celltype_cellmarker')
chi2: 1.426243142767526, dof: 5, pvalue: 0.9214211744335161 P-value is greater than 0.05, there is no statistical significance
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(2,4))
transformed_roe = roe.copy()
transformed_roe = transformed_roe.applymap(
lambda x: '+++' if x >= 2 else ('++' if x >= 1.5 else ('+' if x >= 1 else '+/-')))
sns.heatmap(roe, annot=transformed_roe, cmap='RdBu_r', fmt='',
cbar=True, ax=ax,vmin=0.5,vmax=1.5,cbar_kws={'shrink':0.5})
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.xlabel('Group',fontsize=13)
plt.ylabel('Cell type',fontsize=13)
plt.title('Ro/e',fontsize=13)
Cell annotate manually¶
In order to compare the accuracy of our automatic annotations, we will here use marker genes to manually annotate the cluster and compare the accuracy of the pySCSA and manual.
We need to prepare a marker's dict at first
res_marker_dict={
'Megakaryocyte':['ITGA2B','ITGB3'],
'Dendritic cell':['CLEC10A','IDO1'],
'Monocyte' :['S100A8','S100A9','LST1',],
'Macrophage':['CSF1R','CD68'],
'B cell':['MS4A1','CD79A','MZB1',],
'NK/NKT cell':['GNLY','KLRD1'],
'CD8+T cell':['CD8A','CD8B'],
'Treg':['CD4','CD40LG','IL7R','FOXP3','IL2RA'],
'CD4+T cell':['PTPRC','CD3D','CD3E'],
}
We then calculated the expression of marker genes in each cluster and the fraction
sc.tl.dendrogram(adata,'leiden')
sc.pl.dotplot(adata, res_marker_dict, 'leiden',
dendrogram=True,standard_scale='var')
WARNING: You’re trying to run this on 2000 dimensions of `.X`, if you really want this, set `use_rep='X'`. Falling back to preprocessing with `sc.pp.pca` and default params. computing PCA with n_comps=50 finished (0:00:00) Storing dendrogram info using `.uns['dendrogram_leiden']` WARNING: Groups are not reordered because the `groupby` categories and the `var_group_labels` are different. categories: 0, 1, 2, etc. var_group_labels: Megakaryocyte, Dendritic cell, Monocyte, etc.
Based on the dotplot, we name each cluster according ov.single.scanpy_cellanno_from_dict
# create a dictionary to map cluster to annotation label
cluster2annotation = {
'0': 'T cell',
'1': 'T cell',
'2': 'Monocyte',#Germ-cell(Oid)
'3': 'B cell',#Germ-cell(Oid)
'4': 'T cell',
'5': 'Macrophage',
'6': 'NKT cells',
'7': 'T cell',
'8':'Monocyte',
'9':'Dendritic cell',
'10':'Megakaryocyte',
}
ov.single.scanpy_cellanno_from_dict(adata,anno_dict=cluster2annotation,
clustertype='leiden')
...cell type added to major_celltype on obs of anndata
Compare the pySCSA and Manual¶
We can see that the auto-annotation results are almost identical to the manual annotation, the only difference is between monocyte and macrophages, but in the previous auto-annotation results, pySCSA gives the option of monocyte|macrophage
, so it can be assumed that pySCSA performs better on the pbmc3k data
ov.utils.embedding(adata,
basis='X_mde',
color=['major_celltype','scsa_celltype_cellmarker'],
legend_loc='on data', frameon='small',legend_fontoutline=2,
palette=ov.utils.palette()[14:],
)
We can use get_celltype_marker
to obtain the marker of each celltype
marker_dict=ov.single.get_celltype_marker(adata,clustertype='scsa_celltype_cellmarker')
marker_dict.keys()
...get cell type marker ranking genes finished (0:00:01)
dict_keys(['B cell', 'Dendritic cell', 'Megakaryocyte', 'Monocyte', 'Natural killer cell', 'T cell'])
marker_dict['B cell']
array(['CD74', 'CD79A', 'HLA-DRA', 'CD79B', 'HLA-DPB1', 'HLA-DQA1', 'MS4A1', 'HLA-DQB1', 'HLA-DRB1', 'CD37', 'HLA-DPA1', 'HLA-DRB5', 'TCL1A'], dtype=object)
The tissue name in database¶
For annotation of cell types in specific tissues, we can query the tissues available in the database using get_model_tissue
.
scsa.get_model_tissue()
Version V2.1 [2023/06/27] DB load: GO_items:47347,Human_GO:3,Mouse_GO:3, CellMarkers:82887,CancerSEA:1574,PanglaoDB:24223 Ensembl_HGNC:61541,Ensembl_Mouse:55414 ######################################################################################################################## ------------------------------------------------------------------------------------------------------------------------ Species:Human Num:298 ------------------------------------------------------------------------------------------------------------------------ 1: Abdomen 2: Abdominal adipose tissue 3: Abdominal fat pad 4: Acinus 5: Adipose tissue 6: Adrenal gland 7: Adventitia 8: Airway 9: Airway epithelium 10: Allocortex 11: Alveolus 12: Amniotic fluid 13: Amniotic membrane 14: Ampullary 15: Anogenital tract 16: Antecubital vein 17: Anterior cruciate ligament 18: Anterior presomitic mesoderm 19: Aorta 20: Aortic valve 21: Artery 22: Arthrosis 23: Articular Cartilage 24: Ascites 25: Ascitic fluid 26: Atrium 27: Basal airway 28: Basilar membrane 29: Beige Fat 30: Bile duct 31: Biliary tract 32: Bladder 33: Blood 34: Blood vessel 35: Bone 36: Bone marrow 37: Brain 38: Breast 39: Bronchial vessel 40: Bronchiole 41: Bronchoalveolar lavage 42: Bronchoalveolar system 43: Bronchus 44: Brown adipose tissue 45: Calvaria 46: Capillary 47: Cardiac atrium 48: Cardiovascular system 49: Carotid artery 50: Carotid plaque 51: Cartilage 52: Caudal cortex 53: Caudal forebrain 54: Caudal ganglionic eminence 55: Cavernosum 56: Central amygdala 57: Central nervous system 58: Cerebellum 59: Cerebral organoid 60: Cerebrospinal fluid 61: Cervix 62: Choriocapillaris 63: Chorionic villi 64: Chorionic villus 65: Choroid 66: Choroid plexus 67: Colon 68: Colon epithelium 69: Colorectum 70: Cornea 71: Corneal endothelium 72: Corneal epithelium 73: Coronary artery 74: Corpus callosum 75: Corpus luteum 76: Cortex 77: Cortical layer 78: Cortical thymus 79: Decidua 80: Deciduous tooth 81: Dental pulp 82: Dermis 83: Diencephalon 84: Distal airway 85: Dorsal forebrain 86: Dorsal root ganglion 87: Dorsolateral prefrontal cortex 88: Ductal tissue 89: Duodenum 90: Ectocervix 91: Ectoderm 92: Embryo 93: Embryoid body 94: Embryonic Kidney 95: Embryonic brain 96: Embryonic heart 97: Embryonic prefrontal cortex 98: Embryonic stem cell 99: Endocardium 100: Endocrine 101: Endoderm 102: Endometrium 103: Endometrium stroma 104: Entorhinal cortex 105: Epidermis 106: Epithelium 107: Esophageal 108: Esophagus 109: Eye 110: Fat pad 111: Fetal brain 112: Fetal gonad 113: Fetal heart 114: Fetal ileums 115: Fetal kidney 116: Fetal liver 117: Fetal lung 118: Fetal thymus 119: Fetal umbilical cord 120: Fetus 121: Foreskin 122: Frontal cortex 123: Fundic gland 124: Gall bladder 125: Gastric corpus 126: Gastric epithelium 127: Gastric gland 128: Gastrointestinal tract 129: Germ 130: Germinal center 131: Gingiva 132: Gonad 133: Gut 134: Hair follicle 135: Head 136: Head and neck 137: Heart 138: Heart muscle 139: Hippocampus 140: Ileum 141: Iliac crest 142: Inferior colliculus 143: Intervertebral disc 144: Intestinal crypt 145: Intestine 146: Intrahepatic cholangio 147: Jejunum 148: Kidney 149: Lacrimal gland 150: Large Intestine 151: Large intestine 152: Larynx 153: Lateral ganglionic eminence 154: Left lobe 155: Ligament 156: Limb bud 157: Limbal epithelium 158: Liver 159: Lumbar vertebra 160: Lung 161: Lymph 162: Lymph node 163: Lymphatic vessel 164: Lymphoid tissue 165: Malignant pleural effusion 166: Mammary epithelium 167: Mammary gland 168: Medial ganglionic eminence 169: Medullary thymus 170: Meniscus 171: Mesenchyme 172: Mesoblast 173: Mesoderm 174: Microvascular endothelium 175: Microvessel 176: Midbrain 177: Middle temporal gyrus 178: Milk 179: Molar 180: Muscle 181: Myenteric plexus 182: Myocardium 183: Myometrium 184: Nasal concha 185: Nasal epithelium 186: Nasal mucosa 187: Nasal polyp 188: Nasopharyngeal mucosa 189: Nasopharynx 190: Neck 191: Neocortex 192: Nerve 193: Nose 194: Nucleus pulposus 195: Olfactory neuroepithelium 196: Omentum 197: Optic nerve 198: Oral cavity 199: Oral mucosa 200: Osteoarthritic cartilage 201: Ovarian cortex 202: Ovarian follicle 203: Ovary 204: Oviduct 205: Palatine tonsil 206: Pancreas 207: Pancreatic acinar tissue 208: Pancreatic duct 209: Pancreatic islet 210: Periodontal ligament 211: Periodontium 212: Periosteum 213: Peripheral blood 214: Peritoneal fluid 215: Peritoneum 216: Pituitary 217: Pituitary gland 218: Placenta 219: Plasma 220: Pleura 221: Pluripotent stem cell 222: Polyp 223: Posterior fossa 224: Posterior presomitic mesoderm 225: Prefrontal cortex 226: Premolar 227: Presomitic mesoderm 228: Primitive streak 229: Prostate 230: Pulmonary arteriy 231: Pyloric gland 232: Rectum 233: Renal glomerulus 234: Respiratory tract 235: Retina 236: Retinal organoid 237: Retinal pigment epithelium 238: Right ventricle 239: Saliva 240: Salivary gland 241: Scalp 242: Sclerocorneal tissue 243: Seminal plasma 244: Septum transversum 245: Serum 246: Sinonasal mucosa 247: Sinus tissue 248: Skeletal muscle 249: Skin 250: Small intestine 251: Soft tissue 252: Sperm 253: Spinal cord 254: Spleen 255: Sputum 256: Stomach 257: Subcutaneous adipose tissue 258: Submandibular gland 259: Subpallium 260: Subplate 261: Subventricular zone 262: Superior frontal gyrus 263: Sympathetic ganglion 264: Synovial fluid 265: Synovium 266: Taste bud 267: Tendon 268: Testis 269: Thalamus 270: Thymus 271: Thyroid 272: Tongue 273: Tonsil 274: Tooth 275: Trachea 276: Transformed artery 277: Trophoblast 278: Umbilical cord 279: Umbilical cord blood 280: Umbilical vein 281: Undefined 282: Urine 283: Urothelium 284: Uterine cervix 285: Uterus 286: Vagina 287: Vein 288: Venous blood 289: Ventral thalamus 290: Ventricular and atrial 291: Ventricular zone 292: Vessel 293: Visceral adipose tissue 294: Vocal cord 295: Vocal fold 296: White adipose tissue 297: White matter ########################################################################################################################