Spatially register the two MERFISH slices with rigid transformation

[1]:
import pandas as pd
import numpy as np
import scanpy as sc
import anndata as ad
import umap
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.cm import get_cmap

import INSPIRE

Load results

[2]:
res_path = "Results/INSPIRE_registration_merfish"
adata = sc.read_h5ad(res_path + "/adata_inspire.h5ad")
[3]:
sc.pl.spatial(adata, spot_size=20)
../../_images/tutorials_registration_merfish_3d_merfish_rigid_4_0.png

Find anchor cells (MNN cells across slices in the latent space)

[4]:
adata_0 = adata[adata.obs["Bregma"]==-0.09, :]
adata_1 = adata[adata.obs["Bregma"]==-0.04, :]

loc0 = adata_0.obsm["spatial"]
loc1 = adata_1.obsm["spatial"]

latent_0 = adata_0.obsm['latent']
latent_1 = adata_1.obsm['latent']
[5]:
mnn_mat = INSPIRE.utils.acquire_pairs(latent_0, latent_1, k=1, metric='euclidean')
idx_0 = []
idx_1 = []
for i in range(mnn_mat.shape[0]):
    if np.sum(mnn_mat[i, :]) > 0:
        nns = np.where(mnn_mat[i, :] == 1)[0]
        for j in list(nns):
            idx_0.append(i)
            idx_1.append(j)
loc0_pair = loc0[idx_0, :]
loc1_pair = loc1[idx_1, :]

Register slice 1 onto slice 2

[6]:
T,_,_ = INSPIRE.utils.best_fit_transform(loc0_pair, loc1_pair)
loc0_new = INSPIRE.utils.transform(loc0, T)

f = plt.figure(figsize=(10,5))
ax = f.add_subplot(1,1,1)
ax.axis('equal')
ax.scatter(loc0_new[:,0], -loc0_new[:,1], c="red", s=1)
ax.scatter(loc1[:,0], -loc1[:,1], c="blue", s=1)
ax.tick_params(axis='both',bottom=False, top=False, left=False, right=False, labelleft=False, labelbottom=False, grid_alpha=0)
plt.show()
../../_images/tutorials_registration_merfish_3d_merfish_rigid_9_0.png

Register slice 2 onto slice 1

[7]:
T,_,_ = INSPIRE.utils.best_fit_transform(loc1_pair, loc0_pair)
loc1_new = INSPIRE.utils.transform(loc1, T)

f = plt.figure(figsize=(10,5))
ax = f.add_subplot(1,1,1)
ax.axis('equal')
ax.scatter(loc1_new[:,0], -loc1_new[:,1], c="red", s=1)
ax.scatter(loc0[:,0], -loc0[:,1], c="blue", s=1)
ax.tick_params(axis='both',bottom=False, top=False, left=False, right=False, labelleft=False, labelbottom=False, grid_alpha=0)
plt.show()
../../_images/tutorials_registration_merfish_3d_merfish_rigid_11_0.png

Save result

[8]:
adata_0.obsm["loc_aligned"] = loc0_new
adata_1.obsm["loc_aligned"] = loc1
[9]:
res_path = "Results/INSPIRE_registration_merfish"
adata_0.write(res_path + "/adata_st_list_0_loc_aligned.h5ad")
adata_1.write(res_path + "/adata_st_list_1_loc_aligned.h5ad")
[ ]: