STAlign alignment tutorial
[ ]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import torch
import plotly
import requests
from st_loading_functions import load_mHypothalamus, load_DLPFC
import time
import os
import scanpy as sc
from STalign import STalign
save_dir_time = './results'
iters = 5
DLPFC
[ ]:
"""DLPFC"""
section_ids_list = [['151507', '151508'], ['151508', '151509'], ['151509', '151510'], ['151669', '151670'], ['151670', '151671'], ['151671', '151672'], ['151673', '151674'], ['151674', '151675'], ['151675', '151676']]
run_times = []
for iter_ in range(iters):
for section_ids in section_ids_list:
dataset = section_ids[0] + '_' + section_ids[1]
start_time = time.time()
slice1 = load_DLPFC(root_dir="../benchmarking_data/DLPFC12", section_id=section_ids[0])
slice2 = load_DLPFC(root_dir="../benchmarking_data/DLPFC12", section_id=section_ids[1])
df1 = slice1.obs
df2 = slice2.obs
# print(slice1.obsm['spatial'])
xI = np.array(slice1.obsm['spatial'].T[0])
yI = np.array(slice1.obsm['spatial'].T[1])
xJ = np.array(slice2.obsm['spatial'].T[0])
yJ = np.array(slice2.obsm['spatial'].T[1])
XI,YI,I,fig = STalign.rasterize(xI,yI,dx=3,blur=1.5)
XJ,YJ,J,fig = STalign.rasterize(xJ,yJ,dx=3,blur=1.5)
if torch.cuda.is_available():
device = 'cuda:0'
else:
device = 'cpu'
# keep all other parameters default
params = {
'niter': 5000,
'device':device,
'epV': 50
}
out = STalign.LDDMM([YI,XI],I,[YJ,XJ],J,**params)
A = out['A'].detach().cpu()
v = out['v'].detach().cpu()
xv = []
for e in out['xv']:
xv.append(e.detach().cpu())
tpointsI= STalign.transform_points_source_to_target(xv,v,A, np.stack([yI, xI], 1))
print("results")
print(tpointsI)
#switch tensor from cuda to cpu for plotting with numpy
if tpointsI.is_cuda:
tpointsI = tpointsI.cpu()
#switch from row column coordinates (y,x) to (x,y)
xI_LDDMM = tpointsI[:,1]
yI_LDDMM = tpointsI[:,0]
df3 = pd.DataFrame(
{
"aligned_x": xI_LDDMM,
"aligned_y": yI_LDDMM,
},
)
df3.index = df1.index
results = pd.concat([df1, df3], axis=1)
results.to_csv('./results/' + dataset + '_' + str(0) + '.csv')
end_time = time.time()
run_times.append(end_time - start_time)
MHypo
[ ]:
import numpy as np
import anndata
def find_upper_left_spot(spatial_coords):
upper_left_index = np.argmin(np.sum(spatial_coords, axis=1))
print(upper_left_index)
return spatial_coords[upper_left_index]
def align_spatial_coordinates(data1, data2):
upper_left1 = find_upper_left_spot(data1.obsm['spatial'])
upper_left2 = find_upper_left_spot(data2.obsm['spatial'])
shift = upper_left1 - upper_left2
data2.obsm['spatial'] = data2.obsm['spatial'] + shift
return data2
[ ]:
section_ids_list = [['-0.04', '-0.09'], ['-0.09', '-0.14'], ['-0.14', '-0.19'], ['-0.19', '-0.24']]
run_times = []
for iter_ in range(iters):
for section_ids in section_ids_list:
dataset = section_ids[0] + '_' + section_ids[1]
start_time = time.time()
slice1 = load_mHypothalamus(root_dir="../benchmarking_data/mHypothalamus", section_id=section_ids[0])
slice2 = load_mHypothalamus(root_dir="../benchmarking_data/mHypothalamus", section_id=section_ids[1])
slice2 = align_spatial_coordinates(slice1, slice2)
df1 = slice1.obs
df2 = slice2.obs
# print(slice1.obsm['spatial'])
xI = np.array(slice1.obsm['spatial'].T[0])
yI = np.array(slice1.obsm['spatial'].T[1])
xJ = np.array(slice2.obsm['spatial'].T[0])
yJ = np.array(slice2.obsm['spatial'].T[1])
XI,YI,I,fig = STalign.rasterize(xI,yI,dx=3,blur=1.5)
XJ,YJ,J,fig = STalign.rasterize(xJ,yJ,dx=3,blur=1.5)
if torch.cuda.is_available():
device = 'cuda:0'
else:
device = 'cpu'
# keep all other parameters default
params = {
'niter': 5000,
'device':device,
'epV': 50
}
out = STalign.LDDMM([YI,XI],I,[YJ,XJ],J,**params)
A = out['A'].detach().cpu()
v = out['v'].detach().cpu()
xv = []
for e in out['xv']:
xv.append(e.detach().cpu())
tpointsI= STalign.transform_points_source_to_target(xv,v,A, np.stack([yI, xI], 1))
print("results")
print(tpointsI)
#switch tensor from cuda to cpu for plotting with numpy
if tpointsI.is_cuda:
tpointsI = tpointsI.cpu()
#switch from row column coordinates (y,x) to (x,y)
xI_LDDMM = tpointsI[:,1]
yI_LDDMM = tpointsI[:,0]
df3 = pd.DataFrame(
{
"aligned_x": xI_LDDMM,
"aligned_y": yI_LDDMM,
},
)
df3.index = df1.index
results = pd.concat([df1, df3], axis=1)
results.to_csv('./results/' + dataset + '_' + str(0) + '.csv')
end_time = time.time()
run_times.append(end_time - start_time)